diff -ruN -x .bzr mixxx/mixxx/src/library/cratetablemodel.cpp mixxx-changes/mixxx/src/library/cratetablemodel.cpp --- mixxx/mixxx/src/library/cratetablemodel.cpp 2013-05-10 00:25:43.271410000 -0700 +++ mixxx-changes/mixxx/src/library/cratetablemodel.cpp 2013-05-09 10:54:29.884396170 -0700 @@ -1,3 +1,4 @@ + // cratetablemodel.cpp // Created 10/25/2009 by RJ Ryan (rryan@mit.edu) @@ -202,7 +203,7 @@ | TRACKMODELCAPS_LOADTOSAMPLER | TRACKMODELCAPS_LOADTOPREVIEWDECK | TRACKMODELCAPS_REMOVE - | TRACKMODELCAPS_BPMLOCK + | TRACKMODELCAPS_MANIPULATEBEATS | TRACKMODELCAPS_CLEAR_BEATS | TRACKMODELCAPS_RESETPLAYED; diff -ruN -x .bzr mixxx/mixxx/src/library/librarytablemodel.cpp mixxx-changes/mixxx/src/library/librarytablemodel.cpp --- mixxx/mixxx/src/library/librarytablemodel.cpp 2013-05-10 00:25:43.271410000 -0700 +++ mixxx-changes/mixxx/src/library/librarytablemodel.cpp 2013-05-09 10:53:57.252397134 -0700 @@ -139,7 +139,7 @@ | TRACKMODELCAPS_LOADTOSAMPLER | TRACKMODELCAPS_LOADTOPREVIEWDECK | TRACKMODELCAPS_HIDE - | TRACKMODELCAPS_BPMLOCK + | TRACKMODELCAPS_MANIPULATEBEATS | TRACKMODELCAPS_CLEAR_BEATS | TRACKMODELCAPS_RESETPLAYED; } diff -ruN -x .bzr mixxx/mixxx/src/library/playlisttablemodel.cpp mixxx-changes/mixxx/src/library/playlisttablemodel.cpp --- mixxx/mixxx/src/library/playlisttablemodel.cpp 2013-05-10 00:25:43.271410000 -0700 +++ mixxx-changes/mixxx/src/library/playlisttablemodel.cpp 2013-05-09 10:50:51.172402632 -0700 @@ -380,7 +380,7 @@ | TRACKMODELCAPS_LOADTOSAMPLER | TRACKMODELCAPS_LOADTOPREVIEWDECK | TRACKMODELCAPS_REMOVE - | TRACKMODELCAPS_BPMLOCK + | TRACKMODELCAPS_MANIPULATEBEATS | TRACKMODELCAPS_CLEAR_BEATS | TRACKMODELCAPS_RESETPLAYED; diff -ruN -x .bzr mixxx/mixxx/src/library/trackmodel.h mixxx-changes/mixxx/src/library/trackmodel.h --- mixxx/mixxx/src/library/trackmodel.h 2013-05-10 00:25:43.271410000 -0700 +++ mixxx-changes/mixxx/src/library/trackmodel.h 2013-05-09 10:45:28.092412180 -0700 @@ -38,7 +38,7 @@ TRACKMODELCAPS_LOADTOPREVIEWDECK = 0x00200, TRACKMODELCAPS_REMOVE = 0x00400, TRACKMODELCAPS_RELOCATE = 0x00800, - TRACKMODELCAPS_BPMLOCK = 0x01000, + TRACKMODELCAPS_MANIPULATEBEATS = 0x01000, TRACKMODELCAPS_CLEAR_BEATS = 0x02000, TRACKMODELCAPS_RESETPLAYED = 0x04000, TRACKMODELCAPS_HIDE = 0x08000, diff -ruN -x .bzr mixxx/mixxx/src/widget/wtracktableview.cpp mixxx-changes/mixxx/src/widget/wtracktableview.cpp --- mixxx/mixxx/src/widget/wtracktableview.cpp 2013-05-10 00:25:43.271410000 -0700 +++ mixxx-changes/mixxx/src/widget/wtracktableview.cpp 2013-05-09 11:02:14.972382428 -0700 @@ -58,6 +58,8 @@ m_pPlaylistMenu->setTitle(tr("Add to Playlist")); m_pCrateMenu = new QMenu(this); m_pCrateMenu->setTitle(tr("Add to Crate")); + m_pBPMMenu = new QMenu(this); + m_pBPMMenu->setTitle(tr("BPM Settings")); // Disable editing //setEditTriggers(QAbstractItemView::NoEditTriggers); @@ -309,6 +311,18 @@ connect(m_pBpmUnlockAction, SIGNAL(triggered()), this, SLOT(slotUnlockBpm())); + //new BPM actions + m_pBpmDoubleAction = new QAction(tr("Double BPM"), this); + m_pBpmHalveAction = new QAction(tr("Halve BPM"), this); + m_pBpmTwoThirdsAction = new QAction(tr("2/3 BPM"), this); + + connect(m_pBpmDoubleAction, SIGNAL(triggered()), + this, SLOT(slotDoubleBpm())); + connect(m_pBpmHalveAction, SIGNAL(triggered()), + this, SLOT(slotHalveBpm())); + connect(m_pBpmTwoThirdsAction, SIGNAL(triggered()), + this, SLOT(slotTwoThirdsBpm())); + m_pClearBeatsAction = new QAction(tr("Clear BPM and Beatgrid"), this); connect(m_pClearBeatsAction, SIGNAL(triggered()), this, SLOT(slotClearBeats())); @@ -574,7 +588,13 @@ m_pMenu->addSeparator(); - if (modelHasCapabilities(TrackModel::TRACKMODELCAPS_BPMLOCK)) { + //start of BPM section of menu + + + if (modelHasCapabilities(TrackModel::TRACKMODELCAPS_MANIPULATEBEATS)) { + m_pBPMMenu->addAction(m_pBpmDoubleAction); + m_pBPMMenu->addAction(m_pBpmHalveAction); + m_pBPMMenu->addAction(m_pBpmTwoThirdsAction); m_pMenu->addAction(m_pBpmLockAction); m_pMenu->addAction(m_pBpmUnlockAction); if (oneSongSelected) { @@ -593,6 +613,9 @@ } } } + //add BPM menu to pMenu + m_pMenu->addMenu(m_pBPMMenu); + //end of BPM section of menu if (modelHasCapabilities(TrackModel::TRACKMODELCAPS_CLEAR_BEATS)) { TrackModel* trackModel = getTrackModel(); @@ -1205,6 +1228,78 @@ lockBpm(false); } +//new BPM slots +void WTrackTableView::slotDoubleBpm(){ + TrackModel* trackModel = getTrackModel(); + if (trackModel == NULL) { + return; + } + + QModelIndexList selectedTrackIndices = selectionModel()->selectedRows(); + // TODO: This should be done in a thread for large selections + for (int i = 0; i < selectedTrackIndices.size(); ++i) { + QModelIndex index = selectedTrackIndices.at(i); + TrackPointer track = trackModel->getTrack(index); + if (!track->hasBpmLock()) { //bpm is not locked + BeatsPointer beats = track->getBeats(); + if(beats != NULL){ + beats->scale(2); + } + else{ + continue; + } + } + } +} + +void WTrackTableView::slotHalveBpm(){ + TrackModel* trackModel = getTrackModel(); + if (trackModel == NULL) { + return; + } + + QModelIndexList selectedTrackIndices = selectionModel()->selectedRows(); + // TODO: This should be done in a thread for large selections + for (int i = 0; i < selectedTrackIndices.size(); ++i) { + QModelIndex index = selectedTrackIndices.at(i); + TrackPointer track = trackModel->getTrack(index); + if (!track->hasBpmLock()) { //bpm is not locked + BeatsPointer beats = track->getBeats(); + if(beats != NULL){ + beats->scale(0.5); + } + else{ + continue; + } + } + } +} + +void WTrackTableView::slotTwoThirdsBpm(){ + TrackModel* trackModel = getTrackModel(); + if (trackModel == NULL) { + return; + } + + QModelIndexList selectedTrackIndices = selectionModel()->selectedRows(); + // TODO: This should be done in a thread for large selections + for (int i = 0; i < selectedTrackIndices.size(); ++i) { + QModelIndex index = selectedTrackIndices.at(i); + TrackPointer track = trackModel->getTrack(index); + if (!track->hasBpmLock()) { //bpm is not locked + BeatsPointer beats = track->getBeats(); + if(beats != NULL){ + double twoThirds = 2.0 / 3.0; //keep as much accuracy as possbile + beats->scale(twoThirds); + } + else{ + continue; + } + } + } +} +//end of new BPM slots + void WTrackTableView::lockBpm(bool lock) { TrackModel* trackModel = getTrackModel(); if (trackModel == NULL) { diff -ruN -x .bzr mixxx/mixxx/src/widget/wtracktableview.h mixxx-changes/mixxx/src/widget/wtracktableview.h --- mixxx/mixxx/src/widget/wtracktableview.h 2013-05-10 00:25:43.271410000 -0700 +++ mixxx-changes/mixxx/src/widget/wtracktableview.h 2013-05-08 14:32:51.573392568 -0700 @@ -57,6 +57,9 @@ void doSortByColumn(int headerSection); void slotLockBpm(); void slotUnlockBpm(); + void slotDoubleBpm(); + void slotHalveBpm(); + void slotTwoThirdsBpm(); void slotClearBeats(); private: @@ -91,7 +94,7 @@ ControlObjectThreadMain* m_pNumPreviewDecks; // Context menu machinery - QMenu *m_pMenu, *m_pPlaylistMenu, *m_pCrateMenu, *m_pSamplerMenu; + QMenu *m_pMenu, *m_pPlaylistMenu, *m_pCrateMenu, *m_pSamplerMenu, *m_pBPMMenu; QSignalMapper m_playlistMapper, m_crateMapper, m_deckMapper, m_samplerMapper; // Reload Track Metadata Action: @@ -121,6 +124,11 @@ QAction *m_pBpmLockAction; QAction *m_pBpmUnlockAction; + //BPM changes + QAction *m_pBpmDoubleAction; + QAction *m_pBpmHalveAction; + QAction *m_pBpmTwoThirdsAction; + // Clear track beats QAction* m_pClearBeatsAction;