From 28b0b67eed9ae857dd5b093a05cac9e969651552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 2 Sep 2018 23:31:39 +0200 Subject: [PATCH 001/247] Allow "" to filter for explicite empty fileds --- src/library/crate/cratestorage.cpp | 29 +++++++++++++- src/library/crate/cratestorage.h | 2 + src/library/searchquery.cpp | 62 ++++++++++++++++++++++++++++++ src/library/searchquery.h | 32 +++++++++++++++ src/library/searchqueryparser.cpp | 34 +++++++++++++--- 5 files changed, 151 insertions(+), 8 deletions(-) diff --git a/src/library/crate/cratestorage.cpp b/src/library/crate/cratestorage.cpp index a7509a04e90e..f8c87a20d083 100644 --- a/src/library/crate/cratestorage.cpp +++ b/src/library/crate/cratestorage.cpp @@ -462,6 +462,17 @@ QString CrateStorage::formatQueryForTrackIdsByCrateNameLike( escapedCrateNameLike); } +//static +QString CrateStorage::formatQueryForTrackIdsWithCrate() { + return QString("SELECT DISTINCT %1 FROM %2 JOIN %3 ON %4=%5 ORDER BY %1").arg( + CRATETRACKSTABLE_TRACKID, + CRATE_TRACKS_TABLE, + CRATE_TABLE, + CRATETRACKSTABLE_CRATEID, + CRATETABLE_ID); +} + + CrateTrackSelectResult CrateStorage::selectCrateTracksSorted(CrateId crateId) const { FwdSqlQuery query(m_database, QString( @@ -514,8 +525,6 @@ CrateSummarySelectResult CrateStorage::selectCratesWithTrackCount(const QList CrateStorage::collectCrateIdsOfTracks(const QList& trackIds) const { // NOTE(uklotzde): One query per track id. This could be optimized diff --git a/src/library/crate/cratestorage.h b/src/library/crate/cratestorage.h index 1851f04d129a..fdf810fd4d8a 100644 --- a/src/library/crate/cratestorage.h +++ b/src/library/crate/cratestorage.h @@ -268,6 +268,7 @@ class CrateStorage: public virtual /*implements*/ SqlStorage { QString formatQueryForTrackIdsByCrateNameLike( const QString& crateNameLike) const; // no db access + static QString formatQueryForTrackIdsWithCrate(); // no db access // Select the track ids of a crate or the crate ids of a track respectively. // The results are sorted (ascending) by the target id, i.e. the id that is // not provided for filtering. This enables the caller to perform efficient @@ -280,6 +281,7 @@ class CrateStorage: public virtual /*implements*/ SqlStorage { const QList& trackIds) const; CrateTrackSelectResult selectTracksSortedByCrateNameLike( const QString& crateNameLike) const; + CrateTrackSelectResult selectAllTracksSorted() const; // Returns the set of crate ids for crates that contain any of the // provided track ids. diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index c7aad9931fa8..74b1ae123618 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -166,6 +166,26 @@ QString TextFilterNode::toSql() const { return concatSqlClauses(searchClauses, "OR"); } +bool NullTextFilterNode::match(const TrackPointer& pTrack) const { + for (const auto& sqlColumn: m_sqlColumns) { + QVariant value = getTrackValueForColumn(pTrack, sqlColumn); + if (!value.isValid() || !qVariantCanConvert(value)) { + continue; + } + // only use the major coloumn + return value.toString().isEmpty(); + } + return false; +} + +QString NullTextFilterNode::toSql() const { + for (const auto& sqlColumn: m_sqlColumns) { + // only use the major coloumn + return QString("%1 IS NULL").arg(sqlColumn); + } + return QString(); +} + CrateFilterNode::CrateFilterNode(const CrateStorage* pCrateStorage, const QString& crateNameLike) : m_pCrateStorage(pCrateStorage), @@ -193,9 +213,35 @@ QString CrateFilterNode::toSql() const { m_pCrateStorage->formatQueryForTrackIdsByCrateNameLike(m_crateNameLike)); } + +NoCrateFilterNode::NoCrateFilterNode(const CrateStorage* pCrateStorage) + : m_pCrateStorage(pCrateStorage), + m_matchInitialized(false) { +} + +bool NoCrateFilterNode::match(const TrackPointer& pTrack) const { + if (!m_matchInitialized) { + CrateTrackSelectResult crateTracks( + m_pCrateStorage->selectAllTracksSorted()); + + while (crateTracks.next()) { + m_matchingTrackIds.push_back(crateTracks.trackId()); + } + + m_matchInitialized = true; + } + + return !std::binary_search(m_matchingTrackIds.begin(), m_matchingTrackIds.end(), pTrack->getId()); +} + +QString NoCrateFilterNode::toSql() const { + return QString("id NOT IN (%1)").arg(CrateStorage::formatQueryForTrackIdsWithCrate()); +} + NumericFilterNode::NumericFilterNode(const QStringList& sqlColumns) : m_sqlColumns(sqlColumns), m_bOperatorQuery(false), + m_bNullQuery(false), m_operator("="), m_dOperatorArgument(0.0), m_bRangeQuery(false), @@ -210,6 +256,11 @@ NumericFilterNode::NumericFilterNode( } void NumericFilterNode::init(QString argument) { + if (argument == "\"\"") { + m_bNullQuery = true; + return; + } + QRegExp operatorMatcher("^(>|>=|=|<|<=)(.*)$"); if (operatorMatcher.indexIn(argument) != -1) { m_operator = operatorMatcher.cap(1); @@ -244,6 +295,9 @@ bool NumericFilterNode::match(const TrackPointer& pTrack) const { for (const auto& sqlColumn: m_sqlColumns) { QVariant value = getTrackValueForColumn(pTrack, sqlColumn); if (!value.isValid() || !qVariantCanConvert(value)) { + if (m_bNullQuery) { + return true; + } continue; } @@ -265,6 +319,14 @@ bool NumericFilterNode::match(const TrackPointer& pTrack) const { } QString NumericFilterNode::toSql() const { + if (m_bNullQuery) { + for (const auto& sqlColumn: m_sqlColumns) { + // only use the major coloumn + return QString("%1 IS NULL").arg(sqlColumn); + } + return QString(); + } + if (m_bOperatorQuery) { QStringList searchClauses; for (const auto& sqlColumn: m_sqlColumns) { diff --git a/src/library/searchquery.h b/src/library/searchquery.h index bf744ab24db7..6a15413f8f4f 100644 --- a/src/library/searchquery.h +++ b/src/library/searchquery.h @@ -91,6 +91,23 @@ class TextFilterNode : public QueryNode { QString m_argument; }; +class NullTextFilterNode : public QueryNode { + public: + NullTextFilterNode(const QSqlDatabase& database, + const QStringList& sqlColumns) + : m_database(database), + m_sqlColumns(sqlColumns) { + } + + bool match(const TrackPointer& pTrack) const override; + QString toSql() const override; + + private: + QSqlDatabase m_database; + QStringList m_sqlColumns; +}; + + class CrateFilterNode : public QueryNode { public: CrateFilterNode(const CrateStorage* pCrateStorage, @@ -106,6 +123,20 @@ class CrateFilterNode : public QueryNode { mutable std::vector m_matchingTrackIds; }; +class NoCrateFilterNode : public QueryNode { + public: + NoCrateFilterNode(const CrateStorage* pCrateStorage); + + bool match(const TrackPointer& pTrack) const override; + QString toSql() const override; + + private: + const CrateStorage* m_pCrateStorage; + QString m_crateNameLike; + mutable bool m_matchInitialized; + mutable std::vector m_matchingTrackIds; +}; + class NumericFilterNode : public QueryNode { public: NumericFilterNode(const QStringList& sqlColumns, const QString& argument); @@ -128,6 +159,7 @@ class NumericFilterNode : public QueryNode { QStringList m_sqlColumns; bool m_bOperatorQuery; + bool m_bNullQuery; QString m_operator; double m_dOperatorArgument; bool m_bRangeQuery; diff --git a/src/library/searchqueryparser.cpp b/src/library/searchqueryparser.cpp index 081e8cb1b00d..190efc9c9e0f 100644 --- a/src/library/searchqueryparser.cpp +++ b/src/library/searchqueryparser.cpp @@ -67,7 +67,7 @@ QString SearchQueryParser::getTextArgument(QString argument, QStringList* tokens) const { // If the argument is empty, assume the user placed a space after an // advanced search command. Consume another token and treat that as the - // argument. TODO(XXX) support quoted search phrases as arguments + // argument. argument = argument.trimmed(); if (argument.length() == 0) { if (tokens->length() > 0) { @@ -99,8 +99,14 @@ QString SearchQueryParser::getTextArgument(QString argument, tokens->push_front(remaining); } - // Slice off the quote and everything after. - argument = argument.left(quote_index); + if (quote_index == 0) { + // We have found an explicit empty string "" + // return it as "" to distingish it from anunfinished empty string + argument = "\"\""; + } else { + // Slice off the quote and everything after. + argument = argument.left(quote_index); + } } return argument; @@ -125,7 +131,18 @@ void SearchQueryParser::parseTokens(QStringList tokens, QString argument = getTextArgument( m_textFilterMatcher.cap(2), &tokens).trimmed(); - if (!argument.isEmpty()) { + if (argument == "\"\"") { + qDebug() << "argument explicit empty"; + if (field == "crate") { + pNode = std::make_unique( + &m_pTrackCollection->crates()); + qDebug() << pNode->toSql(); + } else { + pNode = std::make_unique( + m_pTrackCollection->database(), m_fieldToSqlColumns[field]); + qDebug() << pNode->toSql(); + } + } else if (!argument.isEmpty()) { if (field == "crate") { pNode = std::make_unique( &m_pTrackCollection->crates(), argument); @@ -153,8 +170,13 @@ void SearchQueryParser::parseTokens(QStringList tokens, mixxx::track::io::key::ChromaticKey key = KeyUtils::guessKeyFromText(argument); if (key == mixxx::track::io::key::INVALID) { - pNode = std::make_unique( - m_pTrackCollection->database(), m_fieldToSqlColumns[field], argument); + if (argument == "\"\"") { + pNode = std::make_unique( + m_pTrackCollection->database(), m_fieldToSqlColumns[field]); + } else { + pNode = std::make_unique( + m_pTrackCollection->database(), m_fieldToSqlColumns[field], argument); + } } else { pNode = std::make_unique(key, fuzzy); } From 76a1119a6e69352baeae8c48e8d57ae8f6b1b752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 4 Oct 2018 21:20:28 +0200 Subject: [PATCH 002/247] NullTextFilterNode::match matches also invalid values --- src/library/searchquery.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 74b1ae123618..de94a6ba1223 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -168,11 +168,11 @@ QString TextFilterNode::toSql() const { bool NullTextFilterNode::match(const TrackPointer& pTrack) const { for (const auto& sqlColumn: m_sqlColumns) { + // only use the major coloumn QVariant value = getTrackValueForColumn(pTrack, sqlColumn); if (!value.isValid() || !qVariantCanConvert(value)) { - continue; + return true; } - // only use the major coloumn return value.toString().isEmpty(); } return false; From b9e2be79b0e9e7572e8388d484deb34c4350d1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 4 Oct 2018 21:26:26 +0200 Subject: [PATCH 003/247] Fix typo --- src/library/searchquery.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index de94a6ba1223..28a0b3419aba 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -168,7 +168,7 @@ QString TextFilterNode::toSql() const { bool NullTextFilterNode::match(const TrackPointer& pTrack) const { for (const auto& sqlColumn: m_sqlColumns) { - // only use the major coloumn + // only use the major column QVariant value = getTrackValueForColumn(pTrack, sqlColumn); if (!value.isValid() || !qVariantCanConvert(value)) { return true; @@ -180,7 +180,7 @@ bool NullTextFilterNode::match(const TrackPointer& pTrack) const { QString NullTextFilterNode::toSql() const { for (const auto& sqlColumn: m_sqlColumns) { - // only use the major coloumn + // only use the major column return QString("%1 IS NULL").arg(sqlColumn); } return QString(); @@ -321,7 +321,7 @@ bool NumericFilterNode::match(const TrackPointer& pTrack) const { QString NumericFilterNode::toSql() const { if (m_bNullQuery) { for (const auto& sqlColumn: m_sqlColumns) { - // only use the major coloumn + // only use the major column return QString("%1 IS NULL").arg(sqlColumn); } return QString(); From f54cf981fac88058ca97acd122726dc36c65bb84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 4 Oct 2018 21:33:38 +0200 Subject: [PATCH 004/247] Use the first column esplicit --- src/library/searchquery.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 28a0b3419aba..15d748862be5 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -167,9 +167,9 @@ QString TextFilterNode::toSql() const { } bool NullTextFilterNode::match(const TrackPointer& pTrack) const { - for (const auto& sqlColumn: m_sqlColumns) { + if (!m_sqlColumns.isEmpty()) { // only use the major column - QVariant value = getTrackValueForColumn(pTrack, sqlColumn); + QVariant value = getTrackValueForColumn(pTrack, m_sqlColumns.first()); if (!value.isValid() || !qVariantCanConvert(value)) { return true; } @@ -179,9 +179,9 @@ bool NullTextFilterNode::match(const TrackPointer& pTrack) const { } QString NullTextFilterNode::toSql() const { - for (const auto& sqlColumn: m_sqlColumns) { + if (!m_sqlColumns.isEmpty()) { // only use the major column - return QString("%1 IS NULL").arg(sqlColumn); + return QString("%1 IS NULL").arg(m_sqlColumns.first()); } return QString(); } From 11ce5be00571859cfa98b04527ad4387095ac40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 4 Oct 2018 22:02:06 +0200 Subject: [PATCH 005/247] Use CATETABLE_ID --- src/library/searchquery.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 15d748862be5..d9b91d212022 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -5,8 +5,10 @@ #include "library/queryutil.h" #include "track/keyutils.h" #include "library/dao/trackschema.h" +#include "library/crate/crateschema.h" #include "util/db/sqllikewildcards.h" + QVariant getTrackValueForColumn(const TrackPointer& pTrack, const QString& column) { if (column == LIBRARYTABLE_ARTIST) { return pTrack->getArtist(); @@ -235,7 +237,9 @@ bool NoCrateFilterNode::match(const TrackPointer& pTrack) const { } QString NoCrateFilterNode::toSql() const { - return QString("id NOT IN (%1)").arg(CrateStorage::formatQueryForTrackIdsWithCrate()); + return QString("%1 NOT IN (%2)").arg( + CRATETABLE_ID, + CrateStorage::formatQueryForTrackIdsWithCrate()); } NumericFilterNode::NumericFilterNode(const QStringList& sqlColumns) From 532c9877721e43caeef541665ce96a163c3ee887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 4 Oct 2018 22:24:33 +0200 Subject: [PATCH 006/247] use a constant for "" --- src/library/searchquery.cpp | 2 +- src/library/searchquery.h | 2 ++ src/library/searchqueryparser.cpp | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index d9b91d212022..813f31c780ba 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -260,7 +260,7 @@ NumericFilterNode::NumericFilterNode( } void NumericFilterNode::init(QString argument) { - if (argument == "\"\"") { + if (argument == kExpliciteEmpty) { m_bNullQuery = true; return; } diff --git a/src/library/searchquery.h b/src/library/searchquery.h index 6a15413f8f4f..34567498b9df 100644 --- a/src/library/searchquery.h +++ b/src/library/searchquery.h @@ -16,6 +16,8 @@ #include "util/memory.h" #include "library/crate/cratestorage.h" +const QString kExpliciteEmpty = "\"\""; // "" searches for an empty string + QVariant getTrackValueForColumn(const TrackPointer& pTrack, const QString& column); class QueryNode { diff --git a/src/library/searchqueryparser.cpp b/src/library/searchqueryparser.cpp index 190efc9c9e0f..818d34c973b3 100644 --- a/src/library/searchqueryparser.cpp +++ b/src/library/searchqueryparser.cpp @@ -102,7 +102,7 @@ QString SearchQueryParser::getTextArgument(QString argument, if (quote_index == 0) { // We have found an explicit empty string "" // return it as "" to distingish it from anunfinished empty string - argument = "\"\""; + argument = kExpliciteEmpty; } else { // Slice off the quote and everything after. argument = argument.left(quote_index); @@ -131,7 +131,7 @@ void SearchQueryParser::parseTokens(QStringList tokens, QString argument = getTextArgument( m_textFilterMatcher.cap(2), &tokens).trimmed(); - if (argument == "\"\"") { + if (argument == kExpliciteEmpty) { qDebug() << "argument explicit empty"; if (field == "crate") { pNode = std::make_unique( @@ -170,7 +170,7 @@ void SearchQueryParser::parseTokens(QStringList tokens, mixxx::track::io::key::ChromaticKey key = KeyUtils::guessKeyFromText(argument); if (key == mixxx::track::io::key::INVALID) { - if (argument == "\"\"") { + if (argument == kExpliciteEmpty) { pNode = std::make_unique( m_pTrackCollection->database(), m_fieldToSqlColumns[field]); } else { From db56f9c6f4359410e35b26e01c452495c691d1d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 4 Oct 2018 23:58:40 +0200 Subject: [PATCH 007/247] Improved query for tracks without crate --- src/library/crate/cratestorage.cpp | 20 +++++++-------- src/library/crate/cratestorage.h | 39 +++++++++++++++++++++++++++++- src/library/searchquery.cpp | 8 +++--- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/library/crate/cratestorage.cpp b/src/library/crate/cratestorage.cpp index f8c87a20d083..8ca519a70bda 100644 --- a/src/library/crate/cratestorage.cpp +++ b/src/library/crate/cratestorage.cpp @@ -129,6 +129,9 @@ CrateTrackQueryFields::CrateTrackQueryFields(const FwdSqlQuery& query) m_iTrackId(query.fieldIndex(CRATETRACKSTABLE_TRACKID)) { } +TrackQueryFields::TrackQueryFields(const FwdSqlQuery& query) + : m_iTrackId(query.fieldIndex(CRATETRACKSTABLE_TRACKID)) { +} CrateSummaryQueryFields::CrateSummaryQueryFields(const FwdSqlQuery& query) : CrateQueryFields(query), @@ -544,20 +547,15 @@ CrateTrackSelectResult CrateStorage::selectTracksSortedByCrateNameLike(const QSt } } -CrateTrackSelectResult CrateStorage::selectAllTracksSorted() const { +TrackSelectResult CrateStorage::selectAllTracksSorted() const { FwdSqlQuery query(m_database, QString( - "SELECT %1,%2 FROM %3 JOIN %4 ON %5 = %6 ORDER BY %1").arg( - CRATETRACKSTABLE_TRACKID, - CRATETRACKSTABLE_CRATEID, - CRATE_TRACKS_TABLE, - CRATE_TABLE, - CRATETABLE_ID, - CRATETRACKSTABLE_CRATEID, - CRATETABLE_NAME)); + "SELECT %1 FROM %2 GROUP BY %1 ORDER BY %1").arg( + CRATETRACKSTABLE_TRACKID, // %1 + CRATE_TRACKS_TABLE)); // %2 if (query.execPrepared()) { - return CrateTrackSelectResult(std::move(query)); + return TrackSelectResult(std::move(query)); } else { - return CrateTrackSelectResult(); + return TrackSelectResult(); } } diff --git a/src/library/crate/cratestorage.h b/src/library/crate/cratestorage.h index fdf810fd4d8a..ee3d1b5171f1 100644 --- a/src/library/crate/cratestorage.h +++ b/src/library/crate/cratestorage.h @@ -150,6 +150,20 @@ class CrateTrackQueryFields { DbFieldIndex m_iTrackId; }; +class TrackQueryFields { + public: + TrackQueryFields() = default; + explicit TrackQueryFields(const FwdSqlQuery& query); + virtual ~TrackQueryFields() = default; + + TrackId trackId(const FwdSqlQuery& query) const { + return TrackId(query.fieldValue(m_iTrackId)); + } + + private: + DbFieldIndex m_iTrackId; +}; + class CrateTrackSelectResult: public FwdSqlQuerySelectResult { public: CrateTrackSelectResult(CrateTrackSelectResult&& other) @@ -176,6 +190,29 @@ class CrateTrackSelectResult: public FwdSqlQuerySelectResult { CrateTrackQueryFields m_queryFields; }; +class TrackSelectResult: public FwdSqlQuerySelectResult { +public: + TrackSelectResult(TrackSelectResult&& other) + : FwdSqlQuerySelectResult(std::move(other)), + m_queryFields(std::move(other.m_queryFields)) { + } + ~TrackSelectResult() override = default; + + TrackId trackId() const { + return m_queryFields.trackId(query()); + } + +private: + friend class CrateStorage; + TrackSelectResult() = default; + explicit TrackSelectResult(FwdSqlQuery&& query) + : FwdSqlQuerySelectResult(std::move(query)), + m_queryFields(FwdSqlQuerySelectResult::query()) { + } + + TrackQueryFields m_queryFields; +}; + class CrateStorage: public virtual /*implements*/ SqlStorage { public: CrateStorage() = default; @@ -281,7 +318,7 @@ class CrateStorage: public virtual /*implements*/ SqlStorage { const QList& trackIds) const; CrateTrackSelectResult selectTracksSortedByCrateNameLike( const QString& crateNameLike) const; - CrateTrackSelectResult selectAllTracksSorted() const; + TrackSelectResult selectAllTracksSorted() const; // Returns the set of crate ids for crates that contain any of the // provided track ids. diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 813f31c780ba..39ea1983b5f4 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -223,11 +223,11 @@ NoCrateFilterNode::NoCrateFilterNode(const CrateStorage* pCrateStorage) bool NoCrateFilterNode::match(const TrackPointer& pTrack) const { if (!m_matchInitialized) { - CrateTrackSelectResult crateTracks( - m_pCrateStorage->selectAllTracksSorted()); + TrackSelectResult tracks( + m_pCrateStorage->selectAllTracksSorted()); - while (crateTracks.next()) { - m_matchingTrackIds.push_back(crateTracks.trackId()); + while (tracks.next()) { + m_matchingTrackIds.push_back(tracks.trackId()); } m_matchInitialized = true; From b817a323bed5a1cb8f4250e665d1e8d516910aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 8 Oct 2018 13:58:19 +0200 Subject: [PATCH 008/247] Search for Null or Empty --- src/library/searchquery.cpp | 6 +++--- src/library/searchquery.h | 4 ++-- src/library/searchqueryparser.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 39ea1983b5f4..6b5c370a5859 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -168,7 +168,7 @@ QString TextFilterNode::toSql() const { return concatSqlClauses(searchClauses, "OR"); } -bool NullTextFilterNode::match(const TrackPointer& pTrack) const { +bool NullOrEmptyTextFilterNode::match(const TrackPointer& pTrack) const { if (!m_sqlColumns.isEmpty()) { // only use the major column QVariant value = getTrackValueForColumn(pTrack, m_sqlColumns.first()); @@ -180,10 +180,10 @@ bool NullTextFilterNode::match(const TrackPointer& pTrack) const { return false; } -QString NullTextFilterNode::toSql() const { +QString NullOrEmptyTextFilterNode::toSql() const { if (!m_sqlColumns.isEmpty()) { // only use the major column - return QString("%1 IS NULL").arg(m_sqlColumns.first()); + return QString("%1 IS NULL OR %1 IS ''").arg(m_sqlColumns.first()); } return QString(); } diff --git a/src/library/searchquery.h b/src/library/searchquery.h index 34567498b9df..d8ff05534d97 100644 --- a/src/library/searchquery.h +++ b/src/library/searchquery.h @@ -93,9 +93,9 @@ class TextFilterNode : public QueryNode { QString m_argument; }; -class NullTextFilterNode : public QueryNode { +class NullOrEmptyTextFilterNode : public QueryNode { public: - NullTextFilterNode(const QSqlDatabase& database, + NullOrEmptyTextFilterNode(const QSqlDatabase& database, const QStringList& sqlColumns) : m_database(database), m_sqlColumns(sqlColumns) { diff --git a/src/library/searchqueryparser.cpp b/src/library/searchqueryparser.cpp index 818d34c973b3..5579f39f8a49 100644 --- a/src/library/searchqueryparser.cpp +++ b/src/library/searchqueryparser.cpp @@ -138,7 +138,7 @@ void SearchQueryParser::parseTokens(QStringList tokens, &m_pTrackCollection->crates()); qDebug() << pNode->toSql(); } else { - pNode = std::make_unique( + pNode = std::make_unique( m_pTrackCollection->database(), m_fieldToSqlColumns[field]); qDebug() << pNode->toSql(); } @@ -171,7 +171,7 @@ void SearchQueryParser::parseTokens(QStringList tokens, KeyUtils::guessKeyFromText(argument); if (key == mixxx::track::io::key::INVALID) { if (argument == kExpliciteEmpty) { - pNode = std::make_unique( + pNode = std::make_unique( m_pTrackCollection->database(), m_fieldToSqlColumns[field]); } else { pNode = std::make_unique( From dd1f85a93cad44da268704721f9c5fd8882e011c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 8 Oct 2018 14:08:28 +0200 Subject: [PATCH 009/247] rename kExpliciteEmpty to kMissingFieldSearchTerm --- src/library/searchquery.cpp | 2 +- src/library/searchquery.h | 2 +- src/library/searchqueryparser.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 6b5c370a5859..36f713d34ec6 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -260,7 +260,7 @@ NumericFilterNode::NumericFilterNode( } void NumericFilterNode::init(QString argument) { - if (argument == kExpliciteEmpty) { + if (argument == kMissingFieldSearchTerm) { m_bNullQuery = true; return; } diff --git a/src/library/searchquery.h b/src/library/searchquery.h index d8ff05534d97..b9b579b357b0 100644 --- a/src/library/searchquery.h +++ b/src/library/searchquery.h @@ -16,7 +16,7 @@ #include "util/memory.h" #include "library/crate/cratestorage.h" -const QString kExpliciteEmpty = "\"\""; // "" searches for an empty string +const QString kMissingFieldSearchTerm = "\"\""; // "" searches for an empty string QVariant getTrackValueForColumn(const TrackPointer& pTrack, const QString& column); diff --git a/src/library/searchqueryparser.cpp b/src/library/searchqueryparser.cpp index 5579f39f8a49..e081d20aed8a 100644 --- a/src/library/searchqueryparser.cpp +++ b/src/library/searchqueryparser.cpp @@ -102,7 +102,7 @@ QString SearchQueryParser::getTextArgument(QString argument, if (quote_index == 0) { // We have found an explicit empty string "" // return it as "" to distingish it from anunfinished empty string - argument = kExpliciteEmpty; + argument = kMissingFieldSearchTerm; } else { // Slice off the quote and everything after. argument = argument.left(quote_index); @@ -131,7 +131,7 @@ void SearchQueryParser::parseTokens(QStringList tokens, QString argument = getTextArgument( m_textFilterMatcher.cap(2), &tokens).trimmed(); - if (argument == kExpliciteEmpty) { + if (argument == kMissingFieldSearchTerm) { qDebug() << "argument explicit empty"; if (field == "crate") { pNode = std::make_unique( @@ -170,7 +170,7 @@ void SearchQueryParser::parseTokens(QStringList tokens, mixxx::track::io::key::ChromaticKey key = KeyUtils::guessKeyFromText(argument); if (key == mixxx::track::io::key::INVALID) { - if (argument == kExpliciteEmpty) { + if (argument == kMissingFieldSearchTerm) { pNode = std::make_unique( m_pTrackCollection->database(), m_fieldToSqlColumns[field]); } else { From 82bc3d7711883c4c325b82f7888f4cf3fbbc999e Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Sun, 14 Oct 2018 19:29:19 -0400 Subject: [PATCH 010/247] Allow zoom levels to be fractional for smoother zooming with mouse wheel. Zoom level is still saved in cfg as an index, so the stored value is still an integer. --- src/preferences/dialog/dlgprefwaveform.cpp | 3 ++- .../renderers/waveformwidgetrenderer.cpp | 8 ++++---- src/waveform/renderers/waveformwidgetrenderer.h | 8 ++++---- src/waveform/waveformwidgetfactory.cpp | 10 +++++----- src/waveform/waveformwidgetfactory.h | 6 +++--- src/widget/wwaveformviewer.cpp | 17 ++++++----------- src/widget/wwaveformviewer.h | 2 +- 7 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/preferences/dialog/dlgprefwaveform.cpp b/src/preferences/dialog/dlgprefwaveform.cpp index c5625b7bcb70..28e62ee3c00b 100644 --- a/src/preferences/dialog/dlgprefwaveform.cpp +++ b/src/preferences/dialog/dlgprefwaveform.cpp @@ -111,7 +111,8 @@ void DlgPrefWaveform::slotUpdate() { midVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::Mid)); highVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::High)); normalizeOverviewCheckBox->setChecked(factory->isOverviewNormalized()); - defaultZoomComboBox->setCurrentIndex(factory->getDefaultZoom() - 1); + // Round zoom to int to get a default zoom index. + defaultZoomComboBox->setCurrentIndex(static_cast(factory->getDefaultZoom()) - 1); playMarkerPositionSlider->setValue(factory->getPlayMarkerPosition() * 100); beatGridAlphaSpinBox->setValue(factory->beatGridAlpha()); beatGridAlphaSlider->setValue(factory->beatGridAlpha()); diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index 9f203cd07edc..211914d13bed 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -9,9 +9,9 @@ #include "util/math.h" #include "util/performancetimer.h" -const int WaveformWidgetRenderer::s_waveformMinZoom = 1; -const int WaveformWidgetRenderer::s_waveformMaxZoom = 10; -const int WaveformWidgetRenderer::s_waveformDefaultZoom = 3; +const double WaveformWidgetRenderer::s_waveformMinZoom = 1.0; +const double WaveformWidgetRenderer::s_waveformMaxZoom = 10.0; +const double WaveformWidgetRenderer::s_waveformDefaultZoom = 3.0; const double WaveformWidgetRenderer::s_defaultPlayMarkerPosition = 0.5; WaveformWidgetRenderer::WaveformWidgetRenderer(const char* group) @@ -288,7 +288,7 @@ void WaveformWidgetRenderer::setup( } } -void WaveformWidgetRenderer::setZoom(int zoom) { +void WaveformWidgetRenderer::setZoom(double zoom) { //qDebug() << "WaveformWidgetRenderer::setZoom" << zoom; m_zoomFactor = math_clamp(zoom, s_waveformMinZoom, s_waveformMaxZoom); } diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index d8a86f0aa6b0..1632ac1be268 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -21,9 +21,9 @@ class VSyncThread; class WaveformWidgetRenderer { public: - static const int s_waveformMinZoom; - static const int s_waveformMaxZoom; - static const int s_waveformDefaultZoom; + static const double s_waveformMinZoom; + static const double s_waveformMaxZoom; + static const double s_waveformDefaultZoom; static const double s_defaultPlayMarkerPosition; public: @@ -43,7 +43,7 @@ class WaveformWidgetRenderer { double getFirstDisplayedPosition() const { return m_firstDisplayedPosition;} double getLastDisplayedPosition() const { return m_lastDisplayedPosition;} - void setZoom(int zoom); + void setZoom(double zoom); void setDisplayBeatGrid(bool set); void setDisplayBeatGridAlpha(int alpha); diff --git a/src/waveform/waveformwidgetfactory.cpp b/src/waveform/waveformwidgetfactory.cpp index 725fa0f41f06..48362a871814 100644 --- a/src/waveform/waveformwidgetfactory.cpp +++ b/src/waveform/waveformwidgetfactory.cpp @@ -215,7 +215,7 @@ bool WaveformWidgetFactory::setConfig(UserSettingsPointer config) { int vsync = m_config->getValue(ConfigKey("[Waveform]","VSync"), 0); setVSyncType(vsync); - int defaultZoom = m_config->getValueString(ConfigKey("[Waveform]","DefaultZoom")).toInt(&ok); + double defaultZoom = m_config->getValueString(ConfigKey("[Waveform]","DefaultZoom")).toDouble(&ok); if (ok) { setDefaultZoom(defaultZoom); } else{ @@ -399,7 +399,7 @@ bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) { WaveformWidgetAbstract* previousWidget = holder.m_waveformWidget; TrackPointer pTrack = previousWidget->getTrackInfo(); //previousWidget->hold(); - int previousZoom = previousWidget->getZoomFactor(); + double previousZoom = previousWidget->getZoomFactor(); double previousPlayMarkerPosition = previousWidget->getPlayMarkerPosition(); delete previousWidget; WWaveformViewer* viewer = holder.m_waveformViewer; @@ -423,7 +423,7 @@ bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) { return true; } -void WaveformWidgetFactory::setDefaultZoom(int zoom) { +void WaveformWidgetFactory::setDefaultZoom(double zoom) { m_defaultZoom = math_clamp(zoom, WaveformWidgetRenderer::s_waveformMinZoom, WaveformWidgetRenderer::s_waveformMaxZoom); if (m_config) { @@ -445,7 +445,7 @@ void WaveformWidgetFactory::setZoomSync(bool sync) { return; } - int refZoom = m_waveformWidgetHolders[0].m_waveformWidget->getZoomFactor(); + double refZoom = m_waveformWidgetHolders[0].m_waveformWidget->getZoomFactor(); for (int i = 1; i < m_waveformWidgetHolders.size(); i++) { m_waveformWidgetHolders[i].m_waveformViewer->setZoom(refZoom); } @@ -496,7 +496,7 @@ void WaveformWidgetFactory::notifyZoomChange(WWaveformViewer* viewer) { WaveformWidgetAbstract* pWaveformWidget = viewer->getWaveformWidget(); if (pWaveformWidget != NULL && isZoomSync()) { //qDebug() << "WaveformWidgetFactory::notifyZoomChange"; - int refZoom = pWaveformWidget->getZoomFactor(); + double refZoom = pWaveformWidget->getZoomFactor(); for (int i = 0; i < m_waveformWidgetHolders.size(); ++i) { WaveformWidgetHolder& holder = m_waveformWidgetHolders[i]; diff --git a/src/waveform/waveformwidgetfactory.h b/src/waveform/waveformwidgetfactory.h index c6b1d54586ec..ca8983efae3e 100644 --- a/src/waveform/waveformwidgetfactory.h +++ b/src/waveform/waveformwidgetfactory.h @@ -81,8 +81,8 @@ class WaveformWidgetFactory : public QObject, public Singletonx() > width() - m_zoomZoneWidth) { - if (event->delta() > 0) { - //qDebug() << "WaveformWidgetRenderer::wheelEvent +1"; - onZoomChange(m_waveformWidget->getZoomFactor() + 1); - } else { - //qDebug() << "WaveformWidgetRenderer::wheelEvent -1"; - onZoomChange(m_waveformWidget->getZoomFactor() - 1); - } - //} + if (event->delta() > 0) { + onZoomChange(m_waveformWidget->getZoomFactor() * 1.05); + } else { + onZoomChange(m_waveformWidget->getZoomFactor() / 1.05); + } } } @@ -198,7 +193,7 @@ void WWaveformViewer::onZoomChange(double zoom) { WaveformWidgetFactory::instance()->notifyZoomChange(this); } -void WWaveformViewer::setZoom(int zoom) { +void WWaveformViewer::setZoom(double zoom) { //qDebug() << "WaveformWidgetRenderer::setZoom" << zoom; if (m_waveformWidget) { m_waveformWidget->setZoom(zoom); diff --git a/src/widget/wwaveformviewer.h b/src/widget/wwaveformviewer.h index 65b69e1e8d89..7d090080beaa 100644 --- a/src/widget/wwaveformviewer.h +++ b/src/widget/wwaveformviewer.h @@ -55,7 +55,7 @@ private slots: return m_waveformWidget; } //direct access to let factory sync/set default zoom - void setZoom(int zoom); + void setZoom(double zoom); void setDisplayBeatGridAlpha(int alpha); void setPlayMarkerPosition(double position); From 6811cf30221ece68484f0e2755abfc7d8b39bf77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 17 Oct 2018 22:47:06 +0200 Subject: [PATCH 011/247] Fix building after merge --- src/library/searchquery.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index a81e9f6230ad..5b00049533c4 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -172,7 +172,7 @@ bool NullOrEmptyTextFilterNode::match(const TrackPointer& pTrack) const { if (!m_sqlColumns.isEmpty()) { // only use the major column QVariant value = getTrackValueForColumn(pTrack, m_sqlColumns.first()); - if (!value.isValid() || !qVariantCanConvert(value)) { + if (!value.isValid() || !value.canConvert(QMetaType::QString)) { return true; } return value.toString().isEmpty(); From 64152e4b1f9a06c6bd9a722575b8a610b9cbd710 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Tue, 16 Oct 2018 11:06:04 -0400 Subject: [PATCH 012/247] Vestax VCI400 script: add shift-pause to brake --- res/controllers/Vestax VCI-400.midi.xml | 32 +++++++++++------------ res/controllers/Vestax-VCI-400-scripts.js | 18 ++++++------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/res/controllers/Vestax VCI-400.midi.xml b/res/controllers/Vestax VCI-400.midi.xml index 3b004e45837a..a2b3201216cc 100644 --- a/res/controllers/Vestax VCI-400.midi.xml +++ b/res/controllers/Vestax VCI-400.midi.xml @@ -195,22 +195,22 @@ [Channel3] - play + VestaxVCI400.playButton MIDI Learned from 8 messages. 0x94 0x21 - + [Channel4] - play + VestaxVCI400.playButton MIDI Learned from 26 messages. 0x95 0x21 - + @@ -305,12 +305,12 @@ [Channel1] - play + VestaxVCI400.playButton MIDI Learned from 2 messages. 0x92 0x1C - + @@ -325,22 +325,22 @@ [Channel3] - play + VestaxVCI400.playButton MIDI Learned from 8 messages. 0x94 0x1D - + [Channel2] - play + VestaxVCI400.playButton MIDI Learned from 20 messages. 0x93 0x1C - + @@ -355,12 +355,12 @@ [Channel4] - play + VestaxVCI400.playButton MIDI Learned from 78 messages. 0x95 0x1D - + @@ -385,12 +385,12 @@ [Channel1] - play + VestaxVCI400.playButton MIDI Learned from 2 messages. 0x92 0x1A - + @@ -415,12 +415,12 @@ [Channel2] - play + VestaxVCI400.playButton MIDI Learned from 14 messages. 0x93 0x1A - + diff --git a/res/controllers/Vestax-VCI-400-scripts.js b/res/controllers/Vestax-VCI-400-scripts.js index 1da2432f485d..f02698c081df 100644 --- a/res/controllers/Vestax-VCI-400-scripts.js +++ b/res/controllers/Vestax-VCI-400-scripts.js @@ -678,17 +678,15 @@ VestaxVCI400.Deck.prototype.onWheelMove = function(value) { } }; -VestaxVCI400.brake = function (channel, control, value, status, group) { - try{ - if (value == 0) { - return; - } - var deck = VestaxVCI400.GetDeck(group).deckNumber; - engine.brake(deck, true, .1, .9); +VestaxVCI400.playButton = function (channel, control, value, status, group) { + var playing = engine.getValue(group, "play"); + + if (!playing && VestaxVCI400.shiftActive) { + script.brake(channel, control, value, status, group); + return; } - catch(ex) { - VestaxVCI400.printError(ex); - } + + script.toggleControl(group, "play"); }; VestaxVCI400.vinylButton = function (channel, control, value, status, group) { From 15110ea1d31ea566d40b8f6c2667a75f7e3a8c25 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Tue, 16 Oct 2018 11:12:48 -0400 Subject: [PATCH 013/247] Vestax VCI400: shift-censor to backspin stop Also stray fixes --- res/controllers/Vestax VCI-400.midi.xml | 48 ++++++++++---------- res/controllers/Vestax-VCI-400-scripts.js | 17 ++++++- res/controllers/common-controller-scripts.js | 3 +- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/res/controllers/Vestax VCI-400.midi.xml b/res/controllers/Vestax VCI-400.midi.xml index a2b3201216cc..00c9dd9fc984 100644 --- a/res/controllers/Vestax VCI-400.midi.xml +++ b/res/controllers/Vestax VCI-400.midi.xml @@ -59,22 +59,22 @@ [Channel1] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 36 messages. 0x94 0x26 - + [Channel4] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 54 messages. 0x95 0x26 - + @@ -146,12 +146,12 @@ [Channel3] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 42 messages. 0x94 0x23 - + @@ -165,32 +165,32 @@ [Channel2] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 48 messages. 0x95 0x23 - + [Channel1] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 6 messages. 0x94 0x22 - + [Channel4] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 30 messages. 0x95 0x22 - + @@ -245,12 +245,12 @@ [Channel3] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 24 messages. 0x94 0x1F - + @@ -275,22 +275,22 @@ [Channel2] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 24 messages. 0x95 0x1F - + [Channel1] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 6 messages. 0x94 0x1E - + @@ -315,12 +315,12 @@ [Channel4] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 82 messages. 0x95 0x1E - + @@ -405,12 +405,12 @@ [Channel3] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 12 messages. 0x94 0x1B - + @@ -444,12 +444,12 @@ [Channel2] - reverseroll + VestaxVCI400.censorButton MIDI Learned from 18 messages. 0x95 0x1B - + diff --git a/res/controllers/Vestax-VCI-400-scripts.js b/res/controllers/Vestax-VCI-400-scripts.js index f02698c081df..620049bfb18b 100644 --- a/res/controllers/Vestax-VCI-400-scripts.js +++ b/res/controllers/Vestax-VCI-400-scripts.js @@ -678,10 +678,11 @@ VestaxVCI400.Deck.prototype.onWheelMove = function(value) { } }; +// The play button usually does play/pause as normal, but if shift is held +// we do a braking stop. VestaxVCI400.playButton = function (channel, control, value, status, group) { var playing = engine.getValue(group, "play"); - - if (!playing && VestaxVCI400.shiftActive) { + if (playing && VestaxVCI400.shiftActive) { script.brake(channel, control, value, status, group); return; } @@ -689,6 +690,18 @@ VestaxVCI400.playButton = function (channel, control, value, status, group) { script.toggleControl(group, "play"); }; +// The censor button usually does a reverse roll, but if shift is held +// we do a backspin stop. +VestaxVCI400.censorButton = function (channel, control, value, status, group) { + var playing = engine.getValue(group, "play"); + if (playing && VestaxVCI400.shiftActive) { + script.spinback(channel, control, value, status, group); + return; + } + + script.toggleControl(group, "reverseroll"); +}; + VestaxVCI400.vinylButton = function (channel, control, value, status, group) { try{ var deck = VestaxVCI400.GetDeck(group); diff --git a/res/controllers/common-controller-scripts.js b/res/controllers/common-controller-scripts.js index f52940ef9b44..687f422b1462 100644 --- a/res/controllers/common-controller-scripts.js +++ b/res/controllers/common-controller-scripts.js @@ -326,9 +326,8 @@ script.midiPitch = function (LSB, MSB, status) { -------- ------------------------------------------------------ */ script.spinback = function(channel, control, value, status, group, factor, rate) { // if brake is called without defined factor and rate, reset to defaults - if (factor === undefined && rate === undefined) { + if (factor === undefined) { factor = 1; - rate = -10; } // if brake is called without defined rate, reset to default if (rate === undefined) { From 0d43fe9681855f5cc9449ec2e2d41dc498ae40c9 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Sat, 20 Oct 2018 14:54:01 -0400 Subject: [PATCH 014/247] Vestax VCI400: adjust rates and ignore 0 values --- res/controllers/Vestax-VCI-400-scripts.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/res/controllers/Vestax-VCI-400-scripts.js b/res/controllers/Vestax-VCI-400-scripts.js index 620049bfb18b..2a49c6fe5cbe 100644 --- a/res/controllers/Vestax-VCI-400-scripts.js +++ b/res/controllers/Vestax-VCI-400-scripts.js @@ -681,9 +681,12 @@ VestaxVCI400.Deck.prototype.onWheelMove = function(value) { // The play button usually does play/pause as normal, but if shift is held // we do a braking stop. VestaxVCI400.playButton = function (channel, control, value, status, group) { + if (value === 0) { + return; + } var playing = engine.getValue(group, "play"); if (playing && VestaxVCI400.shiftActive) { - script.brake(channel, control, value, status, group); + script.brake(channel, control, value, status, group, 100.0); return; } @@ -693,9 +696,12 @@ VestaxVCI400.playButton = function (channel, control, value, status, group) { // The censor button usually does a reverse roll, but if shift is held // we do a backspin stop. VestaxVCI400.censorButton = function (channel, control, value, status, group) { + if (value === 0) { + return; + } var playing = engine.getValue(group, "play"); if (playing && VestaxVCI400.shiftActive) { - script.spinback(channel, control, value, status, group); + script.spinback(channel, control, value, status, group, 30.0, -10.0); return; } From faf1e201f247ac0d73a153258591f3a603acf8e9 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Sat, 20 Oct 2018 18:48:53 -0400 Subject: [PATCH 015/247] Vestax VCI400: Update XML with QMap sorted version --- res/controllers/Vestax VCI-400.midi.xml | 2348 +++++++++++------------ 1 file changed, 1174 insertions(+), 1174 deletions(-) diff --git a/res/controllers/Vestax VCI-400.midi.xml b/res/controllers/Vestax VCI-400.midi.xml index 00c9dd9fc984..f5cca9bf7e30 100644 --- a/res/controllers/Vestax VCI-400.midi.xml +++ b/res/controllers/Vestax VCI-400.midi.xml @@ -8,804 +8,752 @@ - + - [Playlist] - LoadSelectedIntoFirstStopped - MIDI Learned from 4 messages. - 0x9E - 0x71 + [Master] + VestaxVCI400.shiftActivate + 0x90 + 0x01 - + [Channel1] - VestaxVCI400.wheelTouch + sync_enabled + MIDI Learned from 22 messages. 0x92 - 0x27 + 0x01 - + [Channel2] - VestaxVCI400.wheelTouch + sync_enabled + MIDI Learned from 88 messages. 0x93 - 0x27 + 0x01 - + [Channel3] - VestaxVCI400.wheelTouch + sync_enabled + MIDI Learned from 24 messages. 0x94 - 0x27 + 0x01 - + [Channel4] - VestaxVCI400.wheelTouch + sync_enabled + MIDI Learned from 90 messages. 0x95 - 0x27 + 0x01 - + - [Channel1] - VestaxVCI400.censorButton - MIDI Learned from 36 messages. - 0x94 - 0x26 + [Master] + VestaxVCI400.fx1ToggleButton1 + 0x9C + 0x01 - [Channel4] - VestaxVCI400.censorButton - MIDI Learned from 54 messages. - 0x95 - 0x26 + [Master] + VestaxVCI400.fx2ToggleButton1 + 0x9D + 0x01 - [Channel3] - vinylcontrol_enabled - MIDI Learned from 14 messages. - 0x94 - 0x25 + [Channel1] + beatsync + 0xB2 + 0x01 - [Channel3] - VestaxVCI400.deckSwitch - 0x92 - 0x23 - - - - - - [Channel4] - vinylcontrol_enabled - MIDI Learned from 16 messages. - 0x95 - 0x25 + [Channel2] + beatsync + 0xB3 + 0x01 - [Channel3] - vinylcontrol_mode - MIDI Learned from 4 messages. - 0x94 - 0x24 + [EffectRack1_EffectUnit1_Effect1] + parameter1 + MIDI Learned from 54 messages. + 0xBC + 0x01 - [Channel4] - VestaxVCI400.deckSwitch - 0x93 - 0x23 + [EffectRack1_EffectUnit2_Effect1] + parameter1 + MIDI Learned from 144 messages. + 0xBD + 0x01 - + [Channel1] - VestaxVCI400.deckSwitch + VestaxVCI400.loadTrack + MIDI Learned from 96 messages. 0x92 - 0x22 + 0x02 - [Channel4] - vinylcontrol_mode - MIDI Learned from 8 messages. - 0x95 - 0x24 + [Channel2] + VestaxVCI400.loadTrack + MIDI Learned from 98 messages. + 0x93 + 0x02 - + [Channel3] - VestaxVCI400.censorButton - MIDI Learned from 42 messages. + VestaxVCI400.loadTrack + MIDI Learned from 100 messages. 0x94 - 0x23 + 0x02 - [Channel2] - VestaxVCI400.deckSwitch - 0x93 - 0x22 + [Channel4] + VestaxVCI400.loadTrack + MIDI Learned from 102 messages. + 0x95 + 0x02 - [Channel2] - VestaxVCI400.censorButton - MIDI Learned from 48 messages. - 0x95 - 0x23 + [Master] + VestaxVCI400.fx1ToggleButton2 + 0x9C + 0x02 - [Channel1] - VestaxVCI400.censorButton - MIDI Learned from 6 messages. - 0x94 - 0x22 + [Master] + VestaxVCI400.fx2ToggleButton2 + 0x9D + 0x02 - [Channel4] - VestaxVCI400.censorButton - MIDI Learned from 30 messages. - 0x95 - 0x22 + [Channel1] + VestaxVCI400.loadTrack + 0xB2 + 0x02 - [Channel3] - VestaxVCI400.playButton - MIDI Learned from 8 messages. - 0x94 - 0x21 + [Channel2] + VestaxVCI400.loadTrack + 0xB3 + 0x02 - [Channel4] - VestaxVCI400.playButton - MIDI Learned from 26 messages. - 0x95 - 0x21 + [EffectRack1_EffectUnit1_Effect1] + parameter2 + MIDI Learned from 120 messages. + 0xBC + 0x02 - + - [Channel3] - cue_default - MIDI Learned from 25 messages. - 0x94 - 0x20 + [EffectRack1_EffectUnit2_Effect1] + parameter2 + MIDI Learned from 308 messages. + 0xBD + 0x02 - [Channel1] - vinylcontrol_enabled - MIDI Learned from 10 messages. + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + MIDI Learned from 2 messages. 0x92 - 0x1E + 0x03 - [Channel4] - cue_default - MIDI Learned from 42 messages. - 0x95 - 0x20 + [EffectRack1_EffectUnit1] + group_[Channel2]_enable + MIDI Learned from 6 messages. + 0x93 + 0x03 - [Channel3] - VestaxVCI400.censorButton - MIDI Learned from 24 messages. + [EffectRack1_EffectUnit1] + group_[Channel3]_enable + MIDI Learned from 10 messages. 0x94 - 0x1F + 0x03 - + - [Channel2] - vinylcontrol_enabled - MIDI Learned from 12 messages. - 0x93 - 0x1E + [EffectRack1_EffectUnit1] + group_[Channel4]_enable + MIDI Learned from 14 messages. + 0x95 + 0x03 - [Channel1] - vinylcontrol_mode - MIDI Learned from 2 messages. - 0x92 - 0x1D + [Master] + VestaxVCI400.fx1ToggleButton3 + 0x9C + 0x03 - + - [Channel2] - VestaxVCI400.censorButton - MIDI Learned from 24 messages. - 0x95 - 0x1F + [Master] + VestaxVCI400.fx2ToggleButton3 + 0x9D + 0x03 - [Channel1] - VestaxVCI400.censorButton - MIDI Learned from 6 messages. - 0x94 - 0x1E + [EffectRack1_EffectUnit1_Effect1] + parameter3 + MIDI Learned from 116 messages. + 0xBC + 0x03 - + - [Channel2] - vinylcontrol_mode - MIDI Learned from 6 messages. - 0x93 - 0x1D + [EffectRack1_EffectUnit2_Effect1] + parameter3 + MIDI Learned from 330 messages. + 0xBD + 0x03 - [Channel1] - VestaxVCI400.playButton - MIDI Learned from 2 messages. + [EffectRack1_EffectUnit2] + group_[Channel1]_enable + MIDI Learned from 4 messages. 0x92 - 0x1C + 0x04 - + - [Channel4] - VestaxVCI400.censorButton - MIDI Learned from 82 messages. - 0x95 - 0x1E + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + MIDI Learned from 8 messages. + 0x93 + 0x04 - + - [Channel3] - VestaxVCI400.playButton - MIDI Learned from 8 messages. + [EffectRack1_EffectUnit2] + group_[Channel3]_enable + MIDI Learned from 12 messages. 0x94 - 0x1D + 0x04 + + + + + + [EffectRack1_EffectUnit2] + group_[Channel4]_enable + MIDI Learned from 16 messages. + 0x95 + 0x04 + + + + + + [Master] + VestaxVCI400.fx1ToggleButton4 + 0x9C + 0x04 - [Channel2] - VestaxVCI400.playButton - MIDI Learned from 20 messages. - 0x93 - 0x1C + [Master] + VestaxVCI400.fx2ToggleButton4 + 0x9D + 0x04 - [Channel1] - cue_default - MIDI Learned from 4 messages. - 0x92 - 0x1B + [EffectRack1_EffectUnit2] + VestaxVCI400.fx1Knob + MIDI Learned from 144 messages. + 0xBC + 0x04 - + - [Channel4] - VestaxVCI400.playButton - MIDI Learned from 78 messages. - 0x95 - 0x1D + [EffectRack1_EffectUnit2] + VestaxVCI400.fx2Knob + MIDI Learned from 144 messages. + 0xBD + 0x04 - [Channel3] - cue_default - MIDI Learned from 2 messages. - 0x94 - 0x1C + [Channel1] + pfl + MIDI Learned from 46 messages. + 0x92 + 0x05 [Channel2] - cue_default - MIDI Learned from 22 messages. + pfl + MIDI Learned from 60 messages. 0x93 - 0x1B + 0x05 - [Channel1] - VestaxVCI400.playButton - MIDI Learned from 2 messages. - 0x92 - 0x1A + [Channel3] + pfl + MIDI Learned from 17 messages. + 0x94 + 0x05 - + [Channel4] - cue_default - MIDI Learned from 80 messages. + pfl + MIDI Learned from 70 messages. 0x95 - 0x1C + 0x05 - [Channel3] - VestaxVCI400.censorButton - MIDI Learned from 12 messages. - 0x94 - 0x1B + [Channel1] + VestaxVCI400.pitchKnob + MIDI Learned from 35 messages. + 0xB2 + 0x05 [Channel2] - VestaxVCI400.playButton - MIDI Learned from 14 messages. - 0x93 - 0x1A + VestaxVCI400.pitchKnob + 0xB3 + 0x05 - [Channel1] - cue_default - MIDI Learned from 4 messages. - 0x92 - 0x19 + [Channel3] + VestaxVCI400.pitchKnob + 0xB4 + 0x05 - + - [Channel1] - VestaxVCI400.modeSampler - 0x92 - 0x18 + [Channel4] + VestaxVCI400.pitchKnob + 0xB5 + 0x05 - [Channel2] - VestaxVCI400.censorButton - MIDI Learned from 18 messages. - 0x95 - 0x1B + [Channel1] + VestaxVCI400.vinylButton + MIDI Learned from 2 messages. + 0x92 + 0x06 [Channel2] - cue_default - MIDI Learned from 16 messages. + VestaxVCI400.vinylButton + MIDI Learned from 6 messages. 0x93 - 0x19 + 0x06 - + - [Channel2] - VestaxVCI400.modeSampler - 0x93 - 0x18 + [Channel3] + VestaxVCI400.vinylButton + MIDI Learned from 4 messages. + 0x94 + 0x06 - [Channel1] - VestaxVCI400.modeRoll - 0x92 - 0x17 + [Channel4] + VestaxVCI400.vinylButton + MIDI Learned from 2 messages. + 0x95 + 0x06 - [Channel3] - VestaxVCI400.modeSampler - 0x94 - 0x18 + [Channel1] + VestaxVCI400.loopKnob + MIDI Learned from 3 messages. + 0xB2 + 0x06 [Channel2] - VestaxVCI400.modeRoll - 0x93 - 0x17 + VestaxVCI400.loopKnob + 0xB3 + 0x06 - [Channel1] - VestaxVCI400.modeLoop - 0x92 - 0x16 + [Channel3] + VestaxVCI400.loopKnob + 0xB4 + 0x06 [Channel4] - VestaxVCI400.modeSampler - 0x95 - 0x18 + VestaxVCI400.loopKnob + 0xB5 + 0x06 - [Channel3] - VestaxVCI400.modeRoll - 0x94 - 0x17 + [Channel1] + VestaxVCI400.padbutton1Activate + MIDI Learned from 2 messages. + 0x92 + 0x07 [Channel2] - VestaxVCI400.modeLoop + VestaxVCI400.padbutton1Activate + MIDI Learned from 14 messages. 0x93 - 0x16 + 0x07 - [Channel1] - VestaxVCI400.modeHotcue - 0x92 - 0x15 + [Channel3] + VestaxVCI400.padbutton1Activate + MIDI Learned from 26 messages. + 0x94 + 0x07 [Channel4] - VestaxVCI400.modeRoll + VestaxVCI400.padbutton1Activate + MIDI Learned from 20 messages. 0x95 - 0x17 + 0x07 - [Channel3] - VestaxVCI400.modeLoop - 0x94 - 0x16 + [Channel1] + VestaxVCI400.padbutton2Activate + 0x92 + 0x08 [Channel2] - VestaxVCI400.modeHotcue + VestaxVCI400.padbutton2Activate 0x93 - 0x15 + 0x08 - [Channel1] - reloop_exit - MIDI Learned from 2 messages. - 0x92 - 0x14 + [Channel3] + VestaxVCI400.padbutton2Activate + 0x94 + 0x08 - + [Channel4] - VestaxVCI400.modeLoop + VestaxVCI400.padbutton2Activate 0x95 - 0x16 + 0x08 - [Channel3] - VestaxVCI400.modeHotcue - 0x94 - 0x15 + [EffectRack1_EffectUnit1] + group_[Master]_enable + MIDI Learned from 2 messages. + 0x9C + 0x08 - + - [Channel2] - reloop_exit - MIDI Learned from 2 messages. - 0x93 - 0x14 + [EffectRack1_EffectUnit2] + group_[Master]_enable + MIDI Learned from 4 messages. + 0x9D + 0x08 [Channel1] - rate - MIDI Learned from 560 messages. - 0xB2 - 0x32 + VestaxVCI400.padbutton3Activate + MIDI Learned from 6 messages. + 0x92 + 0x09 - - + - [Channel4] - VestaxVCI400.modeHotcue - 0x95 - 0x15 + [Channel2] + VestaxVCI400.padbutton3Activate + MIDI Learned from 18 messages. + 0x93 + 0x09 [Channel3] - reloop_exit - MIDI Learned from 2 messages. + VestaxVCI400.padbutton3Activate + MIDI Learned from 10 messages. 0x94 - 0x14 - - - - - - [Channel2] - rate - MIDI Learned from 2184 messages. - 0xB3 - 0x32 + 0x09 - - + - [Channel1] - volume - MIDI Learned from 432 messages. - 0xB2 - 0x31 + [Channel4] + VestaxVCI400.padbutton3Activate + MIDI Learned from 24 messages. + 0x95 + 0x09 - + - [Channel4] - reloop_exit + [EffectRack1_EffectUnit1] + next_chain MIDI Learned from 2 messages. - 0x95 - 0x14 + 0x9C + 0x09 - [Channel1] - pitch_adjust_set_default + [EffectRack1_EffectUnit2] + next_chain MIDI Learned from 4 messages. - 0x92 - 0x11 + 0x9D + 0x09 - [Channel3] - rate - MIDI Learned from 540 messages. - 0xB4 - 0x32 - - - - - - - [Channel2] - volume - 0xB3 - 0x31 + [Channel1] + VestaxVCI400.padbutton4Activate + MIDI Learned from 4 messages. + 0x92 + 0x0A - + [Channel2] - pitch_adjust_set_default - MIDI Learned from 4 messages. + VestaxVCI400.padbutton4Activate + MIDI Learned from 16 messages. 0x93 - 0x11 - - - - - - [Channel4] - rate - MIDI Learned from 3496 messages. - 0xB5 - 0x32 - - - - - - - [Channel3] - volume - MIDI Learned from 48 messages. - 0xB4 - 0x31 + 0x0A - + [Channel3] - pitch_adjust_set_default - MIDI Learned from 4 messages. + VestaxVCI400.padbutton4Activate + MIDI Learned from 12 messages. 0x94 - 0x11 - - - - - - [Channel4] - volume - MIDI Learned from 1056 messages. - 0xB5 - 0x31 + 0x0A - + [Channel4] - pitch_adjust_set_default - MIDI Learned from 4 messages. + VestaxVCI400.padbutton4Activate + MIDI Learned from 22 messages. 0x95 - 0x11 + 0x0A - + [Channel1] - VestaxVCI400.padbutton8Activate - MIDI Learned from 2 messages. + VestaxVCI400.padbutton5Activate + MIDI Learned from 8 messages. 0x92 - 0x0E + 0x0B [Channel2] - VestaxVCI400.padbutton8Activate - MIDI Learned from 18 messages. + VestaxVCI400.padbutton5Activate + MIDI Learned from 24 messages. 0x93 - 0x0E - - - - - - [Channel1] - VestaxVCI400.padbutton7Activate - MIDI Learned from 4 messages. - 0x92 - 0x0D + 0x0B [Channel3] - VestaxVCI400.padbutton8Activate - MIDI Learned from 10 messages. + VestaxVCI400.padbutton5Activate + MIDI Learned from 16 messages. 0x94 - 0x0E + 0x0B - [Channel2] - VestaxVCI400.padbutton7Activate - MIDI Learned from 20 messages. - 0x93 - 0x0D + [Channel4] + VestaxVCI400.padbutton5Activate + MIDI Learned from 32 messages. + 0x95 + 0x0B @@ -820,29 +768,27 @@ - [Channel4] - VestaxVCI400.padbutton8Activate - MIDI Learned from 26 messages. - 0x95 - 0x0E + [Channel2] + VestaxVCI400.padbutton6Activate + 0x93 + 0x0C [Channel3] - VestaxVCI400.padbutton7Activate - MIDI Learned from 12 messages. + VestaxVCI400.padbutton6Activate 0x94 - 0x0D + 0x0C - [Channel2] + [Channel4] VestaxVCI400.padbutton6Activate - 0x93 + 0x95 0x0C @@ -850,1141 +796,1195 @@ [Channel1] - VestaxVCI400.padbutton5Activate - MIDI Learned from 8 messages. - 0x92 - 0x0B + pregain + MIDI Learned from 770 messages. + 0xB2 + 0x0C - + - [Channel4] - VestaxVCI400.padbutton7Activate - MIDI Learned from 28 messages. - 0x95 - 0x0D + [Channel2] + pregain + MIDI Learned from 700 messages. + 0xB3 + 0x0C - + [Channel3] - VestaxVCI400.padbutton6Activate - 0x94 + pregain + MIDI Learned from 368 messages. + 0xB4 0x0C - + - [Channel2] - VestaxVCI400.padbutton5Activate - MIDI Learned from 24 messages. - 0x93 - 0x0B + [Channel4] + pregain + MIDI Learned from 680 messages. + 0xB5 + 0x0C - + [Channel1] - VestaxVCI400.padbutton4Activate + VestaxVCI400.padbutton7Activate MIDI Learned from 4 messages. 0x92 - 0x0A + 0x0D - [Channel4] - VestaxVCI400.padbutton6Activate - 0x95 - 0x0C + [Channel2] + VestaxVCI400.padbutton7Activate + MIDI Learned from 20 messages. + 0x93 + 0x0D [Channel3] - VestaxVCI400.padbutton5Activate - MIDI Learned from 16 messages. + VestaxVCI400.padbutton7Activate + MIDI Learned from 12 messages. 0x94 - 0x0B + 0x0D - [Channel2] - VestaxVCI400.padbutton4Activate - MIDI Learned from 16 messages. - 0x93 - 0x0A + [Channel4] + VestaxVCI400.padbutton7Activate + MIDI Learned from 28 messages. + 0x95 + 0x0D - [Channel1] - VestaxVCI400.padbutton3Activate - MIDI Learned from 6 messages. - 0x92 - 0x09 + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + MIDI Learned from 651 messages. + 0xB2 + 0x0D - + - [Channel4] - VestaxVCI400.padbutton5Activate - MIDI Learned from 32 messages. - 0x95 - 0x0B + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + MIDI Learned from 648 messages. + 0xB3 + 0x0D - + - [Channel3] - VestaxVCI400.padbutton4Activate - MIDI Learned from 12 messages. - 0x94 - 0x0A + [EqualizerRack1_[Channel3]_Effect1] + parameter3 + MIDI Learned from 405 messages. + 0xB4 + 0x0D - + - [Channel2] - VestaxVCI400.padbutton3Activate - MIDI Learned from 18 messages. - 0x93 - 0x09 + [EqualizerRack1_[Channel4]_Effect1] + parameter3 + MIDI Learned from 759 messages. + 0xB5 + 0x0D - + [Channel1] - VestaxVCI400.padbutton2Activate + VestaxVCI400.padbutton8Activate + MIDI Learned from 2 messages. 0x92 - 0x08 + 0x0E - [Channel4] - VestaxVCI400.padbutton4Activate - MIDI Learned from 22 messages. - 0x95 - 0x0A + [Channel2] + VestaxVCI400.padbutton8Activate + MIDI Learned from 18 messages. + 0x93 + 0x0E [Channel3] - VestaxVCI400.padbutton3Activate + VestaxVCI400.padbutton8Activate MIDI Learned from 10 messages. 0x94 - 0x09 + 0x0E - [Channel2] - VestaxVCI400.padbutton2Activate - 0x93 - 0x08 + [Channel4] + VestaxVCI400.padbutton8Activate + MIDI Learned from 26 messages. + 0x95 + 0x0E - [Channel1] - VestaxVCI400.padbutton1Activate - MIDI Learned from 2 messages. - 0x92 - 0x07 + [EqualizerRack1_[Channel1]_Effect1] + parameter2 + MIDI Learned from 560 messages. + 0xB2 + 0x0E - + - [Channel4] - VestaxVCI400.padbutton3Activate - MIDI Learned from 24 messages. - 0x95 - 0x09 + [EqualizerRack1_[Channel2]_Effect1] + parameter2 + MIDI Learned from 572 messages. + 0xB3 + 0x0E - + - [Channel3] - VestaxVCI400.padbutton2Activate - 0x94 - 0x08 + [EqualizerRack1_[Channel3]_Effect1] + parameter2 + MIDI Learned from 378 messages. + 0xB4 + 0x0E - + - [Channel2] - VestaxVCI400.padbutton1Activate - MIDI Learned from 14 messages. - 0x93 - 0x07 + [EqualizerRack1_[Channel4]_Effect1] + parameter2 + MIDI Learned from 704 messages. + 0xB5 + 0x0E - + - [Channel1] - VestaxVCI400.vinylButton - MIDI Learned from 2 messages. - 0x92 - 0x06 + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + MIDI Learned from 513 messages. + 0xB2 + 0x0F - + - [Channel4] - VestaxVCI400.padbutton2Activate - 0x95 - 0x08 + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + MIDI Learned from 550 messages. + 0xB3 + 0x0F - + - [Channel3] - VestaxVCI400.padbutton1Activate - MIDI Learned from 26 messages. - 0x94 - 0x07 + [EqualizerRack1_[Channel3]_Effect1] + parameter1 + MIDI Learned from 338 messages. + 0xB4 + 0x0F - + - [Channel2] - VestaxVCI400.vinylButton - MIDI Learned from 6 messages. - 0x93 - 0x06 + [EqualizerRack1_[Channel4]_Effect1] + parameter1 + MIDI Learned from 775 messages. + 0xB5 + 0x0F - + - [Channel1] - pfl - MIDI Learned from 46 messages. - 0x92 - 0x05 + [QuickEffectRack1_[Channel1]] + super1 + MIDI Learned from 106 messages. + 0xB2 + 0x10 - [Channel4] - VestaxVCI400.padbutton1Activate - MIDI Learned from 20 messages. - 0x95 - 0x07 + [QuickEffectRack1_[Channel2]] + super1 + MIDI Learned from 226 messages. + 0xB3 + 0x10 - + - [Channel3] - VestaxVCI400.vinylButton - MIDI Learned from 4 messages. - 0x94 - 0x06 + [QuickEffectRack1_[Channel3]] + super1 + MIDI Learned from 213 messages. + 0xB4 + 0x10 - + - [Channel2] - pfl - MIDI Learned from 60 messages. - 0x93 - 0x05 + [QuickEffectRack1_[Channel4]] + super1 + MIDI Learned from 248 messages. + 0xB5 + 0x10 - [EffectRack1_EffectUnit2] - group_[Channel1]_enable + [Channel1] + pitch_adjust_set_default MIDI Learned from 4 messages. 0x92 - 0x04 + 0x11 - [Master] - VestaxVCI400.shiftActivate - 0x90 - 0x01 - - - - - - [Channel4] - VestaxVCI400.vinylButton - MIDI Learned from 2 messages. - 0x95 - 0x06 + [Channel2] + pitch_adjust_set_default + MIDI Learned from 4 messages. + 0x93 + 0x11 - + [Channel3] - pfl - MIDI Learned from 17 messages. + pitch_adjust_set_default + MIDI Learned from 4 messages. 0x94 - 0x05 + 0x11 - [EffectRack1_EffectUnit2] - group_[Channel2]_enable - MIDI Learned from 8 messages. - 0x93 - 0x04 + [Channel4] + pitch_adjust_set_default + MIDI Learned from 4 messages. + 0x95 + 0x11 - [EffectRack1_EffectUnit1] - group_[Channel1]_enable - MIDI Learned from 2 messages. - 0x92 - 0x03 + [Channel1] + volume + MIDI Learned from 432 messages. + 0xB2 + 0x11 - + - [Channel1] - VestaxVCI400.loadTrack - MIDI Learned from 96 messages. - 0x92 - 0x02 + [Channel2] + volume + 0xB3 + 0x11 - + - [Channel4] - pfl - MIDI Learned from 70 messages. - 0x95 - 0x05 + [Channel3] + volume + MIDI Learned from 48 messages. + 0xB4 + 0x11 - + - [EffectRack1_EffectUnit2] - group_[Channel3]_enable - MIDI Learned from 12 messages. - 0x94 - 0x04 + [Channel4] + volume + MIDI Learned from 1056 messages. + 0xB5 + 0x11 - + - [EffectRack1_EffectUnit1] - group_[Channel2]_enable - MIDI Learned from 6 messages. - 0x93 - 0x03 + [Channel1] + rate + MIDI Learned from 560 messages. + 0xB2 + 0x12 - + + [Channel2] - VestaxVCI400.loadTrack - MIDI Learned from 98 messages. - 0x93 - 0x02 + rate + MIDI Learned from 2184 messages. + 0xB3 + 0x12 - + + - [Channel1] - sync_enabled - MIDI Learned from 22 messages. - 0x92 - 0x01 + [Channel3] + rate + MIDI Learned from 540 messages. + 0xB4 + 0x12 - + + - [EffectRack1_EffectUnit2] - group_[Channel4]_enable - MIDI Learned from 16 messages. - 0x95 - 0x04 + [Channel4] + rate + MIDI Learned from 3496 messages. + 0xB5 + 0x12 - + + - [EffectRack1_EffectUnit1] - group_[Channel3]_enable - MIDI Learned from 10 messages. - 0x94 - 0x03 + [Channel1] + VestaxVCI400.wheelMove + 0xB2 + 0x13 - + - [EffectRack1_EffectUnit1] - group_[Channel4]_enable - MIDI Learned from 14 messages. - 0x95 - 0x03 + [Channel2] + VestaxVCI400.wheelMove + 0xB3 + 0x13 - + [Channel3] - VestaxVCI400.loadTrack - MIDI Learned from 100 messages. - 0x94 - 0x02 + VestaxVCI400.wheelMove + 0xB4 + 0x13 - - [Channel2] - sync_enabled - MIDI Learned from 88 messages. - 0x93 - 0x01 - - - - [Channel4] - VestaxVCI400.loadTrack - MIDI Learned from 102 messages. - 0x95 - 0x02 + VestaxVCI400.wheelMove + 0xB5 + 0x13 - [Channel3] - sync_enabled - MIDI Learned from 24 messages. - 0x94 - 0x01 + [Channel1] + reloop_exit + MIDI Learned from 2 messages. + 0x92 + 0x14 - [Master] - volume - MIDI Learned from 928 messages. - 0xBE - 0x2B + [Channel2] + reloop_exit + MIDI Learned from 2 messages. + 0x93 + 0x14 - [EffectRack1_EffectUnit1] - next_chain + [Channel3] + reloop_exit MIDI Learned from 2 messages. - 0x9C - 0x09 + 0x94 + 0x14 [Channel4] - sync_enabled - MIDI Learned from 90 messages. + reloop_exit + MIDI Learned from 2 messages. 0x95 - 0x01 + 0x14 [Master] - headMix - 0xBE - 0x2A + crossfader + 0xB0 + 0x14 - [EffectRack1_EffectUnit2] - next_chain - MIDI Learned from 4 messages. - 0x9D - 0x09 - - - - - - [EffectRack1_EffectUnit1] - group_[Master]_enable - MIDI Learned from 2 messages. - 0x9C - 0x08 + [Channel1] + VestaxVCI400.beatLoop + 0xB2 + 0x14 - + - [EffectRack1_EffectUnit2] - group_[Master]_enable - MIDI Learned from 4 messages. - 0x9D - 0x08 + [Channel1] + VestaxVCI400.modeHotcue + 0x92 + 0x15 - + - [Playlist] - SelectTrackKnob - MIDI Learned from 13 messages. - 0xBE - 0x28 + [Channel2] + VestaxVCI400.modeHotcue + 0x93 + 0x15 - + - [Master] - VestaxVCI400.fx1ToggleButton4 - 0x9C - 0x04 + [Channel3] + VestaxVCI400.modeHotcue + 0x94 + 0x15 - [Master] - VestaxVCI400.fx1ToggleButton3 - 0x9C - 0x03 + [Channel4] + VestaxVCI400.modeHotcue + 0x95 + 0x15 - [Master] - VestaxVCI400.fx2ToggleButton4 - 0x9D - 0x04 + [Channel1] + VestaxVCI400.modeLoop + 0x92 + 0x16 - [Master] - VestaxVCI400.fx1ToggleButton2 - 0x9C - 0x02 + [Channel2] + VestaxVCI400.modeLoop + 0x93 + 0x16 - [Master] - VestaxVCI400.fx2ToggleButton3 - 0x9D - 0x03 + [Channel3] + VestaxVCI400.modeLoop + 0x94 + 0x16 - [Master] - VestaxVCI400.fx1ToggleButton1 - 0x9C - 0x01 + [Channel4] + VestaxVCI400.modeLoop + 0x95 + 0x16 - [Master] - VestaxVCI400.fx2ToggleButton2 - 0x9D - 0x02 + [Channel1] + VestaxVCI400.modeRoll + 0x92 + 0x17 - [Master] - VestaxVCI400.fx2ToggleButton1 - 0x9D - 0x01 + [Channel2] + VestaxVCI400.modeRoll + 0x93 + 0x17 - [Master] - crossfader - 0xB0 - 0x14 + [Channel3] + VestaxVCI400.modeRoll + 0x94 + 0x17 - + - [Channel1] - VestaxVCI400.beatLoop - 0xB2 - 0x14 + [Channel4] + VestaxVCI400.modeRoll + 0x95 + 0x17 [Channel1] - VestaxVCI400.wheelMove - 0xB2 - 0x13 + VestaxVCI400.modeSampler + 0x92 + 0x18 [Channel2] - VestaxVCI400.wheelMove - 0xB3 - 0x13 + VestaxVCI400.modeSampler + 0x93 + 0x18 - - [Channel1] - rate - MIDI Learned from 560 messages. - 0xB2 - 0x12 - - - - - [Channel3] - VestaxVCI400.wheelMove - 0xB4 - 0x13 + VestaxVCI400.modeSampler + 0x94 + 0x18 - [Channel2] - rate - MIDI Learned from 2184 messages. - 0xB3 - 0x12 + [Channel4] + VestaxVCI400.modeSampler + 0x95 + 0x18 - - + [Channel1] - volume - MIDI Learned from 432 messages. - 0xB2 - 0x11 + cue_default + MIDI Learned from 4 messages. + 0x92 + 0x19 - + - [Channel4] - VestaxVCI400.wheelMove - 0xB5 - 0x13 + [Channel2] + cue_default + MIDI Learned from 16 messages. + 0x93 + 0x19 - + - [Channel3] - rate - MIDI Learned from 540 messages. - 0xB4 - 0x12 + [Channel1] + VestaxVCI400.playButton + MIDI Learned from 2 messages. + 0x92 + 0x1A - - + [Channel2] - volume - 0xB3 - 0x11 + VestaxVCI400.playButton + MIDI Learned from 14 messages. + 0x93 + 0x1A - + - [QuickEffectRack1_[Channel1]] - super1 - MIDI Learned from 106 messages. - 0xB2 - 0x10 + [Channel1] + cue_default + MIDI Learned from 4 messages. + 0x92 + 0x1B - [Channel4] - rate - MIDI Learned from 3496 messages. - 0xB5 - 0x12 + [Channel2] + cue_default + MIDI Learned from 22 messages. + 0x93 + 0x1B - - + [Channel3] - volume - MIDI Learned from 48 messages. - 0xB4 - 0x11 + VestaxVCI400.censorButton + MIDI Learned from 12 messages. + 0x94 + 0x1B - + - [EqualizerRack1_[Channel1]_Effect1] - parameter1 - MIDI Learned from 513 messages. - 0xB2 - 0x0F + [Channel2] + VestaxVCI400.censorButton + MIDI Learned from 18 messages. + 0x95 + 0x1B - + - [QuickEffectRack1_[Channel2]] - super1 - MIDI Learned from 226 messages. - 0xB3 - 0x10 + [Channel1] + VestaxVCI400.playButton + MIDI Learned from 2 messages. + 0x92 + 0x1C - - - - - [Channel4] - volume - MIDI Learned from 1056 messages. - 0xB5 - 0x11 - - + - [EqualizerRack1_[Channel2]_Effect1] - parameter1 - MIDI Learned from 550 messages. - 0xB3 - 0x0F + [Channel2] + VestaxVCI400.playButton + MIDI Learned from 20 messages. + 0x93 + 0x1C - + - [EqualizerRack1_[Channel1]_Effect1] - parameter2 - MIDI Learned from 560 messages. - 0xB2 - 0x0E + [Channel3] + cue_default + MIDI Learned from 2 messages. + 0x94 + 0x1C - [QuickEffectRack1_[Channel3]] - super1 - MIDI Learned from 213 messages. - 0xB4 - 0x10 + [Channel4] + cue_default + MIDI Learned from 80 messages. + 0x95 + 0x1C - [EqualizerRack1_[Channel3]_Effect1] - parameter1 - MIDI Learned from 338 messages. - 0xB4 - 0x0F + [Channel1] + vinylcontrol_mode + MIDI Learned from 2 messages. + 0x92 + 0x1D - [EqualizerRack1_[Channel2]_Effect1] - parameter2 - MIDI Learned from 572 messages. - 0xB3 - 0x0E + [Channel2] + vinylcontrol_mode + MIDI Learned from 6 messages. + 0x93 + 0x1D - [EqualizerRack1_[Channel1]_Effect1] - parameter3 - MIDI Learned from 651 messages. - 0xB2 - 0x0D + [Channel3] + VestaxVCI400.playButton + MIDI Learned from 8 messages. + 0x94 + 0x1D - + - [QuickEffectRack1_[Channel4]] - super1 - MIDI Learned from 248 messages. - 0xB5 - 0x10 + [Channel4] + VestaxVCI400.playButton + MIDI Learned from 78 messages. + 0x95 + 0x1D - + - [EqualizerRack1_[Channel4]_Effect1] - parameter1 - MIDI Learned from 775 messages. - 0xB5 - 0x0F + [Channel1] + vinylcontrol_enabled + MIDI Learned from 10 messages. + 0x92 + 0x1E - [EqualizerRack1_[Channel3]_Effect1] - parameter2 - MIDI Learned from 378 messages. - 0xB4 - 0x0E + [Channel2] + vinylcontrol_enabled + MIDI Learned from 12 messages. + 0x93 + 0x1E - [EqualizerRack1_[Channel2]_Effect1] - parameter3 - MIDI Learned from 648 messages. - 0xB3 - 0x0D + [Channel1] + VestaxVCI400.censorButton + MIDI Learned from 6 messages. + 0x94 + 0x1E - + - [Channel1] - pregain - MIDI Learned from 770 messages. - 0xB2 - 0x0C + [Channel4] + VestaxVCI400.censorButton + MIDI Learned from 82 messages. + 0x95 + 0x1E - + - [EqualizerRack1_[Channel4]_Effect1] - parameter2 - MIDI Learned from 704 messages. - 0xB5 - 0x0E + [Channel3] + VestaxVCI400.censorButton + MIDI Learned from 24 messages. + 0x94 + 0x1F - + - [EqualizerRack1_[Channel3]_Effect1] - parameter3 - MIDI Learned from 405 messages. - 0xB4 - 0x0D + [Channel2] + VestaxVCI400.censorButton + MIDI Learned from 24 messages. + 0x95 + 0x1F - + - [Channel2] - pregain - MIDI Learned from 700 messages. - 0xB3 - 0x0C + [Channel3] + cue_default + MIDI Learned from 25 messages. + 0x94 + 0x20 - [EqualizerRack1_[Channel4]_Effect1] - parameter3 - MIDI Learned from 759 messages. - 0xB5 - 0x0D + [Channel4] + cue_default + MIDI Learned from 42 messages. + 0x95 + 0x20 [Channel3] - pregain - MIDI Learned from 368 messages. - 0xB4 - 0x0C + VestaxVCI400.playButton + MIDI Learned from 8 messages. + 0x94 + 0x21 - + [Channel4] - pregain - MIDI Learned from 680 messages. - 0xB5 - 0x0C + VestaxVCI400.playButton + MIDI Learned from 26 messages. + 0x95 + 0x21 - + [Channel1] - VestaxVCI400.loopKnob - MIDI Learned from 3 messages. - 0xB2 - 0x06 + VestaxVCI400.deckSwitch + 0x92 + 0x22 [Channel2] - VestaxVCI400.loopKnob - 0xB3 - 0x06 + VestaxVCI400.deckSwitch + 0x93 + 0x22 [Channel1] - VestaxVCI400.pitchKnob - MIDI Learned from 35 messages. - 0xB2 - 0x05 + VestaxVCI400.censorButton + MIDI Learned from 6 messages. + 0x94 + 0x22 - [Channel3] - VestaxVCI400.loopKnob - 0xB4 - 0x06 + [Channel4] + VestaxVCI400.censorButton + MIDI Learned from 30 messages. + 0x95 + 0x22 - [Channel2] - VestaxVCI400.pitchKnob - 0xB3 - 0x05 + [Channel3] + VestaxVCI400.deckSwitch + 0x92 + 0x23 [Channel4] - VestaxVCI400.loopKnob - 0xB5 - 0x06 + VestaxVCI400.deckSwitch + 0x93 + 0x23 [Channel3] - VestaxVCI400.pitchKnob - 0xB4 - 0x05 + VestaxVCI400.censorButton + MIDI Learned from 42 messages. + 0x94 + 0x23 - [Channel4] - VestaxVCI400.pitchKnob - 0xB5 - 0x05 + [Channel2] + VestaxVCI400.censorButton + MIDI Learned from 48 messages. + 0x95 + 0x23 - [Channel1] - VestaxVCI400.loadTrack - 0xB2 - 0x02 + [Channel3] + vinylcontrol_mode + MIDI Learned from 4 messages. + 0x94 + 0x24 + + + + + + [Channel4] + vinylcontrol_mode + MIDI Learned from 8 messages. + 0x95 + 0x24 + + + + + + [Channel3] + vinylcontrol_enabled + MIDI Learned from 14 messages. + 0x94 + 0x25 + + + + + + [Channel4] + vinylcontrol_enabled + MIDI Learned from 16 messages. + 0x95 + 0x25 + + + + + + [Channel1] + VestaxVCI400.censorButton + MIDI Learned from 36 messages. + 0x94 + 0x26 - [Channel2] - VestaxVCI400.loadTrack - 0xB3 - 0x02 + [Channel4] + VestaxVCI400.censorButton + MIDI Learned from 54 messages. + 0x95 + 0x26 [Channel1] - beatsync - 0xB2 - 0x01 + VestaxVCI400.wheelTouch + 0x92 + 0x27 - + [Channel2] - beatsync - 0xB3 - 0x01 + VestaxVCI400.wheelTouch + 0x93 + 0x27 - + - [EffectRack1_EffectUnit2] - VestaxVCI400.fx1Knob - MIDI Learned from 144 messages. - 0xBC - 0x04 + [Channel3] + VestaxVCI400.wheelTouch + 0x94 + 0x27 - [EffectRack1_EffectUnit1_Effect1] - parameter3 - MIDI Learned from 116 messages. - 0xBC - 0x03 + [Channel4] + VestaxVCI400.wheelTouch + 0x95 + 0x27 - + - [EffectRack1_EffectUnit2] - VestaxVCI400.fx2Knob - MIDI Learned from 144 messages. - 0xBD - 0x04 + [Library] + MoveVertical + MIDI Learned from 7 messages. + 0xBE + 0x28 - + - [EffectRack1_EffectUnit1_Effect1] - parameter2 - MIDI Learned from 120 messages. - 0xBC - 0x02 + [Master] + headMix + 0xBE + 0x2A - [EffectRack1_EffectUnit2_Effect1] - parameter3 - MIDI Learned from 330 messages. - 0xBD - 0x03 + [Master] + volume + MIDI Learned from 928 messages. + 0xBE + 0x2B - [EffectRack1_EffectUnit1_Effect1] - parameter1 - MIDI Learned from 54 messages. - 0xBC - 0x01 + [Channel1] + volume + MIDI Learned from 432 messages. + 0xB2 + 0x31 - + - [EffectRack1_EffectUnit2_Effect1] - parameter2 - MIDI Learned from 308 messages. - 0xBD - 0x02 + [Channel2] + volume + 0xB3 + 0x31 - + - [EffectRack1_EffectUnit2_Effect1] - parameter1 - MIDI Learned from 144 messages. - 0xBD - 0x01 + [Channel3] + volume + MIDI Learned from 48 messages. + 0xB4 + 0x31 + + + + + + [Channel4] + volume + MIDI Learned from 1056 messages. + 0xB5 + 0x31 + + + + + + [Channel1] + rate + MIDI Learned from 560 messages. + 0xB2 + 0x32 + + + + + + + [Channel2] + rate + MIDI Learned from 2184 messages. + 0xB3 + 0x32 + + + + + + + [Channel3] + rate + MIDI Learned from 540 messages. + 0xB4 + 0x32 + + + + + + + [Channel4] + rate + MIDI Learned from 3496 messages. + 0xB5 + 0x32 + + + + + + + [Library] + MoveFocus + MIDI Learned from 2 messages. + 0x9E + 0x71 @@ -1992,60 +1992,60 @@ - [Channel3] - play_indicator - 0x94 - 0x21 + [Channel1] + cue_indicator + 0x92 + 0x1B 0.5 - [Channel3] - play_indicator - 0x94 - 0x1D + [Channel1] + cue_indicator + 0x92 + 0x19 0.5 - [EffectRack1_EffectUnit2] - group_[Master]_enable - 0x9D - 0x08 - 0.5 + [Channel1] + pfl + 0x92 + 0x05 + 0.1 - [Channel2] - reverse - 0x95 - 0x23 + [Channel1] + play_indicator + 0x92 + 0x1C 0.5 - [Channel2] - reverse - 0x95 - 0x1F + [Channel1] + play_indicator + 0x92 + 0x1A 0.5 - [Channel2] + [Channel1] reverse - 0x95 - 0x1B + 0x94 + 0x26 0.5 - [EffectRack1_EffectUnit1] - next_chain - 0x9C - 0x09 + [Channel1] + reverse + 0x94 + 0x22 0.5 - [Channel2] - pfl - 0x93 - 0x05 - 0.1 + [Channel1] + reverse + 0x94 + 0x1E + 0.5 [Channel1] @@ -2054,6 +2054,13 @@ 0x01 0.5 + + [Channel1] + vinylcontrol_enabled + 0x92 + 0x1E + 0.5 + [Channel1] vinylcontrol_mode @@ -2076,68 +2083,61 @@ 0.5 - [Channel4] - vinylcontrol_enabled - 0x95 - 0x25 - 0.5 + [Channel2] + pfl + 0x93 + 0x05 + 0.1 - [EffectRack1_EffectUnit1] - group_[Channel2]_enable + [Channel2] + play_indicator 0x93 - 0x03 + 0x1C 0.5 - [Channel4] + [Channel2] play_indicator - 0x95 - 0x21 + 0x93 + 0x1A 0.5 - [Channel4] - play_indicator + [Channel2] + reverse 0x95 - 0x1D + 0x23 0.5 - [EffectRack1_EffectUnit1] - group_[Channel4]_enable + [Channel2] + reverse 0x95 - 0x03 + 0x1F 0.5 - [Channel1] + [Channel2] reverse - 0x94 - 0x26 + 0x95 + 0x1B 0.5 - [Channel1] - reverse - 0x94 - 0x22 + [Channel2] + sync_enabled + 0x93 + 0x01 0.5 - [Channel1] - reverse - 0x94 + [Channel2] + vinylcontrol_enabled + 0x93 0x1E 0.5 - - [Channel3] - pfl - 0x94 - 0x05 - 0.1 - [Channel2] vinylcontrol_mode @@ -2146,66 +2146,73 @@ 0.2 - [Channel1] + [Channel3] cue_indicator - 0x92 - 0x1B + 0x94 + 0x20 0.5 - [Channel1] + [Channel3] cue_indicator - 0x92 - 0x19 + 0x94 + 0x1C 0.5 - [EffectRack1_EffectUnit2] - group_[Channel2]_enable - 0x93 - 0x04 - 0.5 + [Channel3] + pfl + 0x94 + 0x05 + 0.1 [Channel3] - vinylcontrol_enabled + play_indicator 0x94 - 0x25 + 0x21 0.5 - [Channel1] + [Channel3] play_indicator - 0x92 - 0x1C + 0x94 + 0x1D 0.5 - [Channel1] - play_indicator - 0x92 - 0x1A + [Channel3] + reverse + 0x94 + 0x23 0.5 - [Channel4] - sync_enabled - 0x95 - 0x01 + [Channel3] + reverse + 0x94 + 0x1F 0.5 - [EffectRack1_EffectUnit1] - group_[Channel1]_enable - 0x92 - 0x03 + [Channel3] + reverse + 0x94 + 0x1B 0.5 - [EffectRack1_EffectUnit2] - group_[Channel4]_enable - 0x95 - 0x04 + [Channel3] + sync_enabled + 0x94 + 0x01 + 0.5 + + + [Channel3] + vinylcontrol_enabled + 0x94 + 0x25 0.5 @@ -2237,17 +2244,17 @@ 0.1 - [Channel2] - vinylcontrol_enabled - 0x93 - 0x1E + [Channel4] + play_indicator + 0x95 + 0x21 0.5 - [EffectRack1_EffectUnit1] - group_[Channel3]_enable - 0x94 - 0x03 + [Channel4] + play_indicator + 0x95 + 0x1D 0.5 @@ -2272,31 +2279,17 @@ 0.5 - [Channel2] - play_indicator - 0x93 - 0x1C - 0.5 - - - [Channel2] - play_indicator - 0x93 - 0x1A - 0.5 - - - [Channel3] + [Channel4] sync_enabled - 0x94 + 0x95 0x01 0.5 - [EffectRack1_EffectUnit2] - group_[Channel1]_enable - 0x92 - 0x04 + [Channel4] + vinylcontrol_enabled + 0x95 + 0x25 0.5 @@ -2307,80 +2300,87 @@ 0.2 - [Channel3] - cue_indicator - 0x94 - 0x20 + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + 0x92 + 0x03 0.5 - [Channel3] - cue_indicator + [EffectRack1_EffectUnit1] + group_[Channel2]_enable + 0x93 + 0x03 + 0.5 + + + [EffectRack1_EffectUnit1] + group_[Channel3]_enable 0x94 - 0x1C + 0x03 0.5 [EffectRack1_EffectUnit1] - group_[Master]_enable - 0x9C - 0x08 + group_[Channel4]_enable + 0x95 + 0x03 0.5 - [Channel1] - vinylcontrol_enabled - 0x92 - 0x1E + [EffectRack1_EffectUnit1] + group_[Master]_enable + 0x9C + 0x08 0.5 - [EffectRack1_EffectUnit2] + [EffectRack1_EffectUnit1] next_chain - 0x9D + 0x9C 0x09 0.5 - [Channel1] - pfl + [EffectRack1_EffectUnit2] + group_[Channel1]_enable 0x92 - 0x05 - 0.1 + 0x04 + 0.5 [EffectRack1_EffectUnit2] - group_[Channel3]_enable - 0x94 + group_[Channel2]_enable + 0x93 0x04 0.5 - [Channel3] - reverse + [EffectRack1_EffectUnit2] + group_[Channel3]_enable 0x94 - 0x23 + 0x04 0.5 - [Channel3] - reverse - 0x94 - 0x1F + [EffectRack1_EffectUnit2] + group_[Channel4]_enable + 0x95 + 0x04 0.5 - [Channel3] - reverse - 0x94 - 0x1B + [EffectRack1_EffectUnit2] + group_[Master]_enable + 0x9D + 0x08 0.5 - [Channel2] - sync_enabled - 0x93 - 0x01 + [EffectRack1_EffectUnit2] + next_chain + 0x9D + 0x09 0.5 From b7cbd018c66fa176d8cd76e34699e14e1340d22d Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Sun, 21 Oct 2018 14:17:08 -0400 Subject: [PATCH 016/247] VCI400: fix incorrect toggle on reverseroll --- res/controllers/Vestax-VCI-400-scripts.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/res/controllers/Vestax-VCI-400-scripts.js b/res/controllers/Vestax-VCI-400-scripts.js index 2a49c6fe5cbe..11776ca975ad 100644 --- a/res/controllers/Vestax-VCI-400-scripts.js +++ b/res/controllers/Vestax-VCI-400-scripts.js @@ -696,16 +696,13 @@ VestaxVCI400.playButton = function (channel, control, value, status, group) { // The censor button usually does a reverse roll, but if shift is held // we do a backspin stop. VestaxVCI400.censorButton = function (channel, control, value, status, group) { - if (value === 0) { - return; - } var playing = engine.getValue(group, "play"); - if (playing && VestaxVCI400.shiftActive) { + if (playing && VestaxVCI400.shiftActive && value !== 0) { script.spinback(channel, control, value, status, group, 30.0, -10.0); return; } - script.toggleControl(group, "reverseroll"); + engine.setValue(group, "reverseroll", value); }; VestaxVCI400.vinylButton = function (channel, control, value, status, group) { From fc22212d003a46749477af737711f3df32b7c3cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 21 Oct 2018 22:28:19 +0200 Subject: [PATCH 017/247] use SELECT DISTINCT --- src/library/crate/cratestorage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/crate/cratestorage.cpp b/src/library/crate/cratestorage.cpp index 8affdb23e07d..5b8ce8b218c6 100644 --- a/src/library/crate/cratestorage.cpp +++ b/src/library/crate/cratestorage.cpp @@ -549,7 +549,7 @@ CrateTrackSelectResult CrateStorage::selectTracksSortedByCrateNameLike(const QSt TrackSelectResult CrateStorage::selectAllTracksSorted() const { FwdSqlQuery query(m_database, QString( - "SELECT %1 FROM %2 GROUP BY %1 ORDER BY %1").arg( + "SELECT DISTINCT %1 FROM %2 ORDER BY %1").arg( CRATETRACKSTABLE_TRACKID, // %1 CRATE_TRACKS_TABLE)); // %2 if (query.execPrepared()) { From 5942d22a0215ec2fea78e86592539dcfb1dd0a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 22 Oct 2018 00:10:25 +0200 Subject: [PATCH 018/247] Added NullNumeric filter node --- src/library/searchquery.cpp | 24 ++++++++++++++++++++++++ src/library/searchquery.h | 10 ++++++++++ src/library/searchqueryparser.cpp | 9 +++++++-- src/library/searchqueryparser.h | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 5b00049533c4..d100d30e01c5 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -356,6 +356,30 @@ QString NumericFilterNode::toSql() const { return QString(); } +NullNumericFilterNode::NullNumericFilterNode(const QStringList& sqlColumns) + : m_sqlColumns(sqlColumns) { +} + +bool NullNumericFilterNode::match(const TrackPointer& pTrack) const { + if (!m_sqlColumns.isEmpty()) { + // only use the major column + QVariant value = getTrackValueForColumn(pTrack, m_sqlColumns.first()); + if (!value.isValid() || !value.canConvert(QMetaType::Double)) { + return true; + } + } + return false; +} + +QString NullNumericFilterNode::toSql() const { + if (!m_sqlColumns.isEmpty()) { + // only use the major column + return QString("%1 IS NULL").arg(m_sqlColumns.first()); + } + return QString(); +} + + DurationFilterNode::DurationFilterNode( const QStringList& sqlColumns, const QString& argument) : NumericFilterNode(sqlColumns) { diff --git a/src/library/searchquery.h b/src/library/searchquery.h index 39b126efa18e..422ebf68fad3 100644 --- a/src/library/searchquery.h +++ b/src/library/searchquery.h @@ -169,6 +169,16 @@ class NumericFilterNode : public QueryNode { double m_dRangeHigh; }; +class NullNumericFilterNode : public QueryNode { + public: + NullNumericFilterNode(const QStringList& sqlColumns); + + bool match(const TrackPointer& pTrack) const override; + QString toSql() const override; + + QStringList m_sqlColumns; +}; + class DurationFilterNode : public NumericFilterNode { public: DurationFilterNode(const QStringList& sqlColumns, const QString& argument); diff --git a/src/library/searchqueryparser.cpp b/src/library/searchqueryparser.cpp index 0f0b4ccedc5a..75cba59e72c9 100644 --- a/src/library/searchqueryparser.cpp +++ b/src/library/searchqueryparser.cpp @@ -170,8 +170,13 @@ void SearchQueryParser::parseTokens(QStringList tokens, m_numericFilterMatcher.cap(2), &tokens).trimmed(); if (!argument.isEmpty()) { - pNode = std::make_unique( - m_fieldToSqlColumns[field], argument); + if (argument == kMissingFieldSearchTerm) { + pNode = std::make_unique( + m_fieldToSqlColumns[field]); + } else { + pNode = std::make_unique( + m_fieldToSqlColumns[field], argument); + } } } else if (m_specialFilterMatcher.indexIn(token) != -1) { bool fuzzy = token.startsWith(kFuzzyPrefix); diff --git a/src/library/searchqueryparser.h b/src/library/searchqueryparser.h index 0769bd2f1fce..37a2bf58901c 100644 --- a/src/library/searchqueryparser.h +++ b/src/library/searchqueryparser.h @@ -40,6 +40,7 @@ class SearchQueryParser { QRegExp m_fuzzyMatcher; QRegExp m_textFilterMatcher; + QRegExp m_crateFilterMatcher; QRegExp m_numericFilterMatcher; QRegExp m_specialFilterMatcher; From 4821f0a187cad9e88ca6e04031bacb5afbb2defc Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 15 Nov 2018 13:36:39 +0100 Subject: [PATCH 019/247] Deere: make FX units more compact --- .../Deere/effect_single_no_parameters.xml | 10 ++- res/skins/Deere/effect_unit.xml | 4 +- res/skins/Deere/effect_unit_no_parameters.xml | 70 +++++++++++++++++-- .../Deere/effect_unit_with_parameters.xml | 62 +++++++++++++++- res/skins/Deere/style.qss | 20 ++++-- 5 files changed, 149 insertions(+), 17 deletions(-) diff --git a/res/skins/Deere/effect_single_no_parameters.xml b/res/skins/Deere/effect_single_no_parameters.xml index e0775f9e1c12..b9b1a210473d 100644 --- a/res/skins/Deere/effect_single_no_parameters.xml +++ b/res/skins/Deere/effect_single_no_parameters.xml @@ -11,7 +11,7 @@ Variables: FocusableEffect vertical - max,max + me,max @@ -35,7 +35,9 @@ Variables: - 120f,-1 + 90,20 + 120,-1 + me,min @@ -82,7 +84,9 @@ Variables: - 120f,-1 + 90,20 + 120,-1 + me,min diff --git a/res/skins/Deere/effect_unit.xml b/res/skins/Deere/effect_unit.xml index e72836b16978..c001ddf4266a 100644 --- a/res/skins/Deere/effect_unit.xml +++ b/res/skins/Deere/effect_unit.xml @@ -13,7 +13,7 @@ vertical me,me - + vertical diff --git a/res/skins/Deere/effect_unit_no_parameters.xml b/res/skins/Deere/effect_unit_no_parameters.xml index 96fc1622134c..be3f5ee32ff6 100644 --- a/res/skins/Deere/effect_unit_no_parameters.xml +++ b/res/skins/Deere/effect_unit_no_parameters.xml @@ -10,7 +10,7 @@ Variables: [EffectRack_EffectUnit] EffectUnit - vertical + horizontal me,min -1,65 @@ -23,6 +23,21 @@ Variables: min,max + + AlignTop + horizontal + min,me + + + + + + 2f,0min + EffectUnitEffectsNoParameters horizontal @@ -42,7 +57,7 @@ Variables: - - - vertical - -1,20f - + -1,20f + @@ -100,6 +113,51 @@ Variables: + + EffectUnitGroupControls + vertical + min,min + + + + + AlignCenter + horizontal + + + + 2f,0min + + + + + + + + diff --git a/res/skins/Deere/effect_unit_with_parameters.xml b/res/skins/Deere/effect_unit_with_parameters.xml index 873f48ef4125..780c03e9e58f 100644 --- a/res/skins/Deere/effect_unit_with_parameters.xml +++ b/res/skins/Deere/effect_unit_with_parameters.xml @@ -20,6 +20,19 @@ Variables: horizontal + + + AlignTop + horizontal + + + + + EffectUnitEffects me,min @@ -41,11 +54,56 @@ Variables: - EffectUnitControls + EffectUnitGroupControls vertical - min,max + min,min + + + vertical + min,min + + + + + AlignCenter + horizontal + + + + 2f,0min + + + + + + + +