#include "mainwindow.h" #include #include #include #include #include mainWindow::mainWindow(QWidget *parent) : QMainWindow(parent), _settingsWindow(new settingsWindow(this)), _presetsList(new QListWidget), _presetSettingsTable(new QTableWidget), _menuBar(new QMenuBar), _midiMessage(new QMidiMessage), _midiIn(new QMidiIn(this)), _midiOut(new QMidiOut(this)) { _prefixPocketC = {0xF0,0x00,0x20,0x20,0x14,0x00}; _midiIn->setIgnoreTypes(false, false, false); // Layout QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget); QHBoxLayout *tableLayout = new QHBoxLayout; // Menu Bar QMenu* mainMenu = new QMenu("File", _menuBar); QAction* settings = mainMenu->addAction("Settings"); mainMenu->addSeparator(); 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())); QMenu* send = mainMenu->addMenu("Send"); QAction* sendSingle = send->addAction("Send this preset"); QAction* sendAll = send->addAction("Send all presets"); _menuBar->addMenu(mainMenu); mainLayout->addWidget(_menuBar); QPushButton *getPresetButton = new QPushButton; getPresetButton->setText("Get preset"); mainLayout->addWidget(getPresetButton); connect(getPresetButton, SIGNAL(clicked(bool)),this,SLOT(sendSingleDumpRequest())); // Table for(int i=0; i<128; i++){ QString defaultCelString = QString("Preset #%1").arg(i+1); _presetsList->addItem(defaultCelString); } QStringList settingsList; settingsList << "Channel" << "Description"<< "Type" << "Parameter"; _presetSettingsTable->setRowCount(16); _presetSettingsTable->setColumnCount(4); _presetSettingsTable->setHorizontalHeaderLabels(settingsList); tableLayout->addWidget(_presetsList); tableLayout->addWidget(_presetSettingsTable); mainLayout->addLayout(tableLayout); mainWidget->setLayout(mainLayout); setCentralWidget(mainWidget); connect(_midiIn, SIGNAL(midiMessageReceived(QMidiMessage*)), this, SLOT(onMidiMessageReceive(QMidiMessage*))); connect(settings, SIGNAL(triggered(bool)), this, SLOT(openSettingsWindow())); } mainWindow::~mainWindow() { } // SLOTS void mainWindow::onMidiMessageReceive(QMidiMessage *message) { std::vector 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: { _settingsWindow->updateConfig(message); break; } case SINGLE_DUMP: { break; } case VERSION_ANS: { break; } } } //qDebug() << "BYTE #7 : " << rawMessage.at(6) ; // DEBUG } void mainWindow::openSettingsWindow() { _settingsWindow->setWindowModality(Qt::ApplicationModal); _settingsWindow->show(); } void mainWindow::updateDeviceConfig(){ if(!_midiOut->isPortOpen()) return; std::bitset<3> *thru = _settingsWindow->_thruBitset; int mastChn = _settingsWindow->_masterChannelSpinBox->value() - 1; std::vector rawRequest; rawRequest = _prefixPocketC; rawRequest.push_back(0x50); rawRequest.push_back(thru->to_ulong()); rawRequest.push_back(mastChn); rawRequest.push_back(0xF7); _midiOut->sendRawMessage(rawRequest); } 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"){ qDebug()<< "Selected MIDI OUT : " <<_settingsWindow->_outPortComboBox->currentText(); _midiOut->openPort(_settingsWindow->_outPortComboBox->currentIndex()); } } void mainWindow::sendThruMasterChnRequest(){ std::vector 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); } void mainWindow::sendSingleDumpRequest(){ std::vector 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(); } }