2016-07-07 19:41:57 +00:00
|
|
|
#include "mainwindow.h"
|
2016-07-11 09:26:06 +00:00
|
|
|
#include <QHBoxLayout>
|
2016-07-16 09:55:29 +00:00
|
|
|
#include <QVBoxLayout>
|
2016-10-30 19:16:06 +00:00
|
|
|
#include <QPushButton>
|
2016-07-12 18:58:40 +00:00
|
|
|
#include <vector>
|
|
|
|
|
#include <QDebug>
|
2016-11-01 15:05:09 +00:00
|
|
|
#include <boost/property_tree/ptree.hpp>
|
|
|
|
|
#include <boost/property_tree/ini_parser.hpp>
|
2016-07-07 19:41:57 +00:00
|
|
|
|
2016-07-11 09:26:06 +00:00
|
|
|
mainWindow::mainWindow(QWidget *parent) :
|
|
|
|
|
QMainWindow(parent),
|
2016-07-17 10:48:12 +00:00
|
|
|
_settingsWindow(new settingsWindow(this)),
|
2016-09-05 23:07:29 +00:00
|
|
|
_presetsList(new QListWidget),
|
2016-07-16 08:49:41 +00:00
|
|
|
_presetSettingsTable(new QTableWidget),
|
2016-07-16 09:55:29 +00:00
|
|
|
_menuBar(new QMenuBar),
|
2016-07-17 17:16:47 +00:00
|
|
|
_midiMessage(new QMidiMessage),
|
|
|
|
|
_midiIn(new QMidiIn(this)),
|
|
|
|
|
_midiOut(new QMidiOut(this))
|
2016-07-07 19:41:57 +00:00
|
|
|
{
|
2016-09-05 00:16:21 +00:00
|
|
|
_prefixPocketC = {0xF0,0x00,0x20,0x20,0x14,0x00};
|
|
|
|
|
_midiIn->setIgnoreTypes(false, false, false);
|
2016-10-30 22:13:06 +00:00
|
|
|
|
2016-11-01 15:05:09 +00:00
|
|
|
// Temporary default starting values (all parameters set to zero)
|
2016-10-30 22:13:06 +00:00
|
|
|
for(int i=0; i<128; i++){
|
|
|
|
|
for(int j=0; j<48; j++){
|
2016-11-01 15:05:09 +00:00
|
|
|
_preset[i][j] = 0;
|
2016-10-30 22:13:06 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-16 09:55:29 +00:00
|
|
|
// Layout
|
|
|
|
|
|
2016-07-11 09:26:06 +00:00
|
|
|
QWidget *mainWidget = new QWidget(this);
|
2016-07-17 08:54:00 +00:00
|
|
|
QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
|
|
|
|
|
QHBoxLayout *tableLayout = new QHBoxLayout;
|
2016-07-16 09:55:29 +00:00
|
|
|
|
|
|
|
|
// Menu Bar
|
|
|
|
|
|
2016-07-17 08:54:00 +00:00
|
|
|
QMenu* mainMenu = new QMenu("File", _menuBar);
|
|
|
|
|
QAction* settings = mainMenu->addAction("Settings");
|
|
|
|
|
mainMenu->addSeparator();
|
2016-10-30 19:16:06 +00:00
|
|
|
|
|
|
|
|
QMenu* get = mainMenu->addMenu("Get");
|
|
|
|
|
QAction* getSingle = get->addAction("Get this preset");
|
|
|
|
|
connect(getSingle,SIGNAL(triggered(bool)),this,SLOT(sendSingleDumpRequest()));
|
|
|
|
|
|
|
|
|
|
QAction* getAll = get->addAction("Get all presets");
|
|
|
|
|
connect(getAll,SIGNAL(triggered(bool)),this,SLOT(sendAllDumpRequest()));
|
|
|
|
|
|
2016-07-17 08:54:00 +00:00
|
|
|
QMenu* send = mainMenu->addMenu("Send");
|
|
|
|
|
QAction* sendSingle = send->addAction("Send this preset");
|
|
|
|
|
QAction* sendAll = send->addAction("Send all presets");
|
2016-07-16 09:55:29 +00:00
|
|
|
|
2016-07-17 08:54:00 +00:00
|
|
|
_menuBar->addMenu(mainMenu);
|
2016-07-16 09:55:29 +00:00
|
|
|
mainLayout->addWidget(_menuBar);
|
|
|
|
|
|
2016-10-30 19:16:06 +00:00
|
|
|
QPushButton *getPresetButton = new QPushButton;
|
|
|
|
|
getPresetButton->setText("Get preset");
|
|
|
|
|
mainLayout->addWidget(getPresetButton);
|
|
|
|
|
connect(getPresetButton, SIGNAL(clicked(bool)),this,SLOT(sendSingleDumpRequest()));
|
|
|
|
|
|
2016-07-16 09:55:29 +00:00
|
|
|
// Table
|
2016-09-05 23:07:29 +00:00
|
|
|
for(int i=0; i<128; i++){
|
2016-07-12 16:46:49 +00:00
|
|
|
QString defaultCelString = QString("Preset #%1").arg(i+1);
|
2016-09-05 23:07:29 +00:00
|
|
|
_presetsList->addItem(defaultCelString);
|
2016-07-12 16:46:49 +00:00
|
|
|
}
|
|
|
|
|
|
2016-10-30 22:13:06 +00:00
|
|
|
connect(_presetsList,SIGNAL(itemSelectionChanged()),this,SLOT(updateTable()));
|
|
|
|
|
|
2016-07-11 09:26:06 +00:00
|
|
|
QStringList settingsList;
|
2016-11-01 15:05:09 +00:00
|
|
|
settingsList << "Channel" << "Type" << "Parameter" << "Description" ;
|
2016-07-12 18:58:40 +00:00
|
|
|
_presetSettingsTable->setRowCount(16);
|
|
|
|
|
_presetSettingsTable->setColumnCount(4);
|
|
|
|
|
_presetSettingsTable->setHorizontalHeaderLabels(settingsList);
|
2016-07-11 09:26:06 +00:00
|
|
|
|
|
|
|
|
|
2016-09-05 23:07:29 +00:00
|
|
|
tableLayout->addWidget(_presetsList);
|
2016-07-17 08:54:00 +00:00
|
|
|
tableLayout->addWidget(_presetSettingsTable);
|
|
|
|
|
|
|
|
|
|
mainLayout->addLayout(tableLayout);
|
2016-07-11 09:26:06 +00:00
|
|
|
|
|
|
|
|
mainWidget->setLayout(mainLayout);
|
|
|
|
|
setCentralWidget(mainWidget);
|
2016-07-12 18:58:40 +00:00
|
|
|
|
2016-07-16 09:55:29 +00:00
|
|
|
|
2016-07-12 18:58:40 +00:00
|
|
|
connect(_midiIn, SIGNAL(midiMessageReceived(QMidiMessage*)), this, SLOT(onMidiMessageReceive(QMidiMessage*)));
|
2016-07-17 09:10:51 +00:00
|
|
|
connect(settings, SIGNAL(triggered(bool)), this, SLOT(openSettingsWindow()));
|
2016-07-12 18:58:40 +00:00
|
|
|
|
2016-07-07 19:41:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mainWindow::~mainWindow()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
2016-07-12 18:58:40 +00:00
|
|
|
|
2016-07-17 17:16:47 +00:00
|
|
|
// SLOTS
|
|
|
|
|
|
2016-07-12 18:58:40 +00:00
|
|
|
void mainWindow::onMidiMessageReceive(QMidiMessage *message)
|
|
|
|
|
{
|
|
|
|
|
std::vector<unsigned char> rawMessage = message->getRawMessage();
|
|
|
|
|
// MAKE SURE THE RECEIVED MESSAGE IS COMING FROM A POCKETC (F0 00 20 20 14 00) AND THAT message.size() > 7 BYTES
|
|
|
|
|
if(rawMessage.size() > 7)
|
|
|
|
|
{
|
|
|
|
|
// PROCESS THE MESSAGE ACCORDING TO THE BYTE #7
|
|
|
|
|
switch(rawMessage.at(6))
|
|
|
|
|
{
|
|
|
|
|
case THRU_MC_DUMP:
|
|
|
|
|
{
|
2016-09-05 00:16:21 +00:00
|
|
|
_settingsWindow->updateConfig(message);
|
2016-07-12 18:58:40 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case SINGLE_DUMP:
|
|
|
|
|
{
|
2016-10-30 21:06:44 +00:00
|
|
|
this->updatePreset(message);
|
2016-07-12 18:58:40 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case VERSION_ANS:
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//qDebug() << "BYTE #7 : " << rawMessage.at(6) ; // DEBUG
|
|
|
|
|
}
|
2016-07-17 09:10:51 +00:00
|
|
|
|
2016-07-17 17:16:47 +00:00
|
|
|
void mainWindow::openSettingsWindow()
|
|
|
|
|
{
|
2016-07-17 10:48:12 +00:00
|
|
|
_settingsWindow->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
_settingsWindow->show();
|
2016-07-17 09:10:51 +00:00
|
|
|
}
|
2016-07-17 17:16:47 +00:00
|
|
|
|
2016-10-30 21:06:44 +00:00
|
|
|
void mainWindow::updateDeviceConfig()
|
|
|
|
|
{
|
2016-09-05 21:53:01 +00:00
|
|
|
if(!_midiOut->isPortOpen()) return;
|
|
|
|
|
|
|
|
|
|
std::bitset<3> *thru = _settingsWindow->_thruBitset;
|
|
|
|
|
int mastChn = _settingsWindow->_masterChannelSpinBox->value() - 1;
|
|
|
|
|
|
|
|
|
|
std::vector<unsigned char> rawRequest;
|
|
|
|
|
rawRequest = _prefixPocketC;
|
|
|
|
|
rawRequest.push_back(0x50);
|
|
|
|
|
rawRequest.push_back(thru->to_ulong());
|
|
|
|
|
rawRequest.push_back(mastChn);
|
|
|
|
|
rawRequest.push_back(0xF7);
|
|
|
|
|
|
|
|
|
|
_midiOut->sendRawMessage(rawRequest);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-30 21:06:44 +00:00
|
|
|
void mainWindow::updatePreset(QMidiMessage *message)
|
|
|
|
|
{
|
|
|
|
|
int presetNum = message->getRawMessage().at(7);
|
|
|
|
|
for(int i=0; i<48; i++){
|
|
|
|
|
_preset[presetNum][i] = message->getRawMessage().at(9+i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-30 22:13:06 +00:00
|
|
|
void mainWindow::updateTable()
|
|
|
|
|
{
|
|
|
|
|
// ROWS
|
|
|
|
|
for(int i=0; i<16; i++){
|
|
|
|
|
//COLS
|
|
|
|
|
for(int j=0; j<3; j++){
|
|
|
|
|
QString value = QString::number(_preset[_presetsList->currentRow()][i+16*j]);
|
|
|
|
|
_presetSettingsTable->setItem(i,j,new QTableWidgetItem(value));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-26 16:48:55 +00:00
|
|
|
void mainWindow::openMidiPorts(){
|
|
|
|
|
_midiIn->closePort();
|
|
|
|
|
_midiOut->closePort();
|
|
|
|
|
if(_settingsWindow->_inPortComboBox->currentText() != "None"){
|
|
|
|
|
qDebug()<< "Selected MIDI IN : " <<_settingsWindow->_inPortComboBox->currentText();
|
|
|
|
|
_midiIn->openPort(_settingsWindow->_inPortComboBox->currentIndex());
|
|
|
|
|
}
|
|
|
|
|
if(_settingsWindow->_outPortComboBox->currentText() != "None"){
|
2016-09-05 00:16:21 +00:00
|
|
|
qDebug()<< "Selected MIDI OUT : " <<_settingsWindow->_outPortComboBox->currentText();
|
2016-07-26 16:48:55 +00:00
|
|
|
_midiOut->openPort(_settingsWindow->_outPortComboBox->currentIndex());
|
|
|
|
|
}
|
2016-07-17 17:16:47 +00:00
|
|
|
}
|
2016-09-05 00:16:21 +00:00
|
|
|
|
|
|
|
|
void mainWindow::sendThruMasterChnRequest(){
|
|
|
|
|
std::vector<unsigned char> rawRequest;
|
|
|
|
|
rawRequest = _prefixPocketC;
|
|
|
|
|
rawRequest.push_back(0x56);
|
|
|
|
|
rawRequest.push_back(0x00);
|
|
|
|
|
rawRequest.push_back(0x00);
|
|
|
|
|
rawRequest.push_back(0xF7);
|
|
|
|
|
if(_midiOut->isPortOpen()) _midiOut->sendRawMessage(rawRequest);
|
|
|
|
|
}
|
2016-10-30 19:16:06 +00:00
|
|
|
|
|
|
|
|
void mainWindow::sendSingleDumpRequest(){
|
|
|
|
|
std::vector<unsigned char> rawRequest;
|
|
|
|
|
rawRequest = _prefixPocketC;
|
|
|
|
|
rawRequest.push_back(0x26);
|
|
|
|
|
rawRequest.push_back(_presetsList->currentRow());
|
|
|
|
|
rawRequest.push_back(0x00);
|
|
|
|
|
rawRequest.push_back(0xF7);
|
|
|
|
|
if(_midiOut->isPortOpen()) _midiOut->sendRawMessage(rawRequest);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void mainWindow::sendAllDumpRequest(){
|
|
|
|
|
_presetsList->setCurrentRow(0);
|
|
|
|
|
for(int i=0; i<_presetsList->count(); i++){
|
|
|
|
|
_presetsList->setCurrentRow(i);
|
|
|
|
|
sendSingleDumpRequest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|