#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent): QMainWindow(parent),ui(new Ui::MainWindow) { //pone un icono en la parte superior QIcon icon("music.png"); setWindowIcon(icon); //variable interruptor para cambiar el color de los microfonos micColor=0; //importante tener un control del numero de la fila para manejar el excel fila_actual=0; //creacion de la ui ui->setupUi(this); //cambia el titulo this->setWindowTitle("EasyBPM"); //adicion vista del microfono ui->graphicsView->setScene(&interiorScene); modelMic=new MicView(); addHouseHollow(modelMic); //creacion de timers timerBPM=new QTimer(this); timerBPMAuto=new QTimer(this); //boton y coneccion del live button liveButton = ui->pushButton_2; connect(liveButton, SIGNAL(clicked()), this, SLOT(grabarAudio())); //bpm manual model = new GetBpmManually(); buttonBPM = ui->buttonBPM; buttonBPM->connect(buttonBPM, SIGNAL(clicked()), this, SLOT(setBeat())); display = ui->display;//muestra el bpm manual //añadir cancion manual buttonSong = ui->buttonSong; buttonSong->connect(buttonSong, SIGNAL(clicked()), this, SLOT(setSong())); //boton y coneccion de funcion copia de archivos existentes mp3button = ui -> mp3button; mp3button->connect(mp3button, SIGNAL(clicked()),this, SLOT(seleccionarArchivo())); //conexion timers, utilizados en un par de funciones timerBPM->connect(timerBPM, SIGNAL(timeout()), this, SLOT(setSongAuto())); timerBPMAuto->connect(timerBPMAuto,SIGNAL(timeout()),this, SLOT(setSongByAudio())); timerBPMAuto->connect(timerBPMAuto,SIGNAL(timeout()),this, SLOT(changeMicColor())); //boton para filtrar por texto filtro = ui->buttonSort; filtro->connect (filtro, SIGNAL(clicked()), this, SLOT(sortText())); //deshace el filtro deshacerFiltro = ui->undoButton; deshacerFiltro->connect (deshacerFiltro, SIGNAL(clicked()), this, SLOT(undoFilter())); //boton para eliminar una fila del archivo deleteSong = ui->deleteSong; deleteSong -> connect (deleteSong, SIGNAL(clicked()), this, SLOT(deleteRow())); //creacion de la tabla table = ui->tableWidget; table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); table->setHorizontalHeaderLabels({"bpm","artist","song"}); table->setEditTriggers(QAbstractItemView::NoEditTriggers); //asignacion de la ventanita de informacion info = ui->info; } //cambia la vista de color del microfono, para aparentar que se esta grabando void MainWindow::changeMicColor(){ if(micColor==0){ modelMic->changeColor(); micColor=1; } else{ modelMic->changeColor(); micColor=0; } } //genera en el txt name la palabra clave record, que es capturada por el main.py que esta corriendo por terminal, esta es una escucha en vivo //de 10 segundos que es pasada al py para asi obtener el bpm desde tu microfono void MainWindow::grabarAudio(){ changeMicColor(); QFile filetemp("name.txt"); filetemp.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&filetemp); out << "record"; filetemp.close(); timerBPMAuto->start(10000); info -> setText("Grabando MIC..."); } //logica para seleccionar un archivo de una de tus carpetas void MainWindow::seleccionarArchivo(){ QString rutaArchivo = QFileDialog::getOpenFileName(this, "Seleccionar archivo", QDir::homePath(), "Archivos (*.*)"); QString rutaDestino = QDir::currentPath(); QString nombreArchivo = QFileInfo(rutaArchivo).fileName(); rutaDestino = QDir(rutaDestino).filePath(nombreArchivo); if (QFile::copy(rutaArchivo, rutaDestino)) { QFile file("name.txt"); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&file); out << nombreArchivo; file.close(); qDebug() << "Archivo copiado con éxito"; timerBPM->start(12000); } else { qDebug() << "No se pudo copiar el archivo"; } info -> setText("Analazinado BPM..."); } //funcion que quita una linea del txt donde se alamcenan las canciones, es importante que no haya un filtro para deletear una linea //pues el filtro mueve de manera virtual la posicion de la linea void MainWindow::deleteRow(){ QString input = QInputDialog::getText(0,"Ingrese la fila que desea remover",0); if(input != ""){ int row = stoi(input.toStdString()); bpm = table->item(row-1,0)->text(); artista = table->item(row-1,1)->text(); song = table->item(row-1,2)->text(); b = bpm.toStdString(); a = artista.toStdString(); s = song.toStdString(); table->removeRow(row-1); ifstream archivoEntrada; archivoEntrada.open(this->file); string linea; string contenidoActualizado; int contador = 1; while (getline(archivoEntrada, linea)) { if (contador != row) { contenidoActualizado += linea + "\n"; } contador++; } archivoEntrada.close(); ofstream archivoSalida; archivoSalida.open(this->file); archivoSalida << contenidoActualizado; archivoSalida.close(); fila_actual--; } else{ QMessageBox::information(this, tr("Error"), tr("Ingreso invalido")); } } //funcion que filtra las columnas del excel mediante una palabra clave, es sensible a las mayusculas void MainWindow::sortText(){ //logica encontra en internet, stackoverflow QString filter = QInputDialog::getText(0,"Ingrese el Filtro",0); for( int i = 0; i < table->rowCount(); ++i ) { bool match = false; for(int j = 0; j < table->columnCount(); ++j) { QTableWidgetItem *item = table->item(i,j); if(item->text().contains(filter)) { match = true; break; } } table->setRowHidden(i,!match); } } //deshace el filtro anterior, al igual que la anterior, sacada de stackoverflow void MainWindow::undoFilter(){ for(int i = 0; i < table->rowCount(); ++i){ table->setRowHidden(i, false); } } //logica para agregar la cancion que tenias en el sistema, y fue analizada por el main.py, obteniendo los bpm de manea automatica void MainWindow::setSongAuto(){ info ->clear(); timerBPM->stop(); artista = QInputDialog::getText(0,"Ingrese el Artista",0); song = QInputDialog::getText(0,"Ingrese Cancion",0); ifstream fin; fin.open("bpm.txt"); string temp; fin >> temp; fin.close(); ofstream fin2; fin2.open("bpm.txt"); fin2<<""; fin2.close(); bpm = QString::fromStdString(temp); if(bpm !="" && artista != "" && song != ""){ table->insertRow(fila_actual); table->setItem(fila_actual,0,new QTableWidgetItem(bpm)); table->setItem(fila_actual,1,new QTableWidgetItem(artista)); table->setItem(fila_actual,2,new QTableWidgetItem(song)); b=bpm.toStdString(); a=artista.toStdString(); s=song.toStdString(); fifi.open(file,fifi.out | fifi.app); fifi< clear(); timerBPMAuto->stop(); artista=QInputDialog::getText(0,"Ingrese el Artista",0); song=QInputDialog::getText(0,"Ingrese Cancion",0); ifstream fin; fin.open("bpm.txt"); string temp; fin >> temp; fin.close(); ofstream fin2; fin2.open("bpm.txt"); fin2<<""; fin2.close(); bpm = QString::fromStdString(temp); if(bpm != "" && artista != "" && song != ""){ table->insertRow(fila_actual); table->setItem(fila_actual,0,new QTableWidgetItem(bpm)); table->setItem(fila_actual,1,new QTableWidgetItem(artista)); table->setItem(fila_actual,2,new QTableWidgetItem(song)); b=bpm.toStdString(); a=artista.toStdString(); s=song.toStdString(); fifi.open(file,fifi.out | fifi.app); fifi<insertRow(fila_actual); table->setItem(fila_actual,0,new QTableWidgetItem(bpm)); table->setItem(fila_actual,1,new QTableWidgetItem(artista)); table->setItem(fila_actual,2,new QTableWidgetItem(song)); b=bpm.toStdString(); a=artista.toStdString(); s=song.toStdString(); fifi.open(file,fifi.out | fifi.app); fifi<insertRow(fila_actual); table->setItem(fila_actual,0,new QTableWidgetItem(artista)); table->setItem(fila_actual,1,new QTableWidgetItem(bpm)); table->setItem(fila_actual,2,new QTableWidgetItem(song)); fila_actual +=1; } //boton manual para obtener el bpm, requiere de mucha experticie void MainWindow::setBeat(){ model->actualBPM+=1; model->startTimer(60000); display->setText("BPM "+model->obtainActualBpm()); } //logica reutilizada de la tarea 3 para agregar a la ui la vista del microfono void MainWindow::addHouseHollow(QGraphicsItemGroup * compoundItem){ interiorScene.addItem(compoundItem); } //destructor, cuando se cierra el programa, arregla nuestros txt que son escenciales para el manejo por transformadas de fourier MainWindow::~MainWindow() { QFile file("name.txt"); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&file); out << "end"; delete timerBPM; delete timerBPMAuto; file.close(); delete ui; }