diff --git a/DrumMachine.pro b/DrumMachine.pro index 7ffc1cb..24671ed 100755 --- a/DrumMachine.pro +++ b/DrumMachine.pro @@ -2,9 +2,9 @@ QT = core multimedia gui widgets network CONFIG += c++20 -release: QMAKE_CXXFLAGS_RELEASE -= -O1 -release: QMAKE_CXXFLAGS_RELEASE -= -O2 -release: QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math -march=native -mtune=native +#release: QMAKE_CXXFLAGS_RELEASE -= -O1 +#release: QMAKE_CXXFLAGS_RELEASE -= -O2 +#release: QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math -march=native -mtune=native LIBS += -lrtmidi -lportaudio @@ -14,64 +14,64 @@ SOURCES += \ audiodecoder.cpp \ audioformat.cpp \ audioplayer.cpp \ - djwidget.cpp \ drummachinesettings.cpp \ - drumpadwidget.cpp \ filesmodel.cpp \ graphrenderer.cpp \ jsonconverters.cpp \ main.cpp \ - mainwindow.cpp \ midicontainers.cpp \ midiinwrapper.cpp \ midioutwrapper.cpp \ - presetdetailwidget.cpp \ presets.cpp \ presetsmodel.cpp \ - previewwidget.cpp \ - sampleswidget.cpp \ - samplewidget.cpp \ - scratchwidget.cpp \ - sequencerwidget.cpp \ synthisizer.cpp \ - synthisizerwidget.cpp \ - trackdeck.cpp \ - treetotableproxymodel.cpp + treetotableproxymodel.cpp \ + widgets/djwidget.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 += \ audiodecoder.h \ audioformat.h \ audioplayer.h \ - djwidget.h \ drummachinesettings.h \ - drumpadwidget.h \ filesmodel.h \ graphrenderer.h \ jsonconverters.h \ - mainwindow.h \ midicontainers.h \ midiinwrapper.h \ midioutwrapper.h \ - presetdetailwidget.h \ presets.h \ presetsmodel.h \ - previewwidget.h \ - sampleswidget.h \ - samplewidget.h \ - scratchwidget.h \ - sequencerwidget.h \ synthisizer.h \ - synthisizerwidget.h \ - trackdeck.h \ - treetotableproxymodel.h + treetotableproxymodel.h \ + widgets/djwidget.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 += \ - djwidget.ui \ - drumpadwidget.ui \ - mainwindow.ui \ - presetdetailwidget.ui \ - sampleswidget.ui \ - samplewidget.ui \ - sequencerwidget.ui \ - synthisizerwidget.ui \ - trackdeck.ui + widgets/djwidget.ui \ + widgets/drumpadwidget.ui \ + widgets/mainwindow.ui \ + widgets/presetdetailwidget.ui \ + widgets/sampleswidget.ui \ + widgets/samplewidget.ui \ + widgets/sequencerwidget.ui \ + widgets/synthisizerwidget.ui \ + widgets/trackdeck.ui diff --git a/main.cpp b/main.cpp index e3fe5f2..ca0b38b 100755 --- a/main.cpp +++ b/main.cpp @@ -5,7 +5,7 @@ #include "portaudio.h" -#include "mainwindow.h" +#include "widgets/mainwindow.h" namespace { template diff --git a/synthisizer.cpp b/synthisizer.cpp index 1021388..766d6dc 100644 --- a/synthisizer.cpp +++ b/synthisizer.cpp @@ -2,17 +2,17 @@ #include -#include "midicontainers.h" - constexpr double pi = std::acos(-1); void Synthisizer::writeSamples(frame_t *begin, frame_t *end) { + const auto volume = m_volume; const auto frequency = m_frequency; + if (frequency) std::transform(begin, end, begin, [&](frame_t 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; 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; } - -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); -} diff --git a/synthisizer.h b/synthisizer.h index 67b6f2d..1bd4eb0 100644 --- a/synthisizer.h +++ b/synthisizer.h @@ -1,24 +1,29 @@ #pragma once +#include + #include "audioformat.h" namespace midi { class MidiMessage; } class DrumMachineSettings; -class Synthisizer +class Synthisizer : public QObject { 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 writeSamples(frame_t *begin, frame_t *end); - void messageReceived(const midi::MidiMessage &message); - signals: void sendMidi(const midi::MidiMessage &midiMsg); private: + float m_volume{1.f}; int16_t m_frequency{}; int16_t m_actualFrequency{}; double m_phase{}; diff --git a/synthisizerwidget.cpp b/synthisizerwidget.cpp deleted file mode 100644 index df87c08..0000000 --- a/synthisizerwidget.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "synthisizerwidget.h" -#include "ui_synthisizerwidget.h" - -SynthisizerWidget::SynthisizerWidget(QWidget *parent) : - QWidget{parent}, - m_ui{std::make_unique()} -{ - 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); -} diff --git a/synthisizerwidget.ui b/synthisizerwidget.ui deleted file mode 100644 index ea3b59d..0000000 --- a/synthisizerwidget.ui +++ /dev/null @@ -1,32 +0,0 @@ - - - SynthisizerWidget - - - - 0 - 0 - 400 - 300 - - - - Form - - - - - 30 - 60 - 221 - 31 - - - - Hier könnte ihr Synthisizer stehen. - - - - - - diff --git a/djwidget.cpp b/widgets/djwidget.cpp similarity index 100% rename from djwidget.cpp rename to widgets/djwidget.cpp diff --git a/djwidget.h b/widgets/djwidget.h similarity index 100% rename from djwidget.h rename to widgets/djwidget.h diff --git a/djwidget.ui b/widgets/djwidget.ui similarity index 98% rename from djwidget.ui rename to widgets/djwidget.ui index de64781..a0c33c6 100644 --- a/djwidget.ui +++ b/widgets/djwidget.ui @@ -140,7 +140,7 @@ TrackDeck QWidget -
trackdeck.h
+
widgets/trackdeck.h
1
diff --git a/drumpadwidget.cpp b/widgets/drumpadwidget.cpp similarity index 99% rename from drumpadwidget.cpp rename to widgets/drumpadwidget.cpp index 1a287c8..e90eefd 100644 --- a/drumpadwidget.cpp +++ b/widgets/drumpadwidget.cpp @@ -119,8 +119,6 @@ void DrumPadWidget::loadPresets() void DrumPadWidget::requestFinished() { - qDebug() << "called"; - if (!m_reply) { qWarning() << "no valid reply"; diff --git a/drumpadwidget.h b/widgets/drumpadwidget.h similarity index 100% rename from drumpadwidget.h rename to widgets/drumpadwidget.h diff --git a/drumpadwidget.ui b/widgets/drumpadwidget.ui similarity index 95% rename from drumpadwidget.ui rename to widgets/drumpadwidget.ui index 2119ad0..dedb445 100644 --- a/drumpadwidget.ui +++ b/widgets/drumpadwidget.ui @@ -87,19 +87,19 @@ SamplesWidget QWidget -
sampleswidget.h
+
widgets/sampleswidget.h
1
PresetDetailWidget QScrollArea -
presetdetailwidget.h
+
widgets/presetdetailwidget.h
1
SequencerWidget QWidget -
sequencerwidget.h
+
widgets/sequencerwidget.h
1
diff --git a/mainwindow.cpp b/widgets/mainwindow.cpp similarity index 99% rename from mainwindow.cpp rename to widgets/mainwindow.cpp index 09338c1..c26a8f2 100755 --- a/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -37,6 +37,7 @@ MainWindow::MainWindow(QWidget *parent) : m_ui->setupUi(this); m_cache.setCacheDirectory("cache"); + m_cache.setMaximumCacheSize(2ull * 1024 * 1024 * 1024); m_networkAccessManager.setCache(&m_cache); m_ui->drumPadWidget->injectNetworkAccessManager(m_networkAccessManager); @@ -100,6 +101,8 @@ paDefault: MainWindow::~MainWindow() { + m_paStream = nullptr; + m_decoderThread.exit(); m_decoderThread.wait(); } diff --git a/mainwindow.h b/widgets/mainwindow.h similarity index 100% rename from mainwindow.h rename to widgets/mainwindow.h diff --git a/mainwindow.ui b/widgets/mainwindow.ui similarity index 98% rename from mainwindow.ui rename to widgets/mainwindow.ui index de5184b..9d5cb34 100755 --- a/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -240,19 +240,19 @@ DjWidget QWidget -
djwidget.h
+
widgets/djwidget.h
1
DrumPadWidget QWidget -
drumpadwidget.h
+
widgets/drumpadwidget.h
1
SynthisizerWidget QWidget -
synthisizerwidget.h
+
widgets/synthisizerwidget.h
1
diff --git a/presetdetailwidget.cpp b/widgets/presetdetailwidget.cpp similarity index 100% rename from presetdetailwidget.cpp rename to widgets/presetdetailwidget.cpp diff --git a/presetdetailwidget.h b/widgets/presetdetailwidget.h similarity index 100% rename from presetdetailwidget.h rename to widgets/presetdetailwidget.h diff --git a/presetdetailwidget.ui b/widgets/presetdetailwidget.ui similarity index 100% rename from presetdetailwidget.ui rename to widgets/presetdetailwidget.ui diff --git a/previewwidget.cpp b/widgets/previewwidget.cpp similarity index 100% rename from previewwidget.cpp rename to widgets/previewwidget.cpp diff --git a/previewwidget.h b/widgets/previewwidget.h similarity index 100% rename from previewwidget.h rename to widgets/previewwidget.h diff --git a/sampleswidget.cpp b/widgets/sampleswidget.cpp similarity index 100% rename from sampleswidget.cpp rename to widgets/sampleswidget.cpp diff --git a/sampleswidget.h b/widgets/sampleswidget.h similarity index 100% rename from sampleswidget.h rename to widgets/sampleswidget.h diff --git a/sampleswidget.ui b/widgets/sampleswidget.ui similarity index 99% rename from sampleswidget.ui rename to widgets/sampleswidget.ui index bb7c46e..bd1ee1a 100755 --- a/sampleswidget.ui +++ b/widgets/sampleswidget.ui @@ -175,7 +175,7 @@ SampleWidget QWidget -
samplewidget.h
+
widgets/samplewidget.h
1
diff --git a/samplewidget.cpp b/widgets/samplewidget.cpp similarity index 100% rename from samplewidget.cpp rename to widgets/samplewidget.cpp diff --git a/samplewidget.h b/widgets/samplewidget.h similarity index 96% rename from samplewidget.h rename to widgets/samplewidget.h index 2f7a69a..a617eff 100755 --- a/samplewidget.h +++ b/widgets/samplewidget.h @@ -63,7 +63,7 @@ public: signals: void chokeTriggered(int choke); - void startDecoding(const std::shared_ptr &device); + void startDecoding(std::shared_ptr device); void sendMidi(const midi::MidiMessage &midiMsg); private slots: diff --git a/samplewidget.ui b/widgets/samplewidget.ui similarity index 100% rename from samplewidget.ui rename to widgets/samplewidget.ui diff --git a/scratchwidget.cpp b/widgets/scratchwidget.cpp similarity index 100% rename from scratchwidget.cpp rename to widgets/scratchwidget.cpp diff --git a/scratchwidget.h b/widgets/scratchwidget.h similarity index 100% rename from scratchwidget.h rename to widgets/scratchwidget.h diff --git a/sequencerwidget.cpp b/widgets/sequencerwidget.cpp similarity index 100% rename from sequencerwidget.cpp rename to widgets/sequencerwidget.cpp diff --git a/sequencerwidget.h b/widgets/sequencerwidget.h similarity index 100% rename from sequencerwidget.h rename to widgets/sequencerwidget.h diff --git a/sequencerwidget.ui b/widgets/sequencerwidget.ui similarity index 100% rename from sequencerwidget.ui rename to widgets/sequencerwidget.ui diff --git a/widgets/synthisizerwidget.cpp b/widgets/synthisizerwidget.cpp new file mode 100644 index 0000000..b2a42cf --- /dev/null +++ b/widgets/synthisizerwidget.cpp @@ -0,0 +1,46 @@ +#include "synthisizerwidget.h" +#include "ui_synthisizerwidget.h" + +#include + +#include "midicontainers.h" + +SynthisizerWidget::SynthisizerWidget(QWidget *parent) : + QWidget{parent}, + m_ui{std::make_unique()} +{ + 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)); +} diff --git a/synthisizerwidget.h b/widgets/synthisizerwidget.h similarity index 100% rename from synthisizerwidget.h rename to widgets/synthisizerwidget.h diff --git a/widgets/synthisizerwidget.ui b/widgets/synthisizerwidget.ui new file mode 100644 index 0000000..37de04a --- /dev/null +++ b/widgets/synthisizerwidget.ui @@ -0,0 +1,67 @@ + + + SynthisizerWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + 30 + 60 + 221 + 31 + + + + Hier könnte ihr Synthisizer stehen. + + + + + + 110 + 110 + 160 + 16 + + + + 100 + + + 100 + + + Qt::Horizontal + + + + + + 20 + 110 + 55 + 18 + + + + Volume: + + + horizontalSliderVolume + + + + + + diff --git a/trackdeck.cpp b/widgets/trackdeck.cpp similarity index 100% rename from trackdeck.cpp rename to widgets/trackdeck.cpp diff --git a/trackdeck.h b/widgets/trackdeck.h similarity index 100% rename from trackdeck.h rename to widgets/trackdeck.h diff --git a/trackdeck.ui b/widgets/trackdeck.ui similarity index 99% rename from trackdeck.ui rename to widgets/trackdeck.ui index 63238f5..d642c32 100644 --- a/trackdeck.ui +++ b/widgets/trackdeck.ui @@ -399,13 +399,13 @@ PreviewWidget QWidget -
previewwidget.h
+
widgets/previewwidget.h
1
ScratchWidget QWidget -
scratchwidget.h
+
widgets/scratchwidget.h
1