Files
DrumMachine/widgets/sampleswidget.cpp

177 lines
4.9 KiB
C++
Raw Normal View History

2020-04-25 20:53:49 +02:00
#include "sampleswidget.h"
#include "ui_sampleswidget.h"
#include <iterator>
#include <QDebug>
2022-12-27 21:19:21 +01:00
#include "audioformat.h"
2020-04-25 20:53:49 +02:00
#include "midicontainers.h"
SamplesWidget::SamplesWidget(QWidget *parent) :
QWidget{parent},
m_ui{std::make_unique<Ui::SamplesWidget>()}
{
m_ui->setupUi(this);
connect(m_ui->checkBox, &QCheckBox::toggled, this, &SamplesWidget::updateWidgets);
connect(m_ui->pushButtonStopAll, &QAbstractButton::pressed, this, &SamplesWidget::stopAll);
quint8 padNr{};
for (SampleWidget &widget : getWidgets())
2020-04-26 20:49:20 +02:00
{
widget.setPadNr(padNr++);
connect(&widget, &SampleWidget::chokeTriggered, this, &SamplesWidget::chokeTriggered);
connect(&widget, &SampleWidget::sendMidi, this, &SamplesWidget::sendMidi);
2020-04-26 20:49:20 +02:00
}
2020-04-25 20:53:49 +02:00
}
2020-04-27 22:59:30 +02:00
SamplesWidget::~SamplesWidget() = default;
2020-04-25 20:53:49 +02:00
void SamplesWidget::loadSettings(DrumMachineSettings &settings)
{
for (SampleWidget &widget : getWidgets())
widget.loadSettings(settings);
}
2022-12-27 21:19:21 +01:00
void SamplesWidget::setPreset(const drumpad_presets::Preset &preset)
2020-04-25 20:53:49 +02:00
{
m_preset = preset;
updateWidgets();
}
void SamplesWidget::midiReceived(const midi::MidiMessage &message)
2020-04-25 20:53:49 +02:00
{
if (message == midi::MidiMessage{.channel=0,.cmd=midi::Command::ControlChange,.flag=true,.note=64,.velocity=127})
{
m_ui->checkBox->toggle();
return;
}
if (message.cmd != midi::Command::NoteOn && message.cmd != midi::Command::NoteOff)
return;
for (SampleWidget &widget : getWidgets())
2020-04-25 20:53:49 +02:00
{
2022-12-17 16:46:14 +01:00
if (widget.isLearning())
{
widget.learn(message.channel, message.note);
}
else if (widget.channel() == message.channel && widget.note() == message.note)
2020-04-25 20:53:49 +02:00
{
if (message.cmd == midi::Command::NoteOff || (message.cmd == midi::Command::NoteOn && message.velocity == 0))
widget.released();
else if (message.cmd == midi::Command::NoteOn)
widget.pressed(message.velocity);
2020-04-25 20:53:49 +02:00
}
}
}
2020-04-26 20:49:20 +02:00
void SamplesWidget::writeSamples(frame_t *begin, frame_t *end)
2020-04-25 20:53:49 +02:00
{
for (SampleWidget &widget : getWidgets())
widget.writeSamples(begin, end);
2020-04-25 20:53:49 +02:00
}
void SamplesWidget::injectNetworkAccessManager(QNetworkAccessManager &networkAccessManager)
{
for (SampleWidget &widget : getWidgets())
widget.injectNetworkAccessManager(networkAccessManager);
}
2020-04-27 22:59:30 +02:00
void SamplesWidget::injectDecodingThread(QThread &thread)
{
for (SampleWidget &widget : getWidgets())
widget.injectDecodingThread(thread);
2020-04-27 22:59:30 +02:00
}
void SamplesWidget::unsendColors()
{
for (SampleWidget &widget : getWidgets())
widget.unsendColor();
}
void SamplesWidget::sendColors()
{
for (SampleWidget &widget : getWidgets())
widget.sendColor();
}
2020-04-25 23:03:33 +02:00
void SamplesWidget::sequencerTriggerSample(int index)
{
const auto widgets = getWidgets();
2022-12-27 23:43:09 +01:00
if (index < 0 || index >= int(std::size(widgets)))
2020-04-25 23:03:33 +02:00
{
qDebug() << "index out of range" << index;
return;
}
widgets[index].get().pressed(127);
}
2020-04-25 20:53:49 +02:00
void SamplesWidget::chokeTriggered(int choke)
{
for (SampleWidget &widget : getWidgets())
2020-04-25 20:53:49 +02:00
{
if (&widget == sender())
2020-04-25 20:53:49 +02:00
continue;
if (widget.choke() && *widget.choke() && *widget.choke() == choke)
widget.forceStop();
2020-04-25 20:53:49 +02:00
}
}
void SamplesWidget::updateWidgets()
{
const auto widgets = getWidgets();
auto files = *m_preset.files;
if (m_ui->checkBox->isChecked())
for (int i = 0; i < 12; i++)
std::swap(files[i], files[i+12]);
auto filesIter = std::cbegin(files);
auto widgetsIter = std::cbegin(widgets);
for (; filesIter != std::cend(files) && widgetsIter != std::cend(widgets); std::advance(filesIter, 1), std::advance(widgetsIter, 1))
widgetsIter->get().setFile(*m_preset.id, *filesIter);
}
void SamplesWidget::stopAll()
{
for (SampleWidget &widget : getWidgets())
widget.forceStop();
2020-04-25 20:53:49 +02:00
}
std::array<std::reference_wrapper<SampleWidget>, 24> SamplesWidget::getWidgets()
{
return {
std::ref(*m_ui->sampleWidget_1),
std::ref(*m_ui->sampleWidget_2),
std::ref(*m_ui->sampleWidget_3),
std::ref(*m_ui->sampleWidget_4),
std::ref(*m_ui->sampleWidget_5),
std::ref(*m_ui->sampleWidget_6),
std::ref(*m_ui->sampleWidget_7),
std::ref(*m_ui->sampleWidget_8),
std::ref(*m_ui->sampleWidget_9),
std::ref(*m_ui->sampleWidget_10),
std::ref(*m_ui->sampleWidget_11),
std::ref(*m_ui->sampleWidget_12),
std::ref(*m_ui->sampleWidget_13),
std::ref(*m_ui->sampleWidget_14),
std::ref(*m_ui->sampleWidget_15),
std::ref(*m_ui->sampleWidget_16),
std::ref(*m_ui->sampleWidget_17),
std::ref(*m_ui->sampleWidget_18),
std::ref(*m_ui->sampleWidget_19),
std::ref(*m_ui->sampleWidget_20),
std::ref(*m_ui->sampleWidget_21),
std::ref(*m_ui->sampleWidget_22),
std::ref(*m_ui->sampleWidget_23),
std::ref(*m_ui->sampleWidget_24)
};
}