From 84caae4c08edc18aec6434714e3090ae98fcc374 Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Wed, 12 Jun 2024 22:09:27 -0400 Subject: [PATCH 001/163] Add FILE line to Cuefile to include file path for each track --- src/engine/sidechain/enginerecord.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 50e739b06567..b4f90cf7aa40 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -248,6 +248,9 @@ void EngineRecord::writeCueLine() { m_cueFile.write(QString(" PERFORMER \"%1\"\n") .arg(m_pCurrentTrack->getArtist()) .toUtf8()); + m_cueFile.write(QString(" FILE \"%1\"\n") + .arg(m_pCurrentTrack->getLocation()) + .toUtf8()); // Woefully inaccurate (at the seconds level anyways). // We'd need a signal fired state tracker From c0fadc1b062131092c948047c79837a2957f9a8d Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Sun, 14 Jul 2024 19:21:45 -0400 Subject: [PATCH 002/163] Add CUE file annotation feature logic and UI Add boolean to EngineRecord and initialize it in updateFromPreferences Add checkbox to DlgPrefRecord to enable file annotation in CUE file Add logic to ensure checkbox is disabled by default, include tooltip --- src/engine/sidechain/enginerecord.cpp | 14 +++++--- src/engine/sidechain/enginerecord.h | 1 + src/preferences/dialog/dlgprefrecord.cpp | 40 +++++++++++++++++++++- src/preferences/dialog/dlgprefrecord.h | 5 +++ src/preferences/dialog/dlgprefrecorddlg.ui | 15 ++++++++ 5 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index b4f90cf7aa40..ac9937133c93 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -18,7 +18,9 @@ EngineRecord::EngineRecord(UserSettingsPointer pConfig) m_recordedDuration(0), m_iMetaDataLife(0), m_cueTrack(0), - m_bCueIsEnabled(false) { + m_bCueIsEnabled(false), + m_bCueUsesFileAnnotation(false) +{ m_pRecReady = new ControlProxy(RECORDING_PREF_KEY, "status", this); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); } @@ -36,6 +38,7 @@ int EngineRecord::updateFromPreferences() { m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); m_bCueIsEnabled = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueEnabled")).toInt(); + m_bCueUsesFileAnnotation = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled")).toInt(); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. @@ -248,9 +251,12 @@ void EngineRecord::writeCueLine() { m_cueFile.write(QString(" PERFORMER \"%1\"\n") .arg(m_pCurrentTrack->getArtist()) .toUtf8()); - m_cueFile.write(QString(" FILE \"%1\"\n") - .arg(m_pCurrentTrack->getLocation()) - .toUtf8()); + + if (m_bCueUsesFileAnnotation) { + m_cueFile.write(QString(" FILE \"%1\"\n") + .arg(m_pCurrentTrack->getLocation()) + .toUtf8()); + } // Woefully inaccurate (at the seconds level anyways). // We'd need a signal fired state tracker diff --git a/src/engine/sidechain/enginerecord.h b/src/engine/sidechain/enginerecord.h index 662a7b25d6e9..b0fd93ef8b01 100644 --- a/src/engine/sidechain/enginerecord.h +++ b/src/engine/sidechain/enginerecord.h @@ -85,4 +85,5 @@ class EngineRecord : public QObject, public EncoderCallback, public SideChainWor QString m_cueFileName; quint64 m_cueTrack; bool m_bCueIsEnabled; + bool m_bCueUsesFileAnnotation; }; diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index d4e39dfcf1a8..91a4008367b1 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -76,6 +76,9 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); + CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( + ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), false)); + // Setting split comboBoxSplitting->addItem(SPLIT_650MB); comboBoxSplitting->addItem(SPLIT_700MB); @@ -119,6 +122,11 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) &QAbstractSlider::sliderReleased, this, &DlgPrefRecord::slotSliderCompression); + + connect(CheckBoxRecordCueFile, + &QCheckBox::stateChanged, + this, + &DlgPrefRecord::slotToggleCueEnabled); } DlgPrefRecord::~DlgPrefRecord() { @@ -144,6 +152,7 @@ void DlgPrefRecord::slotApply() { saveMetaData(); saveEncoding(); saveUseCueFile(); + saveUseCueFileAnnotation(); saveSplitSize(); } @@ -175,10 +184,12 @@ void DlgPrefRecord::slotUpdate() { loadMetaData(); - // Setting miscellaneous + // Setting miscellaneous CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); + updateCueEnabled(); + QString fileSizeStr = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "FileSize")); int index = comboBoxSplitting->findText(fileSizeStr); if (index >= 0) { @@ -201,7 +212,13 @@ void DlgPrefRecord::slotResetToDefaults() { // 4GB splitting is the default comboBoxSplitting->setCurrentIndex(4); + + // Sets 'Create a CUE file' checkbox value CheckBoxRecordCueFile->setChecked(kDefaultCueEnabled); + + // Sets 'Enable File Annotation in CUE file' checkbox value + CheckBoxUseCueFileAnnotation->setChecked(false); + } void DlgPrefRecord::slotBrowseRecordingsDir() { @@ -303,6 +320,17 @@ void DlgPrefRecord::slotSliderQuality() { // Settings are only stored when doing an apply so that "cancel" can actually cancel. } +// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value +void DlgPrefRecord::updateCueEnabled() { + if (CheckBoxRecordCueFile->isChecked()) { + CheckBoxUseCueFileAnnotation->setEnabled(true); + } + else { + CheckBoxUseCueFileAnnotation->setEnabled(false); + CheckBoxUseCueFileAnnotation->setChecked(false); + } +} + void DlgPrefRecord::updateTextQuality() { EncoderRecordingSettingsPointer settings = EncoderFactory::getFactory().getEncoderRecordingSettings( @@ -429,11 +457,21 @@ void DlgPrefRecord::saveEncoding() { } } + +void DlgPrefRecord::slotToggleCueEnabled() { + updateCueEnabled(); +} + void DlgPrefRecord::saveUseCueFile() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), ConfigValue(CheckBoxRecordCueFile->isChecked())); } +void DlgPrefRecord::saveUseCueFileAnnotation() { + m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); +} + void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); diff --git a/src/preferences/dialog/dlgprefrecord.h b/src/preferences/dialog/dlgprefrecord.h index 17c47a1ea573..bb086885d8ac 100644 --- a/src/preferences/dialog/dlgprefrecord.h +++ b/src/preferences/dialog/dlgprefrecord.h @@ -32,6 +32,9 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void slotSliderCompression(); void slotGroupChanged(); + private slots: + void slotToggleCueEnabled(); + signals: void apply(const QString &); @@ -44,6 +47,8 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void saveMetaData(); void saveEncoding(); void saveUseCueFile(); + void saveUseCueFileAnnotation(); + void updateCueEnabled(); void saveSplitSize(); // Pointer to config object diff --git a/src/preferences/dialog/dlgprefrecorddlg.ui b/src/preferences/dialog/dlgprefrecorddlg.ui index 01a3808af0d9..cffe8673c217 100644 --- a/src/preferences/dialog/dlgprefrecorddlg.ui +++ b/src/preferences/dialog/dlgprefrecorddlg.ui @@ -119,6 +119,20 @@ + + + + + This will include the filepath for each track in the CUE file. +This option makes the CUE file less portable and can reveal personal +information from filepaths (i.e. username) + + + Enable File Annotation in CUE file + + + + @@ -386,6 +400,7 @@ PushButtonBrowseRecordings comboBoxSplitting CheckBoxRecordCueFile + CheckBoxUseCueFileAnnotation SliderCompression SliderQuality LineEditTitle From d6a42bb98909107a4c3d7802b7f73e98306ee0f0 Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Sun, 14 Jul 2024 21:36:06 -0400 Subject: [PATCH 003/163] Fix formatting issues as per pre-commit hook --- src/engine/sidechain/enginerecord.cpp | 3 +-- src/preferences/dialog/dlgprefrecord.cpp | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index ac9937133c93..61ee564825a4 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -19,8 +19,7 @@ EngineRecord::EngineRecord(UserSettingsPointer pConfig) m_iMetaDataLife(0), m_cueTrack(0), m_bCueIsEnabled(false), - m_bCueUsesFileAnnotation(false) -{ + m_bCueUsesFileAnnotation(false) { m_pRecReady = new ControlProxy(RECORDING_PREF_KEY, "status", this); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); } diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 91a4008367b1..2c32b6184559 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -218,7 +218,6 @@ void DlgPrefRecord::slotResetToDefaults() { // Sets 'Enable File Annotation in CUE file' checkbox value CheckBoxUseCueFileAnnotation->setChecked(false); - } void DlgPrefRecord::slotBrowseRecordingsDir() { @@ -324,8 +323,7 @@ void DlgPrefRecord::slotSliderQuality() { void DlgPrefRecord::updateCueEnabled() { if (CheckBoxRecordCueFile->isChecked()) { CheckBoxUseCueFileAnnotation->setEnabled(true); - } - else { + } else { CheckBoxUseCueFileAnnotation->setEnabled(false); CheckBoxUseCueFileAnnotation->setChecked(false); } @@ -457,7 +455,6 @@ void DlgPrefRecord::saveEncoding() { } } - void DlgPrefRecord::slotToggleCueEnabled() { updateCueEnabled(); } @@ -469,7 +466,7 @@ void DlgPrefRecord::saveUseCueFile() { void DlgPrefRecord::saveUseCueFileAnnotation() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { From 827c956b70f35dcb0e23a43599ec020eab3676d1 Mon Sep 17 00:00:00 2001 From: dbaser <63173073+presentformyfriends@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:21:17 -0400 Subject: [PATCH 004/163] Update src/preferences/dialog/dlgprefrecord.cpp Co-authored-by: Antoine Colombier <7086688+acolombier@users.noreply.github.com> --- src/preferences/dialog/dlgprefrecord.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 2c32b6184559..148ba114b08d 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -77,7 +77,7 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( - ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), false)); + ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), false)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); From 7ae6cb7bb7ad195763a557f30c4b80ac870ae207 Mon Sep 17 00:00:00 2001 From: dbaser <63173073+presentformyfriends@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:24:21 -0400 Subject: [PATCH 005/163] Update src/preferences/dialog/dlgprefrecord.cpp Co-authored-by: Antoine Colombier <7086688+acolombier@users.noreply.github.com> --- src/preferences/dialog/dlgprefrecord.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 148ba114b08d..83c5696da168 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -321,12 +321,7 @@ void DlgPrefRecord::slotSliderQuality() { // Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value void DlgPrefRecord::updateCueEnabled() { - if (CheckBoxRecordCueFile->isChecked()) { - CheckBoxUseCueFileAnnotation->setEnabled(true); - } else { - CheckBoxUseCueFileAnnotation->setEnabled(false); - CheckBoxUseCueFileAnnotation->setChecked(false); - } + CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile->isChecked()); } void DlgPrefRecord::updateTextQuality() { From 5a071634179b2039832c376ec36c8c5671b11345 Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Thu, 18 Jul 2024 20:16:58 -0400 Subject: [PATCH 006/163] Add files modified by clang-format hook --- src/engine/sidechain/enginerecord.cpp | 6 +++++- src/preferences/dialog/dlgprefrecord.cpp | 23 +++++++++-------------- src/preferences/dialog/dlgprefrecord.h | 1 - 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 61ee564825a4..9512af3c9aca 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -37,7 +37,11 @@ int EngineRecord::updateFromPreferences() { m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); m_bCueIsEnabled = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueEnabled")).toInt(); - m_bCueUsesFileAnnotation = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled")).toInt(); + m_bCueUsesFileAnnotation = + m_pConfig + ->getValueString(ConfigKey( + RECORDING_PREF_KEY, "CueFileAnnotationEnabled")) + .toInt(); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 2c32b6184559..3fa47d140ead 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -12,6 +12,7 @@ namespace { constexpr bool kDefaultCueEnabled = true; +constexpr bool kDefaultCueFileAnnotationEnabled = false; } // anonymous namespace DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) @@ -77,7 +78,7 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( - ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), false)); + ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), kDefaultCueFileAnnotationEnabled)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); @@ -188,7 +189,7 @@ void DlgPrefRecord::slotUpdate() { CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); - updateCueEnabled(); + slotToggleCueEnabled(); QString fileSizeStr = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "FileSize")); int index = comboBoxSplitting->findText(fileSizeStr); @@ -217,7 +218,7 @@ void DlgPrefRecord::slotResetToDefaults() { CheckBoxRecordCueFile->setChecked(kDefaultCueEnabled); // Sets 'Enable File Annotation in CUE file' checkbox value - CheckBoxUseCueFileAnnotation->setChecked(false); + CheckBoxUseCueFileAnnotation->setChecked(kDefaultCueFileAnnotationEnabled); } void DlgPrefRecord::slotBrowseRecordingsDir() { @@ -319,15 +320,6 @@ void DlgPrefRecord::slotSliderQuality() { // Settings are only stored when doing an apply so that "cancel" can actually cancel. } -// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value -void DlgPrefRecord::updateCueEnabled() { - if (CheckBoxRecordCueFile->isChecked()) { - CheckBoxUseCueFileAnnotation->setEnabled(true); - } else { - CheckBoxUseCueFileAnnotation->setEnabled(false); - CheckBoxUseCueFileAnnotation->setChecked(false); - } -} void DlgPrefRecord::updateTextQuality() { EncoderRecordingSettingsPointer settings = @@ -455,8 +447,10 @@ void DlgPrefRecord::saveEncoding() { } } +// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create +// a CUE file' checkbox value void DlgPrefRecord::slotToggleCueEnabled() { - updateCueEnabled(); + CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile->isChecked()); } void DlgPrefRecord::saveUseCueFile() { @@ -466,10 +460,11 @@ void DlgPrefRecord::saveUseCueFile() { void DlgPrefRecord::saveUseCueFileAnnotation() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); } + diff --git a/src/preferences/dialog/dlgprefrecord.h b/src/preferences/dialog/dlgprefrecord.h index bb086885d8ac..19d287c43c12 100644 --- a/src/preferences/dialog/dlgprefrecord.h +++ b/src/preferences/dialog/dlgprefrecord.h @@ -48,7 +48,6 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void saveEncoding(); void saveUseCueFile(); void saveUseCueFileAnnotation(); - void updateCueEnabled(); void saveSplitSize(); // Pointer to config object From b2327a0ea65697fde18ee37e668fdf903948ee5d Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Fri, 19 Jul 2024 19:18:48 -0400 Subject: [PATCH 007/163] Revert "Add files modified by clang-format hook" This reverts commit 5a071634179b2039832c376ec36c8c5671b11345. --- src/engine/sidechain/enginerecord.cpp | 6 +----- src/preferences/dialog/dlgprefrecord.cpp | 23 ++++++++++++++--------- src/preferences/dialog/dlgprefrecord.h | 1 + 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 9512af3c9aca..61ee564825a4 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -37,11 +37,7 @@ int EngineRecord::updateFromPreferences() { m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); m_bCueIsEnabled = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueEnabled")).toInt(); - m_bCueUsesFileAnnotation = - m_pConfig - ->getValueString(ConfigKey( - RECORDING_PREF_KEY, "CueFileAnnotationEnabled")) - .toInt(); + m_bCueUsesFileAnnotation = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled")).toInt(); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 3fa47d140ead..2c32b6184559 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -12,7 +12,6 @@ namespace { constexpr bool kDefaultCueEnabled = true; -constexpr bool kDefaultCueFileAnnotationEnabled = false; } // anonymous namespace DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) @@ -78,7 +77,7 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( - ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), kDefaultCueFileAnnotationEnabled)); + ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), false)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); @@ -189,7 +188,7 @@ void DlgPrefRecord::slotUpdate() { CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); - slotToggleCueEnabled(); + updateCueEnabled(); QString fileSizeStr = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "FileSize")); int index = comboBoxSplitting->findText(fileSizeStr); @@ -218,7 +217,7 @@ void DlgPrefRecord::slotResetToDefaults() { CheckBoxRecordCueFile->setChecked(kDefaultCueEnabled); // Sets 'Enable File Annotation in CUE file' checkbox value - CheckBoxUseCueFileAnnotation->setChecked(kDefaultCueFileAnnotationEnabled); + CheckBoxUseCueFileAnnotation->setChecked(false); } void DlgPrefRecord::slotBrowseRecordingsDir() { @@ -320,6 +319,15 @@ void DlgPrefRecord::slotSliderQuality() { // Settings are only stored when doing an apply so that "cancel" can actually cancel. } +// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value +void DlgPrefRecord::updateCueEnabled() { + if (CheckBoxRecordCueFile->isChecked()) { + CheckBoxUseCueFileAnnotation->setEnabled(true); + } else { + CheckBoxUseCueFileAnnotation->setEnabled(false); + CheckBoxUseCueFileAnnotation->setChecked(false); + } +} void DlgPrefRecord::updateTextQuality() { EncoderRecordingSettingsPointer settings = @@ -447,10 +455,8 @@ void DlgPrefRecord::saveEncoding() { } } -// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create -// a CUE file' checkbox value void DlgPrefRecord::slotToggleCueEnabled() { - CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile->isChecked()); + updateCueEnabled(); } void DlgPrefRecord::saveUseCueFile() { @@ -460,11 +466,10 @@ void DlgPrefRecord::saveUseCueFile() { void DlgPrefRecord::saveUseCueFileAnnotation() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); } - diff --git a/src/preferences/dialog/dlgprefrecord.h b/src/preferences/dialog/dlgprefrecord.h index 19d287c43c12..bb086885d8ac 100644 --- a/src/preferences/dialog/dlgprefrecord.h +++ b/src/preferences/dialog/dlgprefrecord.h @@ -48,6 +48,7 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void saveEncoding(); void saveUseCueFile(); void saveUseCueFileAnnotation(); + void updateCueEnabled(); void saveSplitSize(); // Pointer to config object From 77cc748df0e0abd626236433e8c3e0919a19abc5 Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Tue, 23 Jul 2024 01:46:28 -0400 Subject: [PATCH 008/163] Fix line length, naming case, redundant function Resolve line length issues to pass clang-format hook in pre-commit. Change config key to snake_case. Remove redundant 'updateCueEnabled' function, call slotToggleCueEnabled directly instead. --- src/engine/sidechain/enginerecord.cpp | 21 +++++++++++++++------ src/preferences/dialog/dlgprefrecord.cpp | 21 +++++++++++---------- src/preferences/dialog/dlgprefrecord.h | 1 - 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 61ee564825a4..7d8038012420 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -36,8 +36,16 @@ int EngineRecord::updateFromPreferences() { m_baAuthor = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Author")); m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); - m_bCueIsEnabled = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueEnabled")).toInt(); - m_bCueUsesFileAnnotation = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled")).toInt(); + m_bCueIsEnabled = + m_pConfig + ->getValueString(ConfigKey( + RECORDING_PREF_KEY, "CueEnabled")) + .toInt(); + m_bCueUsesFileAnnotation = + m_pConfig + ->getValueString(ConfigKey( + RECORDING_PREF_KEY, "cue_file_annotation_enabled")) + .toInt(); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. @@ -240,19 +248,19 @@ void EngineRecord::writeCueLine() { ((m_frames / (m_sampleRate / 75))) % 75); - m_cueFile.write(QString(" TRACK %1 AUDIO\n") + m_cueFile.write(QStringLiteral(" TRACK %1 AUDIO\n") .arg((double)m_cueTrack, 2, 'f', 0, '0') .toUtf8()); - m_cueFile.write(QString(" TITLE \"%1\"\n") + m_cueFile.write(QStringLiteral(" TITLE \"%1\"\n") .arg(m_pCurrentTrack->getTitle()) .toUtf8()); - m_cueFile.write(QString(" PERFORMER \"%1\"\n") + m_cueFile.write(QStringLiteral(" PERFORMER \"%1\"\n") .arg(m_pCurrentTrack->getArtist()) .toUtf8()); if (m_bCueUsesFileAnnotation) { - m_cueFile.write(QString(" FILE \"%1\"\n") + m_cueFile.write(QStringLiteral(" FILE \"%1\"\n") .arg(m_pCurrentTrack->getLocation()) .toUtf8()); } @@ -388,3 +396,4 @@ void EngineRecord::closeCueFile() { m_cueFile.close(); } } + diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 83c5696da168..bd2fa2908aee 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -12,6 +12,7 @@ namespace { constexpr bool kDefaultCueEnabled = true; +constexpr bool kDefaultCueFileAnnotationEnabled = false; } // anonymous namespace DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) @@ -77,7 +78,8 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( - ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), false)); + ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), + kDefaultCueFileAnnotationEnabled)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); @@ -188,7 +190,7 @@ void DlgPrefRecord::slotUpdate() { CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); - updateCueEnabled(); + slotToggleCueEnabled(); QString fileSizeStr = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "FileSize")); int index = comboBoxSplitting->findText(fileSizeStr); @@ -319,11 +321,6 @@ void DlgPrefRecord::slotSliderQuality() { // Settings are only stored when doing an apply so that "cancel" can actually cancel. } -// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value -void DlgPrefRecord::updateCueEnabled() { - CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile->isChecked()); -} - void DlgPrefRecord::updateTextQuality() { EncoderRecordingSettingsPointer settings = EncoderFactory::getFactory().getEncoderRecordingSettings( @@ -450,8 +447,11 @@ void DlgPrefRecord::saveEncoding() { } } +// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create +// a CUE file' checkbox value void DlgPrefRecord::slotToggleCueEnabled() { - updateCueEnabled(); + CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile + ->isChecked()); } void DlgPrefRecord::saveUseCueFile() { @@ -460,11 +460,12 @@ void DlgPrefRecord::saveUseCueFile() { } void DlgPrefRecord::saveUseCueFileAnnotation() { - m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); } + diff --git a/src/preferences/dialog/dlgprefrecord.h b/src/preferences/dialog/dlgprefrecord.h index bb086885d8ac..19d287c43c12 100644 --- a/src/preferences/dialog/dlgprefrecord.h +++ b/src/preferences/dialog/dlgprefrecord.h @@ -48,7 +48,6 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void saveEncoding(); void saveUseCueFile(); void saveUseCueFileAnnotation(); - void updateCueEnabled(); void saveSplitSize(); // Pointer to config object From 213bfdb0ecfa1a6580510770739c15edd2b54369 Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Tue, 23 Jul 2024 03:07:08 -0400 Subject: [PATCH 009/163] Revert "Fix line length, naming case, redundant function" This reverts commit 77cc748df0e0abd626236433e8c3e0919a19abc5. --- src/engine/sidechain/enginerecord.cpp | 21 ++++++--------------- src/preferences/dialog/dlgprefrecord.cpp | 21 ++++++++++----------- src/preferences/dialog/dlgprefrecord.h | 1 + 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 7d8038012420..61ee564825a4 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -36,16 +36,8 @@ int EngineRecord::updateFromPreferences() { m_baAuthor = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Author")); m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); - m_bCueIsEnabled = - m_pConfig - ->getValueString(ConfigKey( - RECORDING_PREF_KEY, "CueEnabled")) - .toInt(); - m_bCueUsesFileAnnotation = - m_pConfig - ->getValueString(ConfigKey( - RECORDING_PREF_KEY, "cue_file_annotation_enabled")) - .toInt(); + m_bCueIsEnabled = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueEnabled")).toInt(); + m_bCueUsesFileAnnotation = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled")).toInt(); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. @@ -248,19 +240,19 @@ void EngineRecord::writeCueLine() { ((m_frames / (m_sampleRate / 75))) % 75); - m_cueFile.write(QStringLiteral(" TRACK %1 AUDIO\n") + m_cueFile.write(QString(" TRACK %1 AUDIO\n") .arg((double)m_cueTrack, 2, 'f', 0, '0') .toUtf8()); - m_cueFile.write(QStringLiteral(" TITLE \"%1\"\n") + m_cueFile.write(QString(" TITLE \"%1\"\n") .arg(m_pCurrentTrack->getTitle()) .toUtf8()); - m_cueFile.write(QStringLiteral(" PERFORMER \"%1\"\n") + m_cueFile.write(QString(" PERFORMER \"%1\"\n") .arg(m_pCurrentTrack->getArtist()) .toUtf8()); if (m_bCueUsesFileAnnotation) { - m_cueFile.write(QStringLiteral(" FILE \"%1\"\n") + m_cueFile.write(QString(" FILE \"%1\"\n") .arg(m_pCurrentTrack->getLocation()) .toUtf8()); } @@ -396,4 +388,3 @@ void EngineRecord::closeCueFile() { m_cueFile.close(); } } - diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index bd2fa2908aee..83c5696da168 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -12,7 +12,6 @@ namespace { constexpr bool kDefaultCueEnabled = true; -constexpr bool kDefaultCueFileAnnotationEnabled = false; } // anonymous namespace DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) @@ -78,8 +77,7 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( - ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), - kDefaultCueFileAnnotationEnabled)); + ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), false)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); @@ -190,7 +188,7 @@ void DlgPrefRecord::slotUpdate() { CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); - slotToggleCueEnabled(); + updateCueEnabled(); QString fileSizeStr = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "FileSize")); int index = comboBoxSplitting->findText(fileSizeStr); @@ -321,6 +319,11 @@ void DlgPrefRecord::slotSliderQuality() { // Settings are only stored when doing an apply so that "cancel" can actually cancel. } +// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value +void DlgPrefRecord::updateCueEnabled() { + CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile->isChecked()); +} + void DlgPrefRecord::updateTextQuality() { EncoderRecordingSettingsPointer settings = EncoderFactory::getFactory().getEncoderRecordingSettings( @@ -447,11 +450,8 @@ void DlgPrefRecord::saveEncoding() { } } -// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create -// a CUE file' checkbox value void DlgPrefRecord::slotToggleCueEnabled() { - CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile - ->isChecked()); + updateCueEnabled(); } void DlgPrefRecord::saveUseCueFile() { @@ -460,12 +460,11 @@ void DlgPrefRecord::saveUseCueFile() { } void DlgPrefRecord::saveUseCueFileAnnotation() { - m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); } - diff --git a/src/preferences/dialog/dlgprefrecord.h b/src/preferences/dialog/dlgprefrecord.h index 19d287c43c12..bb086885d8ac 100644 --- a/src/preferences/dialog/dlgprefrecord.h +++ b/src/preferences/dialog/dlgprefrecord.h @@ -48,6 +48,7 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void saveEncoding(); void saveUseCueFile(); void saveUseCueFileAnnotation(); + void updateCueEnabled(); void saveSplitSize(); // Pointer to config object From 4d6590fa5288bbb72d848f94c9b1766007e890e5 Mon Sep 17 00:00:00 2001 From: presentformyfriends Date: Tue, 23 Jul 2024 03:10:42 -0400 Subject: [PATCH 010/163] Fix line length, naming case, redundant function Resolve line length issues to pass clang-format hook in pre-commit. Change config key to snake_case. Remove redundant 'updateCueEnabled' function, call slotToggleCueEnabled directly instead. --- src/engine/sidechain/enginerecord.cpp | 21 +++++++++++++++------ src/preferences/dialog/dlgprefrecord.cpp | 21 +++++++++++---------- src/preferences/dialog/dlgprefrecord.h | 1 - 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 61ee564825a4..7d8038012420 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -36,8 +36,16 @@ int EngineRecord::updateFromPreferences() { m_baAuthor = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Author")); m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); - m_bCueIsEnabled = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueEnabled")).toInt(); - m_bCueUsesFileAnnotation = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled")).toInt(); + m_bCueIsEnabled = + m_pConfig + ->getValueString(ConfigKey( + RECORDING_PREF_KEY, "CueEnabled")) + .toInt(); + m_bCueUsesFileAnnotation = + m_pConfig + ->getValueString(ConfigKey( + RECORDING_PREF_KEY, "cue_file_annotation_enabled")) + .toInt(); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. @@ -240,19 +248,19 @@ void EngineRecord::writeCueLine() { ((m_frames / (m_sampleRate / 75))) % 75); - m_cueFile.write(QString(" TRACK %1 AUDIO\n") + m_cueFile.write(QStringLiteral(" TRACK %1 AUDIO\n") .arg((double)m_cueTrack, 2, 'f', 0, '0') .toUtf8()); - m_cueFile.write(QString(" TITLE \"%1\"\n") + m_cueFile.write(QStringLiteral(" TITLE \"%1\"\n") .arg(m_pCurrentTrack->getTitle()) .toUtf8()); - m_cueFile.write(QString(" PERFORMER \"%1\"\n") + m_cueFile.write(QStringLiteral(" PERFORMER \"%1\"\n") .arg(m_pCurrentTrack->getArtist()) .toUtf8()); if (m_bCueUsesFileAnnotation) { - m_cueFile.write(QString(" FILE \"%1\"\n") + m_cueFile.write(QStringLiteral(" FILE \"%1\"\n") .arg(m_pCurrentTrack->getLocation()) .toUtf8()); } @@ -388,3 +396,4 @@ void EngineRecord::closeCueFile() { m_cueFile.close(); } } + diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 83c5696da168..bd2fa2908aee 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -12,6 +12,7 @@ namespace { constexpr bool kDefaultCueEnabled = true; +constexpr bool kDefaultCueFileAnnotationEnabled = false; } // anonymous namespace DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) @@ -77,7 +78,8 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( - ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), false)); + ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), + kDefaultCueFileAnnotationEnabled)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); @@ -188,7 +190,7 @@ void DlgPrefRecord::slotUpdate() { CheckBoxRecordCueFile->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "CueEnabled"), kDefaultCueEnabled)); - updateCueEnabled(); + slotToggleCueEnabled(); QString fileSizeStr = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "FileSize")); int index = comboBoxSplitting->findText(fileSizeStr); @@ -319,11 +321,6 @@ void DlgPrefRecord::slotSliderQuality() { // Settings are only stored when doing an apply so that "cancel" can actually cancel. } -// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create a CUE file' checkbox value -void DlgPrefRecord::updateCueEnabled() { - CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile->isChecked()); -} - void DlgPrefRecord::updateTextQuality() { EncoderRecordingSettingsPointer settings = EncoderFactory::getFactory().getEncoderRecordingSettings( @@ -450,8 +447,11 @@ void DlgPrefRecord::saveEncoding() { } } +// Set 'Enable File Annotation in CUE file' checkbox value depending on 'Create +// a CUE file' checkbox value void DlgPrefRecord::slotToggleCueEnabled() { - updateCueEnabled(); + CheckBoxUseCueFileAnnotation->setEnabled(CheckBoxRecordCueFile + ->isChecked()); } void DlgPrefRecord::saveUseCueFile() { @@ -460,11 +460,12 @@ void DlgPrefRecord::saveUseCueFile() { } void DlgPrefRecord::saveUseCueFileAnnotation() { - m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "CueFileAnnotationEnabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); } + diff --git a/src/preferences/dialog/dlgprefrecord.h b/src/preferences/dialog/dlgprefrecord.h index bb086885d8ac..19d287c43c12 100644 --- a/src/preferences/dialog/dlgprefrecord.h +++ b/src/preferences/dialog/dlgprefrecord.h @@ -48,7 +48,6 @@ class DlgPrefRecord : public DlgPreferencePage, public Ui::DlgPrefRecordDlg { void saveEncoding(); void saveUseCueFile(); void saveUseCueFileAnnotation(); - void updateCueEnabled(); void saveSplitSize(); // Pointer to config object From 37d405d41d07609ba7fbaba9d90fc480f02d8e5d Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Sat, 25 May 2024 15:11:59 +0000 Subject: [PATCH 011/163] WSearchLineEdit: Correctly detect autocomplete vs. automatic "select all" on Enter/Return When the current text selection is due to the automatic selectAll() when focusing the text field, a subsequent Key_Enter should switch to the library view. Otherwise, it is due to an autocompletion and should trigger the search first. --- src/widget/wsearchlineedit.cpp | 22 +++++++++++++--------- src/widget/wsearchlineedit.h | 1 + 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 1154fdf88e43..12deea7b9229 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -312,14 +312,11 @@ QString WSearchLineEdit::getSearchText() const { DEBUG_ASSERT(!currentText().isNull()); QString text = currentText(); QCompleter* pCompleter = completer(); - if (pCompleter && hasSelectedText()) { - if (text.startsWith(pCompleter->completionPrefix()) && - pCompleter->completionPrefix().size() == lineEdit()->cursorPosition()) { - // Search for the entered text until the user has accepted the - // completion by pressing Enter or changed/deselected the selected - // completion text with Right or Left key - return pCompleter->completionPrefix(); - } + if (pCompleter && hasCompletionAvailable()) { + // Search for the entered text until the user has accepted the + // completion by pressing Enter or changed/deselected the selected + // completion text with Right or Left key + return pCompleter->completionPrefix(); } return text; } else { @@ -402,7 +399,7 @@ void WSearchLineEdit::keyPressEvent(QKeyEvent* keyEvent) { if (slotClearSearchIfClearButtonHasFocus()) { return; } - if (hasSelectedText()) { + if (hasCompletionAvailable()) { QComboBox::keyPressEvent(keyEvent); slotTriggerSearch(); return; @@ -809,3 +806,10 @@ void WSearchLineEdit::slotSetFont(const QFont& font) { bool WSearchLineEdit::hasSelectedText() const { return lineEdit()->hasSelectedText(); } + +bool WSearchLineEdit::hasCompletionAvailable() const { + QCompleter* pCompleter = completer(); + return pCompleter && hasSelectedText() && + lineEdit()->text().startsWith(pCompleter->completionPrefix()) && + pCompleter->completionPrefix().size() == lineEdit()->cursorPosition(); +} diff --git a/src/widget/wsearchlineedit.h b/src/widget/wsearchlineedit.h index 45d2d7910ca2..61e8110a8df4 100644 --- a/src/widget/wsearchlineedit.h +++ b/src/widget/wsearchlineedit.h @@ -92,6 +92,7 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { void deleteSelectedListItem(); void triggerSearchDebounced(); bool hasSelectedText() const; + bool hasCompletionAvailable() const; inline int findCurrentTextIndex() { return findData(currentText(), Qt::DisplayRole); From e4b9309a993e5d8b962ff7acb84245a082a226b2 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Wed, 21 Aug 2024 12:38:48 +0000 Subject: [PATCH 012/163] WSearchLineEdit: Add Ctrl+Return as an alternative to Esc --- src/widget/wsearchlineedit.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 12deea7b9229..5ea0b5666dd5 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -241,7 +241,7 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { "Shows/hides the search history entries") + "\n" + tr("Delete or Backspace") + " " + tr("Delete query from history") + "\n" + - tr("Esc") + " " + tr("Exit search", "Exit search bar and leave focus")); + tr("Esc or Ctrl+Return") + " " + tr("Exit search", "Exit search bar and leave focus")); } void WSearchLineEdit::loadQueriesFromConfig() { @@ -399,6 +399,11 @@ void WSearchLineEdit::keyPressEvent(QKeyEvent* keyEvent) { if (slotClearSearchIfClearButtonHasFocus()) { return; } + if (keyEvent->modifiers() & Qt::ControlModifier) { + // Esc and Ctrl+Enter should have the same effect + emit setLibraryFocus(FocusWidget::TracksTable); + return; + } if (hasCompletionAvailable()) { QComboBox::keyPressEvent(keyEvent); slotTriggerSearch(); From cac9a01201c4751a89e28961796b796e7994e70b Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Thu, 23 May 2024 20:33:57 +0000 Subject: [PATCH 013/163] WSearchLineEdit: Update shortcut presentation in the search box tooltip ...so it uses the same format as the rest of the application. --- src/widget/wsearchlineedit.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 5ea0b5666dd5..ecfc0df530c2 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -227,21 +227,21 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Use operators like bpm:115-128, artist:BooFar, -year:1990") + "\n" + tr("For more information see User Manual > Mixxx Library") + "\n\n" + - tr("Shortcuts") + ": \n" + - tr("Ctrl+F") + " " + + tr("Shortcuts") + ":\n" + + tr("Ctrl+F") + ": " + tr("Focus", "Give search bar input focus") + "\n" + - tr("Return") + " " + + tr("Return") + ": " + tr("Trigger search before search-as-you-type timeout or" "jump to tracks view afterwards") + "\n" + - tr("Ctrl+Backspace") + " " + + tr("Ctrl+Backspace") + ": " + tr("Clear input", "Clear the search bar input field") + "\n" + - tr("Ctrl+Space") + " " + + tr("Ctrl+Space") + ": " + tr("Toggle search history", "Shows/hides the search history entries") + "\n" + - tr("Delete or Backspace") + " " + tr("Delete query from history") + "\n" + - tr("Esc or Ctrl+Return") + " " + tr("Exit search", "Exit search bar and leave focus")); + tr("Delete or Backspace") + ": " + tr("Delete query from history") + "\n" + + tr("Esc or Ctrl+Return") + ": " + tr("Exit search", "Exit search bar and leave focus")); } void WSearchLineEdit::loadQueriesFromConfig() { From 19dd37dd2c58d5a2ef52759ad6479213dbe5bb25 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Fri, 7 Jun 2024 12:03:19 +0000 Subject: [PATCH 014/163] WSearchLineEdit: Fix: Remove unsupported Ctrl+Backspace shortcut from tooltip The Ctrl+Backspace shortcut is a standard shortcut handled by QLineEdit and deletes the current word, but doesn't actually clear the search box if more than one word has been typed. This is different from the function of the clear button, which clears the whole search box. --- src/widget/wsearchlineedit.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index ecfc0df530c2..3d6352a66ff5 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -217,10 +217,7 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { setPalette(pal); m_clearButton->setToolTip(tr("Clear input") + "\n" + - tr("Clear the search bar input field") + "\n\n" + - - tr("Shortcut") + ": \n" + - tr("Ctrl+Backspace")); + tr("Clear the search bar input field")); setBaseTooltip(tr("Search", "noun") + "\n" + tr("Enter a string to search for") + "\n" + @@ -234,8 +231,6 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Trigger search before search-as-you-type timeout or" "jump to tracks view afterwards") + "\n" + - tr("Ctrl+Backspace") + ": " + - tr("Clear input", "Clear the search bar input field") + "\n" + tr("Ctrl+Space") + ": " + tr("Toggle search history", "Shows/hides the search history entries") + From b908e0f7070df01bd96267b106d6bb9845817053 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Wed, 21 Aug 2024 11:20:45 +0000 Subject: [PATCH 015/163] WSearchLineEdit: Fix: Add missing whitespace in tooltip text --- src/widget/wsearchlineedit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 3d6352a66ff5..9b2766cb861c 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -228,7 +228,7 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Ctrl+F") + ": " + tr("Focus", "Give search bar input focus") + "\n" + tr("Return") + ": " + - tr("Trigger search before search-as-you-type timeout or" + tr("Trigger search before search-as-you-type timeout or " "jump to tracks view afterwards") + "\n" + tr("Ctrl+Space") + ": " + From 1637b3512799820ff889fe313e044882a0c2115a Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Wed, 21 Aug 2024 13:13:23 +0200 Subject: [PATCH 016/163] WSearchLineEdit: Order the shortcuts list in the tooltip by importance --- src/widget/wsearchlineedit.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 9b2766cb861c..589866c82087 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -224,19 +224,22 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Use operators like bpm:115-128, artist:BooFar, -year:1990") + "\n" + tr("For more information see User Manual > Mixxx Library") + "\n\n" + - tr("Shortcuts") + ":\n" + tr("Ctrl+F") + ": " + - tr("Focus", "Give search bar input focus") + "\n" + + tr("Focus", "Give search bar input focus") + "\n\n" + + tr("Additional Shortcuts When Focused:") + "\n" + tr("Return") + ": " + tr("Trigger search before search-as-you-type timeout or " "jump to tracks view afterwards") + "\n" + + tr("Esc or Ctrl+Return") + ": " + + tr("Exit search and jump to tracks view", "Exit search bar and leave focus") + "\n" + tr("Ctrl+Space") + ": " + tr("Toggle search history", "Shows/hides the search history entries") + "\n" + - tr("Delete or Backspace") + ": " + tr("Delete query from history") + "\n" + - tr("Esc or Ctrl+Return") + ": " + tr("Exit search", "Exit search bar and leave focus")); + tr("Delete or Backspace") + + " (" + tr("in search history") + "): " + + tr("Delete query from history")); } void WSearchLineEdit::loadQueriesFromConfig() { From 7e2949c3b55815142ed9ed05bf368cd94a46d8f3 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Wed, 21 Aug 2024 15:05:23 +0200 Subject: [PATCH 017/163] WSearchLineEdit: Use consistent wording ("jump to" vs. "focus") in tooltip --- src/widget/wsearchlineedit.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 589866c82087..6297fc96dd2f 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -229,11 +229,12 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Additional Shortcuts When Focused:") + "\n" + tr("Return") + ": " + tr("Trigger search before search-as-you-type timeout or " - "jump to tracks view afterwards") + + "focus tracks view afterwards") + "\n" + tr("Esc or Ctrl+Return") + ": " + - tr("Exit search and jump to tracks view", "Exit search bar and leave focus") + "\n" + - tr("Ctrl+Space") + ": " + + tr("Immediately trigger search and focus tracks view", + "Exit search bar and leave focus") + + "\n" + tr("Ctrl+Space") + ": " + tr("Toggle search history", "Shows/hides the search history entries") + "\n" + From 329fa0cfaf3c5473c7adc33d0cd84a78d3b58f4e Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Wed, 21 Aug 2024 11:50:40 +0000 Subject: [PATCH 018/163] WSearchLineEdit: Improve description text in search box tooltip --- src/widget/wsearchlineedit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 6297fc96dd2f..37ee90407aa8 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -220,9 +220,9 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Clear the search bar input field")); setBaseTooltip(tr("Search", "noun") + "\n" + - tr("Enter a string to search for") + "\n" + - tr("Use operators like bpm:115-128, artist:BooFar, -year:1990") + - "\n" + tr("For more information see User Manual > Mixxx Library") + + tr("Enter a string to search for.") + " " + + tr("Use operators like bpm:115-128, artist:BooFar, -year:1990.") + + "\n" + tr("See User Manual > Mixxx Library for more information.") + "\n\n" + tr("Ctrl+F") + ": " + tr("Focus", "Give search bar input focus") + "\n\n" + From b848daf137e01577d686b2c59991cfdc7dcafe20 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Fri, 3 May 2024 19:35:18 +0000 Subject: [PATCH 019/163] Library: Add LibraryFeature::selectAndActivate() --- src/library/library.cpp | 2 -- src/library/libraryfeature.cpp | 11 +++++++++++ src/library/libraryfeature.h | 4 ++++ src/library/mixxxlibraryfeature.cpp | 2 +- src/library/trackset/playlistfeature.cpp | 3 +-- src/library/trackset/setlogfeature.cpp | 9 ++------- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/library/library.cpp b/src/library/library.cpp index 21f82be564ea..54c4143a11f5 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -722,8 +722,6 @@ void Library::searchTracksInCollection(const QString& query) { return; } m_pMixxxLibraryFeature->searchAndActivate(query); - emit switchToView(m_sTrackViewName); - m_pSidebarModel->activateDefaultSelection(); } #ifdef __ENGINEPRIME__ diff --git a/src/library/libraryfeature.cpp b/src/library/libraryfeature.cpp index 51ad6ae3fac6..7c88fbf93bdc 100644 --- a/src/library/libraryfeature.cpp +++ b/src/library/libraryfeature.cpp @@ -32,6 +32,17 @@ LibraryFeature::LibraryFeature( } } +void LibraryFeature::selectAndActivate(const QModelIndex& index) { + if (index.isValid()) { + emit featureSelect(this, index); + activateChild(index); + } else { + // calling featureSelect with invalid index will select the root item + emit featureSelect(this, QModelIndex()); + activate(); + } +} + QStringList LibraryFeature::getPlaylistFiles(QFileDialog::FileMode mode) const { QString lastPlaylistDirectory = m_pConfig->getValue( ConfigKey("[Library]", "LastImportExportPlaylistDirectory"), diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h index 61972192dcd0..dc4ae2fd9858 100644 --- a/src/library/libraryfeature.h +++ b/src/library/libraryfeature.h @@ -103,6 +103,10 @@ class LibraryFeature : public QObject { const UserSettingsPointer m_pConfig; public slots: + /// Pretend that the user has clicked on a tree item belonging + /// to this LibraryFeature by updating both the library view + /// and the sidebar selection. + void selectAndActivate(const QModelIndex& index = QModelIndex()); // called when you single click on the root item virtual void activate() = 0; // called when you single click on a child item, e.g., a concrete playlist or crate diff --git a/src/library/mixxxlibraryfeature.cpp b/src/library/mixxxlibraryfeature.cpp index 4ea52b1e6a1f..cee77807b7c3 100644 --- a/src/library/mixxxlibraryfeature.cpp +++ b/src/library/mixxxlibraryfeature.cpp @@ -173,7 +173,7 @@ void MixxxLibraryFeature::searchAndActivate(const QString& query) { return; } m_pLibraryTableModel->search(query); - activate(); + selectAndActivate(); } #ifdef __ENGINEPRIME__ diff --git a/src/library/trackset/playlistfeature.cpp b/src/library/trackset/playlistfeature.cpp index 1fc77890c04d..303b10f55938 100644 --- a/src/library/trackset/playlistfeature.cpp +++ b/src/library/trackset/playlistfeature.cpp @@ -307,8 +307,7 @@ void PlaylistFeature::slotPlaylistTableChanged(int playlistId) { // Else (root item was selected or for some reason no index could be created) // there's nothing to do: either no child was selected earlier, or the root // was selected and will remain selected after the child model was rebuilt. - activateChild(newIndex); - emit featureSelect(this, newIndex); + selectAndActivate(newIndex); } } diff --git a/src/library/trackset/setlogfeature.cpp b/src/library/trackset/setlogfeature.cpp index 7f7b8a01487c..d0a4cc2ae6fe 100644 --- a/src/library/trackset/setlogfeature.cpp +++ b/src/library/trackset/setlogfeature.cpp @@ -706,13 +706,8 @@ void SetlogFeature::slotPlaylistTableChanged(int playlistId) { newIndex = m_pSidebarModel->index(selectedYearIndexRow - 1, 0); } } - if (newIndex.isValid()) { - emit featureSelect(this, newIndex); - activateChild(newIndex); - } else if (rootWasSelected) { - // calling featureSelect with invalid index will select the root item - emit featureSelect(this, newIndex); - activate(); // to reload the new current playlist + if (newIndex.isValid() || rootWasSelected) { + selectAndActivate(newIndex); } } From 4d201ae7a4e353d25f2d3cebeebe95dd5f0f25b9 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Sat, 25 May 2024 15:41:24 +0200 Subject: [PATCH 020/163] Library: Add focusReason parameter to LibraryControl::setLibraryFocus --- src/library/librarycontrol.cpp | 12 +++++++----- src/library/librarycontrol.h | 5 +++-- src/widget/wlibrary.h | 3 ++- src/widget/wlibrarysidebar.h | 3 ++- src/widget/wsearchlineedit.cpp | 17 ++++++++++++++--- src/widget/wsearchlineedit.h | 5 ++++- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/library/librarycontrol.cpp b/src/library/librarycontrol.cpp index 0b69650eb51a..a57b664a31bc 100644 --- a/src/library/librarycontrol.cpp +++ b/src/library/librarycontrol.cpp @@ -908,15 +908,17 @@ FocusWidget LibraryControl::getFocusedWidget() { } } -void LibraryControl::setLibraryFocus(FocusWidget newFocusWidget) { +void LibraryControl::setLibraryFocus(FocusWidget newFocusWidget, Qt::FocusReason focusReason) { if (!QApplication::focusWindow()) { qInfo() << "No Mixxx window, popup or menu has focus." << "Don't attempt to focus a specific widget."; return; } - // ignore no-op - if (newFocusWidget == m_focusedWidget) { + // The search box wants to do special handling when the Ctrl+f is used + // while it is already focused. Non-shortcut cases should still be a + // no-op when a control is already focused. + if (newFocusWidget == m_focusedWidget && focusReason != Qt::ShortcutFocusReason) { return; } @@ -925,13 +927,13 @@ void LibraryControl::setLibraryFocus(FocusWidget newFocusWidget) { VERIFY_OR_DEBUG_ASSERT(m_pSearchbox) { return; } - m_pSearchbox->setFocus(); + m_pSearchbox->handleSetFocus(focusReason); return; case FocusWidget::Sidebar: VERIFY_OR_DEBUG_ASSERT(m_pSidebarWidget) { return; } - m_pSidebarWidget->setFocus(); + m_pSidebarWidget->setFocus(focusReason); return; case FocusWidget::TracksTable: VERIFY_OR_DEBUG_ASSERT(m_pLibraryWidget) { diff --git a/src/library/librarycontrol.h b/src/library/librarycontrol.h index 65e21013ea45..35c9e36d40e6 100644 --- a/src/library/librarycontrol.h +++ b/src/library/librarycontrol.h @@ -44,8 +44,9 @@ class LibraryControl : public QObject { void bindLibraryWidget(WLibrary* pLibrary, KeyboardEventFilter* pKeyboard); void bindSidebarWidget(WLibrarySidebar* pLibrarySidebar); void bindSearchboxWidget(WSearchLineEdit* pSearchbox); - // Give the keyboard focus to one of the library widgets - void setLibraryFocus(FocusWidget newFocusWidget); + /// Give the keyboard focus to one of the library widgets + void setLibraryFocus(FocusWidget newFocusWidget, + Qt::FocusReason focusReason = Qt::OtherFocusReason); FocusWidget getFocusedWidget(); signals: diff --git a/src/widget/wlibrary.h b/src/widget/wlibrary.h index a017e9d823dd..c2ac12a3bcff 100644 --- a/src/widget/wlibrary.h +++ b/src/widget/wlibrary.h @@ -56,7 +56,8 @@ class WLibrary : public QStackedWidget, public WBaseWidget { } signals: - FocusWidget setLibraryFocus(FocusWidget newFocus); + FocusWidget setLibraryFocus(FocusWidget newFocus, + Qt::FocusReason focusReason = Qt::OtherFocusReason); public slots: // Show the view registered with the given name. Does nothing if the current diff --git a/src/widget/wlibrarysidebar.h b/src/widget/wlibrarysidebar.h index 4fa356e78b46..91d33befd709 100644 --- a/src/widget/wlibrarysidebar.h +++ b/src/widget/wlibrarysidebar.h @@ -37,7 +37,8 @@ class WLibrarySidebar : public QTreeView, public WBaseWidget { void rightClicked(const QPoint&, const QModelIndex&); void renameItem(const QModelIndex&); void deleteItem(const QModelIndex&); - FocusWidget setLibraryFocus(FocusWidget newFocus); + FocusWidget setLibraryFocus(FocusWidget newFocus, + Qt::FocusReason focusReason = Qt::OtherFocusReason); protected: bool event(QEvent* pEvent) override; diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 37ee90407aa8..03aaa252cd2d 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -791,10 +791,21 @@ void WSearchLineEdit::slotTextChanged(const QString& text) { } void WSearchLineEdit::slotSetShortcutFocus() { - if (hasFocus()) { + handleSetFocus(Qt::ShortcutFocusReason); +} + +void WSearchLineEdit::handleSetFocus(Qt::FocusReason focusReason) { + if (!hasFocus()) { + // selectAll will be called by setFocus - but only if hasFocus + // was false previously and focusReason is Tab, Backtab or Shortcut + setFocus(focusReason); + } else if (focusReason == Qt::TabFocusReason || + focusReason == Qt::BacktabFocusReason || + focusReason == Qt::ShortcutFocusReason) { + // If this widget already had focus (which can happen when the user + // presses the shortcut key while already in the searchbox), + // we need to manually simulate this behavior instead. lineEdit()->selectAll(); - } else { - setFocus(Qt::ShortcutFocusReason); } } diff --git a/src/widget/wsearchlineedit.h b/src/widget/wsearchlineedit.h index 61e8110a8df4..e621f6637d82 100644 --- a/src/widget/wsearchlineedit.h +++ b/src/widget/wsearchlineedit.h @@ -37,6 +37,8 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { void setup(const QDomNode& node, const SkinContext& context); + void handleSetFocus(Qt::FocusReason focusReason); + protected: void resizeEvent(QResizeEvent*) override; void focusInEvent(QFocusEvent*) override; @@ -47,7 +49,8 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { signals: void search(const QString& text); - FocusWidget setLibraryFocus(FocusWidget newFocusWidget); + FocusWidget setLibraryFocus(FocusWidget newFocusWidget, + Qt::FocusReason focusReason = Qt::OtherFocusReason); public slots: void slotSetFont(const QFont& font); From efaa911251a949210bf2863273b752c583397aaa Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Wed, 21 Aug 2024 13:03:31 +0200 Subject: [PATCH 021/163] Library: Fix: setLibraryFocus should work even if the window is not currently focused This scenario occurs e.g. when calling setLibraryFocus from a menu action. The popup window has already been closed when QAction::triggered occurs, but the main window has not yet gotten its focus back. As per the documentation of QWidget::setFocus(), when the containing window is not active, the focus change request is delayed until the window becomes active - which is exactly what we want in our case. --- src/library/librarycontrol.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/library/librarycontrol.cpp b/src/library/librarycontrol.cpp index a57b664a31bc..af05f574bcf6 100644 --- a/src/library/librarycontrol.cpp +++ b/src/library/librarycontrol.cpp @@ -909,12 +909,6 @@ FocusWidget LibraryControl::getFocusedWidget() { } void LibraryControl::setLibraryFocus(FocusWidget newFocusWidget, Qt::FocusReason focusReason) { - if (!QApplication::focusWindow()) { - qInfo() << "No Mixxx window, popup or menu has focus." - << "Don't attempt to focus a specific widget."; - return; - } - // The search box wants to do special handling when the Ctrl+f is used // while it is already focused. Non-shortcut cases should still be a // no-op when a control is already focused. From f20fcb86b2b08285f42f594f0e38bc8073693c75 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Mon, 20 May 2024 13:02:47 +0000 Subject: [PATCH 022/163] Library: Add Ctrl+Shift+F shortcut to search the internal database --- src/library/library.cpp | 16 ++++++++++++++++ src/library/library.h | 6 ++++++ src/mixxxmainwindow.cpp | 10 ++++++++++ src/widget/wmainmenubar.cpp | 24 ++++++++++++++++++++++++ src/widget/wmainmenubar.h | 2 ++ src/widget/wsearchlineedit.cpp | 20 ++++++-------------- src/widget/wsearchlineedit.h | 1 - 7 files changed, 64 insertions(+), 15 deletions(-) diff --git a/src/library/library.cpp b/src/library/library.cpp index 54c4143a11f5..e0c13c72e189 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -717,6 +717,22 @@ void Library::setEditMetadataSelectedClick(bool enabled) { emit setSelectedClick(enabled); } +void Library::slotSearchInCurrentView() { + m_pLibraryControl->setLibraryFocus(FocusWidget::Searchbar, Qt::ShortcutFocusReason); +} + +void Library::slotSearchInAllTracks() { + searchTracksInCollection(); +} + +void Library::searchTracksInCollection() { + VERIFY_OR_DEBUG_ASSERT(m_pMixxxLibraryFeature) { + return; + } + m_pMixxxLibraryFeature->selectAndActivate(); + m_pLibraryControl->setLibraryFocus(FocusWidget::Searchbar, Qt::ShortcutFocusReason); +} + void Library::searchTracksInCollection(const QString& query) { VERIFY_OR_DEBUG_ASSERT(m_pMixxxLibraryFeature) { return; diff --git a/src/library/library.h b/src/library/library.h index e0190084eeba..0dbdbcfb3982 100644 --- a/src/library/library.h +++ b/src/library/library.h @@ -98,6 +98,10 @@ class Library: public QObject { void setRowHeight(int rowHeight); void setEditMetadataSelectedClick(bool enable); + /// Switches to the internal track collection view + /// and focuses the search box. + void searchTracksInCollection(); + /// Triggers a new search in the internal track collection /// and shows the results by switching the view. void searchTracksInCollection(const QString& query); @@ -119,6 +123,8 @@ class Library: public QObject { void slotRefreshLibraryModels(); void slotCreatePlaylist(); void slotCreateCrate(); + void slotSearchInCurrentView(); + void slotSearchInAllTracks(); void onSkinLoadFinished(); void slotSaveCurrentViewState() const; void slotRestoreCurrentViewState() const; diff --git a/src/mixxxmainwindow.cpp b/src/mixxxmainwindow.cpp index c5b44237bf97..a49802f72e58 100644 --- a/src/mixxxmainwindow.cpp +++ b/src/mixxxmainwindow.cpp @@ -935,6 +935,16 @@ void MixxxMainWindow::connectMenuBar() { } if (m_pCoreServices->getLibrary()) { + connect(m_pMenuBar, + &WMainMenuBar::searchInCurrentView, + m_pCoreServices->getLibrary().get(), + &Library::slotSearchInCurrentView, + Qt::UniqueConnection); + connect(m_pMenuBar, + &WMainMenuBar::searchInAllTracks, + m_pCoreServices->getLibrary().get(), + &Library::slotSearchInAllTracks, + Qt::UniqueConnection); connect(m_pMenuBar, &WMainMenuBar::createCrate, m_pCoreServices->getLibrary().get(), diff --git a/src/widget/wmainmenubar.cpp b/src/widget/wmainmenubar.cpp index 9fa9e2d91199..2df2e366e754 100644 --- a/src/widget/wmainmenubar.cpp +++ b/src/widget/wmainmenubar.cpp @@ -168,6 +168,30 @@ void WMainMenuBar::initialize() { pLibraryMenu->addSeparator(); + QString searchHereTitle = tr("Search in Current View..."); + QString searchHereText = tr("Search for tracks in the current library view"); + auto* pSearchHere = new QAction(searchHereTitle, this); + pSearchHere->setShortcut(QKeySequence(tr("Ctrl+f"))); + pSearchHere->setShortcutContext(Qt::ApplicationShortcut); + pSearchHere->setStatusTip(searchHereText); + pSearchHere->setWhatsThis(buildWhatsThis(searchHereTitle, searchHereText)); + connect(pSearchHere, &QAction::triggered, this, &WMainMenuBar::searchInCurrentView); + pLibraryMenu->addAction(pSearchHere); + + QString searchAllTitle = tr("Search in Tracks Library..."); + QString searchAllText = + tr("Search in the internal track collection under \"Tracks\" in " + "the library"); + auto* pSearchAll = new QAction(searchAllTitle, this); + pSearchAll->setShortcut(tr("Ctrl+Shift+F")); + pSearchAll->setShortcutContext(Qt::ApplicationShortcut); + pSearchAll->setStatusTip(searchAllText); + pSearchAll->setWhatsThis(buildWhatsThis(searchAllText, searchAllText)); + connect(pSearchAll, &QAction::triggered, this, &WMainMenuBar::searchInAllTracks); + pLibraryMenu->addAction(pSearchAll); + + pLibraryMenu->addSeparator(); + QString createPlaylistTitle = tr("Create &New Playlist"); QString createPlaylistText = tr("Create a new playlist"); auto* pLibraryCreatePlaylist = new QAction(createPlaylistTitle, this); diff --git a/src/widget/wmainmenubar.h b/src/widget/wmainmenubar.h index 98ec66c698f7..dd9fafadbcee 100644 --- a/src/widget/wmainmenubar.h +++ b/src/widget/wmainmenubar.h @@ -67,6 +67,8 @@ class WMainMenuBar : public QMenuBar { #ifdef __ENGINEPRIME__ void exportLibrary(); #endif + void searchInCurrentView(); + void searchInAllTracks(); void showAbout(); void showKeywheel(bool visible); void showPreferences(); diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 03aaa252cd2d..e74a8bdcd774 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -122,12 +122,6 @@ WSearchLineEdit::WSearchLineEdit(QWidget* pParent, UserSettingsPointer pConfig) this, &WSearchLineEdit::slotClearSearch); - QShortcut* setFocusShortcut = new QShortcut(QKeySequence(tr("Ctrl+F", "Search|Focus")), this); - connect(setFocusShortcut, - &QShortcut::activated, - this, - &WSearchLineEdit::slotSetShortcutFocus); - // Set up a timer to search after a few hundred milliseconds timeout. This // stops us from thrashing the database if you type really fast. m_debouncingTimer.setSingleShot(true); @@ -223,10 +217,12 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { tr("Enter a string to search for.") + " " + tr("Use operators like bpm:115-128, artist:BooFar, -year:1990.") + "\n" + tr("See User Manual > Mixxx Library for more information.") + - "\n\n" + - tr("Ctrl+F") + ": " + - tr("Focus", "Give search bar input focus") + "\n\n" + - tr("Additional Shortcuts When Focused:") + "\n" + + "\n\n" + tr("Ctrl+F") + ": " + + tr("Focus/Select All (Search in current view)", + "Give search bar input focus") + + "\n" + tr("Ctrl+Shift+F") + ": " + + tr("Focus/Select All (Search in \'Tracks\' library view)") + + "\n\n" + tr("Additional Shortcuts When Focused:") + "\n" + tr("Return") + ": " + tr("Trigger search before search-as-you-type timeout or " "focus tracks view afterwards") + @@ -790,10 +786,6 @@ void WSearchLineEdit::slotTextChanged(const QString& text) { m_saveTimer.start(kSaveTimeoutMillis); } -void WSearchLineEdit::slotSetShortcutFocus() { - handleSetFocus(Qt::ShortcutFocusReason); -} - void WSearchLineEdit::handleSetFocus(Qt::FocusReason focusReason) { if (!hasFocus()) { // selectAll will be called by setFocus - but only if hasFocus diff --git a/src/widget/wsearchlineedit.h b/src/widget/wsearchlineedit.h index e621f6637d82..fa7fefcd54f3 100644 --- a/src/widget/wsearchlineedit.h +++ b/src/widget/wsearchlineedit.h @@ -68,7 +68,6 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { void slotDeleteCurrentItem(); private slots: - void slotSetShortcutFocus(); void slotTextChanged(const QString& text); void slotIndexChanged(int index); From d03e359b945056073fd382978ff9370fb140598b Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Thu, 13 Feb 2025 00:49:16 +0000 Subject: [PATCH 023/163] chore: address pre-commit linting --- src/engine/sidechain/enginerecord.cpp | 17 ++++++++--------- src/preferences/dialog/dlgprefrecord.cpp | 5 ++--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index 9b0fc6df944e..bbd8b23175a2 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -250,20 +250,20 @@ void EngineRecord::writeCueLine() { % 75); m_cueFile.write(QStringLiteral(" TRACK %1 AUDIO\n") - .arg((double)m_cueTrack, 2, 'f', 0, '0') - .toUtf8()); + .arg((double)m_cueTrack, 2, 'f', 0, '0') + .toUtf8()); m_cueFile.write(QStringLiteral(" TITLE \"%1\"\n") - .arg(m_pCurrentTrack->getTitle()) - .toUtf8()); + .arg(m_pCurrentTrack->getTitle()) + .toUtf8()); m_cueFile.write(QStringLiteral(" PERFORMER \"%1\"\n") - .arg(m_pCurrentTrack->getArtist()) - .toUtf8()); + .arg(m_pCurrentTrack->getArtist()) + .toUtf8()); if (m_bCueUsesFileAnnotation) { m_cueFile.write(QStringLiteral(" FILE \"%1\"\n") - .arg(m_pCurrentTrack->getLocation()) - .toUtf8()); + .arg(m_pCurrentTrack->getLocation()) + .toUtf8()); } // Woefully inaccurate (at the seconds level anyways). @@ -397,4 +397,3 @@ void EngineRecord::closeCueFile() { m_cueFile.close(); } } - diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index f078df00f86a..25217c5fb11d 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -79,7 +79,7 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) CheckBoxUseCueFileAnnotation->setChecked(m_pConfig->getValue( ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), - kDefaultCueFileAnnotationEnabled)); + kDefaultCueFileAnnotationEnabled)); // Setting split comboBoxSplitting->addItem(SPLIT_650MB); @@ -461,11 +461,10 @@ void DlgPrefRecord::saveUseCueFile() { void DlgPrefRecord::saveUseCueFileAnnotation() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "cue_file_annotation_enabled"), - ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); + ConfigValue(CheckBoxUseCueFileAnnotation->isChecked())); } void DlgPrefRecord::saveSplitSize() { m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "FileSize"), ConfigValue(comboBoxSplitting->currentText())); } - From d790d0d2990052d0e44a59c7b46679d6f115e8af Mon Sep 17 00:00:00 2001 From: Antoine Colombier <7086688+acolombier@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:04:57 +0000 Subject: [PATCH 024/163] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Schürmann --- src/engine/sidechain/enginerecord.cpp | 14 ++++---------- src/preferences/dialog/dlgprefrecord.cpp | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/engine/sidechain/enginerecord.cpp b/src/engine/sidechain/enginerecord.cpp index bbd8b23175a2..5eac865eb0fa 100644 --- a/src/engine/sidechain/enginerecord.cpp +++ b/src/engine/sidechain/enginerecord.cpp @@ -36,16 +36,10 @@ int EngineRecord::updateFromPreferences() { m_baAuthor = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Author")); m_baAlbum = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "Album")); m_cueFileName = m_pConfig->getValueString(ConfigKey(RECORDING_PREF_KEY, "CuePath")); - m_bCueIsEnabled = - m_pConfig - ->getValueString(ConfigKey( - RECORDING_PREF_KEY, "CueEnabled")) - .toInt(); - m_bCueUsesFileAnnotation = - m_pConfig - ->getValueString(ConfigKey( - RECORDING_PREF_KEY, "cue_file_annotation_enabled")) - .toInt(); + m_bCueIsEnabled = m_pConfig->getValue( + ConfigKey(RECORDING_PREF_KEY, QStringLiteral("CueEnabled"))); + m_bCueUsesFileAnnotation = m_pConfig->getValue( + ConfigKey(RECORDING_PREF_KEY, QStringLiteral("cue_file_annotation_enabled"))); m_sampleRate = mixxx::audio::SampleRate::fromDouble(m_sampleRateControl.get()); // Delete m_pEncoder if it has been initialized (with maybe) different bitrate. diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 25217c5fb11d..00814839cc61 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -219,7 +219,7 @@ void DlgPrefRecord::slotResetToDefaults() { CheckBoxRecordCueFile->setChecked(kDefaultCueEnabled); // Sets 'Enable File Annotation in CUE file' checkbox value - CheckBoxUseCueFileAnnotation->setChecked(false); + CheckBoxUseCueFileAnnotation->setChecked(kDefaultCueFileAnnotationEnabled); } void DlgPrefRecord::slotBrowseRecordingsDir() { From d42fdf3e4f101a2b25206f7b211e2d45fdc89fd7 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Fri, 7 Jun 2024 12:11:35 +0000 Subject: [PATCH 025/163] Library: Make search shortcuts configurable via keymap --- res/keyboard/cs_CZ.kbd.cfg | 2 ++ res/keyboard/da_DK.kbd.cfg | 2 ++ res/keyboard/de_CH.kbd.cfg | 2 ++ res/keyboard/de_DE.kbd.cfg | 2 ++ res/keyboard/el_GR.kbd.cfg | 2 ++ res/keyboard/en_US.kbd.cfg | 2 ++ res/keyboard/es_ES.kbd.cfg | 2 ++ res/keyboard/fi_FI.kbd.cfg | 2 ++ res/keyboard/fr_CH.kbd.cfg | 2 ++ res/keyboard/fr_FR.kbd.cfg | 2 ++ res/keyboard/it_IT.kbd.cfg | 2 ++ res/keyboard/ru_RU.kbd.cfg | 2 ++ src/widget/wmainmenubar.cpp | 8 ++++++-- src/widget/wsearchlineedit.cpp | 7 +++++-- src/widget/wsearchlineedit.h | 2 ++ 15 files changed, 37 insertions(+), 4 deletions(-) diff --git a/res/keyboard/cs_CZ.kbd.cfg b/res/keyboard/cs_CZ.kbd.cfg index 6af18ba2a3f0..23bf9f34e32b 100644 --- a/res/keyboard/cs_CZ.kbd.cfg +++ b/res/keyboard/cs_CZ.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/da_DK.kbd.cfg b/res/keyboard/da_DK.kbd.cfg index 323a0942d82a..0676d66b9afd 100644 --- a/res/keyboard/da_DK.kbd.cfg +++ b/res/keyboard/da_DK.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/de_CH.kbd.cfg b/res/keyboard/de_CH.kbd.cfg index 99ccb5361ec0..99d111609898 100644 --- a/res/keyboard/de_CH.kbd.cfg +++ b/res/keyboard/de_CH.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/de_DE.kbd.cfg b/res/keyboard/de_DE.kbd.cfg index 9fdb8e712b6e..6055dc8bdfca 100644 --- a/res/keyboard/de_DE.kbd.cfg +++ b/res/keyboard/de_DE.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/el_GR.kbd.cfg b/res/keyboard/el_GR.kbd.cfg index 140ce77cf7af..622e1ff97417 100644 --- a/res/keyboard/el_GR.kbd.cfg +++ b/res/keyboard/el_GR.kbd.cfg @@ -145,6 +145,8 @@ vinylcontrol_cueing Ctrl+Alt+Θ FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/en_US.kbd.cfg b/res/keyboard/en_US.kbd.cfg index 7fe10956a9fc..7d8c18a89a7a 100644 --- a/res/keyboard/en_US.kbd.cfg +++ b/res/keyboard/en_US.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/es_ES.kbd.cfg b/res/keyboard/es_ES.kbd.cfg index 72423c40319d..73d2f033c99e 100644 --- a/res/keyboard/es_ES.kbd.cfg +++ b/res/keyboard/es_ES.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/fi_FI.kbd.cfg b/res/keyboard/fi_FI.kbd.cfg index ea197ca1f3ad..36ec3d6cd98f 100644 --- a/res/keyboard/fi_FI.kbd.cfg +++ b/res/keyboard/fi_FI.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/fr_CH.kbd.cfg b/res/keyboard/fr_CH.kbd.cfg index d3831aeb8d0d..df828dd9467e 100644 --- a/res/keyboard/fr_CH.kbd.cfg +++ b/res/keyboard/fr_CH.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/fr_FR.kbd.cfg b/res/keyboard/fr_FR.kbd.cfg index eb1a5ba474a4..0c89dc3579d7 100644 --- a/res/keyboard/fr_FR.kbd.cfg +++ b/res/keyboard/fr_FR.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/it_IT.kbd.cfg b/res/keyboard/it_IT.kbd.cfg index 9ef866ec5713..4f6e69649634 100644 --- a/res/keyboard/it_IT.kbd.cfg +++ b/res/keyboard/it_IT.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+U FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/res/keyboard/ru_RU.kbd.cfg b/res/keyboard/ru_RU.kbd.cfg index beda6b6fa7b7..70672f10bb34 100644 --- a/res/keyboard/ru_RU.kbd.cfg +++ b/res/keyboard/ru_RU.kbd.cfg @@ -141,6 +141,8 @@ vinylcontrol_cueing Ctrl+Alt+Г FileMenu_LoadDeck1 Ctrl+o FileMenu_LoadDeck2 Ctrl+Shift+O FileMenu_Quit Ctrl+q +LibraryMenu_SearchInCurrentView Ctrl+f +LibraryMenu_SearchInAllTracks Ctrl+Shift+F LibraryMenu_NewPlaylist Ctrl+n LibraryMenu_NewCrate Ctrl+Shift+N ViewMenu_ShowSkinSettings Ctrl+1 diff --git a/src/widget/wmainmenubar.cpp b/src/widget/wmainmenubar.cpp index 2df2e366e754..aa376b5dfaca 100644 --- a/src/widget/wmainmenubar.cpp +++ b/src/widget/wmainmenubar.cpp @@ -171,7 +171,9 @@ void WMainMenuBar::initialize() { QString searchHereTitle = tr("Search in Current View..."); QString searchHereText = tr("Search for tracks in the current library view"); auto* pSearchHere = new QAction(searchHereTitle, this); - pSearchHere->setShortcut(QKeySequence(tr("Ctrl+f"))); + pSearchHere->setShortcut(QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "LibraryMenu_SearchInCurrentView"), + tr("Ctrl+f")))); pSearchHere->setShortcutContext(Qt::ApplicationShortcut); pSearchHere->setStatusTip(searchHereText); pSearchHere->setWhatsThis(buildWhatsThis(searchHereTitle, searchHereText)); @@ -183,7 +185,9 @@ void WMainMenuBar::initialize() { tr("Search in the internal track collection under \"Tracks\" in " "the library"); auto* pSearchAll = new QAction(searchAllTitle, this); - pSearchAll->setShortcut(tr("Ctrl+Shift+F")); + pSearchAll->setShortcut(QKeySequence(m_pKbdConfig->getValue( + ConfigKey("[KeyboardShortcuts]", "LibraryMenu_SearchInAllTracks"), + tr("Ctrl+Shift+F")))); pSearchAll->setShortcutContext(Qt::ApplicationShortcut); pSearchAll->setStatusTip(searchAllText); pSearchAll->setWhatsThis(buildWhatsThis(searchAllText, searchAllText)); diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index e74a8bdcd774..3afd0a489f4f 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -212,15 +212,18 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { m_clearButton->setToolTip(tr("Clear input") + "\n" + tr("Clear the search bar input field")); +} +void WSearchLineEdit::setupToolTip(const QString& searchInCurrentViewShortcut, + const QString& searchInAllTracksShortcut) { setBaseTooltip(tr("Search", "noun") + "\n" + tr("Enter a string to search for.") + " " + tr("Use operators like bpm:115-128, artist:BooFar, -year:1990.") + "\n" + tr("See User Manual > Mixxx Library for more information.") + - "\n\n" + tr("Ctrl+F") + ": " + + "\n\n" + searchInCurrentViewShortcut + ": " + tr("Focus/Select All (Search in current view)", "Give search bar input focus") + - "\n" + tr("Ctrl+Shift+F") + ": " + + "\n" + searchInAllTracksShortcut + ": " + tr("Focus/Select All (Search in \'Tracks\' library view)") + "\n\n" + tr("Additional Shortcuts When Focused:") + "\n" + tr("Return") + ": " + diff --git a/src/widget/wsearchlineedit.h b/src/widget/wsearchlineedit.h index fa7fefcd54f3..4094f081a944 100644 --- a/src/widget/wsearchlineedit.h +++ b/src/widget/wsearchlineedit.h @@ -36,6 +36,8 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { ~WSearchLineEdit(); void setup(const QDomNode& node, const SkinContext& context); + void setupToolTip(const QString& searchInCurrentViewShortcut, + const QString& searchInAllTracksShortcut); void handleSetFocus(Qt::FocusReason focusReason); From a922f0fc8ca886e07f9df70db9a0bf55c1747db2 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Thu, 22 Aug 2024 21:15:59 +0000 Subject: [PATCH 026/163] WSearchLineEdit: Fix: Invoke WSearchLineEdit::setupTooltip in LegacySkinParser --- src/skin/legacy/legacyskinparser.cpp | 24 ++++++++++++++++++++---- src/skin/legacy/legacyskinparser.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/skin/legacy/legacyskinparser.cpp b/src/skin/legacy/legacyskinparser.cpp index 5a4dfe5b9701..551eff842a41 100644 --- a/src/skin/legacy/legacyskinparser.cpp +++ b/src/skin/legacy/legacyskinparser.cpp @@ -1454,6 +1454,19 @@ QWidget* LegacySkinParser::parseSearchBox(const QDomElement& node) { commonWidgetSetup(node, pLineEditSearch, false); pLineEditSearch->setup(node, *m_pContext); + // Translate shortcuts to native text + QString searchInCurrentViewShortcut = + localizeShortcutKeys(m_pKeyboard->getKeyboardConfig()->getValue( + ConfigKey("[KeyboardShortcuts]", + "LibraryMenu_SearchInCurrentView"), + "Ctrl+f")); + QString searchInAllTracksShortcut = + localizeShortcutKeys(m_pKeyboard->getKeyboardConfig()->getValue( + ConfigKey("[KeyboardShortcuts]", + "LibraryMenu_SearchInAllTracks"), + "Ctrl+Shift+F")); + pLineEditSearch->setupToolTip(searchInCurrentViewShortcut, searchInAllTracksShortcut); + m_pLibrary->bindSearchboxWidget(pLineEditSearch); return pLineEditSearch; @@ -2504,9 +2517,6 @@ void LegacySkinParser::addShortcutToToolTip(WBaseWidget* pWidget, QString tooltip; - // translate shortcut to native text - QString nativeShortcut = QKeySequence(shortcut, QKeySequence::PortableText).toString(QKeySequence::NativeText); - tooltip += "\n"; tooltip += tr("Shortcut"); if (!cmd.isEmpty()) { @@ -2514,10 +2524,16 @@ void LegacySkinParser::addShortcutToToolTip(WBaseWidget* pWidget, tooltip += cmd; } tooltip += ": "; - tooltip += nativeShortcut; + tooltip += localizeShortcutKeys(shortcut); pWidget->appendBaseTooltip(tooltip); } +QString LegacySkinParser::localizeShortcutKeys(const QString& shortcut) { + // Translate shortcut to native text + return QKeySequence(shortcut, QKeySequence::PortableText) + .toString(QKeySequence::NativeText); +} + QString LegacySkinParser::parseLaunchImageStyle(const QDomNode& node) { return m_pContext->selectString(node, "LaunchImageStyle"); } diff --git a/src/skin/legacy/legacyskinparser.h b/src/skin/legacy/legacyskinparser.h index 11cb4639b713..e58533445b26 100644 --- a/src/skin/legacy/legacyskinparser.h +++ b/src/skin/legacy/legacyskinparser.h @@ -135,6 +135,7 @@ class LegacySkinParser : public QObject, public SkinParser { bool setupPosition=true); void setupConnections(const QDomNode& node, WBaseWidget* pWidget); void addShortcutToToolTip(WBaseWidget* pWidget, const QString& shortcut, const QString& cmd); + QString localizeShortcutKeys(const QString& shortcut); QString getLibraryStyle(const QDomNode& node); QString lookupNodeGroup(const QDomElement& node); From 408bb41841e8678e20a5797d90423e09120e6146 Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Fri, 23 Aug 2024 11:21:02 +0000 Subject: [PATCH 027/163] WSearchLineEdit: Review: Rename WSearchLineEdit::handleSetFocus to setFocus --- src/library/librarycontrol.cpp | 2 +- src/widget/wsearchlineedit.cpp | 4 ++-- src/widget/wsearchlineedit.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/library/librarycontrol.cpp b/src/library/librarycontrol.cpp index af05f574bcf6..2fe96b70ad7e 100644 --- a/src/library/librarycontrol.cpp +++ b/src/library/librarycontrol.cpp @@ -921,7 +921,7 @@ void LibraryControl::setLibraryFocus(FocusWidget newFocusWidget, Qt::FocusReason VERIFY_OR_DEBUG_ASSERT(m_pSearchbox) { return; } - m_pSearchbox->handleSetFocus(focusReason); + m_pSearchbox->setFocus(focusReason); return; case FocusWidget::Sidebar: VERIFY_OR_DEBUG_ASSERT(m_pSidebarWidget) { diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 3afd0a489f4f..bea36e403698 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -789,11 +789,11 @@ void WSearchLineEdit::slotTextChanged(const QString& text) { m_saveTimer.start(kSaveTimeoutMillis); } -void WSearchLineEdit::handleSetFocus(Qt::FocusReason focusReason) { +void WSearchLineEdit::setFocus(Qt::FocusReason focusReason) { if (!hasFocus()) { // selectAll will be called by setFocus - but only if hasFocus // was false previously and focusReason is Tab, Backtab or Shortcut - setFocus(focusReason); + QWidget::setFocus(focusReason); } else if (focusReason == Qt::TabFocusReason || focusReason == Qt::BacktabFocusReason || focusReason == Qt::ShortcutFocusReason) { diff --git a/src/widget/wsearchlineedit.h b/src/widget/wsearchlineedit.h index 4094f081a944..0a123d96bac7 100644 --- a/src/widget/wsearchlineedit.h +++ b/src/widget/wsearchlineedit.h @@ -39,7 +39,7 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { void setupToolTip(const QString& searchInCurrentViewShortcut, const QString& searchInAllTracksShortcut); - void handleSetFocus(Qt::FocusReason focusReason); + void setFocus(Qt::FocusReason focusReason); protected: void resizeEvent(QResizeEvent*) override; From de0e7f4bcd89f3d5e46358f36b782ac4c669ee9e Mon Sep 17 00:00:00 2001 From: Lukas Waslowski Date: Fri, 23 Aug 2024 11:21:53 +0000 Subject: [PATCH 028/163] WSearchLineEdit: Review: Simplify WSearchLineEdit::getSearchText --- src/widget/wsearchlineedit.cpp | 21 ++++++++++++++------- src/widget/wsearchlineedit.h | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index bea36e403698..fbb728c70cb3 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -309,12 +309,12 @@ QString WSearchLineEdit::getSearchText() const { if (isEnabled()) { DEBUG_ASSERT(!currentText().isNull()); QString text = currentText(); - QCompleter* pCompleter = completer(); - if (pCompleter && hasCompletionAvailable()) { + QString completionPrefix; + if (hasCompletionAvailable(&completionPrefix)) { // Search for the entered text until the user has accepted the // completion by pressing Enter or changed/deselected the selected // completion text with Right or Left key - return pCompleter->completionPrefix(); + return completionPrefix; } return text; } else { @@ -817,9 +817,16 @@ bool WSearchLineEdit::hasSelectedText() const { return lineEdit()->hasSelectedText(); } -bool WSearchLineEdit::hasCompletionAvailable() const { +bool WSearchLineEdit::hasCompletionAvailable(QString* completionPrefix) const { QCompleter* pCompleter = completer(); - return pCompleter && hasSelectedText() && - lineEdit()->text().startsWith(pCompleter->completionPrefix()) && - pCompleter->completionPrefix().size() == lineEdit()->cursorPosition(); + QString prefix = pCompleter ? pCompleter->completionPrefix() : QString(); + if (!prefix.isEmpty() && hasSelectedText() && + lineEdit()->text().startsWith(prefix) && + prefix.size() == lineEdit()->cursorPosition()) { + if (completionPrefix) { + *completionPrefix = prefix; + } + return true; + } + return false; } diff --git a/src/widget/wsearchlineedit.h b/src/widget/wsearchlineedit.h index 0a123d96bac7..e56507294705 100644 --- a/src/widget/wsearchlineedit.h +++ b/src/widget/wsearchlineedit.h @@ -96,7 +96,7 @@ class WSearchLineEdit : public QComboBox, public WBaseWidget { void deleteSelectedListItem(); void triggerSearchDebounced(); bool hasSelectedText() const; - bool hasCompletionAvailable() const; + bool hasCompletionAvailable(QString* completionPrefix = nullptr) const; inline int findCurrentTextIndex() { return findData(currentText(), Qt::DisplayRole); From 0880465623841c66d91bc2300039626b24b8574c Mon Sep 17 00:00:00 2001 From: ronso0 Date: Tue, 4 Mar 2025 13:51:09 +0100 Subject: [PATCH 029/163] add 'LoadTrackFromPreviewDeck' control --- src/mixer/basetrackplayer.cpp | 12 ++++++++++++ src/mixer/basetrackplayer.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index a93ba2c4fee6..fc9a81d12db4 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -191,6 +191,13 @@ BaseTrackPlayerImpl::BaseTrackPlayerImpl( &ControlObject::valueChanged, this, &BaseTrackPlayerImpl::slotLoadTrackFromSampler); + m_pLoadTrackFromPreviewDeck = std::make_unique( + ConfigKey(getGroup(), "LoadTrackFromPreviewDeck"), + false); + connect(m_pLoadTrackFromPreviewDeck.get(), + &ControlObject::valueChanged, + this, + &BaseTrackPlayerImpl::slotLoadTrackFromPreviewDeck); // Waveform controls // This acts somewhat like a ControlPotmeter, but the normal _up/_down methods @@ -809,6 +816,11 @@ void BaseTrackPlayerImpl::slotLoadTrackFromDeck(double d) { loadTrackFromGroup(PlayerManager::groupForDeck(deck - 1)); } +void BaseTrackPlayerImpl::slotLoadTrackFromPreviewDeck(double d) { + int deck = static_cast(d); + loadTrackFromGroup(PlayerManager::groupForPreviewDeck(deck - 1)); +} + void BaseTrackPlayerImpl::slotLoadTrackFromSampler(double d) { int sampler = static_cast(d); loadTrackFromGroup(PlayerManager::groupForSampler(sampler - 1)); diff --git a/src/mixer/basetrackplayer.h b/src/mixer/basetrackplayer.h index e3c596a85e21..bce5b3e8ee03 100644 --- a/src/mixer/basetrackplayer.h +++ b/src/mixer/basetrackplayer.h @@ -140,6 +140,7 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer { void loadTrackFromGroup(const QString& group); void slotLoadTrackFromDeck(double deck); void slotLoadTrackFromSampler(double sampler); + void slotLoadTrackFromPreviewDeck(double deck); void slotTrackColorChangeRequest(double value); /// Slot for change signals from up/down controls (relative values) void slotTrackRatingChangeRequestRelative(int change); @@ -181,6 +182,7 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer { // Load track from other deck/sampler std::unique_ptr m_pLoadTrackFromDeck; std::unique_ptr m_pLoadTrackFromSampler; + std::unique_ptr m_pLoadTrackFromPreviewDeck; // Track color control std::unique_ptr m_pTrackColor; From 31e2b4e84c37022523d30e91e123aa21f9b3797c Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 13 Mar 2025 14:54:15 +0100 Subject: [PATCH 030/163] (fix) use canonical path to load font file --- src/util/font.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/util/font.cpp b/src/util/font.cpp index cb15ad7ca082..a50ade7ff594 100644 --- a/src/util/font.cpp +++ b/src/util/font.cpp @@ -67,16 +67,16 @@ void FontUtils::initializeFonts(const QString& resourcePath) { return; } - const QList files = fontsDir.entryList( + const QFileInfoList files = fontsDir.entryInfoList( QDir::NoDotAndDotDot | QDir::Files | QDir::Readable); - for (const QString& path : files) { + for (const QFileInfo& file : files) { // Skip text files (e.g. license files). For all others we let Qt tell // us whether the font format is supported since there is no way to // check other than adding. - if (path.endsWith(QStringLiteral(".txt"), Qt::CaseInsensitive)) { + if (file.suffix().toLower() == QStringLiteral("txt")) { continue; } - addFont(path); + addFont(file.canonicalFilePath()); } } From 16e746c41901138a5131efd7724f60508b6917e8 Mon Sep 17 00:00:00 2001 From: yen Date: Fri, 28 Mar 2025 12:35:03 +0100 Subject: [PATCH 031/163] Add nix flake with a dev shell to build Mixxx --- tools/flake.lock | 61 ++++++++++++++++++++++++++++++++++++++ tools/flake.nix | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 tools/flake.lock create mode 100644 tools/flake.nix diff --git a/tools/flake.lock b/tools/flake.lock new file mode 100644 index 000000000000..552b01ade3a7 --- /dev/null +++ b/tools/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1743080597, + "narHash": "sha256-UQwJgAe80hyILxk8sNSH2DCGDpHTYjtzld8uZv0nUes=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2332f3658f3f9c0b7c5c8357329c0737d5757331", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "utils": "utils" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/tools/flake.nix b/tools/flake.nix new file mode 100644 index 000000000000..e81fc2bb0f36 --- /dev/null +++ b/tools/flake.nix @@ -0,0 +1,76 @@ +{ + inputs = { + utils.url = "github:numtide/flake-utils"; + nixpkgs.url = "github:NixOS/nixpkgs/release-24.11"; + }; + outputs = { self, nixpkgs, utils }: utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShell = pkgs.mkShell { + buildInputs = with pkgs; [ + # Building Mixxx + qt6.full + cmake + chromaprint + glib + libebur128 + fftw + flac + lame + libogg + libvorbis + portaudio + portmidi + protobuf + rubberband + libsndfile + soundtouch + taglib + upower + openssl + microsoft-gsl + kdePackages.qtkeychain + hidapi + wavpack + libid3tag + libusb1 + libmad + libopus + opusfile + libshout + lilv + libxkbcommon + sqlite + gtest + clang-tools + mp4v2 + vulkan-loader + xorg.libX11 + ffmpeg + libmodplug + vamp-plugin-sdk + ccache + libGLU + pcre + libselinux + utillinux + libdjinterop + libkeyfinder + cups + lv2 + + # Git pre-commits + pre-commit + nodejs + rustup + ]; + shellHook = '' + pre-commit install + pre-commit install -t pre-push + ''; + }; + } + ); +} From 348914cd41fe8ae2d0a744be2ff3a1a9bdbfff84 Mon Sep 17 00:00:00 2001 From: yen Date: Sun, 30 Mar 2025 21:27:00 +0200 Subject: [PATCH 032/163] explicitly install required qt6 libraries instead of qt6.full --- tools/flake.nix | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/flake.nix b/tools/flake.nix index e81fc2bb0f36..118ef98e887b 100644 --- a/tools/flake.nix +++ b/tools/flake.nix @@ -6,12 +6,19 @@ outputs = { self, nixpkgs, utils }: utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; + qt6Env = with pkgs.qt6; env "qt-custom-${qtbase.version}" + [ + qt5compat + qtshadertools + qtsvg + qtdeclarative + ]; in { devShell = pkgs.mkShell { buildInputs = with pkgs; [ # Building Mixxx - qt6.full + qt6Env cmake chromaprint glib From c4c9d263260e7f24a7f61e39cc68e0c268627f6d Mon Sep 17 00:00:00 2001 From: yen Date: Tue, 1 Apr 2025 01:29:16 +0200 Subject: [PATCH 033/163] fix clang-format pre-commit hook --- tools/flake.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/flake.nix b/tools/flake.nix index 118ef98e887b..e6f33efa10c3 100644 --- a/tools/flake.nix +++ b/tools/flake.nix @@ -72,10 +72,13 @@ pre-commit nodejs rustup + stdenv.cc.cc ]; shellHook = '' pre-commit install pre-commit install -t pre-push + # Needed for clang-format pre-commit because it downloads and executes its own clang-format elf-binary + export LD_LIBRARY_PATH="${pkgs.stdenv.cc.cc.lib}/lib/:$LD_LIBRARY_PATH" ''; }; } From 8ddc637b12a7f420864c048c1618894f38071262 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 6 Apr 2025 20:53:52 +0000 Subject: [PATCH 034/163] fix: don't connect to WaveformFactory on SceneGraph implem --- src/waveform/renderers/allshader/waveformrendermark.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/waveform/renderers/allshader/waveformrendermark.cpp b/src/waveform/renderers/allshader/waveformrendermark.cpp index 28a4c6610825..e8a0b10690ed 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.cpp +++ b/src/waveform/renderers/allshader/waveformrendermark.cpp @@ -176,7 +176,7 @@ allshader::WaveformRenderMark::WaveformRenderMark( m_pPlayPosNode->initForRectangles(1); appendChildNode(std::move(pNode)); } - +#ifndef __SCENEGRAPH__ auto* pWaveformWidgetFactory = WaveformWidgetFactory::instance(); connect(pWaveformWidgetFactory, &WaveformWidgetFactory::untilMarkShowBeatsChanged, @@ -198,6 +198,7 @@ allshader::WaveformRenderMark::WaveformRenderMark( &WaveformWidgetFactory::untilMarkTextHeightLimitChanged, this, &WaveformRenderMark::setUntilMarkTextHeightLimit); +#endif } void allshader::WaveformRenderMark::draw(QPainter*, QPaintEvent*) { From dc30194378873bfc0079329d09913969e63a2a2f Mon Sep 17 00:00:00 2001 From: Sergey <5637569+fonsargo@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:07:40 +0200 Subject: [PATCH 035/163] Initial AGC commit --- CMakeLists.txt | 1 + .../builtin/autogaincontroleffect.cpp | 244 ++++++++++++++++++ .../backends/builtin/autogaincontroleffect.h | 69 +++++ .../backends/builtin/builtinbackend.cpp | 2 + 4 files changed, 316 insertions(+) create mode 100644 src/effects/backends/builtin/autogaincontroleffect.cpp create mode 100644 src/effects/backends/builtin/autogaincontroleffect.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b7a48247f97a..4596bf862cf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1090,6 +1090,7 @@ add_library( src/effects/backends/builtin/metronomeclick.cpp src/effects/backends/builtin/moogladder4filtereffect.cpp src/effects/backends/builtin/compressoreffect.cpp + src/effects/backends/builtin/autogaincontroleffect.cpp src/effects/backends/builtin/parametriceqeffect.cpp src/effects/backends/builtin/phasereffect.cpp src/effects/backends/builtin/reverbeffect.cpp diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp new file mode 100644 index 000000000000..fe0e7cbfccaa --- /dev/null +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -0,0 +1,244 @@ +#include "effects/backends/builtin/autogaincontroleffect.h" + +#include "util/math.h" + +namespace { +constexpr double defaultAttackMs = 1; +constexpr double defaultReleaseMs = 250; +constexpr double defaultThresholdDB = -40; +constexpr double defaultTargetDB = -5; +constexpr double defaultGainDB = 20; + +double calculateBallistics(double paramMs, const mixxx::EngineParameters& engineParameters) { + return exp(-1000.0 / (paramMs * engineParameters.sampleRate())); +} +} // anonymous namespace + +// static +QString AutoGainControlEffect::getId() { + return "org.mixxx.effects.autogaincontrol"; +} + +// static +EffectManifestPointer AutoGainControlEffect::getManifest() { + auto pManifest = EffectManifestPointer::create(); + pManifest->setId(getId()); + pManifest->setName(QObject::tr("Auto Gain Control")); + pManifest->setShortName(QObject::tr("AGC")); + pManifest->setAuthor("The Mixxx Team"); + pManifest->setVersion("1.0"); + pManifest->setDescription("Auto Gain Control (AGC) effect"); + pManifest->setEffectRampsFromDry(true); + pManifest->setMetaknobDefault(0.0); + + EffectManifestParameterPointer threshold = pManifest->addParameter(); + threshold->setId("threshold"); + threshold->setName(QObject::tr("Threshold (dBFS)")); + threshold->setShortName(QObject::tr("Threshold")); + threshold->setDescription( + QObject::tr("The Threshold knob adjusts the level above which the " + "effect starts enhancing the input signal")); + threshold->setValueScaler(EffectManifestParameter::ValueScaler::Linear); + threshold->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); + threshold->setNeutralPointOnScale(0); + threshold->setRange(-70, defaultThresholdDB, 0); + + EffectManifestParameterPointer target = pManifest->addParameter(); + target->setId("target"); + target->setName(QObject::tr("Target (dBFS)")); + target->setShortName(QObject::tr("Target")); + target->setDescription( + QObject::tr("The Target knob adjusts the desired target level of the output signal")); + target->setValueScaler(EffectManifestParameter::ValueScaler::Linear); + target->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); + target->setNeutralPointOnScale(0); + target->setRange(-20, defaultTargetDB, 10); + + EffectManifestParameterPointer gain = pManifest->addParameter(); + gain->setId("gain"); + gain->setName(QObject::tr("Gain (dB)")); + gain->setShortName(QObject::tr("Gain")); + gain->setDescription( + QObject::tr("The Gain knob adjusts the maximum amount of gain that " + "the effect will apply")); + gain->setValueScaler(EffectManifestParameter::ValueScaler::Linear); + gain->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); + gain->setRange(1, defaultGainDB, 40); + + EffectManifestParameterPointer attack = pManifest->addParameter(); + attack->setId("attack"); + attack->setName(QObject::tr("Attack (ms)")); + attack->setShortName(QObject::tr("Attack")); + attack->setDescription(QObject::tr( + "The Attack knob sets the time that determines how fast the " + "auto gain \nwill set in once the signal exceeds the threshold")); + attack->setValueScaler(EffectManifestParameter::ValueScaler::Logarithmic); + attack->setUnitsHint(EffectManifestParameter::UnitsHint::Millisecond); + attack->setRange(0, defaultAttackMs, 250); + + EffectManifestParameterPointer release = pManifest->addParameter(); + release->setId("release"); + release->setName(QObject::tr("Release (ms)")); + release->setShortName(QObject::tr("Release")); + release->setDescription( + QObject::tr("The Release knob sets the time that determines how " + "fast the auto gain will recover from the gain\n" + "adjustment once the signal falls under the threshold. " + "Depending on the input signal, short release times\n" + "may introduce a 'pumping' effect and/or distortion.")); + release->setValueScaler(EffectManifestParameter::ValueScaler::Integral); + release->setUnitsHint(EffectManifestParameter::UnitsHint::Millisecond); + release->setRange(0, defaultReleaseMs, 1500); + + return pManifest; +} + +void AutoGainControlGroupState::clear(const mixxx::EngineParameters& engineParameters) { + state = CSAMPLE_ONE; + attackCoeff = calculateBallistics(defaultAttackMs, engineParameters); + releaseCoeff = calculateBallistics(defaultReleaseMs, engineParameters); + + previousAttackParamMs = defaultAttackMs; + previousReleaseParamMs = defaultReleaseMs; + previousSampleRate = engineParameters.sampleRate(); +} + +void AutoGainControlGroupState::calculateCoeffsIfChanged( + const mixxx::EngineParameters& engineParameters, + double attackParamMs, + double releaseParamMs) { + if (engineParameters.sampleRate() != previousSampleRate) { + attackCoeff = calculateBallistics(attackParamMs, engineParameters); + previousAttackParamMs = attackParamMs; + + releaseCoeff = calculateBallistics(releaseParamMs, engineParameters); + previousReleaseParamMs = releaseParamMs; + + previousSampleRate = engineParameters.sampleRate(); + } else { + if (attackParamMs != previousAttackParamMs) { + attackCoeff = calculateBallistics(attackParamMs, engineParameters); + previousAttackParamMs = attackParamMs; + } + + if (releaseParamMs != previousReleaseParamMs) { + releaseCoeff = calculateBallistics(releaseParamMs, engineParameters); + previousReleaseParamMs = releaseParamMs; + } + } +} + +void AutoGainControlEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pThreshold = parameters.value("threshold"); + m_pTarget = parameters.value("target"); + m_pGain = parameters.value("gain"); + m_pAttack = parameters.value("attack"); + m_pRelease = parameters.value("release"); +} + +void AutoGainControlEffect::processChannel( + AutoGainControlGroupState* pState, + const CSAMPLE* pInput, + CSAMPLE* pOutput, + const mixxx::EngineParameters& engineParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { + Q_UNUSED(groupFeatures); + + if (enableState == EffectEnableState::Enabling) { + pState->clear(engineParameters); + } else { + pState->calculateCoeffsIfChanged(engineParameters, m_pAttack->value(), m_pRelease->value()); + } + + applyAutoGainControl(pState, engineParameters, pInput, pOutput); +} + +void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pState, + const mixxx::EngineParameters& engineParameters, + const CSAMPLE* pInput, + CSAMPLE* pOutput) { + CSAMPLE threshold = db2ratio(m_pThreshold->value()); + CSAMPLE target = db2ratio(m_pTarget->value()); + CSAMPLE_GAIN maxGain = db2ratio(m_pGain->value()); + double kneeDB = 5.0; // TODO + double thresholdDB = m_pThreshold->value(); + double targetLevelDB = m_pTarget->value(); + double maxGainDB = m_pGain->value(); + + CSAMPLE state = pState->state; + + SINT numSamples = engineParameters.samplesPerBuffer(); + int channelCount = engineParameters.channelCount(); + for (SINT i = 0; i < numSamples; i += channelCount) { + CSAMPLE maxSample = std::max(fabs(pInput[i]), fabs(pInput[i + 1])); + if (maxSample == CSAMPLE_ZERO) { + pOutput[i] = CSAMPLE_ZERO; + pOutput[i + 1] = CSAMPLE_ZERO; + continue; + } + + // TODO �������� ������� ����������� attack/release � ���������� gain + // (��� � ����������� ����� �������� �� �������) + + // ������������ ������� �������� � dB + double inputLevelDB = ratio2db(maxSample); + + // ������������ ����������� ���� + double desiredGainDB = 0.0; + + double upperKnee = thresholdDB + 0.5 * kneeDB; + double lowerKnee = thresholdDB - 0.5 * kneeDB; + + if (inputLevelDB > upperKnee) { + // ���� ������� ���� ������� ������� "Knee", ������������ ���� ��� ������ + desiredGainDB = targetLevelDB - inputLevelDB; + } else if (inputLevelDB < lowerKnee) { + // ���� ������� ���� ������ ������� "Knee", ���� ����� 0 + desiredGainDB = 0.0; + } else { + // ���� ������ ��������� ������ ���� "Knee", ��������� ������� ������� ����� + double kneePosition = (inputLevelDB - lowerKnee) / kneeDB; + desiredGainDB = (targetLevelDB - upperKnee) * kneePosition; + } + + // ��������� ����������� �� ������������ ���� + desiredGainDB = std::min(desiredGainDB, maxGainDB); + + // ��������� ������ ���� � ����������� ����������� + CSAMPLE_GAIN gain = db2ratio(desiredGainDB); + // if (maxSample > threshold) { + // gain = target / maxSample; + // if (gain > maxGain) { + // gain = maxGain; + // } + // } else { + // gain = CSAMPLE_GAIN_ONE; + // } + + // TODO: maxGain! + // TODO: threshold doesn't work if signal is lower! + // CSAMPLE_GAIN gain = target / state; + // if (gain > maxGain) { + // gain = maxGain; + // } + // == another: + // if (state > threshold) { + // gain = target / state; + // } + // else { + // gain = target / threshold; + // } + + if (gain < state) { + state = pState->attackCoeff * (state - gain) + gain; + } else { + state = pState->releaseCoeff * (state - gain) + gain; + } + + pOutput[i] = pInput[i] * state; + pOutput[i + 1] = pInput[i + 1] * state; + } + pState->state = state; +} diff --git a/src/effects/backends/builtin/autogaincontroleffect.h b/src/effects/backends/builtin/autogaincontroleffect.h new file mode 100644 index 000000000000..9c9f92cade9f --- /dev/null +++ b/src/effects/backends/builtin/autogaincontroleffect.h @@ -0,0 +1,69 @@ +#pragma once + +#include "effects/backends/effectprocessor.h" +#include "engine/effects/engineeffect.h" +#include "engine/effects/engineeffectparameter.h" +#include "util/class.h" +#include "util/defs.h" +#include "util/sample.h" +#include "util/types.h" + +class AutoGainControlGroupState : public EffectState { + public: + AutoGainControlGroupState(const mixxx::EngineParameters& engineParameters) + : EffectState(engineParameters) { + clear(engineParameters); + } + + void clear(const mixxx::EngineParameters& engineParameters); + + void calculateCoeffsIfChanged( + const mixxx::EngineParameters& engineParameters, + double attackParamMs, + double releaseParamMs); + + CSAMPLE state; + double attackCoeff; + double releaseCoeff; + + double previousAttackParamMs; + double previousReleaseParamMs; + mixxx::audio::SampleRate previousSampleRate; +}; + +class AutoGainControlEffect : public EffectProcessorImpl { + public: + AutoGainControlEffect() = default; + + static QString getId(); + static EffectManifestPointer getManifest(); + + void loadEngineEffectParameters( + const QMap& parameters) override; + + void processChannel( + AutoGainControlGroupState* pState, + const CSAMPLE* pInput, + CSAMPLE* pOutput, + const mixxx::EngineParameters& engineParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; + + private: + QString debugString() const { + return getId(); + } + + EngineEffectParameterPointer m_pThreshold; + EngineEffectParameterPointer m_pTarget; + EngineEffectParameterPointer m_pGain; + EngineEffectParameterPointer m_pAttack; + EngineEffectParameterPointer m_pRelease; + + DISALLOW_COPY_AND_ASSIGN(AutoGainControlEffect); + + void applyAutoGainControl(AutoGainControlGroupState* pState, + const mixxx::EngineParameters& engineParameters, + const CSAMPLE* pInput, + CSAMPLE* pOutput); +}; diff --git a/src/effects/backends/builtin/builtinbackend.cpp b/src/effects/backends/builtin/builtinbackend.cpp index b4b71425301a..908440f78132 100644 --- a/src/effects/backends/builtin/builtinbackend.cpp +++ b/src/effects/backends/builtin/builtinbackend.cpp @@ -16,6 +16,7 @@ #ifndef __MACAPPSTORE__ #include "effects/backends/builtin/reverbeffect.h" #endif +#include "effects/backends/builtin/autogaincontroleffect.h" #include "effects/backends/builtin/autopaneffect.h" #include "effects/backends/builtin/compressoreffect.h" #include "effects/backends/builtin/distortioneffect.h" @@ -64,6 +65,7 @@ BuiltInBackend::BuiltInBackend() { registerEffect(); registerEffect(); registerEffect(); + registerEffect(); } std::unique_ptr BuiltInBackend::createProcessor( From e259924cfbbce6ac9daf8f95b579ffe1e80aada6 Mon Sep 17 00:00:00 2001 From: Sergey <5637569+fonsargo@users.noreply.github.com> Date: Mon, 7 Apr 2025 22:04:18 +0200 Subject: [PATCH 036/163] Test AGC version with switch for different attack types --- .../builtin/autogaincontroleffect.cpp | 72 ++++++++++++++++--- .../backends/builtin/autogaincontroleffect.h | 8 +++ 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index fe0e7cbfccaa..3197d10115b0 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -4,7 +4,7 @@ namespace { constexpr double defaultAttackMs = 1; -constexpr double defaultReleaseMs = 250; +constexpr double defaultReleaseMs = 500; constexpr double defaultThresholdDB = -40; constexpr double defaultTargetDB = -5; constexpr double defaultGainDB = 20; @@ -31,6 +31,21 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { pManifest->setEffectRampsFromDry(true); pManifest->setMetaknobDefault(0.0); + EffectManifestParameterPointer autoMakeUp = pManifest->addParameter(); + autoMakeUp->setId("automakeup"); + autoMakeUp->setName(QObject::tr("Auto Makeup Gain")); + autoMakeUp->setShortName(QObject::tr("Makeup")); + autoMakeUp->setDescription(QObject::tr( + "The Auto Makeup button enables automatic gain adjustment to keep " + "the input signal \nand the processed output signal as close as " + "possible in perceived loudness")); + autoMakeUp->setValueScaler(EffectManifestParameter::ValueScaler::Toggle); + autoMakeUp->setRange(0, 1, 1); + autoMakeUp->appendStep(qMakePair( + QObject::tr("Off"), static_cast(AutoMakeUp::AutoMakeUpOff))); + autoMakeUp->appendStep(qMakePair( + QObject::tr("On"), static_cast(AutoMakeUp::AutoMakeUpOn))); + EffectManifestParameterPointer threshold = pManifest->addParameter(); threshold->setId("threshold"); threshold->setName(QObject::tr("Threshold (dBFS)")); @@ -65,6 +80,17 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { gain->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); gain->setRange(1, defaultGainDB, 40); + EffectManifestParameterPointer knee = pManifest->addParameter(); + knee->setId("knee"); + knee->setName(QObject::tr("Knee (dB)")); + knee->setShortName(QObject::tr("Knee")); + knee->setDescription(QObject::tr( + "The Knee knob is used to achieve a rounder compression curve")); + knee->setValueScaler(EffectManifestParameter::ValueScaler::Linear); + knee->setUnitsHint(EffectManifestParameter::UnitsHint::Coefficient); + knee->setNeutralPointOnScale(0); + knee->setRange(0.0, 5.0, 24); + EffectManifestParameterPointer attack = pManifest->addParameter(); attack->setId("attack"); attack->setName(QObject::tr("Attack (ms)")); @@ -95,6 +121,7 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { void AutoGainControlGroupState::clear(const mixxx::EngineParameters& engineParameters) { state = CSAMPLE_ONE; + state2 = CSAMPLE_ZERO; attackCoeff = calculateBallistics(defaultAttackMs, engineParameters); releaseCoeff = calculateBallistics(defaultReleaseMs, engineParameters); @@ -133,8 +160,10 @@ void AutoGainControlEffect::loadEngineEffectParameters( m_pThreshold = parameters.value("threshold"); m_pTarget = parameters.value("target"); m_pGain = parameters.value("gain"); + m_pKnee = parameters.value("knee"); m_pAttack = parameters.value("attack"); m_pRelease = parameters.value("release"); + m_pAutoMakeUp = parameters.value("automakeup"); } void AutoGainControlEffect::processChannel( @@ -162,12 +191,13 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta CSAMPLE threshold = db2ratio(m_pThreshold->value()); CSAMPLE target = db2ratio(m_pTarget->value()); CSAMPLE_GAIN maxGain = db2ratio(m_pGain->value()); - double kneeDB = 5.0; // TODO + double kneeDB = m_pKnee->value(); double thresholdDB = m_pThreshold->value(); double targetLevelDB = m_pTarget->value(); double maxGainDB = m_pGain->value(); CSAMPLE state = pState->state; + // CSAMPLE state2 = pState->state2; SINT numSamples = engineParameters.samplesPerBuffer(); int channelCount = engineParameters.channelCount(); @@ -179,11 +209,19 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta continue; } + if (maxSample > state) { + state = pState->attackCoeff * state + (1 - pState->attackCoeff) * maxSample; + } else { + state = pState->releaseCoeff * state + (1 - pState->releaseCoeff) * maxSample; + } + // TODO �������� ������� ����������� attack/release � ���������� gain // (��� � ����������� ����� �������� �� �������) + // bool attack = maxSample > state2; + // state2 = maxSample; // ������������ ������� �������� � dB - double inputLevelDB = ratio2db(maxSample); + double inputLevelDB = ratio2db(state); // ������������ ����������� ���� double desiredGainDB = 0.0; @@ -230,15 +268,27 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta // else { // gain = target / threshold; // } - - if (gain < state) { - state = pState->attackCoeff * (state - gain) + gain; - } else { - state = pState->releaseCoeff * (state - gain) + gain; + /* + if (m_pAutoMakeUp->toInt() == static_cast(AutoMakeUp::AutoMakeUpOn)) { + if (attack && gain < state) { + state = pState->attackCoeff * (state - gain) + gain; + } + else { + state = pState->releaseCoeff * (state - gain) + gain; + } } - - pOutput[i] = pInput[i] * state; - pOutput[i + 1] = pInput[i + 1] * state; + else { + if (gain < state) { + state = pState->attackCoeff * (state - gain) + gain; + } + else { + state = pState->releaseCoeff * (state - gain) + gain; + } + }*/ + + pOutput[i] = pInput[i] * gain; + pOutput[i + 1] = pInput[i + 1] * gain; } pState->state = state; + // pState->state2 = state2; } diff --git a/src/effects/backends/builtin/autogaincontroleffect.h b/src/effects/backends/builtin/autogaincontroleffect.h index 9c9f92cade9f..64b8690e2f3a 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.h +++ b/src/effects/backends/builtin/autogaincontroleffect.h @@ -23,6 +23,7 @@ class AutoGainControlGroupState : public EffectState { double releaseParamMs); CSAMPLE state; + CSAMPLE state2; double attackCoeff; double releaseCoeff; @@ -50,6 +51,11 @@ class AutoGainControlEffect : public EffectProcessorImpl Date: Tue, 8 Apr 2025 21:00:56 +0200 Subject: [PATCH 037/163] AGC calculations in ratio (bad looking) --- .../builtin/autogaincontroleffect.cpp | 47 +++++++++---------- .../backends/builtin/autogaincontroleffect.h | 7 --- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index 3197d10115b0..ea0853be921e 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -1,5 +1,7 @@ #include "effects/backends/builtin/autogaincontroleffect.h" +#include + #include "util/math.h" namespace { @@ -31,21 +33,6 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { pManifest->setEffectRampsFromDry(true); pManifest->setMetaknobDefault(0.0); - EffectManifestParameterPointer autoMakeUp = pManifest->addParameter(); - autoMakeUp->setId("automakeup"); - autoMakeUp->setName(QObject::tr("Auto Makeup Gain")); - autoMakeUp->setShortName(QObject::tr("Makeup")); - autoMakeUp->setDescription(QObject::tr( - "The Auto Makeup button enables automatic gain adjustment to keep " - "the input signal \nand the processed output signal as close as " - "possible in perceived loudness")); - autoMakeUp->setValueScaler(EffectManifestParameter::ValueScaler::Toggle); - autoMakeUp->setRange(0, 1, 1); - autoMakeUp->appendStep(qMakePair( - QObject::tr("Off"), static_cast(AutoMakeUp::AutoMakeUpOff))); - autoMakeUp->appendStep(qMakePair( - QObject::tr("On"), static_cast(AutoMakeUp::AutoMakeUpOn))); - EffectManifestParameterPointer threshold = pManifest->addParameter(); threshold->setId("threshold"); threshold->setName(QObject::tr("Threshold (dBFS)")); @@ -121,7 +108,6 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { void AutoGainControlGroupState::clear(const mixxx::EngineParameters& engineParameters) { state = CSAMPLE_ONE; - state2 = CSAMPLE_ZERO; attackCoeff = calculateBallistics(defaultAttackMs, engineParameters); releaseCoeff = calculateBallistics(defaultReleaseMs, engineParameters); @@ -163,7 +149,6 @@ void AutoGainControlEffect::loadEngineEffectParameters( m_pKnee = parameters.value("knee"); m_pAttack = parameters.value("attack"); m_pRelease = parameters.value("release"); - m_pAutoMakeUp = parameters.value("automakeup"); } void AutoGainControlEffect::processChannel( @@ -191,13 +176,13 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta CSAMPLE threshold = db2ratio(m_pThreshold->value()); CSAMPLE target = db2ratio(m_pTarget->value()); CSAMPLE_GAIN maxGain = db2ratio(m_pGain->value()); + CSAMPLE_GAIN knee = db2ratio(m_pKnee->value()); double kneeDB = m_pKnee->value(); double thresholdDB = m_pThreshold->value(); double targetLevelDB = m_pTarget->value(); double maxGainDB = m_pGain->value(); CSAMPLE state = pState->state; - // CSAMPLE state2 = pState->state2; SINT numSamples = engineParameters.samplesPerBuffer(); int channelCount = engineParameters.channelCount(); @@ -215,11 +200,7 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta state = pState->releaseCoeff * state + (1 - pState->releaseCoeff) * maxSample; } - // TODO �������� ������� ����������� attack/release � ���������� gain - // (��� � ����������� ����� �������� �� �������) - // bool attack = maxSample > state2; - // state2 = maxSample; - + /* // ������������ ������� �������� � dB double inputLevelDB = ratio2db(state); @@ -246,6 +227,25 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta // ��������� ������ ���� � ����������� ����������� CSAMPLE_GAIN gain = db2ratio(desiredGainDB); + */ + + CSAMPLE_GAIN kneeHalf = sqrt(knee); + CSAMPLE upperKnee = threshold * kneeHalf; + CSAMPLE lowerKnee = threshold / kneeHalf; + CSAMPLE_GAIN desiredGain; + + if (state > upperKnee) { + desiredGain = target / state; + } else if (state < lowerKnee) { + desiredGain = CSAMPLE_GAIN_ONE; + } else { + CSAMPLE kneePosition = (state - lowerKnee) / (upperKnee - lowerKnee); + desiredGain = pow(state / lowerKnee, + (targetLevelDB - thresholdDB - 0.5 * kneeDB) / kneeDB); + } + + CSAMPLE_GAIN gain = std::min(desiredGain, maxGain); + // if (maxSample > threshold) { // gain = target / maxSample; // if (gain > maxGain) { @@ -290,5 +290,4 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta pOutput[i + 1] = pInput[i + 1] * gain; } pState->state = state; - // pState->state2 = state2; } diff --git a/src/effects/backends/builtin/autogaincontroleffect.h b/src/effects/backends/builtin/autogaincontroleffect.h index 64b8690e2f3a..1126e700a7aa 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.h +++ b/src/effects/backends/builtin/autogaincontroleffect.h @@ -23,7 +23,6 @@ class AutoGainControlGroupState : public EffectState { double releaseParamMs); CSAMPLE state; - CSAMPLE state2; double attackCoeff; double releaseCoeff; @@ -51,11 +50,6 @@ class AutoGainControlEffect : public EffectProcessorImpl Date: Tue, 8 Apr 2025 22:26:19 +0200 Subject: [PATCH 038/163] Add descriptions + refactoring --- .../builtin/autogaincontroleffect.cpp | 100 +++--------------- 1 file changed, 16 insertions(+), 84 deletions(-) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index ea0853be921e..0bc10d05aaa4 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -10,6 +10,7 @@ constexpr double defaultReleaseMs = 500; constexpr double defaultThresholdDB = -40; constexpr double defaultTargetDB = -5; constexpr double defaultGainDB = 20; +constexpr double defaultKneeDB = 10; double calculateBallistics(double paramMs, const mixxx::EngineParameters& engineParameters) { return exp(-1000.0 / (paramMs * engineParameters.sampleRate())); @@ -29,7 +30,9 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { pManifest->setShortName(QObject::tr("AGC")); pManifest->setAuthor("The Mixxx Team"); pManifest->setVersion("1.0"); - pManifest->setDescription("Auto Gain Control (AGC) effect"); + pManifest->setDescription( + "Auto Gain Control (AGC) automatically adjusts the gain of an " + "audio signal to maintain a consistent output level."); pManifest->setEffectRampsFromDry(true); pManifest->setMetaknobDefault(0.0); @@ -72,11 +75,13 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { knee->setName(QObject::tr("Knee (dB)")); knee->setShortName(QObject::tr("Knee")); knee->setDescription(QObject::tr( - "The Knee knob is used to achieve a rounder compression curve")); + "The Knee knob defines the range around the Threshold where gain " + "changes are applied gradually,\nensuring smooth transitions and " + "avoiding abrupt level shifts.")); knee->setValueScaler(EffectManifestParameter::ValueScaler::Linear); knee->setUnitsHint(EffectManifestParameter::UnitsHint::Coefficient); knee->setNeutralPointOnScale(0); - knee->setRange(0.0, 5.0, 24); + knee->setRange(0.0, defaultKneeDB, 24); EffectManifestParameterPointer attack = pManifest->addParameter(); attack->setId("attack"); @@ -173,14 +178,12 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta const mixxx::EngineParameters& engineParameters, const CSAMPLE* pInput, CSAMPLE* pOutput) { - CSAMPLE threshold = db2ratio(m_pThreshold->value()); - CSAMPLE target = db2ratio(m_pTarget->value()); - CSAMPLE_GAIN maxGain = db2ratio(m_pGain->value()); - CSAMPLE_GAIN knee = db2ratio(m_pKnee->value()); - double kneeDB = m_pKnee->value(); double thresholdDB = m_pThreshold->value(); double targetLevelDB = m_pTarget->value(); double maxGainDB = m_pGain->value(); + double kneeDB = m_pKnee->value(); + double upperKneeDB = thresholdDB + 0.5 * kneeDB; + double lowerKneeDB = thresholdDB - 0.5 * kneeDB; CSAMPLE state = pState->state; @@ -200,91 +203,20 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta state = pState->releaseCoeff * state + (1 - pState->releaseCoeff) * maxSample; } - /* - // ������������ ������� �������� � dB double inputLevelDB = ratio2db(state); - - // ������������ ����������� ���� - double desiredGainDB = 0.0; - - double upperKnee = thresholdDB + 0.5 * kneeDB; - double lowerKnee = thresholdDB - 0.5 * kneeDB; - - if (inputLevelDB > upperKnee) { - // ���� ������� ���� ������� ������� "Knee", ������������ ���� ��� ������ + double desiredGainDB; + if (inputLevelDB > upperKneeDB) { desiredGainDB = targetLevelDB - inputLevelDB; - } else if (inputLevelDB < lowerKnee) { - // ���� ������� ���� ������ ������� "Knee", ���� ����� 0 + } else if (inputLevelDB < lowerKneeDB) { desiredGainDB = 0.0; } else { - // ���� ������ ��������� ������ ���� "Knee", ��������� ������� ������� ����� - double kneePosition = (inputLevelDB - lowerKnee) / kneeDB; - desiredGainDB = (targetLevelDB - upperKnee) * kneePosition; + double kneePosition = (inputLevelDB - lowerKneeDB) / kneeDB; + desiredGainDB = (targetLevelDB - upperKneeDB) * kneePosition; } - // ��������� ����������� �� ������������ ���� desiredGainDB = std::min(desiredGainDB, maxGainDB); - // ��������� ������ ���� � ����������� ����������� CSAMPLE_GAIN gain = db2ratio(desiredGainDB); - */ - - CSAMPLE_GAIN kneeHalf = sqrt(knee); - CSAMPLE upperKnee = threshold * kneeHalf; - CSAMPLE lowerKnee = threshold / kneeHalf; - CSAMPLE_GAIN desiredGain; - - if (state > upperKnee) { - desiredGain = target / state; - } else if (state < lowerKnee) { - desiredGain = CSAMPLE_GAIN_ONE; - } else { - CSAMPLE kneePosition = (state - lowerKnee) / (upperKnee - lowerKnee); - desiredGain = pow(state / lowerKnee, - (targetLevelDB - thresholdDB - 0.5 * kneeDB) / kneeDB); - } - - CSAMPLE_GAIN gain = std::min(desiredGain, maxGain); - - // if (maxSample > threshold) { - // gain = target / maxSample; - // if (gain > maxGain) { - // gain = maxGain; - // } - // } else { - // gain = CSAMPLE_GAIN_ONE; - // } - - // TODO: maxGain! - // TODO: threshold doesn't work if signal is lower! - // CSAMPLE_GAIN gain = target / state; - // if (gain > maxGain) { - // gain = maxGain; - // } - // == another: - // if (state > threshold) { - // gain = target / state; - // } - // else { - // gain = target / threshold; - // } - /* - if (m_pAutoMakeUp->toInt() == static_cast(AutoMakeUp::AutoMakeUpOn)) { - if (attack && gain < state) { - state = pState->attackCoeff * (state - gain) + gain; - } - else { - state = pState->releaseCoeff * (state - gain) + gain; - } - } - else { - if (gain < state) { - state = pState->attackCoeff * (state - gain) + gain; - } - else { - state = pState->releaseCoeff * (state - gain) + gain; - } - }*/ pOutput[i] = pInput[i] * gain; pOutput[i + 1] = pInput[i + 1] * gain; From b2a067885a98dded654c928e08e82c1a48ff2784 Mon Sep 17 00:00:00 2001 From: Sergey <5637569+fonsargo@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:48:58 +0200 Subject: [PATCH 039/163] Fix double to float conversion --- src/effects/backends/builtin/autogaincontroleffect.cpp | 6 ++---- src/effects/backends/builtin/autogaincontroleffect.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index 0bc10d05aaa4..6bdf82a8ea55 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -1,7 +1,5 @@ #include "effects/backends/builtin/autogaincontroleffect.h" -#include - #include "util/math.h" namespace { @@ -185,7 +183,7 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta double upperKneeDB = thresholdDB + 0.5 * kneeDB; double lowerKneeDB = thresholdDB - 0.5 * kneeDB; - CSAMPLE state = pState->state; + double state = pState->state; SINT numSamples = engineParameters.samplesPerBuffer(); int channelCount = engineParameters.channelCount(); @@ -216,7 +214,7 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta desiredGainDB = std::min(desiredGainDB, maxGainDB); - CSAMPLE_GAIN gain = db2ratio(desiredGainDB); + CSAMPLE_GAIN gain = static_cast(db2ratio(desiredGainDB)); pOutput[i] = pInput[i] * gain; pOutput[i + 1] = pInput[i + 1] * gain; diff --git a/src/effects/backends/builtin/autogaincontroleffect.h b/src/effects/backends/builtin/autogaincontroleffect.h index 1126e700a7aa..f00ea90d32f8 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.h +++ b/src/effects/backends/builtin/autogaincontroleffect.h @@ -22,7 +22,7 @@ class AutoGainControlGroupState : public EffectState { double attackParamMs, double releaseParamMs); - CSAMPLE state; + double state; double attackCoeff; double releaseCoeff; From c0045de8f35dd8ffbca6deb6d3a3f1ff5e538e0a Mon Sep 17 00:00:00 2001 From: Sergey <5637569+fonsargo@users.noreply.github.com> Date: Tue, 15 Apr 2025 21:43:18 +0200 Subject: [PATCH 040/163] Add additional comments --- .../backends/builtin/autogaincontroleffect.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index 6bdf82a8ea55..d0f75621c21d 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -176,48 +176,66 @@ void AutoGainControlEffect::applyAutoGainControl(AutoGainControlGroupState* pSta const mixxx::EngineParameters& engineParameters, const CSAMPLE* pInput, CSAMPLE* pOutput) { + // Get user-defined parameters double thresholdDB = m_pThreshold->value(); double targetLevelDB = m_pTarget->value(); double maxGainDB = m_pGain->value(); double kneeDB = m_pKnee->value(); + + // Define the upper and lower boundaries of the knee region double upperKneeDB = thresholdDB + 0.5 * kneeDB; double lowerKneeDB = thresholdDB - 0.5 * kneeDB; + // Initialize the envelope state double state = pState->state; SINT numSamples = engineParameters.samplesPerBuffer(); int channelCount = engineParameters.channelCount(); for (SINT i = 0; i < numSamples; i += channelCount) { + // Detect peak level across stereo channels CSAMPLE maxSample = std::max(fabs(pInput[i]), fabs(pInput[i + 1])); + + // If the input is silent, output silence if (maxSample == CSAMPLE_ZERO) { pOutput[i] = CSAMPLE_ZERO; pOutput[i + 1] = CSAMPLE_ZERO; continue; } + // Smooth the level detector using attack/release envelope if (maxSample > state) { state = pState->attackCoeff * state + (1 - pState->attackCoeff) * maxSample; } else { state = pState->releaseCoeff * state + (1 - pState->releaseCoeff) * maxSample; } + // Convert current signal level to decibels double inputLevelDB = ratio2db(state); + + // Determine the appropriate gain based on the input level double desiredGainDB; if (inputLevelDB > upperKneeDB) { + // Above the knee range: apply full gain reduction desiredGainDB = targetLevelDB - inputLevelDB; } else if (inputLevelDB < lowerKneeDB) { + // Below the knee range: no gain applied desiredGainDB = 0.0; } else { + // Within the knee: interpolate gain smoothly double kneePosition = (inputLevelDB - lowerKneeDB) / kneeDB; desiredGainDB = (targetLevelDB - upperKneeDB) * kneePosition; } + // Limit the gain to the maximum allowed value desiredGainDB = std::min(desiredGainDB, maxGainDB); + // Convert gain from decibels to linear amplitude ratio CSAMPLE_GAIN gain = static_cast(db2ratio(desiredGainDB)); pOutput[i] = pInput[i] * gain; pOutput[i + 1] = pInput[i + 1] * gain; } + + // Store the envelope state for the next buffer pState->state = state; } From eb38c67c0b17d6b0677f9f9050b4f46c94b83184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 29 Apr 2025 21:18:03 +0200 Subject: [PATCH 041/163] Bump version to 2.7-alpha --- .tx/config | 2 +- CHANGELOG.md | 2 ++ CMakeLists.txt | 2 +- LICENSE | 2 +- res/linux/org.mixxx.Mixxx.metainfo.xml | 6 +++++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.tx/config b/.tx/config index 2fec46c1f484..7b5c8801a000 100644 --- a/.tx/config +++ b/.tx/config @@ -1,7 +1,7 @@ [main] host = https://www.transifex.com -[o:mixxx-dj-software:p:mixxxdj:r:mixxx2-6] +[o:mixxx-dj-software:p:mixxxdj:r:mixxx2-7] file_filter = res/translations/mixxx_.ts source_file = res/translations/mixxx.ts source_lang = en diff --git a/CHANGELOG.md b/CHANGELOG.md index 026eb7895757..d8aab3227c48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## [2.7.0](https://github.com/mixxxdj/mixxx/milestone/47) (Unreleased) + ## [2.6.0](https://github.com/mixxxdj/mixxx/milestone/44) (Unreleased) ### Controller Mappings diff --git a/CMakeLists.txt b/CMakeLists.txt index aca9cd1239f8..e9c9f2f1e6da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -338,7 +338,7 @@ elseif(APPLE) endif() endif() -project(mixxx VERSION 2.6.0 LANGUAGES C CXX) +project(mixxx VERSION 2.7.0 LANGUAGES C CXX) # Work around missing version suffixes support https://gitlab.kitware.com/cmake/cmake/-/issues/16716 set(MIXXX_VERSION_PRERELEASE "alpha") # set to "alpha" "beta" or "" diff --git a/LICENSE b/LICENSE index a3ff5f714ce5..1bfecb19b6d8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Mixxx 2.6-alpha, Digital DJ'ing software. +Mixxx 2.7-alpha, Digital DJ'ing software. Copyright (C) 2001-2025 Mixxx Development Team Mixxx is free software; you can redistribute it and/or modify diff --git a/res/linux/org.mixxx.Mixxx.metainfo.xml b/res/linux/org.mixxx.Mixxx.metainfo.xml index 59006b997e7c..5752aff313df 100644 --- a/res/linux/org.mixxx.Mixxx.metainfo.xml +++ b/res/linux/org.mixxx.Mixxx.metainfo.xml @@ -96,7 +96,11 @@ Do not edit it manually. --> - + + + + +

Controller Mappings From 15ed75b116367c9f5ded61bc21e4425725630ec3 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 28 Feb 2024 13:08:52 +0100 Subject: [PATCH 042/163] View menu: add 'Show Auto DJ' action --- src/library/autodj/autodjfeature.cpp | 11 +++-------- src/library/autodj/autodjfeature.h | 1 + src/library/library.cpp | 14 ++++++++++++-- src/library/library.h | 6 +++++- src/mixxxmainwindow.cpp | 5 +++++ src/widget/wlibrary.cpp | 9 ++++----- src/widget/wmainmenubar.cpp | 14 ++++++++++++++ src/widget/wmainmenubar.h | 1 + 8 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/library/autodj/autodjfeature.cpp b/src/library/autodj/autodjfeature.cpp index a004dfa7f44c..03d745ef5490 100644 --- a/src/library/autodj/autodjfeature.cpp +++ b/src/library/autodj/autodjfeature.cpp @@ -22,12 +22,6 @@ #include "widget/wlibrary.h" #include "widget/wlibrarysidebar.h" -namespace { - -const QString kViewName = QStringLiteral("Auto DJ"); - -} // namespace - namespace { constexpr int kMaxRetrieveAttempts = 3; @@ -55,6 +49,7 @@ AutoDJFeature::AutoDJFeature(Library* pLibrary, m_pAutoDJProcessor(nullptr), m_pSidebarModel(make_parented(this)), m_pAutoDJView(nullptr), + m_viewName(Library::kAutoDJViewName), m_autoDjCratesDao(m_iAutoDJPlaylistId, pLibrary->trackCollectionManager(), m_pConfig) { qRegisterMetaType("AutoDJState"); m_pAutoDJProcessor = new AutoDJProcessor(this, @@ -152,7 +147,7 @@ void AutoDJFeature::bindLibraryWidget( m_pLibrary, m_pAutoDJProcessor, keyboard); - libraryWidget->registerView(kViewName, m_pAutoDJView); + libraryWidget->registerView(m_viewName, m_pAutoDJView); connect(m_pAutoDJView, &DlgAutoDJ::loadTrack, this, @@ -196,7 +191,7 @@ TreeItemModel* AutoDJFeature::sidebarModel() const { void AutoDJFeature::activate() { //qDebug() << "AutoDJFeature::activate()"; - emit switchToView(kViewName); + emit switchToView(m_viewName); emit disableSearch(); emit enableCoverArtDisplay(true); } diff --git a/src/library/autodj/autodjfeature.h b/src/library/autodj/autodjfeature.h index f17f44785039..53edd691426b 100644 --- a/src/library/autodj/autodjfeature.h +++ b/src/library/autodj/autodjfeature.h @@ -65,6 +65,7 @@ class AutoDJFeature : public LibraryFeature { AutoDJProcessor* m_pAutoDJProcessor; parented_ptr m_pSidebarModel; DlgAutoDJ* m_pAutoDJView; + const QString m_viewName; // Initialize the list of crates loaded into the auto-DJ queue. void constructCrateChildModel(); diff --git a/src/library/library.cpp b/src/library/library.cpp index 21f543399406..782f71a19608 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -51,7 +51,9 @@ using namespace mixxx::library::prefs; // This is the name which we use to register the WTrackTableView with the // WLibrary -const QString Library::m_sTrackViewName = QString("WTrackTableView"); +const QString Library::m_sTrackViewName = QStringLiteral("WTrackTableView"); + +const QString Library::kAutoDJViewName = QStringLiteral("Auto DJ"); // The default row height of the library. const int Library::kDefaultRowHeightPx = 20; @@ -71,6 +73,7 @@ Library::Library( m_pLibraryControl(make_parented(this)), m_pLibraryWidget(nullptr), m_pMixxxLibraryFeature(nullptr), + m_pAutoDJFeature(nullptr), m_pPlaylistFeature(nullptr), m_pCrateFeature(nullptr), m_pAnalysisFeature(nullptr) { @@ -98,7 +101,8 @@ Library::Library( Qt::DirectConnection /* signal-to-signal */); #endif - addFeature(new AutoDJFeature(this, m_pConfig, pPlayerManager)); + m_pAutoDJFeature = new AutoDJFeature(this, m_pConfig, pPlayerManager); + addFeature(m_pAutoDJFeature); m_pPlaylistFeature = new PlaylistFeature(this, UserSettingsPointer(m_pConfig)); addFeature(m_pPlaylistFeature); @@ -756,6 +760,12 @@ void Library::searchTracksInCollection(const QString& query) { m_pMixxxLibraryFeature->searchAndActivate(query); } +void Library::showAutoDJ() { + m_pAutoDJFeature->activate(); + emit switchToView(kAutoDJViewName); + m_pSidebarModel->slotFeatureSelect(m_pAutoDJFeature); +} + #ifdef __ENGINEPRIME__ std::unique_ptr Library::makeLibraryExporter( QWidget* parent) { diff --git a/src/library/library.h b/src/library/library.h index e4240aaf4686..8968a305f773 100644 --- a/src/library/library.h +++ b/src/library/library.h @@ -16,6 +16,7 @@ #include "util/parented_ptr.h" class AnalysisFeature; +class AutoDJFeature; class BrowseFeature; class ControlObject; class CrateFeature; @@ -105,6 +106,9 @@ class Library: public QObject { /// Triggers a new search in the internal track collection /// and shows the results by switching the view. void searchTracksInCollection(const QString& query); + void showAutoDJ(); + + static const QString kAutoDJViewName; bool requestAddDir(const QString& directory); bool requestRemoveDir(const QString& directory, LibraryRemovalType removalType); @@ -189,9 +193,9 @@ class Library: public QObject { QList m_features; const static QString m_sTrackViewName; - const static QString m_sAutoDJViewName; WLibrary* m_pLibraryWidget; MixxxLibraryFeature* m_pMixxxLibraryFeature; + AutoDJFeature* m_pAutoDJFeature; PlaylistFeature* m_pPlaylistFeature; CrateFeature* m_pCrateFeature; AnalysisFeature* m_pAnalysisFeature; diff --git a/src/mixxxmainwindow.cpp b/src/mixxxmainwindow.cpp index 4cda0aa7a57d..69d183e7554b 100644 --- a/src/mixxxmainwindow.cpp +++ b/src/mixxxmainwindow.cpp @@ -976,6 +976,11 @@ void MixxxMainWindow::connectMenuBar() { m_pCoreServices->getLibrary().get(), &Library::slotCreatePlaylist, Qt::UniqueConnection); + connect(m_pMenuBar, + &WMainMenuBar::showAutoDJ, + m_pCoreServices->getLibrary().get(), + &Library::showAutoDJ, + Qt::UniqueConnection); } #ifdef __ENGINEPRIME__ diff --git a/src/widget/wlibrary.cpp b/src/widget/wlibrary.cpp index dcc0390dde33..5520c0b3ce4f 100644 --- a/src/widget/wlibrary.cpp +++ b/src/widget/wlibrary.cpp @@ -55,9 +55,6 @@ void WLibrary::switchToView(const QString& name) { const auto lock = lockMutex(&m_mutex); //qDebug() << "WLibrary::switchToView" << name; - LibraryView* pOldLibrartView = dynamic_cast( - currentWidget()); - QWidget* pWidget = m_viewMap.value(name, nullptr); if (pWidget != nullptr) { LibraryView* pLibraryView = dynamic_cast(pWidget); @@ -68,8 +65,10 @@ void WLibrary::switchToView(const QString& name) { return; } if (currentWidget() != pWidget) { - if (pOldLibrartView) { - pOldLibrartView->saveCurrentViewState(); + LibraryView* pOldLibraryView = dynamic_cast( + currentWidget()); + if (pOldLibraryView) { + pOldLibraryView->saveCurrentViewState(); } //qDebug() << "WLibrary::setCurrentWidget" << name; setCurrentWidget(pWidget); diff --git a/src/widget/wmainmenubar.cpp b/src/widget/wmainmenubar.cpp index b22196815dfa..cac1b2f5b044 100644 --- a/src/widget/wmainmenubar.cpp +++ b/src/widget/wmainmenubar.cpp @@ -377,6 +377,20 @@ void WMainMenuBar::initialize() { pViewMenu->addSeparator(); + QString autoDJTitle = tr("Show Auto DJ"); + QString autoDJText = tr("Switch to the Auto DJ view."); + auto* pViewAutoDJ = new QAction(autoDJTitle, this); + // pViewAutoDJ->setShortcut(QKeySequence(m_pKbdConfig->getValue( + // ConfigKey("[KeyboardShortcuts]", "ViewMenu_ShowAutoDJ"), + // tr("Ctrl+9", "Menubar|View|Show Auto DJ")))); + pViewAutoDJ->setStatusTip(autoDJText); + pViewAutoDJ->setWhatsThis(buildWhatsThis(autoDJTitle, autoDJText)); + pViewAutoDJ->setCheckable(false); + connect(pViewAutoDJ, &QAction::triggered, this, &WMainMenuBar::showAutoDJ); + pViewMenu->addAction(pViewAutoDJ); + + pViewMenu->addSeparator(); + QString fullScreenTitle = tr("&Full Screen"); QString fullScreenText = tr("Display Mixxx using the full screen"); auto* pViewFullScreen = new QAction(fullScreenTitle, this); diff --git a/src/widget/wmainmenubar.h b/src/widget/wmainmenubar.h index dd9fafadbcee..385c9412c369 100644 --- a/src/widget/wmainmenubar.h +++ b/src/widget/wmainmenubar.h @@ -69,6 +69,7 @@ class WMainMenuBar : public QMenuBar { #endif void searchInCurrentView(); void searchInAllTracks(); + void showAutoDJ(); void showAbout(); void showKeywheel(bool visible); void showPreferences(); From cb3dd4aa1563e56e17094df7ac89f3a417e9fee9 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 29 Jul 2024 13:19:15 +0200 Subject: [PATCH 043/163] Library: don't scroll when programmatically selecting AutoDJ --- src/library/library.cpp | 3 ++- src/library/libraryfeature.h | 2 +- src/library/sidebarmodel.cpp | 8 +++++--- src/library/sidebarmodel.h | 6 ++++-- src/widget/wlibrarysidebar.cpp | 16 +++++++++++++--- src/widget/wlibrarysidebar.h | 2 +- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/library/library.cpp b/src/library/library.cpp index 782f71a19608..ab26cadbd36b 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -763,7 +763,8 @@ void Library::searchTracksInCollection(const QString& query) { void Library::showAutoDJ() { m_pAutoDJFeature->activate(); emit switchToView(kAutoDJViewName); - m_pSidebarModel->slotFeatureSelect(m_pAutoDJFeature); + // Select it but don't scroll there + m_pSidebarModel->slotFeatureSelect(m_pAutoDJFeature, QModelIndex(), false); } #ifdef __ENGINEPRIME__ diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h index 3c0a204cc436..cfef22ea0569 100644 --- a/src/library/libraryfeature.h +++ b/src/library/libraryfeature.h @@ -165,7 +165,7 @@ class LibraryFeature : public QObject { // emit this signal if the foreign music collection has been imported/parsed. void featureLoadingFinished(LibraryFeature*s); // emit this signal to select pFeature - void featureSelect(LibraryFeature* pFeature, const QModelIndex& index); + void featureSelect(LibraryFeature* pFeature, const QModelIndex& index, bool scrollTo = true); // emit this signal to enable/disable the cover art widget void enableCoverArtDisplay(bool); void trackSelected(TrackPointer pTrack); diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp index 2a43430a6913..d12e4b6d5d71 100644 --- a/src/library/sidebarmodel.cpp +++ b/src/library/sidebarmodel.cpp @@ -96,7 +96,7 @@ void SidebarModel::setDefaultSelection(unsigned int index) { void SidebarModel::activateDefaultSelection() { if (m_iDefaultSelectedIndex < static_cast(m_sFeatures.size())) { - emit selectIndex(getDefaultSelection()); + emit selectIndex(getDefaultSelection(), true /* scrollTo */); // Selecting an index does not activate it. m_sFeatures[m_iDefaultSelectedIndex]->activate(); } @@ -593,7 +593,9 @@ void SidebarModel::featureRenamed(LibraryFeature* pFeature) { } } -void SidebarModel::slotFeatureSelect(LibraryFeature* pFeature, const QModelIndex& featureIndex) { +void SidebarModel::slotFeatureSelect(LibraryFeature* pFeature, + const QModelIndex& featureIndex, + bool scrollTo) { QModelIndex ind; if (featureIndex.isValid()) { TreeItem* pTreeItem = static_cast(featureIndex.internalPointer()); @@ -606,5 +608,5 @@ void SidebarModel::slotFeatureSelect(LibraryFeature* pFeature, const QModelIndex } } } - emit selectIndex(ind); + emit selectIndex(ind, scrollTo); } diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h index 60bd28c3029c..742bb0c28417 100644 --- a/src/library/sidebarmodel.h +++ b/src/library/sidebarmodel.h @@ -56,7 +56,9 @@ class SidebarModel : public QAbstractItemModel { void rightClicked(const QPoint& globalPos, const QModelIndex& index); void renameItem(const QModelIndex& index); void deleteItem(const QModelIndex& index); - void slotFeatureSelect(LibraryFeature* pFeature, const QModelIndex& index = QModelIndex()); + void slotFeatureSelect(LibraryFeature* pFeature, + const QModelIndex& index = QModelIndex(), + bool scrollTo = true); // Slots for every single QAbstractItemModel signal // void slotColumnsAboutToBeInserted(const QModelIndex& parent, int start, int end); @@ -79,7 +81,7 @@ class SidebarModel : public QAbstractItemModel { void slotFeatureLoadingFinished(LibraryFeature*); signals: - void selectIndex(const QModelIndex& index); + void selectIndex(const QModelIndex& index, bool scrollTo); private slots: void slotPressedUntilClickedTimeout(); diff --git a/src/widget/wlibrarysidebar.cpp b/src/widget/wlibrarysidebar.cpp index babe0714ac3d..fd0e9edcffa3 100644 --- a/src/widget/wlibrarysidebar.cpp +++ b/src/widget/wlibrarysidebar.cpp @@ -351,8 +351,8 @@ void WLibrarySidebar::focusInEvent(QFocusEvent* event) { QTreeView::focusInEvent(event); } -void WLibrarySidebar::selectIndex(const QModelIndex& index) { - //qDebug() << "WLibrarySidebar::selectIndex" << index; +void WLibrarySidebar::selectIndex(const QModelIndex& index, bool scrollToIndex) { + // qDebug() << "WLibrarySidebar::selectIndex" << index << scrollToIndex; if (!index.isValid()) { return; } @@ -365,8 +365,18 @@ void WLibrarySidebar::selectIndex(const QModelIndex& index) { expand(index.parent()); } setSelectionModel(pModel); + if (!scrollToIndex) { + // With auto-scroll enabled, setCurrentIndex() would scroll there. + // Disable (and re-enable if we don't want to scroll, e.g. when selecting + // AutoDJ from the menubar or during startup + setAutoScroll(false); + } setCurrentIndex(index); - scrollTo(index); + if (scrollToIndex) { + scrollTo(index); + } else { + setAutoScroll(true); + } } /// Selects a child index from a feature and ensures visibility diff --git a/src/widget/wlibrarysidebar.h b/src/widget/wlibrarysidebar.h index 2e092751ae66..a521df6e4d96 100644 --- a/src/widget/wlibrarysidebar.h +++ b/src/widget/wlibrarysidebar.h @@ -30,7 +30,7 @@ class WLibrarySidebar : public QTreeView, public WBaseWidget { bool isFeatureRootIndexSelected(LibraryFeature* pFeature); public slots: - void selectIndex(const QModelIndex&); + void selectIndex(const QModelIndex& index, bool scrollToIndex = true); void selectChildIndex(const QModelIndex&, bool selectItem = true); void slotSetFont(const QFont& font); From 6732312339e1ccfaa23f924dfff0695661cbd67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 7 May 2025 08:28:14 +0200 Subject: [PATCH 044/163] Update Translation template. Found 3213 source text(s) (16 new and 3197 already existing) --- res/translations/mixxx.ts | 354 ++++++++++++++++++++------------------ 1 file changed, 183 insertions(+), 171 deletions(-) diff --git a/res/translations/mixxx.ts b/res/translations/mixxx.ts index 864fce054d4c..549697e3eeb1 100644 --- a/res/translations/mixxx.ts +++ b/res/translations/mixxx.ts @@ -9545,57 +9545,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9668,22 +9668,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9953,129 +9953,129 @@ Do you really want to overwrite it? - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10097,7 +10097,7 @@ Do you want to select an input device? - + Playlists @@ -10112,27 +10112,27 @@ Do you want to select an input device? - + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist @@ -15504,323 +15504,353 @@ This can not be undone! - Create &New Playlist + Search in Current View... + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + + + + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen - + Display Mixxx using the full screen - + &Options - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help - + Show Keywheel menu title @@ -15837,74 +15867,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application - + Help translate this application into your language. - + &About - + About the application @@ -15939,25 +15969,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - - - - + Search noun - + Clear input @@ -15968,92 +15986,86 @@ This can not be undone! - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - - - - - Exit search - Exit search bar and leave focus + + Delete query from history From 097ff0f0311b7c42d6355e306abbe5624aeae2ea Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Wed, 7 May 2025 23:07:04 +0000 Subject: [PATCH 045/163] chore(pre-commit): upgrade qml_formatter to support JS chaining --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3b77b37d6090..f5aabe5b10bc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -126,7 +126,7 @@ repos: - id: prettier types: [yaml] - repo: https://github.com/qarmin/qml_formatter.git - rev: 37c2513b1b8275a475a160ed2f5b044910335d5f # No release tag yet including #6 fix + rev: 16f651d727652dffff92678f4b602df9bfb45eb7 # No release tag yet including #7 fix hooks: - id: qml_formatter - repo: https://github.com/BlankSpruce/gersemi From 110a14c8745edf0cdb657ee481b9b3705ba81ea8 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 8 May 2025 11:36:17 +0200 Subject: [PATCH 046/163] (fix) Tooltips: keep linebreak before kbd shortcut tooltips --- src/widget/wbasewidget.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/widget/wbasewidget.h b/src/widget/wbasewidget.h index 167e0cfd7185..744813a51a65 100644 --- a/src/widget/wbasewidget.h +++ b/src/widget/wbasewidget.h @@ -5,6 +5,8 @@ #include #include +#include "util/string.h" + class ControlWidgetPropertyConnection; class ControlParameterWidgetConnection; @@ -26,17 +28,17 @@ class WBaseWidget { } void appendBaseTooltip(const QString& tooltip) { - m_baseTooltip.append(tooltip.trimmed()); + m_baseTooltip.append(mixxx::removeTrailingWhitespaces(tooltip)); m_pWidget->setToolTip(m_baseTooltip); } void prependBaseTooltip(const QString& tooltip) { - m_baseTooltip.prepend(tooltip.trimmed()); + m_baseTooltip.prepend(mixxx::removeTrailingWhitespaces(tooltip)); m_pWidget->setToolTip(m_baseTooltip); } void setBaseTooltip(const QString& tooltip) { - m_baseTooltip = tooltip.trimmed(); + m_baseTooltip = mixxx::removeTrailingWhitespaces(tooltip); m_pWidget->setToolTip(m_baseTooltip); } From bc915c153b0374818c90be178494ac9545a13e4f Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Mon, 12 May 2025 18:40:53 +0000 Subject: [PATCH 047/163] chore: disable QML pre-commit hooks to prevent further data loss --- .pre-commit-config.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3b77b37d6090..1eb8a69626a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -168,6 +168,8 @@ repos: language: system types: [text] files: ^.*\.qml$ + stages: + - manual - id: metainfo name: metainfo description: Update AppStream metainfo releases from CHANGELOG.md. From e7c8a79ee1c8273f926cc2488be813080f0ba319 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 6 Apr 2025 22:13:19 +0000 Subject: [PATCH 048/163] feat: add QML setting popup --- CMakeLists.txt | 1 + res/qml/Button.qml | 164 +++++++---- res/qml/Settings.qml | 276 ++++++++++++++++++ res/qml/Settings/Analyzer.qml | 16 + res/qml/Settings/AutoDJ.qml | 16 + res/qml/Settings/Broadcast.qml | 16 + res/qml/Settings/Category.qml | 9 + res/qml/Settings/Controller.qml | 16 + res/qml/Settings/Interface.qml | 18 ++ res/qml/Settings/Library.qml | 16 + res/qml/Settings/MixerEffect.qml | 16 + res/qml/Settings/Recording.qml | 16 + res/qml/Settings/SoundHardware.qml | 64 ++++ res/qml/Settings/StatsPerformance.qml | 16 + res/qml/Theme/Theme.qml | 77 ++--- res/qml/images/gear.svg | 48 +++ res/qml/main.qml | 169 ++++++----- src/preferences/dialog/dlgprefinterface.cpp | 19 +- src/preferences/dialog/dlgprefinterface.h | 1 + src/preferences/dialog/dlgprefinterfacedlg.ui | 15 +- src/qml/qmlconfigproxy.cpp | 11 + src/qml/qmlconfigproxy.h | 1 + src/qml/qmlsettingparameter.cpp | 74 +++++ src/qml/qmlsettingparameter.h | 67 +++++ src/qml/qmlwaveformdisplay.cpp | 5 +- 25 files changed, 962 insertions(+), 185 deletions(-) create mode 100644 res/qml/Settings.qml create mode 100644 res/qml/Settings/Analyzer.qml create mode 100644 res/qml/Settings/AutoDJ.qml create mode 100644 res/qml/Settings/Broadcast.qml create mode 100644 res/qml/Settings/Category.qml create mode 100644 res/qml/Settings/Controller.qml create mode 100644 res/qml/Settings/Interface.qml create mode 100644 res/qml/Settings/Library.qml create mode 100644 res/qml/Settings/MixerEffect.qml create mode 100644 res/qml/Settings/Recording.qml create mode 100644 res/qml/Settings/SoundHardware.qml create mode 100644 res/qml/Settings/StatsPerformance.qml create mode 100644 res/qml/images/gear.svg create mode 100644 src/qml/qmlsettingparameter.cpp create mode 100644 src/qml/qmlsettingparameter.h diff --git a/CMakeLists.txt b/CMakeLists.txt index da2189c64279..4327eccb44bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3452,6 +3452,7 @@ if(QML) src/qml/qmlmixxxcontrollerscreen.cpp src/qml/qmlwaveformdisplay.cpp src/qml/qmlwaveformrenderer.cpp + src/qml/qmlsettingparameter.cpp src/waveform/renderers/allshader/digitsrenderer.cpp src/waveform/renderers/allshader/waveformrenderbeat.cpp src/waveform/renderers/allshader/waveformrenderer.cpp diff --git a/res/qml/Button.qml b/res/qml/Button.qml index c01dd33c48d1..d9143853d4d7 100644 --- a/res/qml/Button.qml +++ b/res/qml/Button.qml @@ -6,116 +6,152 @@ import "Theme" AbstractButton { id: root - property color normalColor: Theme.buttonNormalColor required property color activeColor - property color pressedColor: activeColor property bool highlight: false + property color normalColor: Theme.buttonNormalColor + property color pressedColor: activeColor - implicitWidth: 52 implicitHeight: 26 + implicitWidth: 52 + + background: Item { + anchors.fill: parent + + Rectangle { + id: backgroundImage + anchors.fill: parent + color: Theme.darkGray2 + radius: 0 + } + InnerShadow { + id: bottomInnerEffect + anchors.fill: parent + color: "transparent" + horizontalOffset: -1 + radius: 8 + samples: 16 + source: backgroundImage + spread: 0.3 + verticalOffset: -1 + } + InnerShadow { + id: topInnerEffect + anchors.fill: parent + color: "transparent" + horizontalOffset: 1 + radius: 8 + samples: 16 + source: bottomInnerEffect + spread: 0.3 + verticalOffset: 1 + } + DropShadow { + id: dropEffect + anchors.fill: parent + color: Theme.darkGray + horizontalOffset: 0 + radius: 4.0 + source: topInnerEffect + verticalOffset: 0 + } + } + contentItem: Item { + anchors.fill: parent + + Glow { + id: labelGlow + anchors.fill: parent + color: label.color + radius: 1 + source: label + spread: 0.1 + } + Label { + id: label + anchors.fill: parent + color: root.normalColor + font.bold: true + font.capitalization: Font.AllUppercase + font.family: Theme.fontFamily + font.pixelSize: Theme.buttonFontPixelSize + horizontalAlignment: Text.AlignHCenter + text: root.text + verticalAlignment: Text.AlignVCenter + visible: root.text != null + } + Image { + id: image + anchors.centerIn: parent + asynchronous: true + fillMode: Image.PreserveAspectFit + height: icon.height + source: icon.source + visible: false + width: icon.width + } + ColorOverlay { + anchors.fill: image + antialiasing: true + color: root.normalColor + source: image + visible: icon.source != null + } + } states: [ State { name: "pressed" when: root.pressed PropertyChanges { + color: root.checked ? Theme.accentColor : Theme.darkGray3 target: backgroundImage - source: Theme.imgButtonPressed } - PropertyChanges { - target: label color: root.pressedColor + target: label } - PropertyChanges { target: labelGlow visible: true } - }, State { name: "active" when: (root.highlight || root.checked) && !root.pressed PropertyChanges { + color: Theme.accentColor target: backgroundImage - source: Theme.imgButton } - PropertyChanges { - target: label color: root.activeColor + target: label } - PropertyChanges { target: labelGlow visible: true } - + PropertyChanges { + color: Qt.darker(Theme.accentColor, 3) + target: bottomInnerEffect + } + PropertyChanges { + color: Qt.darker(Theme.accentColor, 3) + target: topInnerEffect + } }, State { name: "inactive" when: !root.checked && !root.highlight && !root.pressed PropertyChanges { - target: backgroundImage - source: Theme.imgButton - } - - PropertyChanges { - target: label color: root.normalColor + target: label } - PropertyChanges { target: labelGlow visible: false } } ] - - background: BorderImage { - id: backgroundImage - - anchors.fill: parent - horizontalTileMode: BorderImage.Stretch - verticalTileMode: BorderImage.Stretch - source: Theme.imgButton - - border { - top: 10 - left: 10 - right: 10 - bottom: 10 - } - } - - contentItem: Item { - anchors.fill: parent - - Glow { - id: labelGlow - - anchors.fill: parent - radius: 5 - spread: 0.1 - color: label.color - source: label - } - - Label { - id: label - - anchors.fill: parent - text: root.text - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.family: Theme.fontFamily - font.capitalization: Font.AllUppercase - font.bold: true - font.pixelSize: Theme.buttonFontPixelSize - color: root.normalColor - } - } } diff --git a/res/qml/Settings.qml b/res/qml/Settings.qml new file mode 100644 index 000000000000..8a9d39eb9a96 --- /dev/null +++ b/res/qml/Settings.qml @@ -0,0 +1,276 @@ +import "." as Skin +import Mixxx 1.0 as Mixxx +import QtQuick 2.12 +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Shapes +import Qt5Compat.GraphicalEffects +import "Theme" + +Popup { + id: root + + property int activeCategoryIndex: 0 + property list sections: ["SoundHardware", "Library", "Controller", "Interface", "MixerEffect", "AutoDJ", "Broadcast", "Recording", "Analyzer", "StatsPerformance"] + + readonly property var manager: managerItem + + background: Rectangle { + anchors.fill: parent + color: Theme.darkGray2 + opacity: parent.radius < 0 ? Math.max(0.1, 1 + parent.radius / 8) : 1 + radius: 8 + } + contentItem: Item { + anchors.centerIn: parent + height: parent.height - 40 + width: parent.width - 40 + + RowLayout { + anchors.fill: parent + spacing: 0 + + Rectangle { + Layout.fillHeight: true + Layout.preferredWidth: 280 + border.color: Theme.darkGray3 + border.width: 6 + color: Theme.darkGray + + ColumnLayout { + anchors.fill: parent + anchors.margins: 6 + spacing: 0 + + Rectangle { + id: searchSetting + + property bool active: false + property alias input: searchInput + + Layout.fillWidth: true + color: Theme.midGray + height: 30 + + Text { + id: searchInputPlaceholder + anchors.verticalCenter: parent.verticalCenter + color: Theme.white + text: 'Search...' + visible: !parent.active + } + TextInput { + id: searchInput + anchors.verticalCenter: parent.verticalCenter + visible: parent.active + width: parent.width + + onActiveFocusChanged: { + parent.active = activeFocus; + } + onTextEdited: { + root.manager.search(text); + } + } + TapHandler { + onTapped: { + parent.active = true; + searchInput.forceActiveFocus(); + } + } + } + ListView { + id: categoryList + Layout.fillHeight: true + Layout.fillWidth: true + clip: true + focus: true + model: sectionProperties + visible: !searchSetting.active + + delegate: Rectangle { + required property int index + required property var label + + color: ListView.isCurrentItem ? Theme.darkGray3 : Theme.darkGray2 + height: 38 + width: ListView.view.width + + Image { + id: handleImage + anchors.left: parent.left + anchors.leftMargin: 8 + anchors.verticalCenter: parent.verticalCenter + fillMode: Image.PreserveAspectFit + height: 24 + source: "images/gear.svg" + visible: false + } + ColorOverlay { + anchors.fill: handleImage + antialiasing: true + color: parent.ListView.isCurrentItem ? Theme.accentColor : Theme.midGray + source: handleImage + } + Text { + anchors.left: handleImage.right + anchors.leftMargin: 8 + anchors.verticalCenter: parent.verticalCenter + color: Theme.white + font.bold: parent.ListView.isCurrentItem + text: label + } + TapHandler { + onTapped: { + categoryList.currentIndex = index; + } + } + } + } + ListView { + id: settingResultList + Layout.fillHeight: true + Layout.fillWidth: true + clip: true + focus: true + model: root.manager.model + visible: searchSetting.active + + delegate: Rectangle { + required property var display + required property int index + required property var toolTip + required property var whatsThis + + color: Theme.darkGray2 + height: 40 + width: ListView.view.width + + ColumnLayout { + anchors.fill: parent + anchors.margins: 4 + + Text { + Layout.fillWidth: true + Layout.preferredHeight: implicitHeight + color: Theme.white + text: searchSetting.input.text ? display.replace(searchSetting.input.text, `${searchSetting.input.text}`) : display + textFormat: Text.RichText + } + Text { + Layout.fillWidth: true + Layout.preferredHeight: implicitHeight + color: Theme.midGray + font.pixelSize: 10 + text: searchSetting.input.text ? whatsThis.replace(searchSetting.input.text, `${searchSetting.input.text}`) : whatsThis + textFormat: Text.RichText + } + } + TapHandler { + onTapped: { + for (let setting of toolTip) { + setting.activated(); + } + parent.forceActiveFocus(); + } + } + } + } + } + } + ColumnLayout { + Layout.fillHeight: true + Layout.fillWidth: true + + Text { + Layout.alignment: Qt.AlignHCenter + Layout.preferredHeight: 36 + color: Theme.white + font.pixelSize: 16 + font.weight: Font.DemiBold + text: "Settings" + } + Rectangle { + id: tabBar + + readonly property var categoryItem: categoriesLoader.itemAt(categoryList.currentIndex) ? categoriesLoader.itemAt(categoryList.currentIndex).item : null + readonly property int selectedIndex: categoryItem && categoryItem.selectedIndex !== undefined ? categoryItem.selectedIndex : 0 + readonly property var tabs: categoryItem ? categoryItem.tabs : [] + + Layout.fillWidth: true + Layout.preferredHeight: 30 + color: Theme.darkGray3 + visible: tabs?.length > 0 + + RowLayout { + anchors.fill: parent + + Repeater { + model: tabBar.tabs + + Skin.Button { + required property int index + required property string modelData + + Layout.alignment: Qt.AlignHCenter + Layout.preferredHeight: 22 + Layout.preferredWidth: parent.width / (tabBar.tabs.length + 2) + activeColor: Theme.white + checked: tabBar.selectedIndex == index + text: modelData + + onPressed: { + categoriesLoader.itemAt(categoryList.currentIndex).item.selectedIndex = index; + } + } + } + } + } + + Mixxx.SettingParameterManager { + id: managerItem + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 20 + + Repeater { + id: categoriesLoader + model: root.sections + + Loader { + id: category + + required property int index + required property var modelData + + anchors.fill: parent + source: `Settings/${modelData}.qml` + visible: categoryList.currentIndex == index + + // asynchronous: true // Unsupported + onLoaded: { + for (let i = sectionProperties.count; i < index; i++) + sectionProperties.append({}); + sectionProperties.set(index, { + "label": category.item.label + }); + } + + Connections { + function onActivated() { + categoryList.currentIndex = index; + } + + target: category.item + } + } + } + } + } + } + } + + ListModel { + id: sectionProperties + } +} diff --git a/res/qml/Settings/Analyzer.qml b/res/qml/Settings/Analyzer.qml new file mode 100644 index 000000000000..f56980a576e9 --- /dev/null +++ b/res/qml/Settings/Analyzer.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Analyzer" + + Mixxx.SettingParameter { + label: "A grey square" + + Rectangle { + color: 'grey' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/AutoDJ.qml b/res/qml/Settings/AutoDJ.qml new file mode 100644 index 000000000000..a8dd46caea76 --- /dev/null +++ b/res/qml/Settings/AutoDJ.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "AutoDJ" + + Mixxx.SettingParameter { + label: "A black square" + + Rectangle { + color: 'black' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/Broadcast.qml b/res/qml/Settings/Broadcast.qml new file mode 100644 index 000000000000..d8150886807e --- /dev/null +++ b/res/qml/Settings/Broadcast.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Broadcast" + + Mixxx.SettingParameter { + label: "A yellow square" + + Rectangle { + color: 'yellow' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/Category.qml b/res/qml/Settings/Category.qml new file mode 100644 index 000000000000..16d232cb12a6 --- /dev/null +++ b/res/qml/Settings/Category.qml @@ -0,0 +1,9 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Mixxx.SettingGroup { + id: root + + property int selectedIndex: 0 + property list tabs: [] +} diff --git a/res/qml/Settings/Controller.qml b/res/qml/Settings/Controller.qml new file mode 100644 index 000000000000..1023da91d3b6 --- /dev/null +++ b/res/qml/Settings/Controller.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Controllers" + + Mixxx.SettingParameter { + label: "A orange square" + + Rectangle { + color: 'orange' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/Interface.qml b/res/qml/Settings/Interface.qml new file mode 100644 index 000000000000..848da7fe71bb --- /dev/null +++ b/res/qml/Settings/Interface.qml @@ -0,0 +1,18 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + tabs: ["theme & colour", "waveform", "decks"] + + label: "Interface" + + Mixxx.SettingParameter { + label: "A pink square" + + Rectangle { + color: 'pink' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/Library.qml b/res/qml/Settings/Library.qml new file mode 100644 index 000000000000..1ca75978c25e --- /dev/null +++ b/res/qml/Settings/Library.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Library" + + Mixxx.SettingParameter { + label: "A blue square" + + Rectangle { + color: 'blue' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/MixerEffect.qml b/res/qml/Settings/MixerEffect.qml new file mode 100644 index 000000000000..3be92fc7c17f --- /dev/null +++ b/res/qml/Settings/MixerEffect.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Mixer & Effects" + + Mixxx.SettingParameter { + label: "A green square" + + Rectangle { + color: 'green' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/Recording.qml b/res/qml/Settings/Recording.qml new file mode 100644 index 000000000000..16ac87057aae --- /dev/null +++ b/res/qml/Settings/Recording.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Recording" + + Mixxx.SettingParameter { + label: "A red square" + + Rectangle { + color: 'red' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Settings/SoundHardware.qml b/res/qml/Settings/SoundHardware.qml new file mode 100644 index 000000000000..b1b6f70c9de2 --- /dev/null +++ b/res/qml/Settings/SoundHardware.qml @@ -0,0 +1,64 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + id: root + + label: "Sound hardware" + tabs: ["engine", "delays", "stats"] + + Mixxx.SettingGroup { + label: "Engine" + visible: root.selectedIndex == 0 + + onActivated: { + root.selectedIndex = 0; + } + + Mixxx.SettingParameter { + label: "A cyan square" + + Rectangle { + color: 'cyan' + height: 20 + width: 20 + } + } + } + Mixxx.SettingGroup { + label: "Delays" + visible: root.selectedIndex == 1 + + onActivated: { + root.selectedIndex = 1; + } + + Mixxx.SettingParameter { + label: "A magenta square" + + Rectangle { + color: 'magenta' + height: 20 + width: 20 + } + } + } + Mixxx.SettingGroup { + label: "Stats" + visible: root.selectedIndex == 2 + + onActivated: { + root.selectedIndex = 2; + } + + Mixxx.SettingParameter { + label: "A white square" + + Rectangle { + color: 'white' + height: 20 + width: 20 + } + } + } +} diff --git a/res/qml/Settings/StatsPerformance.qml b/res/qml/Settings/StatsPerformance.qml new file mode 100644 index 000000000000..a61b68730339 --- /dev/null +++ b/res/qml/Settings/StatsPerformance.qml @@ -0,0 +1,16 @@ +import QtQuick +import Mixxx 1.0 as Mixxx + +Category { + label: "Stats & Performance" + + Mixxx.SettingParameter { + label: "A grey square" + + Rectangle { + color: 'grey' + height: 20 + width: 20 + } + } +} diff --git a/res/qml/Theme/Theme.qml b/res/qml/Theme/Theme.qml index ca1b4d498e51..375911fcd0e8 100644 --- a/res/qml/Theme/Theme.qml +++ b/res/qml/Theme/Theme.qml @@ -2,65 +2,68 @@ import QtQuick 2.12 pragma Singleton QtObject { - property color white: "#e3d7fb" - property color yellow: "#fca001" - property color red: "#ea2a4e" + property color accentColor: "#3a60be" + property color backgroundColor: "#1e1e20" property color blue: "#01dcfc" - property color green: "#85c85b" - property color lightGray: "#747474" - property color lightGray2: "#b0b0b0" - property color midGray: "#696969" - property color darkGray: "#0f0f0f" - property color darkGray2: "#2e2e2e" - property color eqHighColor: white - property color eqMidColor: white - property color eqLowColor: white - property color eqFxColor: red - property color effectColor: yellow - property color effectUnitColor: red property color bpmSliderBarColor: green - property color volumeSliderBarColor: blue - property color gainKnobColor: blue - property color samplerColor: blue - property color crossfaderOrientationColor: lightGray + property color buttonNormalColor: midGray property color crossfaderBarColor: red - property color toolbarBackgroundColor: darkGray2 - property color pflActiveButtonColor: blue - property color backgroundColor: "#1e1e20" + property color crossfaderOrientationColor: lightGray + property color darkGray: "#0f0f0f" + property color darkGray2: "#2e2e2e" + property color darkGray3: "#3F3F3F" property color deckActiveColor: green property color deckBackgroundColor: darkGray - property color knobBackgroundColor: "#262626" property color deckLineColor: darkGray2 property color deckTextColor: lightGray2 + property color effectColor: yellow + property color effectUnitColor: red property color embeddedBackgroundColor: "#a0000000" - property color buttonNormalColor: midGray + property color eqFxColor: red + property color eqHighColor: white + property color eqLowColor: white + property color eqMidColor: white + property color gainKnobColor: blue + property color green: "#85c85b" + property color knobBackgroundColor: "#262626" + property color lightGray: "#747474" + property color lightGray2: "#b0b0b0" + property color midGray: "#696969" + property color pflActiveButtonColor: blue + property color red: "#ea2a4e" + property color samplerColor: blue property color textColor: lightGray2 property color toolbarActiveColor: white - property color waveformPrerollColor: midGray - property color waveformPostrollColor: midGray + property color toolbarBackgroundColor: darkGray2 + property color volumeSliderBarColor: blue + property color warningColor: "#7D3B3B" property color waveformBeatColor: lightGray property color waveformCursorColor: white property color waveformMarkerDefault: '#ff7a01' - property color waveformMarkerLabel: Qt.rgba(255, 255, 255, 0.8) property color waveformMarkerIntroOutroColor: '#2c5c9a' + property color waveformMarkerLabel: Qt.rgba(255, 255, 255, 0.8) property color waveformMarkerLoopColor: '#00b400' property color waveformMarkerLoopColorDisabled: '#FFFFFF' - property string fontFamily: "Open Sans" - property int textFontPixelSize: 14 + property color waveformPostrollColor: midGray + property color waveformPrerollColor: midGray + property color white: "#D9D9D9" + property color yellow: "#fca001" property int buttonFontPixelSize: 10 + property int textFontPixelSize: 14 + property string fontFamily: "Open Sans" + property string imgBpmSliderBackground: "images/slider_bpm.svg" property string imgButton: "images/button.svg" property string imgButtonPressed: "images/button_pressed.svg" - property string imgSliderHandle: "images/slider_handle.svg" - property string imgBpmSliderBackground: "images/slider_bpm.svg" - property string imgVolumeSliderBackground: "images/slider_volume.svg" - property string imgCrossfaderHandle: "images/slider_handle_crossfader.svg" property string imgCrossfaderBackground: "images/slider_crossfader.svg" - property string imgMicDuckingSliderHandle: "images/slider_handle_micducking.svg" - property string imgMicDuckingSlider: "images/slider_micducking.svg" - property string imgPopupBackground: imgButton + property string imgCrossfaderHandle: "images/slider_handle_crossfader.svg" property string imgKnob: "images/knob.svg" - property string imgKnobShadow: "images/knob_shadow.svg" property string imgKnobMini: "images/miniknob.svg" property string imgKnobMiniShadow: "images/miniknob_shadow.svg" + property string imgKnobShadow: "images/knob_shadow.svg" + property string imgMicDuckingSlider: "images/slider_micducking.svg" + property string imgMicDuckingSliderHandle: "images/slider_handle_micducking.svg" + property string imgPopupBackground: imgButton property string imgSectionBackground: "images/section.svg" + property string imgSliderHandle: "images/slider_handle.svg" + property string imgVolumeSliderBackground: "images/slider_volume.svg" } diff --git a/res/qml/images/gear.svg b/res/qml/images/gear.svg new file mode 100644 index 000000000000..c4f6cebc1aaa --- /dev/null +++ b/res/qml/images/gear.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/res/qml/main.qml b/res/qml/main.qml index ced85a02856e..f79470440c41 100644 --- a/res/qml/main.qml +++ b/res/qml/main.qml @@ -1,86 +1,79 @@ import "." as Skin import Mixxx 1.0 as Mixxx import QtQuick 2.12 -import QtQuick.Controls 2.12 +import QtQuick.Controls +import QtQuick.Layouts +import Qt5Compat.GraphicalEffects import "Theme" ApplicationWindow { id: root + property alias maximizeLibrary: maximizeLibraryButton.checked property alias show4decks: show4DecksButton.checked property alias showEffects: showEffectsButton.checked property alias showSamplers: showSamplersButton.checked - property alias maximizeLibrary: maximizeLibraryButton.checked - width: 1920 - height: 1080 color: Theme.backgroundColor + height: 1080 visible: true + width: 1920 Column { + id: content anchors.fill: parent + move: Transition { + NumberAnimation { + duration: 150 + properties: "x,y" + } + } + Rectangle { id: toolbar - - width: parent.width - height: 36 color: Theme.toolbarBackgroundColor + height: 36 radius: 1 + width: parent.width - Row { - padding: 5 - spacing: 5 + RowLayout { + anchors.fill: parent Skin.Button { id: show4DecksButton - - text: "4 Decks" activeColor: Theme.white checkable: true + text: "4 Decks" } - Skin.Button { id: maximizeLibraryButton - - text: "Library" activeColor: Theme.white checkable: true + text: "Library" } - Skin.Button { id: showEffectsButton - - text: "Effects" activeColor: Theme.white checkable: true + text: "Effects" } - Skin.Button { id: showSamplersButton - - text: "Sampler" activeColor: Theme.white checkable: true + text: "Sampler" } - - Skin.Button { - id: showPreferencesButton - - text: "Prefs" - activeColor: Theme.white - onClicked: { - Mixxx.PreferencesDialog.show(); - } + Item { + Layout.fillWidth: true } - Skin.Button { id: showDevToolsButton - - text: "Develop" activeColor: Theme.white checkable: true checked: devToolsWindow.visible + text: "Develop" + onClicked: { if (devToolsWindow.visible) devToolsWindow.close(); @@ -90,132 +83,152 @@ ApplicationWindow { DeveloperToolsWindow { id: devToolsWindow - - width: 640 height: 480 + width: 640 + } + } + Skin.Button { + id: showPreferencesButton + activeColor: Theme.white + checked: settingsPopup.opened + icon.height: 16 + icon.source: "images/gear.svg" + icon.width: 16 + implicitWidth: implicitHeight + + onClicked: { + if (!settingsPopup.opened) { + settingsPopup.open(); + } + } + onPressAndHold: { + Mixxx.PreferencesDialog.show(); } } } } - Skin.WaveformDisplay { id: deck3waveform - group: "[Channel3]" - width: root.width height: 120 visible: root.show4decks && !root.maximizeLibrary + width: root.width - FadeBehavior on visible { + FadeBehavior on visible { fadeTarget: deck3waveform } } - Skin.WaveformDisplay { id: deck1waveform - group: "[Channel1]" - width: root.width height: 120 visible: !root.maximizeLibrary + width: root.width - FadeBehavior on visible { + FadeBehavior on visible { fadeTarget: deck1waveform } } - Skin.WaveformDisplay { id: deck2waveform - group: "[Channel2]" - width: root.width height: 120 visible: !root.maximizeLibrary + width: root.width - FadeBehavior on visible { + FadeBehavior on visible { fadeTarget: deck2waveform } } - Skin.WaveformDisplay { id: deck4waveform - group: "[Channel4]" - width: root.width height: 120 visible: root.show4decks && !root.maximizeLibrary + width: root.width - FadeBehavior on visible { + FadeBehavior on visible { fadeTarget: deck4waveform } } - Skin.DeckRow { id: decks12 - leftDeckGroup: "[Channel1]" + minimized: root.maximizeLibrary rightDeckGroup: "[Channel2]" width: parent.width - minimized: root.maximizeLibrary } - Skin.CrossfaderRow { id: crossfader - crossfaderWidth: decks12.mixer.width - width: parent.width visible: !root.maximizeLibrary + width: parent.width - Skin.FadeBehavior on visible { + Skin.FadeBehavior on visible { fadeTarget: crossfader } } - Skin.DeckRow { id: decks34 - leftDeckGroup: "[Channel3]" - rightDeckGroup: "[Channel4]" - width: parent.width minimized: root.maximizeLibrary + rightDeckGroup: "[Channel4]" visible: root.show4decks + width: parent.width - Skin.FadeBehavior on visible { + Skin.FadeBehavior on visible { fadeTarget: decks34 } } - Skin.SamplerRow { id: samplers - - width: parent.width visible: root.showSamplers + width: parent.width - Skin.FadeBehavior on visible { + Skin.FadeBehavior on visible { fadeTarget: samplers } } - Skin.EffectRow { id: effects - - width: parent.width visible: root.showEffects + width: parent.width - Skin.FadeBehavior on visible { + Skin.FadeBehavior on visible { fadeTarget: effects } } - Skin.Library { - width: parent.width height: parent.height - y + width: parent.width } - - move: Transition { - NumberAnimation { - properties: "x,y" - duration: 150 + } + Skin.Settings { + id: settingsPopup + height: Math.max(840, parent.height * 0.7) + modal: true + width: Math.max(1400, parent.width * 0.8) + x: Math.round((parent.width - width) / 2) + y: Math.round((parent.height - height) / 2) + + Overlay.modal: Rectangle { + id: overlayModal + property real radius: 12 + + readonly property bool hasHardwareAcceleration: Mixxx.Config.useAcceleration() + + anchors.fill: parent + color: Qt.alpha('#00000010', hasHardwareAcceleration ? 1.0 : 0.6) + + Repeater { + model: hasHardwareAcceleration ? 1 : 0 + GaussianBlur { + anchors.fill: overlayModal + deviation: 4 + radius: Math.max(0, overlayModal.radius) + samples: 16 + source: content + } } } } diff --git a/src/preferences/dialog/dlgprefinterface.cpp b/src/preferences/dialog/dlgprefinterface.cpp index 7cdc67e86a19..c025939a9857 100644 --- a/src/preferences/dialog/dlgprefinterface.cpp +++ b/src/preferences/dialog/dlgprefinterface.cpp @@ -36,6 +36,7 @@ const QString kResizableSkinKey = QStringLiteral("ResizableSkin"); const QString kLocaleKey = QStringLiteral("Locale"); const QString kTooltipsKey = QStringLiteral("Tooltips"); const QString kMultiSamplingKey = QStringLiteral("multi_sampling"); +const QString kForceHardwareAccelerationKey = QStringLiteral("force_hardware_acceleration"); const QString kHideMenuBarKey = QStringLiteral("hide_menubar"); // TODO move these to a common *_defs.h file, some are also used by e.g. MixxxMainWindow @@ -206,6 +207,9 @@ DlgPrefInterface::DlgPrefInterface( m_multiSampling = m_pConfig->getValue( ConfigKey(kPreferencesGroup, kMultiSamplingKey), mixxx::preferences::MultiSamplingMode::Four); + m_forceHardwareAcceleration = m_pConfig->getValue( + ConfigKey(kPreferencesGroup, kForceHardwareAccelerationKey), + false); int multiSamplingIndex = multiSamplingComboBox->findData( QVariant::fromValue((m_multiSampling))); if (multiSamplingIndex != -1) { @@ -223,6 +227,7 @@ DlgPrefInterface::DlgPrefInterface( #endif multiSamplingLabel->hide(); multiSamplingComboBox->hide(); + checkBoxForceHardwareAcceleration->hide(); } // Tooltip configuration @@ -358,6 +363,8 @@ void DlgPrefInterface::slotResetToDefaults() { multiSamplingComboBox->setCurrentIndex( multiSamplingComboBox->findData(QVariant::fromValue( mixxx::preferences::MultiSamplingMode::Four))); // 4x MSAA + checkBoxForceHardwareAcceleration->setChecked( + false); #endif #ifdef Q_OS_IOS @@ -489,11 +496,20 @@ void DlgPrefInterface::slotApply() { .value(); m_pConfig->setValue( ConfigKey(kPreferencesGroup, kMultiSamplingKey), multiSampling); + bool forceHardwareAcceleration = checkBoxForceHardwareAcceleration->isChecked(); + if (m_pConfig->exists( + ConfigKey(kPreferencesGroup, kForceHardwareAccelerationKey)) || + forceHardwareAcceleration) { + m_pConfig->setValue( + ConfigKey(kPreferencesGroup, kForceHardwareAccelerationKey), + forceHardwareAcceleration); + } #endif if (locale != m_localeOnUpdate || scaleFactor != m_dScaleFactor #ifdef MIXXX_USE_QML - || multiSampling != m_multiSampling + || multiSampling != m_multiSampling || + forceHardwareAcceleration != m_forceHardwareAcceleration #endif ) { notifyRebootNecessary(); @@ -502,6 +518,7 @@ void DlgPrefInterface::slotApply() { m_dScaleFactor = scaleFactor; #ifdef MIXXX_USE_QML m_multiSampling = multiSampling; + m_forceHardwareAcceleration = forceHardwareAcceleration; #endif } diff --git a/src/preferences/dialog/dlgprefinterface.h b/src/preferences/dialog/dlgprefinterface.h index b2c7fcb0d6c5..1a990b25d1b6 100644 --- a/src/preferences/dialog/dlgprefinterface.h +++ b/src/preferences/dialog/dlgprefinterface.h @@ -70,6 +70,7 @@ class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg QString m_colorSchemeOnUpdate; QString m_localeOnUpdate; mixxx::preferences::MultiSamplingMode m_multiSampling; + bool m_forceHardwareAcceleration; mixxx::preferences::Tooltips m_tooltipMode; double m_dScaleFactor; double m_minScaleFactor; diff --git a/src/preferences/dialog/dlgprefinterfacedlg.ui b/src/preferences/dialog/dlgprefinterfacedlg.ui index 2b7def9894f4..21fb27b4aa90 100644 --- a/src/preferences/dialog/dlgprefinterfacedlg.ui +++ b/src/preferences/dialog/dlgprefinterfacedlg.ui @@ -287,16 +287,26 @@ - + Multi-Sampling - + + + + + Force 3D acceleration + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + + @@ -327,6 +337,7 @@ radioButtonTooltipsLibrary radioButtonTooltipsLibraryAndSkin multiSamplingComboBox + checkBoxForceHardwareAcceleration diff --git a/src/qml/qmlconfigproxy.cpp b/src/qml/qmlconfigproxy.cpp index 091d4e348293..949245f875e9 100644 --- a/src/qml/qmlconfigproxy.cpp +++ b/src/qml/qmlconfigproxy.cpp @@ -15,6 +15,7 @@ QVariantList paletteToQColorList(const ColorPalette& palette) { const QString kPreferencesGroup = QStringLiteral("[Preferences]"); const QString kMultiSamplingKey = QStringLiteral("multi_sampling"); +const QString k3DHardwareAccelerationKey = QStringLiteral("force_hardware_acceleration"); } // namespace @@ -42,6 +43,16 @@ int QmlConfigProxy::getMultiSamplingLevel() { mixxx::preferences::MultiSamplingMode::Disabled)); } +bool QmlConfigProxy::useAcceleration() { + if (!m_pConfig->exists( + ConfigKey(kPreferencesGroup, k3DHardwareAccelerationKey))) { + // TODO: detect whether QML currently run with 3D acceleration. QSGRendererInterface? + return false; + } + return m_pConfig->getValue( + ConfigKey(kPreferencesGroup, k3DHardwareAccelerationKey)); +} + // static QmlConfigProxy* QmlConfigProxy::create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine) { // The implementation of this method is mostly taken from the code example diff --git a/src/qml/qmlconfigproxy.h b/src/qml/qmlconfigproxy.h index a0e107276d9a..f3c8ace222d1 100644 --- a/src/qml/qmlconfigproxy.h +++ b/src/qml/qmlconfigproxy.h @@ -23,6 +23,7 @@ class QmlConfigProxy : public QObject { Q_INVOKABLE QVariantList getHotcueColorPalette(); Q_INVOKABLE QVariantList getTrackColorPalette(); Q_INVOKABLE int getMultiSamplingLevel(); + Q_INVOKABLE bool useAcceleration(); static QmlConfigProxy* create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine); static inline void registerUserSettings(UserSettingsPointer pConfig) { diff --git a/src/qml/qmlsettingparameter.cpp b/src/qml/qmlsettingparameter.cpp new file mode 100644 index 000000000000..a951c179df33 --- /dev/null +++ b/src/qml/qmlsettingparameter.cpp @@ -0,0 +1,74 @@ +#include "qml/qmlsettingparameter.h" + +#include +#include + +#include "moc_qmlsettingparameter.cpp" +#include "util/assert.h" + +namespace mixxx { +namespace qml { + +QmlSettingGroup::QmlSettingGroup(QQuickItem* parent) + : QQuickItem(parent) { +} +QmlSettingParameter::QmlSettingParameter(QQuickItem* parent) + : QmlSettingGroup(parent) { +} + +void QmlSettingParameter::componentComplete() { + QmlSettingGroup::componentComplete(); + QList pathItems; + auto* pParent = parentItem(); + while (pParent != nullptr) { + auto* pManager = qobject_cast(pParent); + if (pManager) { + pManager->registerSettingParamater(this, pathItems); + return; + } + auto* pGroup = qobject_cast(pParent); + if (pGroup) { + pathItems.prepend(pGroup); + } + pParent = pParent->parentItem(); + } + DEBUG_ASSERT(!"Couldn't find manager!"); +} + +QmlSettingParameterManager::QmlSettingParameterManager(QQuickItem* parent) + : QQuickItem(parent), + m_model(this) { + m_model.setSourceModel(&m_sourceModel); + m_model.setFilterKeyColumn(1); + m_model.setFilterCaseSensitivity(Qt::CaseInsensitive); +} +QmlSettingParameterManager::~QmlSettingParameterManager() { + // Manually deleting children so they can complete deregistration + qDeleteAll(childItems()); +} + +void QmlSettingParameterManager::registerSettingParamater( + QmlSettingParameter* pParameter, QList pathItems) { + QStringList path; + for (const auto* pItem : pathItems) { + path.append(pItem->label()); + } + pathItems.append(pParameter); + + auto* pItem = new QStandardItem(pParameter->label()); + pItem->setData(path.join(" > "), Qt::WhatsThisRole); + pItem->setData(QVariant::fromValue(pathItems), Qt::ToolTipRole); + m_sourceModel.appendRow(QList{pItem, + new QStandardItem(pParameter->label() + path.join(" > "))}); + auto rowIndex = m_sourceModel.index(m_sourceModel.rowCount() - 1, 0); + connect(pParameter, &QObject::destroyed, this, [this, rowIndex](QObject*) { + m_sourceModel.removeRow(rowIndex.row()); + }); +} + +void QmlSettingParameterManager::search(const QString& criteria) { + m_model.setFilterFixedString(criteria); +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmlsettingparameter.h b/src/qml/qmlsettingparameter.h new file mode 100644 index 000000000000..fc67c6b26772 --- /dev/null +++ b/src/qml/qmlsettingparameter.h @@ -0,0 +1,67 @@ +#pragma once +#include +#include +#include +#include + +namespace mixxx { +namespace qml { + +class QmlSettingGroup : public QQuickItem { + Q_OBJECT + Q_PROPERTY(QString label MEMBER m_label FINAL) + QML_NAMED_ELEMENT(SettingGroup) + public: + explicit QmlSettingGroup(QQuickItem* parent = nullptr); + + const QString& label() const { + return m_label; + } + signals: + Q_INVOKABLE void activated(); + + private: + QString m_label; +}; + +class QmlSettingParameterManager; +class QmlSettingParameter : public QmlSettingGroup { + Q_OBJECT + Q_PROPERTY(QStringList keywords MEMBER m_keywords FINAL) + QML_NAMED_ELEMENT(SettingParameter) + Q_INTERFACES(QQmlParserStatus) + public: + explicit QmlSettingParameter(QQuickItem* parent = nullptr); + + void componentComplete() override; + + const QStringList& keywords() const { + return m_keywords; + } + + private: + QStringList m_keywords; +}; + +class QmlSettingParameterManager : public QQuickItem { + Q_OBJECT + Q_PROPERTY(QSortFilterProxyModel* model READ model CONSTANT) + QML_NAMED_ELEMENT(SettingParameterManager) + public: + explicit QmlSettingParameterManager(QQuickItem* parent = nullptr); + ~QmlSettingParameterManager(); + + void registerSettingParamater(QmlSettingParameter* parameter, QList); + Q_INVOKABLE void search(const QString& criteria); + + QSortFilterProxyModel* model() { + return &m_model; + } + + private: + QStandardItemModel m_sourceModel; + QSortFilterProxyModel m_model; +}; + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmlwaveformdisplay.cpp b/src/qml/qmlwaveformdisplay.cpp index 06d78d31bdfc..4fadc7dcbdab 100644 --- a/src/qml/qmlwaveformdisplay.cpp +++ b/src/qml/qmlwaveformdisplay.cpp @@ -1,11 +1,10 @@ #include "qml/qmlwaveformdisplay.h" -#include - #include #include #include #include +#include #include #include #include @@ -24,7 +23,7 @@ using namespace allshader; namespace { constexpr int kDefaultSyncInternalMs = 100; -} +} // namespace namespace mixxx { namespace qml { From 2aeee0a9843d25091e7e0a88633a98cfb95cf0d5 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Mon, 24 Mar 2025 02:13:10 +0000 Subject: [PATCH 049/163] feat: refactor player proxy and create separated track proxy --- CMakeLists.txt | 13 +- res/qml/Mixxx/Controls/WaveformOverview.qml | 3 +- src/coreservices.cpp | 4 - src/qml/qmlplayermanagerproxy.cpp | 28 ++ src/qml/qmlplayermanagerproxy.h | 6 + src/qml/qmlplayerproxy.cpp | 355 ++---------------- src/qml/qmlplayerproxy.h | 126 +------ src/qml/qmltrackproxy.cpp | 244 ++++++++++++ src/qml/qmltrackproxy.h | 148 ++++++++ src/qml/qmlwaveformoverview.cpp | 83 +--- src/qml/qmlwaveformoverview.h | 23 +- .../controller_mapping_validation_test.cpp | 1 + 12 files changed, 508 insertions(+), 526 deletions(-) create mode 100644 src/qml/qmltrackproxy.cpp create mode 100644 src/qml/qmltrackproxy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 128de4c23187..9c3fb67dd3c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3436,24 +3436,25 @@ if(QML) src/qml/qmlapplication.cpp src/qml/qmlautoreload.cpp src/qml/qmlbeatsmodel.cpp - src/qml/qmlcuesmodel.cpp - src/qml/qmlcontrolproxy.cpp + src/qml/qmlchainpresetmodel.cpp src/qml/qmlconfigproxy.cpp + src/qml/qmlcontrolproxy.cpp + src/qml/qmlcuesmodel.cpp src/qml/qmldlgpreferencesproxy.cpp src/qml/qmleffectmanifestparametersmodel.cpp - src/qml/qmleffectsmanagerproxy.cpp src/qml/qmleffectslotproxy.cpp + src/qml/qmleffectsmanagerproxy.cpp src/qml/qmllibraryproxy.cpp src/qml/qmllibrarytracklistmodel.cpp + src/qml/qmlmixxxcontrollerscreen.cpp src/qml/qmlplayermanagerproxy.cpp src/qml/qmlplayerproxy.cpp src/qml/qmlvisibleeffectsmodel.cpp - src/qml/qmlchainpresetmodel.cpp - src/qml/qmlwaveformoverview.cpp - src/qml/qmlmixxxcontrollerscreen.cpp src/qml/qmlwaveformdisplay.cpp + src/qml/qmlwaveformoverview.cpp src/qml/qmlwaveformrenderer.cpp src/qml/qmlsettingparameter.cpp + src/qml/qmltrackproxy.cpp src/waveform/renderers/allshader/digitsrenderer.cpp src/waveform/renderers/allshader/waveformrenderbeat.cpp src/waveform/renderers/allshader/waveformrenderer.cpp diff --git a/res/qml/Mixxx/Controls/WaveformOverview.qml b/res/qml/Mixxx/Controls/WaveformOverview.qml index 1c217986451a..0ed78fea1562 100644 --- a/res/qml/Mixxx/Controls/WaveformOverview.qml +++ b/res/qml/Mixxx/Controls/WaveformOverview.qml @@ -6,8 +6,9 @@ Mixxx.WaveformOverview { id: root required property string group + readonly property var player: Mixxx.PlayerManager.getPlayer(root.group) - player: Mixxx.PlayerManager.getPlayer(root.group) + track: player.currentTrack Mixxx.ControlProxy { id: trackLoadedControl diff --git a/src/coreservices.cpp b/src/coreservices.cpp index c9d404c7b46f..040b9dad15b9 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -40,13 +40,9 @@ #include "controllers/scripting/controllerscriptenginebase.h" #include "qml/qmlconfigproxy.h" -#include "qml/qmlcontrolproxy.h" -#include "qml/qmldlgpreferencesproxy.h" -#include "qml/qmleffectslotproxy.h" #include "qml/qmleffectsmanagerproxy.h" #include "qml/qmllibraryproxy.h" #include "qml/qmlplayermanagerproxy.h" -#include "qml/qmlplayerproxy.h" #endif #include "soundio/soundmanager.h" #include "sources/soundsourceproxy.h" diff --git a/src/qml/qmlplayermanagerproxy.cpp b/src/qml/qmlplayermanagerproxy.cpp index 2544b34f3ad5..cc2d1b3a8e97 100644 --- a/src/qml/qmlplayermanagerproxy.cpp +++ b/src/qml/qmlplayermanagerproxy.cpp @@ -5,6 +5,7 @@ #include "mixer/playermanager.h" #include "moc_qmlplayermanagerproxy.cpp" #include "qml/qmlplayerproxy.h" +#include "track/track_decl.h" namespace mixxx { namespace qml { @@ -31,6 +32,20 @@ QmlPlayerProxy* QmlPlayerManagerProxy::getPlayer(const QString& group) { [this, group](const QString& trackLocation, bool play) { loadLocationToPlayer(trackLocation, group, play); }); + connect(pPlayerProxy, + &QmlPlayerProxy::loadTrackRequested, + this, + [this, group](TrackPointer track, +#ifdef __STEM__ + mixxx::StemChannelSelection stemSelection, +#endif + bool play) { + loadTrackToPlayer(track, group, +#ifdef __STEM__ + stemSelection, +#endif + play); + }); connect(pPlayerProxy, &QmlPlayerProxy::cloneFromGroup, this, @@ -59,6 +74,19 @@ void QmlPlayerManagerProxy::loadLocationToPlayer( m_pPlayerManager->slotLoadLocationToPlayer(location, group, play); } +void QmlPlayerManagerProxy::loadTrackToPlayer(TrackPointer track, + const QString& group, +#ifdef __STEM__ + mixxx::StemChannelSelection stemSelection, +#endif + bool play) { + m_pPlayerManager->slotLoadTrackToPlayer(track, group, +#ifdef __STEM__ + stemSelection, +#endif + play); +} + // static QmlPlayerManagerProxy* QmlPlayerManagerProxy::create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine) { // The implementation of this method is mostly taken from the code example diff --git a/src/qml/qmlplayermanagerproxy.h b/src/qml/qmlplayermanagerproxy.h index 1cf650b7ceb8..3f23ad664867 100644 --- a/src/qml/qmlplayermanagerproxy.h +++ b/src/qml/qmlplayermanagerproxy.h @@ -24,6 +24,12 @@ class QmlPlayerManagerProxy : public QObject { const QUrl& locationUrl, bool play = false); Q_INVOKABLE void loadLocationToPlayer( const QString& location, const QString& group, bool play = false); + Q_INVOKABLE void loadTrackToPlayer(TrackPointer track, + const QString& group, +#ifdef __STEM__ + mixxx::StemChannelSelection stemSelection, +#endif + bool play); static QmlPlayerManagerProxy* create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine); static void registerPlayerManager(std::shared_ptr pPlayerManager) { diff --git a/src/qml/qmlplayerproxy.cpp b/src/qml/qmlplayerproxy.cpp index d3b6056fda6b..ba5b58ea2b6d 100644 --- a/src/qml/qmlplayerproxy.cpp +++ b/src/qml/qmlplayerproxy.cpp @@ -1,42 +1,19 @@ #include "qml/qmlplayerproxy.h" #include +#include #include "mixer/basetrackplayer.h" #include "moc_qmlplayerproxy.cpp" -#include "qml/asyncimageprovider.h" - -#define PROPERTY_IMPL_GETTER(TYPE, NAME, GETTER) \ - TYPE QmlPlayerProxy::GETTER() const { \ - const TrackPointer pTrack = m_pCurrentTrack; \ - if (pTrack == nullptr) { \ - return TYPE(); \ - } \ - return pTrack->GETTER(); \ - } - -#define PROPERTY_IMPL(TYPE, NAME, GETTER, SETTER) \ - PROPERTY_IMPL_GETTER(TYPE, NAME, GETTER) \ - void QmlPlayerProxy::SETTER(const TYPE& value) { \ - const TrackPointer pTrack = m_pCurrentTrack; \ - if (pTrack != nullptr) { \ - pTrack->SETTER(value); \ - } \ - } +#include "qmltrackproxy.h" +#include "track/track.h" namespace mixxx { namespace qml { QmlPlayerProxy::QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent) : QObject(parent), - m_pTrackPlayer(pTrackPlayer), - m_pBeatsModel(new QmlBeatsModel(this)), - m_pHotcuesModel(new QmlCuesModel(this)) -#ifdef __STEM__ - , - m_pStemsModel(std::make_unique(this)) -#endif -{ + m_pTrackPlayer(pTrackPlayer) { connect(m_pTrackPlayer, &BaseTrackPlayer::loadingTrack, this, @@ -46,15 +23,25 @@ QmlPlayerProxy::QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent) this, &QmlPlayerProxy::slotTrackLoaded); connect(m_pTrackPlayer, - &BaseTrackPlayer::playerEmpty, + &BaseTrackPlayer::trackUnloaded, this, - &QmlPlayerProxy::trackUnloaded); - connect(this, &QmlPlayerProxy::trackChanged, this, &QmlPlayerProxy::slotTrackChanged); + &QmlPlayerProxy::slotTrackUnloaded); if (m_pTrackPlayer && m_pTrackPlayer->getLoadedTrack()) { slotTrackLoaded(pTrackPlayer->getLoadedTrack()); } } +void QmlPlayerProxy::loadTrack(QmlTrackProxy* track, bool play) { + if (track == nullptr || track->internal() == nullptr) { + return; + } + emit loadTrackRequested(track->internal(), +#ifdef __STEM__ + mixxx::StemChannel::All, +#endif + play); +} + void QmlPlayerProxy::loadTrackFromLocation(const QString& trackLocation, bool play) { emit loadTrackFromLocationRequested(trackLocation, play); } @@ -69,323 +56,47 @@ void QmlPlayerProxy::loadTrackFromLocationUrl(const QUrl& trackLocationUrl, bool void QmlPlayerProxy::slotTrackLoaded(TrackPointer pTrack) { m_pCurrentTrack = pTrack; - if (pTrack != nullptr) { - connect(pTrack.get(), - &Track::artistChanged, - this, - &QmlPlayerProxy::artistChanged); - connect(pTrack.get(), - &Track::titleChanged, - this, - &QmlPlayerProxy::titleChanged); - connect(pTrack.get(), - &Track::albumChanged, - this, - &QmlPlayerProxy::albumChanged); - connect(pTrack.get(), - &Track::albumArtistChanged, - this, - &QmlPlayerProxy::albumArtistChanged); - connect(pTrack.get(), - &Track::genreChanged, - this, - &QmlPlayerProxy::genreChanged); - connect(pTrack.get(), - &Track::composerChanged, - this, - &QmlPlayerProxy::composerChanged); - connect(pTrack.get(), - &Track::groupingChanged, - this, - &QmlPlayerProxy::groupingChanged); - connect(pTrack.get(), - &Track::yearChanged, - this, - &QmlPlayerProxy::yearChanged); - connect(pTrack.get(), - &Track::trackNumberChanged, - this, - &QmlPlayerProxy::trackNumberChanged); - connect(pTrack.get(), - &Track::trackTotalChanged, - this, - &QmlPlayerProxy::trackTotalChanged); - connect(pTrack.get(), - &Track::commentChanged, - this, - &QmlPlayerProxy::commentChanged); - connect(pTrack.get(), - &Track::keyChanged, - this, - &QmlPlayerProxy::keyTextChanged); - connect(pTrack.get(), - &Track::colorUpdated, - this, - &QmlPlayerProxy::colorChanged); - connect(pTrack.get(), - &Track::waveformUpdated, - this, - &QmlPlayerProxy::slotWaveformChanged); - connect(pTrack.get(), - &Track::beatsUpdated, - this, - &QmlPlayerProxy::slotBeatsChanged); - connect(pTrack.get(), - &Track::cuesUpdated, - this, - &QmlPlayerProxy::slotHotcuesChanged); -#ifdef __STEM__ - connect(pTrack.get(), - &Track::stemsUpdated, - this, - &QmlPlayerProxy::slotStemsChanged); -#endif - slotBeatsChanged(); - slotHotcuesChanged(); -#ifdef __STEM__ - slotStemsChanged(); -#endif - slotWaveformChanged(); - } emit trackChanged(); emit trackLoaded(); } -void QmlPlayerProxy::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) { +void QmlPlayerProxy::slotTrackUnloaded(TrackPointer pOldTrack) { VERIFY_OR_DEBUG_ASSERT(pOldTrack == m_pCurrentTrack) { qWarning() << "QML Player proxy was expected to contain " << pOldTrack.get() << "as active track but got" << m_pCurrentTrack.get(); } - - if (pNewTrack.get() == m_pCurrentTrack.get()) { - emit trackLoading(); - return; - } - - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack != nullptr) { - disconnect(pTrack.get(), nullptr, this, nullptr); + if (m_pCurrentTrack != nullptr) { + disconnect(m_pCurrentTrack.get(), nullptr, this, nullptr); } m_pCurrentTrack.reset(); - m_pCurrentTrack = pNewTrack; - m_waveformTexture = QImage(); emit trackChanged(); - emit trackLoading(); -} - -void QmlPlayerProxy::slotTrackChanged() { - emit artistChanged(); - emit titleChanged(); - emit albumChanged(); - emit albumArtistChanged(); - emit genreChanged(); - emit composerChanged(); - emit groupingChanged(); - emit yearChanged(); - emit trackNumberChanged(); - emit trackTotalChanged(); - emit commentChanged(); - emit keyTextChanged(); - emit colorChanged(); - emit coverArtUrlChanged(); - emit trackLocationUrlChanged(); -#ifdef __STEM__ - emit stemsChanged(); -#endif - - emit waveformLengthChanged(); - emit waveformTextureChanged(); - emit waveformTextureSizeChanged(); - emit waveformTextureStrideChanged(); + emit trackUnloaded(); } -void QmlPlayerProxy::slotWaveformChanged() { - emit waveformLengthChanged(); - emit waveformTextureSizeChanged(); - emit waveformTextureStrideChanged(); - - const TrackPointer pTrack = m_pCurrentTrack; - if (!pTrack) { - return; - } - const ConstWaveformPointer pWaveform = - pTrack->getWaveform(); - if (!pWaveform) { - return; - } - const int textureWidth = pWaveform->getTextureStride(); - const int textureHeight = pWaveform->getTextureSize() / pWaveform->getTextureStride(); - - const WaveformData* data = pWaveform->data(); - // Make a copy of the waveform data, stripping the stems portion. Note that the datasize is - // different from the texture size -- we want the full texture size so the upload works. See - // m_data in waveform/waveform.h. - m_waveformData.resize(pWaveform->getTextureSize()); - for (int i = 0; i < pWaveform->getDataSize(); i++) { - m_waveformData[i] = data[i].filtered; - } - - m_waveformTexture = - QImage(reinterpret_cast(m_waveformData.data()), - textureWidth, - textureHeight, - QImage::Format_RGBA8888); - DEBUG_ASSERT(!m_waveformTexture.isNull()); - emit waveformTextureChanged(); -} - -void QmlPlayerProxy::slotBeatsChanged() { - VERIFY_OR_DEBUG_ASSERT(m_pBeatsModel != nullptr) { - return; - } - - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack) { - const auto trackEndPosition = mixxx::audio::FramePos{ - pTrack->getDuration() * pTrack->getSampleRate()}; - const auto pBeats = pTrack->getBeats(); - m_pBeatsModel->setBeats(pBeats, trackEndPosition); - } else { - m_pBeatsModel->setBeats(nullptr, audio::kStartFramePos); - } +QmlTrackProxy* QmlPlayerProxy::currentTrack() { + auto* pTrack = new QmlTrackProxy(m_pCurrentTrack, this); + QQmlEngine::setObjectOwnership(pTrack, QQmlEngine::JavaScriptOwnership); + return pTrack; } -#ifdef __STEM__ -void QmlPlayerProxy::slotStemsChanged() { - VERIFY_OR_DEBUG_ASSERT(m_pStemsModel != nullptr) { - return; - } - - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack) { - m_pStemsModel->setStems(pTrack->getStemInfo()); - emit stemsChanged(); - } -} -#endif - -void QmlPlayerProxy::slotHotcuesChanged() { - VERIFY_OR_DEBUG_ASSERT(m_pHotcuesModel != nullptr) { +void QmlPlayerProxy::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) { + if (pNewTrack.get() == m_pCurrentTrack.get()) { + emit trackLoading(); return; } - QList hotcues; - - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack) { - const auto& cuePoints = pTrack->getCuePoints(); - for (const auto& cuePoint : cuePoints) { - if (cuePoint->getHotCue() == Cue::kNoHotCue) - continue; - hotcues.append(cuePoint); - } + if (m_pCurrentTrack != nullptr) { + disconnect(m_pCurrentTrack.get(), nullptr, this, nullptr); } - m_pHotcuesModel->setCues(hotcues); - emit cuesChanged(); -} - -int QmlPlayerProxy::getWaveformLength() const { - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack) { - const ConstWaveformPointer pWaveform = pTrack->getWaveform(); - if (pWaveform) { - return pWaveform->getDataSize(); - } - } - return 0; -} - -QString QmlPlayerProxy::getWaveformTexture() const { - if (m_waveformTexture.isNull()) { - return QString(); - } - QByteArray byteArray; - QBuffer buffer(&byteArray); - buffer.open(QIODevice::WriteOnly); - m_waveformTexture.save(&buffer, "png"); - - QString imageData = QString::fromLatin1(byteArray.toBase64().data()); - if (imageData.isEmpty()) { - return QString(); - } - - return QStringLiteral("data:image/png;base64,") + imageData; -} - -int QmlPlayerProxy::getWaveformTextureSize() const { - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack) { - const ConstWaveformPointer pWaveform = pTrack->getWaveform(); - if (pWaveform) { - return pWaveform->getTextureSize(); - } - } - return 0; -} - -int QmlPlayerProxy::getWaveformTextureStride() const { - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack) { - const ConstWaveformPointer pWaveform = pTrack->getWaveform(); - if (pWaveform) { - return pWaveform->getTextureStride(); - } - } - return 0; + m_pCurrentTrack = pNewTrack; + emit trackChanged(); + emit trackLoading(); } bool QmlPlayerProxy::isLoaded() const { return m_pCurrentTrack != nullptr; } -PROPERTY_IMPL(QString, artist, getArtist, setArtist) -PROPERTY_IMPL(QString, title, getTitle, setTitle) -PROPERTY_IMPL(QString, album, getAlbum, setAlbum) -PROPERTY_IMPL(QString, albumArtist, getAlbumArtist, setAlbumArtist) -PROPERTY_IMPL_GETTER(QString, genre, getGenre) -PROPERTY_IMPL(QString, composer, getComposer, setComposer) -PROPERTY_IMPL(QString, grouping, getGrouping, setGrouping) -PROPERTY_IMPL(QString, year, getYear, setYear) -PROPERTY_IMPL(QString, trackNumber, getTrackNumber, setTrackNumber) -PROPERTY_IMPL(QString, trackTotal, getTrackTotal, setTrackTotal) -PROPERTY_IMPL(QString, comment, getComment, setComment) -PROPERTY_IMPL(QString, keyText, getKeyText, setKeyText) - -QColor QmlPlayerProxy::getColor() const { - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack == nullptr) { - return QColor(); - } - return RgbColor::toQColor(pTrack->getColor()); -} - -void QmlPlayerProxy::setColor(const QColor& value) { - const TrackPointer pTrack = m_pTrackPlayer->getLoadedTrack(); - if (pTrack != nullptr) { - std::optional color = RgbColor::fromQColor(value); - pTrack->setColor(color); - } -} - -QUrl QmlPlayerProxy::getCoverArtUrl() const { - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack == nullptr) { - return QUrl(); - } - - const CoverInfo coverInfo = pTrack->getCoverInfoWithLocation(); - return AsyncImageProvider::trackLocationToCoverArtUrl(coverInfo.trackLocation); -} - -QUrl QmlPlayerProxy::getTrackLocationUrl() const { - const TrackPointer pTrack = m_pCurrentTrack; - if (pTrack == nullptr) { - return QUrl(); - } - - return QUrl::fromLocalFile(pTrack->getLocation()); -} - } // namespace qml } // namespace mixxx diff --git a/src/qml/qmlplayerproxy.h b/src/qml/qmlplayerproxy.h index 54f42bb9c9a3..538639bdb0fa 100644 --- a/src/qml/qmlplayerproxy.h +++ b/src/qml/qmlplayerproxy.h @@ -7,115 +7,36 @@ #include #include "mixer/basetrackplayer.h" -#include "qml/qmlbeatsmodel.h" -#include "qml/qmlcuesmodel.h" -#include "qml/qmlstemsmodel.h" -#include "track/cueinfo.h" -#include "track/track.h" -#include "waveform/waveform.h" +#include "qmltrackproxy.h" +#include "track/track_decl.h" namespace mixxx { namespace qml { class QmlPlayerProxy : public QObject { Q_OBJECT + Q_PROPERTY(QmlTrackProxy* currentTrack READ currentTrack NOTIFY trackChanged) Q_PROPERTY(bool isLoaded READ isLoaded NOTIFY trackChanged) - Q_PROPERTY(QString artist READ getArtist WRITE setArtist NOTIFY artistChanged) - Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged) - Q_PROPERTY(QString album READ getAlbum WRITE setAlbum NOTIFY albumChanged) - Q_PROPERTY(QString albumArtist READ getAlbumArtist WRITE setAlbumArtist - NOTIFY albumArtistChanged) - Q_PROPERTY(QString genre READ getGenre STORED false NOTIFY genreChanged) - Q_PROPERTY(QString composer READ getComposer WRITE setComposer NOTIFY composerChanged) - Q_PROPERTY(QString grouping READ getGrouping WRITE setGrouping NOTIFY groupingChanged) - Q_PROPERTY(QString year READ getYear WRITE setYear NOTIFY yearChanged) - Q_PROPERTY(QString trackNumber READ getTrackNumber WRITE setTrackNumber - NOTIFY trackNumberChanged) - Q_PROPERTY(QString trackTotal READ getTrackTotal WRITE setTrackTotal NOTIFY trackTotalChanged) - Q_PROPERTY(QString comment READ getComment WRITE setComment NOTIFY commentChanged) - Q_PROPERTY(QString keyText READ getKeyText WRITE setKeyText NOTIFY keyTextChanged) - Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged) - Q_PROPERTY(QUrl coverArtUrl READ getCoverArtUrl NOTIFY coverArtUrlChanged) - Q_PROPERTY(QUrl trackLocationUrl READ getTrackLocationUrl NOTIFY trackLocationUrlChanged) QML_NAMED_ELEMENT(Player) QML_UNCREATABLE("Only accessible via Mixxx.PlayerManager.getPlayer(group)") - Q_PROPERTY(int waveformLength READ getWaveformLength NOTIFY waveformLengthChanged) - Q_PROPERTY(QString waveformTexture READ getWaveformTexture NOTIFY waveformTextureChanged) - Q_PROPERTY(int waveformTextureSize READ getWaveformTextureSize NOTIFY - waveformTextureSizeChanged) - Q_PROPERTY(int waveformTextureStride READ getWaveformTextureStride NOTIFY - waveformTextureStrideChanged) - - Q_PROPERTY(mixxx::qml::QmlBeatsModel* beatsModel MEMBER m_pBeatsModel CONSTANT); - Q_PROPERTY(mixxx::qml::QmlCuesModel* hotcuesModel MEMBER m_pHotcuesModel CONSTANT); -#ifdef __STEM__ - Q_PROPERTY(mixxx::qml::QmlStemsModel* stemsModel READ getStemsModel CONSTANT); -#endif - public: explicit QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent = nullptr); bool isLoaded() const; - QString getTrack() const; - QString getTitle() const; - QString getArtist() const; - QString getAlbum() const; - QString getAlbumArtist() const; - QString getGenre() const; - QString getComposer() const; - QString getGrouping() const; - QString getYear() const; - QString getTrackNumber() const; - QString getTrackTotal() const; - QString getComment() const; - QString getKeyText() const; - QColor getColor() const; - QUrl getCoverArtUrl() const; - QUrl getTrackLocationUrl() const; - - int getWaveformLength() const; - QString getWaveformTexture() const; - int getWaveformTextureSize() const; - int getWaveformTextureStride() const; - /// Needed for interacting with the raw track player object. BaseTrackPlayer* internalTrackPlayer() const { return m_pTrackPlayer; } + Q_INVOKABLE void loadTrack(mixxx::qml::QmlTrackProxy* track, bool play = false); Q_INVOKABLE void loadTrackFromLocation(const QString& trackLocation, bool play = false); Q_INVOKABLE void loadTrackFromLocationUrl(const QUrl& trackLocationUrl, bool play = false); -#ifdef __STEM__ - QmlStemsModel* getStemsModel() const { - return m_pStemsModel.get(); - } -#endif - public slots: void slotTrackLoaded(TrackPointer pTrack); + void slotTrackUnloaded(TrackPointer pOldTrack); void slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack); - void slotTrackChanged(); - void slotWaveformChanged(); - void slotBeatsChanged(); - void slotHotcuesChanged(); -#ifdef __STEM__ - void slotStemsChanged(); -#endif - - void setArtist(const QString& artist); - void setTitle(const QString& title); - void setAlbum(const QString& album); - void setAlbumArtist(const QString& albumArtist); - void setComposer(const QString& composer); - void setGrouping(const QString& grouping); - void setYear(const QString& year); - void setTrackNumber(const QString& trackNumber); - void setTrackTotal(const QString& trackTotal); - void setComment(const QString& comment); - void setKeyText(const QString& keyText); - void setColor(const QColor& color); signals: void trackLoading(); @@ -124,43 +45,18 @@ class QmlPlayerProxy : public QObject { void trackChanged(); void cloneFromGroup(const QString& group); - void albumChanged(); - void titleChanged(); - void artistChanged(); - void albumArtistChanged(); - void genreChanged(); - void composerChanged(); - void groupingChanged(); - void yearChanged(); - void trackNumberChanged(); - void trackTotalChanged(); - void commentChanged(); - void keyTextChanged(); - void colorChanged(); - void coverArtUrlChanged(); - void trackLocationUrlChanged(); - void cuesChanged(); + void loadTrackFromLocationRequested(const QString& trackLocation, bool play); + void loadTrackRequested(TrackPointer track, #ifdef __STEM__ - void stemsChanged(); + mixxx::StemChannelSelection stemSelection, #endif - - void loadTrackFromLocationRequested(const QString& trackLocation, bool play); - - void waveformLengthChanged(); - void waveformTextureChanged(); - void waveformTextureSizeChanged(); - void waveformTextureStrideChanged(); + bool play); private: - std::vector m_waveformData; - QImage m_waveformTexture; + QmlTrackProxy* currentTrack(); + QPointer m_pTrackPlayer; TrackPointer m_pCurrentTrack; - QmlBeatsModel* m_pBeatsModel; - QmlCuesModel* m_pHotcuesModel; -#ifdef __STEM__ - std::unique_ptr m_pStemsModel; -#endif }; } // namespace qml diff --git a/src/qml/qmltrackproxy.cpp b/src/qml/qmltrackproxy.cpp new file mode 100644 index 000000000000..61adb7af19b8 --- /dev/null +++ b/src/qml/qmltrackproxy.cpp @@ -0,0 +1,244 @@ +#include "qml/qmltrackproxy.h" + +#include + +#include "mixer/basetrackplayer.h" +#include "moc_qmltrackproxy.cpp" +#include "qml/asyncimageprovider.h" +#include "track/track.h" +#include "util/parented_ptr.h" + +#define PROPERTY_IMPL_GETTER(TYPE, NAME, GETTER) \ + TYPE QmlTrackProxy::GETTER() const { \ + const TrackPointer pTrack = m_pTrack; \ + if (pTrack == nullptr) { \ + return TYPE(); \ + } \ + return pTrack->GETTER(); \ + } + +#define PROPERTY_IMPL(TYPE, NAME, GETTER, SETTER) \ + PROPERTY_IMPL_GETTER(TYPE, NAME, GETTER) \ + void QmlTrackProxy::SETTER(const TYPE& value) { \ + const TrackPointer pTrack = m_pTrack; \ + if (pTrack != nullptr) { \ + pTrack->SETTER(value); \ + } \ + } + +namespace mixxx { +namespace qml { + +QmlTrackProxy::QmlTrackProxy(TrackPointer track, QObject* parent) + : QObject(parent), + m_pTrack(track), + m_pBeatsModel(make_parented(this)), + m_pHotcuesModel(make_parented(this)) +#ifdef __STEM__ + , + m_pStemsModel(make_parented(this)) +#endif +{ + if (m_pTrack == nullptr) { + return; + } + connect(m_pTrack.get(), + &Track::artistChanged, + this, + &QmlTrackProxy::artistChanged); + connect(m_pTrack.get(), + &Track::titleChanged, + this, + &QmlTrackProxy::titleChanged); + connect(m_pTrack.get(), + &Track::albumChanged, + this, + &QmlTrackProxy::albumChanged); + connect(m_pTrack.get(), + &Track::albumArtistChanged, + this, + &QmlTrackProxy::albumArtistChanged); + connect(m_pTrack.get(), + &Track::genreChanged, + this, + &QmlTrackProxy::genreChanged); + connect(m_pTrack.get(), + &Track::composerChanged, + this, + &QmlTrackProxy::composerChanged); + connect(m_pTrack.get(), + &Track::groupingChanged, + this, + &QmlTrackProxy::groupingChanged); + connect(m_pTrack.get(), + &Track::yearChanged, + this, + &QmlTrackProxy::yearChanged); + connect(m_pTrack.get(), + &Track::trackNumberChanged, + this, + &QmlTrackProxy::trackNumberChanged); + connect(m_pTrack.get(), + &Track::trackTotalChanged, + this, + &QmlTrackProxy::trackTotalChanged); + connect(m_pTrack.get(), + &Track::commentChanged, + this, + &QmlTrackProxy::commentChanged); + connect(m_pTrack.get(), + &Track::keyChanged, + this, + &QmlTrackProxy::keyTextChanged); + connect(m_pTrack.get(), + &Track::colorUpdated, + this, + &QmlTrackProxy::colorChanged); + connect(m_pTrack.get(), + &Track::beatsUpdated, + this, + &QmlTrackProxy::slotBeatsChanged); + connect(m_pTrack.get(), + &Track::cuesUpdated, + this, + &QmlTrackProxy::slotHotcuesChanged); + connect(m_pTrack.get(), + &Track::durationChanged, + this, + &QmlTrackProxy::durationChanged); +#ifdef __STEM__ + connect(m_pTrack.get(), + &Track::stemsUpdated, + this, + &QmlTrackProxy::slotStemsChanged); +#endif + slotBeatsChanged(); + slotHotcuesChanged(); +#ifdef __STEM__ + slotStemsChanged(); +#endif +} + +void QmlTrackProxy::slotBeatsChanged() { + VERIFY_OR_DEBUG_ASSERT(m_pBeatsModel) { + return; + } + + const TrackPointer pTrack = m_pTrack; + if (pTrack) { + const auto trackEndPosition = mixxx::audio::FramePos{ + pTrack->getDuration() * pTrack->getSampleRate()}; + const auto pBeats = pTrack->getBeats(); + m_pBeatsModel->setBeats(pBeats, trackEndPosition); + } else { + m_pBeatsModel->setBeats(nullptr, audio::kStartFramePos); + } +} + +#ifdef __STEM__ +void QmlTrackProxy::slotStemsChanged() { + VERIFY_OR_DEBUG_ASSERT(m_pStemsModel) { + return; + } + + if (m_pTrack) { + m_pStemsModel->setStems(m_pTrack->getStemInfo()); + emit stemsChanged(); + } +} +#endif + +void QmlTrackProxy::slotHotcuesChanged() { + VERIFY_OR_DEBUG_ASSERT(m_pHotcuesModel) { + return; + } + + QList hotcues; + + if (m_pTrack) { + const auto& cuePoints = m_pTrack->getCuePoints(); + for (const auto& cuePoint : cuePoints) { + if (cuePoint->getHotCue() == Cue::kNoHotCue) { + continue; + } + hotcues.append(cuePoint); + } + } + m_pHotcuesModel->setCues(hotcues); + emit cuesChanged(); +} + +PROPERTY_IMPL(QString, artist, getArtist, setArtist) +PROPERTY_IMPL(QString, title, getTitle, setTitle) +PROPERTY_IMPL(QString, album, getAlbum, setAlbum) +PROPERTY_IMPL(QString, albumArtist, getAlbumArtist, setAlbumArtist) +PROPERTY_IMPL_GETTER(QString, genre, getGenre) +PROPERTY_IMPL(QString, composer, getComposer, setComposer) +PROPERTY_IMPL(QString, grouping, getGrouping, setGrouping) +PROPERTY_IMPL(QString, year, getYear, setYear) +PROPERTY_IMPL(QString, trackNumber, getTrackNumber, setTrackNumber) +PROPERTY_IMPL(QString, trackTotal, getTrackTotal, setTrackTotal) +PROPERTY_IMPL(QString, comment, getComment, setComment) +PROPERTY_IMPL(QString, keyText, getKeyText, setKeyText) + +QColor QmlTrackProxy::getColor() const { + if (m_pTrack == nullptr) { + return QColor(); + } + return RgbColor::toQColor(m_pTrack->getColor()); +} + +double QmlTrackProxy::getDuration() const { + if (m_pTrack == nullptr) { + return -1; + } + return m_pTrack->getDuration(); +} + +int QmlTrackProxy::getSampleRate() const { + if (m_pTrack == nullptr) { + return 0; + } + return m_pTrack->getSampleRate(); +} + +void QmlTrackProxy::setColor(const QColor& value) { + if (m_pTrack) { + std::optional color = RgbColor::fromQColor(value); + m_pTrack->setColor(color); + } +} + +int QmlTrackProxy::getStars() const { + if (m_pTrack == nullptr) { + return -1; + } + return m_pTrack->getRating(); +} + +void QmlTrackProxy::setStars(int value) { + if (m_pTrack && value <= mixxx::TrackRecord::kMaxRating && + value >= mixxx::TrackRecord::kMinRating) { + m_pTrack->setRating(value); + } +} + +QUrl QmlTrackProxy::getCoverArtUrl() const { + if (m_pTrack == nullptr) { + return QUrl(); + } + + const CoverInfo coverInfo = m_pTrack->getCoverInfoWithLocation(); + return AsyncImageProvider::trackLocationToCoverArtUrl(coverInfo.trackLocation); +} + +QUrl QmlTrackProxy::getTrackLocationUrl() const { + if (m_pTrack == nullptr) { + return QUrl(); + } + + return QUrl::fromLocalFile(m_pTrack->getLocation()); +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmltrackproxy.h b/src/qml/qmltrackproxy.h new file mode 100644 index 000000000000..8b0e292d355c --- /dev/null +++ b/src/qml/qmltrackproxy.h @@ -0,0 +1,148 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include + +#include "mixer/basetrackplayer.h" +#include "qml/qmlbeatsmodel.h" +#include "qml/qmlcuesmodel.h" +#include "qml/qmlstemsmodel.h" +#include "track/track_decl.h" +#include "util/parented_ptr.h" + +namespace mixxx { +namespace qml { + +class QmlTrackProxy : public QObject { + Q_OBJECT + + Q_PROPERTY(QString artist READ getArtist WRITE setArtist NOTIFY artistChanged) + Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged) + Q_PROPERTY(QString album READ getAlbum WRITE setAlbum NOTIFY albumChanged) + Q_PROPERTY(QString albumArtist READ getAlbumArtist WRITE setAlbumArtist + NOTIFY albumArtistChanged) + Q_PROPERTY(QString genre READ getGenre STORED false NOTIFY genreChanged) + Q_PROPERTY(QString composer READ getComposer WRITE setComposer NOTIFY composerChanged) + Q_PROPERTY(QString grouping READ getGrouping WRITE setGrouping NOTIFY groupingChanged) + Q_PROPERTY(int stars READ getStars WRITE setStars NOTIFY starsChanged) + Q_PROPERTY(QString year READ getYear WRITE setYear NOTIFY yearChanged) + Q_PROPERTY(QString trackNumber READ getTrackNumber WRITE setTrackNumber + NOTIFY trackNumberChanged) + Q_PROPERTY(QString trackTotal READ getTrackTotal WRITE setTrackTotal NOTIFY trackTotalChanged) + Q_PROPERTY(QString comment READ getComment WRITE setComment NOTIFY commentChanged) + Q_PROPERTY(QString keyText READ getKeyText WRITE setKeyText NOTIFY keyTextChanged) + Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged) + Q_PROPERTY(double duration READ getDuration NOTIFY durationChanged) + Q_PROPERTY(int sampleRate READ getSampleRate NOTIFY sampleRateChanged) + Q_PROPERTY(QUrl coverArtUrl READ getCoverArtUrl NOTIFY coverArtUrlChanged) + Q_PROPERTY(QUrl trackLocationUrl READ getTrackLocationUrl NOTIFY trackLocationUrlChanged) + + Q_PROPERTY(mixxx::qml::QmlBeatsModel* beatsModel READ getBeatsModel CONSTANT); + Q_PROPERTY(mixxx::qml::QmlCuesModel* hotcuesModel READ getCuesModel CONSTANT); +#ifdef __STEM__ + Q_PROPERTY(mixxx::qml::QmlStemsModel* stemsModel READ getStemsModel CONSTANT); +#endif + + QML_NAMED_ELEMENT(Track) + QML_UNCREATABLE("Only accessible via Mixxx.PlayerManager and Mixxx.Library") + public: + explicit QmlTrackProxy(TrackPointer track, QObject* parent = nullptr); + + QString getTrack() const; + QString getTitle() const; + QString getArtist() const; + QString getAlbum() const; + QString getAlbumArtist() const; + QString getGenre() const; + QString getComposer() const; + QString getGrouping() const; + QString getYear() const; + int getStars() const; + QString getTrackNumber() const; + QString getTrackTotal() const; + QString getComment() const; + QString getKeyText() const; + QColor getColor() const; + double getDuration() const; + int getSampleRate() const; + QUrl getCoverArtUrl() const; + QUrl getTrackLocationUrl() const; + + QmlBeatsModel* getBeatsModel() const { + return m_pBeatsModel.get(); + } + + QmlCuesModel* getCuesModel() const { + return m_pHotcuesModel.get(); + } + +#ifdef __STEM__ + QmlStemsModel* getStemsModel() const { + return m_pStemsModel.get(); + } +#endif + + TrackPointer internal() const { + return m_pTrack; + } + + public slots: + void slotBeatsChanged(); + void slotHotcuesChanged(); +#ifdef __STEM__ + void slotStemsChanged(); +#endif + + void setArtist(const QString& artist); + void setTitle(const QString& title); + void setAlbum(const QString& album); + void setAlbumArtist(const QString& albumArtist); + void setComposer(const QString& composer); + void setGrouping(const QString& grouping); + void setStars(int stars); + void setYear(const QString& year); + void setTrackNumber(const QString& trackNumber); + void setTrackTotal(const QString& trackTotal); + void setComment(const QString& comment); + void setKeyText(const QString& keyText); + void setColor(const QColor& color); + + signals: + void albumChanged(); + void titleChanged(); + void artistChanged(); + void albumArtistChanged(); + void genreChanged(); + void composerChanged(); + void groupingChanged(); + void starsChanged(); + void yearChanged(); + void trackNumberChanged(); + void trackTotalChanged(); + void commentChanged(); + void keyTextChanged(); + void colorChanged(); + void durationChanged(); + void sampleRateChanged(); + void coverArtUrlChanged(); + void trackLocationUrlChanged(); + void cuesChanged(); +#ifdef __STEM__ + void stemsChanged(); +#endif + + private: + TrackPointer m_pTrack; + parented_ptr m_pBeatsModel; + parented_ptr m_pHotcuesModel; +#ifdef __STEM__ + parented_ptr m_pStemsModel; +#endif +}; + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmlwaveformoverview.cpp b/src/qml/qmlwaveformoverview.cpp index 54d2d1051ca2..133f627ed637 100644 --- a/src/qml/qmlwaveformoverview.cpp +++ b/src/qml/qmlwaveformoverview.cpp @@ -1,7 +1,9 @@ #include "qml/qmlwaveformoverview.h" -#include "mixer/basetrackplayer.h" #include "moc_qmlwaveformoverview.cpp" +#include "qmlplayerproxy.h" +#include "qmltrackproxy.h" +#include "track/track.h" namespace { constexpr double kDesiredChannelHeight = 255; @@ -12,7 +14,7 @@ namespace qml { QmlWaveformOverview::QmlWaveformOverview(QQuickItem* parent) : QQuickPaintedItem(parent), - m_pPlayer(nullptr), + m_pTrack(nullptr), m_channels(ChannelFlag::BothChannels), m_renderer(Renderer::RGB), m_colorHigh(0xFF0000), @@ -20,39 +22,28 @@ QmlWaveformOverview::QmlWaveformOverview(QQuickItem* parent) m_colorLow(0x0000FF) { } -QmlPlayerProxy* QmlWaveformOverview::getPlayer() const { - return m_pPlayer; +QmlTrackProxy* QmlWaveformOverview::getTrack() const { + return m_pTrack; } -void QmlWaveformOverview::setPlayer(QmlPlayerProxy* pPlayer) { - if (m_pPlayer == pPlayer) { +void QmlWaveformOverview::setTrack(QmlTrackProxy* pTrack) { + if (m_pTrack == pTrack) { return; } - if (m_pPlayer != nullptr) { - m_pPlayer->internalTrackPlayer()->disconnect(this); + if (m_pTrack != nullptr && m_pTrack->internal() != nullptr) { + m_pTrack->internal()->disconnect(this); } - m_pPlayer = pPlayer; + m_pTrack = pTrack; - if (m_pPlayer != nullptr) { - setCurrentTrack(m_pPlayer->internalTrackPlayer()->getLoadedTrack()); - connect(m_pPlayer->internalTrackPlayer(), - &BaseTrackPlayer::newTrackLoaded, - this, - &QmlWaveformOverview::slotTrackLoaded); - connect(m_pPlayer->internalTrackPlayer(), - &BaseTrackPlayer::loadingTrack, - this, - &QmlWaveformOverview::slotTrackLoading); - connect(m_pPlayer->internalTrackPlayer(), - &BaseTrackPlayer::playerEmpty, + if (m_pTrack != nullptr && pTrack->internal() != nullptr) { + connect(pTrack->internal().get(), + &Track::waveformSummaryUpdated, this, - &QmlWaveformOverview::slotTrackUnloaded); + &QmlWaveformOverview::slotWaveformUpdated); } - - emit playerChanged(); - update(); + slotWaveformUpdated(); } QmlWaveformOverview::Channels QmlWaveformOverview::getChannels() const { @@ -68,49 +59,15 @@ void QmlWaveformOverview::setChannels(QmlWaveformOverview::Channels channels) { emit channelsChanged(channels); } -void QmlWaveformOverview::slotTrackLoaded(TrackPointer pTrack) { - // TODO: Investigate if it's a bug that this debug assertion fails when - // passing tracks on the command line - // DEBUG_ASSERT(m_pCurrentTrack == pTrack); - setCurrentTrack(pTrack); -} - -void QmlWaveformOverview::slotTrackLoading(TrackPointer pNewTrack, TrackPointer pOldTrack) { - Q_UNUSED(pOldTrack); // only used in DEBUG_ASSERT - DEBUG_ASSERT(m_pCurrentTrack == pOldTrack); - setCurrentTrack(pNewTrack); -} - -void QmlWaveformOverview::slotTrackUnloaded() { - setCurrentTrack(nullptr); -} - -void QmlWaveformOverview::setCurrentTrack(TrackPointer pTrack) { - // TODO: Check if this is actually possible - if (m_pCurrentTrack == pTrack) { - return; - } - - if (m_pCurrentTrack != nullptr) { - disconnect(m_pCurrentTrack.get(), nullptr, this, nullptr); - } - - m_pCurrentTrack = pTrack; - if (pTrack != nullptr) { - connect(pTrack.get(), - &Track::waveformSummaryUpdated, - this, - &QmlWaveformOverview::slotWaveformUpdated); - } - slotWaveformUpdated(); -} - void QmlWaveformOverview::slotWaveformUpdated() { update(); } void QmlWaveformOverview::paint(QPainter* pPainter) { - TrackPointer pTrack = m_pCurrentTrack; + if (!m_pTrack) { + return; + } + TrackPointer pTrack = m_pTrack->internal(); if (!pTrack) { return; } diff --git a/src/qml/qmlwaveformoverview.h b/src/qml/qmlwaveformoverview.h index 4b51bb83747d..1b3ebe745095 100644 --- a/src/qml/qmlwaveformoverview.h +++ b/src/qml/qmlwaveformoverview.h @@ -6,18 +6,17 @@ #include #include -#include "qml/qmlplayerproxy.h" -#include "track/track.h" +#include "qmlplayerproxy.h" +#include "waveform/waveform.h" namespace mixxx { namespace qml { - class QmlWaveformOverview : public QQuickPaintedItem { Q_OBJECT Q_FLAGS(Channels) - Q_PROPERTY(mixxx::qml::QmlPlayerProxy* player READ getPlayer WRITE setPlayer - NOTIFY playerChanged REQUIRED) + Q_PROPERTY(mixxx::qml::QmlTrackProxy* track READ getTrack WRITE setTrack + NOTIFY trackChanged REQUIRED) Q_PROPERTY(Channels channels READ getChannels WRITE setChannels NOTIFY channelsChanged) Q_PROPERTY(Renderer renderer MEMBER m_renderer NOTIFY rendererChanged) Q_PROPERTY(QColor colorHigh MEMBER m_colorHigh NOTIFY colorHighChanged) @@ -44,19 +43,16 @@ class QmlWaveformOverview : public QQuickPaintedItem { void paint(QPainter* painter) override; - void setPlayer(QmlPlayerProxy* player); - QmlPlayerProxy* getPlayer() const; + void setTrack(QmlTrackProxy* track); + QmlTrackProxy* getTrack() const; void setChannels(Channels channels); Channels getChannels() const; private slots: - void slotTrackLoaded(TrackPointer pLoadedTrack); - void slotTrackLoading(TrackPointer pNewTrack, TrackPointer pOldTrack); - void slotTrackUnloaded(); void slotWaveformUpdated(); signals: - void playerChanged(); + void trackChanged(); void channelsChanged(mixxx::qml::QmlWaveformOverview::Channels channels); #if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) void rendererChanged(Renderer renderer); @@ -68,7 +64,6 @@ class QmlWaveformOverview : public QQuickPaintedItem { void colorLowChanged(const QColor& color); private: - void setCurrentTrack(TrackPointer pTrack); void drawFiltered(QPainter* pPainter, Channels channels, ConstWaveformPointer pWaveform, @@ -78,9 +73,7 @@ class QmlWaveformOverview : public QQuickPaintedItem { ConstWaveformPointer pWaveform, int completion) const; QColor getRgbPenColor(ConstWaveformPointer pWaveform, int completion) const; - - QPointer m_pPlayer; - TrackPointer m_pCurrentTrack; + QmlTrackProxy* m_pTrack; Channels m_channels; Renderer m_renderer; QColor m_colorHigh; diff --git a/src/test/controller_mapping_validation_test.cpp b/src/test/controller_mapping_validation_test.cpp index 1b2d7b37d72d..2b886449412a 100644 --- a/src/test/controller_mapping_validation_test.cpp +++ b/src/test/controller_mapping_validation_test.cpp @@ -7,6 +7,7 @@ #include "controllers/defs_controllers.h" #include "controllers/scripting/legacy/controllerscriptenginelegacy.h" +#include "track/track.h" #ifdef MIXXX_USE_QML #include "effects/effectsmanager.h" #include "engine/channelhandle.h" From ffbf0bc1b130cbe3efc78f29f9a1e74c363c2ad8 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Thu, 22 May 2025 17:04:57 +0000 Subject: [PATCH 050/163] fix: prevent unnecessary needed restart popup --- src/preferences/dialog/dlgprefinterface.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/preferences/dialog/dlgprefinterface.cpp b/src/preferences/dialog/dlgprefinterface.cpp index c025939a9857..f4e0c7841d70 100644 --- a/src/preferences/dialog/dlgprefinterface.cpp +++ b/src/preferences/dialog/dlgprefinterface.cpp @@ -219,11 +219,13 @@ DlgPrefInterface::DlgPrefInterface( m_pConfig->setValue(ConfigKey(kPreferencesGroup, kMultiSamplingKey), mixxx::preferences::MultiSamplingMode::Disabled); } + checkBoxForceHardwareAcceleration->setChecked(m_forceHardwareAcceleration); } else #endif { #ifdef MIXXX_USE_QML m_multiSampling = mixxx::preferences::MultiSamplingMode::Disabled; + m_forceHardwareAcceleration = false; #endif multiSamplingLabel->hide(); multiSamplingComboBox->hide(); From 38a400a0571a041b7b68055dcf55a38ff7d6ad4c Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Mon, 24 Mar 2025 02:06:14 +0000 Subject: [PATCH 051/163] feat: add more renderers on QML --- res/qml/WaveformDisplay.qml | 18 +- res/qml/WaveformRow.qml | 380 ------------------ res/qml/WaveformShader.qml | 88 ---- src/coreservices.cpp | 4 - src/qml/qmlwaveformdisplay.cpp | 51 ++- src/qml/qmlwaveformdisplay.h | 7 + src/qml/qmlwaveformrenderer.cpp | 158 ++++++-- src/qml/qmlwaveformrenderer.h | 125 +++++- .../allshader/waveformrendererendoftrack.cpp | 8 +- .../allshader/waveformrendererfiltered.cpp | 2 +- .../allshader/waveformrendererhsv.cpp | 6 +- .../allshader/waveformrendererrgb.cpp | 18 +- .../renderers/allshader/waveformrendererrgb.h | 6 - .../allshader/waveformrenderersignalbase.cpp | 29 +- .../allshader/waveformrenderersignalbase.h | 14 + .../allshader/waveformrenderersimple.cpp | 5 +- .../allshader/waveformrendererslipmode.cpp | 8 +- .../allshader/waveformrendererstem.cpp | 13 +- .../allshader/waveformrendermark.cpp | 10 +- src/waveform/renderers/waveformmark.cpp | 6 +- .../renderers/waveformrenderersignalbase.cpp | 68 ++-- .../renderers/waveformrenderersignalbase.h | 19 +- .../renderers/waveformwidgetrenderer.cpp | 33 +- .../renderers/waveformwidgetrenderer.h | 4 + src/waveform/visualplayposition.cpp | 4 +- src/waveform/visualplayposition.h | 2 +- 26 files changed, 467 insertions(+), 619 deletions(-) delete mode 100644 res/qml/WaveformRow.qml delete mode 100644 res/qml/WaveformShader.qml diff --git a/res/qml/WaveformDisplay.qml b/res/qml/WaveformDisplay.qml index bc3b74c59f68..cf38e312b13a 100644 --- a/res/qml/WaveformDisplay.qml +++ b/res/qml/WaveformDisplay.qml @@ -62,11 +62,11 @@ Item { } } - Mixxx.WaveformRendererRGB { + Mixxx.WaveformRendererFiltered { axesColor: '#a1a1a1a1' - lowColor: '#ff2154d7' - midColor: '#cfb26606' - highColor: '#e5029c5c' + lowColor: '#2154D7' + midColor: '#97632D' + highColor: '#D5C2A2' gainAll: 1.0 gainLow: 1.0 @@ -84,8 +84,8 @@ Item { } Mixxx.WaveformRendererMark { - playMarkerColor: 'cyan' - playMarkerBackground: 'orange' + playMarkerColor: '#D9D9D9' + playMarkerBackground: '#D9D9D9' defaultMark: Mixxx.WaveformMark { align: "bottom|right" color: "#00d9ff" @@ -243,10 +243,10 @@ Item { mouseStatus = WaveformDisplay.MouseStatus.Normal; } - onWheel: { - if (wheel.angleDelta.y < 0 && zoomControl.value > 1) { + onWheel: (mouse) => { + if (mouse.angleDelta.y < 0 && zoomControl.value > 1) { zoomControl.value -= 1; - } else if (wheel.angleDelta.y > 0 && zoomControl.value < 10.0) { + } else if (mouse.angleDelta.y > 0 && zoomControl.value < 10.0) { zoomControl.value += 1; } } diff --git a/res/qml/WaveformRow.qml b/res/qml/WaveformRow.qml deleted file mode 100644 index be129fc42bfa..000000000000 --- a/res/qml/WaveformRow.qml +++ /dev/null @@ -1,380 +0,0 @@ -import "." as Skin -import Mixxx 1.0 as Mixxx -import QtQuick 2.14 -import QtQuick.Shapes 1.12 -import "Theme" - -Item { - id: root - - enum MouseStatus { - Normal, - Bending, - Scratching - } - - property string group // required - property var deckPlayer: Mixxx.PlayerManager.getPlayer(group) - - Item { - id: waveformContainer - - property real duration: samplesControl.value / sampleRateControl.value - - anchors.fill: parent - clip: true - - Mixxx.ControlProxy { - id: samplesControl - - group: root.group - key: "track_samples" - } - - Mixxx.ControlProxy { - id: sampleRateControl - - group: root.group - key: "track_samplerate" - } - - Mixxx.ControlProxy { - id: playPositionControl - - group: root.group - key: "playposition" - } - - Mixxx.ControlProxy { - id: rateRatioControl - - group: root.group - key: "rate_ratio" - } - - Mixxx.ControlProxy { - id: zoomControl - - group: root.group - key: "waveform_zoom" - } - - Mixxx.ControlProxy { - id: introStartPosition - - group: root.group - key: "intro_start_position" - } - - Mixxx.ControlProxy { - id: introEndPosition - - group: root.group - key: "intro_end_position" - } - - Mixxx.ControlProxy { - id: outroStartPosition - - group: root.group - key: "outro_start_position" - } - - Mixxx.ControlProxy { - id: outroEndPosition - - group: root.group - key: "outro_end_position" - } - - Mixxx.ControlProxy { - id: loopStartPosition - - group: root.group - key: "loop_start_position" - } - - Mixxx.ControlProxy { - id: loopEndPosition - - group: root.group - key: "loop_end_position" - } - - Mixxx.ControlProxy { - id: loopEnabled - - group: root.group - key: "loop_enabled" - } - - Mixxx.ControlProxy { - id: mainCuePosition - - group: root.group - key: "cue_point" - } - - Item { - id: waveform - - property real effectiveZoomFactor: (1 / rateRatioControl.value) * (100 / zoomControl.value) - - width: waveformContainer.duration * effectiveZoomFactor - height: parent.height - x: playMarker.screenPosition * waveformContainer.width - playPositionControl.value * width - visible: root.deckPlayer.isLoaded - - WaveformShader { - group: root.group - anchors.fill: parent - } - - Shape { - id: preroll - - property real triangleHeight: waveform.height - property real triangleWidth: 0.25 * waveform.effectiveZoomFactor - property int numTriangles: Math.ceil(width / triangleWidth) - - anchors.top: waveform.top - anchors.right: waveform.left - width: Math.max(0, waveform.x) - height: waveform.height - - ShapePath { - strokeColor: Theme.waveformPrerollColor - strokeWidth: 1 - fillColor: "transparent" - - PathMultiline { - paths: { - let p = []; - for (let i = 0; i < preroll.numTriangles; i++) { - p.push([ - Qt.point(preroll.width - i * preroll.triangleWidth, preroll.triangleHeight / 2), - Qt.point(preroll.width - (i + 1) * preroll.triangleWidth, 0), - Qt.point(preroll.width - (i + 1) * preroll.triangleWidth, preroll.triangleHeight), - Qt.point(preroll.width - i * preroll.triangleWidth, preroll.triangleHeight / 2), - ]); - } - return p; - } - } - } - } - - Shape { - id: postroll - - property real triangleHeight: waveform.height - property real triangleWidth: 0.25 * waveform.effectiveZoomFactor - property int numTriangles: Math.ceil(width / triangleWidth) - - anchors.top: waveform.top - anchors.left: waveform.right - width: waveformContainer.width / 2 - height: waveform.height - - ShapePath { - strokeColor: Theme.waveformPostrollColor - strokeWidth: 1 - fillColor: "transparent" - - PathMultiline { - paths: { - let p = []; - for (let i = 0; i < postroll.numTriangles; i++) { - p.push([ - Qt.point(i * postroll.triangleWidth, postroll.triangleHeight / 2), - Qt.point((i + 1) * postroll.triangleWidth, 0), - Qt.point((i + 1) * postroll.triangleWidth, postroll.triangleHeight), - Qt.point(i * postroll.triangleWidth, postroll.triangleHeight / 2), - ]); - } - return p; - } - } - } - } - - Repeater { - model: root.deckPlayer.beatsModel - - Rectangle { - property real alpha: 0.9 // TODO: Make this configurable (i.e., "[Waveform],beatGridAlpha" config option) - - width: 1 - height: waveform.height - x: (framePosition * 2 / samplesControl.value) * waveform.width - color: Theme.waveformBeatColor - } - } - - Skin.WaveformIntroOutro { - id: intro - - visible: introStartPosition.value != -1 || introEndPosition.value != -1 - - height: waveform.height - x: ((introStartPosition.value != -1 ? introStartPosition.value : introEndPosition.value) / samplesControl.value) * waveform.width - width: introEndPosition.value == -1 ? 0 : ((introEndPosition.value - introStartPosition.value) / samplesControl.value) * waveform.width - } - - Skin.WaveformIntroOutro { - id: outro - - visible: outroStartPosition.value != -1 || outroEndPosition.value != -1 - isIntro: false - - height: waveform.height - x: ((outroStartPosition.value != -1 ? outroStartPosition.value : outroEndPosition.value) / samplesControl.value) * waveform.width - width: outroEndPosition.value == -1 || outroStartPosition.value == -1 ? 0 : ((outroEndPosition.value - outroStartPosition.value) / samplesControl.value) * waveform.width - } - - Skin.WaveformLoop { - id: loop - - visible: loopStartPosition.value != -1 && loopEndPosition.value != -1 - - height: waveform.height - x: (loopStartPosition.value / samplesControl.value) * waveform.width - width: ((loopEndPosition.value - loopStartPosition.value) / samplesControl.value) * waveform.width - enabled: loopEnabled.value - } - - Repeater { - model: root.deckPlayer.hotcuesModel - - Item { - id: cue - - required property int startPosition - required property int endPosition - required property string label - required property bool isLoop - required property int hotcueNumber - - Skin.WaveformHotcue { - group: root.group - hotcueNumber: cue.hotcueNumber + 1 - label: cue.label - isLoop: cue.isLoop - - x: (startPosition * 2 / samplesControl.value) * waveform.width - width: cue.isLoop ? ((endPosition - startPosition) * 2 / samplesControl.value) * waveform.width : null - height: waveform.height - } - } - } - - Skin.WaveformCue { - id: maincue - - height: waveform.height - x: (mainCuePosition.value / samplesControl.value) * waveform.width - } - } - } - - Shape { - id: playMarkerShape - - anchors.fill: parent - - ShapePath { - id: playMarker - - property real screenPosition: 0.5 - - startX: playMarkerShape.width * playMarker.screenPosition - startY: 0 - strokeColor: Theme.waveformCursorColor - strokeWidth: 1 - - PathLine { - id: marker - - x: playMarkerShape.width * playMarker.screenPosition - y: playMarkerShape.height - } - } - } - - Mixxx.ControlProxy { - id: scratchPositionEnableControl - - group: root.group - key: "scratch_position_enable" - } - - Mixxx.ControlProxy { - id: scratchPositionControl - - group: root.group - key: "scratch_position" - } - - Mixxx.ControlProxy { - id: wheelControl - - group: root.group - key: "wheel" - } - - MouseArea { - property int mouseStatus: WaveformRow.MouseStatus.Normal - property point mouseAnchor: Qt.point(0, 0) - - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - onPressed: { - mouseAnchor = Qt.point(mouse.x, mouse.y); - if (mouse.button == Qt.LeftButton) { - if (mouseStatus == WaveformRow.MouseStatus.Bending) - wheelControl.parameter = 0.5; - - mouseStatus = WaveformRow.MouseStatus.Scratching; - scratchPositionEnableControl.value = 1; - // TODO: Calculate position properly - scratchPositionControl.value = -mouse.x * waveform.effectiveZoomFactor * 2; - console.log(mouse.x); - } else { - if (mouseStatus == WaveformRow.MouseStatus.Scratching) - scratchPositionEnableControl.value = 0; - - wheelControl.parameter = 0.5; - mouseStatus = WaveformRow.MouseStatus.Bending; - } - } - onPositionChanged: { - switch (mouseStatus) { - case WaveformRow.MouseStatus.Bending: { - const diff = mouse.x - mouseAnchor.x; - // Start at the middle of [0.0, 1.0], and emit values based on how far - // the mouse has traveled horizontally. Note, for legacy (MIDI) reasons, - // this is tuned to 127. - const v = 0.5 + (diff / 1270); - // clamp to [0.0, 1.0] - wheelControl.parameter = Mixxx.MathUtils.clamp(v, 0, 1); - break; - }; - case WaveformRow.MouseStatus.Scratching: - // TODO: Calculate position properly - scratchPositionControl.value = -mouse.x * waveform.effectiveZoomFactor * 2; - break; - } - } - onReleased: { - switch (mouseStatus) { - case WaveformRow.MouseStatus.Bending: - wheelControl.parameter = 0.5; - break; - case WaveformRow.MouseStatus.Scratching: - scratchPositionEnableControl.value = 0; - break; - } - mouseStatus = WaveformRow.MouseStatus.Normal; - } - } -} diff --git a/res/qml/WaveformShader.qml b/res/qml/WaveformShader.qml deleted file mode 100644 index 33de4acde0cf..000000000000 --- a/res/qml/WaveformShader.qml +++ /dev/null @@ -1,88 +0,0 @@ -import Mixxx 1.0 as Mixxx -import QtQuick 2.12 - -ShaderEffect { - id: root - - property string group // required - property var deckPlayer: Mixxx.PlayerManager.getPlayer(group) - property size framebufferSize: Qt.size(width, height) - property int waveformLength: root.deckPlayer.waveformLength - property int textureSize: root.deckPlayer.waveformTextureSize - property int textureStride: root.deckPlayer.waveformTextureStride - property real firstVisualIndex: 1 - property real lastVisualIndex: root.deckPlayer.waveformLength / 2 - property color axesColor: "#FFFFFF" - property color highColor: "#0000FF" - property color midColor: "#00FF00" - property color lowColor: "#FF0000" - property real highGain: filterWaveformEnableControl.value ? (filterHighKillControl.value ? 0 : filterHighControl.value) : 1 - property real midGain: filterWaveformEnableControl.value ? (filterMidKillControl.value ? 0 : filterMidControl.value) : 1 - property real lowGain: filterWaveformEnableControl.value ? (filterLowKillControl.value ? 0 : filterLowControl.value) : 1 - property real allGain: pregainControl.value - property Image waveformTexture - - fragmentShader: "qrc:/shaders/rgbsignal_qml.frag.qsb" - - Mixxx.ControlProxy { - id: pregainControl - - group: root.group - key: "pregain" - } - - Mixxx.ControlProxy { - id: filterWaveformEnableControl - - group: root.group - key: "filterWaveformEnable" - } - - Mixxx.ControlProxy { - id: filterHighControl - - group: "[EqualizerRack1_" + root.group + "_Effect1]" - key: "parameter3" - } - - Mixxx.ControlProxy { - id: filterHighKillControl - - group: "[EqualizerRack1_" + root.group + "_Effect1]" - key: "button_parameter3" - } - - Mixxx.ControlProxy { - id: filterMidControl - - group: "[EqualizerRack1_" + root.group + "_Effect1]" - key: "parameter2" - } - - Mixxx.ControlProxy { - id: filterMidKillControl - - group: "[EqualizerRack1_" + root.group + "_Effect1]" - key: "button_parameter2" - } - - Mixxx.ControlProxy { - id: filterLowControl - - group: "[EqualizerRack1_" + root.group + "_Effect1]" - key: "parameter1" - } - - Mixxx.ControlProxy { - id: filterLowKillControl - - group: "[EqualizerRack1_" + root.group + "_Effect1]" - key: "button_parameter1" - } - - waveformTexture: Image { - visible: false - layer.enabled: false - source: root.deckPlayer.waveformTexture - } -} diff --git a/src/coreservices.cpp b/src/coreservices.cpp index c9d404c7b46f..040b9dad15b9 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -40,13 +40,9 @@ #include "controllers/scripting/controllerscriptenginebase.h" #include "qml/qmlconfigproxy.h" -#include "qml/qmlcontrolproxy.h" -#include "qml/qmldlgpreferencesproxy.h" -#include "qml/qmleffectslotproxy.h" #include "qml/qmleffectsmanagerproxy.h" #include "qml/qmllibraryproxy.h" #include "qml/qmlplayermanagerproxy.h" -#include "qml/qmlplayerproxy.h" #endif #include "soundio/soundmanager.h" #include "sources/soundsourceproxy.h" diff --git a/src/qml/qmlwaveformdisplay.cpp b/src/qml/qmlwaveformdisplay.cpp index 06d78d31bdfc..0bfed42eea8c 100644 --- a/src/qml/qmlwaveformdisplay.cpp +++ b/src/qml/qmlwaveformdisplay.cpp @@ -87,6 +87,7 @@ void QmlWaveformDisplay::geometryChange(const QRectF& newGeometry, const QRectF& QSGNode* QmlWaveformDisplay::updatePaintNode(QSGNode* node, UpdatePaintNodeData*) { if (m_dirtyFlag.testFlag(DirtyFlag::Window)) { delete node; + node = nullptr; m_dirtyFlag.setFlag(DirtyFlag::Window, false); } @@ -245,7 +246,55 @@ void QmlWaveformDisplay::slotWaveformUpdated() { } QQmlListProperty QmlWaveformDisplay::renderers() { - return {this, &m_waveformRenderers}; + return {this, + nullptr, + &QmlWaveformDisplay::renderers_append, + &QmlWaveformDisplay::renderers_count, + &QmlWaveformDisplay::renderers_at, + &QmlWaveformDisplay::renderers_clear}; +} + +// Static +void QmlWaveformDisplay::renderers_append( + QQmlListProperty* pList, + QmlWaveformRendererFactory* value) { + QmlWaveformDisplay* pWaveform = static_cast(pList->object); + VERIFY_OR_DEBUG_ASSERT(pWaveform) { + return; + } + pWaveform->m_dirtyFlag.setFlag(DirtyFlag::Window, true); + pWaveform->m_waveformRenderers.append(value); +} + +// Static +qsizetype QmlWaveformDisplay::renderers_count(QQmlListProperty* pList) { + QmlWaveformDisplay* pWaveform = static_cast(pList->object); + VERIFY_OR_DEBUG_ASSERT(pWaveform) { + return 0; + } + pWaveform->m_dirtyFlag.setFlag(DirtyFlag::Window, true); + return pWaveform->m_waveformRenderers.count(); +} + +// Static +QmlWaveformRendererFactory* QmlWaveformDisplay::renderers_at( + QQmlListProperty* pList, qsizetype index) { + VERIFY_OR_DEBUG_ASSERT(pList && pList->object) { + return nullptr; + } + QmlWaveformDisplay* pWaveform = static_cast(pList->object); + pWaveform->m_dirtyFlag.setFlag(DirtyFlag::Window, true); + return pWaveform->m_waveformRenderers.at(index); +} + +// Static +void QmlWaveformDisplay::renderers_clear(QQmlListProperty* pList) { + QmlWaveformDisplay* pWaveform = static_cast(pList->object); + VERIFY_OR_DEBUG_ASSERT(pWaveform) { + return; + } + pWaveform->m_dirtyFlag.setFlag(DirtyFlag::Window, true); + return pWaveform->m_waveformRenderers.clear(); } } // namespace qml diff --git a/src/qml/qmlwaveformdisplay.h b/src/qml/qmlwaveformdisplay.h index ae77f5c86f21..6c5088e6361e 100644 --- a/src/qml/qmlwaveformdisplay.h +++ b/src/qml/qmlwaveformdisplay.h @@ -75,6 +75,13 @@ class QmlWaveformDisplay : public QQuickItem, VSyncTimeProvider, public Waveform void componentComplete() override; QQmlListProperty renderers(); + static void renderers_append( + QQmlListProperty* property, + QmlWaveformRendererFactory* value); + static qsizetype renderers_count(QQmlListProperty* property); + static QmlWaveformRendererFactory* renderers_at( + QQmlListProperty* property, qsizetype index); + static void renderers_clear(QQmlListProperty* property); protected: QSGNode* updatePaintNode(QSGNode* old, QQuickItem::UpdatePaintNodeData*) override; diff --git a/src/qml/qmlwaveformrenderer.cpp b/src/qml/qmlwaveformrenderer.cpp index 2f98fe8b2926..da924e99a23e 100644 --- a/src/qml/qmlwaveformrenderer.cpp +++ b/src/qml/qmlwaveformrenderer.cpp @@ -6,8 +6,12 @@ #include "util/assert.h" #include "waveform/renderers/allshader/waveformrenderbeat.h" #include "waveform/renderers/allshader/waveformrendererendoftrack.h" +#include "waveform/renderers/allshader/waveformrendererfiltered.h" +#include "waveform/renderers/allshader/waveformrendererhsv.h" #include "waveform/renderers/allshader/waveformrendererpreroll.h" #include "waveform/renderers/allshader/waveformrendererrgb.h" +#include "waveform/renderers/allshader/waveformrenderersignalbase.h" +#include "waveform/renderers/allshader/waveformrenderersimple.h" #ifdef __STEM__ #include "waveform/renderers/allshader/waveformrendererstem.h" #endif @@ -19,7 +23,8 @@ namespace qml { QmlWaveformRendererMark::QmlWaveformRendererMark() : m_defaultMark(nullptr), - m_untilMark(std::make_unique()) { + m_untilMark(std::make_unique()), + m_playMarkerPosition(0.5) { } QmlWaveformRendererFactory::Renderer QmlWaveformRendererEndOfTrack::create( @@ -51,52 +56,142 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererPreroll::create( return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; } +void QmlWaveformRendererSignal::setup( + allshader::WaveformRendererSignalBase* pRenderer) const { + pRenderer->setAxesColor(m_axesColor); + pRenderer->setLowColor(m_lowColor); + pRenderer->setMidColor(m_midColor); + pRenderer->setHighColor(m_highColor); + connect(this, + &QmlWaveformRendererSignal::axesColorChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setAxesColor); + connect(this, + &QmlWaveformRendererSignal::lowColorChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setLowColor); + connect(this, + &QmlWaveformRendererSignal::midColorChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setMidColor); + connect(this, + &QmlWaveformRendererSignal::highColorChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setHighColor); + + pRenderer->setAllChannelVisualGain(m_gainAll); + pRenderer->setLowVisualGain(m_gainLow); + pRenderer->setMidVisualGain(m_gainMid); + pRenderer->setHighVisualGain(m_gainHigh); + connect(this, + &QmlWaveformRendererSignal::gainAllChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setAllChannelVisualGain); + connect(this, + &QmlWaveformRendererSignal::gainLowChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setLowVisualGain); + connect(this, + &QmlWaveformRendererSignal::gainMidChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setMidVisualGain); + connect(this, + &QmlWaveformRendererSignal::gainHighChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setHighVisualGain); + pRenderer->setIgnoreStem(m_ignoreStem); + connect(this, + &QmlWaveformRendererSignal::ignoreStemChanged, + pRenderer, + &allshader::WaveformRendererSignalBase::setIgnoreStem); +} + QmlWaveformRendererFactory::Renderer QmlWaveformRendererRGB::create( WaveformWidgetRenderer* waveformWidget) const { auto pRenderer = std::make_unique( waveformWidget, m_position, m_options); + setup(pRenderer.get()); + return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; +} + +QmlWaveformRendererFactory::Renderer QmlWaveformRendererFiltered::create( + WaveformWidgetRenderer* waveformWidget) const { + auto pRenderer = std::make_unique( + waveformWidget, m_ignoreStem); + + setup(pRenderer.get()); + return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; +} + +QmlWaveformRendererFactory::Renderer QmlWaveformRendererHSV::create( + WaveformWidgetRenderer* waveformWidget) const { + auto pRenderer = std::make_unique( + waveformWidget); + pRenderer->setAxesColor(m_axesColor); - pRenderer->setLowColor(m_lowColor); - pRenderer->setMidColor(m_midColor); - pRenderer->setHighColor(m_highColor); + pRenderer->setColor(m_color); + pRenderer->setIgnoreStem(m_ignoreStem); + pRenderer->setAllChannelVisualGain(m_gainAll); + pRenderer->setLowVisualGain(m_gainLow); + pRenderer->setMidVisualGain(m_gainMid); + pRenderer->setHighVisualGain(m_gainHigh); + connect(this, + &QmlWaveformRendererHSV::gainAllChanged, + pRenderer.get(), + &allshader::WaveformRendererSignalBase::setAllChannelVisualGain); + connect(this, + &QmlWaveformRendererHSV::gainLowChanged, + pRenderer.get(), + &allshader::WaveformRendererSignalBase::setLowVisualGain); + connect(this, + &QmlWaveformRendererHSV::gainMidChanged, + pRenderer.get(), + &allshader::WaveformRendererSignalBase::setMidVisualGain); connect(this, - &QmlWaveformRendererRGB::axesColorChanged, + &QmlWaveformRendererHSV::gainHighChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setAxesColor); + &allshader::WaveformRendererSignalBase::setHighVisualGain); connect(this, - &QmlWaveformRendererRGB::lowColorChanged, + &QmlWaveformRendererHSV::axesColorChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setLowColor); + &allshader::WaveformRendererSignalBase::setAxesColor); connect(this, - &QmlWaveformRendererRGB::midColorChanged, + &QmlWaveformRendererHSV::colorChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setMidColor); + &allshader::WaveformRendererSignalBase::setColor); connect(this, - &QmlWaveformRendererRGB::highColorChanged, + &QmlWaveformRendererHSV::ignoreStemChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setHighColor); + &allshader::WaveformRendererSignalBase::setIgnoreStem); + return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; +} - pRenderer->setAllChannelVisualGain(m_gainAll); - pRenderer->setLowVisualGain(m_gainLow); - pRenderer->setMidVisualGain(m_gainMid); - pRenderer->setHighVisualGain(m_gainHigh); +QmlWaveformRendererFactory::Renderer QmlWaveformRendererSimple::create( + WaveformWidgetRenderer* waveformWidget) const { + auto pRenderer = std::make_unique( + waveformWidget); + + pRenderer->setAxesColor(m_axesColor); + pRenderer->setColor(m_color); + pRenderer->setAllChannelVisualGain(m_gain); + pRenderer->setIgnoreStem(m_ignoreStem); connect(this, - &QmlWaveformRendererRGB::gainAllChanged, + &QmlWaveformRendererSimple::axesColorChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setAllChannelVisualGain); + &allshader::WaveformRendererSignalBase::setAxesColor); connect(this, - &QmlWaveformRendererRGB::gainLowChanged, + &QmlWaveformRendererSimple::colorChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setLowVisualGain); + &allshader::WaveformRendererSignalBase::setColor); connect(this, - &QmlWaveformRendererRGB::gainMidChanged, + &QmlWaveformRendererSimple::gainChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setMidVisualGain); + &allshader::WaveformRendererSignalBase::setAllChannelVisualGain); connect(this, - &QmlWaveformRendererRGB::gainHighChanged, + &QmlWaveformRendererSimple::ignoreStemChanged, pRenderer.get(), - &allshader::WaveformRendererRGB::setHighVisualGain); + &allshader::WaveformRendererSignalBase::setIgnoreStem); return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; } @@ -104,11 +199,15 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererBeat::create( WaveformWidgetRenderer* waveformWidget) const { auto pRenderer = std::make_unique( waveformWidget, m_position); - pRenderer->setColor(m_color); + waveformWidget->setDisplayBeatGridAlpha(m_color.alphaF() * 100); + pRenderer->setColor(m_color.rgb()); connect(this, &QmlWaveformRendererBeat::colorChanged, pRenderer.get(), - &allshader::WaveformRenderBeat::setColor); + [waveformWidget, &pRenderer](const QColor& color) { + waveformWidget->setDisplayBeatGridAlpha(color.alphaF() * 100); + pRenderer->setColor(color.rgb()); + }); return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; } @@ -164,6 +263,7 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererMark::create( pRenderer->setPlayMarkerForegroundColor(m_playMarkerColor); pRenderer->setPlayMarkerBackgroundColor(m_playMarkerBackground); + waveformWidget->setPlayMarkerPosition(m_playMarkerPosition); pRenderer->setUntilMarkShowBeats(m_untilMark->showTime()); pRenderer->setUntilMarkShowTime(m_untilMark->showBeats()); @@ -196,6 +296,12 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererMark::create( &QmlWaveformRendererMark::playMarkerBackgroundChanged, pRenderer.get(), &allshader::WaveformRenderMark::setPlayMarkerBackgroundColor); + connect(this, + &QmlWaveformRendererMark::playMarkerPositionChanged, + pRenderer.get(), + [waveformWidget](double value) { + waveformWidget->setPlayMarkerPosition(value); + }); // The initialisation is closely inspired from WaveformMarkSet::setup int priority = 0; diff --git a/src/qml/qmlwaveformrenderer.h b/src/qml/qmlwaveformrenderer.h index 361691ea48a3..0f441d8981e3 100644 --- a/src/qml/qmlwaveformrenderer.h +++ b/src/qml/qmlwaveformrenderer.h @@ -19,8 +19,12 @@ class WaveformRenderBeat; namespace mixxx { namespace qml { +typedef ::WaveformRendererAbstract::PositionSource WaveformRendererPositionSource; + class QmlWaveformRendererFactory : public QObject { Q_OBJECT + Q_PROPERTY(WaveformRendererPositionSource position MEMBER + m_position NOTIFY positionChanged) QML_ANONYMOUS public: struct Renderer { @@ -33,6 +37,16 @@ class QmlWaveformRendererFactory : public QObject { } virtual Renderer create(WaveformWidgetRenderer* waveformWidget) const = 0; + + signals: +#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) + void positionChanged(WaveformRendererPositionSource); +#else + void positionChanged(mixxx::qml::WaveformRendererPositionSource); +#endif + + protected: + WaveformRendererPositionSource m_position{::WaveformRendererAbstract::Play}; }; class QmlWaveformRendererEndOfTrack @@ -71,9 +85,11 @@ class QmlWaveformRendererPreroll ::WaveformRendererAbstract::PositionSource m_position{::WaveformRendererAbstract::Play}; }; -class QmlWaveformRendererRGB +typedef allshader::WaveformRendererSignalBase::Options WaveformRendererSignalBaseOptions; +class QmlWaveformRendererSignal : public QmlWaveformRendererFactory { Q_OBJECT + Q_PROPERTY(bool ignoreStem MEMBER m_ignoreStem NOTIFY ignoreStemChanged) Q_PROPERTY(QColor axesColor MEMBER m_axesColor NOTIFY axesColorChanged REQUIRED) Q_PROPERTY(QColor lowColor MEMBER m_lowColor NOTIFY lowColorChanged REQUIRED) Q_PROPERTY(QColor midColor MEMBER m_midColor NOTIFY midColorChanged REQUIRED) @@ -82,10 +98,15 @@ class QmlWaveformRendererRGB Q_PROPERTY(double gainLow MEMBER m_gainLow NOTIFY gainLowChanged REQUIRED) Q_PROPERTY(double gainMid MEMBER m_gainMid NOTIFY gainMidChanged REQUIRED) Q_PROPERTY(double gainHigh MEMBER m_gainHigh NOTIFY gainHighChanged REQUIRED) - QML_NAMED_ELEMENT(WaveformRendererRGB) + Q_PROPERTY(WaveformRendererSignalBaseOptions options MEMBER + m_options NOTIFY optionsChanged) + QML_ANONYMOUS public: - Renderer create(WaveformWidgetRenderer* waveformWidget) const override; + Q_ENUM(WaveformRendererSignalBaseOptions) + + protected: + void setup(allshader::WaveformRendererSignalBase* renderer) const; signals: void axesColorChanged(const QColor&); @@ -96,8 +117,14 @@ class QmlWaveformRendererRGB void gainLowChanged(double); void gainMidChanged(double); void gainHighChanged(double); + void ignoreStemChanged(bool); +#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) + void optionsChanged(WaveformRendererSignalBaseOptions); +#else + void optionsChanged(mixxx::qml::WaveformRendererSignalBaseOptions); +#endif - private: + protected: QColor m_axesColor; QColor m_lowColor; QColor m_midColor; @@ -108,11 +135,95 @@ class QmlWaveformRendererRGB double m_gainMid; double m_gainHigh; + bool m_ignoreStem{false}; + ::WaveformRendererAbstract::PositionSource m_position{::WaveformRendererAbstract::Play}; - allshader::WaveformRendererSignalBase::Options m_options{ + WaveformRendererSignalBaseOptions m_options{ allshader::WaveformRendererSignalBase::Option::None}; }; +class QmlWaveformRendererRGB + : public QmlWaveformRendererSignal { + Q_OBJECT + QML_NAMED_ELEMENT(WaveformRendererRGB) + + public: + Renderer create(WaveformWidgetRenderer* waveformWidget) const override; +}; + +class QmlWaveformRendererFiltered + : public QmlWaveformRendererSignal { + Q_OBJECT + Q_PROPERTY(bool stacked MEMBER m_stacked FINAL) + + QML_NAMED_ELEMENT(WaveformRendererFiltered) + + public: + Renderer create(WaveformWidgetRenderer* waveformWidget) const override; + + private: + bool m_stacked{false}; +}; + +class QmlWaveformRendererHSV + : public QmlWaveformRendererFactory { + Q_OBJECT + Q_PROPERTY(bool ignoreStem MEMBER m_ignoreStem NOTIFY ignoreStemChanged) + Q_PROPERTY(QColor axesColor MEMBER m_axesColor NOTIFY axesColorChanged REQUIRED) + Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged REQUIRED) + Q_PROPERTY(double gainAll MEMBER m_gainAll NOTIFY gainAllChanged REQUIRED) + Q_PROPERTY(double gainLow MEMBER m_gainLow NOTIFY gainLowChanged REQUIRED) + Q_PROPERTY(double gainMid MEMBER m_gainMid NOTIFY gainMidChanged REQUIRED) + Q_PROPERTY(double gainHigh MEMBER m_gainHigh NOTIFY gainHighChanged REQUIRED) + QML_NAMED_ELEMENT(WaveformRendererHSV) + + public: + Renderer create(WaveformWidgetRenderer* waveformWidget) const override; + signals: + void axesColorChanged(const QColor&); + void colorChanged(const QColor&); + void ignoreStemChanged(bool); + void gainAllChanged(double); + void gainLowChanged(double); + void gainMidChanged(double); + void gainHighChanged(double); + + private: + QColor m_axesColor; + QColor m_color; + + double m_gainAll; + double m_gainLow; + double m_gainMid; + double m_gainHigh; + + bool m_ignoreStem{false}; +}; + +class QmlWaveformRendererSimple + : public QmlWaveformRendererFactory { + Q_OBJECT + Q_PROPERTY(bool ignoreStem MEMBER m_ignoreStem NOTIFY ignoreStemChanged) + Q_PROPERTY(QColor axesColor MEMBER m_axesColor NOTIFY axesColorChanged REQUIRED) + Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged REQUIRED) + Q_PROPERTY(double gain MEMBER m_gain NOTIFY gainChanged REQUIRED) + QML_NAMED_ELEMENT(WaveformRendererSimple) + + public: + Renderer create(WaveformWidgetRenderer* waveformWidget) const override; + signals: + void axesColorChanged(const QColor&); + void colorChanged(const QColor&); + void ignoreStemChanged(bool); + void gainChanged(double); + + private: + QColor m_axesColor; + QColor m_color; + double m_gain; + bool m_ignoreStem{false}; +}; + class QmlWaveformRendererBeat : public QmlWaveformRendererFactory { Q_OBJECT @@ -373,6 +484,8 @@ class QmlWaveformRendererMark Q_PROPERTY(QColor playMarkerColor MEMBER m_playMarkerColor NOTIFY playMarkerColorChanged) Q_PROPERTY(QColor playMarkerBackground MEMBER m_playMarkerBackground NOTIFY playMarkerBackgroundChanged) + Q_PROPERTY(double playMarkerPosition MEMBER m_playMarkerPosition NOTIFY + playMarkerPositionChanged) Q_PROPERTY(QmlWaveformMark* defaultMark MEMBER m_defaultMark NOTIFY defaultMarkChanged) Q_PROPERTY(QmlWaveformUntilMark* untilMark READ untilMark FINAL) Q_CLASSINFO("DefaultProperty", "marks") @@ -397,6 +510,7 @@ class QmlWaveformRendererMark signals: void playMarkerColorChanged(const QColor&); void playMarkerBackgroundChanged(const QColor&); + void playMarkerPositionChanged(double); #if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) void defaultMarkChanged(QmlWaveformMark*); #else @@ -406,6 +520,7 @@ class QmlWaveformRendererMark private: QColor m_playMarkerColor; QColor m_playMarkerBackground; + double m_playMarkerPosition; QList m_marks; QmlWaveformMark* m_defaultMark; std::unique_ptr m_untilMark; diff --git a/src/waveform/renderers/allshader/waveformrendererendoftrack.cpp b/src/waveform/renderers/allshader/waveformrendererendoftrack.cpp index 478c7629a41b..fa998de33bc5 100644 --- a/src/waveform/renderers/allshader/waveformrendererendoftrack.cpp +++ b/src/waveform/renderers/allshader/waveformrendererendoftrack.cpp @@ -44,6 +44,12 @@ void WaveformRendererEndOfTrack::draw(QPainter* painter, QPaintEvent* event) { bool WaveformRendererEndOfTrack::init() { m_timer.restart(); + if (m_waveformRenderer->getGroup().isEmpty()) { + m_pEndOfTrackControl.reset(); + m_pTimeRemainingControl.reset(); + return true; + } + m_pEndOfTrackControl.reset(new ControlProxy( m_waveformRenderer->getGroup(), "end_of_track")); m_pTimeRemainingControl.reset(new ControlProxy( @@ -70,7 +76,7 @@ void WaveformRendererEndOfTrack::preprocess() { } bool WaveformRendererEndOfTrack::preprocessInner() { - if (!m_pEndOfTrackControl->toBool()) { + if (!m_pEndOfTrackControl || !m_pEndOfTrackControl->toBool()) { return false; } diff --git a/src/waveform/renderers/allshader/waveformrendererfiltered.cpp b/src/waveform/renderers/allshader/waveformrendererfiltered.cpp index efab7bdd60ad..8b14849f6ac1 100644 --- a/src/waveform/renderers/allshader/waveformrendererfiltered.cpp +++ b/src/waveform/renderers/allshader/waveformrendererfiltered.cpp @@ -56,7 +56,7 @@ bool WaveformRendererFiltered::preprocessInner() { #ifdef __STEM__ auto stemInfo = pTrack->getStemInfo(); // If this track is a stem track, skip the rendering - if (!stemInfo.isEmpty() && waveform->hasStem()) { + if (!stemInfo.isEmpty() && waveform->hasStem() && !m_ignoreStem) { return false; } #endif diff --git a/src/waveform/renderers/allshader/waveformrendererhsv.cpp b/src/waveform/renderers/allshader/waveformrendererhsv.cpp index bbf367407477..fe7773a162b0 100644 --- a/src/waveform/renderers/allshader/waveformrendererhsv.cpp +++ b/src/waveform/renderers/allshader/waveformrendererhsv.cpp @@ -54,7 +54,7 @@ bool WaveformRendererHSV::preprocessInner() { #ifdef __STEM__ auto stemInfo = pTrack->getStemInfo(); // If this track is a stem track, skip the rendering - if (!stemInfo.isEmpty() && waveform->hasStem()) { + if (!stemInfo.isEmpty() && waveform->hasStem() && !m_ignoreStem) { return false; } #endif @@ -80,9 +80,7 @@ bool WaveformRendererHSV::preprocessInner() { getGains(&allGain, false, nullptr, nullptr, nullptr); // Get base color of waveform in the HSV format (s and v isn't use) - float h, s, v; - getHsvF(m_waveformRenderer->getWaveformSignalColors()->getLowColor(), &h, &s, &v); - + float h = m_signalColor_h; const float breadth = static_cast(m_waveformRenderer->getBreadth()); const float halfBreadth = breadth / 2.0f; diff --git a/src/waveform/renderers/allshader/waveformrendererrgb.cpp b/src/waveform/renderers/allshader/waveformrendererrgb.cpp index 07b8d877416b..38c3854a11bb 100644 --- a/src/waveform/renderers/allshader/waveformrendererrgb.cpp +++ b/src/waveform/renderers/allshader/waveformrendererrgb.cpp @@ -28,22 +28,6 @@ WaveformRendererRGB::WaveformRendererRGB(WaveformWidgetRenderer* waveformWidget, setUsePreprocess(true); } -void WaveformRendererRGB::setAxesColor(const QColor& axesColor) { - getRgbF(axesColor, &m_axesColor_r, &m_axesColor_g, &m_axesColor_b, &m_axesColor_a); -} - -void WaveformRendererRGB::setLowColor(const QColor& lowColor) { - getRgbF(lowColor, &m_rgbLowColor_r, &m_rgbLowColor_g, &m_rgbLowColor_b); -} - -void WaveformRendererRGB::setMidColor(const QColor& midColor) { - getRgbF(midColor, &m_rgbMidColor_r, &m_rgbMidColor_g, &m_rgbMidColor_b); -} - -void WaveformRendererRGB::setHighColor(const QColor& highColor) { - getRgbF(highColor, &m_rgbHighColor_r, &m_rgbHighColor_g, &m_rgbHighColor_b); -} - void WaveformRendererRGB::onSetup(const QDomNode&) { } @@ -83,7 +67,7 @@ bool WaveformRendererRGB::preprocessInner() { #ifdef __STEM__ auto stemInfo = pTrack->getStemInfo(); // If this track is a stem track, skip the rendering - if (!stemInfo.isEmpty() && waveform->hasStem()) { + if (!stemInfo.isEmpty() && waveform->hasStem() && !m_ignoreStem) { return false; } #endif diff --git a/src/waveform/renderers/allshader/waveformrendererrgb.h b/src/waveform/renderers/allshader/waveformrendererrgb.h index 7451f65c1254..680e84996f73 100644 --- a/src/waveform/renderers/allshader/waveformrendererrgb.h +++ b/src/waveform/renderers/allshader/waveformrendererrgb.h @@ -27,12 +27,6 @@ class allshader::WaveformRendererRGB final // Virtuals for rendergraph::Node void preprocess() override; - public slots: - void setAxesColor(const QColor& axesColor); - void setLowColor(const QColor& lowColor); - void setMidColor(const QColor& midColor); - void setHighColor(const QColor& highColor); - private: bool m_isSlipRenderer; WaveformRendererSignalBase::Options m_options; diff --git a/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp b/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp index ea906dba69ea..e9cc902b31f3 100644 --- a/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp +++ b/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp @@ -1,14 +1,41 @@ #include "waveform/renderers/allshader/waveformrenderersignalbase.h" +#include "util/colorcomponents.h" + namespace allshader { WaveformRendererSignalBase::WaveformRendererSignalBase( WaveformWidgetRenderer* waveformWidget) - : ::WaveformRendererSignalBase(waveformWidget) { + : ::WaveformRendererSignalBase(waveformWidget), + m_ignoreStem(false) { } void WaveformRendererSignalBase::draw(QPainter*, QPaintEvent*) { DEBUG_ASSERT(false); } +void WaveformRendererSignalBase::setAxesColor(const QColor& axesColor) { + getRgbF(axesColor, &m_axesColor_r, &m_axesColor_g, &m_axesColor_b, &m_axesColor_a); +} + +void WaveformRendererSignalBase::setColor(const QColor& color) { + getRgbF(color, &m_signalColor_r, &m_signalColor_g, &m_signalColor_b); + getHsvF(color, &m_signalColor_h, &m_signalColor_s, &m_signalColor_v); +} + +void WaveformRendererSignalBase::setLowColor(const QColor& lowColor) { + getRgbF(lowColor, &m_rgbLowColor_r, &m_rgbLowColor_g, &m_rgbLowColor_b); + getRgbF(lowColor, &m_lowColor_r, &m_lowColor_g, &m_lowColor_b); +} + +void WaveformRendererSignalBase::setMidColor(const QColor& midColor) { + getRgbF(midColor, &m_rgbMidColor_r, &m_rgbMidColor_g, &m_rgbMidColor_b); + getRgbF(midColor, &m_midColor_r, &m_midColor_g, &m_midColor_b); +} + +void WaveformRendererSignalBase::setHighColor(const QColor& highColor) { + getRgbF(highColor, &m_rgbHighColor_r, &m_rgbHighColor_g, &m_rgbHighColor_b); + getRgbF(highColor, &m_highColor_r, &m_highColor_g, &m_highColor_b); +} + } // namespace allshader diff --git a/src/waveform/renderers/allshader/waveformrenderersignalbase.h b/src/waveform/renderers/allshader/waveformrenderersignalbase.h index 1299fe04fa86..252fad54476f 100644 --- a/src/waveform/renderers/allshader/waveformrenderersignalbase.h +++ b/src/waveform/renderers/allshader/waveformrenderersignalbase.h @@ -33,5 +33,19 @@ class allshader::WaveformRendererSignalBase : public ::WaveformRendererSignalBas return false; } + public slots: + void setAxesColor(const QColor& axesColor); + void setColor(const QColor& lowColor); + void setLowColor(const QColor& lowColor); + void setMidColor(const QColor& midColor); + void setHighColor(const QColor& highColor); + + void setIgnoreStem(bool value) { + m_ignoreStem = value; + } + + protected: + bool m_ignoreStem; + DISALLOW_COPY_AND_ASSIGN(WaveformRendererSignalBase); }; diff --git a/src/waveform/renderers/allshader/waveformrenderersimple.cpp b/src/waveform/renderers/allshader/waveformrenderersimple.cpp index 2626e80e4311..880485a0341e 100644 --- a/src/waveform/renderers/allshader/waveformrenderersimple.cpp +++ b/src/waveform/renderers/allshader/waveformrenderersimple.cpp @@ -54,7 +54,7 @@ bool WaveformRendererSimple::preprocessInner() { #ifdef __STEM__ auto stemInfo = pTrack->getStemInfo(); // If this track is a stem track, skip the rendering - if (!stemInfo.isEmpty() && waveform->hasStem()) { + if (!stemInfo.isEmpty() && waveform->hasStem() && !m_ignoreStem) { return false; } #endif @@ -82,8 +82,7 @@ bool WaveformRendererSimple::preprocessInner() { // Per-band gain from the EQ knobs. float allGain{1.0}; - float bandGain[3] = {1.0, 1.0, 1.0}; - getGains(&allGain, false, &bandGain[0], &bandGain[1], &bandGain[2]); + getGains(&allGain, false, nullptr, nullptr, nullptr); const float breadth = static_cast(m_waveformRenderer->getBreadth()); const float halfBreadth = breadth / 2.0f; diff --git a/src/waveform/renderers/allshader/waveformrendererslipmode.cpp b/src/waveform/renderers/allshader/waveformrendererslipmode.cpp index af122d2d5bf9..08a37653e65c 100644 --- a/src/waveform/renderers/allshader/waveformrendererslipmode.cpp +++ b/src/waveform/renderers/allshader/waveformrendererslipmode.cpp @@ -44,6 +44,11 @@ void WaveformRendererSlipMode::draw(QPainter* painter, QPaintEvent* event) { bool WaveformRendererSlipMode::init() { m_timer.restart(); + if (m_waveformRenderer->getGroup().isEmpty()) { + m_pSlipModeControl.reset(); + return true; + } + m_pSlipModeControl.reset(new ControlProxy( m_waveformRenderer->getGroup(), QStringLiteral("slip_enabled"))); @@ -79,7 +84,8 @@ void WaveformRendererSlipMode::preprocess() { } bool WaveformRendererSlipMode::preprocessInner() { - if (!m_pSlipModeControl->toBool() || !m_waveformRenderer->isSlipActive()) { + if (!m_pSlipModeControl || !m_pSlipModeControl->toBool() || + !m_waveformRenderer->isSlipActive()) { return false; } diff --git a/src/waveform/renderers/allshader/waveformrendererstem.cpp b/src/waveform/renderers/allshader/waveformrendererstem.cpp index 73e9e1750968..735d58aa2087 100644 --- a/src/waveform/renderers/allshader/waveformrendererstem.cpp +++ b/src/waveform/renderers/allshader/waveformrendererstem.cpp @@ -43,6 +43,11 @@ void WaveformRendererStem::onSetup(const QDomNode&) { } bool WaveformRendererStem::init() { + m_pStemGain.clear(); + m_pStemMute.clear(); + if (m_waveformRenderer->getGroup().isEmpty()) { + return true; + } for (int stemIdx = 0; stemIdx < mixxx::kMaxSupportedStems; stemIdx++) { QString stemGroup = EngineDeck::getGroupForStem(m_waveformRenderer->getGroup(), stemIdx); m_pStemGain.emplace_back( @@ -187,11 +192,15 @@ bool WaveformRendererStem::preprocessInner() { // Apply the gains if (layerIdx) { - max *= m_pStemMute[stemIdx]->toBool() || + bool isMuted = m_pStemMute.empty() ? false : m_pStemMute[stemIdx]->toBool(); + float volume = m_pStemGain.empty() + ? 1.f + : static_cast(m_pStemGain[stemIdx]->get()); + max *= isMuted || (selectedStems && !(selectedStems & 1 << stemIdx)) ? 0.f - : static_cast(m_pStemGain[stemIdx]->get()); + : volume; } // Lines are thin rectangles diff --git a/src/waveform/renderers/allshader/waveformrendermark.cpp b/src/waveform/renderers/allshader/waveformrendermark.cpp index 28a4c6610825..2f766b8370e7 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.cpp +++ b/src/waveform/renderers/allshader/waveformrendermark.cpp @@ -224,8 +224,12 @@ void allshader::WaveformRenderMark::setup(const QDomNode& node, const SkinContex } bool allshader::WaveformRenderMark::init() { - m_pTimeRemainingControl = std::make_unique( - m_waveformRenderer->getGroup(), "time_remaining"); + if (!m_waveformRenderer->getGroup().isEmpty()) { + m_pTimeRemainingControl = std::make_unique( + m_waveformRenderer->getGroup(), "time_remaining"); + } else { + m_pTimeRemainingControl.reset(); + } ::WaveformRenderMarkBase::init(); return true; } @@ -584,7 +588,7 @@ void allshader::WaveformRenderMark::updateUntilMark( } const double endPosition = m_waveformRenderer->getTrackSamples(); - const double remainingTime = m_pTimeRemainingControl->get(); + const double remainingTime = m_pTimeRemainingControl ? m_pTimeRemainingControl->get() : 0; mixxx::BeatsPointer trackBeats = trackInfo->getBeats(); if (!trackBeats) { diff --git a/src/waveform/renderers/waveformmark.cpp b/src/waveform/renderers/waveformmark.cpp index ae4e09e41593..55997d03929a 100644 --- a/src/waveform/renderers/waveformmark.cpp +++ b/src/waveform/renderers/waveformmark.cpp @@ -126,15 +126,15 @@ WaveformMark::WaveformMark(const QString& group, m_showUntilNext = isShowUntilNextPositionControl(positionControl); } - if (!positionControl.isEmpty()) { + if (!positionControl.isEmpty() && !group.isEmpty()) { m_pPositionCO = std::make_unique(group, positionControl); } - if (!endPositionControl.isEmpty()) { + if (!endPositionControl.isEmpty() && !group.isEmpty()) { m_pEndPositionCO = std::make_unique(group, endPositionControl); m_pTypeCO = std::make_unique(group, typeControl); } - if (!visibilityControl.isEmpty()) { + if (!visibilityControl.isEmpty() && !group.isEmpty()) { ConfigKey key = ConfigKey::parseCommaSeparated(visibilityControl); m_pVisibleCO = std::make_unique(key); } diff --git a/src/waveform/renderers/waveformrenderersignalbase.cpp b/src/waveform/renderers/waveformrenderersignalbase.cpp index ed2a75abe084..4b48122cf84e 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.cpp +++ b/src/waveform/renderers/waveformrenderersignalbase.cpp @@ -54,47 +54,35 @@ WaveformRendererSignalBase::WaveformRendererSignalBase( m_rgbHighColor_b(0) { } -WaveformRendererSignalBase::~WaveformRendererSignalBase() { - deleteControls(); -} - -void WaveformRendererSignalBase::deleteControls() { - if (m_pEQEnabled) { - delete m_pEQEnabled; - } - if (m_pLowFilterControlObject) { - delete m_pLowFilterControlObject; - } - if (m_pMidFilterControlObject) { - delete m_pMidFilterControlObject; - } - if (m_pHighFilterControlObject) { - delete m_pHighFilterControlObject; - } - if (m_pLowKillControlObject) { - delete m_pLowKillControlObject; - } - if (m_pMidKillControlObject) { - delete m_pMidKillControlObject; - } - if (m_pHighKillControlObject) { - delete m_pHighKillControlObject; - } -} +WaveformRendererSignalBase::~WaveformRendererSignalBase() = default; bool WaveformRendererSignalBase::init() { - deleteControls(); - - //create controls - m_pEQEnabled = new ControlProxy( - m_waveformRenderer->getGroup(), "filterWaveformEnable"); - const QString effectGroup = kEffectGroupFormat.arg(m_waveformRenderer->getGroup()); - m_pLowFilterControlObject = new ControlProxy(effectGroup, QStringLiteral("parameter1")); - m_pMidFilterControlObject = new ControlProxy(effectGroup, QStringLiteral("parameter2")); - m_pHighFilterControlObject = new ControlProxy(effectGroup, QStringLiteral("parameter3")); - m_pLowKillControlObject = new ControlProxy(effectGroup, QStringLiteral("button_parameter1")); - m_pMidKillControlObject = new ControlProxy(effectGroup, QStringLiteral("button_parameter2")); - m_pHighKillControlObject = new ControlProxy(effectGroup, QStringLiteral("button_parameter3")); + if (!m_waveformRenderer->getGroup().isEmpty()) { + // create controls + m_pEQEnabled = std::make_unique( + m_waveformRenderer->getGroup(), "filterWaveformEnable"); + const QString effectGroup = kEffectGroupFormat.arg(m_waveformRenderer->getGroup()); + m_pLowFilterControlObject = std::make_unique( + effectGroup, QStringLiteral("parameter1")); + m_pMidFilterControlObject = std::make_unique( + effectGroup, QStringLiteral("parameter2")); + m_pHighFilterControlObject = std::make_unique( + effectGroup, QStringLiteral("parameter3")); + m_pLowKillControlObject = std::make_unique( + effectGroup, QStringLiteral("button_parameter1")); + m_pMidKillControlObject = std::make_unique( + effectGroup, QStringLiteral("button_parameter2")); + m_pHighKillControlObject = std::make_unique( + effectGroup, QStringLiteral("button_parameter3")); + } else { + m_pEQEnabled.reset(); + m_pLowFilterControlObject.reset(); + m_pMidFilterControlObject.reset(); + m_pHighFilterControlObject.reset(); + m_pLowKillControlObject.reset(); + m_pMidKillControlObject.reset(); + m_pHighKillControlObject.reset(); + } return onInit(); } @@ -195,7 +183,7 @@ void WaveformRendererSignalBase::getGains(float* pAllGain, CSAMPLE_GAIN lowVisualGain = 1.0, midVisualGain = 1.0, highVisualGain = 1.0; // Only adjust low/mid/high gains if EQs are enabled. - if (m_pEQEnabled->get() > 0.0) { + if (m_pEQEnabled && m_pEQEnabled->get() > 0.0) { if (m_pLowFilterControlObject && m_pMidFilterControlObject && m_pHighFilterControlObject) { diff --git a/src/waveform/renderers/waveformrenderersignalbase.h b/src/waveform/renderers/waveformrenderersignalbase.h index 3611136bc7e2..9b5e832e7bd1 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.h +++ b/src/waveform/renderers/waveformrenderersignalbase.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "skin/legacy/skincontext.h" #include "util/span.h" #include "util/types.h" @@ -39,8 +41,6 @@ class WaveformRendererSignalBase : public QObject, public WaveformRendererAbstra } protected: - void deleteControls(); - void getGains(float* pAllGain, bool applyCompensation, float* pLowGain, @@ -48,13 +48,13 @@ class WaveformRendererSignalBase : public QObject, public WaveformRendererAbstra float* highGain); protected: - ControlProxy* m_pEQEnabled; - ControlProxy* m_pLowFilterControlObject; - ControlProxy* m_pMidFilterControlObject; - ControlProxy* m_pHighFilterControlObject; - ControlProxy* m_pLowKillControlObject; - ControlProxy* m_pMidKillControlObject; - ControlProxy* m_pHighKillControlObject; + std::unique_ptr m_pEQEnabled; + std::unique_ptr m_pLowFilterControlObject; + std::unique_ptr m_pMidFilterControlObject; + std::unique_ptr m_pHighFilterControlObject; + std::unique_ptr m_pLowKillControlObject; + std::unique_ptr m_pMidKillControlObject; + std::unique_ptr m_pHighKillControlObject; Qt::Alignment m_alignment; Qt::Orientation m_orientation; @@ -66,6 +66,7 @@ class WaveformRendererSignalBase : public QObject, public WaveformRendererAbstra float m_axesColor_r, m_axesColor_g, m_axesColor_b, m_axesColor_a; float m_signalColor_r, m_signalColor_g, m_signalColor_b; + float m_signalColor_h, m_signalColor_s, m_signalColor_v; float m_lowColor_r, m_lowColor_g, m_lowColor_b; float m_midColor_r, m_midColor_g, m_midColor_b; float m_highColor_r, m_highColor_g, m_highColor_b; diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index 9b4188a45aa7..40b0a2f524da 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -103,18 +103,23 @@ bool WaveformWidgetRenderer::init() { m_truePosSample[type] = -1.0; } - VERIFY_OR_DEBUG_ASSERT(!m_group.isEmpty()) { - return false; + // It is possible for a renderer to be defined with no group. This usually + // indicate that the position and track will be controlled by the owner. + // This is used in QML currently. + if (!m_group.isEmpty()) { + m_pRateRatioCO = std::make_unique( + m_group, QStringLiteral("rate_ratio")); + m_pGainControlObject = std::make_unique( + m_group, QStringLiteral("total_gain")); + m_pTrackSamplesControlObject = std::make_unique( + m_group, QStringLiteral("track_samples")); + + m_visualPlayPosition = VisualPlayPosition::getVisualPlayPosition(m_group); } - m_visualPlayPosition = VisualPlayPosition::getVisualPlayPosition(m_group); - - m_pRateRatioCO = std::make_unique( - m_group, QStringLiteral("rate_ratio")); - m_pGainControlObject = std::make_unique( - m_group, QStringLiteral("total_gain")); - m_pTrackSamplesControlObject = std::make_unique( - m_group, QStringLiteral("track_samples")); + VERIFY_OR_DEBUG_ASSERT(m_visualPlayPosition) { + return false; + } for (int i = 0; i < m_rendererStack.size(); ++i) { if (!m_rendererStack[i]->init()) { @@ -137,15 +142,17 @@ void WaveformWidgetRenderer::onPreRender(VSyncTimeProvider* vsyncThread) { } // For a valid track to render we need - m_trackSamples = m_pTrackSamplesControlObject->get(); + m_trackSamples = m_pTrackSamplesControlObject + ? m_pTrackSamplesControlObject->get() + : m_pTrack->getSampleRate() * m_pTrack->getDuration(); if (m_trackSamples <= 0) { return; } //Fetch parameters before rendering in order the display all sub-renderers with the same values - double rateRatio = m_pRateRatioCO->get(); + double rateRatio = m_pRateRatioCO ? m_pRateRatioCO->get() : 1.0; - m_gain = m_pGainControlObject->get(); + m_gain = m_pGainControlObject ? m_pGainControlObject->get() : 1.0; // Compute visual sample to pixel ratio // Allow waveform to spread one visual sample across a hundred pixels diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index 9e1996051a4a..3541dcc9010e 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -42,6 +42,10 @@ class WaveformWidgetRenderer { void onPreRender(VSyncTimeProvider* vsyncThread); void draw(QPainter* painter, QPaintEvent* event); + void setVisualPlayPosition(const QSharedPointer& value) { + m_visualPlayPosition = value; + } + const QString& getGroup() const { return m_group; } diff --git a/src/waveform/visualplayposition.cpp b/src/waveform/visualplayposition.cpp index 6fce7f1bf3f4..758f1a37d095 100644 --- a/src/waveform/visualplayposition.cpp +++ b/src/waveform/visualplayposition.cpp @@ -17,7 +17,9 @@ VisualPlayPosition::VisualPlayPosition(const QString& key) } VisualPlayPosition::~VisualPlayPosition() { - m_listVisualPlayPosition.remove(m_key); + if (!m_key.isEmpty()) { + m_listVisualPlayPosition.remove(m_key); + } } void VisualPlayPosition::set( diff --git a/src/waveform/visualplayposition.h b/src/waveform/visualplayposition.h index 9b94c91571a4..bded14a5f38e 100644 --- a/src/waveform/visualplayposition.h +++ b/src/waveform/visualplayposition.h @@ -49,7 +49,7 @@ class VisualPlayPositionData { class VisualPlayPosition : public QObject { Q_OBJECT public: - VisualPlayPosition(const QString& m_key); + VisualPlayPosition(const QString& m_key = {}); virtual ~VisualPlayPosition(); // WARNING: Not thread safe. This function must be called only from the From 941cfdfafb0b7e5ed6188e70538403c3cfa60cc7 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sat, 29 Mar 2025 01:03:14 +0000 Subject: [PATCH 052/163] fix: disable assert if stem aren't used --- src/qml/qmlwaveformdisplay.cpp | 2 ++ src/qml/qmlwaveformrenderer.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qml/qmlwaveformdisplay.cpp b/src/qml/qmlwaveformdisplay.cpp index 0bfed42eea8c..fa21924cdc90 100644 --- a/src/qml/qmlwaveformdisplay.cpp +++ b/src/qml/qmlwaveformdisplay.cpp @@ -123,9 +123,11 @@ QSGNode* QmlWaveformDisplay::updatePaintNode(QSGNode* node, UpdatePaintNodeData* qDebug() << "Ignoring the unsupported" << pQmlRenderer << "renderer"; } auto renderer = pQmlRenderer->create(this); +#ifndef __STEM__ VERIFY_OR_DEBUG_ASSERT(renderer.renderer) { continue; } +#endif addRenderer(renderer.renderer); pTopNode->appendChildNode(std::move(renderer.node)); } diff --git a/src/qml/qmlwaveformrenderer.h b/src/qml/qmlwaveformrenderer.h index 0f441d8981e3..d012c3831fad 100644 --- a/src/qml/qmlwaveformrenderer.h +++ b/src/qml/qmlwaveformrenderer.h @@ -19,7 +19,7 @@ class WaveformRenderBeat; namespace mixxx { namespace qml { -typedef ::WaveformRendererAbstract::PositionSource WaveformRendererPositionSource; +using WaveformRendererPositionSource = ::WaveformRendererAbstract::PositionSource; class QmlWaveformRendererFactory : public QObject { Q_OBJECT From 70b1799457612d0fb738cf24a61f6b1e6b7b127b Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Mon, 26 May 2025 12:59:02 +0000 Subject: [PATCH 053/163] chore(QML): improve waveform zoom experience --- res/qml/WaveformDisplay.qml | 17 ++++++++++++++++- src/qml/qmlconfigproxy.cpp | 17 +++++++++++++++++ src/qml/qmlconfigproxy.h | 4 ++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/res/qml/WaveformDisplay.qml b/res/qml/WaveformDisplay.qml index cf38e312b13a..7267b22edf0e 100644 --- a/res/qml/WaveformDisplay.qml +++ b/res/qml/WaveformDisplay.qml @@ -10,6 +10,8 @@ Item { required property string group property bool splitStemTracks: false + readonly property string zoomGroup: Mixxx.Config.waveformZoomSynchronization() ? "[Channel1]" : group + enum MouseStatus { Normal, Bending, @@ -22,6 +24,13 @@ Item { zoom: zoomControl.value backgroundColor: "#5e000000" + Behavior on zoom { + SmoothedAnimation { + duration: 500 + velocity: -1 + } + } + Mixxx.WaveformRendererEndOfTrack { color: '#ff8872' endOfTrackWarningTime: 30 @@ -180,8 +189,14 @@ Item { Mixxx.ControlProxy { id: zoomControl - group: root.group + group: root.zoomGroup key: "waveform_zoom" + + Component.onCompleted: { + if (group == root.group) { + value = Mixxx.Config.waveformDefaultZoom() + } + } } MouseArea { diff --git a/src/qml/qmlconfigproxy.cpp b/src/qml/qmlconfigproxy.cpp index 949245f875e9..4d3aba4f5e87 100644 --- a/src/qml/qmlconfigproxy.cpp +++ b/src/qml/qmlconfigproxy.cpp @@ -17,6 +17,12 @@ const QString kPreferencesGroup = QStringLiteral("[Preferences]"); const QString kMultiSamplingKey = QStringLiteral("multi_sampling"); const QString k3DHardwareAccelerationKey = QStringLiteral("force_hardware_acceleration"); +const QString kWaveformGroup = QStringLiteral("[Waveform]"); +const QString kWaveformZoomSynchronizationKey = QStringLiteral("ZoomSynchronization"); +const QString kWaveformDefaultZoomKey = QStringLiteral("DefaultZoom"); +const bool kWaveformZoomSynchronizationDefault = true; +const double kWaveformDefaultZoomDefault = 3.0; + } // namespace namespace mixxx { @@ -53,6 +59,17 @@ bool QmlConfigProxy::useAcceleration() { ConfigKey(kPreferencesGroup, k3DHardwareAccelerationKey)); } +bool QmlConfigProxy::waveformZoomSynchronization() { + return m_pConfig->getValue( + ConfigKey(kWaveformGroup, kWaveformZoomSynchronizationKey), + kWaveformZoomSynchronizationDefault); +} +double QmlConfigProxy::waveformDefaultZoom() { + return m_pConfig->getValue( + ConfigKey(kWaveformGroup, kWaveformDefaultZoomKey), + kWaveformDefaultZoomDefault); +} + // static QmlConfigProxy* QmlConfigProxy::create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine) { // The implementation of this method is mostly taken from the code example diff --git a/src/qml/qmlconfigproxy.h b/src/qml/qmlconfigproxy.h index f3c8ace222d1..d5a03bc7040e 100644 --- a/src/qml/qmlconfigproxy.h +++ b/src/qml/qmlconfigproxy.h @@ -25,6 +25,10 @@ class QmlConfigProxy : public QObject { Q_INVOKABLE int getMultiSamplingLevel(); Q_INVOKABLE bool useAcceleration(); + // Waveform settings + Q_INVOKABLE bool waveformZoomSynchronization(); + Q_INVOKABLE double waveformDefaultZoom(); + static QmlConfigProxy* create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine); static inline void registerUserSettings(UserSettingsPointer pConfig) { s_pUserSettings = std::move(pConfig); From d960c0a172348fc497d899081a8bf30a75dbc932 Mon Sep 17 00:00:00 2001 From: Christophe Henry Date: Sun, 9 Feb 2025 11:36:57 +0100 Subject: [PATCH 054/163] Create JavascriptPlayerProxy to expose track infos to JS controllers in a safe way --- CMakeLists.txt | 2 + res/controllers/engine-api.d.ts | 89 +++++++++++++ .../scripting/controllerscriptenginebase.cpp | 23 ++++ .../scripting/controllerscriptenginebase.h | 9 +- .../scripting/javascriptplayerproxy.cpp | 119 ++++++++++++++++++ .../scripting/javascriptplayerproxy.h | 62 +++++++++ .../controllerscriptinterfacelegacy.cpp | 4 + .../legacy/controllerscriptinterfacelegacy.h | 1 + src/coreservices.cpp | 5 +- 9 files changed, 312 insertions(+), 2 deletions(-) create mode 100644 src/controllers/scripting/javascriptplayerproxy.cpp create mode 100644 src/controllers/scripting/javascriptplayerproxy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c3fb67dd3c1..7979b06fa398 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1635,6 +1635,8 @@ add_library( src/widget/wwidget.cpp src/widget/wwidgetgroup.cpp src/widget/wwidgetstack.cpp + src/controllers/scripting/javascriptplayerproxy.cpp + src/controllers/scripting/javascriptplayerproxy.h ) set(MIXXX_COMMON_PRECOMPILED_HEADER src/util/assert.h) set( diff --git a/res/controllers/engine-api.d.ts b/res/controllers/engine-api.d.ts index 0aa26d09804e..c7c846ecf7cd 100644 --- a/res/controllers/engine-api.d.ts +++ b/res/controllers/engine-api.d.ts @@ -1,3 +1,6 @@ +declare interface QtSlot void> { + connect(callback: F): void +} /** ScriptConnectionJSProxy */ @@ -31,10 +34,96 @@ declare interface ScriptConnection { readonly isConnected: boolean; } +/** JavascriptPlayerProxy */ + +declare interface Player { + /** Track's artist or empty string if no track is loaded */ + readonly artist: string + /** Track's title or empty string if no track is loaded */ + readonly title: string + /** Track's album or empty string if no track is loaded */ + readonly album: string + /** Track's album artist or empty string if no track is loaded */ + readonly albumArtist: string + /** Track's genre or empty string if no track is loaded */ + readonly genre: string + /** Track's composer or empty string if no track is loaded */ + readonly composer: string + /** Track's grouping or empty string if no track is loaded */ + readonly grouping: string + /** Track's year of release or empty string if no track is loaded */ + readonly year: string + /** Track's number or empty string if no track is loaded */ + readonly trackNumber: string + /** Total number of tracks in track's album or empty string if no track is loaded */ + readonly trackTotal: string + + /** Emitted when the track is unloaded from the player. */ + trackUnloaded: QtSlot<() => void> + + /** + * Emitted with the new track's artist when a new track is loaded + * to the player or when the current track's metadata change. + */ + artistChanged: QtSlot<(newArtist: string) => void> + /** + * Emitted with the new track title when a new track is loaded + * to the player or when the current track's metadata change. + */ + titleChanged: QtSlot<(newTitle: string) => void> + /** + * Emitted with the new track album when a new track is loaded + * to the player or when the current track's metadata change. + */ + albumChanged: QtSlot<(newAlbum: string) => void> + /** + * Emitted with the new track album artist when a new track is loaded + * to the player or when the current track's metadata change. + */ + albumArtistChanged: QtSlot<(newAlbumArtist: string) => void> + /** + * Emitted with the new track genre when a new track is loaded + * to the player or when the current track's metadata change. + */ + genreChanged: QtSlot<(newGenre: string) => void> + /** + * Emitted with the new track's composer when a new track is loaded + * to the player or when the current track's metadata change. + */ + composerChanged: QtSlot<(newComposer: string) => void> + /** + * Emitted with the new track's grouping when a new track is loaded + * to the player or when the current track's metadata change. + */ + groupingChanged: QtSlot<(newGrouping: string) => void> + /** + * Emitted with the new track year of release when a new track is loaded + * to the player or when the current track's metadata change. + */ + yearChanged: QtSlot<(newYear: string) => void> + /** + * Emitted with the new track number when a new track is loaded + * to the player or when the current track's metadata change. + */ + trackNumberChanged: QtSlot<(newTrackNumber: string) => void> + /** + * Emitted with the new number of track in track's album when a new track + * is loaded to the player or when the current track's metadata change. + */ + trackTotalChanged: QtSlot<(newTrackTotal: string) => void> +} /** ControllerScriptInterfaceLegacy */ declare namespace engine { + /** + * Obtain the player associated with this deck. + * @param group The midi group for this deck; e.g. '[Channel1]' for deck 1. + * @returns The player providing track information and signals, or undefined + * if not player associated with this group was found. + */ + function getPlayer(group: string): Player | undefined + type SettingValue = string | number | boolean; /** * Gets the value of a controller setting diff --git a/src/controllers/scripting/controllerscriptenginebase.cpp b/src/controllers/scripting/controllerscriptenginebase.cpp index 075ef6f5a8a9..4ed622f147f1 100644 --- a/src/controllers/scripting/controllerscriptenginebase.cpp +++ b/src/controllers/scripting/controllerscriptenginebase.cpp @@ -30,6 +30,11 @@ ControllerScriptEngineBase::ControllerScriptEngineBase( qRegisterMetaType("QMessageBox::StandardButton"); } +void ControllerScriptEngineBase::registerPlayerManager( + std::shared_ptr pPlayerManager) { + ControllerScriptEngineBase::s_pPlayerManager = pPlayerManager; +} + #ifdef MIXXX_USE_QML void ControllerScriptEngineBase::registerTrackCollectionManager( std::shared_ptr pTrackCollectionManager) { @@ -116,6 +121,24 @@ void ControllerScriptEngineBase::reload() { initialize(); } +QObject* ControllerScriptEngineBase::getPlayer(const QString& group) { + VERIFY_OR_DEBUG_ASSERT(s_pPlayerManager != nullptr) { + qCritical() << "Uninitialized PlayerManager"; + return nullptr; + } + auto* const player = s_pPlayerManager->getPlayer(group); + if (!player) { + qWarning() << "PlayerManagerProxy failed to find player for group" << group; + return nullptr; + } + + // Don't set a parent here, so that the QML engine deletes the object when + // the corresponding JS object is garbage collected. + JavascriptPlayerProxy* pPlayerProxy = new JavascriptPlayerProxy(player, nullptr); + QJSEngine::setObjectOwnership(pPlayerProxy, QJSEngine::JavaScriptOwnership); + return pPlayerProxy; +} + bool ControllerScriptEngineBase::executeFunction( QJSValue* pFunctionObject, const QJSValueList& args) { // This function is called from outside the controller engine, so we can't diff --git a/src/controllers/scripting/controllerscriptenginebase.h b/src/controllers/scripting/controllerscriptenginebase.h index 2129184b641b..7523942b04ef 100644 --- a/src/controllers/scripting/controllerscriptenginebase.h +++ b/src/controllers/scripting/controllerscriptenginebase.h @@ -7,6 +7,8 @@ #include #include +#include "javascriptplayerproxy.h" +#include "mixer/playermanager.h" #include "util/runtimeloggingcategory.h" #ifdef MIXXX_USE_QML #include "controllers/controllerenginethreadcontrol.h" @@ -32,6 +34,8 @@ class ControllerScriptEngineBase : public QObject { bool executeFunction(QJSValue* pFunctionObject, const QJSValueList& arguments = {}); + QObject* getPlayer(const QString& group); + /// Shows a UI dialog notifying of a script evaluation error. /// Precondition: QJSValue.isError() == true void showScriptExceptionDialog(const QJSValue& evaluationResult, bool bFatal = false); @@ -53,6 +57,8 @@ class ControllerScriptEngineBase : public QObject { return m_bTesting; } + static void registerPlayerManager(std::shared_ptr pPlayerManager); + #ifdef MIXXX_USE_QML static void registerTrackCollectionManager( std::shared_ptr pTrackCollectionManager); @@ -91,8 +97,9 @@ class ControllerScriptEngineBase : public QObject { #endif bool m_bTesting; -#ifdef MIXXX_USE_QML private: + static inline std::shared_ptr s_pPlayerManager; +#ifdef MIXXX_USE_QML static inline std::shared_ptr s_pTrackCollectionManager; protected: diff --git a/src/controllers/scripting/javascriptplayerproxy.cpp b/src/controllers/scripting/javascriptplayerproxy.cpp new file mode 100644 index 000000000000..7a81146d1500 --- /dev/null +++ b/src/controllers/scripting/javascriptplayerproxy.cpp @@ -0,0 +1,119 @@ +#include "javascriptplayerproxy.h" + +#include "moc_javascriptplayerproxy.cpp" + +JavascriptPlayerProxy::JavascriptPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent) + : QObject(parent), + m_pTrackPlayer(pTrackPlayer) { + if (m_pTrackPlayer && m_pTrackPlayer->getLoadedTrack()) { + slotTrackLoaded(pTrackPlayer->getLoadedTrack()); + } + + connect(m_pTrackPlayer, + &BaseTrackPlayer::loadingTrack, + this, + &JavascriptPlayerProxy::slotLoadingTrack); + connect(m_pTrackPlayer, + &BaseTrackPlayer::newTrackLoaded, + this, + &JavascriptPlayerProxy::slotTrackLoaded); + connect(m_pTrackPlayer, + &BaseTrackPlayer::playerEmpty, + this, + [this]() { + disconnectTrack(); + emit trackUnloaded(); + }); +} + +void JavascriptPlayerProxy::slotTrackLoaded(TrackPointer pTrack) { + m_pCurrentTrack = pTrack; + if (pTrack == nullptr) { + emit trackUnloaded(); + return; + } + + connect(pTrack.get(), + &Track::artistChanged, + this, + &JavascriptPlayerProxy::artistChanged); + connect(pTrack.get(), + &Track::titleChanged, + this, + &JavascriptPlayerProxy::titleChanged); + connect(pTrack.get(), + &Track::albumChanged, + this, + &JavascriptPlayerProxy::albumChanged); + connect(pTrack.get(), + &Track::albumArtistChanged, + this, + &JavascriptPlayerProxy::albumArtistChanged); + connect(pTrack.get(), + &Track::genreChanged, + this, + &JavascriptPlayerProxy::genreChanged); + connect(pTrack.get(), + &Track::composerChanged, + this, + &JavascriptPlayerProxy::composerChanged); + connect(pTrack.get(), + &Track::groupingChanged, + this, + &JavascriptPlayerProxy::groupingChanged); + connect(pTrack.get(), + &Track::yearChanged, + this, + &JavascriptPlayerProxy::yearChanged); + connect(pTrack.get(), + &Track::trackNumberChanged, + this, + &JavascriptPlayerProxy::trackNumberChanged); + connect(pTrack.get(), + &Track::trackTotalChanged, + this, + &JavascriptPlayerProxy::trackTotalChanged); + + emit artistChanged(m_pCurrentTrack->getArtist()); + emit titleChanged(m_pCurrentTrack->getTitle()); + emit albumChanged(m_pCurrentTrack->getAlbum()); + emit albumArtistChanged(m_pCurrentTrack->getAlbumArtist()); + emit genreChanged(m_pCurrentTrack->getGenre()); + emit composerChanged(m_pCurrentTrack->getComposer()); + emit groupingChanged(m_pCurrentTrack->getGrouping()); + emit yearChanged(m_pCurrentTrack->getYear()); + emit trackNumberChanged(m_pCurrentTrack->getTrackNumber()); + emit trackTotalChanged(m_pCurrentTrack->getTrackTotal()); +} + +void JavascriptPlayerProxy::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) { + VERIFY_OR_DEBUG_ASSERT(pOldTrack == m_pCurrentTrack) { + qWarning() << "Javascript Player proxy was expected to contain " + << pOldTrack.get() << "as active track but got" + << m_pCurrentTrack.get(); + } + + if (pNewTrack == m_pCurrentTrack) { + return; + } + + disconnectTrack(); + m_pCurrentTrack = pNewTrack; +} + +void JavascriptPlayerProxy::disconnectTrack() { + if (m_pCurrentTrack != nullptr) { + m_pCurrentTrack->disconnect(this); + } +} + +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, artist, getArtist) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, title, getTitle) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, album, getAlbum) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, albumArtist, getAlbumArtist) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, genre, getGenre) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, composer, getComposer) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, grouping, getGrouping) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, year, getYear) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, trackNumber, getTrackNumber) +PROPERTY_IMPL_GETTER(JavascriptPlayerProxy, QString, trackTotal, getTrackTotal) diff --git a/src/controllers/scripting/javascriptplayerproxy.h b/src/controllers/scripting/javascriptplayerproxy.h new file mode 100644 index 000000000000..da2d04260d13 --- /dev/null +++ b/src/controllers/scripting/javascriptplayerproxy.h @@ -0,0 +1,62 @@ +#pragma once + +#include "mixer/basetrackplayer.h" +#include "track/track.h" + +#define PROPERTY_IMPL_GETTER(NAMESPACE, TYPE, NAME, GETTER) \ + TYPE NAMESPACE::GETTER() const { \ + const TrackPointer pTrack = m_pCurrentTrack; \ + if (pTrack == nullptr) { \ + return TYPE(); \ + } \ + return pTrack->GETTER(); \ + } + +class JavascriptPlayerProxy : public QObject { + Q_OBJECT + Q_PROPERTY(QString artist READ getArtist NOTIFY artistChanged) + Q_PROPERTY(QString title READ getTitle NOTIFY titleChanged) + Q_PROPERTY(QString album READ getAlbum NOTIFY albumChanged) + Q_PROPERTY(QString albumArtist READ getAlbumArtist NOTIFY albumArtistChanged) + Q_PROPERTY(QString genre READ getGenre STORED false NOTIFY genreChanged) + Q_PROPERTY(QString composer READ getComposer NOTIFY composerChanged) + Q_PROPERTY(QString grouping READ getGrouping NOTIFY groupingChanged) + Q_PROPERTY(QString year READ getYear NOTIFY yearChanged) + Q_PROPERTY(QString trackNumber READ getTrackNumber NOTIFY trackNumberChanged) + Q_PROPERTY(QString trackTotal READ getTrackTotal NOTIFY trackTotalChanged) + public: + explicit JavascriptPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent); + + QString getTitle() const; + QString getArtist() const; + QString getAlbum() const; + QString getAlbumArtist() const; + QString getGenre() const; + QString getComposer() const; + QString getGrouping() const; + QString getYear() const; + QString getTrackNumber() const; + QString getTrackTotal() const; + + public slots: + void slotTrackLoaded(TrackPointer pTrack); + void slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack); + + signals: + void trackUnloaded(); + void albumChanged(QString newAlbum); + void titleChanged(QString newTitle); + void artistChanged(QString newArtist); + void albumArtistChanged(QString newAlbumArtist); + void genreChanged(QString newGenre); + void composerChanged(QString newComposer); + void groupingChanged(QString grouping); + void yearChanged(QString newYear); + void trackNumberChanged(QString newTrackNumber); + void trackTotalChanged(QString newTrackTotal); + + protected: + void disconnectTrack(); + QPointer m_pTrackPlayer; + TrackPointer m_pCurrentTrack; +}; diff --git a/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.cpp b/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.cpp index 543319a40ffd..960ba0214d7a 100644 --- a/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.cpp +++ b/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.cpp @@ -136,6 +136,10 @@ QJSValue ControllerScriptInterfaceLegacy::getSetting(const QString& name) { } } +QObject* ControllerScriptInterfaceLegacy::getPlayer(const QString& group) { + return m_pScriptEngineLegacy->getPlayer(group); +} + double ControllerScriptInterfaceLegacy::getValue(const QString& group, const QString& name) { ControlObjectScript* coScript = getControlObjectScript(group, name); if (coScript == nullptr) { diff --git a/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.h b/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.h index 745eb54c40a8..19d629a86900 100644 --- a/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.h +++ b/src/controllers/scripting/legacy/controllerscriptinterfacelegacy.h @@ -56,6 +56,7 @@ class ControllerScriptInterfaceLegacy : public QObject { virtual ~ControllerScriptInterfaceLegacy(); Q_INVOKABLE QJSValue getSetting(const QString& name); + Q_INVOKABLE QObject* getPlayer(const QString& group); Q_INVOKABLE double getValue(const QString& group, const QString& name); Q_INVOKABLE void setValue(const QString& group, const QString& name, double newValue); Q_INVOKABLE double getParameter(const QString& group, const QString& name); diff --git a/src/coreservices.cpp b/src/coreservices.cpp index 040b9dad15b9..1de241f9594c 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -12,6 +12,7 @@ #include "control/controlindicatortimer.h" #include "controllers/controllermanager.h" #include "controllers/keyboard/keyboardeventfilter.h" +#include "controllers/scripting/controllerscriptenginebase.h" #include "database/mixxxdb.h" #include "effects/effectsmanager.h" #include "engine/enginemixer.h" @@ -38,7 +39,6 @@ #include #include -#include "controllers/scripting/controllerscriptenginebase.h" #include "qml/qmlconfigproxy.h" #include "qml/qmleffectsmanagerproxy.h" #include "qml/qmllibraryproxy.h" @@ -495,6 +495,8 @@ void CoreServices::initialize(QApplication* pApp) { m_isInitialized = true; + ControllerScriptEngineBase::registerPlayerManager(getPlayerManager()); + #ifdef MIXXX_USE_QML initializeQMLSingletons(); } @@ -636,6 +638,7 @@ void CoreServices::finalize() { mixxx::qml::QmlLibraryProxy::registerLibrary(nullptr); ControllerScriptEngineBase::registerTrackCollectionManager(nullptr); + ControllerScriptEngineBase::registerPlayerManager(nullptr); #endif // Stop all pending library operations From 3d974f7c0617ccd41961484f6572ec4618571c71 Mon Sep 17 00:00:00 2001 From: Nicolas PARLANT Date: Mon, 31 Mar 2025 13:33:13 +0000 Subject: [PATCH 055/163] X11-less - Use FindWrapOpenGL Use FindWrapOpenGL.cmake. It allows X11-less system. Set link_target to OpenGL::OpenGL, GLVND-based. If not found, use OpenGL:GL. Furthermore, adding a __X11__ definition so that the screensaver that requires Xlib is now optional. Signed-off-by: Nicolas PARLANT --- CMakeLists.txt | 10 ++++++++-- src/util/screensaver.cpp | 5 +++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7a48247f97a..dc54ed5fad34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3187,8 +3187,8 @@ else() set(CMAKE_FIND_FRAMEWORK FIRST) endif() set(OpenGL_GL_PREFERENCE "GLVND") - find_package(OpenGL REQUIRED) if(EMSCRIPTEN) + find_package(OpenGL REQUIRED) # Emscripten's FindOpenGL.cmake does not create OpenGL::GL target_link_libraries(mixxx-lib PRIVATE ${OPENGL_gl_LIBRARY}) target_compile_definitions(mixxx-lib PUBLIC QT_OPENGL_ES_2) @@ -3200,7 +3200,12 @@ else() PUBLIC -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 -sFULL_ES2=1 ) else() - target_link_libraries(mixxx-lib PRIVATE OpenGL::GL) + find_package(WrapOpenGL REQUIRED) + if(OPENGL_opengl_LIBRARY) + target_link_libraries(mixxx-lib PRIVATE OpenGL::OpenGL) + else() + target_link_libraries(mixxx-lib PRIVATE OpenGL::GL) + endif() endif() if(UNIX AND QGLES2) target_compile_definitions(mixxx-lib PUBLIC QT_OPENGL_ES_2) @@ -3841,6 +3846,7 @@ elseif(UNIX AND NOT APPLE AND NOT EMSCRIPTEN) if(${X11_FOUND}) target_include_directories(mixxx-lib SYSTEM PUBLIC "${X11_INCLUDE_DIR}") target_link_libraries(mixxx-lib PRIVATE "${X11_LIBRARIES}") + target_compile_definitions(mixxx-lib PUBLIC __X11__) endif() find_package(Qt${QT_VERSION_MAJOR} COMPONENTS DBus REQUIRED) target_link_libraries(mixxx-lib PUBLIC Qt${QT_VERSION_MAJOR}::DBus) diff --git a/src/util/screensaver.cpp b/src/util/screensaver.cpp index 9eae4a1b4cd0..88f6e880ea56 100644 --- a/src/util/screensaver.cpp +++ b/src/util/screensaver.cpp @@ -36,7 +36,8 @@ With the help of the following source codes: # include #endif -#if defined(__LINUX__) || (defined(HAVE_XSCREENSAVER_SUSPEND) && HAVE_XSCREENSAVER_SUSPEND) +#if (defined(__LINUX__) && defined(__X11__)) || \ + (defined(HAVE_XSCREENSAVER_SUSPEND) && HAVE_XSCREENSAVER_SUSPEND) # define None XNone # define Window XWindow # include @@ -146,7 +147,7 @@ void ScreenSaverHelper::uninhibitInternal() s_enabled = false; } -#elif defined(Q_OS_LINUX) +#elif (defined(Q_OS_LINUX) && defined(__X11__)) const char *SCREENSAVERS[][4] = { // org.freedesktop.ScreenSaver is the standard. should work for gnome and kde too, // but I add their specific names too From ebeff352f22f4d1dbc35d7f7e3c2c88f1965dc4e Mon Sep 17 00:00:00 2001 From: Nicolas PARLANT Date: Mon, 16 Jun 2025 11:00:46 +0200 Subject: [PATCH 056/163] Don't try localeFromXkbSymbol w/o __X11__ defined Because X11/XKBlib.h is a part of libX11 Signed-off-by: Nicolas PARLANT --- src/coreservices.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreservices.cpp b/src/coreservices.cpp index 20fb1c240c66..0837d6039076 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -63,7 +63,7 @@ #include "util/sandbox.h" #endif -#ifdef Q_OS_LINUX +#if defined(Q_OS_LINUX) && defined(__X11__) #include #endif @@ -118,7 +118,7 @@ Bool __xErrorHandler(Display* display, XErrorEvent* event, xError* error) { #endif -#if defined(Q_OS_LINUX) +#if defined(Q_OS_LINUX) && defined(__X11__) QLocale localeFromXkbSymbol(const QString& xkbLayout) { // This maps XKB layouts to locales of keyboard mappings that are shipped with Mixxx static const QMap xkbToLocaleMap = { @@ -268,7 +268,7 @@ QString getCurrentXkbLayoutName() { // to "ibus engine". QGuiApplication::inputMethod() does not work with GNOME and XFCE // https://bugreports.qt.io/browse/QTBUG-137302 inline QLocale inputLocale() { -#if defined(Q_OS_LINUX) +#if defined(Q_OS_LINUX) && defined(__X11__) QString layoutName = getCurrentXkbLayoutName(); if (!layoutName.isEmpty()) { qDebug() << "Keyboard Layout from XKB:" << layoutName; From 7b116a4a0adf1dc3cffa23c1acc2a0d87f5fb1e8 Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 15 Jun 2025 19:33:21 +0200 Subject: [PATCH 057/163] Made JS code containing the new engine.getPlayer API in controller_mapping_validation_test and controllerscriptenginelegacy_test executable without crash --- .../scripting/controllerscriptenginebase.cpp | 2 +- .../scripting/controllerscriptenginebase.h | 7 +- .../controller_mapping_validation_test.cpp | 23 ++--- src/test/controller_mapping_validation_test.h | 3 - .../controllerscriptenginelegacy_test.cpp | 98 ++++++++++++++++++- 5 files changed, 110 insertions(+), 23 deletions(-) diff --git a/src/controllers/scripting/controllerscriptenginebase.cpp b/src/controllers/scripting/controllerscriptenginebase.cpp index 4ed622f147f1..2137803be3e2 100644 --- a/src/controllers/scripting/controllerscriptenginebase.cpp +++ b/src/controllers/scripting/controllerscriptenginebase.cpp @@ -35,12 +35,12 @@ void ControllerScriptEngineBase::registerPlayerManager( ControllerScriptEngineBase::s_pPlayerManager = pPlayerManager; } -#ifdef MIXXX_USE_QML void ControllerScriptEngineBase::registerTrackCollectionManager( std::shared_ptr pTrackCollectionManager) { s_pTrackCollectionManager = std::move(pTrackCollectionManager); } +#ifdef MIXXX_USE_QML void ControllerScriptEngineBase::handleQMLErrors(const QList& qmlErrors) { for (const QQmlError& error : std::as_const(qmlErrors)) { showQMLExceptionDialog(error, m_bErrorsAreFatal); diff --git a/src/controllers/scripting/controllerscriptenginebase.h b/src/controllers/scripting/controllerscriptenginebase.h index 7523942b04ef..05bdaba7a92f 100644 --- a/src/controllers/scripting/controllerscriptenginebase.h +++ b/src/controllers/scripting/controllerscriptenginebase.h @@ -16,9 +16,7 @@ class Controller; class QJSEngine; -#ifdef MIXXX_USE_QML class TrackCollectionManager; -#endif /// ControllerScriptEngineBase manages the JavaScript engine for controller scripts. /// ControllerScriptModuleEngine implements the current system using JS modules. @@ -59,10 +57,9 @@ class ControllerScriptEngineBase : public QObject { static void registerPlayerManager(std::shared_ptr pPlayerManager); -#ifdef MIXXX_USE_QML static void registerTrackCollectionManager( std::shared_ptr pTrackCollectionManager); -#endif + signals: void beforeShutdown(); @@ -99,9 +96,9 @@ class ControllerScriptEngineBase : public QObject { private: static inline std::shared_ptr s_pPlayerManager; -#ifdef MIXXX_USE_QML static inline std::shared_ptr s_pTrackCollectionManager; +#ifdef MIXXX_USE_QML protected: /// Pause the GUI main thread. Pause is required by rendering /// thread (https://doc.qt.io/qt-6/qquickrendercontrol.html#sync). This diff --git a/src/test/controller_mapping_validation_test.cpp b/src/test/controller_mapping_validation_test.cpp index 2b886449412a..1893de1c4bd9 100644 --- a/src/test/controller_mapping_validation_test.cpp +++ b/src/test/controller_mapping_validation_test.cpp @@ -8,7 +8,6 @@ #include "controllers/defs_controllers.h" #include "controllers/scripting/legacy/controllerscriptenginelegacy.h" #include "track/track.h" -#ifdef MIXXX_USE_QML #include "effects/effectsmanager.h" #include "engine/channelhandle.h" #include "engine/enginemixer.h" @@ -16,10 +15,11 @@ #include "library/library.h" #include "mixer/playerinfo.h" #include "mixer/playermanager.h" +#ifdef MIXXX_USE_QML #include "qml/qmlplayermanagerproxy.h" -#include "soundio/soundmanager.h" #endif #include "moc_controller_mapping_validation_test.cpp" +#include "soundio/soundmanager.h" FakeMidiControllerJSProxy::FakeMidiControllerJSProxy() : ControllerJSProxy(nullptr) { @@ -122,18 +122,10 @@ bool FakeController::isMappable() const { return false; } -#ifdef MIXXX_USE_QML -void deleteTrack(Track* pTrack) { - // Delete track objects directly in unit tests with - // no main event loop - delete pTrack; -}; -#endif - void LegacyControllerMappingValidationTest::SetUp() { m_mappingPath = getTestDir().filePath(QStringLiteral("../../res/controllers/")); m_pEnumerator.reset(new MappingInfoEnumerator(QList{m_mappingPath.absolutePath()})); -#ifdef MIXXX_USE_QML + // This setup mirrors coreservices -- it would be nice if we could use coreservices instead // but it does a lot of local disk / settings setup. auto pChannelHandleFactory = std::make_shared(); @@ -165,7 +157,7 @@ void LegacyControllerMappingValidationTest::SetUp() { nullptr, m_pConfig, dbConnectionPooler(), - deleteTrack); + [](Track* pTrack) { delete pTrack; }); m_pRecordingManager = std::make_shared(m_pConfig, m_pEngine.get()); CoverArtCache::createInstance(); @@ -178,16 +170,21 @@ void LegacyControllerMappingValidationTest::SetUp() { m_pRecordingManager.get()); m_pPlayerManager->bindToLibrary(m_pLibrary.get()); +#ifdef MIXXX_USE_QML mixxx::qml::QmlPlayerManagerProxy::registerPlayerManager(m_pPlayerManager); +#endif + ControllerScriptEngineBase::registerPlayerManager(m_pPlayerManager); ControllerScriptEngineBase::registerTrackCollectionManager(m_pTrackCollectionManager); } void LegacyControllerMappingValidationTest::TearDown() { PlayerInfo::destroy(); CoverArtCache::destroy(); +#ifdef MIXXX_USE_QML mixxx::qml::QmlPlayerManagerProxy::registerPlayerManager(nullptr); - ControllerScriptEngineBase::registerTrackCollectionManager(nullptr); #endif + ControllerScriptEngineBase::registerPlayerManager(nullptr); + ControllerScriptEngineBase::registerTrackCollectionManager(nullptr); } bool LegacyControllerMappingValidationTest::testLoadMapping(const MappingInfo& mapping) { diff --git a/src/test/controller_mapping_validation_test.h b/src/test/controller_mapping_validation_test.h index ee5671616799..ab1c0a1c9dd2 100644 --- a/src/test/controller_mapping_validation_test.h +++ b/src/test/controller_mapping_validation_test.h @@ -1,7 +1,6 @@ #pragma once #include - #include "control/controlindicatortimer.h" #include "controllers/controller.h" #include "controllers/controllermappinginfoenumerator.h" @@ -222,7 +221,6 @@ class LegacyControllerMappingValidationTest : public MixxxDbTest, SoundSourcePro protected: void SetUp() override; -#ifdef MIXXX_USE_QML void TearDown() override; TrackPointer getOrAddTrackByLocation( @@ -239,7 +237,6 @@ class LegacyControllerMappingValidationTest : public MixxxDbTest, SoundSourcePro std::shared_ptr m_pTrackCollectionManager; std::shared_ptr m_pRecordingManager; std::shared_ptr m_pLibrary; -#endif bool testLoadMapping(const MappingInfo& mapping); diff --git a/src/test/controllerscriptenginelegacy_test.cpp b/src/test/controllerscriptenginelegacy_test.cpp index 9447f3d1ad61..bd4374f31d9a 100644 --- a/src/test/controllerscriptenginelegacy_test.cpp +++ b/src/test/controllerscriptenginelegacy_test.cpp @@ -30,6 +30,22 @@ #include "test/mixxxtest.h" #include "util/color/colorpalette.h" #include "util/time.h" +#include "track/track.h" +#include "sources/soundsourceproxy.h" +#include "control/controlindicatortimer.h" +#include "database/mixxxdb.h" +#include "test/mixxxdbtest.h" +#include "test/soundsourceproviderregistration.h" +#include "effects/effectsmanager.h" +#include "engine/enginemixer.h" +#include "library/coverartcache.h" +#include "soundio/soundmanager.h" +#include "library/trackcollectionmanager.h" +#include "mixer/playerinfo.h" +#include "mixer/playermanager.h" +#include "recording/recordingmanager.h" +#include "library/library.h" +#include "engine/channelhandle.h" using ::testing::_; using namespace std::chrono_literals; @@ -38,7 +54,7 @@ typedef std::unique_ptr ScopedTemporaryFile; const RuntimeLoggingCategory logger(QString("test").toLocal8Bit()); -class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, public MixxxTest { +class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, public MixxxDbTest, SoundSourceProviderRegistration { protected: ControllerScriptEngineLegacyTest() : ControllerScriptEngineLegacy(nullptr, logger) { @@ -57,13 +73,84 @@ class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, pu mixxx::Time::addTestTime(10ms); QThread::currentThread()->setObjectName("Main"); initialize(); + + // This setup mirrors coreservices -- it would be nice if we could use coreservices instead + // but it does a lot of local disk / settings setup. + auto pChannelHandleFactory = std::make_shared(); + m_pEffectsManager = std::make_shared(config(), pChannelHandleFactory); + m_pEngine = std::make_shared( + config(), + "[Master]", + m_pEffectsManager.get(), + pChannelHandleFactory, + true); + m_pSoundManager = std::make_shared(config(), m_pEngine.get()); + m_pControlIndicatorTimer = std::make_shared(nullptr); + m_pEngine->registerNonEngineChannelSoundIO(gsl::make_not_null(m_pSoundManager.get())); + + CoverArtCache::createInstance(); + + m_pPlayerManager = std::make_shared(config(), + m_pSoundManager.get(), + m_pEffectsManager.get(), + m_pEngine.get()); + + m_pPlayerManager->addConfiguredDecks(); + m_pPlayerManager->addSampler(); + PlayerInfo::create(); + m_pEffectsManager->setup(); + + const auto dbConnection = mixxx::DbConnectionPooled(dbConnectionPooler()); + if (!MixxxDb::initDatabaseSchema(dbConnection)) { + exit(1); + } + + m_pTrackCollectionManager = std::make_shared( + nullptr, + config(), + dbConnectionPooler(), + [](Track* pTrack) { delete pTrack; }); + + m_pRecordingManager = std::make_shared(config(), m_pEngine.get()); + m_pLibrary = std::make_shared( + nullptr, + config(), + dbConnectionPooler(), + m_pTrackCollectionManager.get(), + m_pPlayerManager.get(), + m_pRecordingManager.get()); + + m_pPlayerManager->bindToLibrary(m_pLibrary.get()); + ControllerScriptEngineBase::registerPlayerManager(m_pPlayerManager); + ControllerScriptEngineBase::registerTrackCollectionManager(m_pTrackCollectionManager); } + // Helper to get or add a track by location, like in PlayerManagerTest + TrackPointer getOrAddTrackByLocation(const QString& trackLocation) { + return m_pTrackCollectionManager->getOrAddTrack( + TrackRef::fromFilePath(trackLocation)); + } void TearDown() override { mixxx::Time::setTestMode(false); #ifdef MIXXX_USE_QML m_rootItems.clear(); #endif + CoverArtCache::destroy(); + ControllerScriptEngineBase::registerPlayerManager(nullptr); + ControllerScriptEngineBase::registerTrackCollectionManager(nullptr); + } + + ~ControllerScriptEngineLegacyTest() { + // Reset in the correct order to avoid singleton destruction issues + m_pSoundManager.reset(); + m_pPlayerManager.reset(); + PlayerInfo::destroy(); + m_pLibrary.reset(); + m_pRecordingManager.reset(); + m_pEngine.reset(); + m_pEffectsManager.reset(); + m_pTrackCollectionManager.reset(); + m_pControlIndicatorTimer.reset(); } bool evaluateScriptFile(const QFileInfo& scriptFile) { @@ -107,6 +194,15 @@ class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, pu handleScreenFrame(screeninfo, frame, timestamp); } #endif + + std::shared_ptr m_pEffectsManager; + std::shared_ptr m_pEngine; + std::shared_ptr m_pSoundManager; + std::shared_ptr m_pControlIndicatorTimer; + std::shared_ptr m_pPlayerManager; + std::shared_ptr m_pRecordingManager; + std::shared_ptr m_pLibrary; + std::shared_ptr m_pTrackCollectionManager; }; TEST_F(ControllerScriptEngineLegacyTest, commonScriptHasNoErrors) { From 80e959a3e289ea257dc692c3bc7697ad21e67eb9 Mon Sep 17 00:00:00 2001 From: Christophe Henry Date: Fri, 20 Jun 2025 14:59:50 +0200 Subject: [PATCH 058/163] Add tests for JavascriptPlayerProxy API --- .../controllerscriptenginelegacy_test.cpp | 94 ++++++++++++++---- src/test/id3-test-data/all.mp3 | Bin 0 -> 4096 bytes 2 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 src/test/id3-test-data/all.mp3 diff --git a/src/test/controllerscriptenginelegacy_test.cpp b/src/test/controllerscriptenginelegacy_test.cpp index bd4374f31d9a..2258d47c7f3b 100644 --- a/src/test/controllerscriptenginelegacy_test.cpp +++ b/src/test/controllerscriptenginelegacy_test.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -27,25 +28,28 @@ #ifdef MIXXX_USE_QML #include "qml/qmlmixxxcontrollerscreen.h" #endif -#include "test/mixxxtest.h" -#include "util/color/colorpalette.h" -#include "util/time.h" -#include "track/track.h" -#include "sources/soundsourceproxy.h" #include "control/controlindicatortimer.h" #include "database/mixxxdb.h" -#include "test/mixxxdbtest.h" -#include "test/soundsourceproviderregistration.h" #include "effects/effectsmanager.h" +#include "engine/channelhandle.h" +#include "engine/channels/enginedeck.h" +#include "engine/enginebuffer.h" #include "engine/enginemixer.h" #include "library/coverartcache.h" -#include "soundio/soundmanager.h" +#include "library/library.h" #include "library/trackcollectionmanager.h" +#include "mixer/deck.h" #include "mixer/playerinfo.h" #include "mixer/playermanager.h" #include "recording/recordingmanager.h" -#include "library/library.h" -#include "engine/channelhandle.h" +#include "soundio/soundmanager.h" +#include "sources/soundsourceproxy.h" +#include "test/mixxxdbtest.h" +#include "test/mixxxtest.h" +#include "test/soundsourceproviderregistration.h" +#include "track/track.h" +#include "util/color/colorpalette.h" +#include "util/time.h" using ::testing::_; using namespace std::chrono_literals; @@ -54,7 +58,9 @@ typedef std::unique_ptr ScopedTemporaryFile; const RuntimeLoggingCategory logger(QString("test").toLocal8Bit()); -class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, public MixxxDbTest, SoundSourceProviderRegistration { +class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, + public MixxxDbTest, + SoundSourceProviderRegistration { protected: ControllerScriptEngineLegacyTest() : ControllerScriptEngineLegacy(nullptr, logger) { @@ -87,7 +93,7 @@ class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, pu m_pSoundManager = std::make_shared(config(), m_pEngine.get()); m_pControlIndicatorTimer = std::make_shared(nullptr); m_pEngine->registerNonEngineChannelSoundIO(gsl::make_not_null(m_pSoundManager.get())); - + CoverArtCache::createInstance(); m_pPlayerManager = std::make_shared(config(), @@ -125,11 +131,22 @@ class ControllerScriptEngineLegacyTest : public ControllerScriptEngineLegacy, pu ControllerScriptEngineBase::registerTrackCollectionManager(m_pTrackCollectionManager); } - // Helper to get or add a track by location, like in PlayerManagerTest - TrackPointer getOrAddTrackByLocation(const QString& trackLocation) { - return m_pTrackCollectionManager->getOrAddTrack( - TrackRef::fromFilePath(trackLocation)); + void loadTrackSync(const QString& trackLocation) { + TrackPointer pTrack1 = m_pTrackCollectionManager->getOrAddTrack( + TrackRef::fromFilePath(getTestDir().filePath(trackLocation))); + auto* deck = m_pPlayerManager->getDeck(1); + deck->slotLoadTrack(pTrack1, +#ifdef __STEM__ + mixxx::StemChannelSelection(), +#endif + false); + m_pEngine->process(1024); + while (!deck->getEngineDeck()->getEngineBuffer()->isTrackLoaded()) { + QTest::qSleep(100); + } + processEvents(); } + void TearDown() override { mixxx::Time::setTestMode(false); #ifdef MIXXX_USE_QML @@ -914,11 +931,54 @@ TEST_F(ControllerScriptEngineLegacyTest, convertCharsetAllCharset) { } } +TEST_F(ControllerScriptEngineLegacyTest, JavascriptPlayerProxy) { + QMap expectedValues = { + std::pair("artist", "Test Artist"), + std::pair("title", "Test title"), + std::pair("album", "Test Album"), + std::pair("albumArtist", "Test Album Artist"), + std::pair("genre", "Test genre"), + std::pair("composer", "Test Composer"), + std::pair("grouping", ""), + std::pair("year", "2011"), + std::pair("trackNumber", "07"), + std::pair("trackTotal", "60")}; + + m_pJSEngine->globalObject().setProperty( + "testedValues", m_pJSEngine->toScriptValue(expectedValues.keys())); + + const auto* code = + "var result = {};" + "var player = engine.getPlayer('[Channel1]');" + "for(const name of testedValues) {" + " player[`${name}Changed`].connect(newValue => {" + " result[name] = newValue;" + " });" + "}"; + + EXPECT_TRUE(evaluateAndAssert(code)) << "Evaluation error in test code"; + loadTrackSync("id3-test-data/all.mp3"); + for (auto [property, expected] : expectedValues.asKeyValueRange()) { + auto const playerActual = evaluate("player." + property).toString(); + auto const slotActual = evaluate("result." + property).toString(); + EXPECT_QSTRING_EQ(expected, playerActual) + << QString("engine.getPlayer(...).%1 doesn't corresponds to " + "its expected value (expected: %2, actual: %3)") + .arg(property, expected, playerActual) + .toStdString(); + EXPECT_QSTRING_EQ(expected, slotActual) << QString( + "engine.getPlayer(...).%1Changed slot didn't produce the " + "expected value (expected: %2, actual: %3)") + .arg(property, expected, playerActual) + .toStdString(); + } +} + #ifdef MIXXX_USE_QML class MockScreenRender : public ControllerRenderingEngine { public: MockScreenRender(const LegacyControllerMapping::ScreenInfo& info) - : ControllerRenderingEngine(info, new ControllerEngineThreadControl){}; + : ControllerRenderingEngine(info, new ControllerEngineThreadControl) {}; MOCK_METHOD(void, requestSendingFrameData, (Controller * controller, const QByteArray& frame), diff --git a/src/test/id3-test-data/all.mp3 b/src/test/id3-test-data/all.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2a383fc1fe685f8ce20d6f8abab1b201dc3b4e65 GIT binary patch literal 4096 zcmeHISyWS577a2Bk`Th6fFy<>gqbKI6qG;+fiP(ZV=+TOBFd-;h(rh=Q!$7}v;?A3 zh*E-zA~H`hg-L`4wL}~O(v(ahhQhplbhZAJpS@OpG<&VH-nsj{ckfwyuXnDUHBJ}; zLRyDrM>7HwDKKdCm{??NSZp|*c93MaS^Y{{M#qN5#DeVRtMG4Zc;NA)$p6$V9jrk9 z+cuV)HJT@h3X-B=7#SEE(x^mxFckyC0IzRsKqERkf%&&@Lg~k%=^*I{k}_cYyB}i2 z(a4AxdNjD+!j=MC3T!E`rNIA40pQR4&c7XPcPu0VB%xq{gI=-^g8Mr{zJucLfcqT) z-vM|Q!NJmzgwrDsqJ;*&_Jm-n3yXo*5OcGSA;Ox**TVnH^Dl#39>Z43as}-^mSwTB zEt7ic0pV;I1Y$O4q4XjMpPbqw#m@tBldA0Vdjr2>hdqhbB*NigL@_0OkiiEF)S7DF;dO2ZpOAN z?lMW({!EX;Do;oT{leRx!*!m{K=R7E;Iu&SYf@7%d$jWX%eG^-4~Y&xzZov!UAo$E zTUE&OgDX^-*?w_ekiMRCM6`n>VZECJGCLSKIsiev7ql~E2O4u z%fxN?qM9#y%n)lu)4rEeeD_A?bVu;BqU!ja4wfaVcPezWSP$)TaEM+bQjQD4_O*Xn z?(*A5ax?pMZo!66DEExOa{R0|u=aOO<0N?H>5uhXuQN~wok+j2ORFc@=|1)Vzj!s` zg^kX|wLHCJS z7{sj@{}QrDs(Ciw2ECoCnlf1L)>NsrGSoVh$cvpoH|*H&t|5US|1tS8iT<8l@qC?r zc~pO;AvEaPb5Yag57?PU=FC^q6K)rr97kaiy#9B{GIgc%7u`6Xm9sUuW<_I)9TIg- z(Q4#%gM@x*+9YM82oFnPoPgggGE?p^?@cfl`c!)r*0t%71Jji!vjMpSY|Ht}AwwJc z+@~h`?c81@L{+gM(yE&eHJ{?D>(K&2j0!>>nkVCo*7}@1TKIhaM#0MTflf5Lh?1bA zas2wS*mmjMr*H#N>R>L3C8MoJJ!Nq>h6u3B69?4f7Y;0jB~pixZU}SZfNm%KQqv5~ zs{Dq6RN-nn%3;+zRmTuP>3TUd%335|=!ZAX=xe^&C`F5&;aq&k7SUqmpW7DxNG7K9 zV)@JbyJFQxjR&Ys9JytxRZdMlYJP6V7~^Vz`V>?2)~zuGerb!o{zt!6VC~v*zPER^ zy@eG8MSXplMZT$Wsn%4&7$?&vt`Nn_e;Y(f|$UdCy@A&#N_oqOw`j%u$ zK(lSM_HKhJ?hHBNA5&y|lU+NaTwO`6W`%t#+!3N|_;!SrTbh=Pycg%o>4B;qA zRnkM&jVyW8M7+YNmPur3$5QR-v}Ia8Y}|UJwM3hG=#XQ3TU_hHp2jCbm1DE<3jf3% z2lxPQg-_qkpT1;RNX40ST;A0s193<_^x0+~L(-NuPeJBE{A*Gsua!w}cp-YP8cEtX6Gv zHKimX+@;pCoo}7iMA2o_&Gzy#KPO*9v4fPDS(GKTLdun*Y5WkXk(Yimt!rtc(@)~$ zMK1i%tS&9<)n0plzOY9WieZc7DE7-q2DgV@Ddp@61xz*I9M8!KM_fx^_B7gR2O1Di z_ovtIC%V;M>d?5&Ia5~7=G#?iT Date: Sat, 21 Jun 2025 02:10:38 +0200 Subject: [PATCH 059/163] Dont use asKeyValueRange() when building with Qt 6.2 --- src/test/controllerscriptenginelegacy_test.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/controllerscriptenginelegacy_test.cpp b/src/test/controllerscriptenginelegacy_test.cpp index 77e7729cf5c7..472c3d217870 100644 --- a/src/test/controllerscriptenginelegacy_test.cpp +++ b/src/test/controllerscriptenginelegacy_test.cpp @@ -974,7 +974,13 @@ TEST_F(ControllerScriptEngineLegacyTest, JavascriptPlayerProxy) { EXPECT_TRUE(evaluateAndAssert(code)) << "Evaluation error in test code"; loadTrackSync("id3-test-data/all.mp3"); +#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) for (auto [property, expected] : expectedValues.asKeyValueRange()) { +#else + for (auto it = expectedValues.constBegin(); it != expectedValues.constEnd(); ++it) { + const QString& property = it.key(); + const QString& expected = it.value(); +#endif auto const playerActual = evaluate("player." + property).toString(); auto const slotActual = evaluate("result." + property).toString(); EXPECT_QSTRING_EQ(expected, playerActual) From d93e3c9582ab3247199fea3c8fa7aca9d3a5d096 Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 22 Jun 2025 08:46:49 +0200 Subject: [PATCH 060/163] Change GitHub issue templates to set the issue type (bug or feature) instead of defining an additional label --- .github/ISSUE_TEMPLATE/bug.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 57bdc60f2f9e..c1e6a0480cb2 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -1,7 +1,7 @@ name: 🐛 Bug Report description: | Describe your problem here. -labels: [bug] +type: "bug" body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 18489e986b0c..2ce3e4bd9aed 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,7 +1,7 @@ name: 🚀 Feature Request description: | What feature would you like to see added to Mixxx? -labels: [feature] +type: "feature" body: - type: markdown attributes: From 1ffbbfba801ca036734cb52466f8a187a4792d9a Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 14 May 2025 01:31:17 +0200 Subject: [PATCH 061/163] Looping: press 'beatloop_activate' while a looproll is active to adopt the loop and quit slip mode (without seeking) --- src/engine/controls/loopingcontrol.cpp | 51 +++++++++++++++++++------- src/engine/enginebuffer.cpp | 14 ++++++- src/engine/enginebuffer.h | 3 ++ 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/engine/controls/loopingcontrol.cpp b/src/engine/controls/loopingcontrol.cpp index cb1c7436e3c4..f5a099790c70 100644 --- a/src/engine/controls/loopingcontrol.cpp +++ b/src/engine/controls/loopingcontrol.cpp @@ -1309,6 +1309,15 @@ void LoopingControl::slotBeatLoopDeactivate(BeatLoopingControl* pBeatLoopControl void LoopingControl::slotBeatLoopDeactivateRoll(BeatLoopingControl* pBeatLoopControl) { pBeatLoopControl->deactivate(); + + if (!m_bLoopRollActive) { + // beatloop_activate was pressed while rolling and slotBeatLoopToggle() + // did already reset roll status (m_activeLoopRolls, m_bLoopRollActive) + // and EngineBuffer quit slip mode (but didn't seek). + // So nothing to do here, just leave the adopted loop active. + return; + } + const double size = pBeatLoopControl->getSize(); // clang-tidy wants auto to be auto* because QStack inherits from QVector // and QVector::iterator is a pointer type in Qt5, but QStack inherits @@ -1325,18 +1334,15 @@ void LoopingControl::slotBeatLoopDeactivateRoll(BeatLoopingControl* pBeatLoopCon // Make sure slip mode is not turned off if it was turned on // by something that was not a rolling beatloop. - if (m_bLoopRollActive && m_activeLoopRolls.empty()) { + if (m_activeLoopRolls.empty()) { setLoopingEnabled(false); m_pSlipEnabled->set(0); m_bLoopRollActive = false; - } - - // Return to the previous beatlooproll if necessary. - // Else previous regular beatloop if no rolling loops are active. - if (!m_activeLoopRolls.empty()) { - slotBeatLoop(m_activeLoopRolls.top(), m_bLoopRollActive, true); - } else { restoreLoopInfo(); + } else { + // Return to the previous beatlooproll if necessary. + // Else previous regular beatloop if no rolling loops are active. + slotBeatLoop(m_activeLoopRolls.top(), m_bLoopRollActive, true); } } @@ -1694,14 +1700,25 @@ void LoopingControl::slotBeatLoopSizeChangeRequest(double beats) { } void LoopingControl::slotBeatLoopToggle(double pressed) { - if (pressed > 0) { - if (m_bLoopingEnabled) { + if (pressed <= 0) { + return; + } + + if (m_bLoopingEnabled) { + // If we're in a rolling loop, quit slip mode and adopt it as regular loop. + // Use case is to have a looproll button pressed, then press loop_activate + // and nothing should happen when releasing the looproll button. + if (m_bLoopRollActive) { + m_bLoopRollActive = false; + m_activeLoopRolls.clear(); + getEngineBuffer()->slipQuitAndAdopt(); + } else { // Deactivate the loop if we're already looping setLoopingEnabled(false); - } else { - // Create a loop at current position - slotBeatLoop(m_pCOBeatLoopSize->get()); } + } else { + // Create a loop at current position + slotBeatLoop(m_pCOBeatLoopSize->get()); } } @@ -1723,6 +1740,14 @@ void LoopingControl::slotBeatLoopRollActivate(double pressed) { m_bLoopRollActive = true; } } else { + if (!m_bLoopRollActive) { + // beatloop_activate was pressed while rolling and slotBeatLoopToggle() + // did already reset roll status (m_activeLoopRolls, m_bLoopRollActive) + // and EngineBuffer quit slip mode (but didn't seek). + // So nothing to do here, just leave the adopted loop active. + return; + } + setLoopingEnabled(false); // Make sure slip mode is not turned off if it was turned on // by something that was not a rolling beatloop. diff --git a/src/engine/enginebuffer.cpp b/src/engine/enginebuffer.cpp index 9461197e4d5c..103a03b8eada 100644 --- a/src/engine/enginebuffer.cpp +++ b/src/engine/enginebuffer.cpp @@ -90,6 +90,7 @@ EngineBuffer::EngineBuffer(const QString& group, m_iSeekPhaseQueued(0), m_iEnableSyncQueued(SYNC_REQUEST_NONE), m_iSyncModeQueued(static_cast(SyncMode::Invalid)), + m_slipQuitAndAdopt(0), m_bPlayAfterLoading(false), m_channelCount(mixxx::kEngineChannelOutputCount), m_pCrossfadeBuffer(SampleUtil::alloc( @@ -864,6 +865,11 @@ void EngineBuffer::slotKeylockEngineChanged(double dIndex) { } } +void EngineBuffer::slipQuitAndAdopt() { + m_slipQuitAndAdopt.storeRelease(1); + m_pSlipButton->set(0); +} + void EngineBuffer::processTrackLocked( CSAMPLE* pOutput, const std::size_t bufferSize, mixxx::audio::SampleRate sampleRate) { ScopedTimer t(QStringLiteral("EngineBuffer::process_pauselock")); @@ -1257,8 +1263,12 @@ void EngineBuffer::processSlip(std::size_t bufferSize) { m_slipPos = m_playPos; m_dSlipRate = m_rate_old; } else { - // TODO(owen) assuming that looping will get canceled properly - seekExact(m_slipPos.toNearestFrameBoundary()); + // If m_slipQuitAndAdopt is 1 we've already quit slip mode + // but we don't seek in that case. + if (m_slipQuitAndAdopt.fetchAndStoreAcquire(0) == 0) { + // TODO(owen) assuming that looping will get canceled properly + seekExact(m_slipPos.toNearestFrameBoundary()); + } m_slipPos = mixxx::audio::kStartFramePos; } } diff --git a/src/engine/enginebuffer.h b/src/engine/enginebuffer.h index 9d4480609a15..046b2ff8dec5 100644 --- a/src/engine/enginebuffer.h +++ b/src/engine/enginebuffer.h @@ -236,6 +236,8 @@ class EngineBuffer : public EngineObject { void verifyPlay(); + void slipQuitAndAdopt(); + public slots: void slotControlPlayRequest(double); void slotControlPlayFromStart(double); @@ -466,6 +468,7 @@ class EngineBuffer : public EngineObject { ControlValueAtomic m_queuedSeek; bool m_previousBufferSeek = false; + QAtomicInt m_slipQuitAndAdopt; /// Indicates that no seek is queued static constexpr QueuedSeek kNoQueuedSeek = {mixxx::audio::kInvalidFramePos, SEEK_NONE}; /// indicates a clone seek on a bosition from another deck From d0009e3fa09cd64ab485dcc475564ab0b79483ff Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Tue, 24 Jun 2025 19:02:10 +0000 Subject: [PATCH 062/163] chore(waveform): migrate option to global namespace --- src/preferences/dialog/dlgprefwaveform.cpp | 36 ++++++------ src/preferences/dialog/dlgprefwaveform.h | 8 +-- src/preferences/upgrade.cpp | 20 +++---- src/qml/qmlwaveformrenderer.cpp | 12 ++-- src/qml/qmlwaveformrenderer.h | 22 +++++++- src/test/waveform_upgrade_test.cpp | 54 +++++++++--------- .../allshader/waveformrendererfiltered.cpp | 5 +- .../allshader/waveformrendererfiltered.h | 3 +- .../allshader/waveformrendererhsv.cpp | 5 +- .../renderers/allshader/waveformrendererhsv.h | 3 +- .../allshader/waveformrendererrgb.cpp | 6 +- .../renderers/allshader/waveformrendererrgb.h | 5 +- .../allshader/waveformrenderersignalbase.cpp | 4 +- .../allshader/waveformrenderersignalbase.h | 11 +--- .../allshader/waveformrenderersimple.cpp | 4 +- .../allshader/waveformrenderersimple.h | 3 +- .../allshader/waveformrendererstem.cpp | 5 +- .../allshader/waveformrendererstem.h | 4 +- .../allshader/waveformrenderertextured.cpp | 6 +- .../allshader/waveformrenderertextured.h | 6 +- .../deprecated/glwaveformrenderersignal.h | 5 +- .../renderers/glvsynctestrenderer.cpp | 3 +- .../renderers/qtvsynctestrenderer.cpp | 5 +- .../qtwaveformrendererfilteredsignal.cpp | 5 +- .../qtwaveformrendererfilteredsignal.h | 4 +- .../waveformrendererfilteredsignal.cpp | 5 +- .../waveformrendererfilteredsignal.h | 2 +- .../renderers/waveformrendererhsv.cpp | 5 +- src/waveform/renderers/waveformrendererhsv.h | 2 +- .../renderers/waveformrendererrgb.cpp | 5 +- src/waveform/renderers/waveformrendererrgb.h | 2 +- .../renderers/waveformrenderersignalbase.cpp | 2 +- .../renderers/waveformrenderersignalbase.h | 10 +++- src/waveform/waveformwidgetfactory.cpp | 55 +++++++++++-------- src/waveform/waveformwidgetfactory.h | 27 ++++++--- .../widgets/allshader/waveformwidget.cpp | 22 ++++---- .../widgets/allshader/waveformwidget.h | 6 +- src/waveform/widgets/hsvwaveformwidget.cpp | 6 +- src/waveform/widgets/hsvwaveformwidget.h | 5 +- src/waveform/widgets/rgbwaveformwidget.cpp | 6 +- src/waveform/widgets/rgbwaveformwidget.h | 5 +- .../widgets/softwarewaveformwidget.cpp | 6 +- src/waveform/widgets/softwarewaveformwidget.h | 5 +- 43 files changed, 244 insertions(+), 176 deletions(-) diff --git a/src/preferences/dialog/dlgprefwaveform.cpp b/src/preferences/dialog/dlgprefwaveform.cpp index d770f10e1249..32d06bed9a82 100644 --- a/src/preferences/dialog/dlgprefwaveform.cpp +++ b/src/preferences/dialog/dlgprefwaveform.cpp @@ -225,10 +225,10 @@ DlgPrefWaveform::~DlgPrefWaveform() { } void DlgPrefWaveform::slotSetWaveformOptions( - allshader::WaveformRendererSignalBase::Option option, bool enabled) { - allshader::WaveformRendererSignalBase::Options currentOption = m_pConfig->getValue( + WaveformRendererSignalBase::Option option, bool enabled) { + WaveformRendererSignalBase::Options currentOption = m_pConfig->getValue( ConfigKey("[Waveform]", "waveform_options"), - allshader::WaveformRendererSignalBase::Option::None); + WaveformRendererSignalBase::Option::None); m_pConfig->setValue(ConfigKey("[Waveform]", "waveform_options"), enabled ? currentOption | option @@ -268,9 +268,9 @@ void DlgPrefWaveform::slotUpdate() { bool useWaveform = factory->getType() != WaveformWidgetType::Empty; useWaveformCheckBox->setChecked(useWaveform); - allshader::WaveformRendererSignalBase::Options currentOptions = m_pConfig->getValue( + WaveformRendererSignalBase::Options currentOptions = m_pConfig->getValue( ConfigKey("[Waveform]", "waveform_options"), - allshader::WaveformRendererSignalBase::Option::None); + WaveformRendererSignalBase::Option::None); WaveformWidgetBackend backend = m_pConfig->getValue( ConfigKey("[Waveform]", "use_hardware_acceleration"), factory->preferredBackend()); @@ -348,11 +348,11 @@ void DlgPrefWaveform::slotResetToDefaults() { updateWaveformAcceleration(WaveformWidgetFactory::defaultType(), defaultBackend); updateWaveformTypeOptions(true, defaultBackend, - allshader::WaveformRendererSignalBase::Option::None); + WaveformRendererSignalBase::Option::None); // Restore waveform backend and option setting instantly m_pConfig->setValue(ConfigKey("[Waveform]", "waveform_options"), - allshader::WaveformRendererSignalBase::Option::None); + WaveformRendererSignalBase::Option::None); m_pConfig->setValue(ConfigKey("[Waveform]", "use_hardware_acceleration"), defaultBackend); factory->setWidgetTypeFromHandle( @@ -420,9 +420,9 @@ void DlgPrefWaveform::slotSetWaveformType(int index) { useAccelerationCheckBox->setChecked(backend != WaveformWidgetBackend::None); - allshader::WaveformRendererSignalBase::Options currentOptions = m_pConfig->getValue( + WaveformRendererSignalBase::Options currentOptions = m_pConfig->getValue( ConfigKey("[Waveform]", "waveform_options"), - allshader::WaveformRendererSignalBase::Option::None); + WaveformRendererSignalBase::Option::None); updateWaveformAcceleration(type, backend); updateWaveformTypeOptions(true, backend, currentOptions); updateEnableUntilMark(); @@ -459,9 +459,9 @@ void DlgPrefWaveform::slotSetWaveformAcceleration(bool checked) { auto type = static_cast(waveformTypeComboBox->currentData().toInt()); auto* factory = WaveformWidgetFactory::instance(); factory->setWidgetTypeFromHandle(factory->findHandleIndexFromType(type), true); - allshader::WaveformRendererSignalBase::Options currentOptions = m_pConfig->getValue( + WaveformRendererSignalBase::Options currentOptions = m_pConfig->getValue( ConfigKey("[Waveform]", "waveform_options"), - allshader::WaveformRendererSignalBase::Option::None); + WaveformRendererSignalBase::Option::None); updateWaveformTypeOptions(true, backend, currentOptions); updateEnableUntilMark(); } @@ -495,14 +495,14 @@ void DlgPrefWaveform::updateWaveformAcceleration( void DlgPrefWaveform::updateWaveformTypeOptions(bool useWaveform, WaveformWidgetBackend backend, - allshader::WaveformRendererSignalBase::Options currentOptions) { + WaveformRendererSignalBase::Options currentOptions) { splitLeftRightCheckBox->blockSignals(true); highDetailCheckBox->blockSignals(true); #ifdef MIXXX_USE_QOPENGL WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); - allshader::WaveformRendererSignalBase::Options supportedOption = - allshader::WaveformRendererSignalBase::Option::None; + WaveformRendererSignalBase::Options supportedOption = + WaveformRendererSignalBase::Option::None; auto type = static_cast(waveformTypeComboBox->currentData().toInt()); int handleIdx = factory->findHandleIndexFromType(type); @@ -513,15 +513,15 @@ void DlgPrefWaveform::updateWaveformTypeOptions(bool useWaveform, splitLeftRightCheckBox->setEnabled(useWaveform && supportedOption & - allshader::WaveformRendererSignalBase::Option::SplitStereoSignal); + WaveformRendererSignalBase::Option::SplitStereoSignal); highDetailCheckBox->setEnabled(useWaveform && supportedOption & - allshader::WaveformRendererSignalBase::Option::HighDetail); + WaveformRendererSignalBase::Option::HighDetail); splitLeftRightCheckBox->setChecked(splitLeftRightCheckBox->isEnabled() && currentOptions & - allshader::WaveformRendererSignalBase::Option::SplitStereoSignal); + WaveformRendererSignalBase::Option::SplitStereoSignal); highDetailCheckBox->setChecked(highDetailCheckBox->isEnabled() && - currentOptions & allshader::WaveformRendererSignalBase::Option::HighDetail); + currentOptions & WaveformRendererSignalBase::Option::HighDetail); #else splitLeftRightCheckBox->setVisible(false); highDetailCheckBox->setVisible(false); diff --git a/src/preferences/dialog/dlgprefwaveform.h b/src/preferences/dialog/dlgprefwaveform.h index 367dda8b396a..dbdfe2831d56 100644 --- a/src/preferences/dialog/dlgprefwaveform.h +++ b/src/preferences/dialog/dlgprefwaveform.h @@ -35,14 +35,14 @@ class DlgPrefWaveform : public DlgPreferencePage, public Ui::DlgPrefWaveformDlg void slotSetWaveformEnabled(bool checked); void slotSetWaveformAcceleration(bool checked); #ifdef MIXXX_USE_QOPENGL - void slotSetWaveformOptions(allshader::WaveformRendererSignalBase::Option option, bool enabled); + void slotSetWaveformOptions(WaveformRendererSignalBase::Option option, bool enabled); void slotSetWaveformOptionSplitStereoSignal(bool checked) { - slotSetWaveformOptions(allshader::WaveformRendererSignalBase::Option:: + slotSetWaveformOptions(WaveformRendererSignalBase::Option:: SplitStereoSignal, checked); } void slotSetWaveformOptionHighDetail(bool checked) { - slotSetWaveformOptions(allshader::WaveformRendererSignalBase::Option::HighDetail, checked); + slotSetWaveformOptions(WaveformRendererSignalBase::Option::HighDetail, checked); } #endif void slotSetWaveformOverviewType(); @@ -71,7 +71,7 @@ class DlgPrefWaveform : public DlgPreferencePage, public Ui::DlgPrefWaveformDlg void updateEnableUntilMark(); void updateWaveformTypeOptions(bool useWaveform, WaveformWidgetBackend backend, - allshader::WaveformRendererSignalBase::Options currentOption); + WaveformRendererSignalBase::Options currentOption); void updateWaveformAcceleration( WaveformWidgetType::Type type, WaveformWidgetBackend backend); void updateWaveformGeneralOptionsEnabled(); diff --git a/src/preferences/upgrade.cpp b/src/preferences/upgrade.cpp index 1d7704a6da47..f4641a5961a7 100644 --- a/src/preferences/upgrade.cpp +++ b/src/preferences/upgrade.cpp @@ -37,7 +37,7 @@ namespace { // mapping to proactively move users to the new all-shader waveform types std::tuple + WaveformRendererSignalBase::Options> upgradeToAllShaders(int unsafeWaveformType, int unsafeWaveformBackend, int unsafeWaveformOption) { @@ -45,10 +45,10 @@ upgradeToAllShaders(int unsafeWaveformType, using WWT = WaveformWidgetType; if (static_cast(WaveformWidgetBackend::AllShader) == unsafeWaveformBackend) { - allshader::WaveformRendererSignalBase::Options waveformOption = - static_cast( + WaveformRendererSignalBase::Options waveformOption = + static_cast( unsafeWaveformOption) & - allshader::WaveformRendererSignalBase::Option::AllOptionsCombined; + WaveformRendererSignalBase::Option::AllOptionsCombined; switch (unsafeWaveformType) { case WWT::Simple: case WWT::Filtered: @@ -67,8 +67,8 @@ upgradeToAllShaders(int unsafeWaveformType, } // Reset the options - allshader::WaveformRendererSignalBase::Options waveformOption = - allshader::WaveformRendererSignalBase::Option::None; + WaveformRendererSignalBase::Options waveformOption = + WaveformRendererSignalBase::Option::None; WaveformWidgetType::Type waveformType = static_cast(unsafeWaveformType); WaveformWidgetBackend waveformBackend = WaveformWidgetBackend::AllShader; @@ -97,7 +97,7 @@ upgradeToAllShaders(int unsafeWaveformType, // Filtered waveforms case WWT::Filtered: // GLSLFilteredWaveform case 22: // AllShaderTexturedFiltered - waveformOption = allshader::WaveformRendererSignalBase::Option::HighDetail; + waveformOption = WaveformRendererSignalBase::Option::HighDetail; [[fallthrough]]; case 2: // SoftwareWaveform case 4: // QtWaveform @@ -116,7 +116,7 @@ upgradeToAllShaders(int unsafeWaveformType, // Stacked waveform case 24: // AllShaderTexturedStacked case WWT::Stacked: // GLSLRGBStackedWaveform - waveformOption = allshader::WaveformRendererSignalBase::Option::HighDetail; + waveformOption = WaveformRendererSignalBase::Option::HighDetail; [[fallthrough]]; case 26: // AllShaderRGBStackedWaveform waveformType = WaveformWidgetType::Stacked; @@ -127,8 +127,8 @@ upgradeToAllShaders(int unsafeWaveformType, case 23: // AllShaderTexturedRGB case 12: // GLSLRGBWaveform waveformOption = unsafeWaveformType == 18 - ? allshader::WaveformRendererSignalBase::Option::SplitStereoSignal - : allshader::WaveformRendererSignalBase::Option::HighDetail; + ? WaveformRendererSignalBase::Option::SplitStereoSignal + : WaveformRendererSignalBase::Option::HighDetail; [[fallthrough]]; default: waveformType = WaveformWidgetFactory::defaultType(); diff --git a/src/qml/qmlwaveformrenderer.cpp b/src/qml/qmlwaveformrenderer.cpp index da924e99a23e..487aadcd5faf 100644 --- a/src/qml/qmlwaveformrenderer.cpp +++ b/src/qml/qmlwaveformrenderer.cpp @@ -22,9 +22,9 @@ namespace mixxx { namespace qml { QmlWaveformRendererMark::QmlWaveformRendererMark() - : m_defaultMark(nullptr), - m_untilMark(std::make_unique()), - m_playMarkerPosition(0.5) { + : m_playMarkerPosition(0.5), + m_defaultMark(nullptr), + m_untilMark(std::make_unique()) { } QmlWaveformRendererFactory::Renderer QmlWaveformRendererEndOfTrack::create( @@ -118,7 +118,7 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererRGB::create( QmlWaveformRendererFactory::Renderer QmlWaveformRendererFiltered::create( WaveformWidgetRenderer* waveformWidget) const { auto pRenderer = std::make_unique( - waveformWidget, m_ignoreStem); + waveformWidget, m_ignoreStem, m_options); setup(pRenderer.get()); return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; @@ -127,7 +127,7 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererFiltered::create( QmlWaveformRendererFactory::Renderer QmlWaveformRendererHSV::create( WaveformWidgetRenderer* waveformWidget) const { auto pRenderer = std::make_unique( - waveformWidget); + waveformWidget, m_options); pRenderer->setAxesColor(m_axesColor); pRenderer->setColor(m_color); @@ -170,7 +170,7 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererHSV::create( QmlWaveformRendererFactory::Renderer QmlWaveformRendererSimple::create( WaveformWidgetRenderer* waveformWidget) const { auto pRenderer = std::make_unique( - waveformWidget); + waveformWidget, m_options); pRenderer->setAxesColor(m_axesColor); pRenderer->setColor(m_color); diff --git a/src/qml/qmlwaveformrenderer.h b/src/qml/qmlwaveformrenderer.h index d012c3831fad..3c1d10aae693 100644 --- a/src/qml/qmlwaveformrenderer.h +++ b/src/qml/qmlwaveformrenderer.h @@ -85,7 +85,7 @@ class QmlWaveformRendererPreroll ::WaveformRendererAbstract::PositionSource m_position{::WaveformRendererAbstract::Play}; }; -typedef allshader::WaveformRendererSignalBase::Options WaveformRendererSignalBaseOptions; +typedef WaveformRendererSignalBase::Options WaveformRendererSignalBaseOptions; class QmlWaveformRendererSignal : public QmlWaveformRendererFactory { Q_OBJECT @@ -139,7 +139,7 @@ class QmlWaveformRendererSignal ::WaveformRendererAbstract::PositionSource m_position{::WaveformRendererAbstract::Play}; WaveformRendererSignalBaseOptions m_options{ - allshader::WaveformRendererSignalBase::Option::None}; + WaveformRendererSignalBase::Option::None}; }; class QmlWaveformRendererRGB @@ -175,6 +175,8 @@ class QmlWaveformRendererHSV Q_PROPERTY(double gainLow MEMBER m_gainLow NOTIFY gainLowChanged REQUIRED) Q_PROPERTY(double gainMid MEMBER m_gainMid NOTIFY gainMidChanged REQUIRED) Q_PROPERTY(double gainHigh MEMBER m_gainHigh NOTIFY gainHighChanged REQUIRED) + Q_PROPERTY(WaveformRendererSignalBaseOptions options MEMBER + m_options NOTIFY optionsChanged) QML_NAMED_ELEMENT(WaveformRendererHSV) public: @@ -187,6 +189,11 @@ class QmlWaveformRendererHSV void gainLowChanged(double); void gainMidChanged(double); void gainHighChanged(double); +#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) + void optionsChanged(WaveformRendererSignalBaseOptions); +#else + void optionsChanged(mixxx::qml::WaveformRendererSignalBaseOptions); +#endif private: QColor m_axesColor; @@ -198,6 +205,8 @@ class QmlWaveformRendererHSV double m_gainHigh; bool m_ignoreStem{false}; + WaveformRendererSignalBaseOptions m_options{ + WaveformRendererSignalBase::Option::None}; }; class QmlWaveformRendererSimple @@ -207,6 +216,8 @@ class QmlWaveformRendererSimple Q_PROPERTY(QColor axesColor MEMBER m_axesColor NOTIFY axesColorChanged REQUIRED) Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged REQUIRED) Q_PROPERTY(double gain MEMBER m_gain NOTIFY gainChanged REQUIRED) + Q_PROPERTY(WaveformRendererSignalBaseOptions options MEMBER + m_options NOTIFY optionsChanged) QML_NAMED_ELEMENT(WaveformRendererSimple) public: @@ -216,12 +227,19 @@ class QmlWaveformRendererSimple void colorChanged(const QColor&); void ignoreStemChanged(bool); void gainChanged(double); +#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) + void optionsChanged(WaveformRendererSignalBaseOptions); +#else + void optionsChanged(mixxx::qml::WaveformRendererSignalBaseOptions); +#endif private: QColor m_axesColor; QColor m_color; double m_gain; bool m_ignoreStem{false}; + WaveformRendererSignalBaseOptions m_options{ + WaveformRendererSignalBase::Option::None}; }; class QmlWaveformRendererBeat diff --git a/src/test/waveform_upgrade_test.cpp b/src/test/waveform_upgrade_test.cpp index 44387755bca8..21386e1ec3f1 100644 --- a/src/test/waveform_upgrade_test.cpp +++ b/src/test/waveform_upgrade_test.cpp @@ -23,7 +23,7 @@ TEST_F(UpgradeTest, useCorrectWaveformType) { int oldTypeId; WaveformWidgetType::Type expectedType; WaveformWidgetBackend expectedBackend; - allshader::WaveformRendererSignalBase::Options expectedOptions; + WaveformRendererSignalBase::Options expectedOptions; }; QList testCases = { @@ -31,132 +31,132 @@ TEST_F(UpgradeTest, useCorrectWaveformType) { 0, WaveformWidgetType::Empty, WaveformWidgetBackend::None, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"SoftwareWaveform", 2, // Filtered WaveformWidgetType::Filtered, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"QtSimpleWaveform", 3, // Simple Qt WaveformWidgetType::Simple, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"QtWaveform", 4, // Filtered Qt WaveformWidgetType::Filtered, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLSimpleWaveform", 5, // Simple GL WaveformWidgetType::Simple, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLFilteredWaveform", 6, // Filtered GL WaveformWidgetType::Filtered, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLSLFilteredWaveform", 7, // Filtered GLSL WaveformWidgetType::Filtered, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::HighDetail}, + WaveformRendererSignalBase::Option::HighDetail}, test_case{"HSVWaveform", 8, // HSV WaveformWidgetType::HSV, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLVSyncTest", 9, // VSync GL WaveformWidgetType::VSyncTest, WaveformWidgetBackend::None, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"RGBWaveform", 10, // RGB WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLRGBWaveform", 11, // RGB GL WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLSLRGBWaveform", 12, // RGB GLSL WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::HighDetail}, + WaveformRendererSignalBase::Option::HighDetail}, test_case{"QtVSyncTest", 13, // VSync Qt WaveformWidgetType::VSyncTest, WaveformWidgetBackend::None, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"QtHSVWaveform", 14, // HSV Qt WaveformWidgetType::HSV, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"QtRGBWaveform", 15, // RGB Qt WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"GLSLRGBStackedWaveform", 16, // RGB Stacked WaveformWidgetType::Stacked, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::HighDetail}, + WaveformRendererSignalBase::Option::HighDetail}, test_case{"AllShaderRGBWaveform", 17, // RGB (all-shaders) WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"AllShaderLRRGBWaveform", 18, // L/R RGB (all-shaders) WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::SplitStereoSignal}, + WaveformRendererSignalBase::Option::SplitStereoSignal}, test_case{"AllShaderFilteredWaveform", 19, // Filtered (all-shaders) WaveformWidgetType::Filtered, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"AllShaderSimpleWaveform", 20, // Simple (all-shaders) WaveformWidgetType::Simple, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"AllShaderHSVWaveform", 21, // HSV (all-shaders) WaveformWidgetType::HSV, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"AllShaderTexturedFiltered", 22, // Filtered (textured) (all-shaders) WaveformWidgetType::Filtered, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::HighDetail}, + WaveformRendererSignalBase::Option::HighDetail}, test_case{"AllShaderTexturedRGB", 23, // RGB (textured) (all-shaders) WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::HighDetail}, + WaveformRendererSignalBase::Option::HighDetail}, test_case{"AllShaderTexturedStacked", 24, // Stacked (textured) (all-shaders) WaveformWidgetType::Stacked, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::HighDetail}, + WaveformRendererSignalBase::Option::HighDetail}, test_case{"AllShaderRGBStackedWaveform", 26, // Stacked (all-shaders) WaveformWidgetType::Stacked, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}, + WaveformRendererSignalBase::Option::None}, test_case{"Count_WaveformwidgetType", 27, // Also used as invalid value WaveformWidgetType::RGB, WaveformWidgetBackend::AllShader, - allshader::WaveformRendererSignalBase::Option::None}}; + WaveformRendererSignalBase::Option::None}}; for (const auto& testCase : testCases) { int waveformType = testCase.oldTypeId; diff --git a/src/waveform/renderers/allshader/waveformrendererfiltered.cpp b/src/waveform/renderers/allshader/waveformrendererfiltered.cpp index 8b14849f6ac1..13c14ea5582c 100644 --- a/src/waveform/renderers/allshader/waveformrendererfiltered.cpp +++ b/src/waveform/renderers/allshader/waveformrendererfiltered.cpp @@ -13,8 +13,9 @@ namespace allshader { WaveformRendererFiltered::WaveformRendererFiltered( WaveformWidgetRenderer* waveformWidget, - bool bRgbStacked) - : WaveformRendererSignalBase(waveformWidget), + bool bRgbStacked, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidget, options), m_bRgbStacked(bRgbStacked) { initForRectangles(0); setUsePreprocess(true); diff --git a/src/waveform/renderers/allshader/waveformrendererfiltered.h b/src/waveform/renderers/allshader/waveformrendererfiltered.h index e807d32a83ee..5317358b924b 100644 --- a/src/waveform/renderers/allshader/waveformrendererfiltered.h +++ b/src/waveform/renderers/allshader/waveformrendererfiltered.h @@ -13,7 +13,8 @@ class allshader::WaveformRendererFiltered final public rendergraph::GeometryNode { public: explicit WaveformRendererFiltered(WaveformWidgetRenderer* waveformWidget, - bool rgbStacked); + bool rgbStacked, + ::WaveformRendererSignalBase::Options options); // Pure virtual from WaveformRendererSignalBase, not used void onSetup(const QDomNode& node) override; diff --git a/src/waveform/renderers/allshader/waveformrendererhsv.cpp b/src/waveform/renderers/allshader/waveformrendererhsv.cpp index fe7773a162b0..db48a960790a 100644 --- a/src/waveform/renderers/allshader/waveformrendererhsv.cpp +++ b/src/waveform/renderers/allshader/waveformrendererhsv.cpp @@ -12,8 +12,9 @@ using namespace rendergraph; namespace allshader { -WaveformRendererHSV::WaveformRendererHSV(WaveformWidgetRenderer* waveformWidget) - : WaveformRendererSignalBase(waveformWidget) { +WaveformRendererHSV::WaveformRendererHSV(WaveformWidgetRenderer* waveformWidget, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidget, options) { initForRectangles(0); setUsePreprocess(true); } diff --git a/src/waveform/renderers/allshader/waveformrendererhsv.h b/src/waveform/renderers/allshader/waveformrendererhsv.h index d308a269eaf6..678d0809b193 100644 --- a/src/waveform/renderers/allshader/waveformrendererhsv.h +++ b/src/waveform/renderers/allshader/waveformrendererhsv.h @@ -12,7 +12,8 @@ class allshader::WaveformRendererHSV final : public allshader::WaveformRendererSignalBase, public rendergraph::GeometryNode { public: - explicit WaveformRendererHSV(WaveformWidgetRenderer* waveformWidget); + explicit WaveformRendererHSV(WaveformWidgetRenderer* waveformWidget, + ::WaveformRendererSignalBase::Options options); // Pure virtual from WaveformRendererSignalBase, not used void onSetup(const QDomNode& node) override; diff --git a/src/waveform/renderers/allshader/waveformrendererrgb.cpp b/src/waveform/renderers/allshader/waveformrendererrgb.cpp index 9d20e581a6e8..d1c97e575d43 100644 --- a/src/waveform/renderers/allshader/waveformrendererrgb.cpp +++ b/src/waveform/renderers/allshader/waveformrendererrgb.cpp @@ -20,8 +20,8 @@ inline float math_pow2(float x) { WaveformRendererRGB::WaveformRendererRGB(WaveformWidgetRenderer* waveformWidget, ::WaveformRendererAbstract::PositionSource type, - WaveformRendererSignalBase::Options options) - : WaveformRendererSignalBase(waveformWidget), + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidget, options), m_isSlipRenderer(type == ::WaveformRendererAbstract::Slip), m_options(options) { initForRectangles(0); @@ -99,7 +99,7 @@ bool WaveformRendererRGB::preprocessInner() { const float heightFactorAbs = allGain * halfBreadth / m_maxValue; const float heightFactor[2] = {-heightFactorAbs, heightFactorAbs}; - const bool splitLeftRight = m_options & WaveformRendererSignalBase::Option::SplitStereoSignal; + const bool splitLeftRight = m_options & ::WaveformRendererSignalBase::Option::SplitStereoSignal; const float low_r = static_cast(m_rgbLowColor_r); const float mid_r = static_cast(m_rgbMidColor_r); diff --git a/src/waveform/renderers/allshader/waveformrendererrgb.h b/src/waveform/renderers/allshader/waveformrendererrgb.h index 680e84996f73..132c86b71916 100644 --- a/src/waveform/renderers/allshader/waveformrendererrgb.h +++ b/src/waveform/renderers/allshader/waveformrendererrgb.h @@ -15,7 +15,8 @@ class allshader::WaveformRendererRGB final explicit WaveformRendererRGB(WaveformWidgetRenderer* waveformWidget, ::WaveformRendererAbstract::PositionSource type = ::WaveformRendererAbstract::Play, - WaveformRendererSignalBase::Options options = WaveformRendererSignalBase::Option::None); + ::WaveformRendererSignalBase::Options options = + ::WaveformRendererSignalBase::Option::None); // Pure virtual from WaveformRendererSignalBase, not used void onSetup(const QDomNode& node) override; @@ -29,7 +30,7 @@ class allshader::WaveformRendererRGB final private: bool m_isSlipRenderer; - WaveformRendererSignalBase::Options m_options; + ::WaveformRendererSignalBase::Options m_options; bool preprocessInner(); diff --git a/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp b/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp index e9cc902b31f3..1e48cdbc0edf 100644 --- a/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp +++ b/src/waveform/renderers/allshader/waveformrenderersignalbase.cpp @@ -5,8 +5,8 @@ namespace allshader { WaveformRendererSignalBase::WaveformRendererSignalBase( - WaveformWidgetRenderer* waveformWidget) - : ::WaveformRendererSignalBase(waveformWidget), + WaveformWidgetRenderer* waveformWidget, ::WaveformRendererSignalBase::Options options) + : ::WaveformRendererSignalBase(waveformWidget, options), m_ignoreStem(false) { } diff --git a/src/waveform/renderers/allshader/waveformrenderersignalbase.h b/src/waveform/renderers/allshader/waveformrenderersignalbase.h index 252fad54476f..a7214f6969b9 100644 --- a/src/waveform/renderers/allshader/waveformrenderersignalbase.h +++ b/src/waveform/renderers/allshader/waveformrenderersignalbase.h @@ -15,19 +15,12 @@ class WaveformRendererSignalBase; class allshader::WaveformRendererSignalBase : public ::WaveformRendererSignalBase { public: - enum class Option { - None = 0b0, - SplitStereoSignal = 0b1, - HighDetail = 0b10, - AllOptionsCombined = SplitStereoSignal | HighDetail, - }; - Q_DECLARE_FLAGS(Options, Option) - void draw(QPainter* painter, QPaintEvent* event) override final; static constexpr float m_maxValue{static_cast(std::numeric_limits::max())}; - explicit WaveformRendererSignalBase(WaveformWidgetRenderer* waveformWidget); + explicit WaveformRendererSignalBase(WaveformWidgetRenderer* waveformWidget, + ::WaveformRendererSignalBase::Options options); virtual bool supportsSlip() const { return false; diff --git a/src/waveform/renderers/allshader/waveformrenderersimple.cpp b/src/waveform/renderers/allshader/waveformrenderersimple.cpp index 880485a0341e..3d50774018a7 100644 --- a/src/waveform/renderers/allshader/waveformrenderersimple.cpp +++ b/src/waveform/renderers/allshader/waveformrenderersimple.cpp @@ -12,8 +12,8 @@ using namespace rendergraph; namespace allshader { WaveformRendererSimple::WaveformRendererSimple( - WaveformWidgetRenderer* waveformWidget) - : WaveformRendererSignalBase(waveformWidget) { + WaveformWidgetRenderer* waveformWidget, ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidget, options) { initForRectangles(0); setUsePreprocess(true); } diff --git a/src/waveform/renderers/allshader/waveformrenderersimple.h b/src/waveform/renderers/allshader/waveformrenderersimple.h index 10c9418186b0..91bcf4303b0c 100644 --- a/src/waveform/renderers/allshader/waveformrenderersimple.h +++ b/src/waveform/renderers/allshader/waveformrenderersimple.h @@ -12,7 +12,8 @@ class allshader::WaveformRendererSimple final : public allshader::WaveformRendererSignalBase, public rendergraph::GeometryNode { public: - explicit WaveformRendererSimple(WaveformWidgetRenderer* waveformWidget); + explicit WaveformRendererSimple(WaveformWidgetRenderer* waveformWidget, + ::WaveformRendererSignalBase::Options options); // Pure virtual from WaveformRendererSignalBase, not used void onSetup(const QDomNode& node) override; diff --git a/src/waveform/renderers/allshader/waveformrendererstem.cpp b/src/waveform/renderers/allshader/waveformrendererstem.cpp index 735d58aa2087..fdf8be02e9bd 100644 --- a/src/waveform/renderers/allshader/waveformrendererstem.cpp +++ b/src/waveform/renderers/allshader/waveformrendererstem.cpp @@ -31,8 +31,9 @@ namespace allshader { WaveformRendererStem::WaveformRendererStem( WaveformWidgetRenderer* waveformWidget, - ::WaveformRendererAbstract::PositionSource type) - : WaveformRendererSignalBase(waveformWidget), + ::WaveformRendererAbstract::PositionSource type, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidget, options), m_isSlipRenderer(type == ::WaveformRendererAbstract::Slip), m_splitStemTracks(false) { initForRectangles(0); diff --git a/src/waveform/renderers/allshader/waveformrendererstem.h b/src/waveform/renderers/allshader/waveformrendererstem.h index 9916c2d91115..d6c36517debf 100644 --- a/src/waveform/renderers/allshader/waveformrendererstem.h +++ b/src/waveform/renderers/allshader/waveformrendererstem.h @@ -19,7 +19,9 @@ class allshader::WaveformRendererStem final public: explicit WaveformRendererStem(WaveformWidgetRenderer* waveformWidget, ::WaveformRendererAbstract::PositionSource type = - ::WaveformRendererAbstract::Play); + ::WaveformRendererAbstract::Play, + ::WaveformRendererSignalBase::Options options = + ::WaveformRendererSignalBase::Option::None); // Pure virtual from WaveformRendererSignalBase, not used void onSetup(const QDomNode& node) override; diff --git a/src/waveform/renderers/allshader/waveformrenderertextured.cpp b/src/waveform/renderers/allshader/waveformrenderertextured.cpp index f114e7a2f0e6..c561e72afd2c 100644 --- a/src/waveform/renderers/allshader/waveformrenderertextured.cpp +++ b/src/waveform/renderers/allshader/waveformrenderertextured.cpp @@ -31,8 +31,8 @@ WaveformRendererTextured::WaveformRendererTextured( WaveformWidgetRenderer* waveformWidget, ::WaveformWidgetType::Type t, ::WaveformRendererAbstract::PositionSource type, - WaveformRendererSignalBase::Options options) - : WaveformRendererSignalBase(waveformWidget), + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidget, options), m_unitQuadListId(-1), m_textureId(0), m_textureRenderedWaveformCompletion(0), @@ -380,7 +380,7 @@ void WaveformRendererTextured::paintGL() { if (m_type == ::WaveformWidgetType::RGB) { m_frameShaderProgram->setUniformValue("splitStereoSignal", - m_options & WaveformRendererSignalBase::Option::SplitStereoSignal); + m_options & ::WaveformRendererSignalBase::Option::SplitStereoSignal); } m_frameShaderProgram->setUniformValue("axesColor", diff --git a/src/waveform/renderers/allshader/waveformrenderertextured.h b/src/waveform/renderers/allshader/waveformrenderertextured.h index 3769ae6d09c8..600119587567 100644 --- a/src/waveform/renderers/allshader/waveformrenderertextured.h +++ b/src/waveform/renderers/allshader/waveformrenderertextured.h @@ -24,8 +24,8 @@ class allshader::WaveformRendererTextured final : public allshader::WaveformRend WaveformWidgetType::Type t, ::WaveformRendererAbstract::PositionSource type = ::WaveformRendererAbstract::Play, - WaveformRendererSignalBase::Options options = - WaveformRendererSignalBase::Option::None); + ::WaveformRendererSignalBase::Options options = + ::WaveformRendererSignalBase::Option::None); ~WaveformRendererTextured() override; // override ::WaveformRendererSignalBase @@ -72,7 +72,7 @@ class allshader::WaveformRendererTextured final : public allshader::WaveformRend // shaders bool m_isSlipRenderer; - WaveformRendererSignalBase::Options m_options; + ::WaveformRendererSignalBase::Options m_options; bool m_shadersValid; WaveformWidgetType::Type m_type; const QString m_pFragShader; diff --git a/src/waveform/renderers/deprecated/glwaveformrenderersignal.h b/src/waveform/renderers/deprecated/glwaveformrenderersignal.h index 76532a120145..57539bc91d27 100644 --- a/src/waveform/renderers/deprecated/glwaveformrenderersignal.h +++ b/src/waveform/renderers/deprecated/glwaveformrenderersignal.h @@ -12,8 +12,9 @@ /// QPainter API which Qt translates to OpenGL under the hood. class GLWaveformRendererSignal : public WaveformRendererSignalBase, public GLWaveformRenderer { public: - GLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer) - : WaveformRendererSignalBase(waveformWidgetRenderer) { + GLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidgetRenderer, options) { } }; diff --git a/src/waveform/renderers/glvsynctestrenderer.cpp b/src/waveform/renderers/glvsynctestrenderer.cpp index a1d1cb7da275..b93f623092b0 100644 --- a/src/waveform/renderers/glvsynctestrenderer.cpp +++ b/src/waveform/renderers/glvsynctestrenderer.cpp @@ -7,7 +7,8 @@ GLVSyncTestRenderer::GLVSyncTestRenderer( WaveformWidgetRenderer* waveformWidgetRenderer) - : GLWaveformRendererSignal(waveformWidgetRenderer), + : GLWaveformRendererSignal(waveformWidgetRenderer, + WaveformRendererSignalBase::Option::None), m_drawcount(0) { } diff --git a/src/waveform/renderers/qtvsynctestrenderer.cpp b/src/waveform/renderers/qtvsynctestrenderer.cpp index d6b84441f598..1ca4b6c63ff0 100644 --- a/src/waveform/renderers/qtvsynctestrenderer.cpp +++ b/src/waveform/renderers/qtvsynctestrenderer.cpp @@ -9,8 +9,9 @@ QtVSyncTestRenderer::QtVSyncTestRenderer( WaveformWidgetRenderer* waveformWidgetRenderer) - : WaveformRendererSignalBase(waveformWidgetRenderer), - m_drawcount(0) { + : WaveformRendererSignalBase(waveformWidgetRenderer, + ::WaveformRendererSignalBase::Option::None), + m_drawcount(0) { } QtVSyncTestRenderer::~QtVSyncTestRenderer() { diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp index e58ebd5a54ad..1fc93604401f 100644 --- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp @@ -12,8 +12,9 @@ #include QtWaveformRendererFilteredSignal::QtWaveformRendererFilteredSignal( - WaveformWidgetRenderer* waveformWidgetRenderer) - : WaveformRendererSignalBase(waveformWidgetRenderer) { + WaveformWidgetRenderer* waveformWidgetRenderer, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidgetRenderer, options) { } QtWaveformRendererFilteredSignal::~QtWaveformRendererFilteredSignal() { diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.h b/src/waveform/renderers/qtwaveformrendererfilteredsignal.h index c7fed5db4b4d..945bd2af04ed 100644 --- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.h +++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.h @@ -9,7 +9,9 @@ class ControlObject; class QtWaveformRendererFilteredSignal : public WaveformRendererSignalBase { public: - explicit QtWaveformRendererFilteredSignal(WaveformWidgetRenderer* waveformWidgetRenderer); + explicit QtWaveformRendererFilteredSignal( + WaveformWidgetRenderer* waveformWidgetRenderer, + ::WaveformRendererSignalBase::Options options); virtual ~QtWaveformRendererFilteredSignal(); virtual void onSetup(const QDomNode &node); diff --git a/src/waveform/renderers/waveformrendererfilteredsignal.cpp b/src/waveform/renderers/waveformrendererfilteredsignal.cpp index 15b6c2d7e38f..97b11b1583c0 100644 --- a/src/waveform/renderers/waveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/waveformrendererfilteredsignal.cpp @@ -7,8 +7,9 @@ #include "util/painterscope.h" WaveformRendererFilteredSignal::WaveformRendererFilteredSignal( - WaveformWidgetRenderer* waveformWidgetRenderer) - : WaveformRendererSignalBase(waveformWidgetRenderer) { + WaveformWidgetRenderer* waveformWidgetRenderer, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidgetRenderer, options) { } WaveformRendererFilteredSignal::~WaveformRendererFilteredSignal() { diff --git a/src/waveform/renderers/waveformrendererfilteredsignal.h b/src/waveform/renderers/waveformrendererfilteredsignal.h index ba8e41a2eba9..00c3510e4496 100644 --- a/src/waveform/renderers/waveformrendererfilteredsignal.h +++ b/src/waveform/renderers/waveformrendererfilteredsignal.h @@ -9,7 +9,7 @@ class WaveformRendererFilteredSignal : public WaveformRendererSignalBase { public: explicit WaveformRendererFilteredSignal( - WaveformWidgetRenderer* waveformWidget); + WaveformWidgetRenderer* waveformWidget, ::WaveformRendererSignalBase::Options options); virtual ~WaveformRendererFilteredSignal(); virtual void onSetup(const QDomNode& node); diff --git a/src/waveform/renderers/waveformrendererhsv.cpp b/src/waveform/renderers/waveformrendererhsv.cpp index 0efba33e8451..2951421108cf 100644 --- a/src/waveform/renderers/waveformrendererhsv.cpp +++ b/src/waveform/renderers/waveformrendererhsv.cpp @@ -8,8 +8,9 @@ #include "waveformwidgetrenderer.h" WaveformRendererHSV::WaveformRendererHSV( - WaveformWidgetRenderer* waveformWidgetRenderer) - : WaveformRendererSignalBase(waveformWidgetRenderer) { + WaveformWidgetRenderer* waveformWidgetRenderer, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidgetRenderer, options) { } WaveformRendererHSV::~WaveformRendererHSV() { diff --git a/src/waveform/renderers/waveformrendererhsv.h b/src/waveform/renderers/waveformrendererhsv.h index 4c13b61c9a33..55693ba56638 100644 --- a/src/waveform/renderers/waveformrendererhsv.h +++ b/src/waveform/renderers/waveformrendererhsv.h @@ -6,7 +6,7 @@ class WaveformRendererHSV : public WaveformRendererSignalBase { public: explicit WaveformRendererHSV( - WaveformWidgetRenderer* waveformWidget); + WaveformWidgetRenderer* waveformWidget, ::WaveformRendererSignalBase::Options options); virtual ~WaveformRendererHSV(); virtual void onSetup(const QDomNode& node); diff --git a/src/waveform/renderers/waveformrendererrgb.cpp b/src/waveform/renderers/waveformrendererrgb.cpp index c6b948335f2e..ba521a74ce86 100644 --- a/src/waveform/renderers/waveformrendererrgb.cpp +++ b/src/waveform/renderers/waveformrendererrgb.cpp @@ -6,8 +6,9 @@ #include "util/painterscope.h" WaveformRendererRGB::WaveformRendererRGB( - WaveformWidgetRenderer* waveformWidgetRenderer) - : WaveformRendererSignalBase(waveformWidgetRenderer) { + WaveformWidgetRenderer* waveformWidgetRenderer, + ::WaveformRendererSignalBase::Options options) + : WaveformRendererSignalBase(waveformWidgetRenderer, options) { } WaveformRendererRGB::~WaveformRendererRGB() { diff --git a/src/waveform/renderers/waveformrendererrgb.h b/src/waveform/renderers/waveformrendererrgb.h index fa8e8bbc12f9..9d452f9aa6a0 100644 --- a/src/waveform/renderers/waveformrendererrgb.h +++ b/src/waveform/renderers/waveformrendererrgb.h @@ -6,7 +6,7 @@ class WaveformRendererRGB : public WaveformRendererSignalBase { public: explicit WaveformRendererRGB( - WaveformWidgetRenderer* waveformWidget); + WaveformWidgetRenderer* waveformWidget, ::WaveformRendererSignalBase::Options options); virtual ~WaveformRendererRGB(); virtual void onSetup(const QDomNode& node); diff --git a/src/waveform/renderers/waveformrenderersignalbase.cpp b/src/waveform/renderers/waveformrenderersignalbase.cpp index 4b48122cf84e..a38043aa1acc 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.cpp +++ b/src/waveform/renderers/waveformrenderersignalbase.cpp @@ -12,7 +12,7 @@ const QString kEffectGroupFormat = QStringLiteral("[EqualizerRack1_%1_Effect1]") } // namespace WaveformRendererSignalBase::WaveformRendererSignalBase( - WaveformWidgetRenderer* waveformWidgetRenderer) + WaveformWidgetRenderer* waveformWidgetRenderer, Options) : WaveformRendererAbstract(waveformWidgetRenderer), m_pEQEnabled(nullptr), m_pLowFilterControlObject(nullptr), diff --git a/src/waveform/renderers/waveformrenderersignalbase.h b/src/waveform/renderers/waveformrenderersignalbase.h index 9b5e832e7bd1..fbbafd0ee3c9 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.h +++ b/src/waveform/renderers/waveformrenderersignalbase.h @@ -14,8 +14,16 @@ class WaveformSignalColors; class WaveformRendererSignalBase : public QObject, public WaveformRendererAbstract { Q_OBJECT public: + enum class Option { + None = 0b0, + SplitStereoSignal = 0b1, + HighDetail = 0b10, + AllOptionsCombined = SplitStereoSignal | HighDetail, + }; + Q_DECLARE_FLAGS(Options, Option) + explicit WaveformRendererSignalBase( - WaveformWidgetRenderer* waveformWidgetRenderer); + WaveformWidgetRenderer* waveformWidgetRenderer, Options options); virtual ~WaveformRendererSignalBase(); virtual bool init(); diff --git a/src/waveform/waveformwidgetfactory.cpp b/src/waveform/waveformwidgetfactory.cpp index b5f367a2f341..95f2e40f15d4 100644 --- a/src/waveform/waveformwidgetfactory.cpp +++ b/src/waveform/waveformwidgetfactory.cpp @@ -1,5 +1,6 @@ #include "waveform/waveformwidgetfactory.h" +#include "waveform/renderers/waveformrendererabstract.h" #include "waveform/waveform.h" #ifdef MIXXX_USE_QOPENGL @@ -931,7 +932,7 @@ void WaveformWidgetFactory::evaluateWidgets() { m_waveformWidgetHandles.clear(); QHash> collectedHandles; QHash + WaveformRendererSignalBase::Options> supportedOptions; for (WaveformWidgetType::Type type : WaveformWidgetType::kValues) { switch (type) { @@ -995,22 +996,21 @@ void WaveformWidgetFactory::evaluateWidgets() { m_waveformWidgetHandles.push_back(WaveformWidgetAbstractHandle(type, backends #ifdef MIXXX_USE_QOPENGL , - supportedOptions.value(type, allshader::WaveformRendererSignalBase::Option::None) + supportedOptions.value(type, WaveformRendererSignalBase::Option::None) #endif )); } } WaveformWidgetAbstract* WaveformWidgetFactory::createAllshaderWaveformWidget( - WaveformWidgetType::Type type, WWaveformViewer* viewer) { - allshader::WaveformRendererSignalBase::Options options = - m_config->getValue(ConfigKey("[Waveform]", "waveform_options"), - allshader::WaveformRendererSignalBase::Option::None); + WaveformWidgetType::Type type, + WWaveformViewer* viewer, + WaveformRendererSignalBase::Options options) { return new allshader::WaveformWidget(viewer, type, viewer->getGroup(), options); } WaveformWidgetAbstract* WaveformWidgetFactory::createFilteredWaveformWidget( - WWaveformViewer* viewer) { + WWaveformViewer* viewer, WaveformRendererSignalBase::Options options) { // On the UI, hardware acceleration is a boolean (0 => software rendering, 1 // => hardware acceleration), but in the setting, we keep the granularity so // in case of issue when we release, we can communicate workaround on @@ -1023,15 +1023,16 @@ WaveformWidgetAbstract* WaveformWidgetFactory::createFilteredWaveformWidget( switch (backend) { #ifdef MIXXX_USE_QOPENGL case WaveformWidgetBackend::AllShader: { - return createAllshaderWaveformWidget(WaveformWidgetType::Type::Filtered, viewer); + return createAllshaderWaveformWidget(WaveformWidgetType::Type::Filtered, viewer, options); } #endif default: - return new SoftwareWaveformWidget(viewer->getGroup(), viewer); + return new SoftwareWaveformWidget(viewer->getGroup(), viewer, options); } } -WaveformWidgetAbstract* WaveformWidgetFactory::createHSVWaveformWidget(WWaveformViewer* viewer) { +WaveformWidgetAbstract* WaveformWidgetFactory::createHSVWaveformWidget( + WWaveformViewer* viewer, WaveformRendererSignalBase::Options options) { // On the UI, hardware acceleration is a boolean (0 => software rendering, 1 // => hardware acceleration), but in the setting, we keep the granularity so // in case of issue when we release, we can communicate workaround on @@ -1044,14 +1045,15 @@ WaveformWidgetAbstract* WaveformWidgetFactory::createHSVWaveformWidget(WWaveform switch (backend) { #ifdef MIXXX_USE_QOPENGL case WaveformWidgetBackend::AllShader: - return createAllshaderWaveformWidget(WaveformWidgetType::HSV, viewer); + return createAllshaderWaveformWidget(WaveformWidgetType::HSV, viewer, options); #endif default: - return new HSVWaveformWidget(viewer->getGroup(), viewer); + return new HSVWaveformWidget(viewer->getGroup(), viewer, options); } } -WaveformWidgetAbstract* WaveformWidgetFactory::createRGBWaveformWidget(WWaveformViewer* viewer) { +WaveformWidgetAbstract* WaveformWidgetFactory::createRGBWaveformWidget( + WWaveformViewer* viewer, WaveformRendererSignalBase::Options options) { // On the UI, hardware acceleration is a boolean (0 => software rendering, 1 // => hardware acceleration), but in the setting, we keep the granularity so // in case of issue when we release, we can communicate workaround on @@ -1064,15 +1066,15 @@ WaveformWidgetAbstract* WaveformWidgetFactory::createRGBWaveformWidget(WWaveform switch (backend) { #ifdef MIXXX_USE_QOPENGL case WaveformWidgetBackend::AllShader: - return createAllshaderWaveformWidget(WaveformWidgetType::Type::RGB, viewer); + return createAllshaderWaveformWidget(WaveformWidgetType::Type::RGB, viewer, options); #endif default: - return new RGBWaveformWidget(viewer->getGroup(), viewer); + return new RGBWaveformWidget(viewer->getGroup(), viewer, options); } } WaveformWidgetAbstract* WaveformWidgetFactory::createStackedWaveformWidget( - WWaveformViewer* viewer) { + WWaveformViewer* viewer, WaveformRendererSignalBase::Options options) { #ifdef MIXXX_USE_QOPENGL // On the UI, hardware acceleration is a boolean (0 => software rendering, 1 // => hardware acceleration), but in the setting, we keep the granularity so @@ -1084,14 +1086,15 @@ WaveformWidgetAbstract* WaveformWidgetFactory::createStackedWaveformWidget( preferredBackend()); switch (backend) { case WaveformWidgetBackend::AllShader: - return createAllshaderWaveformWidget(WaveformWidgetType::Type::Stacked, viewer); + return createAllshaderWaveformWidget(WaveformWidgetType::Type::Stacked, viewer, options); #endif default: return new EmptyWaveformWidget(viewer->getGroup(), viewer); } } -WaveformWidgetAbstract* WaveformWidgetFactory::createSimpleWaveformWidget(WWaveformViewer* viewer) { +WaveformWidgetAbstract* WaveformWidgetFactory::createSimpleWaveformWidget( + WWaveformViewer* viewer, WaveformRendererSignalBase::Options options) { // On the UI, hardware acceleration is a boolean (0 => software rendering, 1 // => hardware acceleration), but in the setting, we keep the granularity so // in case of issue when we release, we can communicate workaround on @@ -1104,7 +1107,7 @@ WaveformWidgetAbstract* WaveformWidgetFactory::createSimpleWaveformWidget(WWavef switch (backend) { #ifdef MIXXX_USE_QOPENGL case WaveformWidgetBackend::AllShader: - return createAllshaderWaveformWidget(WaveformWidgetType::Type::Simple, viewer); + return createAllshaderWaveformWidget(WaveformWidgetType::Type::Simple, viewer, options); #endif default: return new EmptyWaveformWidget(viewer->getGroup(), viewer); @@ -1128,24 +1131,28 @@ WaveformWidgetAbstract* WaveformWidgetFactory::createWaveformWidget( type = WaveformWidgetType::Empty; } + WaveformRendererSignalBase::Options options = + m_config->getValue(ConfigKey("[Waveform]", "waveform_options"), + WaveformRendererSignalBase::Option::None); + switch (type) { case WaveformWidgetType::Simple: - widget = createSimpleWaveformWidget(viewer); + widget = createSimpleWaveformWidget(viewer, options); break; case WaveformWidgetType::Filtered: - widget = createFilteredWaveformWidget(viewer); + widget = createFilteredWaveformWidget(viewer, options); break; case WaveformWidgetType::HSV: - widget = createHSVWaveformWidget(viewer); + widget = createHSVWaveformWidget(viewer, options); break; case WaveformWidgetType::VSyncTest: widget = createVSyncTestWaveformWidget(viewer); break; case WaveformWidgetType::RGB: - widget = createRGBWaveformWidget(viewer); + widget = createRGBWaveformWidget(viewer, options); break; case WaveformWidgetType::Stacked: - widget = createStackedWaveformWidget(viewer); + widget = createStackedWaveformWidget(viewer, options); break; default: widget = new EmptyWaveformWidget(viewer->getGroup(), viewer); diff --git a/src/waveform/waveformwidgetfactory.h b/src/waveform/waveformwidgetfactory.h index 05e3ced526b4..3c698cbf62c0 100644 --- a/src/waveform/waveformwidgetfactory.h +++ b/src/waveform/waveformwidgetfactory.h @@ -10,6 +10,7 @@ #include "util/performancetimer.h" #include "util/singleton.h" #include "waveform/renderers/allshader/waveformrenderersignalbase.h" +#include "waveform/renderers/waveformrenderersignalbase.h" #include "waveform/widgets/waveformwidgettype.h" #include "waveform/widgets/waveformwidgetvars.h" @@ -61,11 +62,11 @@ class WaveformWidgetAbstractHandle { } #ifdef MIXXX_USE_QOPENGL - allshader::WaveformRendererSignalBase::Options supportedOptions( + WaveformRendererSignalBase::Options supportedOptions( WaveformWidgetBackend backend) const { return backend == WaveformWidgetBackend::AllShader ? m_supportedOption - : allshader::WaveformRendererSignalBase::Option::None; + : WaveformRendererSignalBase::Option::None; } #endif @@ -76,7 +77,7 @@ class WaveformWidgetAbstractHandle { QList m_backends; #ifdef MIXXX_USE_QOPENGL // Only relevant for Allshader (accelerated) backend. Other backends don't implement options - allshader::WaveformRendererSignalBase::Options m_supportedOption; + WaveformRendererSignalBase::Options m_supportedOption; #endif friend class WaveformWidgetFactory; @@ -260,7 +261,9 @@ class WaveformWidgetFactory : public QObject, template QString buildWidgetDisplayName() const; WaveformWidgetAbstract* createAllshaderWaveformWidget( - WaveformWidgetType::Type type, WWaveformViewer* viewer); + WaveformWidgetType::Type type, + WWaveformViewer* viewer, + WaveformRendererSignalBase::Options option); WaveformWidgetAbstract* createWaveformWidget(WaveformWidgetType::Type type, WWaveformViewer* viewer); int findIndexOf(WWaveformViewer* viewer) const; @@ -303,11 +306,17 @@ class WaveformWidgetFactory : public QObject, VisualsManager* m_pVisualsManager; // not owned // TODO(#13245): Migrate the following methods to smart pointer. - WaveformWidgetAbstract* createFilteredWaveformWidget(WWaveformViewer* viewer); - WaveformWidgetAbstract* createHSVWaveformWidget(WWaveformViewer* viewer); - WaveformWidgetAbstract* createRGBWaveformWidget(WWaveformViewer* viewer); - WaveformWidgetAbstract* createStackedWaveformWidget(WWaveformViewer* viewer); - WaveformWidgetAbstract* createSimpleWaveformWidget(WWaveformViewer* viewer); + WaveformWidgetAbstract* createFilteredWaveformWidget( + WWaveformViewer* viewer, + WaveformRendererSignalBase::Options option); + WaveformWidgetAbstract* createHSVWaveformWidget(WWaveformViewer* viewer, + WaveformRendererSignalBase::Options option); + WaveformWidgetAbstract* createRGBWaveformWidget(WWaveformViewer* viewer, + WaveformRendererSignalBase::Options option); + WaveformWidgetAbstract* createStackedWaveformWidget(WWaveformViewer* viewer, + WaveformRendererSignalBase::Options option); + WaveformWidgetAbstract* createSimpleWaveformWidget(WWaveformViewer* viewer, + WaveformRendererSignalBase::Options option); WaveformWidgetAbstract* createVSyncTestWaveformWidget(WWaveformViewer* viewer); //Debug diff --git a/src/waveform/widgets/allshader/waveformwidget.cpp b/src/waveform/widgets/allshader/waveformwidget.cpp index d29480668dc0..8b82797461e9 100644 --- a/src/waveform/widgets/allshader/waveformwidget.cpp +++ b/src/waveform/widgets/allshader/waveformwidget.cpp @@ -25,7 +25,7 @@ namespace allshader { WaveformWidget::WaveformWidget(QWidget* parent, WaveformWidgetType::Type type, const QString& group, - WaveformRendererSignalBase::Options options) + ::WaveformRendererSignalBase::Options options) : WGLWidget(parent), WaveformWidgetAbstract(group), m_pWaveformRendererSignal(nullptr) { @@ -101,10 +101,10 @@ WaveformWidget::~WaveformWidget() { std::unique_ptr WaveformWidget::addWaveformSignalRenderer(WaveformWidgetType::Type type, - WaveformRendererSignalBase::Options options, + ::WaveformRendererSignalBase::Options options, ::WaveformRendererAbstract::PositionSource positionSource) { #ifndef QT_OPENGL_ES_2 - if (options & WaveformRendererSignalBase::Option::HighDetail) { + if (options & ::WaveformRendererSignalBase::Option::HighDetail) { switch (type) { case ::WaveformWidgetType::RGB: case ::WaveformWidgetType::Filtered: @@ -119,16 +119,16 @@ WaveformWidget::addWaveformSignalRenderer(WaveformWidgetType::Type type, switch (type) { case ::WaveformWidgetType::Simple: - return addWaveformSignalRenderer(); + return addWaveformSignalRenderer(options); case ::WaveformWidgetType::RGB: return addWaveformSignalRenderer(positionSource, options); case ::WaveformWidgetType::HSV: - return addWaveformSignalRenderer(); + return addWaveformSignalRenderer(options); case ::WaveformWidgetType::Filtered: - return addWaveformSignalRenderer(false); + return addWaveformSignalRenderer(false, options); case ::WaveformWidgetType::Stacked: return addWaveformSignalRenderer( - true); // true for RGB Stacked + true, options); // true for RGB Stacked default: break; } @@ -198,16 +198,16 @@ void WaveformWidget::leaveEvent(QEvent* pEvent) { /* static */ WaveformRendererSignalBase::Options WaveformWidget::supportedOptions( WaveformWidgetType::Type type) { - WaveformRendererSignalBase::Options options = WaveformRendererSignalBase::Option::None; + ::WaveformRendererSignalBase::Options options = ::WaveformRendererSignalBase::Option::None; switch (type) { case WaveformWidgetType::Type::RGB: - options = WaveformRendererSignalBase::Option::AllOptionsCombined; + options = ::WaveformRendererSignalBase::Option::AllOptionsCombined; break; case WaveformWidgetType::Type::Filtered: - options = WaveformRendererSignalBase::Option::HighDetail; + options = ::WaveformRendererSignalBase::Option::HighDetail; break; case WaveformWidgetType::Type::Stacked: - options = WaveformRendererSignalBase::Option::HighDetail; + options = ::WaveformRendererSignalBase::Option::HighDetail; break; default: break; diff --git a/src/waveform/widgets/allshader/waveformwidget.h b/src/waveform/widgets/allshader/waveformwidget.h index 88a871f1fe78..fd5246e31adb 100644 --- a/src/waveform/widgets/allshader/waveformwidget.h +++ b/src/waveform/widgets/allshader/waveformwidget.h @@ -20,7 +20,7 @@ class allshader::WaveformWidget final : public ::WGLWidget, explicit WaveformWidget(QWidget* parent, WaveformWidgetType::Type type, const QString& group, - WaveformRendererSignalBase::Options options); + ::WaveformRendererSignalBase::Options options); ~WaveformWidget() override; WaveformWidgetType::Type getType() const override { @@ -40,7 +40,7 @@ class allshader::WaveformWidget final : public ::WGLWidget, return this; } static WaveformWidgetVars vars(); - static WaveformRendererSignalBase::Options supportedOptions(WaveformWidgetType::Type type); + static ::WaveformRendererSignalBase::Options supportedOptions(WaveformWidgetType::Type type); private: void castToQWidget() override; @@ -61,7 +61,7 @@ class allshader::WaveformWidget final : public ::WGLWidget, std::unique_ptr addWaveformSignalRenderer( WaveformWidgetType::Type type, - WaveformRendererSignalBase::Options options, + ::WaveformRendererSignalBase::Options options, ::WaveformRendererAbstract::PositionSource positionSource); WaveformWidgetType::Type m_type; diff --git a/src/waveform/widgets/hsvwaveformwidget.cpp b/src/waveform/widgets/hsvwaveformwidget.cpp index c3316889ff88..e66530c4671a 100644 --- a/src/waveform/widgets/hsvwaveformwidget.cpp +++ b/src/waveform/widgets/hsvwaveformwidget.cpp @@ -11,13 +11,15 @@ #include "waveform/renderers/waveformrendermark.h" #include "waveform/renderers/waveformrendermarkrange.h" -HSVWaveformWidget::HSVWaveformWidget(const QString& group, QWidget* parent) +HSVWaveformWidget::HSVWaveformWidget(const QString& group, + QWidget* parent, + ::WaveformRendererSignalBase::Options options) : NonGLWaveformWidgetAbstract(group, parent) { addRenderer(); addRenderer(); addRenderer(); addRenderer(); - addRenderer(); + addRenderer(options); addRenderer(); addRenderer(); diff --git a/src/waveform/widgets/hsvwaveformwidget.h b/src/waveform/widgets/hsvwaveformwidget.h index 64770edaf10f..5f4a1a6f197d 100644 --- a/src/waveform/widgets/hsvwaveformwidget.h +++ b/src/waveform/widgets/hsvwaveformwidget.h @@ -1,6 +1,7 @@ #pragma once #include "nonglwaveformwidgetabstract.h" +#include "waveform/renderers/waveformrenderersignalbase.h" class QWidget; @@ -28,6 +29,8 @@ class HSVWaveformWidget : public NonGLWaveformWidgetAbstract { virtual void paintEvent(QPaintEvent* event); private: - HSVWaveformWidget(const QString& group, QWidget* parent); + HSVWaveformWidget(const QString& group, + QWidget* parent, + WaveformRendererSignalBase::Options options); friend class WaveformWidgetFactory; }; diff --git a/src/waveform/widgets/rgbwaveformwidget.cpp b/src/waveform/widgets/rgbwaveformwidget.cpp index 3c7a61805d2e..72b907ede6af 100644 --- a/src/waveform/widgets/rgbwaveformwidget.cpp +++ b/src/waveform/widgets/rgbwaveformwidget.cpp @@ -11,13 +11,15 @@ #include "waveform/renderers/waveformrendermark.h" #include "waveform/renderers/waveformrendermarkrange.h" -RGBWaveformWidget::RGBWaveformWidget(const QString& group, QWidget* parent) +RGBWaveformWidget::RGBWaveformWidget(const QString& group, + QWidget* parent, + WaveformRendererSignalBase::Options options) : NonGLWaveformWidgetAbstract(group, parent) { addRenderer(); addRenderer(); addRenderer(); addRenderer(); - addRenderer(); + addRenderer(options); addRenderer(); addRenderer(); diff --git a/src/waveform/widgets/rgbwaveformwidget.h b/src/waveform/widgets/rgbwaveformwidget.h index 3c925c5359db..255415b697e2 100644 --- a/src/waveform/widgets/rgbwaveformwidget.h +++ b/src/waveform/widgets/rgbwaveformwidget.h @@ -1,6 +1,7 @@ #pragma once #include "nonglwaveformwidgetabstract.h" +#include "waveform/renderers/waveformrenderersignalbase.h" class QWidget; @@ -28,6 +29,8 @@ class RGBWaveformWidget : public NonGLWaveformWidgetAbstract { virtual void paintEvent(QPaintEvent* event); private: - RGBWaveformWidget(const QString& group, QWidget* parent); + RGBWaveformWidget(const QString& group, + QWidget* parent, + WaveformRendererSignalBase::Options options); friend class WaveformWidgetFactory; }; diff --git a/src/waveform/widgets/softwarewaveformwidget.cpp b/src/waveform/widgets/softwarewaveformwidget.cpp index 69099904e608..7f321b67a4d5 100644 --- a/src/waveform/widgets/softwarewaveformwidget.cpp +++ b/src/waveform/widgets/softwarewaveformwidget.cpp @@ -11,13 +11,15 @@ #include "waveform/renderers/waveformrendermark.h" #include "waveform/renderers/waveformrendermarkrange.h" -SoftwareWaveformWidget::SoftwareWaveformWidget(const QString& group, QWidget* parent) +SoftwareWaveformWidget::SoftwareWaveformWidget(const QString& group, + QWidget* parent, + WaveformRendererSignalBase::Options options) : NonGLWaveformWidgetAbstract(group, parent) { addRenderer(); addRenderer(); addRenderer(); addRenderer(); - addRenderer(); + addRenderer(options); addRenderer(); addRenderer(); diff --git a/src/waveform/widgets/softwarewaveformwidget.h b/src/waveform/widgets/softwarewaveformwidget.h index c79d0a545eaf..5227435f213f 100644 --- a/src/waveform/widgets/softwarewaveformwidget.h +++ b/src/waveform/widgets/softwarewaveformwidget.h @@ -1,6 +1,7 @@ #pragma once #include "nonglwaveformwidgetabstract.h" +#include "waveform/renderers/waveformrenderersignalbase.h" class QWidget; @@ -29,6 +30,8 @@ class SoftwareWaveformWidget : public NonGLWaveformWidgetAbstract { virtual void paintEvent(QPaintEvent* event); private: - SoftwareWaveformWidget(const QString& groupp, QWidget* parent); + SoftwareWaveformWidget(const QString& groupp, + QWidget* parent, + WaveformRendererSignalBase::Options options); friend class WaveformWidgetFactory; }; From 0ae4c6a7b0cf42a6a27ad3d9a9125e80b146372d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 26 Jun 2025 01:08:24 +0200 Subject: [PATCH 063/163] Update Translation template. Found 3225 source text(s) (14 new and 3211 already existing) --- res/translations/mixxx.ts | 754 +++++++++++++++++++++----------------- 1 file changed, 408 insertions(+), 346 deletions(-) diff --git a/res/translations/mixxx.ts b/res/translations/mixxx.ts index 549697e3eeb1..56fd19245fe5 100644 --- a/res/translations/mixxx.ts +++ b/res/translations/mixxx.ts @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist @@ -160,7 +160,7 @@ - + Create New Playlist @@ -190,113 +190,120 @@ - - + + Import Playlist - + Export Track Files - + Analyze entire Playlist - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - - + + Export Playlist - + Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy //: Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # - + Timestamp @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album - + Album Artist - + Artist - + Bitrate - + BPM - + Channels - + Color - + Comment - + Composer - + Cover Art - + Date Added - + Last Played - + Duration - + Type - + Genre - + Grouping - + Key - + Location - + Overview - + Preview - + Rating - + ReplayGain - + Samplerate - + Played - + Title - + Track # - + Year - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3627,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3760,7 +3777,7 @@ trace - Above + Profiling messages - + Export Crate @@ -3770,7 +3787,7 @@ trace - Above + Profiling messages - + An unknown error occurred while creating crate: @@ -3796,17 +3813,17 @@ trace - Above + Profiling messages - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U Playlist (*.m3u) @@ -3932,12 +3949,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -3993,7 +4010,7 @@ trace - Above + Profiling messages - + Analyze @@ -4038,17 +4055,17 @@ trace - Above + Profiling messages - + Stop Analysis - + Analyzing %1% %2/%3 - + Analyzing %1/%2 @@ -4448,37 +4465,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5180,113 +5197,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5617,6 +5634,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6208,62 +6235,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7430,173 +7457,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms - + Configuration error @@ -7614,131 +7640,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output - + Input - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -9291,27 +9317,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9526,15 +9552,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9545,57 +9571,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9603,62 +9629,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9833,249 +9859,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10091,13 +10117,13 @@ Do you want to select an input device? PlaylistFeature - + Lock - - + + Playlists @@ -10107,32 +10133,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist @@ -11756,7 +11808,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11920,12 +11972,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12053,54 +12105,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -15339,47 +15391,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -16897,37 +16949,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16948,52 +17000,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17004,68 +17056,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists - + + Selected crates/playlists + + + + Browse - + Export directory - + Database version - + Export - + Cancel - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -17086,7 +17148,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17096,22 +17158,22 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - + Exporting to Engine DJ... From 63384ba588b963d697f6dfb4dfd5a7922c3793e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 26 Jun 2025 08:38:25 +0200 Subject: [PATCH 064/163] Pull latest translations from https://www.transifex.com/mixxx-dj-software/mixxxdj/mixxx2-7/. Compile QM files out of TS files that are used by the localized app --- res/translations/mixxx_bg.qm | Bin 43992 -> 48964 bytes res/translations/mixxx_bg.ts | 5223 ++++++++++--------- res/translations/mixxx_ca.qm | Bin 388189 -> 398938 bytes res/translations/mixxx_ca.ts | 1167 +++-- res/translations/mixxx_cs.qm | Bin 421453 -> 419929 bytes res/translations/mixxx_cs.ts | 1054 ++-- res/translations/mixxx_de.qm | Bin 454582 -> 461879 bytes res/translations/mixxx_de.ts | 1174 +++-- res/translations/mixxx_el.qm | Bin 85046 -> 84857 bytes res/translations/mixxx_el.ts | 3612 +++++++------ res/translations/mixxx_en_CA.qm | Bin 290705 -> 289574 bytes res/translations/mixxx_en_CA.ts | 3201 ++++++------ res/translations/mixxx_en_GB.qm | Bin 290675 -> 289544 bytes res/translations/mixxx_en_GB.ts | 3201 ++++++------ res/translations/mixxx_es.qm | Bin 449612 -> 490223 bytes res/translations/mixxx_es.ts | 1533 +++--- res/translations/mixxx_es_419.qm | Bin 441590 -> 489959 bytes res/translations/mixxx_es_419.ts | 1608 +++--- res/translations/mixxx_es_AR.qm | Bin 441787 -> 489948 bytes res/translations/mixxx_es_AR.ts | 1602 +++--- res/translations/mixxx_es_CO.qm | Bin 441569 -> 489936 bytes res/translations/mixxx_es_CO.ts | 1608 +++--- res/translations/mixxx_es_ES.qm | Bin 443026 -> 490008 bytes res/translations/mixxx_es_ES.ts | 1589 +++--- res/translations/mixxx_es_MX.qm | Bin 443423 -> 489998 bytes res/translations/mixxx_es_MX.ts | 1589 +++--- res/translations/mixxx_et.qm | Bin 48997 -> 48742 bytes res/translations/mixxx_et.ts | 3614 +++++++------ res/translations/mixxx_eu.qm | Bin 50991 -> 50781 bytes res/translations/mixxx_eu.ts | 3614 +++++++------ res/translations/mixxx_fa.qm | Bin 34845 -> 34245 bytes res/translations/mixxx_fa.ts | 3620 +++++++------ res/translations/mixxx_fi.qm | Bin 84643 -> 84382 bytes res/translations/mixxx_fi.ts | 3614 +++++++------ res/translations/mixxx_fr.qm | Bin 508735 -> 510872 bytes res/translations/mixxx_fr.ts | 1072 ++-- res/translations/mixxx_gl.qm | Bin 186356 -> 186103 bytes res/translations/mixxx_gl.ts | 3189 +++++------ res/translations/mixxx_hi_IN.qm | Bin 25481 -> 25303 bytes res/translations/mixxx_hi_IN.ts | 5105 ++++++++++-------- res/translations/mixxx_hu.qm | Bin 98644 -> 102337 bytes res/translations/mixxx_hu.ts | 3674 +++++++------ res/translations/mixxx_id.qm | Bin 35573 -> 35384 bytes res/translations/mixxx_id.ts | 3616 +++++++------ res/translations/mixxx_it.qm | Bin 459254 -> 459840 bytes res/translations/mixxx_it.ts | 1100 ++-- res/translations/mixxx_ja.qm | Bin 90240 -> 91022 bytes res/translations/mixxx_ja.ts | 1480 +++--- res/translations/mixxx_ko.qm | Bin 57246 -> 57188 bytes res/translations/mixxx_ko.ts | 3187 +++++------ res/translations/mixxx_lb.qm | Bin 16202 -> 16294 bytes res/translations/mixxx_lb.ts | 3612 +++++++------ res/translations/mixxx_nb.qm | Bin 44199 -> 43781 bytes res/translations/mixxx_nb.ts | 3618 +++++++------ res/translations/mixxx_nl.qm | Bin 480821 -> 479003 bytes res/translations/mixxx_nl.ts | 1048 ++-- res/translations/mixxx_pl.qm | Bin 297517 -> 297017 bytes res/translations/mixxx_pl.ts | 3202 ++++++------ res/translations/mixxx_pt.qm | Bin 159807 -> 297422 bytes res/translations/mixxx_pt.ts | 5036 +++++++++--------- res/translations/mixxx_pt_BR.qm | Bin 234677 -> 296811 bytes res/translations/mixxx_pt_BR.ts | 3959 +++++++------- res/translations/mixxx_pt_PT.qm | Bin 285697 -> 296765 bytes res/translations/mixxx_pt_PT.ts | 3414 ++++++------ res/translations/mixxx_ro.qm | Bin 168368 -> 167624 bytes res/translations/mixxx_ro.ts | 3197 ++++++------ res/translations/mixxx_ru.qm | Bin 422856 -> 421028 bytes res/translations/mixxx_ru.ts | 1048 ++-- res/translations/mixxx_sl.qm | Bin 432757 -> 431169 bytes res/translations/mixxx_sl.ts | 1050 ++-- res/translations/mixxx_sq_AL.qm | Bin 166365 -> 167724 bytes res/translations/mixxx_sq_AL.ts | 1536 +++--- res/translations/mixxx_sr.qm | Bin 179678 -> 179419 bytes res/translations/mixxx_sr.ts | 3618 +++++++------ res/translations/mixxx_sv.qm | Bin 208821 -> 208855 bytes res/translations/mixxx_sv.ts | 3221 ++++++------ res/translations/mixxx_tr.qm | Bin 76698 -> 76577 bytes res/translations/mixxx_tr.ts | 3628 +++++++------ res/translations/mixxx_uk.qm | Bin 53821 -> 53487 bytes res/translations/mixxx_uk.ts | 3616 +++++++------ res/translations/mixxx_vi.qm | Bin 187157 -> 190797 bytes res/translations/mixxx_vi.ts | 3356 ++++++------ res/translations/mixxx_zh.qm | Bin 298048 -> 297086 bytes res/translations/mixxx_zh.ts | 1059 ++-- res/translations/mixxx_zh_CN.qm | Bin 298079 -> 297153 bytes res/translations/mixxx_zh_CN.ts | 1056 ++-- res/translations/mixxx_zh_HK.qm | Bin 297981 -> 297159 bytes res/translations/mixxx_zh_HK.ts | 1060 ++-- res/translations/mixxx_zh_TW.qm | Bin 298272 -> 297367 bytes res/translations/mixxx_zh_TW.ts | 1058 ++-- res/translations/source_copy_allow_list.tsv | 78 +- 91 files changed, 62236 insertions(+), 55280 deletions(-) diff --git a/res/translations/mixxx_bg.qm b/res/translations/mixxx_bg.qm index 8b0e62ad1f6ccf37c14d3b7dfea0d4201de2f7e8..3f91b1106b0de113ed7c441c2626f0d64d9e2252 100644 GIT binary patch delta 6281 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 E0A#z7lmGw# delta 3727 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 WNo>?eMe)cvmC*P_op|i5UjBc7mPBL# diff --git a/res/translations/mixxx_bg.ts b/res/translations/mixxx_bg.ts index 50fc06e3e5a4..0f7502263cd3 100644 --- a/res/translations/mixxx_bg.ts +++ b/res/translations/mixxx_bg.ts @@ -19,22 +19,52 @@ AutoDJFeature - + Crates Колекции - + + Enable Auto DJ + + + + + Disable Auto DJ + + + + + Clear Auto DJ Queue + + + + Remove Crate as Track Source Премахни Колекция като Пистов Източник - + Auto DJ Авто-DJ (Автодиджей) - + + Confirmation Clear + + + + + Do you really want to remove all tracks from the Auto DJ queue? + + + + + This can not be undone. + + + + Add Crate as Track Source Добави Колекция като Пистов Източник @@ -117,154 +147,161 @@ BasePlaylistFeature - + New Playlist Нов списък с песни - + Add to Auto DJ Queue (bottom) Добавяне към Авто DJ опашка (край) - - + + Create New Playlist Създаване на нов списък с песни - + Add to Auto DJ Queue (top) Добавяне към Авто DJ опашка (начало) - + Remove Премахване - + Rename Преименуване - + Lock Заключване - + Duplicate Дубликат - - + + Import Playlist Внасяне на списък за изпълнение - + Export Track Files - + Analyze entire Playlist Анализирай целия списък с песни - + Enter new name for playlist: Въведи ново име за списък с песни: - + Duplicate Playlist Копиране на списъка с песни - - + + Enter name for new playlist: Въведете име за нов списък с песни - - + + Export Playlist Изнасяне на списъка с песни - + Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Преименуване на списъка с песни - - + + Renaming Playlist Failed Преименуването на списъка с песни не бе успепно - - - + + + A playlist by that name already exists. Вече съществува списък с песни с това име - - - + + + A playlist cannot have a blank name. Списъка с песни не може да бъде без име. - + _copy //: Appendix to default name when duplicating a playlist _копие - - - - - - + + + + + + Playlist Creation Failed Създаването на списъка за изпъленине се провали - - + + An unknown error occurred while creating playlist: По време на създаването на списъка за изпълнение възникна неизвестна грешка: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U Списък с песни (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Списък за изпълнение M3U (*.m3u);;Списък за изпълнение M3U8 (*.m3u8);;Списък за изпълнение PLS (*.pls);;Текст в CSV (*.csv);;Четим текст (*.txt) @@ -272,12 +309,12 @@ BaseSqlTableModel - + # - + Timestamp Дата @@ -285,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Песента не може да бъде заредена. @@ -293,137 +330,142 @@ BaseTrackTableModel - + Album Албум - + Album Artist Изпълнител - + Artist Изпълнител - + Bitrate Бит./сек. (bitrate) - + BPM Уд/мин (BPM) - + Channels Канали - + Color - + Comment Коментар - + Composer Композитор - + Cover Art Обложка - + Date Added Дата на добавяне - + Last Played - + Duration Продължителност - + Type Тип - + Genre Жанр - + Grouping Групировка - + Key Ключ - + Location Местоположение - + + Overview + + + + Preview Преглед - + Rating Оценка - + ReplayGain - + Samplerate - + Played Пускано - + Title Заглавие - + Track # Пътека/писта/запис № - + Year Година - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -445,22 +487,22 @@ BroadcastProfile - + Can't use secure password storage: keychain access failed. - + Secure password retrieval unsuccessful: keychain access failed. - + Settings error Грешка в настройките - + <b>Error with settings for '%1':</b><br> <b>Грешка в настройките за '%1':</b><br> @@ -511,213 +553,215 @@ BrowseFeature - + Add to Quick Links Добави към Бързи връзки - + Remove from Quick Links Премахни от Бързи връзки - + Add to Library Добави в библиотека - + Refresh directory tree - + Quick Links Бързи връзки - - + + Devices Устройства - + Removable Devices Преносими устройства - - + + Computer Компютър - + Music Directory Added Музикалната папка е добавена - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Вие сте добавили една или повече папки с музика. Файловете в тези папки няма да са налични докато не сканирате повторно вашата библиотека. Желаете ли да сканирате повторно сега? - + Scan Сканиране - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel - + Preview Преглед - + Filename Име на файл - + Artist Изпълнител - + Title Заглавие - + Album Албум - + Track # Пътека/писта/запис № - + Year Година - + Genre Жанр - + Composer Композитор - + Comment Коментар - + Duration Продължителност - + BPM Уд/мин (BPM) - + Key Ключ - + Type Тип - + Bitrate Бит./сек. (bitrate) - + ReplayGain - + Location Местоположение - + Album Artist Изпълнител - + Grouping Групировка - + File Modified Файла е модифициран - + File Created Файла е създаден - + Mixxx Library Библиотека на Mixxx - + Could not load the following file because it is in use by Mixxx or another application. Следният файл не може да бъде зареден, защото се използва отMixxx или друго приложение. - - BulkController - - - USB Controller - USB Контролер - - CachingReaderWorker - + The file '%1' could not be found. - + The file '%1' could not be loaded. - + The file '%1' could not be loaded because it contains %2 channels, and only 1 to %3 are supported. - + The file '%1' is empty and could not be loaded. @@ -725,82 +769,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + + Rescans the library when Mixxx is launched. + + + + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -810,22 +859,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. + + + + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1007,13 +1066,13 @@ trace - Above + Profiling messages - + Set to full volume - + Set to zero volume @@ -1038,13 +1097,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button Бутон за заглушаване @@ -1055,25 +1114,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1114,22 +1173,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1139,193 +1198,193 @@ trace - Above + Profiling messages Еквалайзери - + Vinyl Control Контрол с грамофони - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1441,20 +1500,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1470,7 +1529,7 @@ trace - Above + Profiling messages - + Mute Заглушаване @@ -1481,7 +1540,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1502,25 +1561,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1590,82 +1649,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync Синхронизация - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1706,456 +1765,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Добавяне към Авто DJ опашка (край) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Добавяне към Авто DJ опашка (начало) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track - + Load selected track and play - - + + Record Mix Запиши микс - + Toggle mix recording - + Effects Ефекти - + Quick Effects Бързи ефекти - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear Изчисти - + Clear the current effect - + Изчисти текущия ефект - + Toggle - + Toggle the current effect - + Next Следваща - + Switch to next effect - + Previous Предишна - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Активиране на Автоматичен DJ - + Toggle Auto DJ On/Off - - Microphone & Auxiliary Show/Hide - - - - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2170,102 +2224,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Скорост на възпроизвеждане - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2288,7 +2342,7 @@ trace - Above + Profiling messages Skin - + Кожа @@ -2417,1039 +2471,1075 @@ trace - Above + Profiling messages - - - Toggle the BPM/beatgrid lock + + Move Beatgrid Half a Beat - - Revert last BPM/Beatgrid Change + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - Revert last BPM/Beatgrid Change of the loaded track. + + Toggle the BPM/beatgrid lock - - Sync / Sync Lock + + Revert last BPM/Beatgrid Change - - Internal Sync Leader + + Revert last BPM/Beatgrid Change of the loaded track. - - Toggle Internal Sync Leader + + Sync / Sync Lock + Internal Sync Leader + + + - Internal Leader BPM + Toggle Internal Sync Leader + + Internal Leader BPM + + + + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Вкл./изкл. микрофон - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Авто-DJ (Автодиджей) - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface - + Samplers Show/Hide - + Show/hide the sampler section - + + Microphone && Auxiliary Show/Hide + keep double & to prevent creation of keyboard accelerator + + + + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star + + Controller + + + Unknown + + + ControllerInputMappingTableModel @@ -3539,12 +3629,12 @@ trace - Above + Profiling messages - + Unnamed - + <i>FPS: %0/%1</i> @@ -3552,32 +3642,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3585,27 +3675,27 @@ trace - Above + Profiling messages ControllerScriptEngineLegacy - + Controller Mapping File Problem - + The mapping for controller "%1" cannot be opened. - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + File: - + Error: @@ -3626,15 +3716,15 @@ trace - Above + Profiling messages Премахване - + Create New Crate - + Rename - + Преименуване @@ -3685,7 +3775,7 @@ trace - Above + Profiling messages Внасяне на колекция - + Export Crate Изнасяне на колекция @@ -3695,7 +3785,7 @@ trace - Above + Profiling messages Отключване - + An unknown error occurred while creating crate: Неочаквана грешка при създаване на колекция: @@ -3704,12 +3794,6 @@ trace - Above + Profiling messages Rename Crate Преименуване на колекция - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3727,25 +3811,31 @@ trace - Above + Profiling messages Колекцията не бе преименувана успешно. - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Списък за изпълнение M3U (*.m3u);;Списък за изпълнение M3U8 (*.m3u8);;Списък за изпълнение PLS (*.pls);;Текст в CSV (*.csv);;Четим текст (*.txt) - + M3U Playlist (*.m3u) - + M3U Списък с песни (*.m3u) Crates are a great way to help organize the music you want to DJ with. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3857,12 +3947,12 @@ trace - Above + Profiling messages Програмисти от стари версии - + Official Website - + Donate @@ -3918,7 +4008,7 @@ trace - Above + Profiling messages - + Analyze Анализиране @@ -3968,12 +4058,12 @@ trace - Above + Profiling messages Спиране на анализирането - + Analyzing %1% %2/%3 - + Analyzing %1/%2 @@ -3981,92 +4071,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Пропускане - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Секунди - - Full Intro + Outro - - - - - Fade At Outro Start - - - - - Full Track - - - - - Skip Silence - - - - + Auto DJ Fade Modes Full Intro + Outro: @@ -4088,59 +4158,89 @@ silence between tracks. Skip Silence: Play the whole track except for silence at the beginning and end. Begin crossfading from the selected number of seconds before the -last sound. +last sound. + +Skip Silence Start Full Volume: +The same as Skip Silence, but starting transitions with a centered +crossfader, so that the intro starts at full volume. + - - Repeat + + Full Intro + Outro - - Auto DJ requires two decks assigned to opposite sides of the crossfader. + + Fade At Outro Start - - One deck must be stopped to enable Auto DJ mode. + + Full Track + + + + + Skip Silence + + + + + Skip Silence Start Full Volume + + + + + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. + + + + + Repeat + + + + + Auto DJ requires two decks assigned to opposite sides of the crossfader. - - Decks 3 and 4 must be stopped to enable Auto DJ mode. + + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Авто-DJ (Автодиджей) - + Shuffle Разбъркано възпроизвеждане - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4159,7 +4259,7 @@ If no track sources are configured, the track is added from the library instead. - + Choose between different algorithms to detect beats. @@ -4194,9 +4294,24 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - - Choose Analyzer - Избери Анализатор + + Use rhythmic channel when analysing stem file + + + + + Disabled + + + + + Enforced + + + + + Choose Analyzer + Избери Анализатор @@ -4240,7 +4355,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Close - + Затваряне @@ -4255,7 +4370,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Cancel - + Отказ @@ -4305,7 +4420,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Retry - + Отново @@ -4348,32 +4463,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 + + + + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4412,17 +4532,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -4488,7 +4608,7 @@ You tried to learn: %1,%2 - + &Close @@ -4556,7 +4676,7 @@ You tried to learn: %1,%2 % - + % @@ -4575,42 +4695,42 @@ You tried to learn: %1,%2 - + Add Random Tracks - + Enable random track addition to queue - + Add random tracks from Track Source if the specified minimum tracks remain - + Minimum allowed tracks before addition - + Minimum number of tracks after which random tracks may be added - + Crossfader Behaviour - + Reset the Crossfader back to center after disabling AutoDJ - + Hint: Resetting the crossfader to center will cause a drop of the main output's volume if you've selected "Constant Power" crossfader curve in the Mixer preferences. @@ -4620,7 +4740,7 @@ You tried to learn: %1,%2 Icecast 2 - + Icecast 2 @@ -4630,12 +4750,12 @@ You tried to learn: %1,%2 Icecast 1 - + Icecast 1 MP3 - + MP3 @@ -4675,65 +4795,65 @@ You tried to learn: %1,%2 Stereo - + Стерео - - - - + + + + Action failed Неуспешно действие - + You can't create more than %1 source connections. - + Source connection %1 - + At least one source connection is required. - + Are you sure you want to disconnect every active source connection? - - + + Confirmation required - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. - + Are you sure you want to delete '%1'? - + Renaming '%1' - + New name for '%1': - + Can't rename '%1' to '%2': name already in use @@ -4758,7 +4878,7 @@ Two source connections to the same server that have the same mountpoint can not http://www.mixxx.org - + http://www.mixxx.org @@ -5006,13 +5126,13 @@ Two source connections to the same server that have the same mountpoint can not DlgPrefColors - - + + By hotcue number - + Color @@ -5055,132 +5175,133 @@ Two source connections to the same server that have the same mountpoint can not Replace… - - - DlgPrefController - - Apply device settings? + + When key colors are enabled, Mixxx will display a color hint +associated with each key. - - Your settings must be applied before starting the learning wizard. -Apply settings and continue? + + Enable Key Colors - - None + + Key palette + + + DlgPrefController - - %1 by %2 + + Apply device settings? - - No Name + + Your settings must be applied before starting the learning wizard. +Apply settings and continue? - - No Description - + + None + Без - - No Author + + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5188,65 +5309,115 @@ Apply settings and continue? DlgPrefControllerDlg - - (device category goes here) - - - - + Controller Name - + Enabled Включено - - Description: + + Device Info - - Support: + + Physical Interface: + + + + + Vendor name: + + + + + Product name: + + + + + Vendor ID + + + + + VID: - - Mapping settings + + Product ID - + + PID: + + + + + Serial number: + + + + + USB interface number: + + + + + HID Usage-Page: + + + + + HID Usage: + + + + + Description: + + + + + Support: + + + + Screens preview - + Input Mappings - - + + Search - - + + Add Добавяне - - + + Remove Премахване - + Click to start the Controller Learning wizard. @@ -5256,48 +5427,53 @@ Apply settings and continue? - - Controller Setup - - - - + Load Mapping: - + Mapping Info - + Author: - + Name: - + Learning Wizard (MIDI Only) - + + Data protocol: + + + + Mapping Files: - - - Clear All + + Mapping Settings - + + + Clear All + Изчистване на всичко + + + Output Mappings @@ -5305,22 +5481,28 @@ Apply settings and continue? DlgPrefControllers - + + %1 is a virtual controller that allows to use e.g. the 'MIDI for light' mapping.<br/>You need to restart Mixxx in order to enable it.<br/><b>Note:</b> mappings meant for physical controllers can cause issues and even render the Mixxx GUI unresponsive when being loaded to %1. + text enclosed in <b> is bold, <br/> is a linebreak %1 is the placehodler for 'MIDI Through Port' + + + + Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the %1. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx. - + Mixxx DJ Hardware Guide - + MIDI Mapping File Format - + MIDI Scripting with Javascript @@ -5343,17 +5525,22 @@ Apply settings and continue? - + + Enable MIDI Through Port + + + + Mappings - + Open User Mapping Folder - + Resources @@ -5363,7 +5550,7 @@ Apply settings and continue? - + You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. @@ -5373,7 +5560,7 @@ Apply settings and continue? Skin - + Кожа @@ -5445,6 +5632,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5586,7 +5783,7 @@ Apply settings and continue? 10% - + 10% @@ -5601,12 +5798,12 @@ Apply settings and continue? 50% - + 50% 90% - + 90% @@ -5662,7 +5859,7 @@ CUP mode: Remaining - + Остава @@ -5901,124 +6098,134 @@ You can always drag-and-drop tracks on screen to clone a deck. - - + + Effect Chain Presets - + Drag and drop to rearrange lists and copy chains between lists. Create and edit chain presets in the effect units in the main window. Please refer the manual for further details. - + Chain presets from these lists will be selectable in the given order in the main window and from controllers (depending on the controller mapping). - + Effects in this chain preset: - + effect 1 name - + effect 2 name - + effect 3 name - + Import - + Rename Преименуване - + Export Изнасяне - + Delete Изтриване - + Quick Effect Chain Presets - - + + Visible Effects - + Drag and drop to rearrange lists and show or hide effects. - + Hidden Effects - + + ❯ + + + + + ❮ + + + + Effect load behavior - + Keep metaknob position - + Reset metaknob to effect default - + Effect Info - + Version: - + Description: - + Author: - + Name: - + Type: @@ -6026,62 +6233,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Информация - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -6094,193 +6301,208 @@ You can always drag-and-drop tracks on screen to clone a deck. - + When key detection is enabled, Mixxx detects the musical key of your tracks and allows you to pitch adjust them for harmonic mixing. - + Enable Key Detection - + Choose Analyzer Избери Анализатор - + Choose between different algorithms to detect keys. - + Analyzer Settings Настройки на Анализатор - + Enable Fast Analysis (For slow computers, may be less accurate) - + Re-analyze keys when settings change or 3rd-party keys are present - + + Exclude rhythmic channel when analysing stem file + + + + + Disabled + + + + + Enforced + + + + Key Notation - + Lancelot - + Lancelot/Traditional - + OpenKey - + OpenKey/Traditional - + Traditional - + Custom - + A - + Bb - + B - + C - + Db - + D - + Eb - + E - + F - + F# - + G - + Ab - + Am - + Bbm - + Bm - + Cm - + C#m - + Dm - + Ebm - + Em - + Fm - + F#m - + Gm - + G#m @@ -6288,72 +6510,72 @@ and allows you to pitch adjust them for harmonic mixing. DlgPrefLibrary - + See the manual for details - + Music Directory Added - + Музикалната папка е добавена - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Вие сте добавили една или повече папки с музика. Файловете в тези папки няма да са налични докато не сканирате повторно вашата библиотека. Желаете ли да сканирате повторно сега? - + Scan Сканиране - + Item is not a directory or directory is missing - + Choose a music directory - + Confirm Directory Removal - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Hide Tracks - + Delete Track Metadata - + Leave Tracks Unchanged - + Relink music directory to new location - + Select Library Font @@ -6404,7 +6626,7 @@ and allows you to pitch adjust them for harmonic mixing. Audio File Formats - + Аудио формати @@ -6715,22 +6937,22 @@ and allows you to pitch adjust them for harmonic mixing. - + Only allow EQ knobs to control EQ-specific effects - + Uncheck to allow any effect to be loaded into the EQ knobs. - + Use the same EQ filter for all decks - + Uncheck to allow different decks to use different EQ effects. @@ -6740,17 +6962,17 @@ and allows you to pitch adjust them for harmonic mixing. - + Quick Effect - + Bypass EQ effect processing - + When checked, EQs are not processed, improving performance on slower computers. @@ -6775,39 +6997,44 @@ and allows you to pitch adjust them for harmonic mixing. - + + Reset stem controls on track load + + + + Equalizer frequency Shelves - + High EQ - - + + 16 Hz - + 16 Hz - - + + 20.05 kHz - + 20.05 kHz - + Low EQ - + Main EQ - + Reset Parameter @@ -6846,12 +7073,12 @@ and allows you to pitch adjust them for harmonic mixing. High - + Високо None - + Без @@ -7115,7 +7342,7 @@ and allows you to pitch adjust them for harmonic mixing. DlgPrefReplayGain - + %1 LUFS (adjust by %2 dB) @@ -7228,173 +7455,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Включено - + Stereo Стерео - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms - + %1 ms - + Configuration error Грешка в настройките @@ -7412,133 +7638,133 @@ The loudness target is approximate and assumes track pregain and main output lev API на звука - + Sample Rate Честота на дискретизация - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Изход - + Input Вход - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices - + Проверка за устройства @@ -7570,12 +7796,12 @@ The loudness target is approximate and assumes track pregain and main output lev Input - + Вход Vinyl Configuration - + Настройки на плочите @@ -7635,7 +7861,7 @@ The loudness target is approximate and assumes track pregain and main output lev Signal Quality - + Качество на сигнала @@ -7645,7 +7871,7 @@ The loudness target is approximate and assumes track pregain and main output lev Powered by xwax - + с помощта на xwax @@ -7691,17 +7917,28 @@ The loudness target is approximate and assumes track pregain and main output lev - + + 1/3 of waveform viewer + options for "Text height limit" + + + + + Entire waveform viewer + + + + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7714,245 +7951,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Ниско - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High - + Високо - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - - Time until next marker + + Preferred font size - - Placement + + Text height limit + + + + + Time until next marker - - Font size + + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % - + % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -7960,47 +8208,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Звуков хардуер - + Controllers - + Library Библиотека - + Interface Интерфейс - + Waveforms - + Mixer - + Смесител - + Auto DJ Авто-DJ (Автодиджей) - + Decks - + Colors @@ -8008,7 +8256,7 @@ Select from different types of displays for the waveform, which differ primarily &Help Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - + Помо&щ @@ -8035,47 +8283,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Ефекти - + Recording - + Записване - + Beat Detection - + Key Detection - + Normalization Нормализация - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Контрол с грамофони - + Live Broadcasting Живо излъчване - + Modplug Decoder @@ -8090,7 +8338,7 @@ Select from different types of displays for the waveform, which differ primarily 1 - + 1 @@ -8108,22 +8356,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Начало на записа - + Recording to file: - + Stop Recording Спиране на записа - + %1 MiB written in %2 @@ -8178,27 +8426,27 @@ Select from different types of displays for the waveform, which differ primarily - + Selecting database rows... - + No colors changed! - + No cues matched the specified criteria. - + Confirm Color Replacement - + The colors of %1 cues in %2 tracks will be replaced. This change cannot be undone! Are you sure? @@ -8250,7 +8498,7 @@ Select from different types of displays for the waveform, which differ primarily Изпълнител - + Fetching track data from the MusicBrainz database @@ -8327,72 +8575,67 @@ Select from different types of displays for the waveform, which differ primarily - + Original tags - + Metadata applied - + %1 - - Could not find this track in the MusicBrainz database. - - - - + Suggested tags - + The results are ready to be applied - + Can't connect to %1: %2 - + Looking for cover art - + Cover art found, receiving image. - + Cover Art is not available for selected metadata - + Metadata & Cover Art applied - + Selected cover art applied - + Cover Art File Already Exists - + File: %1 Folder: %2 Override existing file? @@ -8428,7 +8671,7 @@ This can not be undone! Track Editor - + Редактор на песни @@ -8436,102 +8679,102 @@ This can not be undone! - + Filetype: - + BPM: - + Темпо: - + Location: - + Bitrate: - + Comments - + BPM Уд/мин (BPM) - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Пътека/писта/запис № - + Album Artist Изпълнител - + Composer Композитор - + Title Заглавие - + Grouping Групировка - + Key Ключ - + Year Година - + Artist Изпълнител - + Album Албум - + Genre Жанр @@ -8541,179 +8784,179 @@ This can not be undone! - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: Продължителност: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser - + Samplerate: - + Track BPM: - + Темпо на песента: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Щракнете в такт - + Hint: Use the Library Analyze view to run BPM detection. Щракнете на "Анализ", за да активирате засичане на темпо. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Прилагане - + &Cancel &Отказ - + (no color) @@ -8781,12 +9024,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Re-Import Metadata from files - + Color @@ -8870,7 +9113,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9049,7 +9292,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EffectParameterSlotBase - + No effect loaded. @@ -9072,27 +9315,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9236,54 +9479,86 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes - + iTunes - + Select your iTunes library Изберете вашата библиотека на iTunes - + (loading) iTunes iTunes (зареждане) - + Use Default Library Използване на стандартната библиотека - + Choose Library... Избор на библиотека... - + Error Loading iTunes Library Грешка при зареждане библиотеката на iTunes - + There was an error loading your iTunes library. Check the logs for details. + + LegacyControllerColorSetting + + + Change color + + + + + Choose a new color + + + + + LegacyControllerFileSetting + + + Browse... + + + + + + No file selected + + + + + Select a file + + + LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9294,57 +9569,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9352,62 +9627,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9417,22 +9692,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Внасяне на списък за изпълнение - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Списъци за изпълнение (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9479,32 +9754,27 @@ Do you really want to overwrite it? MidiController - - MIDI Controller + + MixxxControl(s) not found - - MixxxControl(s) not found - - - - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9564,18 +9834,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9587,208 +9857,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Аудио устройството е заето. - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Опитайте отново</b> след като затворите другото приложение и включите аудио устройството - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Повторно</b> конфигуриране на настройките на Mixxx за аудио устройството. - - + + Get <b>Help</b> from the Mixxx Wiki. Получете <b>Помощ</b> от Уики-то на Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Изход</b> от Mixxx. - + Retry Отново - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Пренастройване - + Help Помощ - - + + Exit Изход - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue Продължаване - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + Потвърждане на излизането - + A deck is currently playing. Exit Mixxx? В момента свири дек. Изход от Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -9804,52 +10115,169 @@ Do you want to select an input device? PlaylistFeature - + Lock Заключване - - + + Playlists Списъци с песни - + Shuffle Playlist - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Отключване - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Създаване на нов списък с песни + + PredefinedColorPaletes + + + Mixxx Hotcue Colors + + + + + PredefinedColorPalettes + + + Serato DJ Track Metadata Hotcue Colors + + + + + Serato DJ Pro Hotcue Colors + + + + + Rekordbox COLD1 Hotcue Colors + + + + + Rekordbox COLD2 Hotcue Colors + + + + + Rekordbox COLORFUL Hotcue Colors + + + + + Mixxx Track Colors + + + + + Rekordbox Track Colors + + + + + Serato DJ Pro Track Colors + + + + + Traktor Pro Track Colors + + + + + VirtualDJ Track Colors + + + + + Mixxx Key Colors + + + + + Traktor Key Colors + + + + + Mixed In Key - Key Colors + + + + + Protanopia / Protanomaly Key Colors + + + + + Deuteranopia / Deuteranomaly Key Colors + + + + + Tritanopia / Tritanomaly Key Colors + + + QMessageBox @@ -10091,7 +10519,7 @@ Do you want to scan your library for cover files now? Encoder - + Кодек @@ -10199,8 +10627,8 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx - + Feedback @@ -10249,8 +10677,8 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx - + Triplets @@ -10317,8 +10745,8 @@ Default: flat top - + Depth @@ -10382,13 +10810,13 @@ With width at zero, this allows for manually sweeping over the entire delay rang - + Intensity of the effect - + Divide rounded 1/2 beats of the Period parameter by 3. @@ -10409,40 +10837,55 @@ With width at zero, this allows for manually sweeping over the entire delay rang - + Metronome - + + The Mixxx Team + + + + Adds a metronome click sound to the stream - + BPM Уд/мин (BPM) - + Set the beats per minute value of the click sound - + Sync Синхронизация - + Synchronizes the BPM with the track if it can be retrieved + + + Gain + + + + + Set the gain of metronome click sound + + - + Period @@ -10539,15 +10982,15 @@ Higher values result in less attenuation of high frequencies. - - + + Low - + Ниско - + Gain for Low Filter @@ -10599,7 +11042,7 @@ Higher values result in less attenuation of high frequencies. High - + Високо @@ -10674,7 +11117,7 @@ Higher values result in less attenuation of high frequencies. - + Gain for Low Filter (neutral at 1.0) @@ -10684,60 +11127,60 @@ Higher values result in less attenuation of high frequencies. - + Phaser - + Stereo - + Стерео - + Stages - + Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - + Period of the LFO (low frequency oscillator) 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Controls how much of the output signal is looped - - + + Range - + Controls the frequency range across which the notches sweep. - + Number of stages - + Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others @@ -10779,7 +11222,7 @@ Higher values result in less attenuation of high frequencies. Ctrl+Shift+O - + Ctrl+Shift+O @@ -10890,12 +11333,12 @@ Higher values result in less attenuation of high frequencies. - + This stream is online for testing purposes! - + Live Mix @@ -11208,7 +11651,7 @@ Fully right: end of the effect period - + MP3 encoding is not supported. Lame could not be initialized @@ -11230,7 +11673,7 @@ Fully right: end of the effect period - + Deck %1 Дек %1 @@ -11270,52 +11713,52 @@ Fully right: end of the effect period - + Pitch Shift - + Raises or lowers the original pitch of a sound. - + Pitch - + The pitch shift applied to the sound. - + The range of the Pitch knob (0 - 2 octaves). - + Semitones - + Change the pitch in semitone steps instead of continuously. - + Formant - + Preserve the resonant frequencies (formants) of the human vocal tract and other instruments. Hint: compensates "chipmunk" or "growling" voices @@ -11363,7 +11806,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Чисто преминаване на сигнала @@ -11394,170 +11837,170 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 - - + + Compressor - + Auto Makeup Gain - + Makeup - + The Auto Makeup button enables automatic gain adjustment to keep the input signal and the processed output signal as close as possible in perceived loudness - + Off - + On - + Threshold (dBFS) - + Threshold - + The Threshold knob adjusts the level above which the compressor starts attenuating the input signal - + Ratio (:1) - + Ratio - + The Ratio knob determines how much the signal is attenuated above the chosen threshold. For a ratio of 4:1, one dB remains for every four dB of input signal above the threshold. At a ratio of 1:1 no compression is happening, as the input is exactly the output. - + Knee (dBFS) - + Knee - + The Knee knob is used to achieve a rounder compression curve - + Attack (ms) - + Attack - + The Attack knob sets the time that determines how fast the compression will set in once the signal exceeds the threshold - + Release (ms) - + Release - + The Release knob sets the time that determines how fast the compressor will recover from the gain reduction once the signal falls under the threshold. Depending on the input signal, short release times may introduce a 'pumping' effect and/or distortion. - - + + Level - + The Level knob adjusts the level of the output signal after the compression was applied - + various - + built-in - + missing - + Distribute stereo channels into mono channels processed in parallel. - + Warning! - + Processing stereo signal as mono channel may result in pitch and tone imperfection, and this is mono-incompatible, due to third party limitations. - + Dual threading mode is incompatible with mono main mix. - + Dual threading mode is only available with RubberBand. @@ -11567,42 +12010,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11660,54 +12103,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Списъци с песни - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -11715,10 +12158,10 @@ may introduce a 'pumping' effect and/or distortion. RhythmboxFeature - - + + Rhythmbox - + Rythmbox @@ -11762,34 +12205,34 @@ may introduce a 'pumping' effect and/or distortion. SeratoFeature - - - + + + Serato - + Reads the following from the Serato Music directory and removable devices: - + Tracks - + Crates - + Колекции - + Check for Serato databases (refresh) - + (loading) Serato @@ -11797,64 +12240,64 @@ may introduce a 'pumping' effect and/or distortion. SetlogFeature - + Join with previous (below) - + Mark all tracks played - + Finish current and start new - + Lock all child playlists - + Unlock all child playlists - + Delete all unlocked child playlists - + History - + Unlock - + Отключване - + Lock - + Заключване - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12121,7 +12564,7 @@ may introduce a 'pumping' effect and/or distortion. Max - + от @@ -12147,12 +12590,27 @@ may introduce a 'pumping' effect and/or distortion. - - Identifying track through Acoustid + + Reading track for fingerprinting failed. + + + + + Identifying track through AcoustID + + + + + Could not identify track through AcoustID. + + + + + Could not find this track in the MusicBrainz database. - + Retrieving metadata from MusicBrainz @@ -12210,656 +12668,656 @@ may introduce a 'pumping' effect and/or distortion. - + Use the mouse to scratch, spin-back or throw tracks. - + Waveform Display - + Shows the loaded track's waveform near the playback position. - + Drag with mouse to make temporary pitch adjustments. - + Scroll to change the waveform zoom level. - + Waveform Zoom Out - + Waveform Zoom In - + Waveform Zoom - - + + Spinning Vinyl - + Rotates during playback and shows the position of a track. - + Right click to show cover art of loaded track. - + Gain - + Adjusts the pre-fader gain of the track (to avoid clipping). - + (too loud for the hardware and is being distorted). - + Indicates when the signal on the channel is clipping, - + Channel Volume Meter - + Shows the current channel volume. - + Microphone Volume Meter - + Shows the current microphone volume. - + Auxiliary Volume Meter - + Shows the current auxiliary volume. - + Auxiliary Peak Indicator - + Indicates when the signal on the auxiliary is clipping, - + Volume Control - + Adjusts the volume of the selected channel. - + Booth Gain - + Adjusts the booth output gain. - + Crossfader - + Кросфейдър - + Balance - + Headphone Volume - + Adjusts the headphone output volume. - + Headphone Gain - + Adjusts the headphone output gain. - + Headphone Mix - + Headphone Split Cue - + Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - + Microphone - + Микрофон - + Show/hide the Microphone section. - + Sampler - + Show/hide the Sampler section. - + Vinyl Control - + Контрол с грамофони - + Show/hide the Vinyl Control section. - + Preview Deck - + Show/hide the Preview deck. - - - + + + Cover Art Обложка - + Show/hide Cover Art. - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Show Library - + Show or hide the track library. - + Show Effects - + Show or hide the effects. - + Toggle Mixer - + Show or hide the mixer. - + Show/hide volume meters for channels and main output. - + Microphone Volume - + Adjusts the microphone volume. - + Microphone Gain - + Adjusts the pre-fader microphone gain. - + Auxiliary Gain - + Adjusts the pre-fader auxiliary gain. - + Microphone Talk-Over - + Hold-to-talk or short click for latching to - + Microphone Talkover Mode - + Off: Do not reduce music volume - + Manual: Reduce music volume by a fixed amount set by the Strength knob. - + Behavior depends on Microphone Talkover Mode: - + Off: Does nothing - + Change the step-size in the Preferences -> Decks menu. - + Low EQ - + Adjusts the gain of the low EQ filter. - + Mid EQ - + Adjusts the gain of the mid EQ filter. - + High EQ - + Adjusts the gain of the high EQ filter. - + Hold-to-kill or short click for latching. - + High EQ Kill - + Holds the gain of the high EQ to zero while active. - + Mid EQ Kill - + Holds the gain of the mid EQ to zero while active. - + Low EQ Kill - + Holds the gain of the low EQ to zero while active. - + Displays the tempo of the loaded track in BPM (beats per minute). - + Tempo - + Key The musical key of a track - + Ключ - + BPM Tap - + When tapped repeatedly, adjusts the BPM to match the tapped BPM. - + Adjust BPM Down - + When tapped, adjusts the average BPM down by a small amount. - + Adjust BPM Up - + When tapped, adjusts the average BPM up by a small amount. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -12869,1092 +13327,1165 @@ may introduce a 'pumping' effect and/or distortion. - + + Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. + + + + Big Spinny/Cover Art - + Show a big version of the Spinny or track cover art if enabled. - + Main Output Peak Indicator - + Indicates when the signal on the main output is clipping, - + Main Output L Peak Indicator - + Indicates when the left signal on the main output is clipping, - + Main Output R Peak Indicator - + Indicates when the right signal on the main output is clipping, - + Main Channel L Volume Meter - + Shows the current volume for the left channel of the main output. - + Shows the current volume for the right channel of the main output. - - + + Main Output Gain - - + + Adjusts the main output gain. - + Determines the main output by fading between the left and right channels. - + Adjusts the left/right channel balance on the main output. - + Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Show/hide Cover Art of the selected track in the library. - + Show/hide the scrolling waveforms - + Show/hide the beatgrid controls section - + + Show/hide the stem mixing controls section + + + + Hide all skin sections except the decks to have more screen space for the track library. - + Volume Meters - + mix microphone input into the main output. - + Auto: Automatically reduce music volume when microphone volume rises above threshold. - - + + Adjust the amount the music volume is reduced with the Strength knob. - + Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + If keylock is disabled, pitch is also affected. - + Speed Up - + Raises the track playback speed (tempo). - + Raises playback speed in small steps. - + Slow Down - + Lowers the track playback speed (tempo). - + Lowers playback speed in small steps. - + Speed Up Temporarily (Nudge) - + Holds playback speed higher while active (tempo). - + Holds playback speed higher (small amount) while active. - + Slow Down Temporarily (Nudge) - + Holds playback speed lower while active (tempo). - + Holds playback speed lower (small amount) while active. - + When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Tempo Tap - + Rate Tap and BPM Tap - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + + Hint: Change the default cue mode in Preferences -> Decks. + + + + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. + + + + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + + Stem Label + + + + + Name of the stem stored in the stem file + + + + + Text is displayed in the stem color stored in the stem file + + + + + this stem color is also used for the waveform of this stem + + + + + Stem Mute + + + + + Toggle the stem mute/unmuted + + + + + Stem Volume Knob + + + + + Adjusts the volume of the stem + + + + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Запазване на банка с фрази - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Зареждане на банка с фрази - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear Изчисти - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next - + Следваща - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous - + Предишна - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. - + Channel Peak Indicator @@ -13974,143 +14505,143 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Right click hotcues to edit their labels and colors. - + Right click anywhere else to show the time at that point. - + Channel L Peak Indicator - + Indicates when the left signal on the channel is clipping, - + Channel R Peak Indicator - + Indicates when the right signal on the channel is clipping, - + Channel L Volume Meter - + Shows the current channel volume for the left channel. - + Channel R Volume Meter - + Shows the current channel volume for the right channel. - + Microphone Peak Indicator - + Indicates when the signal on the microphone is clipping, - + Sampler Volume Meter - + Shows the current sampler volume. - + Sampler Peak Indicator - + Indicates when the signal on the sampler is clipping, - + Preview Deck Volume Meter - + Shows the current Preview Deck volume. - + Preview Deck Peak Indicator - + Indicates when the signal on the Preview Deck is clipping, - + Maximize Library - + Microphone Talkover Ducking Strength - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14125,215 +14656,225 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Main Channel R Volume Meter - + (while stopped) - + Cue - + Headphone - + Mute Заглушаване - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix Запиши микс - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator - + If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). @@ -14343,289 +14884,284 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Change the crossfader curve in Preferences -> Crossfader - + Crossfader Orientation - + Set the channel's crossfader orientation. - + Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - + Activate Vinyl Control from the Menu -> Options. - + Displays the current musical key of the loaded track after pitch shifting. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - - Hint: Change the default cue mode in Preferences -> Interface. - - - - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album Албум - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -14633,12 +15169,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -14646,33 +15182,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - Overwrite Existing File? + + Replace Existing File? - - "%1" already exists, overwrite? + + "%1" already exists, replace? - - &Overwrite + + &Replace - - Over&write All + + Apply to all files @@ -14681,12 +15217,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - - Skip &All - - - - + Export Error @@ -14694,7 +15225,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportWizard - + Export Track Files To @@ -14702,23 +15233,23 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportWorker - - + + Export process was canceled - + Error removing file %1: %2. Stopping. - + Error exporting track %1 to %2: %3. Stopping. - + Error exporting tracks @@ -14726,23 +15257,23 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TraktorFeature - - + + Traktor Traktor - + (loading) Traktor Traktor (зареждане) - + Error Loading Traktor Library Грешка при зареждане библиотеката на Traktor - + There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. Грешка при зареждането на Traktor библиотеката. Някои от вашите Traktor песни или плейлисти може да не са заредени. @@ -14858,47 +15389,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -14921,7 +15452,7 @@ This can not be undone! - + Save snapshot @@ -15022,407 +15553,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... + + + + + Search for tracks in the current library view - - Export the library to the Engine Prime format + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library - + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist - + Създаване на нов списък с песни - + Ctrl+n - + Create New &Crate - + Create a new crate - + Създаване на нова колекция - + Ctrl+Shift+N - - + + &View &Изглед - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen &На цял екран - + Display Mixxx using the full screen Показване на Mixxx на цял екран - + &Options &Опции - + &Vinyl Control &Контрол с грамофони - + Use timecoded vinyls on external turntables to control Mixxx Ползване на грамофонни плочи с код за контролиране на Mixxx - + Enable Vinyl Control &%1 - + &Record Mix &Записване на микс - + Record your mix to a file Записва Вашия микс във файл - + Ctrl+R - + Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server Излъчвайте миксовете чрез shoutcast или icecast сървър - + Ctrl+L - + Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences - + Нас&тройки - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help Помо&щ - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Поддръжка от общността - + Get help with Mixxx - + &User Manual Н&аръчник на потребителя - + Read the Mixxx user manual. Прочетете наръчника за потребителя на Mixxx. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application - + Help translate this application into your language. Помогнете на превода на този софтуер на Вашия език. - + &About - + &За - + About the application Относно приложението @@ -15430,25 +15992,25 @@ This can not be undone! WOverview - + Passthrough Чисто преминаване на сигнала - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15457,25 +16019,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - - - - + Search noun - + Clear input @@ -15486,169 +16036,163 @@ This can not be undone! Търсене... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history - - - - - Esc + + in search history - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Ключ - + harmonic with %1 - + BPM Уд/мин (BPM) - + between %1 and %2 - + Artist Изпълнител - + Album Artist Изпълнител - + Composer Композитор - + Title Заглавие - + Album Албум - + Grouping Групировка - + Year Година - + Genre Жанр - + Directory - + &Search selected @@ -15656,594 +16200,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Дек - + Sampler - + Add to Playlist Добавяне към списък с песни - + Crates - + Колекции - + Metadata - + Update external collections - + Cover Art - + Обложка - + Adjust BPM - + Select Color - - + + Analyze - + Анализиране - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Добавяне към Авто DJ опашка (край) - + Add to Auto DJ Queue (top) Добавяне към Авто DJ опашка (начало) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Премахване - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Оценка - + Cue Point - + + Hotcues - + Intro - + Outro - + Key Ключ - + ReplayGain - + Waveform - + Comment Коментар - + All Всички - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Дек %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Създаване на нов списък с песни - + Enter name for new playlist: Въведете име за нов списък с песни - + New Playlist Нов списък с песни - - - + + + Playlist Creation Failed Създаването на списъка за изпъленине се провали - + A playlist by that name already exists. Вече съществува списък с песни с това име - + A playlist cannot have a blank name. Списъка с песни не може да бъде без име. - + An unknown error occurred while creating playlist: По време на създаването на списъка за изпълнение възникна неизвестна грешка: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Отказ - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Затваряне - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + + Don't show again during this session + + + + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16256,40 +16831,78 @@ This can not be undone! + + WTrackStemMenu + + + Load for stem mixing + + + + + Load pre-mixed stereo track + + + + + Load the "%1" stem + + + + + Load multiple stem into a stereo deck + + + + + Select stems to load + + + + + Release "CTRL" to load the current selection + + + + + Use "CTRL" to select multiple stems + + + WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16297,60 +16910,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Показване или скриване на колони. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Изберете папка за музикалната библиотека - + controllers - + Cannot open database Не може да се отвори базата данни - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16364,67 +16982,78 @@ Mixxx се нуждае от QT с поддръжка за SQLite. Молже п mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Разглеждане - + Export directory - + Database version - + Export Изнасяне - + Cancel Отказ - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16443,30 +17072,35 @@ Mixxx се нуждае от QT с поддръжка за SQLite. Молже п - mixxx::LibraryExporter + mixxx::EnginePrimeExportJob - - Export Completed + + Failed to export track %1 - %2: +%3 + %1 is the artist %2 is the title and %3 is the original error message + + + mixxx::LibraryExporter - Exported %1 track(s) and %2 crate(s). + Export Completed - - Export Failed + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - Export failed: %1 + Export Failed - Exporting to Engine Prime... + Exporting to Engine DJ... @@ -16478,69 +17112,6 @@ Mixxx се нуждае от QT с поддръжка за SQLite. Молже п - - mixxx::hid::DeviceCategory - - - HID Interface %1: - - - - - Generic HID Pointer - - - - - Generic HID Mouse - - - - - Generic HID Joystick - - - - - Generic HID Game Pad - - - - - Generic HID Keyboard - - - - - Generic HID Keypad - - - - - Generic HID Multi-axis Controller - - - - - Unknown HID Desktop Device: - - - - - Apple HID Infrared Control - - - - - Unknown Apple HID Device: - - - - - Unknown HID Device: - - - mixxx::network::WebTask diff --git a/res/translations/mixxx_ca.qm b/res/translations/mixxx_ca.qm index f42c9b55cc837a4fc9ca3905ed6ed01fb437e8b4..830d10f2d34d0aef2b8a1e444ca5354ef17c4c29 100644 GIT binary patch delta 29265 zcmX7wcU(>XAIIP4GtNDC%HEkFl$kACMrE%eWUqW}8C_IlWrZ>#GplSek}ac*WM`C3 zwx5~btJ5DI&vUMO@A-`Pet&L{?iRhjyV%ka_8zl{r~*;RhoBQFHwWls_21|5b1kqY zu?H1FT=(_S$sO{8wTb#|1nUy{Z37z+_1_P+AU5zP*pit4Q?M1WLG!`Z#D)ZdZNRT! zTe7oZzj5I~Z1`rd3-L!)iP&u7#e<1>TRdQ*PPX%Zpg$fo4IDzO=5jCs51dOR#^XU{ z!3o5-t^}tLkNynK#OocvIT(Nj2ID#9!Ns`m53aXkBxYP}0ylztz{}u%Vna)UC&BUH zHGB{w7mq*;*uaSw!^{jx#J#E!RmKcw{K?~e47Bo8Vl(l2wZ_CNeE@xln=sf~HoT4% ztcyYPJp|gZto@4M!U;1f3Rb~=8!#02&57J{XF39$OKewntZ?r8juJHiYs~}k;9dK$ zqTNWzcml4+%=UthNO_3?cz6+&UZ2O>#qv1*j85*nj>wKT@aR$c3vzlXa6FdqKX3~% zYepV}vWVJMCuKTj4$9zeVD1vu2Jyh*oz@k#c1)IE>fA+ z>*evs37tGClf?Heq`d!2(sYu@cL_n>f|$y=oAidB zHGHsbCsMMC>tyL~Nw&i>JE!Kc&t;w5eT7a@eE>;MEa|Hto#Ntl@GH^lb2`PvyCi#J zLZ*>I45lOss^;z2TOEAhv(NQMU!i*8La zDu}3tqfQox2jQO2#Q@f|CjPP>$(S5coSbwrS3G1Bk+KG#+n!16Y+I7M29Q#17sw_f&ShKk=@c$jQEvluA~z=U&J{DpfilNO^aT zs?>$lrfRQhJ!kIWU)>sVbybcJZXD*RlLvW>D2!AvF!q zDZBioYLE$DqHrE7B~UeNjcnS7s-<2e*<%$|uhR!^2KryU^>dil8sw5(o7nnF4k6ij z6M58)foWb!9;+fqCjO7wIYYfl-OOXHo;q1#woYDRejcmL$YaZQd2HP#k8PrK%4sdB z{m@wAn_p0eYLF@Ww3qsY=u?|IxP=fuUm09W!nZATsE0k;TTrK*=RzF@`4c&I$z$&g zI+YwZoxJLC>M*)HEa`gcuwVfx)9z4*g!wQ~4%FdT1>%+t)Zro?d}t_nnzs-w>!i~z zW_Kqqh7SzwU83b&K2@{~G%j3So5Gj&}6DGqU^ zu1CX3IUY&f`a!=xrc$?|6G$$tMcqd3Aa=Sqb+?@%x?5f+w+ZTwnJb?QQTN~l#0r}7 z=<|qrjF5Oeih5qb1DBtqp08leA6%tgmu{1CbpvR}#r37syHq*M01UYe1JsLppG+kF z^d*VE|=5c%w^%)jHJgXo141@NJTSz`5qDjo?LO!DolH#1GlV_XAC-wlm z-&68AH?dS3H@=CL{CM+MLHW1M=ARoK88j z6!{K`Bih=8d?#d(Xf~L9=fNpe{78LOtVG{1>f8AM3|JlNJ7){=%m2Z@Aui}!mHN)b z#C@{J-tQ^){2ilyzabns?Wljt9mJdOqJdv>NUZ5XgZ$yU*L0^LzUN7qltV*c;i%+h z8geawM1FS~Rs&o2x*&~&kjX;>Y0QuVU?z=OcADhiyA%)_O{`0A3OL=Al!r0&Uo4^| zdpb?&5l*b)SUXMq3q#>Kl>!(3Az7VM;I5m*_Z*~YY52lwCun*}`01_=G;7XPn9_Kf zmE=sk1*ch;o{&0#|nKF@;WT2Pg2agY@#ahw7FrbUw&(uxjT&h>(W>2Q1;37@HSG`s`?lP_TI(vP5oxqd{KeJJ5hT?qAl zIyO9$c!er-d^bM-VGfeZEPTX27p+I6}$Y zqhNxIQu27HWx5w7uY&h-{yeJoiiNs4!r@JZL5&tDOq=$|Ws%@|6QNGVa2fXOXIC!h5`t)>$E79;h zlsUwa`0noXYS=mAZ(Gum%CNi>(AqS ziGAoqUngQE=TxF^%VS8Ceox;ruM!*GjQ-ck?oK@85&bH@ndF}1^e1;9TgK3zGufo< z|3!a2Fr%TJDCaXG*-KaG-yvj5-IpkIp*9IoK~Vy7i0_}GD32eK2%VttiP*xX)fHLA zMs%pGVz@&HT)QgTm~te_BrC=>2tsNFD&|9i=<{C1Y{!MTo=>qov5~m4N-5mqEU~J+ zl_K%U#5zt@iWOZ$aos@Q8x!Nv5UN=+?=m|rcW z*6WERE1Q)%Zz1(}7c2GdhLFStwGW~ zMrm@ynb@rJN|T2f#Lo9snmohSnWrgDTe^~1`%!6nDuR@+JC#;p5W)cu>`EI)cqfmu zO53K`%kK@8woeWa-QTaYeFi=#taKU&;d**P>9+SKiC2S^-n#-3zhx>u-ZhY@>{R;t z+#|WNhT>NUvT?AnGQc0<+|D`5z{kFb^*$>8HNufzhAaL^Qk1~2%Ahmdh$Vz6Lso~A z%xAYN!#%zbFZW6rz7e5S6K`e2{5hn|xUP&GUYn%HS7nTV7F4XKQ+aGt#yDYy-tCkz zp-8z}v{%MmR*0WCt4wb0LrO>|CD8d6Nx#cVV5lGQfhCpc8($+)jmo1fIgbO!>y-A{ zR%J$|?j(B+Qi6v3A*I=A#s0ezQTkwIRyWMV;H=DwhL6Z#%4|fqEQ2ed0}!h3ZmrBK z3oe`jcd9A7vS=pBS2|Ec=M9S}|AIIHo_z zqlyw!81`Q_zpljWzzVEdp=@5}NXosH%I=QXyFbsB-97LDzv{~F;Uh?CbVS)50B_hZ zR@uEGl~{ooW&czJ5^vfm2ePKa$!t;%PDLK5d{qurfH2Q1qa3NG!O3V~5I9*m0yX9B ziYtkYqe;2>QAza3K>i;nl=J5hqs1IlF6F;MatBkAV^WbqPgRmrCy_ijPD%c>hFFUU z%4H|yeg1LEl_QXTo4b3y2P>)DV7R<~E2&A>5&xf1uDe|!Ix}9Uh<~SCZ|q8J z;ZNlTt4Ol%FXhI>4@kitC^rrERxmHNkyY|I$wm2Sui1mh<%#lfZ8XU`JCx5^SemjElpjMNwPD?r zpRrJz2@cBdnrTSM6y?uhq)pX-GZv05y5hvxvm2P{6=v{3%Jw6K8P;w@7QC0)&K^U$ z?aT6=EJRA(TP*+7FT{E$u)-T)VYBPAV((K>ToKG(Vo5f!6V+MS0!Ro?MY0NsLonhp ztil;LQl|c7PJLPs?Mq;l;xV9G9a$xKKH4A5s(E!KCAxr4Hs}$nmTDncQDfCDw~1wq zX0E@oAj~6m%JQ9Ajq~sYZogU0<1k3RcUkS)ok&>6+F6~Kb&1y6m|GG?*!MT9H?$Cm zDo>dEqBbN8u4V3s)0In+tc5q0?sg1o^*EU1qIIlI{>{i2(pkGXw@Hp(#ya-c3KLyI zr$~6hI^J_7+3^hX3cp2k;UMc=70zozIi0-P5Y~CVk=QYNFVrHLk-JRlSM&&%A*w;wb8Vj$3ug z_6clFErpa3UTjU<&!lvo$TrL_NJ{e)Y~!Atux#zw#+-u0dNpTTB5{9oG}}4~Db<@2 zY+K=02r@Ub?M^UUGMjB*bq<+S4;DKGp_uV)9*ghFW2JU1cD0+Gl<#I1yU`i`{wmv< zoAIQc)ya!LWxMXdIh~rz_Bgdc?a`a<6Dx@}xv>2Y?xDhQL#Gm8VFx}W6ANg|j^qv? z_!v9dwj7*Vd3NkzB8m=v?0CWjc)jNAWEpIYVKPgs7D}Ss8J3uCM-29CF*|jn4~bJ} zbjl&^S<;_qqNdN;>DrL`N$1$Z{W+SMr&oGwd z!bx#l%Cg$Rf}X3wvQFMb)?A2XeMOYqeiM6988Kqc1on2hjrjA2?1K^U|9_3x$NG*W zUN|uO&(<(F=687^v;{WOG*snkc-S05=Yf~1{ zsJ-l0Y;iou#&Y6%5zn8>$qU)@$-`Xe0~*BT^-09m_;W*a0Evtu+;IIF$#Va=Ddh}_ zW9#hPbO*vzusJtj6SqYNk#u;*^HDZ3oYFks zBkXxZXI>!M8*28D7u^~_^4JDmvgBzJmCx{!F#}1I{KhMms6*@wGJC6(? zw)7mY`ZAFy*6zuxofpIxb>!9Czz3u{a@U6N|Aj{KnhI=p_9tGu1cYvOLtZyF4wbBE z-mvCfgigPC!`cW~Zj|H=QBr4TkMKr+?-T3e$eWI|ksQ#LH*)Dbk*I7>6Qrk{j<3wgK7e zTi#(2gs#X|-XVQCDaHD6?_50}GnIGhxq?`}mw7C8i}zUBo+$MW?^z8I)T@8I*RX$x z69n(ASH=Hw--&lfa6j(5^E2vy$C~kemFtp>JjVNb79er<0Uxv-dpkCo4_=AvHgW(T zS}_i$bq*i;A1dV6YV#3$84T1{KBn|OQVKleW18mDkx!_+ndt9yKA|%P{y!_9L{o@; z%i)uH3?@}eN1H8=(N|Ky^4Y6xP$AItfS6T!sh&f+r%z<-}A!DlWk zPC{$Q?Q3%*B8A(NpwIO>ar;YX!v+JNB|Z_`Sdh;u1{3SOpU=t(BzdGC56+!wkQ)z~ zpyhLa){xAqM{_IsOeE1E*eD^I@dz-v-!eCDzC;`50%+IZ}l0YouX`5rl# z25AAhKSPhtKfdl1R_1?~K4**PSF-t%Xfl9=mH z{<;i!Qsu8dxRdy|pTFrB2O)CgpNC@!`xeZje_j4L9ecQ2@UNZ95HC7|f8CF*Xpq3a zjpFkO;z$^^yQ4d(C3hl8Y@!$4G!q_nzmT9aohCM}U z9rIVluE?e`J&)xM`S|dMZwnyq4p$;qE&`rE2@YRG3QBmy$~g9 zbt6{qrYN}>0nO@0!f_p(&7qB=Of5+NfHI=oAFQy~2vNbOJJHgOqQcs9$o~ru78N~^ zNVIz{D%C|T*XyCEG@~`iDRo4p3pudSKZWxE7!>DYqUwnD=na(>Rp%g!E%HKC_xcHM zI89Xl?f||KHJ+uAG{=kDqp%WR!$iY|Sg}2UqG|UO5&@e;i);+2-z3rY;9oQ%(u8N3 z0?_|ZtMJa}i5l=|(K&QJ$qmy*kNH^ok!wZI0@&m4PNL@^IH5Z^qW6k|L{maUpTU?( zysz+`4!hvtC;EK~B4!K{e(&KWlV6LWt-?w4i5EkIVA}iK6GL}@Blhv87#^QP%F#42 zddgCwXVXN0%RT7-!gu07lPf90S&XCR$Y6rSc2ey zdK0#a$*`2%-CIn)*@sxS8Dh#_ygz(|m^%Iv@u(OvZLc3GJyY`7dybe<^ad>FZ(%PL zM(k~65n_X#IbT}LU1|@8FuWG?_iiC7Jur{89_!>KEqSc+H;=6<=CSpRJhn;GDW^RU zi{kx>ohmQF*;$m?hlr)Cjw5cECn69Du`1)m%2p_5KP)F!_k2!#d_xi0{siKM01;`& z1@GdkzaT?igV>)(}lx~o`sViH#9fliURR%|F>BgJMCF;n3k%Z(H< zNvQdF)Dv3*JE3TOTx^}c5-a#vY~4MNl=rR0wt6d&hF=r03(g`%OVX(f`=7Aqz94M< z^cUp3D;!uC720L0<*wa@CEn)L>bS= zCUz}>k%)T*GTgTS5vW|P1UeuE8wet9i0^5~g(F^w0HMe6Az(S&Uj!@Sen030J^>NY z?8O(auZ4o+aS;82*Z)BH_cyJ;x?rH#wFhdrajDo{eJin^iDLJze&{K?i9Jid66-Ng z#Q8NKx*Z_)|2L3mi9JvpXmK0KV+ozI>Thu%sW)1wjm6=1Taf{Q=dw{Onj?-{h7lik zK^)tY0ly!lQx1t0$4v(j6D|`cqfjr*r-_pXsu17MUL*y36aP6_oa+@$;%ECW=^jW9@I}FZa&mSUv z1xh*Z7l^w!N5D@E0&A0aMo5jbCa8_6Ii%)jg zjmin))0I0gKrZ6bGt~dtukPaWOYFt?PvVOKoG?s$n}Z_MoHgS6&O;<3n~49lg9V#< zQT$j~8V?+p$JR&l*tU@P-D4z)``biL&ro8E8;YELu#7=QNtS{LUTa9|l1a+1SyJS# zppT1`J7CZTG?enH9V0#76Blq6m!C-aSYqjrynrIXU8*k8#HziOMrk7+UPhYBS0}M~ zwlsS}W`=r8D`CZg=gR_tUr4#$MkgPj$fB#^B})bClx&GCi3$j{C@4#p##ZeQlV#f^ zkX#cho$MYnao`|XI)S|M7M(JvwRHN8Lc*%2vQp4s;`jc_>Z$EW4v&#FJ0i~C;3I4A zMTN6_FIi_xAq1(*rJLhxbjH1 zpKLZ5Uz~nkr#R;!o9)7bf0dNYWg1aAi)`K%QFHu!+5AKlvBOVf^N$`-%bv1@Ln`sX zPi2co$h_P-*k$WKIV3tBmTg0;60g%wwms`gV*Lc^Q8fy^{qnN??l&+{%Vft}&53v0 zD?2{H1FDRWo?YA!R?m{1W+=p7m6u(o!Mn)-og%BT?2&>MnD<@wT!ES1$tU~x!AU*5 zBz-!<89hsoKD%H)D%jV_ego=~QY}*sXtNug$-8oZhbJkX4RrE+)ARUyq)u6NpB!)? zh?Gs&r)GJ9oy(QMp0uh`VyM zBi#7H9dfiQXkR!&j$Vq0<=!ZN5IHp^oWzCqa#}L-{?3)4N!NH-a_*8}-~`HA|4Tp1x3Mh20PLM}pskhz_gi)wa6eSffAR1b#}o@B{I z&F2!0dnOmPJx^5pjZS6UYMrd$wmdG|q*F#Z%SE~82uf7dsf@d>lld-}i$=i^MUKcN z`u|TW$VDf@Ne1GLS0UX;pX=nA*>cfyjC`u6T(S=ZioQGL3JvO3Zk1f&l|wx1i(Ikg zD-IDnl@Zg=5__)7mF=)1pRdT3qaf6i*2&eja8hP#a`ox`L9Iwg0M6L^qCy{TDT;CE8T+&2t@It=fP)=_2fK&4bkz4G! z&ER+6Asmj?nb`v3!>OnU4J&{R0D-x}nrc=yqEKg^n z_j_8A=RQFCQ?AMLXkIJhvvu;IjXH(HS9#%cB8j%OXm$5SIKq3;7&GLCc$iS-E@?~*BRMa7tf-z-A~rDv#o*F2GU<4~DxiX&z(DL;DkKt54Geh)#QVjp{2=I{^_ zeSgZFa?wN|ykt(Uw0?BZDN=W;v~)1hkw8`P`$B9USJ@SWWS+ZKz6nWW)I^ogKcSOXzOPdTO;sx{M-C}_sTHF!k&7dAiiBv@sl);J|8uz5h@(-V z7PXT81xqEk-qs(Pg0|Eup)J5)MD)a#MjAslMEDO>e)GoTBWpnC4I;RMtl zo#K)~^}3J5 ziD(DaS1C+<=zZ09Ii&p3H?{A}WyA}QR{i$lXx-VTYX5lbZM^_>U}Oe5AZt{AoSLJ{ z4yu1Z28jZt)Ir1Nk@WAZ4ju{bwzRxDqz)=5HA|{P46n3eOZkxfTa&z zuSULiL;rA?8f8MQXsUge8lBs8?m0o-P&b6=N;P#;uQw>GIqKy7z0^&I{1C+ob$jPk z@Z(L@*b+G;iw{#{D}wbusmZy|^V#a|@{>hbo-)l%N5Ne+G95|@0W=6r!znrFKt^uF-QlFoi zM%?F!`XWAvWI!|ZmER2%EJmrXa@wO^Z&Y7*h(@;DOMN{C^*@&SNqrlFDED%H_3epr zu+dx8x98vmJCs!4KEO=(n$-6tGKpNftJwi*s1b*$*{?9OC9&#Mhl1|$U#x*&piuE*@t_I))guB7g0?y}I6@vxgI6IbQur>%Hk#yK#bH9oF z;fBF>&_>GZYX*l8k5Q1QX(+(_h!2Z56d#4H>D1FuY9$UG7ksKyE|_g7wW9ZncZyZ<7#_=Ul7a3aZseulC+iA4FQ=v0PP*C`wd8_EaILY1qaAva&3{vCDl zDs6SjpeF`rhv(?|{4zM-KTV3-+E6w3})X9xHSX=s$#I` zUMQo=8ESkPf|816sAt07HtJ}o-`)@B`t}+ctc^pR{*R$?jlO8HoHjI>6G%eMHZ&C- zNgO|Gx*;eMdFRoFsK?VWYjdnpxkoX z=&FXHL-*tSP^4k#(`1s|?qwL4+dvrQZkQh225M2#FmpKmWA#46%;R;5o^CS)<-<%$ zJT=TJ^%WJ&u7=sJH%ZjJYMA}iiD+Y(Vcu2r2UmI<7M3bQOguL%9FKtJV==?RBzFWZ z%?t~_W9hw|4T}aKdLG}^u;^kF~>7T^^_rws9S(SuqIYVw#tMmvmL{>yH+H$NRa@jeU;xI$x zZcHe?m0`_82<_&thV?ilC97zLjjjWUU7Bo&IgA0-FK>uB9S8k)T58zjavvtwX4nGZ z;{|USwx(hL=_L%?ZHZTF+CA&x@99ftTKXv=r{ zV~C%QMnmIwhQ0RJ#2!2|C zEzb@!oC=tLTyDQ1=~^9PvHpg$^I)U9k20J)pGH*dnNGRvz2V}@XyOp6{(hS$v4xh<&%5;alBONVPHy-(R2@b-It?e@h*Su`t7rzlbeUt%hF(4iX#X zWcU>~7nRazLykRn4|@(U{Hs}!_}QL@f4%%kcpTCQN3z&csnJ+eH0n0dlw;72)y*{C zU!ah8MnsmC;I;9Y8F3jaD}HB@&1zt?WK;Ed4FbY1eU#?T z3lsf2ptY!sEt`HrCo0xj+lMw1?JH^?&InZ0ZCbk)P{(t=47RAPDh#txH-oN$VKR z$Ey%29j<7;H{ysFd8+lTH;I%!J2b!VJxED^ru83rh7{irZBSK&`}Rt;v?1L;!bCpP zhUL!uZhvh=V`t)tyRyx~k1M1G_OgK%0>TXH(fnoAt*PZg+(?dk*y9p{_Ouhh6P_ zLkaytc$u|1aW{#dyr~7RYf0pLLJL(<({XFAg+@bv#Y`U zNGzzLEil2R2QJqZq{5EWe61}+W0Lh-tA*#5W(_;FC9{$7xD3{oP32g@3EFa;nwDcW zYRm7t!;qY)sxALfft2hhZDl7cd9Nqh%5iw(;|JR6m_elE4As^wfIcVJ(bm>SRQ#cd zwze4}nVG${wMhesmbTT_>JNOOMK`@iRPBoveG|f4*RI99cO|~%iMFXO;)*_7w5@01 zL%x60w%y4f7V4#K`(lTbwi4R*a5s{NifXYFU!%zMUE7h`)4VE{7CZ*uQ1_7*cag&zMr(VGCb(r^ZSUUqs2K-n`^{dcruEm3)`TTIeL+ij z)|L3xS6af`P2dpiSY^mg!4j$9(#srR|?^X6`jjtz!jZJNCBPP+(5fh7wY`sj&^0JJNf`pyK<`^@!tn@%DAT5 z)sYy`(Sh34WHhawEzs;&-ya}e!c)^(xq^0$A0YbGU#Ga&O1lmq2dtfvv%UrbV z1KA|jeb+t|$wWkSN&8AUDCak^YhOREC06^8_WfrN$&rJ!-+dxT%rR-d^*!yZ{n?E# zSUpAidmx3_g#$)bFA-(5az@?{QSyv`I)#xL`9w$J&k7ht?!Y?qG>W&rB)6v-csk}@!T6|%WSMD+94-Y}VzNxW56S(1? zg^UGSArSHUXDr$>ka)9W#*#;|6A{gfrS{s0eD)Yij|o5>aGlX{NIWsiAY<9L(2gI2 zj1>xFVE>IWR`~Q6(epB$yygO((!QXgvErPc#A;PBR$M*=<+V!2D$Oer&0K4AZeM{| z=`K3Cg&C`##|h>wuZ%S(Oe0ao)mZx>gm6%AWBq}Jp{BEq4IEM3?s(eRpp21(WreZf zxXq{+956OK7(%jXhOq^LSW$1du~pC)xarkKkMIQi{_nsGV|zSE9=vMoFv*eV?IxY# z(pqDOhlmZQ^e}o2gK73Hr&D=d$>?>*l|)=KW2gLBQm2K+&OP9?&QvvaadRgTGS=AZ zdzxlUNQ}QzoDBBSIzra-Ez>7IJvU=R; ze_{a6=bSPQdixyJ=@B}`X*c6AUwmPk2F7876jIhk8HY{&iR$=7SwAYgyyS+3+2;4j4y8_J&MdF^)E31>Su&jvl=oKX8}_+Hv6)r@z2!t=B1M zR4@jd&LJ^oopF43a9o&i!nineEE9|qYu&k^g^bXPlOG7khil zXvbMk-n^{Q4g;h7ykeZa%8adW&EugW#^9?q60ysT!M9LZy;IB>Vjqt{<5NCk2q?Ey zG|qd1NCq=saHIqAy48&fy-+T*I^^;5SmUCJu<@qH#&C(E)zi<$rJH^d4cly7dd`{T zx&Y%E=N6picW4t^QYIM7g@p4)+3K3Dps}J2t z{8!AFS~(ntOph6_7sENhD&EE$W5Y4y0>&HTP;y#(;a`qPE<8TPwpxMT(68&GjPDn1AwKvB`$_gmQ{?7mZtzYZe`9`exmI~*z0sSn2ANA?mWO*j6&hQJ}Jh4F7+EWO_- zW6sz~#PS6j|K0O|fl-bBo=Z|r4L4CEnC8RJOmqNSc4)mxvA{d-Tw-F!-AHljZ(=8K zAA8v({x_Z2eIJuH2tlh$b)9xLb&<)G?MbZO7?Y(sIw5;KP1b6D#HqX~-^(20{US`I z0`Y<5&8E`%j3hS>GnM`Xx4I$3RI#BX7WK?jxdq~cI!05qo&h+3P|W1w5rn9^r^)qb z4i2+yHMw5%MrPE}RHGfz{a*J?HR7NJ_LioaqenphOUyFWO&&~2nN}vZ-pjGHfjUJ} zX;VGzCMkcfnde>tH~o0 zNotKGQ#;X+=zT*|yIPY-YS&F26*!+Si%cE&p#%D(x~X#wJEXg1A5&K+RI&G$Gj**5 z>D>R;+Bq9c{l_A?tlrr)07U~){1;1w+@!%6F&kvbK-{ANeO?A`Qs@cT4wG_~yQ*$VOPn-G@w(?bi`EmCvJ-R~{?PG)3OpL=@s<*Dr+M zZc|hr#B8?Krl>Olb$weNi+9i|SNt(W-3vhD;f85Vc@&YZCz+ztA^kNxOwr##*B7P@ z>tR14QcN3LM3d-ZHEqlu4|X-h&?f}76~WKobW_aW^CWvWGHv=*6tZO>VcOakdssix zwB2VNiS0K{u_MrkEZ)YnV^lIJB|n>Xm6}Mb*)P+srca4>EHdqG3bkt6!4&@#XT9#N z(J3d7HSJBgO}t|((>~u>#Cz;E?c3WOg^f_t0e9qvFE5)8+`_>I&j+T1@rVb4-kFZp zYeCYU@XeHP^EB#t({%EE!*t59$EIUd?!n6$Ovl>=5~<(vXse#b0e5uDS%IcRA4qkw zqbc#)1cYMaO-Z*A8Eq?LI^8)}M#h@X)@eobWSQw)gJj~3t)@$>&l9(tF(pU3BLAse z+jRA3FcOOQrqps+y7LE2sm)HIR(soY!@L1$c9!YpG{km|+nUmxQb>F~VoFpeV#}wR z{tktZ4p?IPHv$jNNi+RBn?vl{XtQh?gUBh|td2<}v9hk&7&rvZ>Y3U274JJ7Xf~mS zM8UPpR&NOR)DGr?b2!O`rObtE*)ikQoy~<`yhrkQ)?B3MIZ{?lHW$m^jks~Lxx}3u z66KGZOQRq`SqPVlI0S#i&C4&E;b7Ync2QW~Y6Lq?r4eD`mov zz5Hi(84c|?|JUpi98T;=u-SEiJF$az%&tfA1BU{A&2{V#3*dL&W6TW%4h)%_nwuCN zlJa_t*}WIsqh>ZYf96iInJ~9ZM<#T&r%v8K&fF#j|9|+4x$V~=5`Hhu?dD`Qs>Eun; znZv5p#;;t;n-|u8Lc%-1yr?a_>Hj*I7p;d-?r<HYVI0`8o!rlTjc-smxvGHFc5yZ<6M9 zULi!`Ep+lDBg`?y;kG|_GROQ*Bw0J$ygB#&QXEdloaEoT8m{DgnXfW5K?}6Bd|H?ni#H^0YZI_kA1h znorfm-xipa-+bzJE5!d@!^~$U-XqpD(|n=%D5OfC%oi4F$ZDIIFPgBl9x>*NUssYS z{MmeYR|fHx5b-x&b6Tb#p|0NE?-8XM3njA?oYUXWqxde-oCAAevE#A za9n79ej$yNNej$xAJ4(*_e17)eO!s^7|kC(P9nbYi237Qlw4w^`O~jD=zJQ?pOf8* z`wlbz?14z?=yCJU-Pn?&HO#-dLb#V6x3GIM`uep8vEsEKEd$p|qvIE0k!5nk@x;1fdV8S&AHOj}lA=OVRoGnQhtD zmQuO*jrv*2)Ez;JL%OAG+u|hGyIabYK_c?MLzeQV;0tR# z7N@QGVF~+Lssw&T(s|fYjYXplNS11sb70Y4S*rcDkyy3X;(7&cnTK0kvyw^lUu3EE zOOWzszs0R$IJ{y9OT7;_h~lPN>gV34ywfR8thY2szm0n08B3EI-Xu0$w=^rAhB|;| zvA4{Pc5B31aw&_sSX$*2#-C((W@%Fx1N$@F(q`mA(n3OiRf1OS$dYl3C8CoEj~WjyJ?OVpQIS#TaSR7 zz_%9P9j<80y|efY_&`*nyG}Okw`D*Wg!5#8Wx$2=_)Qr2XeIJ~vt?kRPQ;YD7XJu8 zk`3+4E&g9|(crjch$EJIXG_bF&WR+#=UIk@>_<&E-ZK2jeVo^;WEnXdhQ(`xW$YZ- zZq~~(t{j5RN!2V9i=2R8A8VOZ1q1Q%v`p?6jo*|7TBb0_%!8?xDUMr-&UUd(8IA8L zRMs-Zevs(#Ys(aD3E3YNv;>}fO|0fqOW^YtC>Z)!rd@4GA|>83y)&f#WnWA1l@yYt zs#(HzXTwyl$z$CfmIe3yaLDYhPANWH7WRrmgjCQHKF<&5g8s9t%!hNn<>D->HsgI= zoODW;LzXoP2GaMGWzD19{J)x;Wo;t#a{M^Ux?ux|{8m&-+J#%rX1bD?^3igRLAc6T zbqc@9I&pl-a&h2Wc*!G{ZTk(v7+|?}Z#KGN4=gvAz(TssvfQeeOl-?1 z%k5*Zpmon%(rY1uia26P?|6k+t-Y2zGZE^29c{T=8v0LFLoN3vqM)!X%JS$8DjE)r zKzu>{P|M?g-;k|dvOIYVi#4a1B@=~28M_g5MMbojC95y?x@;@U^CjNI0}ohU7lV7P zdcpF>>nkkgEX%vK&ZM}VwR}=hEZVwJr&t(n`Lrn;ZvUR;v;7X7$^0pnUo|np!T-zS zgv*wHhtU-eOSH0ZgxytETiMQ@#8acJBEUw$kCdy`nU*;+OcGad2MT22il8Qsq6R1^_WrqNp2 z6IxRHowbS=^giLEwQAo3NG>;9UE>jy&iP=imD+`<^$cqr1HR||18coSg-~C7Z>=AJ z&~DdyyS08?ajbxYwIRx6BJ#AgNrOQ+(Qw|{^aMhuiviZweLj=)nFxLb6Toj^4v2%s zzOBFInTuB7~z&)OZ?u&6o7 z+Osph*Ir}yby!3YiEDeUBl0~ZQI1kR7<*cKeQ%D(J)fzDAC9!=C zt>foqkht{II(2mp&Ic5;PT%T+_(tTKoLwqCP_WO-wc*6S4ardsFr z$Pe%3XPtXwJ@JSy*7==_A`aMVT^w)|+H%vn_(UJ1+oP>ZeCLzg+`_u7c?OX+K&P~y zv#zdaBk|nP8fjlfYqRYqE7qSuE+6$=2AkmgwagtUIRVkl5YD zy4x8tG32Us_iW??GnZL+-&{bVQ&DT&tZKwU7FqW#`$tUeVolii4Y^z;>#`?&FYe95N%BgcEd^OmDY2Sg^8A=TCY4tr;_X)t*O0k!-hLp zuP?+_M3lDPX^lOVe%8B}Q0-ENTkoyOCb9gK^#PS7GTyLeoQ)%PyN>m-EraBs?bfGd zD?rUwS)Z=E2VqXIKHcVw?6;jYGa0h*YKQg3kcp_Q=C{83caD_E_0}()PLn9z%lg$m zWeSSOKdoQ00!eAz+xjgB4a7F?*6;Zd$z)Zr{vH)f%FQtAKO@5Jb?bC8|A{uL=tpwW zT^kOV5u<3EYTk;ZG|5&Z6^82kNn4rxD~PXeWGh<`ve4qWt?cm~Xl&%Ol^>4(KR(0e z)PE4Mf$ePe%9BeI#jLSaad=Jg=r>!HlZZ~6wYE8TM%nCOJ)L65NSkvY?mukODN@_m zsxI10bfS~3M*dsqmX)&Ae(Q%HGDO+xWkHsDy4V_S#umI7W@|io9x>04wx(WK(Q(IZ zO<`eWH-oL2+i_AlR5^cU^;C{J%kU^~9AqL(cs5ZcjVvn{lNAa>@uEwnRM(C%1RzffK|*ye9Tk*S}*ZT{yb z#717WEnJyMVr@U$!cT>ec*NLN+({wXXp(JpI%MK%nk_N`|6e)3ZB6(QRJXg@)?}gf z)9t8jJ^q-T@IGzZgg?h3N_Mbq_839z##P&vO{gVpjkj(2(Vaw_tG3vJ^YHgSK5ez_ z-sVW6+5c>NSHzGgbZl1wqv<}mQ9hi<8_0GD;I6Y zM_`HPpSGPSfn3p}uTEK^fbC>b9Pzmkw#2M`s3onoo%#l~TQt;`l&=;3UceEZ;!+3O z=>|Ce!%O|LU78JplC(p{kivme;* z^oOu+8fJTtdyx3f3fsei^NAmSYI}GAGYoHF%cwI8wceL`bTI0a!P9L|(E0p-E!P4b zMRo7b?9Kq$z@Ct>EMY^K$SaXN2udrULP7vRUY7)X3zOYRGO)W7cV+|BYDCmp^+Rzg z2bHQ^@#?*;h{hTPi=aqruQ!U;idPY+#fn#}h~lfo{{A!BBv8b9zk9Ra?wOr)=70Y0 z*GyKfEDrA9Q;ug##{~a)sC5pLcf^D5yt;+?`&R_tIfO>y&GUl?e?Efw?_V1{_~e^R zD!nK89a>{6I=?L^M- zbemtw;=aun;Xd9ExW9fZtf87KKYWg{7oX?7XX2^2of~4BzGH^T3FM!9pelL$4I>zKw zGcQ`U8u`F@UL1xsygQwjoOJ}hrlIkYX~$42-pEUrz0Ld=?&Rf1Rx@Sj`K`R-0VIq6 z@c|!GG9E?a!+cCLWGt2Nu}?xY^Q!r{1(?6_GX8^NJeKeKn2#S-$ds%P`GjH=COe+y z6Blk{Z2bFtqH!Jb&)mc(-mn^F_bcAmG1?n<|C*ouEUd?W51-_~?%70Mea+*{_f~5i zpE?p3j5>=?-@JtR)*a>NAAs-PS;;R%yPYjo`J&&f#-r2sa%~9`h#UL!*xC8apL&kR z?tnc%@H*F@g#(L?;>II&=>PTMOMbBmGJn$@m0K3_B_CamVAjr;o@t>_`B!c#xNhot zZsK>Keb*gmK>Uuc_(EpP+RLweJc;K5`|_)XcAy?8<12eXB;Q=f zuezjutUe&~MOGkTq`xfylD%V~c5Y50$aoK<}7%yOm#uH<)yo?>jp zt$ckN*7e4H{O4C~VoE;a_v}g|{(t^B-_W!i_wQQy{YUDUZ^46nH}OrQaqoA@IKJsHw7oauk93TO8SUnqUptq{8?NP#9caV-{!-qC63*Am z`L8A%fv3BaKXGmcW7GbHZ}}kz%WLFMA4ThRYBk^Xvn<>YICw38rW`Kyu)&{s1AV($ zH}jn$E@?_B#kXzjav*JK})iqm}866i#HJbxjw8n<8-cU0#5${XjZo#Q%h+&+fC zFlQASkTQQUw}bibx`e;<(B+Js*Pp)<-NfY2FX69U+Il(jpY<$%?NA+3qTln^mzOZb zw}9`-gPDakx}y}|%K!T`*!6W${#Ha{vNVP7eeWK|4qeON{v1i_#uC1N@iykWyPofF z9)}pB@ORpv^$-7z|7k4#1Nzud{_c9Pe$OucKhJ!CTexTOzua*e^M~HxpPjKA3B{CK z_|bn`fL}mb>W=cwpYSghorxT7AOGvpzcByH+5A`|GNALWH<+^hv9>jJUr6Gyxk`b^ z`n41mSB>*$W$_xr((2>7>il>?q4U#)Z%C!$kzdH6?j?PKQ_TBOp^!3Sx~1Apx*F3Pv~=87wdUry5!GzNOsdlt%up?RMO-ge=b4se5GPu+cv`n6 zs3R(SgO2PeiCEllF1a_mtWa7%+OiZbh}E zw_Dt(Pid(Y&iH#vebU*^M|XyV+}od1lwkWow!so0rW6RfFhIfzFooDqDx@csfnw>6 z{(jC)cl8}I4QJC>XJJgS7F?Oaw=(=M9?pq#PM5;zK|t1{1@kipm>& zd17fm8Puw>Lx7>;x-odEY&NULXB13KVAR|hosGk2y2rGt=c~Mntyk9Swnt+^TW%!M z3AMoh+brWpx@tDKtWFrqmoG1mn~mO-kyNMEudsEiTwP%4YFVY)V5Zb`GHxUcTaT5i zbv?vmSZd{%G3xAURl|`!PQ_B3@cx{6_lDX&yz}{?(jI5=mPutgc&UL38=nc6mo~5` z4m4s+xtyT$#Em(kWvpB#_(r);nCNZBEU6uFoj8zS^_%vlTE9ZomupcwzCtyVy4s}08&sMk;#@;9lb9k3?UWW>YN^W%yGf0jNz2xffTbsz z&2mS2IMVjmQ~R>A2E#H)uWeEJ3x6b#RSi(;%ygpJx#HO&ZO(Ijvm@)-6wspMMVbH= zhy3gDO~XYW55a#6{&|r+Iefe{8$ex>0E-RP(h%uf=ZcOzv3RjOG@JMuH_c{MPdaPf zDQw%&aa0=j#Bo~?QxdL)xklZCwg0QlXFC_aeA>x2FK81l|4ET*#OBpZv=5bqVP7bTUTBXCREhKLW7Y*!EGaoc|ECWuH_iXM%Q>e=a5oi+(xoVPm$TH4Jk80v(BWaODCx8Tf`5X zs@Xg?yUYLN%{V~=Afd?V-+sBXVMl)dK_^_KI$L)Pi;O(QRr_{?1`a&&s_J>O)zRY7 zxl+N@Q|#y=48+UeLd$zZq<_Ss^4Ve2PJu-aNZoPmq*#@?Shel_@~PaRFIp8o3)#?oJwfQ! zQJA3&M4jcV>?rIvwkI^Fa$l%I1*ylm`7RjwoiHeCa>JFI$+UK;?eAAhEt0Yyx}-aY z?<^CS75W3>x`}d*c&i*oo9JWA4ZZUxPZPRrVnH0@U!NfJDY#@Ge>+wR&8S+UgvAx$W^-t!mMXI3l&PV{?I6^(Wt8QNLTs z75*PfxuWI{C9k;a;-Q@v&r9hohMBfb3gCR{Ht8<0<_Rg!L#JW45+q=SLny54;4;aM z0-G11J5yNanx>GLl`ZuZlO|yId)LW-;G;49)hW3Cd;_!5- zOytdyekT3$L3G|CgXG?>{ zXPPvi{k2)rp@C&*v$;rQNCP}O)*%$iIh&xfHe3z)3a_N0xH~&b$qx^zHB+|QWZF^G zB9wAAo0ef4&dOJZl-b`4+>T4+yht&2INq0JaELkT*6=usm2@e6$;r1ywN#8aPrk)$ zXn^Tj;(#p`O!@5z*m(NpnPVEx%OlxS|I8e1-rlL1$X&!rSqeEn{cTQvFPAsqLp!S@ zXY)JxV*X)ifM_;lS-ktWFW3s-41Fe#PUeLSwF~u2T+~TNps?vgGEHD{fe{!pM$gHiJ~YEmr~{ek}1SBxrrtfgZ-zNNn2cbrj*;h zEh=pfNW+~+cZJ26F_N6umA-UglkHS|HBwxils@vY7e&=IzEA~aSYFMQfYiw|xWNZ! zJqDeDBQIS;ZjbtIQh^i^qvA?L#ze8$ej6CE=v80u*6vK%0w4` zR5=?s;nOv-dxBKho-m~W5#Hhk7nS`83XOtNtehz4bw`9es$Hnk(kQuh(X&O_4ahE0 znTAJo@vAW7>(z@*WQJ~hQ0q*!#x2|_*tV~{Npd9RVn8#*;hj<_oWy<<$PVGNyWF$H zwxk@MVWB@kRWYR(jaZmuR@Y`_hF7Y(H5!UIOHGAr8C(w^IC+zki;}Mq_rayPA^o2`nJi zd?gPM30cW<>c0*bBg}i<5VLDhMp;OX6i6&8WW`ICKVMw>ia$qu@w_s4H0|A$v*Fm& zFREw*xWtR_gekBR+gC~X=a4u^XJUAJEeOicylR4&Ma47K6O=D`O#^aKDFCD0-+W3c zB78@JowTOs*3{HU0f7wc0Bn2BE55K(vo2Q*AC55B>vVZw6#*jtWOzlmQs&vs9Ti0} z=?iTNPN6uZJ_Y&DC?PKn|3uEmqwGo6C?4G|4Vg<#q;9rRwO@Nuc6#Jw$fDGg_Ml!t zhI~2`aI~+({fRY%gSQF>C7M^rA%234L}WNBq$As4m`9&i3WlCa8gP3~)w+<&i8H=8 z=UJ`T`v)oFG<=;W)ca&5znk*`Fek%#8!e=wfA@#|J$G~Yo|WPIJaOwa{sLd82KI63 zL?jYb*-|Kvn0GREM_hJeGLue_Y`kt%Y^_fUiC!E01Key6zeNcB7x%p>59)>Wq<6$Q z=b5Mbi2a|-*>rLN>iSMrS5;1gV`Ni--Io$*?Q0arE25J(FQQMA(+>E|iZ zTvs`4(Q%nC?9W)%add^nAAbd7d+jn`j--m!4=Z863K*4p+yzL@yLX#1YE01L8&}1Y(Xvm5yx!RE#j%nFvJE)2_dGDf@kcURDLR; zkp&VvGQHA_l6KOId5WZDvy}XHGRC#(W_SNjFy}$0If|HGiAQS*XB&9B`1^pzZ8`ps zA4Q-j8m@$g1zby`<+KD!h2THA_D-f8LMpQfAKO34wWWZH1Rk(WK!{YRQ;t(zMq;r10)d zAWFICRYdMa^w{9UF&T)a(8_I~jcg;Km#WJyq=to#X0Yqgn~+)Qsd9Bj1G)SYAZaOG zb((YZYHbbKT4tJ32c#N=r-vS5Yzpl`Y}kDc zu_bOM8-Ww@5;wmOxTusOKd~vpa@V4|&g3xP%7Ip5O*abyv_}S&E*5+*4g@+mpnf+8 zAj3=IUIp7jc*~khWD{;^Ek~i;hyo^q5iuvz_(61~+6^SsPPlsHaSV+mM zJ|R#CNm^Q>RVU5vNlU3(4<&Kciueh7lT;m`#q2ekH8qM{R!`}%ZevK5Vqa1=PcuEe zcR^UBtqo*vE$+tU0m^l=YT}J#wKX$;QnyvY+t*&V)&KeZ|Bs#b3%fh-b)B8}dUTw= zN7vm<20Y;(-*gvO|5zT>K68{aKd83JK*mmuy6$Eb deG^sBDFfPDUr~y3+x-WX)pGmj_m#1}zXM>nk=g(N delta 22915 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 OzTA#FQ|u90mY)HYWu;R9 diff --git a/res/translations/mixxx_ca.ts b/res/translations/mixxx_ca.ts index 6140026e4067..5b55a2184c88 100644 --- a/res/translations/mixxx_ca.ts +++ b/res/translations/mixxx_ca.ts @@ -26,12 +26,12 @@ Enable Auto DJ - + Activa el DJ automàtic Disable Auto DJ - + Desactiva el DJ automàtic @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Llista de reproducció nova @@ -160,7 +160,7 @@ - + Create New Playlist Crea una nova llista de reproducció @@ -190,113 +190,120 @@ Duplica - - + + Import Playlist Importa la llista de reproducció - + Export Track Files Exporta pistes a fitxers - + Analyze entire Playlist Analitza tota la llista de reproducció - + Enter new name for playlist: Inseriu un nom nou per a la llista de reproducció: - + Duplicate Playlist Duplica la llista de reproducció - - + + Enter name for new playlist: Inseriu el nom de la llista nova de reproducció: - - + + Export Playlist Exporta la llista de reproducció - + Add to Auto DJ Queue (replace) Afegeix a la cua del DJ automàtic (reemplaça) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Canvia el nom a la llista de reproducció - - + + Renaming Playlist Failed Ha fallat el canvi de nom de la llista de reproducció - - - + + + A playlist by that name already exists. Ja existeix una llista de reproducció amb aquest nom. - - - + + + A playlist cannot have a blank name. El nom de la llista de reproducció no pot quedar en blanc - + _copy //: Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallat la creació de la llista de reproducció - - + + An unknown error occurred while creating playlist: S'ha produït un error desconegut en crear la llista de reproducció: - + Confirm Deletion Confirmeu la supressió - + Do you really want to delete playlist <b>%1</b>? Realment vols esborrar la llista de reproducció <b>%1</b>? - + M3U Playlist (*.m3u) Llista de reproducció M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista de repr. M3U (*.m3u);;Llista de repr. M3U8 (*.m3u8);;Llista de repr. PLS (*.pls);;Text CSV (*.csv);;Text llegible (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # Núm. - + Timestamp Marca de temps @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No s'ha pogut carregar la pista. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Àlbum - + Album Artist Artista de l'àlbum - + Artist Artista - + Bitrate Taxa de bits - + BPM BPM - + Channels Canals - + Color Color - + Comment Comentari - + Composer Compositor - + Cover Art Portada - + Date Added Afegida el dia - + Last Played Darrera reproducció - + Duration Durada - + Type Tipus - + Genre Gènere - + Grouping Grup - + Key Tonalitat musical - + Location Ubicació - + Overview - + Visió general - + Preview Pre-escolta - + Rating Puntuació - + ReplayGain ReplayGain - + Samplerate Rati de mostreig - + Played Reproduït - + Title Tí­tol - + Track # Núm. de pista - + Year Any - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk S' està recuperant la imatge... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Ordinador" et permet navegar, veure i carregar les pistes de les carpetes del disc dur, o de dispositius externs. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -806,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Torna a escanejar la biblioteca en iniciar el Mixxx. @@ -856,7 +873,7 @@ traça - Per sobre + Missatges de perfil Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Estableix la mida màxima, en bytes, del fitxer mixxx.log. Feu servir -1 si no voleu establir un límit. El valor predeterminat és 100 MB com a 1e5 o 100000000. @@ -866,7 +883,7 @@ traça - Per sobre + Missatges de perfil Overrides the default application GUI style. Possible values: %1 - + Substitueix l'estil de la GUI de l'aplicació per defecte. Valors possibles: %1 @@ -2433,7 +2450,7 @@ traça - Per sobre + Missatges de perfil Double BPM - + Doble BPM @@ -2463,12 +2480,12 @@ traça - Per sobre + Missatges de perfil Move Beatgrid Half a Beat - + Desplaça mitja pulsació la graella rítmica Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusteu la quadrícula de ritme exactament mig ritme. Només es pot utilitzar per a pistes amb tempo constant. @@ -2505,57 +2522,57 @@ traça - Per sobre + Missatges de perfil Internal Leader BPM - + Líder intern BPM Internal Leader BPM +1 - + Líder intern BPM +1 Increase internal Leader BPM by 1 - + Incrementa Líder intern BPM en 1 Internal Leader BPM -1 - + Líder intern BPM -1 Decrease internal Leader BPM by 1 - + Decrementa Líder intern BPM en 1 Internal Leader BPM +0.1 - + Líder intern BPM +0.1 Increase internal Leader BPM by 0.1 - + Incrementa Líder intern BPM en 0.1 Internal Leader BPM -0.1 - + Líder intern BPM -0.1 Decrease internal Leader BPM by 0.1 - + Decrementa Líder intern BPM en 0.1 Sync Leader - + Sincronitzar Líder Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Indicador o commutació de 3 estats del mode de sincronització (desactivat, líder suau, líder explícit) @@ -2666,13 +2683,13 @@ traça - Per sobre + Missatges de perfil Sort hotcues by position - + Ordena els hotcues per posició Sort hotcues by position (remove offsets) - + Ordena els hotcues per posició (elimina els desplaçaments) @@ -2763,7 +2780,7 @@ traça - Per sobre + Missatges de perfil if the track has no beats the unit is seconds - + si la pista no té ritmes la unitat són segons @@ -2788,22 +2805,22 @@ traça - Per sobre + Missatges de perfil Loop %1 Beats set from its end point - + Bucle % 1 Ritmes establerts des del seu punt final Loop Roll %1 Beats set from its end point - + Bucle Roll % 1 Ritmes establerts des del seu punt final Create %1-beat loop with the current play position as loop end - + Creeu %1-beat bucle amb la posició de reproducció actual com a final del bucle Create temporary %1-beat loop roll with the current play position as loop end - + Creeu temporalment %1-beat bucle amb la posició de reproducció actual com a final del bucle @@ -2909,12 +2926,12 @@ traça - Per sobre + Missatges de perfil Beat Jump - + Salt de ritme Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Indiqueu quin marcador de bucle roman estàtic quan s'ajusta la mida o s'hereta de la posició actual @@ -2939,12 +2956,12 @@ traça - Per sobre + Missatges de perfil Remove Temporary Loop - + Elimina bucle temporal Remove the temporary loop - + Elimina el bucle temporal @@ -3079,7 +3096,7 @@ traça - Per sobre + Missatges de perfil Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Ordena la columna de la cel·la que està actualment activa, equivalent a fer clic a la seva capçalera @@ -3150,23 +3167,23 @@ traça - Per sobre + Missatges de perfil Select Next Color Available - + Seleccioneu el següent color disponible Select the next color in the color palette for the first selected track - + Seleccioneu el color següent a la paleta de colors per a la primera pista seleccionada Select Previous Color Available - + Seleccioneu el color anterior disponible Select the previous color in the color palette for the first selected track - + Seleccioneu el color anterior a la paleta de colors de la primera pista seleccionada @@ -3359,27 +3376,27 @@ traça - Per sobre + Missatges de perfil Waveform Zoom Reset To Default - + El zoom de la forma d'ona restablert al valor predeterminat Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Restableix el nivell de zoom de la forma d'ona al valor predeterminat seleccionat a Preferències -> Formes d'ona Select the next color in the color palette for the loaded track. - + Seleccioneu el color següent a la paleta de colors per a la pista carregada. Select previous color in the color palette for the loaded track. - + Seleccioneu el color anterior a la paleta de colors per a la pista carregada. Navigate Through Track Colors - + Navegueu pels colors de la pista @@ -3633,32 +3650,32 @@ traça - Per sobre + Missatges de perfil ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Es deshabilitaran les funcions de les assignacions de controlador fins que el problema s'hagi resolt. - + You can ignore this error for this session but you may experience erratic behavior. Podeu ignorar l'error per aquesta sessió, però podríeu experimentar comportaments erràtics. - + Try to recover by resetting your controller. Intentar que s'arregli reiniciant la controladora. - + Controller Mapping Error Error de l'assignació de controlador - + The mapping for your controller "%1" is not working properly. L'assignació per al vostre controlador "%1" no funciona correctament. - + The script code needs to be fixed. Cal corregir el codi del script. @@ -3766,7 +3783,7 @@ traça - Per sobre + Missatges de perfil Importa una caixa - + Export Crate Exporta la caixa @@ -3776,7 +3793,7 @@ traça - Per sobre + Missatges de perfil Permet els canvis - + An unknown error occurred while creating crate: Hi ha hagut un error desconegut a l'hora de crear la caixa: @@ -3802,17 +3819,17 @@ traça - Per sobre + Missatges de perfil El canvi de nom de la caixa ha fallat - + Crate Creation Failed No s'ha pogut crear la caixa - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista de repr. M3U (*.m3u);;Llista de repr. M3U8 (*.m3u8);;Llista de repr. PLS (*.pls);;Text CSV (*.csv);;Text llegible (*.txt) - + M3U Playlist (*.m3u) Llista de reproducció M3U (*.m3u) @@ -3938,12 +3955,12 @@ traça - Per sobre + Missatges de perfil Antics Contribuidors - + Official Website Lloc web oficial - + Donate Donatius @@ -3999,7 +4016,7 @@ traça - Per sobre + Missatges de perfil - + Analyze Analitzador @@ -4044,17 +4061,17 @@ traça - Per sobre + Missatges de perfil Executa la detecció de la graella de ritme, la clau musical i el ReplayGain a les pistes seleccionades. No en genera els gràfics d'ona per estalviar espai de disc. - + Stop Analysis Atura l'anàlisi - + Analyzing %1% %2/%3 S'està analitzant %1% %2/%3... - + Analyzing %1/%2 S'està analitzant %1% %2... @@ -4165,7 +4182,32 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modes Auto DJ Fade + +Introducció completa + Outro: +Reprodueix la introducció i l'outro complets. Utilitza la durada d'introducció o final com a +temps de transició creuada, el que sigui més curt. Si no hi ha cap introducció ni final marcada, +utilitza el temps de crossfade seleccionat. + +Fade at Outro Start: +Comenceu el crossfading a l'inici de l'outro. Si l'outro és més llarg que la +introducció, talla el final de l'outro. Utilitzeu la durada d'introducció o final com a +el temps de crossfade, el que sigui més curt. Si no hi ha introducció o final +marcat, utilitzeu el temps de crossfade seleccionat. + +Pista completa: +Reprodueix tota la pista. Comenceu el crossfading a partir del nombre seleccionat de +segons abans del final de la pista. Un temps de crossfading negatiu afegeix +silenci entre pistes. + +Omet el silenci: +Reprodueix tota la pista excepte el silenci al principi i al final. +Comenceu el crossfading des del nombre de segons seleccionat abans del +darrer so. + +Omet el silenci Inici de volum complet: +El mateix que Omet el solenci, però començant les transicions amb un crossfader +centrat, de manera que la introducció comenci a tot volum. @@ -4470,37 +4512,37 @@ Sovint ofereix una graella de pulsacions de major qualitat, però no serà prou Si l'assignació no funciona bé, proveu d'activar una de les opcions següents i proveu de nou. O sinó feu clic a Reintenta per a detectar el control MIDI de nou - + Didn't get any midi messages. Please try again. No s'ha rebut cap missatge MIDI. Proveu un altre cop. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No s'ha pogut detectar l'assignació -- proveu de nou. Assegureu-vos de tocar només un control cada cop. - + Successfully mapped control: Control assignat correctament: - + <i>Ready to learn %1</i> <i>Preparat per a aprendre %1</i> - + Learning: %1. Now move a control on your controller. Aprenent: %1. Ara feu anar el control en la vostra controladora - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5207,114 +5249,114 @@ associated with each key. DlgPrefController - + Apply device settings? Voleu aplicar la configuració del dispositiu? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? És necessari aplicar la configuració abans d'iniciar l'assistent d'aprenentatge. Volue aplicar la configuració i continuar? - + None Cap - + %1 by %2 %1 per %2 - + Mapping has been edited S'ha editat el mapping - + Always overwrite during this session Sobreescriu sempre durant aquesta sessió - + Save As Anomena i desa - + Overwrite Sobreescriu - + Save user mapping Desa el mapping d'usuari - + Enter the name for saving the mapping to the user folder. Introdueix el nom del mapping per desar-lo a la carpeta d'usuari - + Saving mapping failed No s'ha pogut desar el mapping - + A mapping cannot have a blank name and may not contain special characters. Una assignació no pot tenir el nom en blanc i no pot tenir caràcters especials - + A mapping file with that name already exists. Ja existeix un fitxer d'assignació amb aquest nom. - + Do you want to save the changes? Voleu desar els canvis? - + Troubleshooting Solució de problemes - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. El fitxer d'assignació ja existeix. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ja existeix a la carpeta de controladors d'usuari.<br>Voleu sobreesciure o desar amb un altre nom? - + Clear Input Mappings Esborra les assignacions d'entrada - + Are you sure you want to clear all input mappings? Esteu segur de voler esborrar totes les assignacions d'entrada? - + Clear Output Mappings Esborra les assignacions de sortida - + Are you sure you want to clear all output mappings? Esteu segur de voler esborrrar totes les assignacions de sortida? @@ -5645,6 +5687,16 @@ Volue aplicar la configuració i continuar? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6254,62 +6306,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. La mida mínima de l'aparenca és més gran que la resolució de la vostra pantalla - + Allow screensaver to run Permet que s'activi l'estalvi de pantalla - + Prevent screensaver from running Evita que s'activi l'estalvi de pantalla - + Prevent screensaver while playing Evita l'estalvi de pantalla mentre reprodueix - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Aquesta aparença no suporta els esquemes de colors - + Information Informació - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7477,173 +7529,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Per defecte (retard llarg) - + Experimental (no delay) Experimental (sense retard) - + Disabled (short delay) Desactivat (retard curt) - + Soundcard Clock Rellotge de la targeta de so - + Network Clock Rellotge de xarxa - + Direct monitor (recording and broadcasting only) Monitor directe (només gravació i retransmissió) - + Disabled Desactivat - + Enabled Activat - + Stereo Estèreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide Guia de maquinari de DJ de Mixxx - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. L'entrada de micròfon queda desincronitzada al gravar o retransmetre comparat amb el que es sent. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mesureu la latència total i introduiu-la en la Compensació de la latència del micròfon per tal de sincronitzar el micròfon. - - + Refer to the Mixxx User Manual for details. Consulteu el Manual d'usuari del Mixxx per a més informació. - + Configured latency has changed. La latència configurada ha canviat - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Torneu a mesurar la latència total i introduiu-la en la Compensació de la matència del micròfon per tal de sincronitzar el micròfon. - + Realtime scheduling is enabled. La planificació en temps real està activada - + Main output only Només la sortida principal - + Main and booth outputs Sortides principal i de cabina - + %1 ms %1 ms - + Configuration error Hi ha un error en la configuració @@ -7661,131 +7712,131 @@ The loudness target is approximate and assumes track pregain and main output lev API de so - + Sample Rate Freqüència de mostreig - + Audio Buffer Memòria intermèdia d'àudio - + Engine Clock Rellotge del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Feu anar el rellotge de la targeta de so en configuracions amb públic present i una menor latència. <br>Feu anar el rellotge de la xarxa per a emissions en viu a la xarxa sense un públic present. - + Main Mix Mescla principal - + Main Output Mode Mode de sortida principal - + Microphone Monitor Mode Mode de monitorització del micròfon - + Microphone Latency Compensation Compensació de la latència del micròfon - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Comptador de buidat del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Motor de bloqueig de clau/Pitch Bend - + Multi-Soundcard Synchronization Sincronització de múltiples targetes de so. - + Output Sortida - + Input Entrada - + System Reported Latency Latència reportada pel sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Incrementeu el búfer d'audio si el comptador de buffer buit incrementa o si sentiu talls durant la reproducció. - + Main Output Delay Retard de la sortida principal - + Headphone Output Delay Retard de sortida d'auricular - + Booth Output Delay Retard de la sortida de cabina - + Dual-threaded Stereo - + Hints and Diagnostics Suggeriments i diagnòstic - + Downsize your audio buffer to improve Mixxx's responsiveness. Reduïu la mida del búfer d'audio per millorar la resposta del Mixxx - + Query Devices Consulta els dispositius @@ -9345,27 +9396,27 @@ Sovint ofereix una graella de pulsacions de major qualitat, però no serà prou EngineBuffer - + Soundtouch (faster) Soundtouch (ràpid) - + Rubberband (better) Rubberband (més qualitat) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (quasi qualitat hi-fi) - + Unknown, using Rubberband (better) Desconegut utilitzant Rubberband (millor) - + Unknown, using Soundtouch @@ -9580,15 +9631,15 @@ Sovint ofereix una graella de pulsacions de major qualitat, però no serà prou LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Mode segur activat - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9600,57 +9651,57 @@ Shown when VuMeter can not be displayed. Please keep OpenGL. - + activate activa - + toggle commuta - + right dreta - + left esquerra - + right small dreta petit - + left small esquerra petit - + up amunt - + down avall - + up small amunt petit - + down small avall petit - + Shortcut Drecera @@ -9658,62 +9709,62 @@ OpenGL. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9723,22 +9774,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importa la llista de reproducció - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Llistes de reproducció (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Voleu sobreescriure el fitxer? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9892,253 +9943,253 @@ Voleu sobreescriure aquesta llista? MixxxMainWindow - + Sound Device Busy El dispositiu de so està ocupat - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Torna-ho a provar</b> després de tancar l'altra aplicació o reconnectar el dispositiu d'àudio - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigura</b> les opcions del dispositiu d'àudio de Mixxx - - + + Get <b>Help</b> from the Mixxx Wiki. Obteniu <b>ajuda</b> a la Vikipèdia de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Surt</b> del Mixxx. - + Retry Torna a provar - + skin Tema - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigura - + Help Ajuda - - + + Exit Surt - - + + Mixxx was unable to open all the configured sound devices. El Mixxx no ha pogut obrir tots els dispositius de so configurats. - + Sound Device Error Error del dispositiu de so - + <b>Retry</b> after fixing an issue <b>Reintenta</b> després de corregir el problema - + No Output Devices No hi ha cap dispositiu de sortida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. S'ha configurat el Mixxx sense cap dispositiu de so de sortida, per la qual cosa s'inhabilitarà el processament d'àudio. - + <b>Continue</b> without any outputs. <b>Continua</b> sense cap sortida. - + Continue Continua - + Load track to Deck %1 Carrega la pista a la platina %1 - + Deck %1 is currently playing a track. La platina %1 està reproduint una pista. - + Are you sure you want to load a new track? Esteu segur de voler carregar una nova pista? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hi ha cap dispositiu d'entrada seleccionat per a aquest control de vinil. Si us plau, seleccioneu primer un dispositiu d'entrada a les preferències de Maquinari de so. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hi ha cap dispositiu d'entrada seleccionat per a aquest control de pas d'audio. Si us plau, seleccioneu primer un dispositiu d'entrada a les preferències de Maquinari de so. - + There is no input device selected for this microphone. Do you want to select an input device? No hi ha cap dispositiu d'entrada seleccionat per aquest micròfon. Volue seleccionar ara un dispositiu d'entrada? - + There is no input device selected for this auxiliary. Do you want to select an input device? No hi ha cap dispositiu d'entrada seleccionat per aquest auxiliar. Voleu seleccionar ara un dispositiu d'entrada? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Error en el fitxer d'aparença - + The selected skin cannot be loaded. No es pot carregar l'aparença seleccionada. - + OpenGL Direct Rendering OpenGL Renderització Directa - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. La Renderizació Directa no està habilitada a la vostra màquina.<br><br> Això significa que els gràfics forma d'ona seran molt <br><b>lents i poden fer servir molta CPU</b>. Prove de canviar la<br> configuració per habilitar la renderització directa, o desactiveu<br>els gràfics de forma d'ona a les preferències del Mixxx seleccionant<br>"Buit" al tipus de forma d'ona, en la secció de "Gràfics d'ona". - - - + + + Confirm Exit Confirma la sortida - + A deck is currently playing. Exit Mixxx? Un plat està reproduint encara. Voleu sortir del Mixxx? - + A sampler is currently playing. Exit Mixxx? Hi ha un reproductor de mostres que està reproduint. Segur que voleu sortir del Mixxx? - + The preferences window is still open. La finestra de preferències està oberta encara. - + Discard any changes and exit Mixxx? Descartar els canvis i sortir del Mixxx? @@ -10154,13 +10205,13 @@ Voleu seleccionar ara un dispositiu d'entrada? PlaylistFeature - + Lock Bloca els canvis - - + + Playlists Llistes de reproducció @@ -10170,32 +10221,58 @@ Voleu seleccionar ara un dispositiu d'entrada? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Permet els canvis - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJ preparen llistes de reproducció abans d'actuar, però altres prefereixen fer-les en viu. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quan utilitzeu una llista de reproducció durant una sessió en viu, recordeu parar atenció a com reacciona l'audiència a la música que heu decidit reproduir. - + Create New Playlist Crea una nova llista de reproducció @@ -11847,7 +11924,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough De pas @@ -12011,12 +12088,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12144,54 +12221,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Llistes de reproducció - + Folders Carpetes - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues hotcues - + Loops (only the first loop is currently usable in Mixxx) bucle (només es pot utilitzar el primer bucle a Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Cerca dispositius USB/ SD connectats de Rekordbox (refresca) - + Beatgrids Graella de ritmes - + Memory cues - + (loading) Rekordbox (carregant) Rekordbox @@ -13599,23 +13676,23 @@ may introduce a 'pumping' effect and/or distortion. Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusteu la quadrícula de ritme exactament mig ritme. Només es pot utilitzar per a pistes amb tempo constant. Revert last BPM/Beatgrid Change - + Reverteix l'últim canvi de BPM/quadrícula de ritme Revert last BPM/Beatgrid Change of the loaded track. - + Reverteix l'últim canvi de BPM/quadrícula de ritme de la pista carregada. Toggle the BPM/beatgrid lock - + Commuta el bloqueig BPM/quadrícula de ritme @@ -15435,47 +15512,47 @@ Això no es pot desfer! WCueMenuPopup - + Cue number Número de marca - + Cue position Marca de posició - + Edit cue label Edita la etiqueta del punt cue - + Label... Etiqueta... - + Delete this cue Suprimeix aquesta marca - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Marca directa #%1 @@ -15600,323 +15677,353 @@ Això no es pot desfer! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Crea una &nova llista de reproducció - + Create a new playlist Crea una nova llista de reproducció - + Ctrl+n Ctrl+n - + Create New &Crate Crea una nova &caixa - + Create a new crate Crea una nova caixa - + Ctrl+Shift+N Ctrl+Majús+N - - + + &View &Visualització - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. No està disponible a totes les aparences - + Show Skin Settings Menu Mostra el menú de les opcions d'aparença - + Show the Skin Settings Menu of the currently selected Skin Mostra el menú d'opcions disponibles per a l'aparença seleccionada - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostra la secció del micròfon - + Show the microphone section of the Mixxx interface. Mostra la secció de micròfons en la interfície del Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostra la secció de control per vinils - + Show the vinyl control section of the Mixxx interface. Mostra la secció dels controls de vinil a la interfície del Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostra el reproductor de pre-escolta - + Show the preview deck in the Mixxx interface. Mostra el reproductor de pre-escolta a la interfície del Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Mostra la caràtula - + Show cover art in the Mixxx interface. Mostra la caràtula a la interfície del Mixxx - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximitza la biblioteca - + Maximize the track library to take up all the available screen space. Maximitza o restaura la vista de Biblioteca per abarcar tota la pantalla - + Space Menubar|View|Maximize Library Espai - + &Full Screen Pantalla sencera - + Display Mixxx using the full screen Mostra Mixx a pantalla sencera - + &Options &Opcions - + &Vinyl Control Control per &vinils - + Use timecoded vinyls on external turntables to control Mixxx Permet l'ús de vinils amb codi de temps en tocadisc externs per controlar el Mixxx - + Enable Vinyl Control &%1 Activa el control de vinil &%1 - + &Record Mix En&registra la mescla - + Record your mix to a file Enregistra la vostra mescla a un fitxer - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activa la retransmissió en directe(&B) - + Stream your mixes to a shoutcast or icecast server Transmeteu les vostres mescles a un servidor de shoutcast o d'icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Habilita les dreceres de teclat(&K) - + Toggles keyboard shortcuts on or off Activa o desactiva les dreceres de teclat - + Ctrl+` Ctrl+` - + &Preferences &Preferències - + Change Mixxx settings (e.g. playback, MIDI, controls) Canvia les opcions de Mixxx (p.ex. reproducció, MIDI, controladores) - + &Developer &Desenvolupador - + &Reload Skin &Recarrega l'aparença - + Reload the skin Recarrega l'aparença del disc - + Ctrl+Shift+R Ctrl+Majús+R - + Developer &Tools Eines de desenvolupador(&T) - + Opens the developer tools dialog Obre la finesta d'eines de desenvolupador - + Ctrl+Shift+T Ctrl+Majús+T - + Stats: &Experiment Bucket Estadístiques: Comptador &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el mode experiment. Recupera les estadístiques corresponents al comptador EXPERIMENT. - + Ctrl+Shift+E Ctrl+Majús+E - + Stats: &Base Bucket Estadístiques: Comptador &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el mode bàsic. Recupera les estadístiques del comptador BASE. - + Ctrl+Shift+B Ctrl+Majús+B - + Deb&ugger Enabled Motor de dep&uració activat - + Enables the debugger during skin parsing Activa el motor de depuració durant el parseig de l'aparença - + Ctrl+Shift+D Ctrl+Majús+D - + &Help &Ajuda - + Show Keywheel menu title @@ -15933,74 +16040,74 @@ Això no es pot desfer! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel F12 - + &Community Support Suport de la &Comunitat - + Get help with Mixxx Obteniu ajuda sobre el Mixxx - + &User Manual Manual de l'&usuari - + Read the Mixxx user manual. Llegiu el manual de l'usuari de Mixxx. - + &Keyboard Shortcuts Dreceres de teclat(&K) - + Speed up your workflow with keyboard shortcuts. Fes les coses més ràpid amb les dreceres de teclat. - + &Settings directory Directori de &preferències - + Open the Mixxx user settings directory. Obre el directori de preferències d'usuari del Mixxx - + &Translate This Application &Traduïu aquesta aplicació - + Help translate this application into your language. Ajudeu a traduir aquesta aplicació a la vostra llengua. - + &About Sobre el Mixxx (&A) - + About the application Sobre l'aplicació @@ -16035,25 +16142,13 @@ Això no es pot desfer! WSearchLineEdit - - Clear input - Clear the search bar input field - Esborra el text - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Cerca - + Clear input Esborra el text @@ -16064,93 +16159,87 @@ Això no es pot desfer! Cerca... - + Clear the search bar input field Neteja el camp de la barra de cerca - - Enter a string to search for - Introduïu un text de cerca + + Return + Enter - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Utilitza operadors com bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Per a més informació, feu un cop d'ull la Manual d'usuari > Llibreria del Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Drecera + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Posa el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retrocés + + Additional Shortcuts When Focused: + - Shortcuts - tecles ràpides + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - Enter + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space Ctrl+Espai - + Toggle search history Shows/hides the search history entries commuta l'històric de cerques - + Delete or Backspace Suprimir o Retroceso - - Delete query from history - Esborra la consulta de l'històric - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Surt de la cerca + + Delete query from history + Esborra la consulta de l'històric @@ -16500,7 +16589,7 @@ Això no es pot desfer! Shift Beatgrid Half Beat - + Canvi quadrícula de ritme a Mig ritme @@ -16785,7 +16874,7 @@ Això no es pot desfer! Clear BPM and Beatgrid - + Esborra BPM i quadrícula de ritme @@ -16907,37 +16996,37 @@ Això no es pot desfer! WTrackTableView - + Confirm track hide Confirma la ocultació de pistes - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session No tornis a preguntar durant aquesta sessió - + Confirm track removal Confirma la eliminació de la pista @@ -16958,52 +17047,52 @@ Això no es pot desfer! mixxx::CoreServices - + fonts tipus de llegra - + database base de dades - + effects efectes - + audio interface interfície d'àudio - + decks reproductors - + library biblioteca - + Choose music library directory Seleccioneu la carpeta de la biblioteca de música. - + controllers controladors - + Cannot open database No es pot obrir la base de dades - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17017,68 +17106,78 @@ Feu click a Acceptar per sortir. mixxx::DlgLibraryExport - + Entire music library Biblioteca sencera - - Selected crates - Caixes seleccionades + + Crates + - + + Playlists + + + + + Selected crates/playlists + + + + Browse Navega - + Export directory Directori d'exportació - + Database version Versió de base de dades - + Export Exporta - + Cancel Cancel·la - + Export Library to Engine DJ "Engine DJ" must not be translated Exportar la llibreria a Engine DJ - + Export Library To Exportar la llibreria a - + No Export Directory Chosen No s'ha indicat un directori d'exportació - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -17099,7 +17198,7 @@ Feu click a Acceptar per sortir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17109,22 +17208,22 @@ Feu click a Acceptar per sortir. mixxx::LibraryExporter - + Export Completed Exportació finalitzada - - Exported %1 track(s) and %2 crate(s). - Exportat %1 pista(es) i %2 caixa(es). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed La exportació ha fallat - + Exporting to Engine DJ... Exportant a Engine DJ... diff --git a/res/translations/mixxx_cs.qm b/res/translations/mixxx_cs.qm index 93326d882b829f16fd40778c447f76559c382570..e122187571367ca84cbdf4a800a326ec47106221 100644 GIT binary patch delta 23323 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 delta 24311 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 Enable Auto DJ - + Spustit automatického diskžokeje Disable Auto DJ - + Zastavit automatického diskžokeje Clear Auto DJ Queue - + Vyprázdnit řadu automatického diskžokeje @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nový seznam skladeb @@ -160,7 +160,7 @@ - + Create New Playlist Vytvořit nový seznam skladeb @@ -190,113 +190,120 @@ Zdvojit - - + + Import Playlist Nahrát seznam skladeb - + Export Track Files Uložit soubory skladeb - + Analyze entire Playlist Rozebrat celý seznam skladeb - + Enter new name for playlist: Zadat nový název pro seznam skladeb: - + Duplicate Playlist Zdvojit seznam skladeb - - + + Enter name for new playlist: Zadat název pro nový seznam skladeb: - - + + Export Playlist Uložit seznam skladeb - + Add to Auto DJ Queue (replace) Přidat do řady skladeb automatického diskžokeje (nahradit) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Přejmenovat seznam skladeb - - + + Renaming Playlist Failed Seznam skladeb se nepodařilo přejmenovat - - - + + + A playlist by that name already exists. Seznam skladeb s tímto názvem již existuje. - - - + + + A playlist cannot have a blank name. Seznam skladeb musí mít název. - + _copy //: Appendix to default name when duplicating a playlist _kopie - - - - - - + + + + + + Playlist Creation Failed Seznam skladeb se nepodařilo vytvořit - - + + An unknown error occurred while creating playlist: Při vytváření seznamu skladeb došlo k neznámé chybě: - + Confirm Deletion Potvrdit smazání - + Do you really want to delete playlist <b>%1</b>? Opravdu chcete seznam skladeb <b>%1</b> smazat? - + M3U Playlist (*.m3u) Seznam skladeb M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Seznam skladeb M3U (*.m3u);;Seznam skladeb M3U8 (*.m3u8);;Seznam skladeb PLS (*.pls);;Text CSV (*.csv);;Prostý text (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # Č. - + Timestamp Časové razítko @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nepodařilo se nahrát skladbu. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Umělec alba - + Artist Umělec - + Bitrate Datový tok - + BPM MM - + Channels Kanály - + Color Barva - + Comment Poznámka - + Composer Skladatel - + Cover Art Obrázek obalu - + Date Added Datum přidání - + Last Played Naposledy hráno - + Duration Doba trvání - + Type Typ - + Genre Žánr - + Grouping Skupina - + Key Tónina - + Location Umístění - + Overview - + Preview Náhled - + Rating Hodnocení - + ReplayGain Vyrovnání hlasitosti - + Samplerate Vzorkovací kmitočet - + Played Hráno - + Title Název - + Track # Číslo skladby - + Year Rok - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Načítání obrázku ... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. Počítač vám umožní pohyb ve skladbách, jejich zobrazení a nahrávání ze složek na pevném disku a vnějších zařízeních. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3634,32 +3651,32 @@ trace - Výše + Profilování zpráv ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Funkce poskytované přiřazením tohoto ovladače budou až do vyřešení problému vypnuty. - + You can ignore this error for this session but you may experience erratic behavior. Nemusíte si pro toto sezení všímat této chyby, ale můžete zažít nevyzpytatelné chování. - + Try to recover by resetting your controller. Pokuste se o obnovu znovunastavením vašeho ovladače. - + Controller Mapping Error Chyba v přiřazení ovladače - + The mapping for your controller "%1" is not working properly. Přiřazení pro váš ovladač "%1" nefunguje správně. - + The script code needs to be fixed. Kód skriptu je potřeba opravit. @@ -3767,7 +3784,7 @@ trace - Výše + Profilování zpráv Nahrát přepravku - + Export Crate Uložit přepravku @@ -3777,7 +3794,7 @@ trace - Výše + Profilování zpráv Odemknout - + An unknown error occurred while creating crate: Při vytváření přepravky na desky nastala neznámá chyba: @@ -3803,17 +3820,17 @@ trace - Výše + Profilování zpráv Přejmenování přepravky se nezdařilo - + Crate Creation Failed Vytvoření přepravky se nezdařilo - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Seznam skladeb M3U (*.m3u);;Seznam skladeb M3U8 (*.m3u8);;Seznam skladeb PLS (*.pls);;Text CSV (*.csv);;Prostý text (*.txt) - + M3U Playlist (*.m3u) Seznam skladeb M3U (*.m3u) @@ -3939,12 +3956,12 @@ trace - Výše + Profilování zpráv Přispěvatelé v minulosti - + Official Website Internetová stránka - + Donate Přispět @@ -4000,7 +4017,7 @@ trace - Výše + Profilování zpráv - + Analyze Analýza @@ -4045,17 +4062,17 @@ trace - Výše + Profilování zpráv Spustí rozpoznávání rytmické mřížky, tóniny a vyrovnání hlasitosti skladeb u vybraných skladeb. Nevytvoří pro vybrané skladby průběhové křivky kvůli ušetření místa na disku. - + Stop Analysis Zastavit rozbor - + Analyzing %1% %2/%3 Provádí se rozbor %1% %2/%3 - + Analyzing %1/%2 Provádí se rozbor %1/%2 @@ -4471,37 +4488,37 @@ Použijte toto nastavení, pokud mají vaše skladby stálé tempo (např. vět Když přiřazení nepracuje, zkuste níže povolit rozšířenou volbu, a potom ovládací prvek zkuste znovu. Nebo klepněte na Opakovat pro opětovné zjištění ovládání MIDI. - + Didn't get any midi messages. Please try again. Nepřijaty žádné zprávy MIDI. Zkuste to, prosím, znovu. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Nepodařilo se poznat žádné přiřazení - zkuste to, prosím, znovu. - + Successfully mapped control: Ovládací prvek úspěšně přiřazen: - + <i>Ready to learn %1</i> <i>Připraven k učení %1</i> - + Learning: %1. Now move a control on your controller. Učení: %1. Nyní posuňte ovládací prvek na svém ovladači. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5207,114 +5224,114 @@ associated with each key. DlgPrefController - + Apply device settings? Použít nastavení zařízení? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Nastavení je nutné použít před spuštěním Průvodce učením. Použít nastavení a pokračovat? - + None Žádný - + %1 by %2 %1 od %2 - + Mapping has been edited Přiřazení bylo upraveno - + Always overwrite during this session Pokaždé přepsat během sezení - + Save As Uložit jako - + Overwrite Přepsat - + Save user mapping Uložit přiřazení uživatele - + Enter the name for saving the mapping to the user folder. Zadejte název pro uložení přiřazení do uživatelské složky. - + Saving mapping failed Uložení přiřazení selhalo - + A mapping cannot have a blank name and may not contain special characters. Přiřazení nesmí mít prázdný název a neměl by obsahovat zvláštní znaky. - + A mapping file with that name already exists. Soubor přiřazení s tímto názvem již existuje. - + Do you want to save the changes? Chcete uložit změny? - + Troubleshooting Odstraňování závad - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Pokud používáte toto přiřazení, váš ovladač nemusí pracovat správně. Vyberte prosím další přiřazení nebo vypnutí ovladače.</b></font><br><br>Toto přiřazení bylo navrženo pro novější ovladač stroje Mixxx a nelze je použít při vaší nynější instalaci Mixxx.<br>Vaše instalace Mixxx má verzi ovladače stroje %1. Toto přiřazení vyžaduje verzi ovladače stroje> = %2.<br><br>Pro více informací navštivte stránku wiki <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Verze ovladače stroje</a>. - + Mapping already exists. Přiřazení již existuje. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> již existuje v uživatelské složce přiřazení.<br>Přepsat nebo uložit pod novým názvem? - + Clear Input Mappings Smazat přiřazení vstupu - + Are you sure you want to clear all input mappings? Jste si jistý, že chcete smazat všechna přiřazení vstupu? - + Clear Output Mappings Smazat přiřazení výstupu - + Are you sure you want to clear all output mappings? Jste si jistý, že chcete smazat všechna přiřazení výstupu? @@ -5645,6 +5662,16 @@ Použít nastavení a pokračovat? Multi-Sampling Vícenásobné vzorkování + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6259,62 +6286,62 @@ Vždy můžete přetažením skladeb na obrazovce naklonovat přehrávač. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Nejmenší velikost vybraného vzhledu je větší než rozlišení vaší obrazovky. - + Allow screensaver to run Povolit běh spořiče obrazovky - + Prevent screensaver from running Zabránit spořiči obrazovky v běhu - + Prevent screensaver while playing Zabránit spořiči obrazovky v běhu během přehrávání - + Disabled Zakázáno - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Tento vzhled nepodporuje barevná schémata - + Information Informace - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Předtím než se změny, škálování nebo vícenásobné vzorkování projeví, bude se muset Mixxx spustit znovu. @@ -7484,175 +7511,174 @@ Cílová hlasitost zvuku je přibližná a předpokládá se, že předzesílen DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Výchozí (dlouhé zpoždění) - + Experimental (no delay) Pokusné (žádné zpoždění) - + Disabled (short delay) Zakázáno (krátké zpoždění) - + Soundcard Clock Hodiny zvukové karty - + Network Clock Hodiny sítě - + Direct monitor (recording and broadcasting only) Přímý dohled (pouze nahrávání a vysílání) - + Disabled Zakázáno - + Enabled Povoleno - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Povolit zařazování do rozvrhu (nyní vypnuto), podívejte se na %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 uvádí zvukové karty a ovladače, které byste měli zvážit při používání Mixxxu. - + Mixxx DJ Hardware Guide Průvodce technickým vybavením pro DJ Mixxx - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) automaticky (<= 1024 snímků/periodu) - + 2048 frames/period 2048 snímků/periodu - + 4096 frames/period 4096 snímků/periodu - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Mikrofonní vstupy jsou při nahrávání a vysílaní zpožděny v porovnání s tím, co slyšíte. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Změřte prodlevu zpoždění a zadejte ji výše pro prodlevu mikrofonu. Kompenzace pro přizpůsobení načasování mikrofonu. - - + Refer to the Mixxx User Manual for details. Nahlédněte do uživatelské příručky k Mixxxu, kde jsou podrobnosti. - + Configured latency has changed. Nastavená prodleva se změnila. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Opakujte nastavení zpoždění a zadejte ji výše pro latenci mikrofonu Kompenzace pro přizpůsobení načasování mikrofonu. - + Realtime scheduling is enabled. Je povoleno zařazování do rozvrhu ve skutečném čase. - + Main output only Pouze hlavní výstup - + Main and booth outputs Hlavní výstup a výstup kukaně - + %1 ms %1 ms - + Configuration error Chyba nastavení @@ -7670,131 +7696,131 @@ Kompenzace pro přizpůsobení načasování mikrofonu. Zvukové API - + Sample Rate Vzorkovací kmitočet - + Audio Buffer Vyrovnávací paměť zvuku - + Engine Clock Hodiny stroje - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Použijte hodiny zvukové karty pro nachystání pro živé obecenstvo a nejnižší časy prodlevy.<br>Použijte síťové hodiny pro vysílání bez živého obecenstva. - + Main Mix Hlavní míchání - + Main Output Mode Režim hlavního výstupu - + Microphone Monitor Mode Režim sledování mikrofonu - + Microphone Latency Compensation Náhrada za prodlevu mikrofonu - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Počítadlo podtečení vyrovnávací paměti - + 0 0 - + Keylock/Pitch-Bending Engine Stroj na uzamčení tóniny/měnění výšek tónů - + Multi-Soundcard Synchronization Seřízení více karet - + Output Výstup - + Input Vstup - + System Reported Latency Systémem hlášená prodleva - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Zvětšete vyrovnávací paměť zvuku, když se zvýší počítadlo podtečení nebo během přehrávání slyšíte výpadky. - + Main Output Delay Zpoždění hlavního výstupu - + Headphone Output Delay Zpoždění výstupu sluchátek - + Booth Output Delay Zpoždění hlavní kukaně - + Dual-threaded Stereo - + Hints and Diagnostics Rady a diagnostika - + Downsize your audio buffer to improve Mixxx's responsiveness. Zmenšete vyrovnávací paměť zvuku, abyste zlepšili reakční schopnost Mixxxu. - + Query Devices Oslovit zařízení @@ -9354,27 +9380,27 @@ Použijte toto nastavení, pokud mají vaše skladby stálé tempo (např. vět EngineBuffer - + Soundtouch (faster) Soundtouch (rychlejší) - + Rubberband (better) Rubberband (lepší) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (kvalita poblíž hi-fi) - + Unknown, using Rubberband (better) Neznámé zařízení používající Rubberband (lepší) - + Unknown, using Soundtouch Neznámý, používám Soundtouch @@ -9589,15 +9615,15 @@ Použijte toto nastavení, pokud mají vaše skladby stálé tempo (např. vět LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Bezpečný režim povolen - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9609,57 +9635,57 @@ Shown when VuMeter can not be displayed. Please keep pro OpenGL. - + activate Zapnout - + toggle Přepnout - + right Vpravo - + left Vlevo - + right small Trochu doprava - + left small Trochu doleva - + up Nahoru - + down Dolů - + up small Trochu nahoru - + down small Trochu dolů - + Shortcut Klávesová zkratka @@ -9667,62 +9693,62 @@ pro OpenGL. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9732,22 +9758,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Nahrát seznam skladeb - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Soubory se seznamy skladeb (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Přepsat soubor? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9901,253 +9927,253 @@ Opravdu chcete přepsat soubor? MixxxMainWindow - + Sound Device Busy Zvukové zařízení je zaneprázdněné - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Zopakovat</b> pokus o připojení po zavření jiného programu nebo po opětovném připojení zvukového zařízení - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Nastavit znovu</b> nastavení zvukových zařízení programu Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Získejte <b>nápovědu</b> z Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Ukončit</b> Mixxx. - + Retry Opakovat - + skin vzhled - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Nastavit znovu - + Help Nápověda - - + + Exit Ukončit - - + + Mixxx was unable to open all the configured sound devices. Mixxx nebyl schopen otevřít všechna nastavená zvuková zařízení. - + Sound Device Error Chyba zvukového zařízení - + <b>Retry</b> after fixing an issue Po spravení této záležitosti <b>Zkusit znovu</b> - + No Output Devices Žádná výstupní zařízení - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx byl nastaven bez zařízení pro výstup zvuku. Zpracování zvuku bude bez nastaveného výstupního zařízení vypnuto. - + <b>Continue</b> without any outputs. <b>Pokračovat</b> bez jakéhokoli výstupu. - + Continue Pokračovat - + Load track to Deck %1 Nahrát skladbu do přehrávací mechaniky %1 - + Deck %1 is currently playing a track. Přehrávací mechanika %1 nyní přehrává skladbu. - + Are you sure you want to load a new track? Jste si jistý, že chcete nahrát novou skladbu? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Není vybráno žádné vstupní zařízení pro toto ovládání vinylovou gramodeskou. Nejprve, prosím, vyberte nějaké vstupní zařízení v nastavení zvukového technického vybavení. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Není vybráno žádné vstupní zařízení pro toto ovládání předání dál. Nejprve, prosím, vyberte nějaké vstupní zařízení v nastavení zvukového technického vybavení. - + There is no input device selected for this microphone. Do you want to select an input device? Pro tento mikrofon nebylo zjištěno žádné vstupní zařízení. Chcete vybrat vstupní zařízení? - + There is no input device selected for this auxiliary. Do you want to select an input device? Pro tuto pomocnou jednotku nebylo zjištěno žádné vstupní zařízení. Chcete vybrat vstupní zařízení? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Chyba v souboru se vzhledem - + The selected skin cannot be loaded. Nelze nahrát vybraný vzhled. - + OpenGL Direct Rendering Přímé vykreslování OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Přímé vykreslování není na vašem stroji povoleno.<br><br>Znamená to, že zobrazování průběhové křivky bude velmi<br><b>pomalé a může hodně zatěžovat procesor</b>. Buď aktualizujte své<br>nastavení a povolte přímé vykreslování, nebo zakažte<br>zobrazování průběhové křivky v nastavení Mixxxu volbou<br>"Prázdný" jako zobrazování průběhové křivky v části 'Rozhraní'. - - - + + + Confirm Exit Potvrdit ukončení - + A deck is currently playing. Exit Mixxx? Některá z přehrávacích mechanik hraje. Ukončit Mixxx? - + A sampler is currently playing. Exit Mixxx? Vzorkovač nyní hraje. Ukončit Mixxx? - + The preferences window is still open. Okno s nastavením je stále otevřené. - + Discard any changes and exit Mixxx? Zahodit všechny změny a ukončit Mixxx? @@ -10163,13 +10189,13 @@ Chcete vybrat vstupní zařízení? PlaylistFeature - + Lock Zamknout - - + + Playlists Seznamy skladeb @@ -10179,32 +10205,58 @@ Chcete vybrat vstupní zařízení? Zamíchat seznam skladeb - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Odemknout - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Seznamy skladeb jsou uspořádané seznamy skladeb, které vám umožňují plánovat vaše seznamy skladeb při míchání. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Může být nezbytné přeskočit některé skladby v předpřipraveném seznamu skladeb nebo přidat několik nových skladeb pro udržení posluchačů při síle. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Někteří diskžokejové sestavují seznamy skladeb, předtím než vystoupí živě, ale jiní upřednostňují jejich tvoření bez rozmýšlení. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Když používáte seznam skladeb během míchání, dávejte vždy obzvláštní pozor na to, jak hudba, kterou hrajete, účinkuje na posluchačstvo. - + Create New Playlist Vytvořit nový seznam skladeb @@ -11865,7 +11917,7 @@ Nápověda: vyvažuje „čipmánčí“ nebo „vrčící“ hlasyMíra zesílení použitého na zvukový signál. Ve vyšších úrovních bude zvuk více zkreslený. - + Passthrough Propustit skrz @@ -12029,12 +12081,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12162,54 +12214,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Seznamy skladeb - + Folders Složky - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Čte databáze vyvedené pro přehrávače Pioneer CDJ / XDJ pomocí režimu Rekordbox Export.<br/>Rekordbox může ukládat pouze na zařízení USB nebo SD se systémem souborů FAT nebo HFS.<br/>Mixxx dokáže číst databázi z jakéhokoli zařízení, které obsahuje složky databáze (<tt>PIONEER</tt> a <tt>Contents</tt>).<br/>Podporovány nejsou databáze Rekordbox, které byly přesunuty na vnější zařízení přes<br/><i> Nastavení → Pokročilé → Správa databáze</i>.<br/><br/>Čtou se následující data: - + Hot cues Rychlé značky - + Loops (only the first loop is currently usable in Mixxx) Smyčky (pouze první smyčka je v Mixxxu aktuálně nepoužitelná) - + Check for attached Rekordbox USB / SD devices (refresh) Zkontrolovat připojená zařízení Rekordbox USB / SD (obnovit) - + Beatgrids Rytmické mřížky - + Memory cues Paměťové klíče - + (loading) Rekordbox (nahrává se) Rekordbox @@ -15454,47 +15506,47 @@ Tento krok nelze vrátit zpět! WCueMenuPopup - + Cue number Číslo značky - + Cue position Poloha značky - + Edit cue label Upravit popisek značky - + Label... Popisek... - + Delete this cue Smazat tuto značku - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Rychlá značka #%1 @@ -15619,323 +15671,353 @@ Tento krok nelze vrátit zpět! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Vytvořit &nový seznam skladeb - + Create a new playlist Vytvořit nový seznam skladeb - + Ctrl+n Ctrl+N - + Create New &Crate Vytvořit novou &přepravku - + Create a new crate Vytvořit novou přepravku - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Pohled - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Nebude pravděpodobně podporován všemi vzhledy. - + Show Skin Settings Menu Ukázat nabídku nastavení vzhledu - + Show the Skin Settings Menu of the currently selected Skin Ukázat nabídku nastavení vzhledu nyní vybraného vzhledu - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Ukázat mikrofony - + Show the microphone section of the Mixxx interface. Ukázat oblast s mikrofonem rozhraní Mixxxu. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Ukázat ovládání vinylem - + Show the vinyl control section of the Mixxx interface. Ukázat oblast ovládání vinylovou gramodeskou v rozhraní Mixxxu. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Ukázat přehrávač náhledu - + Show the preview deck in the Mixxx interface. Ukázat oblast s přehrávač náhledu v rozhraní Mixxxu. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Ukázat obal - + Show cover art in the Mixxx interface. Ukázat obal v rozhraní Mixxxu. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Zvětšit okno knihovny - + Maximize the track library to take up all the available screen space. Zvětšit knihovnu skladeb tak, aby zabírala veškerý na obrazovce dostupný prostor. - + Space Menubar|View|Maximize Library Mezerník - + &Full Screen Na &celou obrazovku - + Display Mixxx using the full screen Zobrazit Mixxx v režimu celé obrazovky - + &Options &Volby - + &Vinyl Control Ovládání &vinylem - + Use timecoded vinyls on external turntables to control Mixxx Použít vinylové gramodesky s časovým kódem k ovládání programu Mixxx vnějšími přehrávači (gramofony) - + Enable Vinyl Control &%1 Povolit ovládání vinylem &%1 - + &Record Mix Nah&rát míchání - + Record your mix to a file Nahrát míchání do souboru - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting &Povolit živé vysílání - + Stream your mixes to a shoutcast or icecast server Vysílat vaše míchání na server shoutcast nebo icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Povolit &klávesové zkratky - + Toggles keyboard shortcuts on or off Zapnout/Vypnout klávesové zkratky - + Ctrl+` Ctrl+` - + &Preferences &Nastavení - + Change Mixxx settings (e.g. playback, MIDI, controls) Změnit nastavení Mixxxu (např. přehrávání, MIDI, ovládací prvky) - + &Developer &Vývojář - + &Reload Skin Nahrát vzhled &znovu - + Reload the skin Nahrát vzhled znovu - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Vývojářské &nástroje - + Opens the developer tools dialog Otevře dialog vývojářských nástrojů - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Statistiky: &Pokusný kýbl - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Zapne pokusný režim. Sbírá statistiky do POKUSNÉHO sledovacího kýblu. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Statistiky: &Základní kýbl - + Enables base mode. Collects stats in the BASE tracking bucket. Zapne základní režim. Sbírá statistiky do ZÁKLADNÍHO sledovacího kýblu. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled &Ladění povoleno - + Enables the debugger during skin parsing Zapne ladiče během zpracování vzhledu - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Nápověda - + Show Keywheel menu title Zobrazit kolo klíčů @@ -15952,74 +16034,74 @@ Tento krok nelze vrátit zpět! - + Show keywheel tooltip text Zobrazit kolo klíčů - + F12 Menubar|View|Show Keywheel F12 - + &Community Support Podpora &společenství - + Get help with Mixxx Dostat nápovědu k Mixxxu - + &User Manual &Uživatelská příručka - + Read the Mixxx user manual. Číst uživatelskou příručku k Mixxxu. - + &Keyboard Shortcuts &Klávesové zkratky - + Speed up your workflow with keyboard shortcuts. Zrychlit pracovní postup s klávesovými zkratkami - + &Settings directory Adresář &nastavení - + Open the Mixxx user settings directory. Otevřít adresář uživatelských nastavení Mixxx. - + &Translate This Application &Překlad - + Help translate this application into your language. Pomozte přeložit tento program do svého jazyka. - + &About &O programu - + About the application O tomto programu @@ -16054,25 +16136,13 @@ Tento krok nelze vrátit zpět! WSearchLineEdit - - Clear input - Clear the search bar input field - Vyčistit vstup - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Hledat - + Clear input Vyčistit vstup @@ -16083,93 +16153,87 @@ Tento krok nelze vrátit zpět! Hledat... - + Clear the search bar input field Vyprázdnit zadávací pole vyhledávacího řádku - - Enter a string to search for - Zadejte řetězec k vyhledání + + Return + Návrat - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Použít operátory jako je MM:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Na další informace se podívejte v Uživatelská příručka → Knihovna Mixxxu + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Klávesová zkratka + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Zaměření + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts - Klávesové zkratky + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - Návrat + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Spusťte hledání před vypršením časového limitu zadávání hledání nebo přeskočte na zobrazení skladeb + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl+mezerník - + Toggle search history Shows/hides the search history entries Přepnout historii vyhledávání - + Delete or Backspace Delete nebo Backspace - - Delete query from history - Odstranit dotaz z historie - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Ukončit hledání + + Delete query from history + Odstranit dotaz z historie @@ -16925,37 +16989,37 @@ Tento krok nelze vrátit zpět! WTrackTableView - + Confirm track hide Potvrdit skrytí skladby - + Are you sure you want to hide the selected tracks? Opravdu chcete skrýt vybrané skladby? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Opravdu chcete odstranit vybrané skladby z řady automatického diskžokeje? - + Are you sure you want to remove the selected tracks from this crate? Opravdu chcete odstranit vybrané skladby z této přepravky? - + Are you sure you want to remove the selected tracks from this playlist? Opravdu chcete odstranit vybrané skladby z tohoto seznamu skladeb? - + Don't ask again during this session Příště se během tohoto sezení neptat - + Confirm track removal Potvrdit odstranění skladby @@ -16976,52 +17040,52 @@ Tento krok nelze vrátit zpět! mixxx::CoreServices - + fonts písma - + database databáze - + effects efekty - + audio interface rozhraní zvuku - + decks Přehrávače - + library knihovna - + Choose music library directory Vybrat adresář s hudební knihovnou - + controllers ovladače - + Cannot open database Nelze otevřít databázi - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17035,68 +17099,78 @@ Stiskněte OK pro ukončení. mixxx::DlgLibraryExport - + Entire music library Knihovna veškeré hudby - - Selected crates - Vybrané přepravky + + Crates + + + + + Playlists + - + + Selected crates/playlists + + + + Browse Procházení - + Export directory Uložit adresář - + Database version Verze databáze - + Export Uložit - + Cancel Zrušit - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To Uložit knihovnu do - + No Export Directory Chosen Nebyl vybrán žádný ukládací adresář - + No export directory was chosen. Please choose a directory in order to export the music library. Nebyl vybrán žádný ukládací adresář. Vyberte adresář, do kterého chcete uložit knihovnu s hudbou. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Databáze ve vybraném adresáři již existuje. Uložené skladby budou přidány do této databáze. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Databáze ve zvoleném adresáři již existuje, ale nastal problém s načítáním. Uložení v této situaci nezaručuje úspěch. @@ -17117,7 +17191,7 @@ Stiskněte OK pro ukončení. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17127,22 +17201,22 @@ Stiskněte OK pro ukončení. mixxx::LibraryExporter - + Export Completed Uložení dokončeno - - Exported %1 track(s) and %2 crate(s). - Exportován(y) %1 skladba(y) a %2 přepravka(y). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Uložení selhalo - + Exporting to Engine DJ... diff --git a/res/translations/mixxx_de.qm b/res/translations/mixxx_de.qm index fc4aca801b4a358955f2880b661a38cef4a7921c..dc369d8dc6e86ef5f37e482e7ee5372dcf2b1cb8 100644 GIT binary patch delta 30866 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 delta 25616 zcmXV&2Ut!28^GW1I_nPw+N##|Q%-&4^pcX*oibxwENdpYhCfyCPYJ-qX zfGMkyO#ue?GsrskLN){Nj6~W4cx^?t1{iV>*%|0mcVri!(^?|CB0nL!0iA&WN8}}B zcQDhy0({{FboK#cAK(Kz1JDJ)TrU7H9E9gYgY?=Cq!0ekG^8)kdMlCZ@CQQx_*DEs zyw9frFK&yR30w(A&cploIUbAy7>NwQ-zkS&f!8U>EoPw87vYQTI3gS50pv#HVdOjH z8K5)!Ag|#E=OG^hog)JXZ{R(r0>}&piYq541KYL&pf1jI)hL5ZDdH@=UJKBm9k9W7 zEu5kuy@0iyjSFhF!Z+YZ>}%rE#vyCtjEf^}aE4aMdU)-C48`j<04<7Uj$hnj5zq`= zu+~NII|k4mX}b)G1IQSPE8Gvrwfo2|Km*Dn9|O5N3>Ug5K$RO7HXQ+AF1j(XhjD`q znPQO3zYR*wULvRBl5*rupyIlPYuW=iHw5C3Geb%p@bk_^OS&3~KRDYNz@-aFWpSo1 zMc20gT#o?Eb27-k;}*N&`)5`GGxS&sQp3{#J-Y*Mz6QAf$YcDXo{NB0#UDWO<~T$5 zk$4|hst>-eGcI|bG=OS2!y>k@HpoWf%HcJep&Asu=NpvlQ3&zAgko1pxh; zqO1)!;n)o3CMpnfn?&BU0Vv2Krl1?eRyx?ZiDF3PL-BtF#D2i%kIK zniwR*b{S+(`y1rj&wyx!TjJ;mqFoSfRUwG(y@1@VW{?qlzjF(KdOIx~kXl4Du$8xs z8~ofb5Iu0IpA0rA#$_VE06g7iP>g>AVgSyN_O$R(aS$Vxg4Fjsh|x(PRjdzUOe+51 zClFJY0=zkDP|PR^V#Ye$DxAoYSm3BZMR*9%WET*T<{*GZfAK{S(6BUv?CnGlo4WxY z@dZRoA&`oD4bnP~L2L&g3rc|aF9+z$0R|arOtEh`kZR>Y#J2!G>pHS4kUBUpB%jg_ zM6xeH&9N4?yl;@ai2`B9Kd@E0af7EQAbtnq8#h_lN;b#_X%bUZECFDKscGa|Kgo0PvS}p!j4w!_%Ch#N1oJl($gwT?%m1PAIi= z9xnB2D4mEB-!c)(%B?|~=nCZ~xd3gD4dvIPaHnp8N{&Gw4oxsawVmIAr4EPcTYP{W z>;bh3oPnNL3^wNVKq_rFC{9&?Itd&|mNnF~$7A&)8tS#eh-|m_pt-m_Qs>y zEedP{k&ez#A5VoujzRq!Hpur-zewuab~h+dZ)kwB#oWvzEiVRdhXx)CL9*=!4RDXe z`;*Y%`X!LWHE7s;Fwk`$p<%ZdXb1eDQCc&gXIp^XfK1>WW5I5a6LKclMWKZ|TLK!N z^aqi02%1zl4y1-BG>4i1uXV658u+!6V80NV)E-)(v0`TBIJ78I4A;`3)o7eaxsuT4 zc^ru051{Q_l-3Flp>6soRK*?!c_V6J(i~{}ngJy2hYo2ta8eqa>|@aERtKjI>p)r= z3(mH9Y^%r?Hi2KD2cYWgBBK8H zSY+HF?`IlhL;WnA`UhMm^hZUq6PW_6rwXpimI0Y)53VOryP?p!o~#9|LkhTF!U0uZ z18%D>poUC?9w>;gG}xf1R04W9oj{Gb0D4mVeBbKOvx*h)6WgJur#Tg*MlGS|g;2C+ zUKZN_XOKLuV~~x!Vd3;u2Bqc)!F@wAYQ+BFz76ff@aND=BmlkRYvEfzgRFcN=soZ} zuwpwbEbjrmy;g$cng_j;!$I8b3BAo9BY~=Aq3<%BVV*7YJsu7u_AvAtii+pS2k19? z8c03-px?MXKy&*+f2$OLjBtajqc`-&6(Y~tL;sLvKsB?4emlWqtib!JFyJcwU_VzF z@OnM)KJQ_m76H8PJQ#TS4v=Ht!EC%Z9Swu3)BqUK4+br~gDSE%3_6np-0MCJx*CaA z@SQ={-_ODu_h9gtb-=w_g6Ej^Ak_*7&#}=U%6tLO@rgjHyfnzi9|q6e3HU?J!Snni z5SL=W%VYykqrk$Jqs^8VgT5N1FBcnR19w|EX`+RJr7hf0#=?!$ER1+&P_lmqUcTtQ zMNdKhG#mKsAKG>%07U>A%-VU^6@Fwr*wc?%}4K8Gxq3jU$d zKzp?V|8pJC!MF#LcRvM~T?J-(gafTy0%rY1O||s~1TOyr;^8(3+;{W)6GAJ7 zp#T3W4?<_P!Q*rpmU|_jirfXuXH^2e`U$Lfi-yUmA%xF}19BqR!qb_s?omDnF%dRy zK$X1ovq3u1&%zl4EzDbD;qQkKs_!GH^V+68dPDEu5N!#Jwu#4JQ_P1Eg$$6Zh=#l+1&ZemTHA z-omNUsXBqnbJ4MhD1fOw3s&{u=|X*hsh)!}{yn)h?dAj=wsa_cL2T>KNj{`T;6N)Sk% z-N5{8t{s4HFy#26Ls0H4ylTgQ#Vm%`W6lE~T@GH)vH|kJ1aJH90m!)tZ)X>RROt=8 zJzW~u%aZV}XfI3bfPw^6G`%GFGzCMe%E#bK04{mJY52MZjnbia@HHnLXiy-0@9F@2 z;AQw#aR*2NE6nhxXk=Rw;ZI6FkWC5j*C`+P-vLng$sb4F9{wG{;Iv;!0v9n(2=gPv zzYuuUrGz}m0%3iXuzDk0X-Ph?YYwF9 zMm&C{>JaNeIK$6fNsS%00E>Q-TGw#}-=vV*n}UEZYe(vw#P`3PPU?T=KpPISu)Qm3 zaPB@xb&^Trf#)#(oAHMD~eN`rUQX{b>TgjiIFb z^CI3Ly{4cL-bf++;%|XizKRUm7YNdvg~ZdnG4Rd~WQgYjkOtTj?=mPm)%uWOF?f8( z7bnAgGC=Y_Lx%6O#;r^xBc6BxsjCy8#^GiV9bXck@GC$j3?(B|`T@<_MtnEo`A^Is zeomi(^{+nDgWd&p|DhR5e`3R(RTKlpnx*-*I*@ExIK^LGcJ zUUkT}iNin&T}fif=Hg5Sl9)Z8fkSh$W3@GqwB}^LTQ;x;Rmpx2{QRk*WWV27APw)6 z{r+gS8^nvsNJ8!$w1$zyoH*+W=6iHKDne z1_}@t2V@X(Cpm`aokcYvN$sLBIrWAlIiXO6S&<9pF{g9BKDk`-DoEq|le8F2PIUc8 z(ymVjDQG@PD~JNxsXDo0(-dIXL2~sNTGx)NNJidDAQ?X7`YzOn4oPNmJ^2QPR8izc zi>m;q{uva#_mdm#?11i^L~hdBAX#l7Hv>KZnb(NilDmTVR+(gyX26#9A(=i77`87Z znIq$XRj5ZYe|UqaGnL$}p9pOEOLF&c5Qr(2$%CUjfRQ)JRmuzP}p`^liV`6bf(GV_1&^SIyNVH0eBj` zR$4g5nS5;G0nqRg`M4<>#Iq#wDHm6)Y;W?z7lpaTGxBq{9SBn_`Q0QFjoc0L=P1UD z=0`!4hU1dv`%?P+CctTDDtls>{6VJjrfry**g{Qlm>sKIf)?|#1HNq(wMsn+^sXB% zex?i_qXV?Wz(AlI(rC$9pMj3ds@9z zCP=HCX^jKHV3wqKS}VyHK>I~&rL+Jtel)cij0vK>5wy-h9Qn*VTIU2_?;A%O^y~{H zw535B(1SL(j{d>TQM93c2Uy9D)b3Xtx6)?KdI8^D zoi=}Ej~-J2ZIS#L^MB)x(w3u9>d&On)}6yaa)_r6VU8e9UZ4&b`H)13c6P_5K9^3r zJ_!NI`7L!UxdZ6gC$u{Tth7M{?S36?$H#8eIrt7p*51_3BNia}h(Y05pSnH3rT_h# z_6)xbaCQOhT|XSiqA^G_?yYwT+Iy)A^zlsEXX#pi_SI?M4XAo26r&#F7|2N3`j-U!K^5woj$1He z1@-ex0@6#Neg)`LMwsZ>m5YJZUQ5TBbH9V|uR+J<76Sj}M8}s$A@u)2C;Qw6R^lU_ z-Si!1Hc!)eNAIE;K0?jSt$r)}rR38`7{QblE#=fVP`ySbas>i!8xXA|AJpfr%?CF!;UdqFCmMzrK#Mc9CilT=fJ;0>Z zID=%^1Dfz54e0zJdJG4`UYpO*V^i>0lnN{Pq`dK z&t?lfb>br0?dJ4MwIqPw`)N{xP~cCB)1FpqpgFWyGs8Wln>$2tJn*ovn8>IV?_o?c0w z4%|P7rd#9Q_PasT-If6xxz57ry=eMZ^m20uy|xUco0X?G18bp%3!pc%&>DWoq?y4E z03CJuz)=P9s4;yoIt)aW+4NzN3SU%~J{%McW>I_&&Gx{hnDLfok17SkswT~8iweW9 z9?fmUfRsK&bGxIif7OiUp1BXaqchF@f&s?nbo#O`dd(qy>Dx6{z=tK!cMGgR>SISg zs2Ey}Z%9A3vIeoVBmGfu7=*VA{n-sQV!6@u=aMv3bnA#A4G6>Cf|4t;@Uu_Wu$=cOk~|N=i@Nq?dKiYw?JqF> z3JTH8t*lrE%EXpQ%qkks_tCDbIOJn6S&9{}jM*&rsjT>86r#fwSgB}tJkQHnnX{Oz zwmZqn$NGb`^e3xa`5f@mX{>V02;lM7tahd5KwsFiI?ZvQgRU^!asEK#?z8&lS13#| zwOE4-99Y40*3c2X+%9{WT^sat)T*orL8J4sCTms+rFpiQ+3$`6slpuArU|CrXZB-l znxU(9=`U;Ji#FipDc1JyL$m?^u@2*`Kq?u}I@+MhZd#jl%*GX|QGs>NKL)g2Th^6$ z1N+gNnY)r8U_YO-Zaq+%&-7>A&=n_YB6ED=3&hloxlX~#M$Sa$x@0RR5@s>iFqB%; zVdi>w4Ul3pnEUx&AoZ`q+=~>88#RHIq##k>OU0bhQQdF@4M_ngRv*0l#|@IB^z3_YP;mD#W!r7+LC zla2fjWntVdHflX49tKZiqie@uoIu#<$yi)CzmScMr$7o$u!&U<0g+?b#12U5ADdQp z2f*hnHm$b}F#IFIz9!SmclNn*8n!3 zF~~-BG$=V2W0&6)Vsh%dL7rZcr48#l@(8Gq^xY`Ai(_Pu^*Qo&CyjbRuAgqFfu{(3kXub4wcBg2mR=sC;>!D+D zs}H-2={U*vC%ZodXZ~n9%W_=@tnXZwRrEz#EPI+i5+uiX_N+RZ+439N^BjRL+7R~Q zziuGzsOhjQ5^ z0khzY8+m>6aIU)Lg9xe1)g@S%N`Jt$>CqsS+Qdy&85TCqavhUiVsvkAF8LQdnplaK znuRl3@`;z8U=5_}JzhEwoyc82ynMYexOXLarI-uAbI0?_P5WW$r53Ne0)4oZY211< zdN$E3d9|i^ioR#@YLDYU?Cs8LV5lYje&V$}`vWX_%xi5r4@7g~wVk?v_-W1S*xv%` zcF)Y~%R5f3dH?DUVp3$aI2HNesB!%eeHO|o(f(Lvi=o>cXGf+jdmCN{yTZ4i2t;1)=2F^P2+40_30r_U3(@8$J z{7n>cYi_Qx1Rb4ge4!O8ve$L_qE(pxV+G~;()gWNC|G4-)7l1E4|fZ_Zdf?=|JUnl zSgtpOSh(?pL8(~`4?E}s^tn3^r&!yI&*iH&oI=mXm9Ilzk5=!+*LTHAN#E{#!)BC` zYS;~YpE>*w-dM)>tpxmn zW=M+HXOQT69ScB~0IAqtBpRDayO7ox4L3nn!|P0B4ZI$StPQ*}McN>X{%(u(=KHoZ z#hOw#Bu2~SW+R&;o=4v?D2X4}(IdK1mY+P3 z4RCq5L8<%-eo9M3?>CsAiNu^RuWIIJ66)ce+~LU~=t|Ai`1yg+AO>CK=L2nk%sId> zY)it>tTMk$@q_ie_~o+w(B1ya)5ey>n$RVlw!sr4oJaf$x?Vz!>1YWNQ01|$| zAf5G*-(8DoxU6^lKDOcT#-owwsx{uuAI*CKw8LEfH~}Yc>kEJOBp1EkwLGV&)Y9w; z&l!Y00d-6~cTp1{19n* z13+pY!@uo40-|{d{@ochV##d&V|i6P|Lc8>7i>eSg%P&=2bx>{I*kAJ7zZLKix*;h z2915h3lE_Rp5-M#FO6>cDgk|RfaJvsZY=dnA@*bgog5`ZIu3m2XM?cfU_42 ziov^t)Ci4Qttg=iD?I;S9}82>h9Ek<6{a32Tmx5#V&IOE$`esCHwoCbzoJy&XCSBh z8DwWhqs2`HQgW|BvFog;jL9nKbVF3FIu#?OI-&}?f-YJ^6VWe|zmuMD$1=t~3G~ZbUQz_R)3+p`WV0kZE zMA+cS`-v8ZYG8;JC|a(IL8tSqL7HM?Pz=E=tJhrMjtfPbG5Gn7D@D6bb%7sC7442y zz=US3=rGCy_@uhR!R(1HlC()UthYuFXtwCs>O4B3Ced*ee(|*q2E`aEI_^W4wcZ@j zNn`?4FD^Ru#du(MGtudEB+v)HM5m8Vc#MyW&Lyq`OR*E3A7=uoS4VXFgIoFBLv#trgA0XVG;t$ky5Iy>|z<^dm~6+>2IAhYMSalMTtQ5B!WmWUB_;=9L{oRPn7T3%mw2}b82lArPAf61 zZW^$tm0}i_UB%c!F*^-YDxHTK6pu2++@kBQb;Z0<=;74bEke@$LA+&RaV1Pf1*&54 zT03A9yNM-kLxBV(h$ZpZhE>DHpkyAfMJ$g9!j3o(5r$Q3YNv>>CT>6vjuv4phl2>+ zF2Xu30+@j8egUB3V1s1j41?5E(!zsr2BpF6MOaarO~puqWaL4EbnGw@HXapN&?|!? z^ri?q9gg`wJ0}sAj#8gh)gT{=e|Ui-Z!k!#JcK!)6Su`$1r^JYDPnC;6ejO*ioITk@P(?~E(6{@uOEJC%g-eQv2%ZPh)XySf zpFgg!PZ6>H*P^d+gLi2!B7fZh*w9);mCVNU`8N?Yq8mVX4H2~}0KL|MV$+fcAV>ci zq^7nbxQ=ElOz%&E&-i1RvgJjBi6)ZP^6y{M{E8A^6$Ag`e-cB zM0au2{2AZSb%{7WyB4rBCk^uGW#ahS4B*E*i=;#+R7@4c*}C~aChH=(We|wIn?>?~ z+5qe47!=ihiF5hbh;VYUIR61p%PAr*VCw}Lb=@G#d25jGB;w+yB2wEiyFVV+ z-+RREyK8~mJ}By%rs(4YlNLIdyR~0$direE8@gFDNw>yZc^QOqx;()FR6d!wffbe}UzAZ!#X~8Q|$QA5XE;El59WxQoRG>!VrgZ6k=pC4Kx$e`YCq5#GoU-A4nxpfI(3&EBDMq1-XV3YQyfbz-=wZR*MQW} zLF#(0Gzx2kh0~f!-Pf%Fc5|lWG|>kei#}P{Og6}d-m!4nG=oy}Dw0zMzOTVH$+eC- z1sg`wCD(A&1NsE1M++HCs&P_}eOB0b_`;x=P+98va4;}EL+als8uB#)LDvbiml z23AGC-Zohp_-!VTss)ngODhm<*GgWbEXMa=C9gGjIugfALtd@Mm1r+{&&E^c(Ms|@ z{1)KMaA}zNAPS$~9cfq*XI_v-L}UZ&_)_v|+6~x>3X%_YyF$t^$;Uq%ct>mLlG_z~Z&JloY82qP06EMSblGQscH#bWw{$ zza`REFBGbIQ>5(!-vIG`W{{nZlC~f522y^G^k44{=y=SMc2_C{aZX6PYa?IvmUic$ zta!GzaEe*lYr7U`ZV72$B2M5=J86GfEb!#9(t%18{r`1OqyxAl5+={$M_PjvJWo2@ z!Vbi?ZBl~ljv?89Qo^ejKrT;|PE4=@es{HWsw95V?RnBEm$jHHo*|uCkpLvWo0MDv zPtWRfDY@hkfcN{QR9#^Gud$T6#R1^Y0O`Vo4D2h;k}ehtLf0%+y0{GcKd9~`U7mtV z@??v2b!|Sty9!cz7Y7jFDW%`t0g^|7lu;Ba`GiOrA8h~v#!EL^qmTxlm2Paqwj8lq zy49lw@cmSo^#iY0A(NWog*N<=o zcAt~pSIWV*-xgB7zc~~0|C^=!*EnO_Dbj~~?jY>mOW*p21GIV|eVcj$9hCLbcUQbW z$6NaO3Yqm-`dzFaz<&wS@3|PhSNkLV4nkISmj1@af!KXg`iEtDaGoc#d)rXjr^#aa zC}6J6va~82#BD2CjVi>%u@I>MmjR7$S00gcz2b8?kC zr9u2Q$yFVGVUDPtY&|Lo%W;3@>V-)FCA-Mxq8DV)FyjV~PLgYe%m>v4HnsfG`F_gXz(qN zAWCk0+ZUkJGlOJEqTKkiFR+ykX1S$?ZgWF-xs{7I29?$1)|+q%JqzV_jfVi8|6Oh$ z90+`+jog8|f$#{GJIwwB{A>@oOXOfY$1~)v6s@IopzN}>5JU!*dwC{fmh6~8p3`6M zEh!*Ps3rHUiZfqnEB7^H59saQa{uvxz$%(g$o+5QQr`J0dtABza4{H(GrQ1V9#{@_ zyJLBI(2fjjwYVe?{*eoG#Z1{7bGYJ6t~`A0VO-i%@`x6=rx#bsBjzN4_-H4O_=(YP zZFkw{)_4#roaK=XP=&8?kw+F~K!?7SN9CYDar~-0dh}sTP_CURkA8-Y=l_kDr(iKj zuygX95J!M%vGP2>G>lR+-Og!X?z zz8rR`JxC%*4!gb){qmOwddV5f<(1#hV~1mRdCj?> zz-Ncc>vHM?PqmVZ{C(0bUyi7aVZ8luIb!vBv=t-di2XRR-o@motRSElcgmY51^{dL zTi#ON1^a*Qgvs0NMgV=gOO82;BYQbjjyV?xP`jzTz0pJTU~bAgQEFMY1UdFP4rF$` zyldxqU<<#<{~gT7rj_pU?qodI-Pg){W@Q6;T}R$O#0=!sIynwPk&oqr<**5*#}4`6 zoPQwRF*)9x2TW})AIZl4PqxinK6?5qRzRj16t%PE6ALj8;QQp0_C-I`Nj~)$HDD`S z`AjGpo5~=c^`8c;Y;!sJT63URtH`N~(T4C{^7#vy02O=Rg_pxVlr+jbL5A=ZYr$2KjzZ6uw2la(2_o*gdmE&Z&zwqe8g+ddV8hf(iNc za!gWvXd=J9kJ;`ad*s)TP-usimf!G1Z29n!%|$QBphWrYN^~mQPLT6k=K{R>B7a(i zm5sSE@>lyR7{!|9Z!hi9ifxj=uRa*7Vn$!l~s)zhx#{;ogf^1l{yVkqehuWDs>v6 z@YHIc)LDx8f1g%LowsPUOdplH4k&C}?38-bD*+kXNojZw&F1n1rBUm{c-(p`jb3;F z8*^D{ytOiRGC3(t_N~J*T`{G}M-FU&S!vo2b$pvUO0(x409Vc{EzZ{hSn)(@sqF;P zprq2eb0JPJaH-N}1b^J?8J3HJ%*WHQ(D~nYtMd@4@_iRQV zgZyI&rF$0o15bu2PPPmi5;VoRGwKZhgTz0{pw#J#;_Qu2MA^4eoCA+wdtRpEQnDMC za>^+#{&r~po4!|EE~62dlc%_4pr$(>rMPEd1eC^=-Xm~?(_1LL55)lwEl~RG8i}VM zMCp?m4dU>5#j|G_AnmdhubXkeoNbjMEvEx<{-Ah&^8j*Tj52Io3J|v?%EX##nmEfW#cV#Eij4yJ+l;F5qH~?7*+1v$S&)U-+2x?D`B4kVq@|^~6kQC*{aRf1vrF&B~Ei zsF5mPQI0psLk06gIdKJN_@huc@w_kaPWzP;Z!re!)KNKEw-9)SmvZuNBuLFiDoN#2 zK zdV+F|B>;R(G$`iHQ?3PF04R8%+$?4XY|k*|mR%}l$2KdsnuK9TMQJ7TZV-O|n+nRk zZGqTkQ&P#=Q;1RQO(nY`77}w4l&1|*)s}muJS&+EXT={LtL^0)0fECad zpOruRvHyq6d#3zJ>;`N>N9Auq2GG3gDs7pBsnjwm8@d+Q(`5$v>eVX4js-r1sk~_9 zPYg1)Vbhfc$=!dd?u9mD&I`3< z_(JUeYr8@%)gB!SPam~ZSL|{ve5jW1g1*`6T59FvxMgAfYL$2^fPv9!)rtPVz6?;U zeGdZVebwr3@fdDORcn>C2A1(!tySf^(#us2hDYfp; zNMPGPsP#ITYXi)DuiCoQ0$Rq$AnPz+ZFm7Y8@shpn@pPxJfXPSEDNQ2xSQH)L|N1e zDQau$bwFL4sjaK2z&G_(+f3O3bn|PqP2xfj`MuPR1h?Yr54AJ8_58|Hwez7ukUGpz zy9Ry6-0)%5Df|SsaNbZ|%=p7n&>huvx;4P_3kJmmWR@=)oouz|7&Ib-N*E;fyQw|z z*@19>ul6d5dSTEEwO2iFkS1MJdwckR@GYzMX@Rz+>KS$5g>2yWny7Zzkc;^(7!_RqlfyFAtGz4SJ=RA;EetGB`EcZE9QQX!DaHC3O}!!c-N>d3b* zfIH?H6r-xBW4!Q-A4RHTMiL;w2h}k%eu6Y`rRtaCfU0(%g@3ykWa}EL<9cu)U91g? ztPpkF0Z{WNPwZ?!XPK~XL-t`0* z^>Bd$kibASvD|Zj>-p-D)xRpn7st4iNJa_2g*OhoxM~X^AG5G{6AOoxH7K>)sy+#S z0qh)ApC9;)17EG?rZvMZT2J-Gq#eLlyQwc$m`7t|@=kr-AN%^dcd*czs;?*80HkeG zU(dOUVR&mbZ!3B@m3F9alD#o2K3jd0wFBT@g!*m_#&~mm3`!pH>ie*r_;{_4`k`4i zNUhqd1q@5B{?pWNw=pyFsk-{>C>A_Z_o=_bF?c;OO8sp<7LPCT)!*09buyn({|>=D zav!S}PMQu>9 z_$xF*C--Po0`Y_AzG+p9t00XSqE#(G$3eByYPS(UPd3)-c191Wfwk6P0Pf|%t6C$c zAPht_&F(mAx~fr{-8FY0e65Jo=y#|r4M$kRC=K~KG3{R3Og4Rb`I;c(6E5SH&}-`9FK#?$f1 zd|c~mgQb&wTUx?E%ZEu1w{8`ZuHTDwCQHcc}~x`$Zk>|#*r`VEP`;1EB}_e2%k^6ob+FPtMZ zznU0$;7t5xPQX~LtLArh1V}AXHNQ7_J;qV<`+-kNcWP#kht<=@J}Ll`c}|;flVRyK zO`B97g=}GEZASb+G)_~s8L8Nu;{2Z$cmj)9f5Wudao<5IaaA*GCxDM{qRpS1g7!au zueJbFuKanl794}-^?NZbI3obJq)-cfToK5+5N+XPOdeM;X$v=@G(Rk+EsDhfb@$Ph zH}e2`>OXCH{AVmUeAQM&9067>SX=oSt6<{`v{gCHG3A1N5LWp8`a>`e0#&a|R`kYFgw2 zf2@Yx&>{;lg!8MXMb&fxxD>BN-^Ei?bD$Ret%xPGty@qL9S+yFb&dx9YO=O1$c#&N zKUmwAKNWAB(qfsqxzOU*&WQv1&njg8YQ?Y|g2 zhW^&t?y>bTzqeT1Gd>L)6Uu7)sssRa7_aT?@C=2ttG2%b9?#Ytw1dxP0e7!&P^#yy z#hWwk0E^zF9rBtF?6A9bD84@`8d*zl!0>xno|bUC2Igu&OFW1kPOhzXyk%#QmJZfV z+`_b5P>exdWurmKajtffy#vwJOFLQb0h;AX+9~Hi0BM|s#R@DO`p}@%cB*Dh^31_7 z*;PxrHVsIrjoR7jm@@TWpe5hI~aUm)hlx7l1i5 z)Y2mC0BpW$=|4j-M0==RuYt$RFG9QC@hs;5Pir?#TY=qcq1~E|PHm%^TBc0~h>h2@ z%w>3Och#)j`IwI?GEK`qk29>;UVHkWCYnoU?b${QFz&t5p4UdF^uTiM`Cb&B;IUfH zK5yW&zH7PfQh|mQYA^rA;iDGowY*l?3pRJFmX~}8_<@ny8y5jkSWzozk&89oDq6uK zACPP&YhP3Iuu}R;`xzSq(qeO{_Nyu``GP|2&-A@O<7a7qN8>3t^F{kN76-O{iS{qG z5a_ofCebAZoySooX<`zH#_=X)4=Rx0l_oXN7szbMq<+Eo5BO~==8mUlYNn~gxoLo9 zQ&Z_+29nbrQ`x4tGR^9l%D#M$bpvWDSN=Sn|GDQ)6-xHQCm(!FmF^Yd|M9WQR27p- z@Ti!nT5vajyD_Hfp=&Vcyke@JhzUs3eN&AXeC|(OZn8O)1O!f->g1pX&AxAH=$(yi zb@`@76Y%)8t!Qc#5)Sm?F_Yag2cY*3nCy<@BU+`(nwn>o0x|!XsWm?ZW*+&=)LzcQ z)b{b@7RFh*&I7kcUnYw=oLhm-xdo@R3MD#Xm^B2&*wnIQGQYjRgHVd-Dp)W^mO=(gvkzWp6BsE#)E z{gI9Fe>GzAu#3Z5?t7C*lWgE$x|)Wrn}f#Tk!g5E50EMkH~H+rnPs;!jf_O2@+RFh zGNn0?8$qT~_&hjExL_JnHv`1lJk$8=37BA5WSUqVSF%PM)8vZluo=bPH05Om3hP|c zj7K=|1+PsrXZX~U&1lV9uQP?T{{WodNdSWu)PMw z{Mn|(Tc!cjtY=}%D1&U$77GKNO-mXy!{_>@n3gwtiYb-?Q&@K_a0Xs7g>A9MJYkAy zMGsU=zF=B4bsgUSVOni=u?D_1!L+8sTTC|pG_Ao(Cd@i-T64M+K47%cw4p9qKgUE< z#B>zOt7)c)yco=WO+liMczd5QjWe@N7AG;p6#D_=`4iVoyJDYXc594fB}_3T6@5_i zGo7`!1ySLY>Fgc!0ejCgoy%~?3h6#mO27l4?ZZtMJB69 zSiPELx{E0q(W8y&;kw#bNGLEpj6#J}W}hj`79EKLuT5ENRs)awX3E-+wj*wm>4}z) z|G~^i)03j&)8Qqi7Z)>uj5%U@`y?2juDNA;HyAZ$v+kx3AE#sf|KDKK$9PPmt;{nO z{K6XUv^%CxX%4`S2b+F+pl^6+zUk+F+`IU1reA&W6x3g((`}CU1mhc>{>4WxW-2-> zl8sfnb@49U$>c%0sQ&|-6pmq)&<|`^#Z>DZCj`}pwYk| zFV!1dDFo3ZSa0wb`~O5!54}+y>hM}Ny4}@^06%Z)cDZT5zmL(I{^CI17V0f(hoe1r z)mwhJiDfrcZ&h@Cv5G-4be`V&E?QBmzk2(|?jYKa*E?3t#8gcuy-Sh5Uo+aEIJ-yh zT38mujP823uD3yyyRSQzHD`d>`b&2VKrP&SP^cd3PHVnkA5eLN zRGDqzpKyb$c0b+K6KCGwfbP1f8}|8D)O)1fMB~(2?^zaQ=8S{xUOxp@@h!dY035Jw z1%t%j(;!>*O7CmNKk(Uu^}Y)+X?#9L?{_c>TO(dsIPH+$KLo9yTUUKRWo%T=tfdc} zco=ByMY^Xa%0j8Hx@U3>nrS!WcBEPN+G7X2M+4n^_y+*HrUvPX&-(BsDD6it>BBEx z0J6YUAO3hfkdAS>c|;lfKbi`D>OSkdLF7rg&llwDrn;|nAqdy9x^M3!5cPcYF$)ia zm{(r+d-@Q2#oYCA3($4j>!nW$Mx#P~^(i&b4WG1H4=8sU#GeiN^m=w!x}B%b=ogKT z>#ovgQWUhy<>N6+c_n4NO^_k{Gv~uqHOx#1bT~iM{lLxfkb3O3IOJGh% z_1WoNKuoKu&*_cF=Y@O_=lNyZD2)liQjIHGa0^r**}o2mIt-!#=3 z*qX2UrX)P~wb$sI$6!X}>q>pgSziznH|fzYeKDS2pl_XtD^#hQzDiT=#-iVQ9ZF0meJV&J@F=<)7eZv z{$we@wU_#dMn!i1k$$FSDzMHb{ajI&+rOfY55j^(X6UIob|6Z8*3VNEQfqsI{A+E4 zQa3yO(ulX1$e5*H4R8b+*icXJ{uLXQZS-po761&nuisjU{eL2NzJ9xQ8qiBy^~|tZ z!2X-9-#KZGnT(J6orjoa^E{#7ZHhtZ><{`~x2u>&JEGs4hu-hT4f_46K`7Nj^alZ$ z0~#|xf1H9zsm`;I_BFuIRZ#qVfEv zP10YiL|y)9hMrde9fX>Z`kS6#@R6*8`nyfGKuY(wnTu7{&Q8I4nMo4QZa8-81X0IB=PbU)F z87L9+`jhTbJcd*jkse)0J~M4Y8;JdT@6Tn3?jugxZIJ<%4tdVsi(I{?DzM&c2P0>@_v z@!0engcv3HXj(b?_lt?|UNqy^r;-7ku)o!-$)J_pF!&rp2IF;3P~3$KE2A;HJGGk!vcjpvaX(-gW~1r!^$XOAV6qa}u>2 zG5T&XnXn=k_#sYYVjm1#RM(Q|btnf6{YXr{FK~)_5`zHM4_T$Yh?P(RSydH_kq|rbwe?Q4hC|8M zQ_(9<>_=9QXaXRSW+(+Ul0v=)>;LCJCWgK^@IOMy2K{P~o%0|Y(47`$KO`GX>Nam6 z*@U(lr+q?-5|!?{1R)tFa2UZ7eyE9)SBlu9lQvKwEA4HBzzlC2)@xlgi}H z80GFls>WhI;QcaEJ*p0uY%-}iuo}dd?xZ$!AP8rFBel7KAnYn7$F1?eV)|=xazl5_ ze)S?}x+H+;G>ZIu3wb4b6*>3$WmHNd$@vw?1M^3di(QIA>Nb@$hUwKH?%qePoW6tS zezfH3rdAMrvdMLj16WKVO+S`_to<6fMVs)H%X-o*cg6i)MVi08ireWCY2M+9+v_^H zdnOlzgq@`2$2gEBI+FWJ9ftG!kU!c_qKtPY&&MAJVSgNXF>fB`fc?memTce#>B&od zn*(B$OJ3Oy0Ac!D@-{gaxa!5E-2y$F+y*n0X)jUe8wZm6UMk{I4DQd@RI=KR0fh?M z;~a|AKkBGm|J@*^ou>}IuCt;3W=Ykr=fvIfg9#TN1P7@{)&o*C1D`JXC)2yS`0#37L7<8h*|F<8qtQzB{Iwm z#WzYi#sY1-U6<&`+YSPxr_)bc@SexkB06sVa1hs@r{hPUdHr)B9bbWgiVuAuyIh@vy5A|i_l>CC&IU@gcfnvn7JGE5{XR+)uBYj!M)^^hQ^#di8xxZ`32E?(b>SfF)R9@kIw@XU$Lwy+dz* ziDq|wJH36y7i1TF>755rASOoByO%0aB&+D%2Qq-%rSx7At|aM3?;W`goV+uAs9!@t zm^qt1e5L~7`(XNKr5a$oC4IhT0dU=)&=+xT08>xXmvw5u^VjrEdL~A-Hq*auAWzi! z(6?>KD2yL~r9lc<9S4s8l z^&&{a0vKR9E$%nYNk@oH(%+?##@54l9I}N?xL}1;%LJUIYvYuhM)Ek4Dodb&C z#g@$eK^urxw#<260a{27%%dmnn#+@!$4^nfHw7@yAje4C2-c?JQ$=X2(lh9=j)Q&_-}C=l)!vB1gLz9gOv^1yt+o5?K5 zy$^_Gx7kn+Ez)==3;wJc>wE%PuqqGuq8luDSplk&DIKsfxdR@nVZ%-|pa805p@k?% zU?dy0G!r zwybz5CK|jiv5p|sF}A(IA4z7-b{n95`M`T$vC6@E#IUOet9pg;{lVd^daVV9N(QqU->$&- zS;A_rDuD}8vy(YU^NY*a$@M>B8m=#^Q{4h7vyIiIYye5^$LdGOFl%1O>gPm(DAcku z_5~P{8Eu9bmiZetnxO zblb~b&p;E+SH|8Yx1!6ninS%hgZTP{3Z&I>Jo0}Jyrfn?$Wc zd038n-*T57PAd%O{Wx#qD}S!^BV*un?iaanfSz09XbdmnGOdgYc5~A>!=+Nr+2~io z|>4Jq{~E^;dO>=jiI?9o&o!8+k|082wM)*21{1n2&Tede`%B!i*ddmdcIC`wRD|(JoXNVrML$ zA{00qOXmyAEsd#5g%OShr)@%S~}%v z)x+59xuBDbJ^vEs*erLl5{*t)Qtz#XM?XlehUF!av%#iBIwqe4?;rt^K?e%Rz)vM! z@_^|Z{6|OYv?*SOaix-rqcuchn--G53nD(eA(`KZFvv?JJJ0`n#X4H4&?d}Y7@mbH{1}al65!GD`Mxu6Ibng(FRt63e+Ela0plHlv=q$o}tsK)Jbxk zMxJ5rRz6FkH4ofPf^eL9!iQhs!!r`hE$DYfLndN38#|T5T>R8Rih&y^cD1$&&r<3B z?#ldfZ%c>(4K73`WPIpKG|%1K&Mh-MnIQ|b%E0LnPk zr@(;`8m&B4qgBdPYMf@OLZ{NGaWJKPat0z3sZeJsQsl$sk*ch$EcrN9yjG#jHjiR> zS}JYlTnyX}$;I$?A#Y)@qyjoiB~o{;pXq5o!;>#&?a_Zz!emZEO*q8hcq*l6v%C+shTD($6IquYc7X)Y)yrs zco^Ov0&yn(cpQF+88HREtHZZU96S`sp+I7o$YNRoK_#3XC?t2$dp<>Bi{ITEtELn7G#kW!~QDH$v~Y%OB)ugOi?E2l!@{L96*_|j&*W2 zJ`g(f5Z&hB-{A1a+5LBoJ#f~Z_#_jtPekYj0fzmxoIUfv2d0L3X0jw2`iPzE@P This can not be undone. - + Dies kann nicht rückgängig gemacht werden. @@ -148,7 +148,7 @@ BasePlaylistFeature - + New Playlist Neue Wiedergabeliste @@ -159,7 +159,7 @@ - + Create New Playlist Neue Wiedergabeliste erstellen @@ -189,113 +189,120 @@ Duplizieren - - + + Import Playlist Wiedergabeliste importieren - + Export Track Files Track-Dateien exportieren - + Analyze entire Playlist Gesamte Wiedergabeliste analysieren - + Enter new name for playlist: Einen neuen Namen für die Wiedergabeliste eingeben: - + Duplicate Playlist Wiedergabeliste duplizieren - - + + Enter name for new playlist: Einen Namen für die neue Wiedergabeliste eingeben: - - + + Export Playlist Wiedergabeliste exportieren - + Add to Auto DJ Queue (replace) Zur Auto-DJ Warteschlange hinzufügen (Ersetzen) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Wiedergabeliste umbenennen - - + + Renaming Playlist Failed Umbenennen der Wiedergabeliste fehlgeschlagen - - - + + + A playlist by that name already exists. Eine Wiedergabeliste mit diesem Namen existiert bereits. - - - + + + A playlist cannot have a blank name. Eine Wiedergabeliste muss einen Namen haben. - + _copy //: Appendix to default name when duplicating a playlist _Kopie - - - - - - + + + + + + Playlist Creation Failed Erstellen der Wiedergabeliste fehlgeschlagen - - + + An unknown error occurred while creating playlist: Ein unbekannter Fehler ist beim Erstellen der Wiedergabeliste aufgetreten: - + Confirm Deletion Löschen bestätigen - + Do you really want to delete playlist <b>%1</b>? Möchten Sie die Wiedergabeliste<b>%1</b> wirklich löschen? - + M3U Playlist (*.m3u) M3U-Wiedergabeliste (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U-Wiedergabeliste (*.m3u);;M3U8-Wiedergabeliste (*.m3u8);;PLS-Wiedergabeliste (*.pls);;CSV (*.csv);;Normaler Text (*.txt) @@ -303,12 +310,12 @@ BaseSqlTableModel - + # # - + Timestamp Zeitstempel @@ -316,7 +323,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Track konnte nicht geladen werden. @@ -324,142 +331,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Album-Interpret - + Artist Interpret - + Bitrate Bitrate - + BPM BPM - + Channels Kanäle - + Color Farbe - + Comment Kommentar - + Composer Komponist - + Cover Art Cover-Bild - + Date Added Hinzugefügt am - + Last Played Zuletzt gespielt - + Duration Dauer - + Type Typ - + Genre Genre - + Grouping Gruppierung - + Key Tonart - + Location Speicherort - + Overview - + Übersicht - + Preview Vorhören - + Rating Bewertung - + ReplayGain ReplayGain - + Samplerate Abtastrate - + Played Gespielt - + Title Titel - + Track # Track Nr. - + Year Jahr - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Bild abrufen ... @@ -608,6 +615,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. Sie können Ordner auf Ihrer Festplatte und externen Geräten durchsuchen, sich Tracks anzeigen lassen und diese laden. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -805,7 +822,7 @@ Rescans the library when Mixxx is launched. - + Scannt die Bibliothek erneut wenn Mixxx gestartet wird @@ -2462,7 +2479,7 @@ trace - Wie oben + Profiling-Meldungen Move Beatgrid Half a Beat - + Beatgrid eine halben Beat verschieben @@ -2473,12 +2490,12 @@ trace - Wie oben + Profiling-Meldungen Toggle the BPM/beatgrid lock - + BPM-/Beatgrid-Sperre umschalten Revert last BPM/Beatgrid Change - + BPM/Beatgrid-Änderung rückgängig machen @@ -2665,13 +2682,13 @@ trace - Wie oben + Profiling-Meldungen Sort hotcues by position - + Hotcues nach Position sortieren Sort hotcues by position (remove offsets) - + Hotcues nach Position sortieren (Versatz entfernen) @@ -2762,7 +2779,7 @@ trace - Wie oben + Profiling-Meldungen if the track has no beats the unit is seconds - + wenn der Track keine Beats hat ist die Einheit Sekunden @@ -3526,7 +3543,7 @@ trace - Wie oben + Profiling-Meldungen Unknown - + Unbekannt @@ -3631,32 +3648,32 @@ trace - Wie oben + Profiling-Meldungen ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Die von diesem Controller-Mapping bereitgestellten Funktionen werden deaktiviert, bis das Problem behoben ist. - + You can ignore this error for this session but you may experience erratic behavior. Sie können den Fehler für diese Sitzung ignorieren, es kann aber zu unvorhergesehenem Verhalten kommen. - + Try to recover by resetting your controller. Versuchen Sie, Ihren Controller durch aus-/anschalten zurückzusetzen. - + Controller Mapping Error Fehler im Controller-Mapping - + The mapping for your controller "%1" is not working properly. Das Mapping für Ihren Controller "%1" funktioniert nicht richtig. - + The script code needs to be fixed. Der Skript-Code muss korrigiert werden. @@ -3764,7 +3781,7 @@ trace - Wie oben + Profiling-Meldungen Plattenkiste importieren - + Export Crate Plattenkiste exportieren @@ -3774,7 +3791,7 @@ trace - Wie oben + Profiling-Meldungen Entsperren - + An unknown error occurred while creating crate: Bei der Erstellung der Plattenkiste ist ein unbekannter Fehler aufgetreten: @@ -3800,17 +3817,17 @@ trace - Wie oben + Profiling-Meldungen Umbenennen der Plattenkiste fehlgeschlagen - + Crate Creation Failed Erstellung der Plattenkiste fehlgeschlagen - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U-Wiedergabeliste (*.m3u);;M3U8-Wiedergabeliste (*.m3u8);;PLS-Wiedergabeliste (*.pls);;CSV (*.csv);;Normaler Text (*.txt) - + M3U Playlist (*.m3u) M3U-Wiedergabeliste (*.m3u) @@ -3936,12 +3953,12 @@ trace - Wie oben + Profiling-Meldungen Frühere Mitwirkende - + Official Website Offizielle Webseite - + Donate Spenden @@ -3997,7 +4014,7 @@ trace - Wie oben + Profiling-Meldungen - + Analyze Analysieren @@ -4042,17 +4059,17 @@ trace - Wie oben + Profiling-Meldungen Führt die Beatgrid-, Tonart-, und ReplayGain-Erkennung bei den ausgewählten Tracks aus. Generiert keine Wellenformen für die ausgewählten Tracks, um Speicherplatz zu sparen. - + Stop Analysis Analyse stoppen - + Analyzing %1% %2/%3 Analysiere %1% %2/%3 - + Analyzing %1/%2 Analysiere %1/%2 @@ -4188,7 +4205,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Stille überspringen, starte mit voller Lautstärke @@ -4469,37 +4486,37 @@ Das führt oft zu Beatgrids mit höherer Qualität, wird aber nicht so gut bei T Wenn die Zuweisung nicht funktioniert, versuchen Sie unten eine erweiterte Option zu aktivieren und testen SIe dann das Steuerelement erneut. Oder klicken Sie auf "Wiederholen" um die Midi-Steuerung erneut zu erkennen. - + Didn't get any midi messages. Please try again. Keine MIDI-Nachrichten empfangen. Bitte versuchen Sie es erneut. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Eine Zuweisung konnte nicht erkannt werden - bitte versuchen Sie es erneut. Achten Sie darauf, dass Sie nur ein Steuerelement auf einmal berühren. - + Successfully mapped control: Steuerelement erfolgreich zugewiesen: - + <i>Ready to learn %1</i> <i>Bereit zu lernen %1</i> - + Learning: %1. Now move a control on your controller. Lerne: %1. Bewegen Sie jetzt ein Steuerelement an Ihrem Controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + Das ausgewählte Steuerelement existiert nicht.<br>Dies ist wahrscheinlich ein Bug. Bitte melde ihn im Mixxx-Bug-Tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>Du hast versucht %1,%2 zu lernen. - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5206,114 +5223,114 @@ die mit der jeweiligen Tonart verbunden ist. DlgPrefController - + Apply device settings? Einstellungen für Gerät anwenden? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Ihre Einstellungen müssen übernommen werden bevor Sie den Lern-Assistenten starten. Einstellungen übernehmen und fortfahren? - + None Keine - + %1 by %2 %1 von %2 - + Mapping has been edited Mapping wurde bearbeitet - + Always overwrite during this session Während dieser Session immer überschreiben - + Save As Speichern als - + Overwrite Überschreiben - + Save user mapping Benutzer-Mapping speichern - + Enter the name for saving the mapping to the user folder. Geben Sie den Namen für die Speicherung des Mappings im Benutzerordner ein. - + Saving mapping failed Speichern des Mappings fehlgeschlagen - + A mapping cannot have a blank name and may not contain special characters. Ein Mapping muss einen Namen haben und darf keine Sonderzeichen enthalten. - + A mapping file with that name already exists. Eine Mapping-Datei mit diesem Namen ist bereits vorhanden. - + Do you want to save the changes? Möchten Sie die Änderungen speichern? - + Troubleshooting Fehlerbehebung - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Es kann notwendig sein, einige Titel in Ihrer vorbereiteten Playlist zu überspringen oder einige andere Titel hinzuzufügen, um die Energie Ihres Publikums aufrechtzuerhalten.</b></font><br><br>Dieses Mapping wurde für eine neuere Mixxx Controller-Engine entwickelt und kann nicht auf Ihrer aktuellen Mixxx-Installation verwendet werden.<br>Ihre Mixxx-Installation hat die Controller-Engine-Version %1. Dieses Mapping erfordert eine Controller-Engine-Version >= %2<br><br>Für weitere Informationen besuchen Sie die Wiki-Seite <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller-Engine-Versionen</a>. - + Mapping already exists. Mapping ist bereits vorhanden. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> existiert bereits im Benutzerordner.<br>Überschreiben oder unter einem neuen Namen speichern? - + Clear Input Mappings Eingangs-Mappings löschen - + Are you sure you want to clear all input mappings? Wollen Sie wirklich alle Eingangs-Mappings löschen? - + Clear Output Mappings Ausgangs-Mappings löschen - + Are you sure you want to clear all output mappings? Wollen Sie wirklich alle Ausgangs-Mappings löschen? @@ -5333,7 +5350,7 @@ Einstellungen übernehmen und fortfahren? Device Info - + Geräte-Info @@ -5343,17 +5360,17 @@ Einstellungen übernehmen und fortfahren? Vendor name: - + Anbietername Product name: - + Produktname Vendor ID - + Anbieter-ID @@ -5363,7 +5380,7 @@ Einstellungen übernehmen und fortfahren? Product ID - + Produktnummer @@ -5373,7 +5390,7 @@ Einstellungen übernehmen und fortfahren? Serial number: - + Seriennummer @@ -5476,7 +5493,7 @@ Einstellungen übernehmen und fortfahren? Mapping Settings - + Mapping-Einstellungen @@ -5644,6 +5661,16 @@ Einstellungen übernehmen und fortfahren? Multi-Sampling Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6258,62 +6285,62 @@ Sie können jederzeit Tracks auf dem Bildschirm ziehen und ablegen, um ein Deck DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Die minimale Größe des ausgewählten Skins ist größer als Ihre Bildschirmauflösung. - + Allow screensaver to run Bildschirmschoner erlauben - + Prevent screensaver from running Bildschirmschoner unterdrücken - + Prevent screensaver while playing Bildschirmschoner während der Wiedergabe unterdrücken - + Disabled Deaktiviert - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Dieses Skin unterstützt keine Farbschemen - + Information Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx muss neu gestartet werden, damit die neuen Sprach-, Skalierungs- oder Multi-Sampling-Einstellungen wirksam werden. @@ -7483,173 +7510,172 @@ Die Ziel-Lautheit ist ungefähr und nimmt an, dass Track-Vorverstärkung und Mas DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Standard (lange Verzögerung) - + Experimental (no delay) Experimentell (keine Verzögerung) - + Disabled (short delay) Deaktiviert (kurze Verzögerung) - + Soundcard Clock Taktgeber der Soundkarte - + Network Clock Netzwerk-Taktgeber - + Direct monitor (recording and broadcasting only) Direkter Monitor (nur Aufzeichnung und Liveübertragung) - + Disabled Deaktiviert - + Enabled Aktiviert - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Um Echtzeit-Scheduling zu aktivieren (aktuell deaktiviert), siehe das %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. Im %1 sind Soundkarten und Controller aufgeführt, die Sie für die Verwendung von Mixxx in Betracht ziehen sollten. - + Mixxx DJ Hardware Guide Mixxx DJ Hardware-Handbuch - + Information Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) automatisch (<= 1024 Frames/Periode) - + 2048 frames/period 2048 Frames/Periode - + 4096 frames/period 4096 Frames/Periode - + Are you sure? - + Bist du dir sicher? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + Bist du dir sicher, dass du fortfahren möchtest? - + No - + Nein - + Yes, I know what I am doing - + Ja, ich weiß, was ich tue - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Mikrofon-Eingänge sind nicht synchron im Aufnahmen- und Liveübertragungssignal, verglichen mit dem was Sie hören. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Messen Sie die Round-Trip-Latenzzeit und geben Sie diese für die Mikrofon-Latenzkompensation ein, um das Mikrofon-Timing auszurichten. - - + Refer to the Mixxx User Manual for details. Details dazu finden Sie im Mixxx-Benutzerhandbuch. - + Configured latency has changed. Die eingestellte Latenz hat sich geändert. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Messen Sie erneut die Round-Trip-Latenzzeit und geben Sie diese für die Mikrofon-Latenzkompensation ein, um das Mikrofon-Timing auszurichten. - + Realtime scheduling is enabled. Echtzeit-Scheduling ist aktiviert. - + Main output only Nur Hauptausgang - + Main and booth outputs Haupt- und Kabinenausgänge - + %1 ms %1 ms - + Configuration error Fehler in der Konfiguration @@ -7667,131 +7693,131 @@ Die Ziel-Lautheit ist ungefähr und nimmt an, dass Track-Vorverstärkung und Mas Sound API - + Sample Rate Abtastrate - + Audio Buffer Audio-Puffer - + Engine Clock Engine-Taktgeber - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Verwenden Sie Soundkarten-Taktgeber für Live-Setups und für die geringste Latenz.<br>Verwenden Sie die Netzwerk-Taktgeber für die Live-Übertragung ohne physisches Publikum. - + Main Mix Haupt-Mix - + Main Output Mode Hauptausgang-Modus - + Microphone Monitor Mode Mikrofon-Monitormodus - + Microphone Latency Compensation Mikrofon-Latenzkompensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Pufferunterlauf-Zähler - + 0 0 - + Keylock/Pitch-Bending Engine Tonhöhensperre/Pitch-Bend-Engine - + Multi-Soundcard Synchronization Multi-Soundkarten-Synchronisation - + Output Ausgang - + Input Eingang - + System Reported Latency Vom System gemeldete Latenz - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Vergrößern Sie den Audio-Puffer, wenn sich der Unterlaufzähler erhöht oder wenn Sie Aussetzer während der Wiedergabe hören. - + Main Output Delay Hauptausgang-Verzögerung - + Headphone Output Delay Kopfhörerausgang-Verzögerung - + Booth Output Delay Kabinenausgangsverzögerung - + Dual-threaded Stereo - + Hints and Diagnostics Hinweise und Diagnose - + Downsize your audio buffer to improve Mixxx's responsiveness. Verkleinern Sie Ihren Audio-Puffer, um Mixxx' Reaktionsfähigkeit zu verbessern. - + Query Devices Geräte abfragen @@ -7987,7 +8013,7 @@ Die Ziel-Lautheit ist ungefähr und nimmt an, dass Track-Vorverstärkung und Mas OpenGL Status - + OpenGL Status @@ -8142,7 +8168,7 @@ Wählen Sie aus verschiedenen Arten der Wellenform-Anzeige, welche sich in erste Preferred font size - + Bevorzugte Schriftgröße @@ -8198,7 +8224,7 @@ Wählen Sie aus verschiedenen Arten der Wellenform-Anzeige, welche sich in erste Type - + Typ @@ -8692,7 +8718,7 @@ Dies kann nicht rückgängig gemacht werden! (status text) - + (status text) @@ -9351,27 +9377,27 @@ Das führt oft zu Beatgrids mit höherer Qualität, wird aber nicht so gut bei T EngineBuffer - + Soundtouch (faster) Soundtouch (schneller) - + Rubberband (better) Rubberband (besser) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (nahezu Hi-Fi-Qualität) - + Unknown, using Rubberband (better) Unbekannt, nutze Rubberband (besser) - + Unknown, using Soundtouch Unbekannt, Soundtouch wird verwenden @@ -9556,12 +9582,12 @@ Das führt oft zu Beatgrids mit höherer Qualität, wird aber nicht so gut bei T Change color - + Farbe ändern Choose a new color - + Neue Farbe auswählen @@ -9569,32 +9595,32 @@ Das führt oft zu Beatgrids mit höherer Qualität, wird aber nicht so gut bei T Browse... - + Durchsuchen... No file selected - + Keine Datei ausgewählt Select a file - + Datei auswählen LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Abgesicherter Modus aktiviert - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9606,57 +9632,57 @@ Shown when VuMeter can not be displayed. Please keep Unterstützung. - + activate aktivieren - + toggle umschalten - + right rechts - + left links - + right small wenig rechts - + left small wenig links - + up hoch - + down runter - + up small wenig hoch - + down small wenig runter - + Shortcut Tastenkombination @@ -9664,37 +9690,37 @@ Unterstützung. Library - + This or a parent directory is already in your library. Dieses oder ein übergeordnetes Verzeichnis befindet sich bereits in Ihrer Bibliothek. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Dieses oder ein aufgelistetes Verzeichnis existiert nicht oder ist nicht zugänglich. Der Vorgang wird zur zur Vermeidung von Inkonsistenzen in der Bibliothek abgebrochen. - - + + This directory can not be read. Dieses Verzeichnis kann nicht gelesen werden. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ein unbekannter Fehler ist aufgetreten. Der Vorgang wird zur zur Vermeidung von Inkonsistenzen in der Bibliothek abgebrochen. - + Can't add Directory to Library Verzeichnis kann nicht zur Bibliothek hinzugefügt werden - + Could not add <b>%1</b> to your library. %2 @@ -9703,27 +9729,27 @@ Der Vorgang wird zur zur Vermeidung von Inkonsistenzen in der Bibliothek abgebro %2 - + Can't remove Directory from Library Verzeichnis kann nicht aus der Bibliothek entfernt werden - + An unknown error occurred. Es ist ein unbekannter Fehler aufgetreten. - + This directory does not exist or is inaccessible. Dieses Verzeichnis existiert nicht oder ist nicht zugänglich. - + Relink Directory Verzeichnis neu verknüpfen - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9735,22 +9761,22 @@ Der Vorgang wird zur zur Vermeidung von Inkonsistenzen in der Bibliothek abgebro LibraryFeature - + Import Playlist Wiedergabeliste importieren - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Wiedergabeliste-Dateien (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Datei überschreiben? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9904,253 +9930,253 @@ Möchten Sie wirklich diese Datei überschreiben? MixxxMainWindow - + Sound Device Busy Audiogerät beschäftigt - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Wiederholen</b> nach dem Schließen der anderen Anwendung oder dem erneuten Verbinden eines Audiogerätes - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. Mixxx's Audiogeräte-Einstellungen <b>neu konfigurieren</b>. - - + + Get <b>Help</b> from the Mixxx Wiki. Erhalten Sie <b>Hilfe</b> aus dem Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. Mixxx <b>beenden</b>. - + Retry Wiederholen - + skin Skin - + Allow Mixxx to hide the menu bar? Darf Mixxx die Menüleiste ausblenden? - + Hide Always show the menu bar? Ausblenden - + Always show Immer anzeigen - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Die Mixxx-Menüleiste ist ausgeblendet und kann mit einem einzigen Druck der <b>Alt</b> Taste umgeschaltet werden.<br><br><b>%1</b> anklicken, um zuzustimmen.<br><br><b>%2</b>anklicken, um dies zu deaktivieren , z.B. wenn Sie Mixxx nicht mit einer Tastatur verwenden.<br><br>Sie können diese Einstellung jederzeit unter Einstellungen -> Benutzeroberfläche ändern.<br> - + Ask me again Nochmals fragen - - + + Reconfigure Neu konfigurieren - + Help Hilfe - - + + Exit Beenden - - + + Mixxx was unable to open all the configured sound devices. Mixxx konnte nicht alle konfigurierten Audiogeräte öffnen. - + Sound Device Error Audiogeräte-Fehler - + <b>Retry</b> after fixing an issue <b>Wiederholen</b> nach Fehlerbehebung - + No Output Devices Keine Ausgabegeräte - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx wurde ohne Tonausgabe-Geräte konfiguriert. Die Audio-Verarbeitung wird ohne ein konfiguriertes Ausgabegerät deaktiviert werden. - + <b>Continue</b> without any outputs. <b>Weiter</b> ohne jegliche Ausgabegeräte. - + Continue Weiter - + Load track to Deck %1 Track in Deck %1 laden - + Deck %1 is currently playing a track. Deck %1 spielt derzeit einen Track. - + Are you sure you want to load a new track? Möchten Sie wirklich einen neuen Track laden? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Es ist kein Eingabegerät für diese Vinyl-Steuerung ausgewählt. Bitte wählen Sie zuerst ein Eingabegerät in den Sound-Hardware-Einstellungen. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Es ist kein Eingabegerät für diese Passthrough-Steuerung ausgewählt. Bitte wählen Sie zuerst ein Eingabegerät in den Sound-Hardware-Einstellungen. - + There is no input device selected for this microphone. Do you want to select an input device? Es ist kein Eingabegerät für dieses Mikrofon ausgewählt. Wollen Sie ein Eingabegerät auswählen? - + There is no input device selected for this auxiliary. Do you want to select an input device? Es ist kein Eingabegerät für diesen Aux ausgewählt. Wollen Sie ein Eingabegerät auswählen? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 Tracks insgesamt - + %1 new tracks found - + %1 neue Tracks gefunden - + %1 moved tracks detected - + %1 verschobene Tracks erkannt - + %1 tracks are missing (%2 total) - + %1 Tracks fehlen (%2 insgesamt) - + %1 tracks have been rediscovered - + %1 Tracks wurden wiedergefunden - + Library scan finished - + Bibliothek-Scan abgeschlossen - + Error in skin file Fehler in Skin-Datei - + The selected skin cannot be loaded. Das gewählte Skin kann nicht geladen werden. - + OpenGL Direct Rendering Direktes Rendern mit OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Direktes Rendern ist auf Ihrem System nicht aktiviert.<br><br>Dies bedeutet, dass die Wellenform-Anzeige sehr langsam sein wird <br><b>und möglicherweise Ihre CPU stark belastet</b>. Entweder aktualisieren Sie Ihre<br>Konfiguration, um direktes Rendern zu aktivieren oder deaktivieren<br>die Wellenform-Anzeige in den Mixxx-Einstellungen durch die Auswahl von<br>"Leer" als Wellenform-Anzeige im Bereich 'Benutzeroberfläche'. - - - + + + Confirm Exit Beenden bestätigen - + A deck is currently playing. Exit Mixxx? Ein Deck spielt derzeit. Mixxx beenden? - + A sampler is currently playing. Exit Mixxx? Ein Sampler spielt derzeit. Mixxx beenden? - + The preferences window is still open. Das Einstellungen-Fenster ist noch geöffnet. - + Discard any changes and exit Mixxx? Alle Änderungen verwerfen und Mixxx schließen? @@ -10166,13 +10192,13 @@ Wollen Sie ein Eingabegerät auswählen? PlaylistFeature - + Lock Sperren - - + + Playlists Wiedergabelisten @@ -10182,32 +10208,58 @@ Wollen Sie ein Eingabegerät auswählen? Wiedergabeliste mischen - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Entsperren - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Wiedergabelisten sind geordnete Listen von Tracks, mit denen Sie Ihre DJ-Sets planen können. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Es kann notwendig sein, einige Tracks in Ihrer vorbereiteten Wiedergabeliste zu überspringen oder einige andere Tracks hinzuzufügen, um die Energie Ihres Publikums aufrechtzuerhalten. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Einige DJs stellen Wiedergabelisten zusammen bevor sie live auftreten, während andere es bevorzugen sie währenddessen zu erstellen. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Achten Sie bei der Verwendung einer Wiedergabeliste während eines Live-DJ-Sets immer darauf, wie das Publikum auf die von Ihnen gespielte Musik reagiert. - + Create New Playlist Neue Wiedergabeliste erstellen @@ -10250,7 +10302,7 @@ Wollen Sie ein Eingabegerät auswählen? Mixxx Track Colors - + Mixxx Track-Farben @@ -10884,7 +10936,7 @@ Mit einer Breite von Null kann der gesamte Verzögerungsbereich manuell überstr The Mixxx Team - + Das Mixxx-Team @@ -10914,7 +10966,7 @@ Mit einer Breite von Null kann der gesamte Verzögerungsbereich manuell überstr Gain - + Verstärkung @@ -11868,7 +11920,7 @@ Hinweis: Kompensiert "Chipmunk"- oder "Brumm"- StimmenDie Intensität der Verstärkung, die auf das Audiosignal angewendet wird. Bei höheren Pegeln wird der Ton stärker verzerrt. - + Passthrough Passthrough @@ -11907,7 +11959,7 @@ Hinweis: Kompensiert "Chipmunk"- oder "Brumm"- Stimmen Compressor - + Kompressor @@ -11938,108 +11990,110 @@ and the processed output signal as close as possible in perceived loudness Threshold (dBFS) - + Schwellwert (dBFS) Threshold - + Schwellwert The Threshold knob adjusts the level above which the compressor starts attenuating the input signal - + Der Schwellwert-Regler stellt den Pegel ein, ab dem der Kompressor beginnt, das Eingangssignal zu dämpfen Ratio (:1) - + Ratio (:1) Ratio - + Ratio The Ratio knob determines how much the signal is attenuated above the chosen threshold. For a ratio of 4:1, one dB remains for every four dB of input signal above the threshold. At a ratio of 1:1 no compression is happening, as the input is exactly the output. - + Der Ratio-Regler bestimmt, wie stark das Signal über dem gewählten Schwellenwert gedämpft wird. +Bei einem Verhältnis von 4:1 bleibt für jeweils vier dB Eingangssignal über dem Schwellenwert ein dB übrig. +Bei einem Verhältnis von 1:1 findet keine Komprimierung statt, da der Eingang genau dem Ausgang entspricht. Knee (dBFS) - + Knie (dBFS) Knee - + Knie The Knee knob is used to achieve a rounder compression curve - + Der Knie-Regler wird verwendet, um eine sanftere Kompressionskurve zu erreichen Attack (ms) - + Attack (ms) Attack - + Attack The Attack knob sets the time that determines how fast the compression will set in once the signal exceeds the threshold - + Der Attack-Regler bestimmt, wie schnell die Kompression einsetzt, wenn das Signal den Schellwert überschreitet Release (ms) - + Release (ms) Release - + Release The Release knob sets the time that determines how fast the compressor will recover from the gain reduction once the signal falls under the threshold. Depending on the input signal, short release times may introduce a 'pumping' effect and/or distortion. - + Der Release-Regler bestimmt die Zeit, die der Kompressor benötigt, um sich von der Verstärkungsreduzierung zu erholen, sobald das Signal unter den Schwellenwert fällt. Je nach Eingangssignal können kurze Release-Zeiten zu einem Pumpeffekt und/oder Verzerrungen führen. Level - + Pegel The Level knob adjusts the level of the output signal after the compression was applied - + Der Pegel-Regler bestimmt den Pegel des Ausgangssignals nach angewendeter Kompression various - + verschiedene - + built-in - + eingebaut - + missing - + fehlt @@ -12165,54 +12219,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Wiedergabelisten - + Folders Ordner - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Liest Datenbanken, die für Pioneer CDJ / XDJ-Player mit dem Rekordbox Export-Modus exportiert wurden.<br/>Rekordbox kann nur auf USB- oder SD-Geräte mit einem FAT- oder HFS-Dateisystem exportieren.<br/>Mixxx kann eine Datenbank von jedem Gerät lesen, das die Datenbankordner enthält (<tt>PIONEER</tt> und <tt>Contents</tt>).<br/>Nicht unterstützt werden Rekordbox-Datenbanken, die auf ein externes Gerät verschoben wurden über<br/><i>Voreinstellungen > Erweitert > Datenbankverwaltung</i>.<br/><br/>Die folgenden Daten werden gelesen: - + Hot cues Hotcues - + Loops (only the first loop is currently usable in Mixxx) Loops (nur der erste Loop ist derzeit in Mixxx nutzbar) - + Check for attached Rekordbox USB / SD devices (refresh) Nach angeschlossenen USB / SD Rekordbox-Geräten suchen (aktualisieren) - + Beatgrids Beatgrids - + Memory cues Memory-Cues - + (loading) Rekordbox (lade) Rekordbox @@ -15456,47 +15510,47 @@ Dies kann nicht rückgängig gemacht werden! WCueMenuPopup - + Cue number Cue-Nummer - + Cue position Cue-Position - + Edit cue label Cue-Beschriftungen bearbeiten - + Label... Beschriftung … - + Delete this cue Diesen Cue löschen - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Hotcue #%1 @@ -15621,323 +15675,353 @@ Dies kann nicht rückgängig gemacht werden! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Neue &Wiedergabeliste erstellen - + Create a new playlist Neue Wiedergabeliste erstellen - + Ctrl+n Strg+N - + Create New &Crate Neue &Plattenkiste erstellen - + Create a new crate Neue Plattenkiste erstellen - + Ctrl+Shift+N Strg+Umschalt+N - - + + &View &Ansicht - + Auto-hide menu bar Menüleiste automatisch verbergen - + Auto-hide the main menu bar when it's not used. Menüleiste automatisch verbergen wenn sie nicht verwendet wird.. - + May not be supported on all skins. Wird möglicherweise nicht von allen Skins unterstützt. - + Show Skin Settings Menu Skin-Einstellungsmenü anzeigen - + Show the Skin Settings Menu of the currently selected Skin Das Skin-Einstellungsmenü des aktuell ausgewählten Skin anzeigen - + Ctrl+1 Menubar|View|Show Skin Settings Strg+1 - + Show Microphone Section Mikrofon-Bereich anzeigen - + Show the microphone section of the Mixxx interface. Den Mikrofon-Bereich der Mixxx-Benutzeroberfläche anzeigen. - + Ctrl+2 Menubar|View|Show Microphone Section Strg+2 - + Show Vinyl Control Section Vinyl-Steuerung-Bereich anzeigen - + Show the vinyl control section of the Mixxx interface. Den Vinyl-Steuerung Bereich der Mixxx-Benutzeroberfläche anzeigen. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Strg+3 - + Show Preview Deck Vorhör-Deck anzeigen - + Show the preview deck in the Mixxx interface. Das Vorhör-Deck in der Mixxx-Benutzeroberfläche anzeigen. - + Ctrl+4 Menubar|View|Show Preview Deck Strg+4 - + Show Cover Art Cover-Bild anzeigen - + Show cover art in the Mixxx interface. Cover-Bild in der Mixxx-Benutzeroberfläche anzeigen. - + Ctrl+6 Menubar|View|Show Cover Art Strg+6 - + Maximize Library Bibliothek maximieren - + Maximize the track library to take up all the available screen space. Die Track-Bibliothek auf den verfügbaren Bildschirmplatz maximieren. - + Space Menubar|View|Maximize Library Leertaste - + &Full Screen &Vollbild - + Display Mixxx using the full screen Mixxx im Vollbildmodus anzeigen - + &Options &Optionen - + &Vinyl Control &Vinyl-Steuerung - + Use timecoded vinyls on external turntables to control Mixxx Timecode-Vinyls benutzen um Mixxx mit externen Plattenspielern zu steuern - + Enable Vinyl Control &%1 Vinyl-Steuerung &%1 aktivieren - + &Record Mix &Mix aufnehmen - + Record your mix to a file Aufnahme Ihres Mixes in eine Datei - + Ctrl+R Strg+R - + Enable Live &Broadcasting &Liveübertragung aktivieren - + Stream your mixes to a shoutcast or icecast server Den Mix zu einem Icecast- oder Shoutcast-Server streamen - + Ctrl+L Strg+L - + Enable &Keyboard Shortcuts &Tastenkombinationen aktivieren - + Toggles keyboard shortcuts on or off Tastenkombinationen ein-/ausschalten - + Ctrl+` Strg+` - + &Preferences &Einstellungen - + Change Mixxx settings (e.g. playback, MIDI, controls) Mixxx Einstellungen verändern (z.B. Wiedergabe, MIDI, Steuerelemente) - + &Developer &Entwickler - + &Reload Skin Skin &neu laden - + Reload the skin Das Skin neu laden - + Ctrl+Shift+R Strg+Umschalt+R - + Developer &Tools Entwickler&werkzeuge - + Opens the developer tools dialog Öffnet den Entwicklerwerkzeuge-Dialog - + Ctrl+Shift+T Strg+Umschalt+T - + Stats: &Experiment Bucket Statistiken: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Aktiviert den Experiment-Modus. Sammelt Statistiken im Experiment-Tracking-Bucket. - + Ctrl+Shift+E Strg+Umschalt+E - + Stats: &Base Bucket Statistiken: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. Aktiviert den Base-Modus. Sammelt Statistiken im Base-Tracking-Bucket. - + Ctrl+Shift+B Strg+Umschalt+B - + Deb&ugger Enabled Deb&ugger aktiviert - + Enables the debugger during skin parsing Aktiviert den Debugger während des Parsens der Skins - + Ctrl+Shift+D Strg+Umschalt+D - + &Help &Hilfe - + Show Keywheel menu title Tonartrad anzeigen @@ -15954,74 +16038,74 @@ Dies kann nicht rückgängig gemacht werden! Die Bibliothek in das Engine DJ Format exportieren - + Show keywheel tooltip text Tonartrad anzeigen - + F12 Menubar|View|Show Keywheel F12 - + &Community Support &Community Unterstützung - + Get help with Mixxx Hilfe zu Mixxx erhalten - + &User Manual &Benutzerhandbuch - + Read the Mixxx user manual. Mixxx-Benutzerhandbuch lesen. - + &Keyboard Shortcuts &Tastenkombinationen - + Speed up your workflow with keyboard shortcuts. Beschleunigen Sie Ihren Arbeitsablauf mit Tastenkombinationen. - + &Settings directory &Einstellungs-Verzeichnis - + Open the Mixxx user settings directory. Das Verzeichnis mit den Mixxx-Benutzereinstellungen öffnen. - + &Translate This Application Diese Anwendung &übersetzen - + Help translate this application into your language. Helfen Sie, diese Anwendung in Ihre Sprache zu übersetzen. - + &About &Über - + About the application Über diese Anwendung @@ -16056,25 +16140,13 @@ Dies kann nicht rückgängig gemacht werden! WSearchLineEdit - - Clear input - Clear the search bar input field - Eingabe löschen - - - - Ctrl+F - Search|Focus - Strg+F - - - + Search noun Suche - + Clear input Eingabe löschen @@ -16085,93 +16157,87 @@ Dies kann nicht rückgängig gemacht werden! Suchen … - + Clear the search bar input field Eingabefeld der Suchleiste löschen - - Enter a string to search for - Geben Sie einen Suchbegriff ein + + Return + Enter - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Verwenden Sie Operatoren wie bpm:115-128, artist:Max Muster, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Für weitere Informationen siehe Benutzerhandbuch > Mixxx Bibliothek + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Tastenkombination + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Strg+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Fokus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Strg+Rücktaste + + Additional Shortcuts When Focused: + - Shortcuts - Tastenkombinationen + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - Enter + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Suche auslösen, vor dem Timeout für Instant-Suche, oder danach zur Track-Ansicht wechseln + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Strg+Leertaste - + Toggle search history Shows/hides the search history entries Suchverlauf ein-/ausblenden - + Delete or Backspace Löschen oder Backspace - - Delete query from history - Suchbegriff aus dem Verlauf löschen - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Suche verlassen + + Delete query from history + Suchbegriff aus dem Verlauf löschen @@ -16927,37 +16993,37 @@ Dies kann nicht rückgängig gemacht werden! WTrackTableView - + Confirm track hide Ausblenden der Tracks bestätigen - + Are you sure you want to hide the selected tracks? Möchten Sie wirklich die gewählten Tracks ausblenden? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Möchten Sie wirklich die gewählten Tracks aus der Auto-DJ Warteschlange löschen? - + Are you sure you want to remove the selected tracks from this crate? Möchten Sie wirklich die gewählten Tracks aus dieser Plattenkiste löschen? - + Are you sure you want to remove the selected tracks from this playlist? Möchten Sie wirklich die gewählten Tracks von dieser Wiedergabeliste löschen? - + Don't ask again during this session Während dieser Sitzung nicht erneut fragen. - + Confirm track removal Entfernen der Tracks bestätigen @@ -16978,52 +17044,52 @@ Dies kann nicht rückgängig gemacht werden! mixxx::CoreServices - + fonts Schriftarten - + database Datenbank - + effects Effekte - + audio interface Audio-Interface - + decks Decks - + library Bibliothek - + Choose music library directory Verzeichnis für die Musikbibliothek auswählen - + controllers Controller - + Cannot open database Kann Datenbank nicht öffnen - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17037,68 +17103,78 @@ Zum Beenden OK drücken. mixxx::DlgLibraryExport - + Entire music library Gesamte Musikbibliothek - - Selected crates - Gewählte Plattenkisten + + Crates + - + + Playlists + + + + + Selected crates/playlists + + + + Browse Durchsuchen - + Export directory Verzeichnis exportieren - + Database version Datenbankversion - + Export Exportieren - + Cancel Abbrechen - + Export Library to Engine DJ "Engine DJ" must not be translated Bibliothek nach Engine DJ exportieren - + Export Library To Bibliothek exportieren nach - + No Export Directory Chosen Kein Exportverzeichnis ausgewählt - + No export directory was chosen. Please choose a directory in order to export the music library. Es wurde kein Exportverzeichnis gewählt. Bitte wählen Sie ein Verzeichnis, um die Musikbibliothek zu exportieren. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Im gewählten Verzeichnis existiert bereits eine Datenbank. Exportierte Tracks werden in diese Datenbank eingefügt. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Im gewählten Verzeichnis ist bereits eine Datenbank vorhanden, aber es gab ein Problem beim Laden der Datenbank. Der Export ist in dieser Situation möglicherweise nicht erfolgreich. @@ -17119,7 +17195,7 @@ Zum Beenden OK drücken. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17130,22 +17206,22 @@ Zum Beenden OK drücken. mixxx::LibraryExporter - + Export Completed Export abgeschlossen - - Exported %1 track(s) and %2 crate(s). - %1 Track(s) und %2 Plattenkiste(n) wurden exportiert. + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Export fehlgeschlagen - + Exporting to Engine DJ... Exportieren nach Engine DJ … diff --git a/res/translations/mixxx_el.qm b/res/translations/mixxx_el.qm index 548f555b5aa779a2b1a876c0febdc87dac361058..8723778571bc1715f0a0b230383dc9abc71a1689 100644 GIT binary patch delta 472 zcmXBPO-Pe*90&0K@3*(y+oR7`4tw@&bKA4*SM|6oL?M}y-$n#U@9FS`6(Pz=I<1CoD1#2Ek7FM&DJAF#s?sL6eMPCUz|kT)nzHQwj8fAC$8R7a z4{$7pak&J{ sX!9_K*6_XgCdXf6&{yEd7h~IJB2GTMPc0Q{q33?|%*HC$JE`XR4>+QZTmS$7 delta 608 zcmZY4T}V>_6bJBg&hFjj^}4l>@}up}sk?qn#UR&1Dr9a+KJ+mv#1^qyJ`BZe3BpEX z=7UIO$8tjq?aP{p{dYA9r*Km`SXYKYg&Ao6tC^X zPm{J4d@#ALNUoCr-3+LdvJIOG<^c}B0<5#A{HPK+T^!f6kpp=_vw|=9mY|S&hZlqp zl~-_;xQ1U+R;>|h)7YGg0UDp9r{^`mTr;-z-UGD1$4;dZV0j!*%nt)L9^w5uAEtRi z*Fv>joY8s7olMF4Q;5GgT=0+_0k%o1SsfITT?>HCkA<84H}dweUs9#&HevqCkNoak zj!OghjlW9goZm(9%@n{$Zp+o5qRW>6Sj=vU&H%>>v*fO0zpRow$Z^?+?>Hm3NQzgy zy)Th}_aF;JS8331HWgjv3C%u?Mrk8YbL zwUuqA5Gf-(Y8s=4GM3E&sr_h5-cK zmio6_?itz?EA5=IrtxzszTJRSt>uXw%TztcXNvo&BF0O_L)37byGy3Ybvd - + Remove Crate as Track Source Αφαίρεση κιβωτίου ως πηγή κομματιών - + Auto DJ Αυτόματος DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Προσθήκη κιβωτίου ως πηγή κομματιών @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Νέα Λίστα Αναπαραγωγής - + Add to Auto DJ Queue (bottom) Προσθήκη στη λίστα του Αυτόματου DJ (στο τέλος) - + Create New Playlist Δημιουργία νέας λίστας αναπαραγωγής - + Add to Auto DJ Queue (top) Προσθήκη στη λίστα του Αυτόματου DJ (στην αρχή) - + Remove Αφαίρεση @@ -180,12 +180,12 @@ Μετονομασία - + Lock Κλείδωμα - + Duplicate Κλωνοποίηση @@ -206,24 +206,24 @@ Ανάλυση ολόκληρης της λίστας αναπαραγωγής - + Enter new name for playlist: Εισάγετε νέο όνομα για τη λίστα αναπαραγωγής: - + Duplicate Playlist Κλωνοποίηση λίστας αναπαραγωγής - - + + Enter name for new playlist: Εισάγετε όνομα για τη νέα λίστα αναπαραγωγής: - + Export Playlist Εξαγωγή λίστας αναπαραγωγής @@ -233,70 +233,77 @@ Προσθήκη στη λίστα του Αυτόματου DJ (Αντικατάσταση) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Μετονομασία λίστας αναπαραγωγής - - + + Renaming Playlist Failed Η μετονομασία της λίστας αναπαραγωγής απέτυχε - - - + + + A playlist by that name already exists. Μια λίστα αναπαραγωγής με αυτό το όνομα υπάρχει ήδη. - - - + + + A playlist cannot have a blank name. Η λίστα αναπαραγωγής δεν μπορεί να έχει κενό όνομα. - + _copy //: Appendix to default name when duplicating a playlist _αντίγραφο - - - - - - + + + + + + Playlist Creation Failed Η δημιουργία λίστας αναπαραγωγής απέτυχε - - + + An unknown error occurred while creating playlist: Προέκυψε άγνωστο σφάλμα κατά τη δημιουργία λίστας: - + Confirm Deletion Επιβεβαίωση Διαγραφής - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) Λίστα αναπαραγωγής M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Λίστα αναπαραγωγής M3U (*.m3u);;Λίστα αναπαραγωγής M3U8 (*.m3u8);;Λίστα αναπαραγωγής PLS (*.pls);;Κείμενο CSV (*.csv);;Απλό κείμενο (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Χρονική σήμανση @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. H φόρτωση του κομματιού απέτυχε. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Άλμπουμ - + Album Artist Καλλιτέχνης δίσκου - + Artist Καλλιτέχνης - + Bitrate Ρυθμός μετάδοσης bit - + BPM BPM - + Channels Κανάλια - + Color Χρώμα - + Comment Σχόλιο - + Composer Συνθέτης - + Cover Art Εξώφυλλο - + Date Added Ημερομηνία προσθήκης - + Last Played - + Duration Διάρκεια - + Type Τύπος - + Genre Είδος - + Grouping Ομαδοποίηση - + Key Κλειδί - + Location Θέση - + + Overview + + + + Preview Προεπισκόπηση - + Rating Αξιολόγηση - + ReplayGain ReplayGain - + Samplerate Ρυθμός δειγματοληψίας - + Played Έπαιξε - + Title Τίτλος - + Track # Αρ. κομματιού - + Year Έτος - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Προσθήκη στους Γρήγορους Συνδέσμους - + Remove from Quick Links Αφαίρεση από Γρήγορους Συνδέσμους - + Add to Library Προσθήκη στη Συλλογή - + Refresh directory tree - + Quick Links Γρήγοροι Σύνδεσμοι - - + + Devices Συσκευές - + Removable Devices Αφαιρούμενες συσκευές - - + + Computer Υπολογιστής - + Music Directory Added Προστέθηκε Μουσικός Κατάλογος - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Προσθέσατε έναν ή περισσότερους μουσικούς καταλόγους. Τα κομμάτια σε αυτούς τους καταλόγους δεν θα είναι διαθέσιμα μέχρι να επανασαρωθεί η συλλογή σας. Θέλετε να γίνει τώρα επανασάρωση; - + Scan Σάρωση - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. Ο "Υπολογιστής" σας επιτρέπει την πλοήγηση σε, προβολή και φόρτωση κομματιών από φακέλους στο σκληρό σας δίσκο και τις εξωτερικές σας συσκευές. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -839,27 +861,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1041,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Ρύθμιση σε πλήρη ένταση - + Set to zero volume Ρύθμιση σε μηδενική ένταση @@ -1072,13 +1099,13 @@ trace - Above + Profiling messages Κουμπί αντίστροφης κύλισης (Λογοκρισία) - + Headphone listen button Κουμπί για ακρόαση ακουστικών - + Mute button Κουμπί σίγασης @@ -1089,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Προσανατολισμός μείξης (π.χ. αρ., δεξ., κέντρο) - + Set mix orientation to left Ρύθμιση προσανατολισμού μείξης προς τα αριστερά - + Set mix orientation to center Ρύθμιση προσανατολισμού μείξης προς το κέντρο - + Set mix orientation to right Ρύθμιση προσανατολισμού μείξης προς τα δεξιά @@ -1148,23 +1175,23 @@ trace - Above + Profiling messages Πλήκτρο χτύπου BPM - + Toggle quantize mode Ενεργ./Απενεργ. λειτουργίας κβαντισμού - + One-time beat sync (tempo only) Άμεσος συγχρον. ρυθμού (μόνο βήμα) - + One-time beat sync (phase only) Άμεσος συγχρον. ρυθμού (μόνο φάση) - + Toggle keylock mode Ενεργ./Απενεργ. λειτουργίας κλειδώματος ύψους @@ -1174,193 +1201,193 @@ trace - Above + Profiling messages Ισοσταθμιστές - + Vinyl Control Έλεγχος βινυλίου - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Ενεργ./Απενεργ. λειτουργίας cueing ελέγχου-βινυλίου (ΑΝΕΝΕΡΓΟ/ΕΝΑ/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Τρόπος ελέγχου-βινυλίου (ΑΠΟΛ/ΣΧΕΤ/ΣΤΑΘ) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping Επανάληψη - + Loop In button Κουμπί Εισόδου στην Επανάληψη - + Loop Out button Κουμπί Εξόδου από την Επανάληψη - + Loop Exit button Κουμπί για έξοδο από τον βρόχο (loop) - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1476,20 +1503,20 @@ trace - Above + Profiling messages - - + + Volume Fader Ποτενσιόμετρο Έντασης - + Full Volume Πλήρης Ένταση - + Zero Volume Μηδενική ένταση @@ -1505,7 +1532,7 @@ trace - Above + Profiling messages - + Mute Σίγαση @@ -1516,7 +1543,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1537,25 +1564,25 @@ trace - Above + Profiling messages - + Orientation Προσανατολισμός - + Orient Left - + Orient Center - + Orient Right @@ -1625,82 +1652,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync Συγχρονισμός - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch Έλεγχος τόνου (δεν επηρεάζει το ρυθμό), το κέντρο αντιστοιχεί στον αρχικό τόνο - + Pitch Adjust Ρύθμιση Τόνου - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1741,451 +1768,451 @@ trace - Above + Profiling messages Χαμηλός Ισοσταθμιστής - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Προσθήκη στη λίστα του Αυτόματου DJ (στο τέλος) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Προσθήκη στη λίστα του Αυτόματου DJ (στην αρχή) - + Prepend selected track to the Auto DJ Queue - + Load Track Άνοιγμα κομματιού - + Load selected track Φόρτωση του διαλεγμένου κομματιού - + Load selected track and play Φόρτωση του επιλεγμένου κομματιού και αναπαραγωγή - - + + Record Mix Εγγραφή μίξης - + Toggle mix recording - + Effects Εφέ - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear Εκκαθάριση - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Επόμενο - + Switch to next effect - + Previous Προηγούμενο - + Switch to the previous effect Εναλλαγή στο προηγούμενο εφέ - + Next or Previous Επόμενο ή Προηγούμενο - + Switch to either next or previous effect Εναλλαγή είτε στο επόμενο είτε στο προηγούμενο εφέ - - + + Parameter Value Τιμή Παραμέτρου - - + + Microphone Ducking Strength Ισχύς "Βύθισης" Μικροφώνου - + Microphone Ducking Mode Λειτουργία "Βύθισης" Μικροφώνου - + Gain Ενίσχυση - + Gain knob Κουμπί ρύθμισης του gain - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Εναλλαγή Aυτόματου DJ - + Toggle Auto DJ On/Off Θέστε τον Αυτόματο DJ εντός/εκτός λειτουργίας - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Μεγιστοποίηση/Επαναφορά Βιβλιοθήκης - + Maximize the track library to take up all the available screen space. Μεγιστοποίηση της βιλιοθήκης αρχείων ώστε να καταλαμβάνει ολόκληρο τον διαθέσιμο χώρο της οθόνης - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2200,102 +2227,102 @@ trace - Above + Profiling messages Ενίσχυση Ακουστικού - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Ταχύτητα αναπαραγωγής - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed Αύξηση ταχύτητας - + Adjust speed faster (coarse) - + Increase Speed (Fine) Αύξηση Ταχύτητας (Ακριβής) - + Adjust speed faster (fine) - + Decrease Speed Ελάττωση ταχύτητας - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed Προσωρινή αύξηση ταχύτητας - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed Προσωρινή μείωση ταχύτητας - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2447,1041 +2474,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) Προσθήκη στη λίστα του Αυτόματου DJ (Αντικατάσταση) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Μικρόφωνο ανοιχτό/κλειστό - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Αυτόματος DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track Ενεργοποίηση μετάβασης στο επόμενο κομμάτι - + User Interface Διεπαφή χρήστη - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator Μικρόφωνο && Θύρα Aux Εμφάνιση/Απόκρυψη - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section Εμφάνιση/ Απόκρυψη ενότητας για τον έλεγχο βινυλίου - + Preview Deck Show/Hide - + Show/hide the preview deck Εμφάνιση/ Απόκρυψη του deck προεπισκόπησης - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3596,32 +3645,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3665,13 +3714,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Αφαίρεση - + Create New Crate @@ -3681,132 +3730,132 @@ trace - Above + Profiling messages Μετονομασία - - + + Lock Κλείδωμα - + Export Crate as Playlist - + Export Track Files Εξαγωγή αρχείων ήχου - + Duplicate Κλωνοποίηση - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Κιβώτια - - + + Import Crate Εισαγωγή Κιβωτίου - + Export Crate Εξαγωγή Κιβωτίου - + Unlock Ξεκλείδωμα - + An unknown error occurred while creating crate: Προκλήθηκε άγνωστο σφάλμα κατά την δημιουργία του κιβωτίου: - + Rename Crate Μετονομασία Κιβωτίου - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion Επιβεβαίωση Διαγραφής - - + + Renaming Crate Failed Η Μετονομασία του Κιβωτίου Απέτυχε - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Λίστα αναπαραγωγής M3U (*.m3u);;Λίστα αναπαραγωγής M3U8 (*.m3u8);;Λίστα αναπαραγωγής PLS (*.pls);;Κείμενο CSV (*.csv);;Απλό κείμενο (*.txt) - + M3U Playlist (*.m3u) Λίστα αναπαραγωγής M3U (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Τα κιβώτια ειναι ενας φοβερός τρόπος που βοηθάει την οργάνωση της μουσικής που θέλετε να αναπαράγετε - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Τα κιβώτια σας επιτρέπουν να οργανώσετε τη μουσική σας όπως σας αρέσει! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Το όνομα ενός Κιβωτίου δε μπορεί να είναι Κενό - + A crate by that name already exists. Υπάρχει ήδη κιβώτιο με αυτό το όνομα. @@ -3901,12 +3950,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4025,72 +4074,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Παράκαμψη - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Δευτερόλεπτα - + Auto DJ Fade Modes Full Intro + Outro: @@ -4121,80 +4170,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat Επανάληψη - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Αυτόματος DJ - + Shuffle Ανακάτεμα - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4417,37 +4466,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. Δεν έλαβα μηνύματα MIDI. Παρακαλώ δοκιμάστε ξανά. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Αδύνατη ανίχνευση χαρτογράφησης -- παρακαλώ δοκιμάστε ξανά. Σιγουρευτείτε ότι αγγίζετε έναν ελεγκτή τη φορά. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4486,17 +4535,17 @@ You tried to learn: %1,%2 - + Log - + Search Αναζήτηση - + Stats @@ -5149,114 +5198,114 @@ associated with each key. DlgPrefController - + Apply device settings? Να γίνει εφαρμογή των ρυθμίσεων της συσκευής; - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Πρέπει να εφαρμοσθούν οι ρυθμίσεις σας πριν εκκινήσετε τον Μάγο εκμάθησης. Να γίνει εφαρμογή ρυθμίσεων και να συνεχίσουμε; - + None Κανένα - + %1 by %2 %1 από %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5269,105 +5318,105 @@ Apply settings and continue? Όνομα Ελεγκτή - + Enabled Ενεργό - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Περιγραφή: - + Support: Υποστήριξη: - + Screens preview - + Input Mappings - - + + Search Αναζήτηση - - + + Add Προσθήκη - - + + Remove Αφαίρεση @@ -5382,22 +5431,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5407,28 +5456,28 @@ Apply settings and continue? Μάγος για τον Έλεγχο εκμάθησης (Μόνο MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Καθαρισμός Όλων - + Output Mappings @@ -5587,6 +5636,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6178,62 +6237,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Πληροφορίες - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7400,173 +7459,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Αρχική (μακρά καθυστέρηση) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled Απενεργοποιημένο - + Enabled Ενεργό - + Stereo Στεροφωνία - + Mono Μονοφωνία - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Σφάλμα ρυθμίσεων @@ -7584,131 +7642,131 @@ The loudness target is approximate and assumes track pregain and main output lev API Ήχου - + Sample Rate Ρυθμός Δειγματοληψίας - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine Μηχανή Κλειδώματος/Μεταβολής Τόνου - + Multi-Soundcard Synchronization Συγχρονισμός πολλών καρτών ήχου - + Output Έξοδος - + Input Είσοδος - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices Εντοπισμός Συσκευών @@ -7863,27 +7921,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available Η OpenGL δεν είναι διαθέσιμη - + dropped frames απορριφθέντα καρέ - + Cached waveforms occupy %1 MiB on disk. @@ -7896,250 +7955,256 @@ The loudness target is approximate and assumes track pregain and main output lev Επιλογές Κυματομορφής - + Frame rate Ρυθμός καρέ - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate Μέσος Ρυθμός καρέ - + Visual gain Οπτικό κέρδος - + Default zoom level Waveform zoom - + Displays the actual frame rate. Εμφανίζει πραγματικό ρυθμό ανανέωσης εικόνας (frame rate) - + Visual gain of the middle frequencies Οπτική ενίσχυση των μεσαίων συχνοτήτων - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Χαμηλά - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies Οπτική ενίσχυση των υψηλών συχνοτήτων - + Visual gain of the low frequencies Οπτική ενίσχυση των χαμηλών συχνοτήτων - + High Υψηλά - + Global visual gain Καθολική οπτική ενίσχυση - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. Συγχρονισμός επιπέδου μεγέθυνσης για όλες τις μορφές εμφάνισης κυματομορφής. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8147,47 +8212,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Υλικό Ήχου - + Controllers Ελεγκτές - + Library Βιβλιοθήκη - + Interface Διεπαφή - + Waveforms - + Mixer Μείκτης - + Auto DJ Αυτόματος DJ - + Decks - + Colors @@ -8222,47 +8287,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Εφέ - + Recording Ηχογράφηση - + Beat Detection - + Key Detection - + Normalization Κανονικοποίηση - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Έλεγχος βινυλίου - + Live Broadcasting Ζωντανή Εκπομπή - + Modplug Decoder @@ -8295,22 +8360,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Έναρξη Εγγραφής - + Recording to file: - + Stop Recording Διακοπή Εγγραφής - + %1 MiB written in %2 @@ -8618,284 +8683,284 @@ This can not be undone! - + Filetype: - + BPM: BPM: - + Location: - + Bitrate: - + Comments - + BPM BPM - + Sets the BPM to 75% of the current value. Θέτει το BPM στο 75% της τρέχουσας τιμής. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Θέτει το BPM στο 50% της τρέχουσας τιμής. - + Displays the BPM of the selected track. Απεικονίζει το BPM του επιλεγμένου κομματιού. - + Track # Αρ. κομματιού - + Album Artist Καλλιτέχνης δίσκου - + Composer Συνθέτης - + Title Τίτλος - + Grouping Ομαδοποίηση - + Key Κλειδί - + Year Έτος - + Artist Καλλιτέχνης - + Album Άλμπουμ - + Genre Είδος - + ReplayGain: - + Sets the BPM to 200% of the current value. Θέτει το BPM στο 200% της τρέχουσας τιμής. - + Double BPM Διπλασιασμός BPM - + Halve BPM Υποδιπλασιασμός BPM - + Clear BPM and Beatgrid Καθαρισμός BPM και πλέγματος χτύπων - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: Διάρκεια: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color Χρώμα - + Date added: - + Open in File Browser Άνοιξε το στο πρόγραμμα περιήγησης αρχείων - + Samplerate: - + Track BPM: BPM Κομματιού: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. Θέτει το BPM στο 66% της τρέχουσας τιμής. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Χτυπήστε για να θέσετε το BPM στον ρυθμό που επιθυμείτε. - + Tap to Beat Πατήστε για Ρυθμό - + Hint: Use the Library Analyze view to run BPM detection. Συμβουλή: Χρησιμοποιήστε την προβολή Ανάλυσης Βιβλιοθήκης για να τρέξετε τον εντοπισμό BPM. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Εφαρμογή - + &Cancel Ακύ&ρωση - + (no color) @@ -9052,7 +9117,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9254,27 +9319,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9418,38 +9483,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library Επιλέξτε την συλλογή του iTunes σας - + (loading) iTunes (φορτώνεται) iTunes - + Use Default Library Χρησιμοποιήστε την Προεπιλεγμένη Συλλογή - + Choose Library... Επιλέξτε Συλλογή - + Error Loading iTunes Library Σφάλμα στην Φόρτωση της Συλλογής του iTunes - + There was an error loading your iTunes library. Check the logs for details. @@ -9457,12 +9522,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9470,18 +9535,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9489,15 +9554,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9508,57 +9573,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9566,62 +9631,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9631,22 +9696,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Εισαγωγή λίστας αναπαραγωγής - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Αρχεία Λίστας (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9693,27 +9758,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9773,18 +9838,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9796,208 +9861,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Συσκευή Ήχου Απασχολημένη - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry Επανάληψη - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Επαναρύθμιση - + Help Βοήθεια - - + + Exit Έξοδος - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue Συνέχεια - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Σφάλμα στο αρχείο skin - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Επιβεβαίωση εξόδου - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. Το παράθυρο επιλογών είναι ακόμα ανοιχτό - + Discard any changes and exit Mixxx? Απαλοιφή αλλαγών και έξοδος του Mixxx; @@ -10013,13 +10119,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Κλείδωμα - - + + Playlists Λίστες Αναπαραγωγής @@ -10029,32 +10135,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Ξεκλείδωμα - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Δημιουργία νέας λίστας αναπαραγωγής @@ -11545,7 +11677,7 @@ Fully right: end of the effect period - + Deck %1 Deck %1 @@ -11678,7 +11810,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Διέλευση @@ -11709,7 +11841,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11842,12 +11974,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11882,42 +12014,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11975,54 +12107,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Λίστες Αναπαραγωγής - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12157,19 +12289,19 @@ may introduce a 'pumping' effect and/or distortion. Κλείδωμα - - + + Confirm Deletion Επιβεβαίωση Διαγραφής - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12581,7 +12713,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12763,7 +12895,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Εξώφυλλο @@ -12999,197 +13131,197 @@ may introduce a 'pumping' effect and/or distortion. Όταν χτυπηθεί, ρυθμίζει το μέσο BPM προς τα επάνω κατά μικρή δόση. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Ρυθμός και χτύπος BPM - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Αναπαραγωγή - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration Διάρκεια Ηχογράφησης @@ -13427,924 +13559,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix Μείξη - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear Εκκαθάριση - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Επόμενο - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Εναλλαγή στο επόμενο εφέ - + Previous Προηγούμενο - + Switch to the previous effect. Εναλλαγή στο προηγούμενο εφέ - + Next or Previous Επόμενο ή Προηγούμενο - + Switch to either the next or previous effect. Εναλλαγή είτε στο επόμενο είτε στο προηγούμενο εφέ - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Παράμετρος Εφέ - + Adjusts a parameter of the effect. Ρυθμίζει την παράμετρο του εφέ - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter Παράμετρος Ισοσταθμιστή - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Αναπαραγωγή/Παύση - + Jumps to the beginning of the track. Μεταπηδάει στην αρχή του κομματιού. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Συγχρονίζει το ρυθμό (BPM) και τη φάση σε αυτή του άλλου κομματιού, εάν αμφότερα τα BPM έχουν ανιχνευθεί. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. Συγχρονίζει το ρυθμό (BPM) σε αυτό του άλλου κομματιού, εάν αμφότερα τα BPM έχουν ανιχνευθεί. - + Sync and Reset Key Συγχρονισμός και Επαναφορά Κλειδιού. - + Increases the pitch by one semitone. Αυξάνει τον τόνο κατά ένα ημιτόνιο. - + Decreases the pitch by one semitone. Μειώνει τον τόνο κατά ένα ημιτόνιο. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14479,33 +14619,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Αρχίζει αναπαραγωγή από την αρχή του κομματιού. - + Jumps to the beginning of the track and stops. Μεταπηδάει στην αρχή του κομματιού και σταματάει. - - + + Plays or pauses the track. Παίζει ή παύει το κομμάτι. - + (while playing) (ενώ παίζει) @@ -14525,205 +14665,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (ενώ είναι σταματημένο) - + Cue - + Headphone Ακουστικά - + Mute Σίγαση - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Συγχρονίζει στο πρώτο κατά αριθμητική σειρά deck όπου παίζεται κομμάτι και υπάρχει BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Εάν δεν παίζει κανένα deck, συγχρονίζει στο πρώτο deck που έχει BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control Έλεγχος Ταχύτητας - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust Ρύθμιση Τόνου - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix Εγγραφή μίξης - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14768,254 +14918,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Γρήγορη Επιστροφή - + Fast rewind through the track. - + Fast Forward Γρήγορη Προώθηση - + Fast forward through the track. - + Jumps to the end of the track. Μετάβαση στο τέλος του κομματιού - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat Επανάληψη - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Αποβολή - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time Χρόνος κομματιού - + Track Duration Διάρκεια κομματιού - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist Καλλιτέχνης κομματιού - + Displays the artist of the loaded track. - + Track Title Τίτλος Κομματιού - + Displays the title of the loaded track. - + Track Album Τίτλος Δίσκου - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15023,12 +15173,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15036,47 +15186,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15248,47 +15393,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15412,407 +15557,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view - + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Εμφάνιση - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. Μεγιστοποίηση της βιλιοθήκης αρχείων ώστε να καταλαμβάνει ολόκληρο τον διαθέσιμο χώρο της οθόνης - + Space Menubar|View|Maximize Library - + &Full Screen &Πλήρης Οθόνη - + Display Mixxx using the full screen Εμφάνιση του Mixxx σε πλήρη οθόνη - + &Options &Επιλογές - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file Ηχογραφήστε την μίξη σας σε αρχείο - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences &Προτιμήσεις - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &Βοήθεια - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application - + Help translate this application into your language. - + &About &Περί - + About the application @@ -15820,25 +15996,25 @@ This can not be undone! WOverview - + Passthrough Διέλευση - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15847,25 +16023,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Αναζήτηση - + Clear input @@ -15876,169 +16040,163 @@ This can not be undone! Αναζήτηση - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Κλειδί - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Καλλιτέχνης - + Album Artist Καλλιτέχνης δίσκου - + Composer Συνθέτης - + Title Τίτλος - + Album Άλμπουμ - + Grouping Ομαδοποίηση - + Year Έτος - + Genre Είδος - + Directory - + &Search selected @@ -16046,599 +16204,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist Προσθήκη στη Λίστα Αναπαραγωγής - + Crates Κιβώτια - + Metadata - + Update external collections - + Cover Art Εξώφυλλο - + Adjust BPM - + Select Color - - + + Analyze Ανάλυση - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Προσθήκη στη λίστα του Αυτόματου DJ (στο τέλος) - + Add to Auto DJ Queue (top) Προσθήκη στη λίστα του Αυτόματου DJ (στην αρχή) - + Add to Auto DJ Queue (replace) Προσθήκη στη λίστα του Αυτόματου DJ (Αντικατάσταση) - + Preview Deck - + Remove Αφαίρεση - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Ιδιότητες - + Open in File Browser Άνοιξε το στο πρόγραμμα περιήγησης αρχείων - + Select in Library - + Import From File Tags Εισαγωγή Από Ετικέτες Αρχείου - + Import From MusicBrainz Εισαγωγή από MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Αξιολόγηση - + Cue Point - + + Hotcues - + Intro - + Outro - + Key Κλειδί - + ReplayGain ReplayGain - + Waveform Κυματομορφή - + Comment Σχόλιο - + All Όλα - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Kλείδωμα BPM - + Unlock BPM Ξεκλείδωμα BPM - + Double BPM Διπλασιασμός BPM - + Halve BPM Υποδιπλασιασμός BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Δημιουργία νέας λίστας αναπαραγωγής - + Enter name for new playlist: Εισάγετε όνομα για τη νέα λίστα αναπαραγωγής: - + New Playlist Νέα Λίστα Αναπαραγωγής - - - + + + Playlist Creation Failed Η δημιουργία λίστας αναπαραγωγής απέτυχε - + A playlist by that name already exists. Μια λίστα αναπαραγωγής με αυτό το όνομα υπάρχει ήδη. - + A playlist cannot have a blank name. Η λίστα αναπαραγωγής δεν μπορεί να έχει κενό όνομα. - + An unknown error occurred while creating playlist: Προέκυψε άγνωστο σφάλμα κατά τη δημιουργία λίστας: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Άκυρο - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Κλείσιμο - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16654,37 +16838,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16692,37 +16876,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16730,60 +16914,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Εμφάνιση ή κρύψιμο στηλών + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Επιλογή καταλόγου μουσικής συλλογής - + controllers - + Cannot open database Αδυναμία ανοίγματος της βάσης δεδομένων - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16797,67 +16986,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Περιηγηθείτε - + Export directory - + Database version - + Export Εξαγωγή - + Cancel Άκυρο - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16878,7 +17078,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16888,23 +17088,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_en_CA.qm b/res/translations/mixxx_en_CA.qm index 446e85d9c35b29e7c7689563f45bab2e9f0bcd06..9360e0a23ce2eb8db1dae9d7a52fedbd65512543 100644 GIT binary patch delta 761 zcmW-eT}V@L7{<^4+1Z!Qoo%|aFY}bk*~d~VH!1Q1lW7pMd7)|LC`wbvNK+w517mep z@m7|k7ZF=n8TF5b5avyeZj>(4ib^Ob`aq$AT?E;|i-+IM%frL(y|QSH&s#6&v5SwC zB?kRnlHfyDH!yQ40ycERj7^UzJmXkcCQ4ftWCAE#vJ4w>rrb*pT=-yL8 zAB3c%MSUkl4C`U=Qoo@B+50JJXhY5tDaKhC-tlGQ7r;G83#I|s{!mlaW3rle**w2l zOSo9T_%u7%@>US#DvFxNkoknKnEL?Rb>45)F*v*Vpe+a}E0oNca%WFy4xC;P@McMK zVEmV$IZ>rKR9GsAP6u7G%W%A)g#8trlaIkVPhaImI6w1B#~6dnLW|Bg^c{4;6||XO zi#PT>6U4l(}c>B6m)!q=L@`ErYX(fLXZS^`S z;`KxSkp{gL(0=C6y^Rc>OXMh+fUM!Ef*^x6lU961F#e$8LK(TeR9iRzOMs^eCm3?} zQUAuBd~)M026F>7ZSI5XJI!s5K{v{q{9y+7GEZz#X_@8eqBaIYl%geVa6aUz5+8$U z3oUPLg?*aWZ;LZXrIg-2kNk0(D-FZmOiEx1N)IgtWLQQh9mqpw1$PA1e^>`dDVu;j zm(P`TsY{4g?wHcpvI3^WgDV0nJ-SLU$3;?k7}9ZymWSZ-QKEbd<`}Q7P&=d#yuQ+` z`r$lUrONd9czg9zhO7}%YGN>r@I+07NuBqG1mW<_Rf@JFTndF4yhduO-9a~MJK^ma n?r0G=4EgIW`0JP&sL>?-b>egF@V>Bkez-p(_9oK};z;g)V=?VQ delta 1509 zcmZ8eZERCj7(Vyy?Y&#quB_Wy+Li7?p%wN$w{~6FM>f}vgfKTWP;?Zd zcAv%aJ$riFyM%Qc*r~*`gxzonXYKo;G>5#STYry|b*LeSivf2p4pv-%HGg8AbH-rm z*KhjcVaoZ2deg}PI9|i=TtTRq#k$G~aP{G0WzbM4>tF18jOzQV$_up&6gR5=_4}#7 z&tZ0h4@@896K2;A1)E<#q0b8Y*)1mA@4l~WxZ;~JI}z{82UH2 za_Qgc(EO^rnF?W%&|GyG*8PQB(c>JT~9KmMNC#2NmH;?9t3awQpy+gq~j?enXQYkE{A~xDOQY(k>qNzUVDgE zt~*GA*~}H4m(SCdh?HI02oR%PGs%PO+i@^Mr1`2;t5J?L`=oy1m!6S zeMw3_EGEXpVWC|J$J6PwuszUc(g4%WK?92QSkV)V%p<4LL&V^Evt20A2N~ zuMYGj{gNP$N{X10m838nACiRr(UI1MhUS`v#+GV9R8sL|sNTkrpN_E4JO2UBOQKu= diff --git a/res/translations/mixxx_en_CA.ts b/res/translations/mixxx_en_CA.ts index 6c07734ae43d..df107c1f9a3e 100644 --- a/res/translations/mixxx_en_CA.ts +++ b/res/translations/mixxx_en_CA.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Remove Crate as Track Source - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Add Crate as Track Source @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist New Playlist @@ -160,7 +160,7 @@ - + Create New Playlist Create New Playlist @@ -190,113 +190,120 @@ Duplicate - - + + Import Playlist Import Playlist - + Export Track Files Export Track Files - + Analyze entire Playlist Analyse entire Playlist - + Enter new name for playlist: Enter new name for playlist: - + Duplicate Playlist Duplicate Playlist - - + + Enter name for new playlist: Enter name for new playlist: - - + + Export Playlist Export Playlist - + Add to Auto DJ Queue (replace) Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Rename Playlist - - + + Renaming Playlist Failed Renaming Playlist Failed - - - + + + A playlist by that name already exists. A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. A playlist cannot have a blank name. - + _copy //: Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Playlist Creation Failed - - + + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);; M3U8 Playlist (*.m3u8);; PLS Playlist (*.pls);; Text CSV (*.csv);; Readable Text (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Timestamp @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Couldn't load track. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Album Artist - + Artist Artist - + Bitrate Bitrate - + BPM BPM - + Channels Channels - + Color Color - + Comment Comment - + Composer Composer - + Cover Art Show Cover Art - + Date Added Date Added - + Last Played - + Duration Duration - + Type Type - + Genre Genre - + Grouping Grouping - + Key Key - + Location Location - + + Overview + + + + Preview Preview - + Rating Rating - + ReplayGain ReplayGain - + Samplerate Samplerate - + Played Played - + Title Title - + Track # Track # - + Year Year - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Add to Quick Links - + Remove from Quick Links Remove from Quick Links - + Add to Library Add to Library - + Refresh directory tree - + Quick Links Quick Links - - + + Devices Devices - + Removable Devices Removable Devices - - + + Computer Computer - + Music Directory Added Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan Scan - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1046,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Set to full volume - + Set to zero volume Set to zero volume @@ -1077,13 +1099,13 @@ trace - Above + Profiling messages Reverse roll (Censor) button - + Headphone listen button Headphone listen button - + Mute button Mute button @@ -1094,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Mix orientation (e.g. left, right, center) - + Set mix orientation to left Set mix orientation to left - + Set mix orientation to center Set mix orientation to center - + Set mix orientation to right Set mix orientation to right @@ -1153,22 +1175,22 @@ trace - Above + Profiling messages BPM tap button - + Toggle quantize mode Toggle quantize mode - + One-time beat sync (tempo only) One-time beat sync (tempo only) - + One-time beat sync (phase only) One-time beat sync (phase only) - + Toggle keylock mode Toggle keylock mode @@ -1178,193 +1200,193 @@ trace - Above + Profiling messages Equalizers - + Vinyl Control Vinyl Control - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer Pass through external audio into the internal mixer - + Cues Cues - + Cue button Cue button - + Set cue point Set cue point - + Go to cue point Go to cue point - + Go to cue point and play Go to cue point and play - + Go to cue point and stop Go to cue point and stop - + Preview from cue point Preview from cue point - + Cue button (CDJ mode) Cue button (CDJ mode) - + Stutter cue Stutter cue - + Hotcues Hotcues - + Set, preview from or jump to hotcue %1 Set, preview from or jump to hotcue %1 - + Clear hotcue %1 Clear hotcue %1 - + Set hotcue %1 Set hotcue %1 - + Jump to hotcue %1 Jump to hotcue %1 - + Jump to hotcue %1 and stop Jump to hotcue %1 and stop - + Jump to hotcue %1 and play Jump to hotcue %1 and play - + Preview from hotcue %1 Preview from hotcue %1 - - + + Hotcue %1 Hotcue %1 - + Looping Looping - + Loop In button Loop In button - + Loop Out button Loop Out button - + Loop Exit button Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Move loop forward by %1 beats - + Move loop backward by %1 beats Move loop backward by %1 beats - + Create %1-beat loop Create %1-beat loop - + Create temporary %1-beat loop roll Create temporary %1-beat loop roll @@ -1480,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader Volume Fader - + Full Volume Full Volume - + Zero Volume Zero Volume @@ -1509,7 +1531,7 @@ trace - Above + Profiling messages - + Mute Mute @@ -1520,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen Headphone Listen @@ -1541,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation Orientation - + Orient Left Orient Left - + Orient Center Orient Center - + Orient Right Orient Right @@ -1629,82 +1651,82 @@ trace - Above + Profiling messages Adjust the beatgrid to the right - + Adjust Beatgrid Adjust Beatgrid - + Align beatgrid to current position Align beatgrid to current position - + Adjust Beatgrid - Match Alignment Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. Adjust beatgrid to match another playing deck. - + Quantize Mode Quantize Mode - + Sync Sync - + Beat Sync One-Shot Beat Sync One-Shot - + Sync Tempo One-Shot Sync Tempo One-Shot - + Sync Phase One-Shot Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust Pitch Adjust - + Adjust pitch from speed slider pitch Adjust pitch from speed slider pitch - + Match musical key Match musical key - + Match Key Match Key - + Reset Key Reset Key - + Resets key to original Resets key to original @@ -1745,451 +1767,451 @@ trace - Above + Profiling messages Low EQ - + Toggle Vinyl Control Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode Vinyl Control Mode - + Vinyl Control Cueing Mode Vinyl Control Cueing Mode - + Vinyl Control Passthrough Vinyl Control Passthrough - + Vinyl Control Next Deck Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck Single deck mode - Switch vinyl control to next deck - + Cue Cue - + Set Cue Set Cue - + Go-To Cue Go-To Cue - + Go-To Cue And Play Go-To Cue And Play - + Go-To Cue And Stop Go-To Cue And Stop - + Preview Cue Preview Cue - + Cue (CDJ Mode) Cue (CDJ Mode) - + Stutter Cue Stutter Cue - + Go to cue point and play after release Go to cue point and play after release - + Clear Hotcue %1 Clear Hotcue %1 - + Set Hotcue %1 Set Hotcue %1 - + Jump To Hotcue %1 Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play Jump To Hotcue %1 And Play - + Preview Hotcue %1 Preview Hotcue %1 - + Loop In Loop In - + Loop Out Loop Out - + Loop Exit Loop Exit - + Reloop/Exit Loop Reloop/Exit Loop - + Loop Halve Loop Halve - + Loop Double Loop Double - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Move Loop +%1 Beats - + Move Loop -%1 Beats Move Loop -%1 Beats - + Loop %1 Beats Loop %1 Beats - + Loop Roll %1 Beats Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Add to Auto DJ Queue (bottom) - + Append the selected track to the Auto DJ Queue Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Add to Auto DJ Queue (top) - + Prepend selected track to the Auto DJ Queue Prepend selected track to the Auto DJ Queue - + Load Track Load Track - + Load selected track Load selected track - + Load selected track and play Load selected track and play - - + + Record Mix Record Mix - + Toggle mix recording Toggle mix recording - + Effects Effects - + Quick Effects Quick Effects - + Deck %1 Quick Effect Super Knob Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect Quick Effect - + Clear Unit Clear Unit - + Clear effect unit Clear effect unit - + Toggle Unit Toggle Unit - + Dry/Wet Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob Super Knob - + Next Chain Next Chain - + Assign Assign - + Clear Clear - + Clear the current effect Clear the current effect - + Toggle Toggle - + Toggle the current effect Toggle the current effect - + Next Next - + Switch to next effect Switch to next effect - + Previous Previous - + Switch to the previous effect Switch to the previous effect - + Next or Previous Next or Previous - + Switch to either next or previous effect Switch to either next or previous effect - - + + Parameter Value Parameter Value - - + + Microphone Ducking Strength Microphone Ducking Strength - + Microphone Ducking Mode Microphone Ducking Mode - + Gain Gain - + Gain knob Gain knob - + Shuffle the content of the Auto DJ queue Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue Skip the next track in the Auto DJ queue - + Auto DJ Toggle Auto DJ Toggle - + Toggle Auto DJ On/Off Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Show or hide the mixer. - + Cover Art Show/Hide (Library) Cover Art Show/Hide (Library) - + Show/hide cover art in the library Show/hide cover art in the library - + Library Maximize/Restore Library Maximize/Restore - + Maximize the track library to take up all the available screen space. Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide Effect Rack Show/Hide - + Show/hide the effect rack Show/hide the effect rack - + Waveform Zoom Out Waveform Zoom Out @@ -2204,102 +2226,102 @@ trace - Above + Profiling messages Headphone gain - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Playback Speed - + Playback speed control (Vinyl "Pitch" slider) Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) Pitch (Musical key) - + Increase Speed Increase Speed - + Adjust speed faster (coarse) Adjust speed faster (coarse) - + Increase Speed (Fine) Increase Speed (Fine) - + Adjust speed faster (fine) Adjust speed faster (fine) - + Decrease Speed Decrease Speed - + Adjust speed slower (coarse) Adjust speed slower (coarse) - + Adjust speed slower (fine) Adjust speed slower (fine) - + Temporarily Increase Speed Temporarily Increase Speed - + Temporarily increase speed (coarse) Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) Temporarily increase speed (fine) - + Temporarily Decrease Speed Temporarily Decrease Speed - + Temporarily decrease speed (coarse) Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) Temporarily decrease speed (fine) @@ -2451,1053 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock Keylock - + CUP (Cue + Play) CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker Intro Start Marker - + Intro End Marker Intro End Marker - + Outro Start Marker Outro Start Marker - + Outro End Marker Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats Loop Selected Beats - + Create a beat loop of selected beat size Create a beat loop of selected beat size - + Loop Roll Selected Beats Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop Reloop And Stop - + Enable loop, jump to Loop In point, and stop Enable loop, jump to Loop In point, and stop - + Halve the loop length Halve the loop length - + Double the loop length Double the loop length - + Beat Jump / Loop Move Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navigation - + Move up Move up - + Equivalent to pressing the UP key on the keyboard Equivalent to pressing the UP key on the keyboard - + Move down Move down - + Equivalent to pressing the DOWN key on the keyboard Equivalent to pressing the DOWN key on the keyboard - + Move up/down Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left Move left - + Equivalent to pressing the LEFT key on the keyboard Equivalent to pressing the LEFT key on the keyboard - + Move right Move right - + Equivalent to pressing the RIGHT key on the keyboard Equivalent to pressing the RIGHT key on the keyboard - + Move left/right Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button Quick Effect Enable Button - + Enable or disable effect processing Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes Toggle effect unit between D/W and D+W modes - + Next chain preset Next chain preset - + Previous Chain Previous Chain - + Previous chain preset Previous chain preset - + Next/Previous Chain Next/Previous Chain - + Next or previous chain preset Next or previous chain preset - - + + Show Effect Parameters Show Effect Parameters - + Effect Unit Assignment - + Meta Knob Meta Knob - + Effect Meta Knob (control linked effect parameters) Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary Microphone / Auxiliary - + Microphone On/Off Microphone On/Off - + Microphone on/off Microphone on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off Auxiliary On/Off - + Auxiliary on/off Auxiliary on/off - + Auto DJ Auto DJ - + Auto DJ Shuffle Auto DJ Shuffle - + Auto DJ Skip Next Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Auto DJ Fade To Next - + Trigger the transition to the next track Trigger the transition to the next track - + User Interface User Interface - + Samplers Show/Hide Samplers Show/Hide - + Show/hide the sampler section Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Vinyl Control Show/Hide - + Show/hide the vinyl control section Show/hide the vinyl control section - + Preview Deck Show/Hide Preview Deck Show/Hide - + Show/hide the preview deck Show/hide the preview deck - + Toggle 4 Decks Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Waveform zoom - + Waveform Zoom Waveform Zoom - + Zoom waveform in Zoom waveform in - + Waveform Zoom In Waveform Zoom In - + Zoom waveform out Zoom waveform out - + Star Rating Up Star Rating Up - + Increase the track rating by one star Increase the track rating by one star - + Star Rating Down Star Rating Down - + Decrease the track rating by one star Decrease the track rating by one star @@ -3612,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. The script code needs to be fixed. @@ -3745,7 +3777,7 @@ trace - Above + Profiling messages Import Crate - + Export Crate Export Crate @@ -3755,7 +3787,7 @@ trace - Above + Profiling messages Unlock - + An unknown error occurred while creating crate: An unknown error occurred while creating crate: @@ -3764,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate Rename Crate - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3787,17 +3813,17 @@ trace - Above + Profiling messages Renaming Crate Failed - + Crate Creation Failed Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);; M3U8 Playlist (*.m3u8);; PLS Playlist (*.pls);; Text CSV (*.csv);; Readable Text (*.txt) - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) @@ -3806,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Crates are a great way to help organize the music you want to DJ with. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3917,12 +3949,12 @@ trace - Above + Profiling messages Past Contributors - + Official Website - + Donate @@ -4445,37 +4477,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - + Didn't get any midi messages. Please try again. Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: Successfully mapped control: - + <i>Ready to learn %1</i> <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4514,17 +4546,17 @@ You tried to learn: %1,%2 Dump to csv - + Log Log - + Search Search - + Stats Stats @@ -5177,114 +5209,114 @@ associated with each key. DlgPrefController - + Apply device settings? Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None None - + %1 by %2 %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? Do you want to save the changes? - + Troubleshooting Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Clear Input Mappings - + Are you sure you want to clear all input mappings? Are you sure you want to clear all input mappings? - + Clear Output Mappings Clear Output Mappings - + Are you sure you want to clear all output mappings? Are you sure you want to clear all output mappings? @@ -5302,100 +5334,100 @@ Apply settings and continue? Enabled - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Description: - + Support: Support: - + Screens preview - + Input Mappings Input Mappings - - + + Search Search - - + + Add Add - - + + Remove Remove @@ -5415,17 +5447,17 @@ Apply settings and continue? - + Mapping Info - + Author: Author: - + Name: Name: @@ -5435,28 +5467,28 @@ Apply settings and continue? Learning Wizard (MIDI Only) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Clear All - + Output Mappings Output Mappings @@ -5615,6 +5647,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6229,62 +6271,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run Allow screensaver to run - + Prevent screensaver from running Prevent screensaver from running - + Prevent screensaver while playing Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes This skin does not support color schemes - + Information Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7451,173 +7493,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Default (long delay) - + Experimental (no delay) Experimental (no delay) - + Disabled (short delay) Disabled (short delay) - + Soundcard Clock Soundcard Clock - + Network Clock Network Clock - + Direct monitor (recording and broadcasting only) Direct monitor (recording and broadcasting only) - + Disabled Disabled - + Enabled Enabled - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. Refer to the Mixxx User Manual for details. - + Configured latency has changed. Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Configuration error @@ -7635,131 +7676,131 @@ The loudness target is approximate and assumes track pregain and main output lev Sound API - + Sample Rate Sample Rate - + Audio Buffer Audio Buffer - + Engine Clock Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode Microphone Monitor Mode - + Microphone Latency Compensation Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization Multi-Soundcard Synchronization - + Output Output - + Input Input - + System Reported Latency System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices Query Devices @@ -8207,47 +8248,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Sound Hardware - + Controllers Controllers - + Library Library - + Interface Interface - + Waveforms Waveforms - + Mixer Mixer - + Auto DJ Auto DJ - + Decks Decks - + Colors Colors @@ -8282,47 +8323,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Effects - + Recording Recording - + Beat Detection Beat Detection - + Key Detection Key Detection - + Normalization Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Vinyl Control - + Live Broadcasting Live Broadcasting - + Modplug Decoder Modplug Decoder @@ -8678,284 +8719,284 @@ This can not be undone! Summary - + Filetype: Filetype: - + BPM: BPM: - + Location: Location: - + Bitrate: Bitrate: - + Comments Comments - + BPM BPM - + Sets the BPM to 75% of the current value. Sets the BPM to 75% of the current value. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. Displays the BPM of the selected track. - + Track # Track # - + Album Artist Album Artist - + Composer Composer - + Title Title - + Grouping Grouping - + Key Key - + Year Year - + Artist Artist - + Album Album - + Genre Genre - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. Sets the BPM to 200% of the current value. - + Double BPM Double BPM - + Halve BPM Halve BPM - + Clear BPM and Beatgrid Clear BPM and Beatgrid - + Move to the previous item. "Previous" button Move to the previous item. - + &Previous &Previous - + Move to the next item. "Next" button Move to the next item. - + &Next &Next - + Duration: Duration: - + Import Metadata from MusicBrainz Import Metadata from MusicBrainz - + Re-Import Metadata from file Re-Import Metadata from file - + Color Color - + Date added: Date added: - + Open in File Browser Open in File Browser - + Samplerate: - + Track BPM: Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. Converts beats detected by the analyser into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo Assume constant tempo - + Sets the BPM to 66% of the current value. Sets the BPM to 66% of the current value. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. Sets the BPM to 150% of the current value. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. Sets the BPM to 133% of the current value. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. Hint: Use the Library Analyse view to run BPM detection. - + Save changes and close the window. "OK" button Save changes and close the window. - + &OK &OK - + Discard changes and close the window. "Cancel" button Discard changes and close the window. - + Save changes and keep the window open. "Apply" button Save changes and keep the window open. - + &Apply &Apply - + &Cancel &Cancel - + (no color) @@ -9112,7 +9153,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9314,27 +9355,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (faster) - + Rubberband (better) Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9549,15 +9590,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Safe Mode Enabled - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9569,57 +9610,57 @@ Shown when VuMeter can not be displayed. Please keep support. - + activate activate - + toggle toggle - + right right - + left left - + right small right small - + left small left small - + up up - + down down - + up small up small - + down small down small - + Shortcut Shortcut @@ -9627,62 +9668,62 @@ support. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9692,22 +9733,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Playlist Files (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9757,27 +9798,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9838,18 +9879,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Missing Tracks - + Hidden Tracks Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9861,212 +9902,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Exit</b> Mixxx. - + Retry Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigure - + Help Help - - + + Exit Exit - - + + Mixxx was unable to open all the configured sound devices. Mixxx was unable to open all the configured sound devices. - + Sound Device Error Sound Device Error - + <b>Retry</b> after fixing an issue <b>Retry</b> after fixing an issue - + No Output Devices No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. <b>Continue</b> without any outputs. - + Continue Continue - + Load track to Deck %1 Load track to Deck %1 - + Deck %1 is currently playing a track. Deck %1 is currently playing a track. - + Are you sure you want to load a new track? Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Error in skin file - + The selected skin cannot be loaded. The selected skin cannot be loaded. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirm Exit - + A deck is currently playing. Exit Mixxx? A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. The preferences window is still open. - + Discard any changes and exit Mixxx? Discard any changes and exit Mixxx? @@ -10082,13 +10164,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Lock - - + + Playlists Playlists @@ -10098,32 +10180,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Unlock - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Create New Playlist @@ -11641,7 +11749,7 @@ Fully right: end of the effect period - + Deck %1 Deck %1 @@ -11774,7 +11882,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Passthrough @@ -11805,7 +11913,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11938,12 +12046,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11978,42 +12086,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12071,54 +12179,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Playlists - + Folders Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids Beatgrids - + Memory cues Memory cues - + (loading) Rekordbox (loading) Rekordbox @@ -12677,7 +12785,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Spinning Vinyl @@ -12859,7 +12967,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Show Cover Art @@ -13095,197 +13203,197 @@ may introduce a 'pumping' effect and/or distortion. When tapped, adjusts the average BPM up by a small amount. - + Adjust Beats Earlier Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Tempo and BPM Tap - + Show/hide the spinning vinyl section. Show/hide the spinning vinyl section. - + Keylock Keylock - + Toggling keylock during playback may result in a momentary audio glitch. Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. Seeks the track to the cue point and stops. - + Play Play - + Plays track from the cue point. Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input Select and configure a hardware device for this input - + Recording Duration Recording Duration @@ -13523,928 +13631,934 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward Beatjump Forward - + Jump forward by the set number of beats. Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. Move the loop forward by the set number of beats. - + Jump forward by 1 beat. Jump forward by 1 beat. - + Move the loop forward by 1 beat. Move the loop forward by 1 beat. - + Beatjump Backward Beatjump Backward - + Jump backward by the set number of beats. Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. Move the loop backward by the set number of beats. - + Jump backward by 1 beat. Jump backward by 1 beat. - + Move the loop backward by 1 beat. Move the loop backward by 1 beat. - + Reloop Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. Show/hide intro & outro markers and associated buttons. - + Intro Start Marker Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. If marker is set, clears the marker. - + Intro End Marker Intro End Marker - + Outro Start Marker Outro Start Marker - + Outro End Marker Outro End Marker - + Mix Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry D+W mode: Add wet to dry - + Mix Mode Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu Skin Settings Menu - + Show/hide skin settings menu Show/hide skin settings menu - + Save Sampler Bank Save Sampler Bank - + Save the collection of samples loaded in the samplers. Save the collection of samples loaded in the samplers. - + Load Sampler Bank Load Sampler Bank - + Load a previously saved collection of samples into the samplers. Load a previously saved collection of samples into the samplers. - + Show Effect Parameters Show Effect Parameters - + Enable Effect Enable Effect - + Meta Knob Link Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Super Knob - + Next Chain Next Chain - + Previous Chain Previous Chain - + Next/Previous Chain Next/Previous Chain - + Clear Clear - + Clear the current effect. Clear the current effect. - + Toggle Toggle - + Toggle the current effect. Toggle the current effect. - + Next Next - + Clear Unit Clear Unit - + Clear effect unit. Clear effect unit. - + Show/hide parameters for effects in this unit. Show/hide parameters for effects in this unit. - + Toggle Unit Toggle Unit - + Enable or disable this whole effect unit. Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit Assign Effect Unit - + Assign this effect unit to the channel output. Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Switch to the next effect. - + Previous Previous - + Switch to the previous effect. Switch to the previous effect. - + Next or Previous Next or Previous - + Switch to either the next or previous effect. Switch to either the next or previous effect. - + Meta Knob Meta Knob - + Controls linked parameters of this effect Controls linked parameters of this effect - + Effect Focus Button Effect Focus Button - + Focuses this effect. Focuses this effect. - + Unfocuses this effect. Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Effect Parameter - + Adjusts a parameter of the effect. Adjusts a parameter of the effect. - + Inactive: parameter not linked Inactive: parameter not linked - + Active: parameter moves with Meta Knob Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter Equalizer Parameter - + Adjusts the gain of the EQ filter. Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. If quantize is enabled, snaps to the nearest beat. - + Quantize Quantize - + Toggles quantization. Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse Reverse - + Reverses track playback during regular playback. Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Play/Pause - + Jumps to the beginning of the track. Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key Sync and Reset Key - + Increases the pitch by one semitone. Increases the pitch by one semitone. - + Decreases the pitch by one semitone. Decreases the pitch by one semitone. - + Enable Vinyl Control Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. When enabled, the track responds to external vinyl control. - + Enable Passthrough Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. Displays options for editing cover artwork. - + Star Rating Star Rating - + Assign ratings to individual tracks by clicking the stars. Assign ratings to individual tracks by clicking the stars. @@ -14579,33 +14693,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Microphone Talkover Ducking Strength - + Prevents the pitch from changing when the rate changes. Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. Plays or pauses the track. - + (while playing) (while playing) @@ -14625,215 +14739,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (while stopped) - + Cue Cue - + Headphone Headphone - + Mute Mute - + Old Synchronize Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. Resets the key to the original track key. - + Speed Control Speed Control - - - + + + Changes the track pitch independent of the tempo. Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. Decreases the pitch by 10 cents. - + Pitch Adjust Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Record Mix - + Toggle mix recording. Toggle mix recording. - + Enable Live Broadcasting Enable Live Broadcasting - + Stream your mix over the Internet. Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit Loop Exit - + Turns the current loop off. Turns the current loop off. - + Slip Mode Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track Track Key - + Displays the musical key of the loaded track. Displays the musical key of the loaded track. - + Clock Clock - + Displays the current time. Displays the current time. - + Audio Latency Usage Meter Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator Audio Latency Overload Indicator @@ -14878,254 +14992,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Displays the current musical key of the loaded track after pitch shifting. - + Fast Rewind Fast Rewind - + Fast rewind through the track. Fast rewind through the track. - + Fast Forward Fast Forward - + Fast forward through the track. Fast forward through the track. - + Jumps to the end of the track. Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Pitch Control - + Pitch Rate Pitch Rate - + Displays the current playback rate of the track. Displays the current playback rate of the track. - + Repeat Repeat - + When active the track will repeat if you go past the end or reverse before the start. When active the track will repeat if you go past the end or reverse before the start. - + Eject Eject - + Ejects track from the player. Ejects track from the player. - + Hotcue Hotcue - + If hotcue is set, jumps to the hotcue. If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status Vinyl Status - + Provides visual feedback for vinyl control status: Provides visual feedback for vinyl control status: - + Green for control enabled. Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker Loop-In Marker - + Loop-Out Marker Loop-Out Marker - + Loop Halve Loop Halve - + Halves the current loop's length by moving the end marker. Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. Deck immediately loops if past the new endpoint. - + Loop Double Loop Double - + Doubles the current loop's length by moving the end marker. Doubles the current loop's length by moving the end marker. - + Beatloop Beatloop - + Toggles the current loop on or off. Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time Track Time - + Track Duration Track Duration - + Displays the duration of the loaded track. Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. Information is loaded from the track's metadata tags. - + Track Artist Track Artist - + Displays the artist of the loaded track. Displays the artist of the loaded track. - + Track Title Track Title - + Displays the title of the loaded track. Displays the title of the loaded track. - + Track Album Track Album - + Displays the album name of the loaded track. Displays the album name of the loaded track. - + Track Artist/Title Track Artist/Title - + Displays the artist and title of the loaded track. Displays the artist and title of the loaded track. @@ -15133,12 +15247,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15353,47 +15467,47 @@ This can not be undone! WCueMenuPopup - + Cue number Cue number - + Cue position Cue position - + Edit cue label Edit cue label - + Label... Label... - + Delete this cue Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Hotcue #%1 @@ -15518,323 +15632,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Create &New Playlist - + Create a new playlist Create a new playlist - + Ctrl+n Ctrl+n - + Create New &Crate Create New &Crate - + Create a new crate Create a new crate - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. May not be supported on all skins. - + Show Skin Settings Menu Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Show Microphone Section - + Show the microphone section of the Mixxx interface. Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Show Preview Deck - + Show the preview deck in the Mixxx interface. Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Show Cover Art - + Show cover art in the Mixxx interface. Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximize Library - + Maximize the track library to take up all the available screen space. Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library Space - + &Full Screen &Full Screen - + Display Mixxx using the full screen Display Mixxx using the full screen - + &Options &Options - + &Vinyl Control &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 Enable Vinyl Control &%1 - + &Record Mix &Record Mix - + Record your mix to a file Record your mix to a file - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off Toggles keyboard shortcuts on or off - + Ctrl+` Ctrl+` - + &Preferences &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer &Developer - + &Reload Skin &Reload Skin - + Reload the skin Reload the skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Developer &Tools - + Opens the developer tools dialog Opens the developer tools dialog - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Deb&ugger Enabled - + Enables the debugger during skin parsing Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Help - + Show Keywheel menu title @@ -15851,74 +15995,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Community Support - + Get help with Mixxx Get help with Mixxx - + &User Manual &User Manual - + Read the Mixxx user manual. Read the Mixxx user manual. - + &Keyboard Shortcuts &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Translate This Application - + Help translate this application into your language. Help translate this application into your language. - + &About &About - + About the application About the application @@ -15926,25 +16070,25 @@ This can not be undone! WOverview - + Passthrough Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15953,25 +16097,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Clear input - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Search - + Clear input Clear input @@ -15982,169 +16114,163 @@ This can not be undone! Search... - + Clear the search bar input field Clear the search bar input field - - Enter a string to search for - Enter a string to search for + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Shortcut + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Focus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Exit search + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Key - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artist - + Album Artist Album Artist - + Composer Composer - + Title Title - + Album Album - + Grouping Grouping - + Year Year - + Genre Genre - + Directory - + &Search selected @@ -16152,620 +16278,625 @@ This can not be undone! WTrackMenu - + Load to Load to - + Deck Deck - + Sampler Sampler - + Add to Playlist Add to Playlist - + Crates Crates - + Metadata Metadata - + Update external collections Update external collections - + Cover Art Show Cover Art - + Adjust BPM Adjust BPM - + Select Color Select Color - - + + Analyze Analyse - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Add to Auto DJ Queue (bottom) - + Add to Auto DJ Queue (top) Add to Auto DJ Queue (top) - + Add to Auto DJ Queue (replace) Add to Auto DJ Queue (replace) - + Preview Deck Preview Deck - + Remove Remove - + Remove from Playlist Remove from Playlist - + Remove from Crate Remove from Crate - + Hide from Library Hide from Library - + Unhide from Library Unhide from Library - + Purge from Library Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Properties - + Open in File Browser Open in File Browser - + Select in Library - + Import From File Tags Import From File Tags - + Import From MusicBrainz Import From MusicBrainz - + Export To File Tags Export To File Tags - + BPM and Beatgrid BPM and Beatgrid - + Play Count Play Count - + Rating Rating - + Cue Point Cue Point - - + + Hotcues Hotcues - + Intro Intro - + Outro Outro - + Key Key - + ReplayGain ReplayGain - + Waveform Waveform - + Comment Comment - + All All - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Lock BPM - + Unlock BPM Unlock BPM - + Double BPM Double BPM - + Halve BPM Halve BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Create New Playlist - + Enter name for new playlist: Enter name for new playlist: - + New Playlist New Playlist - - - + + + Playlist Creation Failed Playlist Creation Failed - + A playlist by that name already exists. A playlist by that name already exists. - + A playlist cannot have a blank name. A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + Add to New Crate Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Cancel - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) Setting cover art of %n track(s)Setting cover art of %n track(s) - + Reloading cover art of %n track(s) Reloading cover art of %n track(s)Reloading cover art of %n track(s) @@ -16781,37 +16912,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16819,37 +16950,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16857,12 +16988,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Show or hide columns. - + Shuffle Tracks @@ -16870,52 +17001,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Choose music library directory - + controllers - + Cannot open database Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16929,68 +17060,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse Browse - + Export directory - + Database version - + Export Export - + Cancel Cancel - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -17011,7 +17152,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17021,23 +17162,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_en_GB.qm b/res/translations/mixxx_en_GB.qm index 939708fbf4da290cc36f087567318b75bb40b10c..9b5af989606f7d26cc745f4e79a8ade9c38f5a5f 100644 GIT binary patch delta 776 zcmW-eT}V@L7{<^4+1Ylcb7z}wXCJncn;(@+%XHF*8YR;x7NhCN%GE^{LPb#;(H9h} zAj)`)6_tg7iz2E1&FppT2bpe`hW?9j!-@8;#<;rIS}Ydbn_>+`Xr zx76o2VSw%#zQXW? z(#8-hKk1#Zo1#)FB$;}pMieffjMRmqm!z6rKzhu7m_7lX4K!ii5BoU93vQFmvdHco zV;zxd0oU%ZwHef}%3Zn9xPCA@W(v)_*qJz$ju-&E4&UUy)d6Ux5VAF=W24QTYBkqvh z@<2Sh?7krS-iYV6p3!)oa_&yZC#c%9l<)C)8B~Q*-p4SHQKEP-&$Liq_Gh)W@+z07 z831Q5DQXx>4<*zjJf-wm4d)qF=`SwXr^$Q7>!(*Sh1iv6%EJXvRVHCL#^b>VgXa}b&(>(Y$tSD27^LNtn9~Kiz^}RAGYkQ zJHK%~ALo;~6@)8E2S=fSvH$1`-h#5_%3E6s$@b;H+ z37$aNi*!lH@Wti0pznhsI~s&jLhnAp>z8p(cmT%Rm^HLOsUDXNW5U2y!WWEUu)qtZ z8XPL<0DBZq77RnhT{IMa1*TgxSNIcvD~(I0Jz)CSu&EmrGy{L#&y629g){#fcA=I3#)au7=2LxZDR|A>(lXph6ifoDCARDBMs?&AjM zSz~cbzxMBKjPob-j#B_|yoo=%B2e`PZgB4hR}dH75o6(Y{kvVSviatyL2Tfl#6^Rv z2ibsM!)#3p6ko>Wn)P1OA;KF?!lr%~Ay0M*?K^w~=I;s}M^6!5$!(!KdW4bKgJw?y z6n&4Ko(>TFbjH)ifqNh3*33iYV>-LGg@bZ}OWp=3{uLj3Z6J=J!M6v>*3((vJO>qF z46X|ana6Bt9xAV6gRpKzbL}puzJs&1`=RhKHP^*BaNVOr^~{%Dr3($i9GC{t-Z%`- zGjyiW%fYHToNF3{$`7ca`78&e8*yRd4e*}CS$_;FW0><_ad<|JA6@^9kj-yv9**>D zo-aFy3jr6H+v#$EEw)_6TnnRbp|imhV|al6)p|u|wfIeQ7Y`H8KcIQOq6EL#6ob+c zw6{l~x(bKdPk{Ax`cFHnQF@&kI!oASFH!q5Y!B`#>h8MCf#n$Hy7$AXV|3`*t(-l% z@I2uQzc!DZ-%E&eQ1iU4pDu+X9C)9gp{LDo`x&;+g5%iPGY-Ddy%&0BFZ6Ki06V(H z3qAa|`fMo5S7on7`PJFJD1R~FB;6!U6f!|-Nf(hwoQxBdOlh}70b!58PDyuKnW*iO z;^XR+6i;Nu7++a!dMY)t0u?l9M1!pRAH?)rLQ>+RuSDedw3@H{G`zZ%gh`6gNiaep zqaZRWd2&hibtF5sjdOZe`Z&X>bV3m&QB5n!)QFgtMOCXU4$F$xy-Z-`R1#lF(S_Bx z7V+6wB*V(4wH681N@2=JSCB>FOfoI1*{T@tau`X3$Sgcf)D?hU6QC8-jgm-Ky{_}E z&C^XV6G^Xj%ZrGz+9{SQu?dT$gNS&3$`kNMWJR2mm4ui~F}jmdIw_|Z|Ag49GEq?} zH7!ku9bz<@$z;SW$(@R%?AE$vbuoTAJ1_&j?3x%~KBN5COJo$Mw82SCmCW?0tltFF zIIc0;$)b}aM4FfdNIiQulU7p4FnR51hRcsS#Qp)9Sw#DqkJgjjEI*IQ=e99xTp2=J zuNq8<@>D{R(z2q86Up&}xN~YU)YKHHZ)$F>6D1{`RMVj@S&m3bomjt{Z79^#*4C(L LS - + Remove Crate as Track Source Remove Crate as Track Source - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Add Crate as Track Source @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist New Playlist @@ -160,7 +160,7 @@ - + Create New Playlist Create New Playlist @@ -190,113 +190,120 @@ Duplicate - - + + Import Playlist Import Playlist - + Export Track Files Export Track Files - + Analyze entire Playlist Analyse entire Playlist - + Enter new name for playlist: Enter new name for playlist: - + Duplicate Playlist Duplicate Playlist - - + + Enter name for new playlist: Enter name for new playlist: - - + + Export Playlist Export Playlist - + Add to Auto DJ Queue (replace) Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Rename Playlist - - + + Renaming Playlist Failed Renaming Playlist Failed - - - + + + A playlist by that name already exists. A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. A playlist cannot have a blank name. - + _copy //: Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Playlist Creation Failed - - + + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);; M3U8 Playlist (*.m3u8);; PLS Playlist (*.pls);; Text CSV (*.csv);; Readable Text (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Timestamp @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Couldn't load track. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Album Artist - + Artist Artist - + Bitrate Bitrate - + BPM BPM - + Channels Channels - + Color Color - + Comment Comment - + Composer Composer - + Cover Art Cover Art - + Date Added Date Added - + Last Played - + Duration Duration - + Type Type - + Genre Genre - + Grouping Grouping - + Key Key - + Location Location - + + Overview + + + + Preview Preview - + Rating Rating - + ReplayGain ReplayGain - + Samplerate Samplerate - + Played Played - + Title Title - + Track # Track # - + Year Year - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Add to Quick Links - + Remove from Quick Links Remove from Quick Links - + Add to Library Add to Library - + Refresh directory tree - + Quick Links Quick Links - - + + Devices Devices - + Removable Devices Removable Devices - - + + Computer Computer - + Music Directory Added Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan Scan - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1046,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Set to full volume - + Set to zero volume Set to zero volume @@ -1077,13 +1099,13 @@ trace - Above + Profiling messages Reverse roll (Censor) button - + Headphone listen button Headphone listen button - + Mute button Mute button @@ -1094,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Mix orientation (e.g. left, right, center) - + Set mix orientation to left Set mix orientation to left - + Set mix orientation to center Set mix orientation to center - + Set mix orientation to right Set mix orientation to right @@ -1153,22 +1175,22 @@ trace - Above + Profiling messages BPM tap button - + Toggle quantize mode Toggle quantize mode - + One-time beat sync (tempo only) One-time beat sync (tempo only) - + One-time beat sync (phase only) One-time beat sync (phase only) - + Toggle keylock mode Toggle keylock mode @@ -1178,193 +1200,193 @@ trace - Above + Profiling messages Equalizers - + Vinyl Control Vinyl Control - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer Pass through external audio into the internal mixer - + Cues Cues - + Cue button Cue button - + Set cue point Set cue point - + Go to cue point Go to cue point - + Go to cue point and play Go to cue point and play - + Go to cue point and stop Go to cue point and stop - + Preview from cue point Preview from cue point - + Cue button (CDJ mode) Cue button (CDJ mode) - + Stutter cue Stutter cue - + Hotcues Hotcues - + Set, preview from or jump to hotcue %1 Set, preview from or jump to hotcue %1 - + Clear hotcue %1 Clear hotcue %1 - + Set hotcue %1 Set hotcue %1 - + Jump to hotcue %1 Jump to hotcue %1 - + Jump to hotcue %1 and stop Jump to hotcue %1 and stop - + Jump to hotcue %1 and play Jump to hotcue %1 and play - + Preview from hotcue %1 Preview from hotcue %1 - - + + Hotcue %1 Hotcue %1 - + Looping Looping - + Loop In button Loop In button - + Loop Out button Loop Out button - + Loop Exit button Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Move loop forward by %1 beats - + Move loop backward by %1 beats Move loop backward by %1 beats - + Create %1-beat loop Create %1-beat loop - + Create temporary %1-beat loop roll Create temporary %1-beat loop roll @@ -1480,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader Volume Fader - + Full Volume Full Volume - + Zero Volume Zero Volume @@ -1509,7 +1531,7 @@ trace - Above + Profiling messages - + Mute Mute @@ -1520,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen Headphone Listen @@ -1541,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation Orientation - + Orient Left Orient Left - + Orient Center Orient Center - + Orient Right Orient Right @@ -1629,82 +1651,82 @@ trace - Above + Profiling messages Adjust the beatgrid to the right - + Adjust Beatgrid Adjust Beatgrid - + Align beatgrid to current position Align beatgrid to current position - + Adjust Beatgrid - Match Alignment Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. Adjust beatgrid to match another playing deck. - + Quantize Mode Quantize Mode - + Sync Sync - + Beat Sync One-Shot Beat Sync One-Shot - + Sync Tempo One-Shot Sync Tempo One-Shot - + Sync Phase One-Shot Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust Pitch Adjust - + Adjust pitch from speed slider pitch Adjust pitch from speed slider pitch - + Match musical key Match musical key - + Match Key Match Key - + Reset Key Reset Key - + Resets key to original Resets key to original @@ -1745,451 +1767,451 @@ trace - Above + Profiling messages Low EQ - + Toggle Vinyl Control Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode Vinyl Control Mode - + Vinyl Control Cueing Mode Vinyl Control Cueing Mode - + Vinyl Control Passthrough Vinyl Control Passthrough - + Vinyl Control Next Deck Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck Single deck mode - Switch vinyl control to next deck - + Cue Cue - + Set Cue Set Cue - + Go-To Cue Go-To Cue - + Go-To Cue And Play Go-To Cue And Play - + Go-To Cue And Stop Go-To Cue And Stop - + Preview Cue Preview Cue - + Cue (CDJ Mode) Cue (CDJ Mode) - + Stutter Cue Stutter Cue - + Go to cue point and play after release Go to cue point and play after release - + Clear Hotcue %1 Clear Hotcue %1 - + Set Hotcue %1 Set Hotcue %1 - + Jump To Hotcue %1 Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play Jump To Hotcue %1 And Play - + Preview Hotcue %1 Preview Hotcue %1 - + Loop In Loop In - + Loop Out Loop Out - + Loop Exit Loop Exit - + Reloop/Exit Loop Reloop/Exit Loop - + Loop Halve Loop Halve - + Loop Double Loop Double - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Move Loop +%1 Beats - + Move Loop -%1 Beats Move Loop -%1 Beats - + Loop %1 Beats Loop %1 Beats - + Loop Roll %1 Beats Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Add to Auto DJ Queue (bottom) - + Append the selected track to the Auto DJ Queue Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Add to Auto DJ Queue (top) - + Prepend selected track to the Auto DJ Queue Prepend selected track to the Auto DJ Queue - + Load Track Load Track - + Load selected track Load selected track - + Load selected track and play Load selected track and play - - + + Record Mix Record Mix - + Toggle mix recording Toggle mix recording - + Effects Effects - + Quick Effects Quick Effects - + Deck %1 Quick Effect Super Knob Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect Quick Effect - + Clear Unit Clear Unit - + Clear effect unit Clear effect unit - + Toggle Unit Toggle Unit - + Dry/Wet Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob Super Knob - + Next Chain Next Chain - + Assign Assign - + Clear Clear - + Clear the current effect Clear the current effect - + Toggle Toggle - + Toggle the current effect Toggle the current effect - + Next Next - + Switch to next effect Switch to next effect - + Previous Previous - + Switch to the previous effect Switch to the previous effect - + Next or Previous Next or Previous - + Switch to either next or previous effect Switch to either next or previous effect - - + + Parameter Value Parameter Value - - + + Microphone Ducking Strength Microphone Ducking Strength - + Microphone Ducking Mode Microphone Ducking Mode - + Gain Gain - + Gain knob Gain knob - + Shuffle the content of the Auto DJ queue Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue Skip the next track in the Auto DJ queue - + Auto DJ Toggle Auto DJ Toggle - + Toggle Auto DJ On/Off Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Show or hide the mixer. - + Cover Art Show/Hide (Library) Cover Art Show/Hide (Library) - + Show/hide cover art in the library Show/hide cover art in the library - + Library Maximize/Restore Library Maximize/Restore - + Maximize the track library to take up all the available screen space. Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide Effect Rack Show/Hide - + Show/hide the effect rack Show/hide the effect rack - + Waveform Zoom Out Waveform Zoom Out @@ -2204,102 +2226,102 @@ trace - Above + Profiling messages Headphone gain - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Playback Speed - + Playback speed control (Vinyl "Pitch" slider) Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) Pitch (Musical key) - + Increase Speed Increase Speed - + Adjust speed faster (coarse) Adjust speed faster (coarse) - + Increase Speed (Fine) Increase Speed (Fine) - + Adjust speed faster (fine) Adjust speed faster (fine) - + Decrease Speed Decrease Speed - + Adjust speed slower (coarse) Adjust speed slower (coarse) - + Adjust speed slower (fine) Adjust speed slower (fine) - + Temporarily Increase Speed Temporarily Increase Speed - + Temporarily increase speed (coarse) Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) Temporarily increase speed (fine) - + Temporarily Decrease Speed Temporarily Decrease Speed - + Temporarily decrease speed (coarse) Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) Temporarily decrease speed (fine) @@ -2451,1053 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock Keylock - + CUP (Cue + Play) CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker Intro Start Marker - + Intro End Marker Intro End Marker - + Outro Start Marker Outro Start Marker - + Outro End Marker Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats Loop Selected Beats - + Create a beat loop of selected beat size Create a beat loop of selected beat size - + Loop Roll Selected Beats Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop Reloop And Stop - + Enable loop, jump to Loop In point, and stop Enable loop, jump to Loop In point, and stop - + Halve the loop length Halve the loop length - + Double the loop length Double the loop length - + Beat Jump / Loop Move Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navigation - + Move up Move up - + Equivalent to pressing the UP key on the keyboard Equivalent to pressing the UP key on the keyboard - + Move down Move down - + Equivalent to pressing the DOWN key on the keyboard Equivalent to pressing the DOWN key on the keyboard - + Move up/down Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left Move left - + Equivalent to pressing the LEFT key on the keyboard Equivalent to pressing the LEFT key on the keyboard - + Move right Move right - + Equivalent to pressing the RIGHT key on the keyboard Equivalent to pressing the RIGHT key on the keyboard - + Move left/right Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button Quick Effect Enable Button - + Enable or disable effect processing Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes Toggle effect unit between D/W and D+W modes - + Next chain preset Next chain preset - + Previous Chain Previous Chain - + Previous chain preset Previous chain preset - + Next/Previous Chain Next/Previous Chain - + Next or previous chain preset Next or previous chain preset - - + + Show Effect Parameters Show Effect Parameters - + Effect Unit Assignment - + Meta Knob Meta Knob - + Effect Meta Knob (control linked effect parameters) Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary Microphone / Auxiliary - + Microphone On/Off Microphone On/Off - + Microphone on/off Microphone on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off Auxiliary On/Off - + Auxiliary on/off Auxiliary on/off - + Auto DJ Auto DJ - + Auto DJ Shuffle Auto DJ Shuffle - + Auto DJ Skip Next Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Auto DJ Fade To Next - + Trigger the transition to the next track Trigger the transition to the next track - + User Interface User Interface - + Samplers Show/Hide Samplers Show/Hide - + Show/hide the sampler section Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Vinyl Control Show/Hide - + Show/hide the vinyl control section Show/hide the vinyl control section - + Preview Deck Show/Hide Preview Deck Show/Hide - + Show/hide the preview deck Show/hide the preview deck - + Toggle 4 Decks Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Waveform zoom - + Waveform Zoom Waveform Zoom - + Zoom waveform in Zoom waveform in - + Waveform Zoom In Waveform Zoom In - + Zoom waveform out Zoom waveform out - + Star Rating Up Star Rating Up - + Increase the track rating by one star Increase the track rating by one star - + Star Rating Down Star Rating Down - + Decrease the track rating by one star Decrease the track rating by one star @@ -3612,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. The script code needs to be fixed. @@ -3745,7 +3777,7 @@ trace - Above + Profiling messages Import Crate - + Export Crate Export Crate @@ -3755,7 +3787,7 @@ trace - Above + Profiling messages Unlock - + An unknown error occurred while creating crate: An unknown error occurred while creating crate: @@ -3764,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate Rename Crate - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3787,17 +3813,17 @@ trace - Above + Profiling messages Renaming Crate Failed - + Crate Creation Failed Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);; M3U8 Playlist (*.m3u8);; PLS Playlist (*.pls);; Text CSV (*.csv);; Readable Text (*.txt) - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) @@ -3806,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Crates are a great way to help organize the music you want to DJ with. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3917,12 +3949,12 @@ trace - Above + Profiling messages Past Contributors - + Official Website - + Donate @@ -4445,37 +4477,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - + Didn't get any midi messages. Please try again. Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: Successfully mapped control: - + <i>Ready to learn %1</i> <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4514,17 +4546,17 @@ You tried to learn: %1,%2 Dump to csv - + Log Log - + Search Search - + Stats Stats @@ -5177,114 +5209,114 @@ associated with each key. DlgPrefController - + Apply device settings? Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None None - + %1 by %2 %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? Do you want to save the changes? - + Troubleshooting Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Clear Input Mappings - + Are you sure you want to clear all input mappings? Are you sure you want to clear all input mappings? - + Clear Output Mappings Clear Output Mappings - + Are you sure you want to clear all output mappings? Are you sure you want to clear all output mappings? @@ -5302,100 +5334,100 @@ Apply settings and continue? Enabled - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Description: - + Support: Support: - + Screens preview - + Input Mappings Input Mappings - - + + Search Search - - + + Add Add - - + + Remove Remove @@ -5415,17 +5447,17 @@ Apply settings and continue? - + Mapping Info - + Author: Author: - + Name: Name: @@ -5435,28 +5467,28 @@ Apply settings and continue? Learning Wizard (MIDI Only) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Clear All - + Output Mappings Output Mappings @@ -5615,6 +5647,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6229,62 +6271,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run Allow screensaver to run - + Prevent screensaver from running Prevent screensaver from running - + Prevent screensaver while playing Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes This skin does not support color schemes - + Information Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7451,173 +7493,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Default (long delay) - + Experimental (no delay) Experimental (no delay) - + Disabled (short delay) Disabled (short delay) - + Soundcard Clock Soundcard Clock - + Network Clock Network Clock - + Direct monitor (recording and broadcasting only) Direct monitor (recording and broadcasting only) - + Disabled Disabled - + Enabled Enabled - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. Refer to the Mixxx User Manual for details. - + Configured latency has changed. Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Configuration error @@ -7635,131 +7676,131 @@ The loudness target is approximate and assumes track pregain and main output lev Sound API - + Sample Rate Sample Rate - + Audio Buffer Audio Buffer - + Engine Clock Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode Microphone Monitor Mode - + Microphone Latency Compensation Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization Multi-Soundcard Synchronization - + Output Output - + Input Input - + System Reported Latency System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices Query Devices @@ -8207,47 +8248,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Sound Hardware - + Controllers Controllers - + Library Library - + Interface Interface - + Waveforms Waveforms - + Mixer Mixer - + Auto DJ Auto DJ - + Decks Decks - + Colors Colors @@ -8282,47 +8323,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Effects - + Recording Recording - + Beat Detection Beat Detection - + Key Detection Key Detection - + Normalization Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Vinyl Control - + Live Broadcasting Live Broadcasting - + Modplug Decoder Modplug Decoder @@ -8678,284 +8719,284 @@ This can not be undone! Summary - + Filetype: Filetype: - + BPM: BPM: - + Location: Location: - + Bitrate: Bitrate: - + Comments Comments - + BPM BPM - + Sets the BPM to 75% of the current value. Sets the BPM to 75% of the current value. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. Displays the BPM of the selected track. - + Track # Track # - + Album Artist Album Artist - + Composer Composer - + Title Title - + Grouping Grouping - + Key Key - + Year Year - + Artist Artist - + Album Album - + Genre Genre - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. Sets the BPM to 200% of the current value. - + Double BPM Double BPM - + Halve BPM Halve BPM - + Clear BPM and Beatgrid Clear BPM and Beatgrid - + Move to the previous item. "Previous" button Move to the previous item. - + &Previous &Previous - + Move to the next item. "Next" button Move to the next item. - + &Next &Next - + Duration: Duration: - + Import Metadata from MusicBrainz Import Metadata from MusicBrainz - + Re-Import Metadata from file Re-Import Metadata from file - + Color Color - + Date added: Date added: - + Open in File Browser Open in File Browser - + Samplerate: - + Track BPM: Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. Converts beats detected by the analyser into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo Assume constant tempo - + Sets the BPM to 66% of the current value. Sets the BPM to 66% of the current value. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. Sets the BPM to 150% of the current value. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. Sets the BPM to 133% of the current value. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. Hint: Use the Library Analyse view to run BPM detection. - + Save changes and close the window. "OK" button Save changes and close the window. - + &OK &OK - + Discard changes and close the window. "Cancel" button Discard changes and close the window. - + Save changes and keep the window open. "Apply" button Save changes and keep the window open. - + &Apply &Apply - + &Cancel &Cancel - + (no color) @@ -9112,7 +9153,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9314,27 +9355,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (faster) - + Rubberband (better) Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9549,15 +9590,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Safe Mode Enabled - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9569,57 +9610,57 @@ Shown when VuMeter can not be displayed. Please keep support. - + activate activate - + toggle toggle - + right right - + left left - + right small right small - + left small left small - + up up - + down down - + up small up small - + down small down small - + Shortcut Shortcut @@ -9627,62 +9668,62 @@ support. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9692,22 +9733,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Playlist Files (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9757,27 +9798,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9838,18 +9879,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Missing Tracks - + Hidden Tracks Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9861,212 +9902,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Exit</b> Mixxx. - + Retry Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigure - + Help Help - - + + Exit Exit - - + + Mixxx was unable to open all the configured sound devices. Mixxx was unable to open all the configured sound devices. - + Sound Device Error Sound Device Error - + <b>Retry</b> after fixing an issue <b>Retry</b> after fixing an issue - + No Output Devices No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. <b>Continue</b> without any outputs. - + Continue Continue - + Load track to Deck %1 Load track to Deck %1 - + Deck %1 is currently playing a track. Deck %1 is currently playing a track. - + Are you sure you want to load a new track? Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Error in skin file - + The selected skin cannot be loaded. The selected skin cannot be loaded. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirm Exit - + A deck is currently playing. Exit Mixxx? A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. The preferences window is still open. - + Discard any changes and exit Mixxx? Discard any changes and exit Mixxx? @@ -10082,13 +10164,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Lock - - + + Playlists Playlists @@ -10098,32 +10180,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Unlock - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Create New Playlist @@ -11641,7 +11749,7 @@ Fully right: end of the effect period - + Deck %1 Deck %1 @@ -11774,7 +11882,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Passthrough @@ -11805,7 +11913,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11938,12 +12046,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11978,42 +12086,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12071,54 +12179,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Playlists - + Folders Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids Beatgrids - + Memory cues Memory cues - + (loading) Rekordbox (loading) Rekordbox @@ -12677,7 +12785,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Spinning Vinyl @@ -12859,7 +12967,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Cover Art @@ -13095,197 +13203,197 @@ may introduce a 'pumping' effect and/or distortion. When tapped, adjusts the average BPM up by a small amount. - + Adjust Beats Earlier Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Tempo and BPM Tap - + Show/hide the spinning vinyl section. Show/hide the spinning vinyl section. - + Keylock Keylock - + Toggling keylock during playback may result in a momentary audio glitch. Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. Seeks the track to the cue point and stops. - + Play Play - + Plays track from the cue point. Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input Select and configure a hardware device for this input - + Recording Duration Recording Duration @@ -13523,928 +13631,934 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward Beatjump Forward - + Jump forward by the set number of beats. Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. Move the loop forward by the set number of beats. - + Jump forward by 1 beat. Jump forward by 1 beat. - + Move the loop forward by 1 beat. Move the loop forward by 1 beat. - + Beatjump Backward Beatjump Backward - + Jump backward by the set number of beats. Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. Move the loop backward by the set number of beats. - + Jump backward by 1 beat. Jump backward by 1 beat. - + Move the loop backward by 1 beat. Move the loop backward by 1 beat. - + Reloop Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. Show/hide intro & outro markers and associated buttons. - + Intro Start Marker Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. If marker is set, clears the marker. - + Intro End Marker Intro End Marker - + Outro Start Marker Outro Start Marker - + Outro End Marker Outro End Marker - + Mix Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry D+W mode: Add wet to dry - + Mix Mode Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu Skin Settings Menu - + Show/hide skin settings menu Show/hide skin settings menu - + Save Sampler Bank Save Sampler Bank - + Save the collection of samples loaded in the samplers. Save the collection of samples loaded in the samplers. - + Load Sampler Bank Load Sampler Bank - + Load a previously saved collection of samples into the samplers. Load a previously saved collection of samples into the samplers. - + Show Effect Parameters Show Effect Parameters - + Enable Effect Enable Effect - + Meta Knob Link Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Super Knob - + Next Chain Next Chain - + Previous Chain Previous Chain - + Next/Previous Chain Next/Previous Chain - + Clear Clear - + Clear the current effect. Clear the current effect. - + Toggle Toggle - + Toggle the current effect. Toggle the current effect. - + Next Next - + Clear Unit Clear Unit - + Clear effect unit. Clear effect unit. - + Show/hide parameters for effects in this unit. Show/hide parameters for effects in this unit. - + Toggle Unit Toggle Unit - + Enable or disable this whole effect unit. Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit Assign Effect Unit - + Assign this effect unit to the channel output. Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Switch to the next effect. - + Previous Previous - + Switch to the previous effect. Switch to the previous effect. - + Next or Previous Next or Previous - + Switch to either the next or previous effect. Switch to either the next or previous effect. - + Meta Knob Meta Knob - + Controls linked parameters of this effect Controls linked parameters of this effect - + Effect Focus Button Effect Focus Button - + Focuses this effect. Focuses this effect. - + Unfocuses this effect. Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Effect Parameter - + Adjusts a parameter of the effect. Adjusts a parameter of the effect. - + Inactive: parameter not linked Inactive: parameter not linked - + Active: parameter moves with Meta Knob Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter Equalizer Parameter - + Adjusts the gain of the EQ filter. Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. If quantize is enabled, snaps to the nearest beat. - + Quantize Quantize - + Toggles quantization. Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse Reverse - + Reverses track playback during regular playback. Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Play/Pause - + Jumps to the beginning of the track. Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key Sync and Reset Key - + Increases the pitch by one semitone. Increases the pitch by one semitone. - + Decreases the pitch by one semitone. Decreases the pitch by one semitone. - + Enable Vinyl Control Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. When enabled, the track responds to external vinyl control. - + Enable Passthrough Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. Displays options for editing cover artwork. - + Star Rating Star Rating - + Assign ratings to individual tracks by clicking the stars. Assign ratings to individual tracks by clicking the stars. @@ -14579,33 +14693,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Microphone Talkover Ducking Strength - + Prevents the pitch from changing when the rate changes. Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. Plays or pauses the track. - + (while playing) (while playing) @@ -14625,215 +14739,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (while stopped) - + Cue Cue - + Headphone Headphone - + Mute Mute - + Old Synchronize Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. Resets the key to the original track key. - + Speed Control Speed Control - - - + + + Changes the track pitch independent of the tempo. Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. Decreases the pitch by 10 cents. - + Pitch Adjust Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Record Mix - + Toggle mix recording. Toggle mix recording. - + Enable Live Broadcasting Enable Live Broadcasting - + Stream your mix over the Internet. Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit Loop Exit - + Turns the current loop off. Turns the current loop off. - + Slip Mode Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track Track Key - + Displays the musical key of the loaded track. Displays the musical key of the loaded track. - + Clock Clock - + Displays the current time. Displays the current time. - + Audio Latency Usage Meter Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator Audio Latency Overload Indicator @@ -14878,254 +14992,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Displays the current musical key of the loaded track after pitch shifting. - + Fast Rewind Fast Rewind - + Fast rewind through the track. Fast rewind through the track. - + Fast Forward Fast Forward - + Fast forward through the track. Fast forward through the track. - + Jumps to the end of the track. Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Pitch Control - + Pitch Rate Pitch Rate - + Displays the current playback rate of the track. Displays the current playback rate of the track. - + Repeat Repeat - + When active the track will repeat if you go past the end or reverse before the start. When active the track will repeat if you go past the end or reverse before the start. - + Eject Eject - + Ejects track from the player. Ejects track from the player. - + Hotcue Hotcue - + If hotcue is set, jumps to the hotcue. If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status Vinyl Status - + Provides visual feedback for vinyl control status: Provides visual feedback for vinyl control status: - + Green for control enabled. Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker Loop-In Marker - + Loop-Out Marker Loop-Out Marker - + Loop Halve Loop Halve - + Halves the current loop's length by moving the end marker. Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. Deck immediately loops if past the new endpoint. - + Loop Double Loop Double - + Doubles the current loop's length by moving the end marker. Doubles the current loop's length by moving the end marker. - + Beatloop Beatloop - + Toggles the current loop on or off. Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time Track Time - + Track Duration Track Duration - + Displays the duration of the loaded track. Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. Information is loaded from the track's metadata tags. - + Track Artist Track Artist - + Displays the artist of the loaded track. Displays the artist of the loaded track. - + Track Title Track Title - + Displays the title of the loaded track. Displays the title of the loaded track. - + Track Album Track Album - + Displays the album name of the loaded track. Displays the album name of the loaded track. - + Track Artist/Title Track Artist/Title - + Displays the artist and title of the loaded track. Displays the artist and title of the loaded track. @@ -15133,12 +15247,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15353,47 +15467,47 @@ This can not be undone! WCueMenuPopup - + Cue number Cue number - + Cue position Cue position - + Edit cue label Edit cue label - + Label... Label... - + Delete this cue Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Hotcue #%1 @@ -15518,323 +15632,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Create &New Playlist - + Create a new playlist Create a new playlist - + Ctrl+n Ctrl+n - + Create New &Crate Create New &Crate - + Create a new crate Create a new crate - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. May not be supported on all skins. - + Show Skin Settings Menu Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Show Microphone Section - + Show the microphone section of the Mixxx interface. Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Show Preview Deck - + Show the preview deck in the Mixxx interface. Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Show Cover Art - + Show cover art in the Mixxx interface. Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximize Library - + Maximize the track library to take up all the available screen space. Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library Space - + &Full Screen &Full Screen - + Display Mixxx using the full screen Display Mixxx using the full screen - + &Options &Options - + &Vinyl Control &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 Enable Vinyl Control &%1 - + &Record Mix &Record Mix - + Record your mix to a file Record your mix to a file - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off Toggles keyboard shortcuts on or off - + Ctrl+` Ctrl+` - + &Preferences &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer &Developer - + &Reload Skin &Reload Skin - + Reload the skin Reload the skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Developer &Tools - + Opens the developer tools dialog Opens the developer tools dialog - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Deb&ugger Enabled - + Enables the debugger during skin parsing Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Help - + Show Keywheel menu title @@ -15851,74 +15995,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Community Support - + Get help with Mixxx Get help with Mixxx - + &User Manual &User Manual - + Read the Mixxx user manual. Read the Mixxx user manual. - + &Keyboard Shortcuts &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Translate This Application - + Help translate this application into your language. Help translate this application into your language. - + &About &About - + About the application About the application @@ -15926,25 +16070,25 @@ This can not be undone! WOverview - + Passthrough Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15953,25 +16097,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Clear input - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Search - + Clear input Clear input @@ -15982,169 +16114,163 @@ This can not be undone! Search... - + Clear the search bar input field Clear the search bar input field - - Enter a string to search for - Enter a string to search for + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Shortcut + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Focus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Exit search + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Key - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artist - + Album Artist Album Artist - + Composer Composer - + Title Title - + Album Album - + Grouping Grouping - + Year Year - + Genre Genre - + Directory - + &Search selected @@ -16152,620 +16278,625 @@ This can not be undone! WTrackMenu - + Load to Load to - + Deck Deck - + Sampler Sampler - + Add to Playlist Add to Playlist - + Crates Crates - + Metadata Metadata - + Update external collections Update external collections - + Cover Art Cover Art - + Adjust BPM Adjust BPM - + Select Color Select Color - - + + Analyze Analyse - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Add to Auto DJ Queue (bottom) - + Add to Auto DJ Queue (top) Add to Auto DJ Queue (top) - + Add to Auto DJ Queue (replace) Add to Auto DJ Queue (replace) - + Preview Deck Preview Deck - + Remove Remove - + Remove from Playlist Remove from Playlist - + Remove from Crate Remove from Crate - + Hide from Library Hide from Library - + Unhide from Library Unhide from Library - + Purge from Library Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Properties - + Open in File Browser Open in File Browser - + Select in Library - + Import From File Tags Import From File Tags - + Import From MusicBrainz Import From MusicBrainz - + Export To File Tags Export To File Tags - + BPM and Beatgrid BPM and Beatgrid - + Play Count Play Count - + Rating Rating - + Cue Point Cue Point - - + + Hotcues Hotcues - + Intro Intro - + Outro Outro - + Key Key - + ReplayGain ReplayGain - + Waveform Waveform - + Comment Comment - + All All - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Lock BPM - + Unlock BPM Unlock BPM - + Double BPM Double BPM - + Halve BPM Halve BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Create New Playlist - + Enter name for new playlist: Enter name for new playlist: - + New Playlist New Playlist - - - + + + Playlist Creation Failed Playlist Creation Failed - + A playlist by that name already exists. A playlist by that name already exists. - + A playlist cannot have a blank name. A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + Add to New Crate Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Cancel - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) Setting cover art of %n track(s)Setting cover art of %n track(s) - + Reloading cover art of %n track(s) Reloading cover art of %n track(s)Reloading cover art of %n track(s) @@ -16781,37 +16912,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16819,37 +16950,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16857,12 +16988,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Show or hide columns. - + Shuffle Tracks @@ -16870,52 +17001,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Choose music library directory - + controllers - + Cannot open database Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16929,68 +17060,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse Browse - + Export directory - + Database version - + Export Export - + Cancel Cancel - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -17011,7 +17152,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17021,23 +17162,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_es.qm b/res/translations/mixxx_es.qm index e09b546de632bf6ef1b54c4fac0f33a021e92b92..00dd9032b90d2b56927c09ae62bed9ff50f191af 100644 GIT binary patch delta 50477 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 delta 25659 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 yH{pyBgcX7z Enable Auto DJ - + Activar Auto DJ Disable Auto DJ - + Desactivar Auto DJ Clear Auto DJ Queue - + Limpiar la cola de Auto DJ @@ -51,17 +51,17 @@ Confirmation Clear - + Confirmación limpiada Do you really want to remove all tracks from the Auto DJ queue? - + Realmente quieres eliminar todas las pistas de la cola de Auto DJ? This can not be undone. - + ¡Esto no puede ser revertido! @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -160,7 +160,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar Lista de Reproducción - + Export Track Files Exportar pistas - + Analyze entire Playlist Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - - + + Export Playlist Exportar lista de reproducción - + Add to Auto DJ Queue (replace) Añadir a la cola de Auto DJ (reemplaza) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renombrar lista de reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Ya existe una lista de reproducción con ese nombre. - - - + + + A playlist cannot have a blank name. El nombre de la lista de reproducción no puede quedar en blanco. - + _copy //: Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallado la creación de la lista de reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Confirm Deletion Confirmar Borrado - + Do you really want to delete playlist <b>%1</b>? ¿Desea realmente eliminar la lista de reproducción<b>%1</b>? - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca de tiempo @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Álbum - + Album Artist Artista del álbum - + Artist Artista - + Bitrate Tasa de bits - + BPM BPM - + Channels Canales - + Color Color - + Comment Comentario - + Composer Compositor - + Cover Art Carátula - + Date Added Fecha añadida - + Last Played Última reproducción - + Duration Duración - + Type Tipo - + Genre Género - + Grouping Grupo - + Key Clave - + Location Ubicación - + Overview - + Resumen - + Preview Preescucha - + Rating Puntuación - + ReplayGain Ganancia de reproducción - + Samplerate Muestra - + Played Reproducido - + Title Título - + Track # Pista n.º - + Year Año - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recuperando imagen... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Equipo" te permite navegar, ver y abrir las pistas de las carpetas del disco duro o de dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -806,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Re escanea la librería cuando se inicia Mixxx @@ -856,7 +873,7 @@ rastrear - Arriba + Perfilar mensajes Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Configura el tamaño máximo del archivo mixxx.log en bytes. Usa -1 para ilimitado. Por defecto es 100 MB, como en 1e5 o 100000000. @@ -866,7 +883,7 @@ rastrear - Arriba + Perfilar mensajes Overrides the default application GUI style. Possible values: %1 - + Anula el estilo por defecto de la interfaz de usuario de la aplicación. Valores posibles: %1 @@ -2463,12 +2480,12 @@ rastrear - Arriba + Perfilar mensajes Move Beatgrid Half a Beat - + Desplaza la cuadricula de tiempo medio pulso Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en pistas con tempo constante. @@ -2666,13 +2683,13 @@ rastrear - Arriba + Perfilar mensajes Sort hotcues by position - + Ordenar hotcues por posición Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) @@ -3527,7 +3544,7 @@ rastrear - Arriba + Perfilar mensajes Unknown - + Desconocido @@ -3632,32 +3649,32 @@ rastrear - Arriba + Perfilar mensajes ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funcionalidad provista por este mapa de controlador será desactivada hasta que el problema sea resuelto. - + You can ignore this error for this session but you may experience erratic behavior. Puedes ignorar este error durante esta sesión, pero podrías experimentar problemas impredecibles. - + Try to recover by resetting your controller. Prueba de corregirlo reseteando la controladora. - + Controller Mapping Error Error del mapa de controlador - + The mapping for your controller "%1" is not working properly. El mapa de tu controlador "%1" no funciona correctamente. - + The script code needs to be fixed. El código del script necesita ser reparado. @@ -3765,7 +3782,7 @@ rastrear - Arriba + Perfilar mensajes Importar caja - + Export Crate Exportar caja @@ -3775,7 +3792,7 @@ rastrear - Arriba + Perfilar mensajes Desbloquear - + An unknown error occurred while creating crate: Se ha producido un error desconocido al crear la caja: @@ -3801,17 +3818,17 @@ rastrear - Arriba + Perfilar mensajes Fallo al renombrar la caja - + Crate Creation Failed Fallo al crear la caja - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) @@ -3937,12 +3954,12 @@ rastrear - Arriba + Perfilar mensajes Contribuyentes anteriores - + Official Website Sitio web oficial - + Donate Donar @@ -3998,7 +4015,7 @@ rastrear - Arriba + Perfilar mensajes - + Analyze Analizar @@ -4043,17 +4060,17 @@ rastrear - Arriba + Perfilar mensajes Ejecuta el análisis de cuadrícula de tempo, clave musical y ReplayGain en las pistas seleccionadas. No genera formas de onda para las pistas seleccionadas para ahorrar espacio en disco. - + Stop Analysis Detener análisis - + Analyzing %1% %2/%3 Analizando %1% %2/%3 - + Analyzing %1/%2 Analizando %1/%2 @@ -4164,7 +4181,32 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modos de desvanecimiento de Auto DJ + +Intro completa + Outro: +Reproduce la intro completa y la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea el más corto. Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Desvanecer al iniciar la Outro: +Inicia el fundido cruzado al inicio de la outro. Si la outro es más larga que la intro, +corta el final de la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea más corto.Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Pista completa: +Reproduce la pista completa. Comienza el fundido cruzado desde el +número de segundos seleccionado antes del final de la pista. Un fundido cruzado negativo +agrega silencio entre las pistas. + +Saltar silencio: +Reproduce la pista completa excepto el silencio al inicio y al final. +Inicia el fundido cruzado desde el número de segundos seleccionado antes +del último sonido. + +Saltar silencio e iniciar con volumen al máximo: +Lo mismo que Saltar silencio, pero inicia la transición con el crossfader +centrado, de manera que la intro inicia con el volumen al máximo. @@ -4189,7 +4231,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Saltar silencio e iniciar con volumen al máximo @@ -4470,37 +4512,37 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Si el mapeo no funciona, prueba a activar uno de los controles avanzados siguientes y prueba de nuevo. También puedes volver a detectar el control. - + Didn't get any midi messages. Please try again. No se detectó ningún mensaje MIDI. Por favor, inténtelo de nuevo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No se detectó un mapeado -- Intentelo nuevamente. Asegurese de tocar sólo un control a la vez. - + Successfully mapped control: Control mapeado con éxito: - + <i>Ready to learn %1</i> <i>Preparado para asignar %1</i> - + Learning: %1. Now move a control on your controller. Aprendizaje: %1. Ahora mueva un control en su controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + El control seleccionado no existe. <br>Esto es posiblemente un bug. Por favor repórtelo en el seguidor de bugs de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br> Trataste de vincular: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5198,120 +5240,120 @@ associated with each key. Key palette - + Paleta de notas DlgPrefController - + Apply device settings? ¿Aplicar la configuración del dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configuración debe ser aplicada antes de iniciar el asistente de aprendizaje. ¿Aplicar la configuración y continuar? - + None Ningún - + %1 by %2 %1 por %2 - + Mapping has been edited Se ha editado el mapeo - + Always overwrite during this session Siempre sobreescribir durante esta sesión - + Save As Guardar como - + Overwrite Sobreescribir - + Save user mapping Guardar mapeo del usuario - + Enter the name for saving the mapping to the user folder. Ingresar el nombre del archivo de mapeo para guardarlo en la carpeta de usuario. - + Saving mapping failed Ha fallado el guardado del mapeo - + A mapping cannot have a blank name and may not contain special characters. El nombre del mapeo no puede estar en blanco, ni contener caracteres especiales. - + A mapping file with that name already exists. Ya existe un archivo de mapeo con el mismo nombre. - + Do you want to save the changes? Quieres guardar los cambios? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si usas este mapeo, tu controlador podría no funcionar correctamente. Por favor selecciona otro mapeo o deshabilita el controlador. </b></font><br><br>Este mapeo fue diseñado para un nuevo Motor de Controladores de Mixxx, y no puede ser usado con tu instalación actual.<br>Tu instalación de Mixxx posee la version del Motor de Controladores %1. Este mapeo requiere una versión del Motor de controladores >=%2.<br><br>Para más información visita la wiki de <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versiones del Motor de Controladores</a>. - + Mapping already exists. El mapeo ya existe. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ya existe en la carpeta de mapeos de usuario. <br>¿Deseas sobreescribir o guardar con otro nombre? - + Clear Input Mappings Limpiar mapeos de Entrada - + Are you sure you want to clear all input mappings? Está seguro de querer eliminar todos los mapeos de entrada? - + Clear Output Mappings Limpiar mapeos de Salida - + Are you sure you want to clear all output mappings? Está seguro de querer eliminar todos los mapeos de salida? @@ -5331,62 +5373,62 @@ Apply settings and continue? Device Info - + Información del dispositivo Physical Interface: - + Interfase física Vendor name: - + Nombre del fabricante: Product name: - + Nombre del producto: Vendor ID - + ID del proveedor VID: - + VID: Product ID - + ID del producto PID: - + PID: Serial number: - + Número de serie: USB interface number: - + Número de interfaz USB HID Usage-Page: - + Página de uso HID HID Usage: - + Uso de HID: @@ -5464,7 +5506,7 @@ Apply settings and continue? Data protocol: - + Protocolo de datos: @@ -5474,7 +5516,7 @@ Apply settings and continue? Mapping Settings - + Configuración de mapeo @@ -5537,7 +5579,7 @@ Apply settings and continue? Enable MIDI Through Port - + Activar puerto de MIDI Through @@ -5642,6 +5684,16 @@ Apply settings and continue? Multi-Sampling Multi-Muestreo + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6200,12 +6252,12 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform ❯ - + ❮ - + @@ -6256,62 +6308,62 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. El tamaño mínimo de la apariencia seleccionada es mas grande que la resolucion de su pantalla. - + Allow screensaver to run Permite el salvapantallas - + Prevent screensaver from running Evita que se active el salvapantallas - + Prevent screensaver while playing Evita el salvapantallas mientras reproduce - + Disabled Desactivado - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Este skin no soporta esquemas de color - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx debe ser reiniciado para que el nuevo ajuste de locale, escalado o multi-muestreo tenga efecto. @@ -7023,7 +7075,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Reset stem controls on track load - + Reiniciar controles de stem al cargar pista @@ -7481,173 +7533,172 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Para activar el Planificador en tiempo real (actualmente desactivado), mira %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 muestra una lista de tarjetas de sonido y controladores que podrías considerar para utilizar con Mixxx - + Mixxx DJ Hardware Guide Guía de Hardware DJ de Mixxx - + Information Información - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx debe ser reiniciado para que el cambio de ajuste de RubberBand multi-hilo tenga efecto. - + auto (<= 1024 frames/period) auto (<= 1024 fotogramas/período) - + 2048 frames/period 2048 fotogramas/período - + 4096 frames/period 4096 fotogramas/período - + Are you sure? ¿Estás seguro(a)? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Distribuir los canales estéreo en canales mono para su procesamiento en paralelo podría resultar en la pérdida de la compatibilidad mono y una imagen estéreo difusa. No se recomienda al transmitir en vivo o al grabar. - + Are you sure you wish to proceed? ¿Realmente deseas continuar? - + No No - + Yes, I know what I am doing Sí, se lo que estoy haciendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + Main output only Solo Salida principal - + Main and booth outputs Salidas principal y de cabina - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7665,131 +7716,131 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y API de sonido - + Sample Rate Frecuencia de muestreo - + Audio Buffer Búfer de audio - + Engine Clock Relog del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa el reloj de la tarjeta de sonido para emitir a un público presente y para la menor latencia. <br>Usa el reloj de red para emitir en vivo sin un público presente. - + Main Mix Mezcla principal - + Main Output Mode Modo de Salida principal - + Microphone Monitor Mode Modo de monitorización del micrófono - + Microphone Latency Compensation Compensación de latencia del micrófono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de vaciado del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Bloqueo tonal/Motor de Pitch-bend - + Multi-Soundcard Synchronization Sincronización con Múltiples Tarjetas de Sonido - + Output Salida - + Input Entrada - + System Reported Latency Latencia reportada por el sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente su búfer de audio si el contador de desbordamiento está aumentando o escuchas chasquidos durante la reproducción. - + Main Output Delay Retardo Salida Principal - + Headphone Output Delay Retraso/delay de la Salida de auriculares - + Booth Output Delay Retraso/delay de la salida de cabina - + Dual-threaded Stereo Estéreo en doble-hilo - + Hints and Diagnostics Diagnóstico y sugerencias - + Downsize your audio buffer to improve Mixxx's responsiveness. Disminuya su búfer de audio para mejorar la velocidad de respuesta de Mixxx. - + Query Devices Consultar aparatos @@ -7947,12 +7998,12 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y 1/3 of waveform viewer options for "Text height limit" - + 1/3 de visualización de forma de onda Entire waveform viewer - + Visor de forma de onda completa @@ -7985,7 +8036,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y OpenGL Status - + Estado de OpenGL @@ -8140,12 +8191,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferred font size - + Tamaño de tipo de letra preferido Text height limit - + Límite de altura de texto @@ -8190,13 +8241,13 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Scrolling Waveforms - + Deslizar formas de onda Type - + Tipo @@ -8226,7 +8277,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Overview Waveforms - + Visualizar formas de onda @@ -9349,27 +9400,27 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mejor) - + Rubberband R3 (near-hi-fi quality) Banda elástica R3 (calidad casi alta fidelidad) - + Unknown, using Rubberband (better) Desconocido, utilizando Banda elástica (mejor) - + Unknown, using Soundtouch Desconocido, usando Soundtouch @@ -9554,12 +9605,12 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Change color - + Cambiar color Choose a new color - + Escoger un nuevo color @@ -9567,32 +9618,32 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Browse... - + Examinar… No file selected - + No se ha seleccionado ningún archivo Select a file - + Seleccionar un archivo LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9604,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep de OpenGL. - + activate activar - + toggle conmutar - + right derecha - + left izquierda - + right small derecha pequeño - + left small izquierda pequeño - + up arriba - + down abajo - + up small arriba pequeño - + down small abajo pequeño - + Shortcut Atajo @@ -9662,37 +9713,37 @@ de OpenGL. Library - + This or a parent directory is already in your library. Este directorio o su superior ya se encuentra en tu biblioteca. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Este directorio o el indicado no existe o es inaccesible. Cancelando la operación para evitar inconsistencias de biblioteca. - - + + This directory can not be read. Este directorio no puede ser leído. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ha ocurrido un error desconocido. Cancelando la operación para evitar inconsistencias de biblioteca - + Can't add Directory to Library No se pudo agregar el directorio a la biblioteca - + Could not add <b>%1</b> to your library. %2 @@ -9701,27 +9752,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca %2 - + Can't remove Directory from Library No se pudo remover el directorio de la biblioteca. - + An unknown error occurred. Ha ocurrido un error desconocido. - + This directory does not exist or is inaccessible. Este directorio no existe o es inaccesible. - + Relink Directory Reenlazar directorio - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9733,22 +9784,22 @@ Cancelando la operación para evitar inconsistencias de biblioteca LibraryFeature - + Import Playlist Importar lista de reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? ¿Sobrescribir archivo? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9899,253 +9950,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy El dispositivo de sonido está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reintente</b> luego de cerrar las otras aplicaciones o reconectar un dispositivo de sonido - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> las opciones del dispositivo de sonido de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obtenga <b>ayuda</b> del wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Salir</b> de Mixxx. - + Retry Reintentar - + skin apariencia - + Allow Mixxx to hide the menu bar? ¿Permitir a Mixxx ocultar la barra de menú? - + Hide Always show the menu bar? Ocultar - + Always show Mostrar siempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra de menú de Mixxx ha sido ocultada y se puede alternar presionando la tecla <b>Alt</b>. <br><br>Haz clic en <b>%1</b> para aceptar. <br><br>Haz clic en <b>%2</b> para desactivarlo, por ejemplo si usas Mixxx sin un teclado. <br><br>Puedes cambiar este ajuste en cualquier momento en Preferencias -> Interfaz. <br> - + Ask me again Pregúntame de nuevo - - + + Reconfigure Reconfigurar - + Help Ayuda - - + + Exit Salir - - + + Mixxx was unable to open all the configured sound devices. Mixxx no ha podido activar todos los dispositivos de sonido configurados. - + Sound Device Error Error del dispositivo de sonido - + <b>Retry</b> after fixing an issue <b>Reintenta</b> una vez corregido el problema - + No Output Devices No hay dispositivos de salida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx fue configurado sin ningún dispositivo de salida de audio. El procesamiento de audio estará desactivado mientras no se configure un dispositivo de audio de salida. - + <b>Continue</b> without any outputs. <b>Continuar</b> sin ninguna salida. - + Continue Continuar - + Load track to Deck %1 Cargar pista al plato %1 - + Deck %1 is currently playing a track. El plato %1 está reproduciendo una pista. - + Are you sure you want to load a new track? ¿Está seguro de cargar una pista nueva? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control por vinilo. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control passthrough. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this microphone. Do you want to select an input device? No se ha seleccionado un dispositivo de Entrada para este micrófono. ¿Deseas escoger uno ahora? - + There is no input device selected for this auxiliary. Do you want to select an input device? No se ha seleccionado un dispositivo de entrada para este Auxiliar. ¿Deseas escoger uno ahora? - + Scan took %1 - + El escaneo tomo %1 - + No changes detected. - + No se han detectado cambios - - + + %1 tracks in total - + %1 pistas en total - + %1 new tracks found - + Encontradas %1 pistas nuevas - + %1 moved tracks detected - + %1 pistas movidas detectadas - + %1 tracks are missing (%2 total) - + %1 pistas perdidas (%2 en total) - + %1 tracks have been rediscovered - + %1 pistas han sido reencontradas - + Library scan finished - + Escaneo de la biblioteca terminado - + Error in skin file Error en el archivo de la apariencia - + The selected skin cannot be loaded. No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering Renderizado directo de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. El renderizado directo no está habilitado en su máquina. <br><br>Esto significa que las visualizaciones de forma de onda serán muy <br><b>lentas y pueden exigir mucho a su CPU</b>. Actualice su <br>configuración para habilitar la representación directa o desactiv<br> las visualizaciones de forma de onda en las preferencias de Mixxx seleccionando <br>"Vacío" como la pantalla de forma de onda en la sección 'Interfaz'. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -10161,13 +10212,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reproducción @@ -10177,32 +10228,58 @@ Do you want to select an input device? Aleatorizar lista de reproducción - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Las listas de reproducción son listar ordenadas de pistas que te permiten planificar tus sesiones de DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Podría ser necesario saltar algunas pistas en tu lista de reproducción planificada, o añadir algunas pistas diferentes, con el fin de mantener la energía de tu audiencia. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + Create New Playlist Crear nueva lista de reproducción @@ -10212,7 +10289,7 @@ Do you want to select an input device? Mixxx Hotcue Colors - + Colores de hotcues de Mixxx @@ -10220,82 +10297,82 @@ Do you want to select an input device? Serato DJ Track Metadata Hotcue Colors - + Metadatos de colores de hotcues de pistas de Serato DJ Serato DJ Pro Hotcue Colors - + Colores de hotcues de Serato DJ Pro Rekordbox COLD1 Hotcue Colors - + Colores de hotcues de Rekordbox COLD1 Rekordbox COLD2 Hotcue Colors - + Colores de hotcues de Rekordbox COLD2 Rekordbox COLORFUL Hotcue Colors - + Colores de hotcues COLORFUL de Rekordbox Mixxx Track Colors - + Colores de pistas de Mixxx Rekordbox Track Colors - + Colores de pistas de Rekordbox Serato DJ Pro Track Colors - + Colores de pistas de Serato DJ Pro Traktor Pro Track Colors - + Colores de pistas de Traktor Pro VirtualDJ Track Colors - + Colores de pistas de VirtualDJ Mixxx Key Colors - + Colores de notas de Mixxx Traktor Key Colors - + Colores de notas de Traktor Mixed In Key - Key Colors - + Colores de notas de Mixed In Key Protanopia / Protanomaly Key Colors - + Colores de notas de Protanopia/Protanomalía Deuteranopia / Deuteranomaly Key Colors - + Colores de notas de Deuteranopía/Deuteranomalía Tritanopia / Tritanomaly Key Colors - + Colores de notas de Tritanopía/Tritanomalía @@ -10429,7 +10506,7 @@ Do you want to scan your library for cover files now? Switch - + Switch @@ -10879,7 +10956,7 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p The Mixxx Team - + Equipo de Mixxx @@ -10909,12 +10986,12 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p Gain - + Ganancia Set the gain of metronome click sound - + Configura la ganancia del sonido del metrónomo @@ -11863,7 +11940,7 @@ Consejo: compensa las voces de "ardillitas" o "gruñonas"La cantidad de amplificación aplicada a la señal de audio. A niveles más altos, el audio estará más distorsionado. - + Passthrough Paso @@ -12033,12 +12110,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. varios - + built-in nativo - + missing no encontrado @@ -12166,54 +12243,54 @@ pueden introducir un efecto de "bombeo" y/o distorsión. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listas de reproducción - + Folders Carpetas - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Accesos Directos - + Loops (only the first loop is currently usable in Mixxx) Bucles (solo el primer bucle es utilizable en Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Buscar dispositivos de almacenamiento Rekordbox (refrescar) - + Beatgrids Grillas de pulsos - + Memory cues Cues en memoria - + (loading) Rekordbox (cargando) Rekordbox @@ -12655,22 +12732,22 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Reading track for fingerprinting failed. - + Ha fallado la lectura de la pista para fingerprinting Identifying track through AcoustID - + Identificando pista mediante AcoustID Could not identify track through AcoustID. - + No se pudo identificar la pista mediante AcoustID. Could not find this track in the MusicBrainz database. - + No se pudo encontrar esta pista en la base de datos de MusicBrainz. @@ -13392,7 +13469,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. - + Mantener el clic izquierdo permite previsualizar la posición donde la cabeza de reproducción saltará al soltarlo. El arrastre puede ser abortado con el clic derecho. @@ -13442,12 +13519,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Shows the current volume for the left channel of the main output. - + Muestra el volumen actual para el canal izquierdo en la salida principal. Shows the current volume for the right channel of the main output. - + Muestra el volumen actual para el canal derecho de la salida principal. @@ -13459,27 +13536,27 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Adjusts the main output gain. - + Ajusta el volumen principal Determines the main output by fading between the left and right channels. - + Determina la salida principal desvaneciendo entre los canales izquierdo y derecho. Adjusts the left/right channel balance on the main output. - + Ajusta el balance de los canales izquierdo/derecho en la salida principal. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Desvanecimiento cruzado de la salida de auriculares entre la salida principal y la señal de cueing (PFL o Escucha Pre-Deslizador) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si se activa, la señal principal de la mezcla se reproduce en el canal derecho, mientras que la señal de cueing se reproduce en el canal izquierdo. @@ -13494,12 +13571,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Show/hide the beatgrid controls section - + Mostrar/ocultar la sección de controles de la cuadrícula de tiempo Show/hide the stem mixing controls section - + Mostrar/ocultar la sección de controles de mezcla de stems @@ -13509,17 +13586,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Volume Meters - + Medidores de volumen mix microphone input into the main output. - + mezcla la entrada de micrófono con la salida principal. Auto: Automatically reduce music volume when microphone volume rises above threshold. - + Auto: reduce automáticamente el volumen de la música cuando el volumen del micrófono supera el umbral. @@ -13530,17 +13607,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: configura cuánto reducir el volumen de la música cuando el volumen de los micrófonos activos supera el umbral. Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + Manual: configura cuánto reducir el volumen de la música cuando el talkover se encuentra activado, independientemente del volumen de las entradas de micrófono. If keylock is disabled, pitch is also affected. - + Si el bloqueo tonal se desactiva, la altura también es afectada. @@ -13555,7 +13632,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Raises playback speed in small steps. - + Incrementa la velocidad de reproducción en pasos pequeños. @@ -13570,7 +13647,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Lowers playback speed in small steps. - + Reduce la velocidad de reproducción en pasos pequeños. @@ -13580,12 +13657,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed higher while active (tempo). - + Mantiene la velocidad de reproducción alta cuando se activa (tempo). Holds playback speed higher (small amount) while active. - + Mantiene la velocidad de reproducción alta (pequeña cantidad) cuando se activa. @@ -13595,59 +13672,60 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed lower while active (tempo). - + Mantiene la velocidad de reproducción baja cuando se activa (tempo). Holds playback speed lower (small amount) while active. - + Mantiene la velocidad de reproducción baja (pequeña cantidad) cuando se activa. When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Cuando se pulsa repetidamente, ajusta el tempo para coincidir con la frecuencia de pulsaciones. Tempo Tap - + Seguidor de Tempo (Tempo Tap) Rate Tap and BPM Tap - + Frecuencia de pulsaciones y de BPM Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en +pistas con tempo constante Revert last BPM/Beatgrid Change - + Revierte el último cambio de BPM/cuadrícula de tiempo Revert last BPM/Beatgrid Change of the loaded track. - + Revierte el último cambio de BPM/Cuadrícula de tiempo para la pista cargada. Toggle the BPM/beatgrid lock - + Cambia el bloqueo de BPM/cuadrícula de tiempo Tempo and Rate Tap - + Toques de Tempo y Frecuencia Tempo, Rate Tap and BPM Tap - + Toques de Tempo, Frecuencia y BPM @@ -13663,79 +13741,79 @@ tracks with constant tempo. Left click: shift 10 milliseconds earlier - + Clic izquierdo: adelantar 10 milisegundos Right click: shift 1 millisecond earlier - + Clic derecho: adelantar 1 milisegundo Shift cues later - + Retrasar cues Left click: shift 10 milliseconds later - + Clic izquierdo: retrasar 10 milisegundos Right click: shift 1 millisecond later - + Clic derecho: retrasar 1 milisegundo Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Arrastra un botón de Hotcue aquí para continuar reproduciendo después de soltar la hotcue. Hint: Change the default cue mode in Preferences -> Decks. - + Sugerencia: cambie el modo por defecto de las cues en Preferencias -> Platos. Mutes the selected channel's audio in the main output. - + Silencia el audio del canal seleccionado en la salida principal. Main mix enable - + Activador de mezcla principal Hold or short click for latching to mix this input into the main output. - + Clic sostenido o corto para enganchar, para mezclar esta entrada con la salida principal. If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + Si la hotcue es una cue de bucle, activa el bucle y salta hacia él si se encuentra detrás de la posición de reproducción. If the play position is inside an active loop, stores the loop as loop cue. - + Si la posición de reproducción se encuentra dentro de un bucle activo, almacena el bucle como una hotcue de bucle. Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Arrastrar este botón dentro de otro botón de hotcue para moverlo hacia este (cambiando su número). Si la otra hotcue ya se encuentra definida, las dos son intercambiadas. Expand/Collapse Samplers - + Expandir/contraer samplers Toggle expanded samplers view. - + Alternar la vista expandida de los samplers. @@ -13745,12 +13823,12 @@ tracks with constant tempo. Auto DJ is active - + Auto DJ se encuentra activo Red for when needle skip has been detected. - + Rojo cuando se detecta un salto de aguja. @@ -13790,7 +13868,7 @@ tracks with constant tempo. If the track has no beats the unit is seconds. - + Si la pista no tiene pulsaciones, la unidad es segundos. @@ -13830,12 +13908,12 @@ tracks with constant tempo. Beatloop Anchor - + Ancla del bucle de pulsaciones Define whether the loop is created and adjusted from its staring point or ending point. - + Define si el bucle es creado y ajustado desde su punto de inicio o de final. @@ -13930,12 +14008,12 @@ tracks with constant tempo. Hint: Change the time format in Preferences -> Decks. - + Sugerencia: cambie el formato de tiempo en Preferencias -> Platos. Show/hide intro & outro markers and associated buttons. - + Mostrar/ocultar marcadores de intro y outro, y sus botones asociados. @@ -13948,7 +14026,7 @@ tracks with constant tempo. If marker is set, jumps to the marker. - + Si el marcador se encuentra definido, salta al marcador. @@ -13956,7 +14034,7 @@ tracks with constant tempo. If marker is not set, sets the marker to the current play position. - + Si el marcador no se encuentra definido, lo configura a la posición de reproducción actual. @@ -13964,7 +14042,7 @@ tracks with constant tempo. If marker is set, clears the marker. - + Si el marcador se encuentra definido, lo elimina. @@ -14026,7 +14104,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Route the main mix through this effect unit. - + Enruta la mezcla principal a través de esta unidad de efectos. @@ -14046,42 +14124,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Stem Label - + Etiqueta de stem Name of the stem stored in the stem file - + Nombre del stem almacenado en el archivo de stem Text is displayed in the stem color stored in the stem file - + El texto es presentado con el color del stem almacenado en el archivo de stem this stem color is also used for the waveform of this stem - + este color de stem también es usado en la forma de onda de este stem Stem Mute - + Silenciar stem Toggle the stem mute/unmuted - + Alterna el silencio del stem Stem Volume Knob - + Perilla de volumen del stem Adjusts the volume of the stem - + Ajusta el volumen del stem @@ -14565,17 +14643,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Left click to jump around in the track. - + Clic izquierdo para saltar a lo largo de la pista. Right click hotcues to edit their labels and colors. - + Click derecho en los accesos directos para editar sus etiquetas y colores. Right click anywhere else to show the time at that point. - + Clic derecho en cualquier otra parte para mostrar el tiempo en ese punto. @@ -14670,7 +14748,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Maximize Library - + Maximizar Biblioteca @@ -14711,12 +14789,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Opens the track properties editor - + Abre el editor de propiedades de pista Opens the track context menu. - + Abre el menú contextual de la pista @@ -14818,12 +14896,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drag this button onto a Play button while previewing to continue playback after release. - + Arrastre este botón a un boton de Play durante la preescucha para continuar la reproducción tras soltarlo. Dragging with Shift key pressed will not start previewing the hotcue. - + Arrastrar mientras presiona la tecla Shift no iniciará la preescucha de la hotcue. @@ -15257,22 +15335,22 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Replace Existing File? - + ¿Reemplazar el archivo existente? "%1" already exists, replace? - + "%1% ya existe, ¿reemplazar? &Replace - + &Reemplazar Apply to all files - + Aplicar a todos los archivos @@ -15371,7 +15449,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. frameSwapped-signal driven phase locked loop - + Bucle con bloqueo de fase manejado por señal con marco cambiado @@ -15397,12 +15475,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. No color - + Sin color Custom color - + Color personalizado @@ -15455,47 +15533,47 @@ Carpeta: %2 WCueMenuPopup - + Cue number - + Número de cue - + Cue position Posición Marca - + Edit cue label Editar etiqueta de marca - + Label... - + Etiqueta... - + Delete this cue Borrar esta marca - + Toggle this cue type between normal cue and saved loop - + Alterna el tipo de esta cue entre cue normal y bucle guardado - + Left-click: Use the old size or the current beatloop size as the loop size - + Clic izquierdo: usar el tamaño anterior o el del bucle actual como el tamaño de bucle - + Right-click: Use the current play position as loop end if it is after the cue - + Clic derecho: usar la posición de reproducción actual como final del bucle si se encuentra después de la cue - + Hotcue #%1 Acceso DIrecto #%1 @@ -15510,7 +15588,7 @@ Carpeta: %2 Rename Preset - + Renombrar preajuste @@ -15620,407 +15698,437 @@ Carpeta: %2 + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Crear &nueva Playlist - + Create a new playlist Crear una nueva lista de reproducción - + Ctrl+n Ctrl+N - + Create New &Crate Crear nueva &caja - + Create a new crate Crea una nueva caja - + Ctrl+Shift+N Ctrl+Mayús+N - - + + &View &Vista - + Auto-hide menu bar - + Auto-ocultar barra de menú - + Auto-hide the main menu bar when it's not used. - + Auto-ocultar la barra de menú principal cuando no es utilizada. - + May not be supported on all skins. Puede no estar disponible para todas las apariencias. - + Show Skin Settings Menu Mostrar la configuración de Temas - + Show the Skin Settings Menu of the currently selected Skin Mostrar la configuración actual del menu de tema - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar seccion del microfono - + Show the microphone section of the Mixxx interface. Muestra la sección de control de micrófono de la interfaz de Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar la Sección de Control de Vinilo - + Show the vinyl control section of the Mixxx interface. Muestra la sección de control de vinilo de la interfaz de Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar el reproductor de preescucha - + Show the preview deck in the Mixxx interface. Muestra el reproductor de preescucha en la interfaz de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Muestra carátulas - + Show cover art in the Mixxx interface. Muestra las carátulas en la interfaz de Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximizar la biblioteca para tomar todo el espacio disponible en pantalla. - + Space Menubar|View|Maximize Library Espacio - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Mostrar Mixxx a pantalla completa - + &Options &Opciones - + &Vinyl Control Control de &vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con codigo de tiempo en bandejas externas para controlar Mixxx - + Enable Vinyl Control &%1 Habilita el Control por Vinilo &%1 - + &Record Mix &Grabar Mezcla - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar transmisión en &vivo - + Stream your mixes to a shoutcast or icecast server Transmite tus mezclas a un servidor shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar Atajos de &Teclado - + Toggles keyboard shortcuts on or off Activa o desactiva los atajos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar la configuración de Mixxx (p.ej.: reproducción, MIDI, controles) - + &Developer &Desarrollador - + &Reload Skin &Recargar apariencia - + Reload the skin Recargar la apariencia - + Ctrl+Shift+R Ctrl+Mayús+R - + Developer &Tools U&tilidades de desarrollador - + Opens the developer tools dialog Abre el cuadro de diálogo de herramientas de desarrollo - + Ctrl+Shift+T Ctrl+Mayús+T - + Stats: &Experiment Bucket Estadísticas: Contadores &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el modo experimental. Recoje estadísticas en los contadores EXPERIMENT. - + Ctrl+Shift+E Ctrl+Mayús+E - + Stats: &Base Bucket Estadísticas: contadores &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el modo base. Recoje estadísticas en los contadores BASE. - + Ctrl+Shift+B Ctrl+Mayús+B - + Deb&ugger Enabled Dep&uración activada - + Enables the debugger during skin parsing Activa el depurador durante el análisis de la máscara - + Ctrl+Shift+D Ctrl+Mayús+D - + &Help Ay&uda - + Show Keywheel menu title - + Mostrar rueda de notas E&xport Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ Export the library to the Engine DJ format - + Exportar biblioteca al formato Engine DJ - + Show keywheel tooltip text - + Mostrar rueda de notas - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Soporte &comunitario - + Get help with Mixxx Obtener ayuda con Mixxx - + &User Manual Manual de &usuario - + Read the Mixxx user manual. Lea el manual de usuario de Mixxx. - + &Keyboard Shortcuts Atajos de &Teclado - + Speed up your workflow with keyboard shortcuts. Trabaja más rápidamente usando los atajos de teclado. - + &Settings directory &Directorio de configuración - + Open the Mixxx user settings directory. Abre el directorio de configuración de usuario de Mixxx. - + &Translate This Application &Traducir esta aplicación - + Help translate this application into your language. Ayude a traducir esta aplicación a su idioma. - + &About &Acerca de - + About the application Acerca de la aplicación @@ -16036,7 +16144,7 @@ Carpeta: %2 Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - + Listo para reproducir, analizando... @@ -16049,31 +16157,19 @@ Carpeta: %2 Finalizing... Text on waveform overview during finalizing of waveform analysis - + Finalizando... WSearchLineEdit - - Clear input - Clear the search bar input field - Borrar el texto - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input Borrar el texto @@ -16084,93 +16180,87 @@ Carpeta: %2 Buscar... - + Clear the search bar input field - + Limpia el campo de entrada de la barra de búsqueda - - Enter a string to search for - Introducir el texto a buscar + + Return + Volver - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library - Para más información vea el Manual de Usuario> Biblioteca Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Atajo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Poner el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retroceso + + Additional Shortcuts When Focused: + - Shortcuts - Atajos + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Activa la búsqueda antes del tiempo de espera de "búsqueda mientras escribe" o salte a la vista de pistas después + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Ctrl+Espacio - + Toggle search history Shows/hides the search history entries - + Alternar historial de búsqueda - + Delete or Backspace Borrar o Retorno - - Delete query from history - Borrar Consulta del Historial - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Salir de la busqueda + + Delete query from history + Borrar Consulta del Historial @@ -16178,7 +16268,7 @@ Carpeta: %2 Search related Tracks - + Buscar pistas relacionadas @@ -16188,7 +16278,7 @@ Carpeta: %2 harmonic with %1 - + armónico con %1 @@ -16198,7 +16288,7 @@ Carpeta: %2 between %1 and %2 - + entre %1 y %2 @@ -16248,7 +16338,7 @@ Carpeta: %2 &Search selected - + &Búsqueda seleccionada @@ -16286,7 +16376,7 @@ Carpeta: %2 Update external collections - + Actualizar colecciones externas @@ -16296,12 +16386,12 @@ Carpeta: %2 Adjust BPM - + Ajustar BPM Select Color - + Seleccionar color @@ -16469,12 +16559,12 @@ Carpeta: %2 Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) Sort hotcues by position - + Ordenar hotcues por posición @@ -16519,7 +16609,7 @@ Carpeta: %2 Shift Beatgrid Half Beat - + Desplazar la cuadrícula de tiempo medio beat @@ -16607,7 +16697,7 @@ Carpeta: %2 Undo BPM/beats change of %n track(s) - + Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s) @@ -16622,7 +16712,7 @@ Carpeta: %2 Setting rating of %n track(s) - + Definiendo evaluación de %n pistaDefiniendo evaluación de %n pistasDefiniendo evaluación de %n pista(s) @@ -16677,12 +16767,12 @@ Carpeta: %2 Sorting hotcues of %n track(s) by position (remove offsets) - + Ordenando hotcues de %n pista por posición (removiendo desfases)Ordenando hotcues de %n pistas por posición (removiendo desfases)Ordenando hotcues de %n pistas(s) por posición (removiendo desfases) Sorting hotcues of %n track(s) by position - + Ordenando hotcues de %n pista por posiciónOrdenando hotcues de %n pistas por posiciónOrdenando hotcues de %n pista(s) por posición @@ -16707,7 +16797,7 @@ Carpeta: %2 Move these files to the trash bin? - + ¿Mover estos archivos a la papelera? @@ -16733,7 +16823,7 @@ Carpeta: %2 Okay - + Okey @@ -16783,7 +16873,7 @@ Carpeta: %2 Remaining Track File(s) - + Renombrando archivo(s) de pista @@ -16794,7 +16884,7 @@ Carpeta: %2 Clear Reset metadata in right click track context menu in library - + Climpiar @@ -16804,37 +16894,37 @@ Carpeta: %2 Clear BPM and Beatgrid - + Limpia las BPM y la cuadrícula de tiempo Undo last BPM/beats change - + Revertir el último cambio de BPM/pulsaciones Move this track file to the trash bin? - + ¿Mover este archivo de pista a la papelera? Permanently delete this track file from disk? - + ¿Eliminar permanentemente este archivo de pista del disco? All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + Todos los platos donde estas pistas hayan sido cargadas se detendrán, y las pistas serán expulsadas. All decks where this track is loaded will be stopped and the track will be ejected. - + Todos los platos donde esta pista haya sido cargada se detendrán, y la pista será expulsada. Removing %n track file(s) from disk... - + Removiendo %n archivo(s) de pista del disco... @@ -16854,12 +16944,12 @@ Carpeta: %2 Don't show again during this session - + No mostrar nuevamente durante esta sesión The following %1 file(s) could not be moved to trash - + El/los siguiente(s) %1 archivo(s) no pudieron ser movidos a la papelera @@ -16882,7 +16972,7 @@ Carpeta: %2 title - + título @@ -16890,73 +16980,73 @@ Carpeta: %2 Load for stem mixing - + Cargar para mezcla de stems Load pre-mixed stereo track - + Cargar pista estéreo premezclada Load the "%1" stem - + Cargar el stem "%1" Load multiple stem into a stereo deck - + Cargar múltiples stems en un plato estéreo Select stems to load - + Seleccionar stems a cargar Release "CTRL" to load the current selection - + Soltar "Ctrl" para cargar la selección actual Use "CTRL" to select multiple stems - + Use "Ctrl" para seleccionar múltiples stems WTrackTableView - + Confirm track hide Confirmar ocultar pista - + Are you sure you want to hide the selected tracks? ¿Estas seguro de que quieres ocultar las pistas seleccionadas? - + Are you sure you want to remove the selected tracks from AutoDJ queue? ¿Esta seguro de que quiere eliminar las pistas seleccionadas de la cola del AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? ¿Estás seguro de que quieres eliminar las pistas seleccionadas de esta caja? - + Are you sure you want to remove the selected tracks from this playlist? ¿Esta seguro de que desea eliminar las pistas seleccionadas de la lista de reproducción? - + Don't ask again during this session No volver a preguntar durante esta sesión - + Confirm track removal Confirmar eliminación del track @@ -16971,58 +17061,58 @@ Carpeta: %2 Shuffle Tracks - + Mezclar pistas mixxx::CoreServices - + fonts tipos de letra - + database base de datos - + effects efectos - + audio interface interface de sonido - + decks - + decks - + library Biblioteca - + Choose music library directory Elija el directorio de la biblioteca de la música - + controllers Controladores - + Cannot open database No se puede abrir la base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17036,70 +17126,80 @@ Pulse Aceptar para salir. mixxx::DlgLibraryExport - + Entire music library + Biblioteca de música completa + + + + Crates + + + + + Playlists - - Selected crates - Cajas seleccionadas + + Selected crates/playlists + - + Browse Examinar - + Export directory - + Exportar directorio - + Database version - + Versión de base de datos - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ - + Export Library To - + Exportar biblioteca a - + No Export Directory Chosen - + No se seleccionó un directorio de exportación - + No export directory was chosen. Please choose a directory in order to export the music library. - + No se escogió un directorio de exportación. Por favor escoja un directorio para poder exportar la biblioteca de música. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + Una base de datos ya existe en el directorio seleccionado. Las pistas exportadas serán añadidas a esta base de datos. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - + Una base de datos ya existe en el directorio seleccionado, pero ocurrió un problema al cargarla. No se garantiza una exportación exitosa en esta situación. @@ -17118,34 +17218,35 @@ Pulse Aceptar para salir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message - + Fallo al exportar %1 - %2: +%3 mixxx::LibraryExporter - + Export Completed - + Exportación completada - - Exported %1 track(s) and %2 crate(s). - Exportados %1 pista(s) y %2 caja(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed - + Exportación fallida - + Exporting to Engine DJ... - + Exportando a Engine DJ... @@ -17153,7 +17254,7 @@ Pulse Aceptar para salir. Abort - + Abortar diff --git a/res/translations/mixxx_es_419.qm b/res/translations/mixxx_es_419.qm index 3ea6f48109b7a09fac696ef4bcbd5de407fe63b1..6c6573084af0d6f66341a71d67b4b1ade633342d 100644 GIT binary patch delta 54984 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 delta 25636 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𝔪H0y3Rh{&Vc8YBSqh90c;& zD7NK72xx5r*fzA9rK)^ZfKIDC={DQZ7PDaY0@%)wVt`KV+3q$tF_&N)+xr^B;O!FG z{`ro0oMs9u^mha0^LecBavVsVZnC0D$m;_#E6P2Ao60(N#Bvk#o)6fOkqgnde9n%B z${?8{+0hXZpgCM)$LnT;lEdv#`y=zeu=EqG=wyfbkhSc1#1xR%+fJ}kHH$&T#c(bL zNi!>eU5Fk8%BWx1g@=8xF8DONl#aop+;UdxhGJOr2RoEvYqBdoDEIe%W>-U_KzAF; zuGN*$*<8-9ZAk^CZy>w=U>QK!@9f5#?WkxjvRgy;gS@W^yEVEMD5h!bP60}XjsL~& z2Bd+~>@d5(1XbgiKUul;6t00BR#8|ThIeI87NC*(&2jeXELt|9gV^f~6gQv!?Dg8d z=o#IyL#;stdpo!#8mG(Hp9xPu4GU&}eT}Z$yDO|Jekj(M6<9zwiB+eE0|#< zSb!&{C^Y9oOgaDKwB((0EY2+_CVoc2py5kA3j(LT@hRxGpS;z&-GACZVUzy5VKT|#Vmj{$BqWNLv ztSl0aDz9{rb6WA&xzBkei07SGwu|Q%6syGbQYA?oC{+&C$%$L=FY#xkqIVK%AjZsd z=4A}z^Si3<;vahN8+K314+G!&0_-L&RG2{!a*j;3F(3-U8O($s6#ABP* z-9e1Y()?v{ZLx;b^=t?6y}$lc5x)oMCP{d<(k~ezAw*xG3#TxBE#+Q4b)Apwt1smf`spjgul@B> zl|LG+Ulupb`VB=)9;SEwOwjTAQ%zi*q8BS7X@=fb62oTdCSAnL(=#-2Y@wdx$oH($ z2Z)z>I->P#jUJ=&`#?VOrCvI*bC44-<=|L7y^?-shfMHo+XG3qw@-yrq|&b{Nz$uYyn zg(b#}NvZDcAB}7Csmv&D76{*?4_mB_>y6Qrlg}e^!tJF@K|}bWMq|eErI9^-vXQ)DR%xh~&A-tEn@)_THQ}SrlGAuFKG%7JU z&SbITBu1H2Es0i~Rh+4B3QjfLY#n1BX$mogThi0hP2XCECYzHps>jRbCj-^`JjKPR z<<${MWrh)mW6Ix{Irbi&n4B6jCN;&59l4EKJOhdOmio4{)Ljsi+9zOWEngJ=*h}#e+=8JPqHOG z9x?wfV}{1ztm2Ts;{%o2^-YP%BgTvxUCp@EWOGbHifODRF3n^fhHOnUC&zxmHD}Fy zFY(UR=pu8yxoYAIY8ocq&{eI)ojeRLan-{p)AtW-kyZ6K>d5@3 z?~IOu4>E3O;&`l)t@3P(af}y^GBUX-(dc9}L@_`j^Q1?Li8uR7a&%$6<3`5Cq{hXX zVv^0NaVflGqETNQPc~L6b-%`Sm=2@u%chz+vDM5$V*0{Yyt%*O(JjM%6M&yFcHWtx uF*fi6|Gzot+ckYOvJkuX{pu6B8mIV~%vQV)_%tHkbC+}+Ga=m=C;bPyG$Y{v diff --git a/res/translations/mixxx_es_419.ts b/res/translations/mixxx_es_419.ts index 3bc4ea462a2c..30340cd07b0c 100644 --- a/res/translations/mixxx_es_419.ts +++ b/res/translations/mixxx_es_419.ts @@ -26,17 +26,17 @@ Enable Auto DJ - + Activar Auto DJ Disable Auto DJ - + Desactivar Auto DJ Clear Auto DJ Queue - + Limpiar la cola de Auto DJ @@ -51,17 +51,17 @@ Confirmation Clear - + Confirmación limpiada Do you really want to remove all tracks from the Auto DJ queue? - + Realmente quieres eliminar todas las pistas de la cola de Auto DJ? This can not be undone. - + ¡Esto no puede ser revertido! @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -160,7 +160,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar Lista de Reproducción - + Export Track Files Exportar pistas de audio - + Analyze entire Playlist Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - - + + Export Playlist Exportar lista de reproducción - + Add to Auto DJ Queue (replace) Añadir a la lista de DJ Automático (reemplazar). - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renombrar Lista de Reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Una lista de reproducción ya existe con el mismo nombre - - - + + + A playlist cannot have a blank name. El nombre de una lista de reproduccion no puede estar vacío - + _copy //: Appendix to default name when duplicating a playlist Copiar - - - - - - + + + + + + Playlist Creation Failed Fallo la creación de lista de Reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Confirm Deletion Confirmar Borrado - + Do you really want to delete playlist <b>%1</b>? ¿Desea realmente eliminar la lista de reproducción<b>%1</b>? - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca de tiempo @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artista del Album - + Artist Artista - + Bitrate Tasa de bits - + BPM BPM - + Channels Canales - + Color Color - + Comment Comentario - + Composer Compositor - + Cover Art Portada - + Date Added Fecha de Agregado - + Last Played Última reproducción - + Duration Duración - + Type Tipo - + Genre Genero - + Grouping Agrupación - + Key Clave - + Location Ubicación - + Overview - + Resumen - + Preview Preescucha - + Rating Calificación - + ReplayGain Reproducir otra vez - + Samplerate Tasa de muestreo - + Played Reproducido - + Title Título - + Track # Pista n.º - + Year Año - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recuperando imagen... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computadora" le permite navegar, ver y cargar pistas desde carpetas en su disco duro y dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -806,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Re escanea la librería cuando se inicia Mixxx @@ -856,7 +873,7 @@ trace - Arriba + Perfilar mensajes Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Configura el tamaño máximo del archivo mixxx.log en bytes. Usa -1 para ilimitado. Por defecto es 100 MB, como en 1e5 o 100000000. @@ -866,7 +883,7 @@ trace - Arriba + Perfilar mensajes Overrides the default application GUI style. Possible values: %1 - + Anula el estilo por defecto de la interfaz de usuario de la aplicación. Valores posibles: %1 @@ -1185,12 +1202,12 @@ trace - Arriba + Perfilar mensajes Equalizers - + Ecualizadores Vinyl Control - + Control de vinilo @@ -1983,7 +2000,7 @@ trace - Arriba + Perfilar mensajes Effects - + Efectos @@ -2463,12 +2480,12 @@ trace - Arriba + Perfilar mensajes Move Beatgrid Half a Beat - + Desplaza la cuadricula de tiempo medio pulso Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en pistas con tempo constante. @@ -2666,13 +2683,13 @@ trace - Arriba + Perfilar mensajes Sort hotcues by position - + Ordenar hotcues por posición Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) @@ -3527,7 +3544,7 @@ trace - Arriba + Perfilar mensajes Unknown - + Desconocido @@ -3632,32 +3649,32 @@ trace - Arriba + Perfilar mensajes ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funcionalidad provista por este mapa de controlador será desactivada hasta que el problema sea resuelto. - + You can ignore this error for this session but you may experience erratic behavior. Puedes ignorar este error durante esta sesión, pero podrías experimentar problemas impredecibles. - + Try to recover by resetting your controller. Prueba de corregirlo reseteando la controladora. - + Controller Mapping Error Error del mapa de controlador - + The mapping for your controller "%1" is not working properly. El mapa de tu controlador "%1" no funciona correctamente. - + The script code needs to be fixed. El código del script necesita ser reparado. @@ -3765,7 +3782,7 @@ trace - Arriba + Perfilar mensajes Importar cajón - + Export Crate Exportar cajón @@ -3775,7 +3792,7 @@ trace - Arriba + Perfilar mensajes Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: @@ -3801,17 +3818,17 @@ trace - Arriba + Perfilar mensajes No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) @@ -3937,12 +3954,12 @@ trace - Arriba + Perfilar mensajes Antiguos colaboradores - + Official Website Sitio web oficial - + Donate Donar @@ -3998,7 +4015,7 @@ trace - Arriba + Perfilar mensajes - + Analyze Analizar @@ -4043,17 +4060,17 @@ trace - Arriba + Perfilar mensajes Ejecuta el análisis de cuadrícula de tempo, clave musical y ReplayGain en las pistas seleccionadas. No genera formas de onda para las pistas seleccionadas para ahorrar espacio en disco. - + Stop Analysis Detener análisis - + Analyzing %1% %2/%3 Analizando %1% %2/%3 - + Analyzing %1/%2 Analizando %1/%2 @@ -4164,7 +4181,32 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modos de desvanecimiento de Auto DJ + +Intro completa + Outro: +Reproduce la intro completa y la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea el más corto. Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Desvanecer al iniciar la Outro: +Inicia el fundido cruzado al inicio de la outro. Si la outro es más larga que la intro, +corta el final de la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea más corto.Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Pista completa: +Reproduce la pista completa. Comienza el fundido cruzado desde el +número de segundos seleccionado antes del final de la pista. Un fundido cruzado negativo +agrega silencio entre las pistas. + +Saltar silencio: +Reproduce la pista completa excepto el silencio al inicio y al final. +Inicia el fundido cruzado desde el número de segundos seleccionado antes +del último sonido. + +Saltar silencio e iniciar con volumen al máximo: +Lo mismo que Saltar silencio, pero inicia la transición con el crossfader +centrado, de manera que la intro inicia con el volumen al máximo. @@ -4189,7 +4231,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Saltar silencio e iniciar con volumen al máximo @@ -4322,7 +4364,7 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis Analyzer Settings - + Configuración del Analizador @@ -4344,7 +4386,7 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis Re-analyze beats when settings change or beat detection data is outdated - + Re-analizar pulsaciones cuando las preferencias cambien o la información sobre pulsaciones sea obsoleta @@ -4470,37 +4512,37 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis Si el mapeo no funciona, prueba a activar uno de los controles avanzados siguientes y prueba de nuevo. También puedes volver a detectar el control. - + Didn't get any midi messages. Please try again. No se detectó ningún mensaje MIDI. Por favor, inténtelo de nuevo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No se detectó un mapeado -- Intentelo nuevamente. Asegurese de tocar sólo un control a la vez. - + Successfully mapped control: Control mapeado con éxito: - + <i>Ready to learn %1</i> <i>Preparado para asignar %1</i> - + Learning: %1. Now move a control on your controller. Aprendizaje: %1. Ahora mueva un control en su controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + El control seleccionado no existe. <br>Esto es posiblemente un bug. Por favor repórtelo en el seguidor de bugs de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br> Trataste de vincular: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5198,120 +5240,120 @@ associated with each key. Key palette - + Paleta de notas DlgPrefController - + Apply device settings? ¿Aplicar la configuración del dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configuración debe ser aplicada antes de iniciar el asistente de aprendizaje. ¿Aplicar la configuración y continuar? - + None Ningún - + %1 by %2 %1 por %2 - + Mapping has been edited Se ha editado el mapeo - + Always overwrite during this session Siempre sobreescribir durante esta sesión - + Save As Guardar como - + Overwrite Sobreescribir - + Save user mapping Guardar mapeo del usuario - + Enter the name for saving the mapping to the user folder. Ingresar el nombre del archivo de mapeo para guardarlo en la carpeta de usuario. - + Saving mapping failed Ha fallado el guardado del mapeo - + A mapping cannot have a blank name and may not contain special characters. El nombre del mapeo no puede estar en blanco, ni contener caracteres especiales. - + A mapping file with that name already exists. Ya existe un archivo de mapeo con el mismo nombre. - + Do you want to save the changes? Quieres guardar los cambios? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si usas este mapeo, tu controlador podría no funcionar correctamente. Por favor selecciona otro mapeo o deshabilita el controlador. </b></font><br><br>Este mapeo fue diseñado para un nuevo Motor de Controladores de Mixxx, y no puede ser usado con tu instalación actual.<br>Tu instalación de Mixxx posee la version del Motor de Controladores %1. Este mapeo requiere una versión del Motor de controladores >=%2.<br><br>Para más información visita la wiki de <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versiones del Motor de Controladores</a>. - + Mapping already exists. El mapeo ya existe. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ya existe en la carpeta de mapeos de usuario. <br>¿Deseas sobreescribir o guardar con otro nombre? - + Clear Input Mappings Limpiar mapeos de Entrada - + Are you sure you want to clear all input mappings? Está seguro de querer eliminar todos los mapeos de entrada? - + Clear Output Mappings Limpiar mapeos de Salida - + Are you sure you want to clear all output mappings? Está seguro de querer eliminar todos los mapeos de salida? @@ -5331,62 +5373,62 @@ Apply settings and continue? Device Info - + Información del dispositivo Physical Interface: - + Interfase física: Vendor name: - + Nombre del fabricante: Product name: - + Nombre del producto: Vendor ID - + ID del proveedor VID: - + VID: Product ID - + ID del producto PID: - + PID: Serial number: - + Número de serie: USB interface number: - + Número de interfaz USB HID Usage-Page: - + Página de uso HID HID Usage: - + Uso de HID: @@ -5464,7 +5506,7 @@ Apply settings and continue? Data protocol: - + Protocolo de datos: @@ -5474,7 +5516,7 @@ Apply settings and continue? Mapping Settings - + Configuración de mapeo @@ -5527,7 +5569,7 @@ Apply settings and continue? Controllers - + Controladores @@ -5537,7 +5579,7 @@ Apply settings and continue? Enable MIDI Through Port - + Activar puerto de MIDI Through @@ -5642,6 +5684,16 @@ Apply settings and continue? Multi-Sampling Multi-Muestreo + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6169,7 +6221,7 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform Export - + Exportar @@ -6200,12 +6252,12 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform ❯ - + ❮ - + @@ -6256,62 +6308,62 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. El tamaño mínimo de la apariencia seleccionada es mas grande que la resolucion de su pantalla. - + Allow screensaver to run Permite el salvapantallas - + Prevent screensaver from running Evita que se active el salvapantallas - + Prevent screensaver while playing Evita el salvapantallas mientras reproduce - + Disabled Desactivado - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Este skin no soporta esquemas de color - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx debe ser reiniciado para que el nuevo ajuste de locale, escalado o multi-muestreo tenga efecto. @@ -6348,7 +6400,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Analyzer Settings - + Configuración del Analizador @@ -6378,7 +6430,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Key Notation - + Notación de clave musical @@ -6576,7 +6628,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Metadatos significa todos los detalles de la pista (artista, titulo, cantidad de reproducciones, etc) como cuadrículas de tempo, hotcues y bucles. Este cambio solo afecta a la biblioteca de Mixxx. Ningun archivo en el disco será cambiado o eliminado. @@ -7023,7 +7075,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Reset stem controls on track load - + Reiniciar controles de stem al cargar pista @@ -7481,173 +7533,172 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Habilitado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Para activar el Planificador en tiempo real (actualmente desactivado), mira %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 muestra una lista de tarjetas de sonido y controladores que podrías considerar para utilizar con Mixxx - + Mixxx DJ Hardware Guide Guía de Hardware DJ de Mixxx - + Information Información - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx debe ser reiniciado para que el cambio de ajuste de RubberBand multi-hilo tenga efecto. - + auto (<= 1024 frames/period) auto (<= 1024 fotogramas/período) - + 2048 frames/period 2048 fotogramas/período - + 4096 frames/period 4096 fotogramas/período - + Are you sure? ¿Estás seguro(a)? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Distribuir los canales estéreo en canales mono para su procesamiento en paralelo podría resultar en la pérdida de la compatibilidad mono y una imagen estéreo difusa. No se recomienda al transmitir en vivo o al grabar. - + Are you sure you wish to proceed? ¿Realmente deseas continuar? - + No No - + Yes, I know what I am doing Sí, se lo que estoy haciendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + Main output only Solo Salida principal - + Main and booth outputs Salidas principal y de cabina - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7662,134 +7713,134 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y Sound API - + API de sonido - + Sample Rate Tasa de muestreo - + Audio Buffer Búfer de audio - + Engine Clock Relog del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa el reloj de la tarjeta de sonido para emitir a un público presente y para la menor latencia. <br>Usa el reloj de red para emitir en vivo sin un público presente. - + Main Mix Mezcla principal - + Main Output Mode Modo de Salida principal - + Microphone Monitor Mode Modo de monitorización del micrófono - + Microphone Latency Compensation Compensación de latencia del micrófono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de vaciado del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Bloqueo tonal/Motor de Pitch-bend - + Multi-Soundcard Synchronization Sincronización con Múltiples Tarjetas de Sonido - + Output Salida - + Input Entrada - + System Reported Latency Latencia reportada por el sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente su búfer de audio si el contador de desbordamiento está aumentando o escuchas chasquidos durante la reproducción. - + Main Output Delay Retardo Salida Principal - + Headphone Output Delay Retraso/delay de la Salida de auriculares - + Booth Output Delay Retraso/delay de la salida de cabina - + Dual-threaded Stereo Estéreo en doble-hilo - + Hints and Diagnostics Diagnóstico y sugerencias - + Downsize your audio buffer to improve Mixxx's responsiveness. Disminuya su búfer de audio para mejorar la velocidad de respuesta de Mixxx. - + Query Devices Consultar aparatos @@ -7843,7 +7894,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y Turntable Input Signal Boost - + Amplificación de señal de entrada de Vinilo @@ -7947,12 +7998,12 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y 1/3 of waveform viewer options for "Text height limit" - + 1/3 de visualización de forma de onda Entire waveform viewer - + Visor de forma de onda completa @@ -7985,7 +8036,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y OpenGL Status - + Estado de OpenGL @@ -8140,12 +8191,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferred font size - + Tamaño de tipo de letra preferido Text height limit - + Límite de altura de texto @@ -8185,18 +8236,18 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat grid opacity - + Superar la opacidad de la rejilla Scrolling Waveforms - + Deslizar formas de onda Type - + Tipo @@ -8206,7 +8257,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Set amount of opacity on beat grid lines. - + Establece la cantidad de opacidad en las líneas de la cuadrícula del compás. @@ -8216,17 +8267,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Play marker position - + <br><div><br data-mce-bogus="1"></div> Moves the play marker position on the waveforms to the left, right or center (default). - + Mover the marcador de posición en la pista a la izquierda, derecha o centro (Defabrica). Overview Waveforms - + Visualizar formas de onda @@ -8239,17 +8290,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Sound Hardware - + Hardware de sonido Controllers - + Controladores Library - + Biblioteca @@ -8324,12 +8375,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat Detection - + Detección de pulsaciones Key Detection - + Detección de tonalidad @@ -8344,7 +8395,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Vinyl Control - + Control de vinilo @@ -8362,7 +8413,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferences - + Preferencias @@ -8909,7 +8960,7 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis Assume constant tempo - + Asumir tempo constante @@ -9349,27 +9400,27 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mejor) - + Rubberband R3 (near-hi-fi quality) Banda elástica R3 (calidad casi alta fidelidad) - + Unknown, using Rubberband (better) Desconocido, utilizando Banda elástica (mejor) - + Unknown, using Soundtouch Desconocido, usando Soundtouch @@ -9554,12 +9605,12 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis Change color - + Cambiar color Choose a new color - + Escoger un nuevo color @@ -9567,32 +9618,32 @@ Generalmente produce cuadrículas de mayor calidad, pero no funciona bien en pis Browse... - + Examinar… No file selected - + No se ha seleccionado ningún archivo Select a file - + Seleccionar un archivo LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9604,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep de OpenGL. - + activate activar - + toggle conmutar - + right derecha - + left izquierda - + right small derecha pequeño - + left small izquierda pequeño - + up arriba - + down abajo - + up small arriba pequeño - + down small abajo pequeño - + Shortcut Atajo @@ -9662,37 +9713,37 @@ de OpenGL. Library - + This or a parent directory is already in your library. Este directorio o su superior ya se encuentra en tu biblioteca. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Este directorio o el indicado no existe o es inaccesible. Cancelando la operación para evitar inconsistencias de biblioteca. - - + + This directory can not be read. Este directorio no puede ser leído. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ha ocurrido un error desconocido. Cancelando la operación para evitar inconsistencias de biblioteca - + Can't add Directory to Library No se pudo agregar el directorio a la biblioteca - + Could not add <b>%1</b> to your library. %2 @@ -9701,27 +9752,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca %2 - + Can't remove Directory from Library No se pudo remover el directorio de la biblioteca. - + An unknown error occurred. Ha ocurrido un error desconocido. - + This directory does not exist or is inaccessible. Este directorio no existe o es inaccesible. - + Relink Directory Reenlazar directorio - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9733,27 +9784,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca LibraryFeature - + Import Playlist Importar Lista de Reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? ¿Sobrescribir archivo? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. Do you really want to overwrite it? - + Ya existe un archivo de lista de reproducción con el nombre "% 1". Se agregó la extensión predeterminada "m3u" porque no se especificó ninguna. ¿Realmente desea sobrescribirla? @@ -9899,253 +9950,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy El dispositivo de sonido está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reintente</b> luego de cerrar las otras aplicaciones o reconectar un dispositivo de sonido - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> las opciones del dispositivo de sonido de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obtenga <b>ayuda</b> del wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Salir</b> de Mixxx. - + Retry Reintentar - + skin apariencia - + Allow Mixxx to hide the menu bar? ¿Permitir a Mixxx ocultar la barra de menú? - + Hide Always show the menu bar? Ocultar - + Always show Mostrar siempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra de menú de Mixxx ha sido ocultada y se puede alternar presionando la tecla <b>Alt</b>. <br><br>Haz clic en <b>%1</b> para aceptar. <br><br>Haz clic en <b>%2</b> para desactivarlo, por ejemplo si usas Mixxx sin un teclado. <br><br>Puedes cambiar este ajuste en cualquier momento en Preferencias -> Interfaz. <br> - + Ask me again Pregúntame de nuevo - - + + Reconfigure Reconfigurar - + Help Ayuda - - + + Exit Salir - - + + Mixxx was unable to open all the configured sound devices. Mixxx no ha podido activar todos los dispositivos de sonido configurados. - + Sound Device Error Error del dispositivo de sonido - + <b>Retry</b> after fixing an issue <b>Reintenta</b> una vez corregido el problema - + No Output Devices No hay dispositivos de salida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx fue configurado sin ningún dispositivo de salida de audio. El procesamiento de audio estará desactivado mientras no se configure un dispositivo de audio de salida. - + <b>Continue</b> without any outputs. <b>Continuar</b> sin ninguna salida. - + Continue Continuar - + Load track to Deck %1 Cargar pista al plato %1 - + Deck %1 is currently playing a track. El plato %1 está reproduciendo una pista. - + Are you sure you want to load a new track? ¿Está seguro de cargar una pista nueva? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control por vinilo. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control passthrough. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this microphone. Do you want to select an input device? No se ha seleccionado un dispositivo de Entrada para este micrófono. ¿Deseas escoger uno ahora? - + There is no input device selected for this auxiliary. Do you want to select an input device? No se ha seleccionado un dispositivo de entrada para este Auxiliar. ¿Deseas escoger uno ahora? - + Scan took %1 - + El escaneo tomo %1 - + No changes detected. - + No se han detectado cambios - - + + %1 tracks in total - + %1 pistas en total - + %1 new tracks found - + Encontradas %1 pistas nuevas - + %1 moved tracks detected - + %1 pistas movidas detectadas - + %1 tracks are missing (%2 total) - + %1 pistas perdidas (%2 en total) - + %1 tracks have been rediscovered - + %1 pistas han sido reencontradas - + Library scan finished - + Escaneo de la biblioteca terminado - + Error in skin file Error en el archivo de la apariencia - + The selected skin cannot be loaded. No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering Renderizado directo de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + El renderizado directo no está habilitado en su máquina. <br><br>Esto significa que las visualizaciones de forma de onda serán muy <br><b>lentas y pueden exigir mucho a su CPU</b>. Actualice su <br>configuración para habilitar la representación directa o desactiv<br> las visualizaciones de forma de onda en las preferencias de Mixxx seleccionando <br>"Vacío" como la pantalla de forma de onda en la sección 'Interfaz'. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -10161,13 +10212,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reproducción @@ -10177,32 +10228,58 @@ Do you want to select an input device? Aleatorizar lista de reproducción - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Las listas de reproducción son listar ordenadas de pistas que te permiten planificar tus sesiones de DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Podría ser necesario saltar algunas pistas en tu lista de reproducción planificada, o añadir algunas pistas diferentes, con el fin de mantener la energía de tu audiencia. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + Create New Playlist Crear nueva lista de reproducción @@ -10212,7 +10289,7 @@ Do you want to select an input device? Mixxx Hotcue Colors - + Colores de hotcues de Mixxx @@ -10220,82 +10297,82 @@ Do you want to select an input device? Serato DJ Track Metadata Hotcue Colors - + Metadatos de colores de hotcues de pistas de Serato DJ Serato DJ Pro Hotcue Colors - + Colores de hotcues de Serato DJ Pro Rekordbox COLD1 Hotcue Colors - + Colores de hotcues de Rekordbox COLD1 Rekordbox COLD2 Hotcue Colors - + Colores de hotcues de Rekordbox COLD2 Rekordbox COLORFUL Hotcue Colors - + Colores de hotcues COLORFUL de Rekordbox Mixxx Track Colors - + Colores de pistas de Mixxx Rekordbox Track Colors - + Colores de pistas de Rekordbox Serato DJ Pro Track Colors - + Colores de pistas de Serato DJ Pro Traktor Pro Track Colors - + Colores de pistas de Traktor Pro VirtualDJ Track Colors - + Colores de pistas de VirtualDJ Mixxx Key Colors - + Colores de notas de Mixxx Traktor Key Colors - + Colores de notas de Traktor Mixed In Key - Key Colors - + Colores de notas de Mixed In Key Protanopia / Protanomaly Key Colors - + Colores de notas de Protanopia/Protanomalía Deuteranopia / Deuteranomaly Key Colors - + Colores de notas de Deuteranopía/Deuteranomalía Tritanopia / Tritanomaly Key Colors - + Colores de notas de Tritanopía/Tritanomalía @@ -10429,7 +10506,7 @@ Do you want to scan your library for cover files now? Switch - + Switch @@ -10514,7 +10591,7 @@ Do you want to scan your library for cover files now? Vinyl Control - + Control de vinilo @@ -10879,7 +10956,7 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p The Mixxx Team - + Equipo de Mixxx @@ -10909,12 +10986,12 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p Gain - + Ganancia Set the gain of metronome click sound - + Configura la ganancia del sonido del metrónomo @@ -11863,7 +11940,7 @@ Consejo: compensa las voces de "ardillitas" o "gruñonas"La cantidad de amplificación aplicada a la señal de audio. A niveles más altos, el audio estará más distorsionado. - + Passthrough Paso @@ -12033,12 +12110,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. varios - + built-in nativo - + missing no encontrado @@ -12166,54 +12243,54 @@ pueden introducir un efecto de "bombeo" y/o distorsión. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listas de reproducción - + Folders Carpetas - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Accesos Directos - + Loops (only the first loop is currently usable in Mixxx) Bucles (solo el primer bucle es utilizable en Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Buscar dispositivos de almacenamiento Rekordbox (refrescar) - + Beatgrids Grillas de pulsos - + Memory cues Cues en memoria - + (loading) Rekordbox (cargando) Rekordbox @@ -12655,22 +12732,22 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Reading track for fingerprinting failed. - + Ha fallado la lectura de la pista para fingerprinting Identifying track through AcoustID - + Identificando pista mediante AcoustID Could not identify track through AcoustID. - + No se pudo identificar la pista mediante AcoustID. Could not find this track in the MusicBrainz database. - + No se pudo encontrar esta pista en la base de datos de MusicBrainz. @@ -12934,7 +13011,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Vinyl Control - + Control de vinilo @@ -13242,7 +13319,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Toggle visibility of Rate Control - + Alternar visibilidad del control de velocidad @@ -13392,7 +13469,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. - + Mantener el clic izquierdo permite previsualizar la posición donde la cabeza de reproducción saltará al soltarlo. El arrastre puede ser abortado con el clic derecho. @@ -13442,12 +13519,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Shows the current volume for the left channel of the main output. - + Muestra el volumen actual para el canal izquierdo en la salida principal. Shows the current volume for the right channel of the main output. - + Muestra el volumen actual para el canal derecho de la salida principal. @@ -13459,27 +13536,27 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Adjusts the main output gain. - + Ajusta el volumen principal Determines the main output by fading between the left and right channels. - + Determina la salida principal desvaneciendo entre los canales izquierdo y derecho. Adjusts the left/right channel balance on the main output. - + Ajusta el balance de los canales izquierdo/derecho en la salida principal. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Desvanecimiento cruzado de la salida de auriculares entre la salida principal y la señal de cueing (PFL o Escucha Pre-Deslizador) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si se activa, la señal principal de la mezcla se reproduce en el canal derecho, mientras que la señal de cueing se reproduce en el canal izquierdo. @@ -13494,12 +13571,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Show/hide the beatgrid controls section - + Mostrar/ocultar la sección de controles de la cuadrícula de tiempo Show/hide the stem mixing controls section - + Mostrar/ocultar la sección de controles de mezcla de stems @@ -13509,17 +13586,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Volume Meters - + Medidores de volumen mix microphone input into the main output. - + mezcla la entrada de micrófono con la salida principal. Auto: Automatically reduce music volume when microphone volume rises above threshold. - + Auto: reduce automáticamente el volumen de la música cuando el volumen del micrófono supera el umbral. @@ -13530,17 +13607,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: configura cuánto se reduce el volumen de la música cuando el volumen de los micrófonos activos supera el umbral. Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + Manual: configura cuánto reducir e If keylock is disabled, pitch is also affected. - + Si el bloqueo tonal se desactiva, la altura también es afectada. @@ -13555,7 +13632,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Raises playback speed in small steps. - + Incrementa la velocidad de reproducción en pasos pequeños. @@ -13570,7 +13647,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Lowers playback speed in small steps. - + Reduce la velocidad de reproducción en pasos pequeños. @@ -13580,12 +13657,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed higher while active (tempo). - + Mantiene la velocidad de reproducción alta cuando se activa (tempo). Holds playback speed higher (small amount) while active. - + Mantiene la velocidad de reproducción alta (pequeña cantidad) cuando se activa. @@ -13595,59 +13672,60 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed lower while active (tempo). - + Mantiene la velocidad de reproducción baja cuando se activa (tempo). Holds playback speed lower (small amount) while active. - + Mantiene la velocidad de reproducción baja (pequeña cantidad) cuando se activa. When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Cuando se pulsa repetidamente, ajusta el tempo para coincidir con la frecuencia de pulsaciones. Tempo Tap - + Seguidor de Tempo (Tempo Tap) Rate Tap and BPM Tap - + Frecuencia de pulsaciones y de BPM Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en +pistas con tempo constante Revert last BPM/Beatgrid Change - + Revierte el último cambio de BPM/cuadrícula de tiempo Revert last BPM/Beatgrid Change of the loaded track. - + Revierte el último cambio de BPM/Cuadrícula de tiempo para la pista cargada. Toggle the BPM/beatgrid lock - + Cambia el bloqueo de BPM/cuadrícula de tiempo Tempo and Rate Tap - + Toques de Tempo y Frecuencia Tempo, Rate Tap and BPM Tap - + Toques de Tempo, Frecuencia y BPM @@ -13663,79 +13741,79 @@ tracks with constant tempo. Left click: shift 10 milliseconds earlier - + Clic izquierdo: adelantar 10 milisegundos Right click: shift 1 millisecond earlier - + Clic derecho: adelantar 1 milisegundo Shift cues later - + Retrasar cues Left click: shift 10 milliseconds later - + Clic izquierdo: retrasar 10 milisegundos Right click: shift 1 millisecond later - + Clic derecho: retrasar 1 milisegundo Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Arrastra un botón de Hotcue aquí para continuar reproduciendo después de soltar la hotcue. Hint: Change the default cue mode in Preferences -> Decks. - + Sugerencia: cambie el modo por defecto de las cues en Preferencias -> Platos. Mutes the selected channel's audio in the main output. - + Silencia el audio del canal seleccionado en la salida principal. Main mix enable - + Activador de mezcla principal Hold or short click for latching to mix this input into the main output. - + Clic sostenido o corto para enganchar, para mezclar esta entrada con la salida principal. If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + Si la hotcue es una cue de bucle, activa el bucle y salta hacia él si se encuentra detrás de la posición de reproducción. If the play position is inside an active loop, stores the loop as loop cue. - + Si la posición de reproducción se encuentra dentro de un bucle activo, almacena el bucle como una hotcue de bucle. Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Arrastrar este botón dentro de otro botón de hotcue para moverlo hacia este (cambiando su número). Si la otra hotcue ya se encuentra definida, las dos son intercambiadas. Expand/Collapse Samplers - + Expandir/contraer samplers Toggle expanded samplers view. - + Alternar la vista expandida de los samplers. @@ -13745,12 +13823,12 @@ tracks with constant tempo. Auto DJ is active - + Auto DJ se encuentra activo Red for when needle skip has been detected. - + Rojo cuando se detecta un salto de aguja. @@ -13790,7 +13868,7 @@ tracks with constant tempo. If the track has no beats the unit is seconds. - + Si la pista no tiene pulsaciones, la unidad es segundos. @@ -13830,12 +13908,12 @@ tracks with constant tempo. Beatloop Anchor - + Ancla del bucle de pulsaciones Define whether the loop is created and adjusted from its staring point or ending point. - + Define si el bucle es creado y ajustado desde su punto de inicio o de final. @@ -13930,12 +14008,12 @@ tracks with constant tempo. Hint: Change the time format in Preferences -> Decks. - + Sugerencia: cambie el formato de tiempo en Preferencias -> Platos. Show/hide intro & outro markers and associated buttons. - + Mostrar/ocultar marcadores de intro y outro, y sus botones asociados. @@ -13948,7 +14026,7 @@ tracks with constant tempo. If marker is set, jumps to the marker. - + Si el marcador se encuentra definido, salta al marcador. @@ -13956,7 +14034,7 @@ tracks with constant tempo. If marker is not set, sets the marker to the current play position. - + Si el marcador no se encuentra definido, lo configura a la posición de reproducción actual. @@ -13964,7 +14042,7 @@ tracks with constant tempo. If marker is set, clears the marker. - + Si el marcador se encuentra definido, lo elimina. @@ -13989,7 +14067,7 @@ tracks with constant tempo. Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajuste la mezcla de la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos @@ -13999,7 +14077,7 @@ tracks with constant tempo. D+W mode: Add wet to dry - + Modo D+W: agregue húmedo a seco @@ -14009,24 +14087,25 @@ tracks with constant tempo. Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajuste cómo se mezcla la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Modo seco / húmedo (líneas cruzadas): Mezcle los fundidos cruzados de la perilla entre seco y húmedo. Use esto para cambiar el sonido de la pista con EQ y efectos de filtro. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Modo Seco+Húmedo (línea seca plana): La perilla de mezcla agrega mojado a seco +Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efectos de filtrado. Route the main mix through this effect unit. - + Enruta la mezcla principal a través de esta unidad de efectos. @@ -14046,42 +14125,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Stem Label - + Etiqueta de stem Name of the stem stored in the stem file - + Nombre del stem almacenado en el archivo de stem Text is displayed in the stem color stored in the stem file - + El texto es presentado con el color del stem almacenado en el archivo de stem this stem color is also used for the waveform of this stem - + este color de stem también es usado en la forma de onda de este stem Stem Mute - + Silenciar stem Toggle the stem mute/unmuted - + Alterna el silencio del stem Stem Volume Knob - + Perilla de volumen del stem Adjusts the volume of the stem - + Ajusta el volumen del stem @@ -14349,7 +14428,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Inactive: parameter not linked - + Inactivo: parámetro no enlazado @@ -14565,17 +14644,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Left click to jump around in the track. - + Clic izquierdo para saltar a lo largo de la pista. Right click hotcues to edit their labels and colors. - + Click derecho en los accesos directos para editar sus etiquetas y colores. Right click anywhere else to show the time at that point. - + Clic derecho en cualquier otra parte para mostrar el tiempo en ese punto. @@ -14670,7 +14749,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Maximize Library - + Maximizar Biblioteca @@ -14685,7 +14764,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Changes the number of hotcue buttons displayed in the deck - + Cambia el número de botones de acceso directo mostrados en el deck @@ -14711,12 +14790,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Opens the track properties editor - + Abre el editor de propiedades de pista Opens the track context menu. - + Abre el menú contextual de la pista @@ -14818,12 +14897,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drag this button onto a Play button while previewing to continue playback after release. - + Arrastre este botón a un boton de Play durante la preescucha para continuar la reproducción tras soltarlo. Dragging with Shift key pressed will not start previewing the hotcue. - + Arrastrar mientras presiona la tecla Shift no iniciará la preescucha de la hotcue. @@ -15257,22 +15336,22 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Replace Existing File? - + ¿Reemplazar el archivo existente? "%1" already exists, replace? - + "%1% ya existe, ¿reemplazar? &Replace - + &Reemplazar Apply to all files - + Aplicar a todos los archivos @@ -15371,7 +15450,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. frameSwapped-signal driven phase locked loop - + Bucle con bloqueo de fase manejado por señal con marco cambiado @@ -15397,12 +15476,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. No color - + Sin color Custom color - + Color personalizado @@ -15455,47 +15534,47 @@ Carpeta: %2 WCueMenuPopup - + Cue number - + Número de cue - + Cue position Posición Marca - + Edit cue label Editar etiqueta de marca - + Label... - + Etiqueta... - + Delete this cue Borrar esta marca - + Toggle this cue type between normal cue and saved loop - + Alterna el tipo de esta cue entre cue normal y bucle guardado - + Left-click: Use the old size or the current beatloop size as the loop size - + Clic izquierdo: usar el tamaño anterior o el del bucle actual como el tamaño de bucle - + Right-click: Use the current play position as loop end if it is after the cue - + Clic derecho: usar la posición de reproducción actual como final del bucle si se encuentra después de la cue - + Hotcue #%1 Acceso DIrecto #%1 @@ -15510,7 +15589,7 @@ Carpeta: %2 Rename Preset - + Renombrar preajuste @@ -15620,407 +15699,437 @@ Carpeta: %2 - Create &New Playlist + Search in Current View... + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + Crear &nueva Playlist + + + Create a new playlist Crear una nueva lista de reproducción - + Ctrl+n Ctrl+N - + Create New &Crate Crear un nuevo&cajón - + Create a new crate Crear un nuevo cajón - + Ctrl+Shift+N Ctrl+Mayús+N - - + + &View &Vista - + Auto-hide menu bar - + Auto-ocultar barra de menú - + Auto-hide the main menu bar when it's not used. - + Auto-ocultar la barra de menú principal cuando no es utilizada. - + May not be supported on all skins. Puede no estar disponible para todas las apariencias. - + Show Skin Settings Menu Mostrar menú de ajustes de aspecto - + Show the Skin Settings Menu of the currently selected Skin Mostrar la configuración actual del menu de tema - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar seccion del microfono - + Show the microphone section of the Mixxx interface. Muestra la sección de control de micrófono de la interfaz de Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar la Sección de Control de Vinilo - + Show the vinyl control section of the Mixxx interface. Muestra la sección de control de vinilo de la interfaz de Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar el reproductor de preescucha - + Show the preview deck in the Mixxx interface. Muestra el reproductor de preescucha en la interfaz de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Muestra carátulas - + Show cover art in the Mixxx interface. Muestra las carátulas en la interfaz de Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximizar la biblioteca para tomar todo el espacio disponible en pantalla. - + Space Menubar|View|Maximize Library - + Espacio - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Mostrar Mixxx a pantalla completa - + &Options &Opciones - + &Vinyl Control Control de &vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con codigo de tiempo en bandejas externas para controlar Mixxx - + Enable Vinyl Control &%1 Habilita el Control por Vinilo &%1 - + &Record Mix &Grabar Mezcla - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar transmisión en &vivo - + Stream your mixes to a shoutcast or icecast server Transmite tus mezclas a un servidor shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar Atajos de &Teclado - + Toggles keyboard shortcuts on or off Activa o desactiva los atajos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar la configuración de Mixxx (p.ej.: reproducción, MIDI, controles) - + &Developer &Desarrollador - + &Reload Skin &Recargar apariencia - + Reload the skin Recargar la apariencia - + Ctrl+Shift+R Ctrl+Mayús+R - + Developer &Tools U&tilidades de desarrollador - + Opens the developer tools dialog Abre el cuadro de diálogo de herramientas de desarrollo - + Ctrl+Shift+T Ctrl+Mayús+T - + Stats: &Experiment Bucket Estadísticas: Contadores &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el modo experimental. Recoje estadísticas en los contadores EXPERIMENT. - + Ctrl+Shift+E Ctrl+Mayús+E - + Stats: &Base Bucket Estadísticas: contadores &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el modo base. Recoje estadísticas en los contadores BASE. - + Ctrl+Shift+B Ctrl+Mayús+B - + Deb&ugger Enabled Dep&uración activada - + Enables the debugger during skin parsing Activa el depurador durante el análisis de la máscara - + Ctrl+Shift+D Ctrl+Mayús+D - + &Help Ay&uda - + Show Keywheel menu title - + Mostrar rueda de notas E&xport Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ Export the library to the Engine DJ format - + Exportar biblioteca al formato Engine DJ - + Show keywheel tooltip text - + Mostrar rueda de notas - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Soporte &comunitario - + Get help with Mixxx Obtener ayuda con Mixxx - + &User Manual Manual de &usuario - + Read the Mixxx user manual. Lea el manual de usuario de Mixxx. - + &Keyboard Shortcuts Atajos de &Teclado - + Speed up your workflow with keyboard shortcuts. Trabaja más rápidamente usando los atajos de teclado. - + &Settings directory &Directorio de configuración - + Open the Mixxx user settings directory. Abre el directorio de configuración de usuario de Mixxx. - + &Translate This Application &Traducir esta aplicación - + Help translate this application into your language. Ayude a traducir esta aplicación a su idioma. - + &About &Acerca de - + About the application Acerca de la aplicación @@ -16036,7 +16145,7 @@ Carpeta: %2 Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - + Listo para reproducir, analizando... @@ -16049,31 +16158,19 @@ Carpeta: %2 Finalizing... Text on waveform overview during finalizing of waveform analysis - + Finalizando... WSearchLineEdit - - Clear input - Clear the search bar input field - Borrar el texto - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input Borrar el texto @@ -16084,93 +16181,87 @@ Carpeta: %2 Buscar... - + Clear the search bar input field - + Limpia el campo de entrada de la barra de búsqueda - - Enter a string to search for - Introducir el texto a buscar + + Return + Volver - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library - Para más información vea el Manual de Usuario> Biblioteca Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Atajo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Poner el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retroceso + + Additional Shortcuts When Focused: + - Shortcuts - Atajos + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Activa la búsqueda antes del tiempo de espera de "búsqueda mientras escribe" o salte a la vista de pistas después + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Ctrl+Espacio - + Toggle search history Shows/hides the search history entries - + Alternar historial de búsqueda - + Delete or Backspace Borrar o Retorno - - Delete query from history - Borrar Consulta del Historial - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Salir de la busqueda + + Delete query from history + Borrar Consulta del Historial @@ -16178,7 +16269,7 @@ Carpeta: %2 Search related Tracks - + Buscar pistas relacionadas @@ -16188,7 +16279,7 @@ Carpeta: %2 harmonic with %1 - + armónico con %1 @@ -16198,7 +16289,7 @@ Carpeta: %2 between %1 and %2 - + entre %1 y %2 @@ -16248,7 +16339,7 @@ Carpeta: %2 &Search selected - + &Búsqueda seleccionada @@ -16286,7 +16377,7 @@ Carpeta: %2 Update external collections - + Actualizar colecciones externas @@ -16296,12 +16387,12 @@ Carpeta: %2 Adjust BPM - + Ajustar BPM Select Color - + Seleccionar color @@ -16469,12 +16560,12 @@ Carpeta: %2 Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) Sort hotcues by position - + Ordenar hotcues por posición @@ -16519,7 +16610,7 @@ Carpeta: %2 Shift Beatgrid Half Beat - + Desplazar la cuadrícula de tiempo medio beat @@ -16607,7 +16698,7 @@ Carpeta: %2 Undo BPM/beats change of %n track(s) - + Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s) @@ -16622,7 +16713,7 @@ Carpeta: %2 Setting rating of %n track(s) - + Definiendo evaluación de %n pistaDefiniendo evaluación de %n pistasDefiniendo evaluación de %n pista(s) @@ -16677,12 +16768,12 @@ Carpeta: %2 Sorting hotcues of %n track(s) by position (remove offsets) - + Ordenando hotcues de %n pista por posición (removiendo desfases)Ordenando hotcues de %n pistas por posición (removiendo desfases)Ordenando hotcues de %n pistas(s) por posición (removiendo desfases) Sorting hotcues of %n track(s) by position - + Ordenando hotcues de %n pista por posiciónOrdenando hotcues de %n pistas por posiciónOrdenando hotcues de %n pista(s) por posición @@ -16707,7 +16798,7 @@ Carpeta: %2 Move these files to the trash bin? - + ¿Mover estos archivos a la papelera? @@ -16733,7 +16824,7 @@ Carpeta: %2 Okay - + Okey @@ -16783,7 +16874,7 @@ Carpeta: %2 Remaining Track File(s) - + Renombrando archivo(s) de pista @@ -16794,7 +16885,7 @@ Carpeta: %2 Clear Reset metadata in right click track context menu in library - + Climpiar @@ -16804,37 +16895,37 @@ Carpeta: %2 Clear BPM and Beatgrid - + Limpia las BPM y la cuadrícula de tiempo Undo last BPM/beats change - + Revertir el último cambio de BPM/pulsaciones Move this track file to the trash bin? - + ¿Mover este archivo de pista a la papelera? Permanently delete this track file from disk? - + ¿Eliminar permanentemente este archivo de pista del disco? All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + Todos los platos donde estas pistas hayan sido cargadas se detendrán, y las pistas serán expulsadas. All decks where this track is loaded will be stopped and the track will be ejected. - + Todos los platos donde esta pista haya sido cargada se detendrán, y la pista será expulsada. Removing %n track file(s) from disk... - + Removiendo %n archivo(s) de pista del disco... @@ -16854,12 +16945,12 @@ Carpeta: %2 Don't show again during this session - + No mostrar nuevamente durante esta sesión The following %1 file(s) could not be moved to trash - + El/los siguiente(s) %1 archivo(s) no pudieron ser movidos a la papelera @@ -16882,7 +16973,7 @@ Carpeta: %2 title - + título @@ -16890,73 +16981,73 @@ Carpeta: %2 Load for stem mixing - + Cargar para mezcla de stems Load pre-mixed stereo track - + Cargar pista estéreo premezclada Load the "%1" stem - + Cargar el stem "%1" Load multiple stem into a stereo deck - + Cargar múltiples stems en un plato estéreo Select stems to load - + Seleccionar stems a cargar Release "CTRL" to load the current selection - + Soltar "Ctrl" para cargar la selección actual Use "CTRL" to select multiple stems - + Use "Ctrl" para seleccionar múltiples stems WTrackTableView - + Confirm track hide Confirmar ocultar pista - + Are you sure you want to hide the selected tracks? ¿Estas seguro de que quieres ocultar las pistas seleccionadas? - + Are you sure you want to remove the selected tracks from AutoDJ queue? ¿Esta seguro de que quiere eliminar las pistas seleccionadas de la cola del AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Estás seguro que quieres eliminar las pistas seleccionada de este cajón? - + Are you sure you want to remove the selected tracks from this playlist? ¿Esta seguro de que desea eliminar las pistas seleccionadas de la lista de reproducción? - + Don't ask again during this session No volver a preguntar durante esta sesión - + Confirm track removal Confirmar eliminación del track @@ -16971,58 +17062,58 @@ Carpeta: %2 Shuffle Tracks - + Mezclar pistas mixxx::CoreServices - + fonts tipos de letra - + database base de datos - + effects efectos - + audio interface interface de sonido - + decks - + decks - + library Biblioteca - + Choose music library directory Elija el directorio de la biblioteca de la música - + controllers Controladores - + Cannot open database No se puede abrir la base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17036,70 +17127,80 @@ Pulse Aceptar para salir. mixxx::DlgLibraryExport - + Entire music library + Biblioteca de música completa + + + + Crates - - Selected crates - Cajas seleccionadas + + Playlists + - + + Selected crates/playlists + + + + Browse Ver - + Export directory - + Exportar directorio - + Database version - + Versión de base de datos - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ - + Export Library To - + Exportar biblioteca a - + No Export Directory Chosen - + No se seleccionó un directorio de exportación - + No export directory was chosen. Please choose a directory in order to export the music library. - + No se escogió un directorio de exportación. Por favor escoja un directorio para poder exportar la biblioteca de música. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + Una base de datos ya existe en el directorio seleccionado. Las pistas exportadas serán añadidas a esta base de datos. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - + Una base de datos ya existe en el directorio seleccionado, pero ocurrió un problema al cargarla. No se garantiza una exportación exitosa en esta situación. @@ -17118,34 +17219,35 @@ Pulse Aceptar para salir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message - + Fallo al exportar %1 - %2: +%3 mixxx::LibraryExporter - + Export Completed - + Exportación completada - - Exported %1 track(s) and %2 crate(s). - Exportados %1 pista(s) y %2 caja(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed - + Exportación fallida - + Exporting to Engine DJ... - + Exportando a Engine DJ... @@ -17153,7 +17255,7 @@ Pulse Aceptar para salir. Abort - + Abortar diff --git a/res/translations/mixxx_es_AR.qm b/res/translations/mixxx_es_AR.qm index f7f53e416ca1f00c038e10f2c63e18d8abbae48c..8580654440d4fdcfc04d52db2fdd155a73514f26 100644 GIT binary patch delta 54900 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

q8J*cRbk9 zX}HwA4tQ`0T$)se^m_^}rIT=Z9K_}66aj5cL|oUkGe4@pQT?FeC`611V0Rj4Jgu z$x8nUcv+u;-799ttHH70Q6unbGNnvea^h`gvXAet;O*25$n`0Bdnz}0x$=0IdB&a{ z@F{XJ*~| z+dJUTxpXK;3*m1oTCkV>95O!p0hfQ{-(kvvC)8JPkrI*D0~EzC1Kf9#qCBR6a+bHk z##7?3Ey%%r-xX0d8*sR+qTK~08wC`7WC@CZyD7#xC&-@r6x(4AeCcOVJbSBTdy)+z zWwMgj^E}k%-IaVK7pi?k6Qw}@b&wY_l!BGWMn`m33e8Ig7gdy^-oD_)8!1IslX`Y9 zqB!;NfSO~yQes;5t1D$r(C5nSP+W>cLlpK=%75V$A^mW$ zFIOs@y$89gq*A&2SzvlLrShb+l>bd5P156`E*Y*=eLWts{aK~@TT-jkT}rKcfl#{6 zQEFEk5B%w6QGHuTsqJ-z0*)z4gG$k0>HU-jyDCGD7^pNjS`O-w^-6F29%)BcZ>5D(DLYvFDy3yZI`jYjC@r5v0uKi$EuUrb zzS3a~nbh}ll`at!+5R1=borG6d2X}PWA7AbinrqBQJK74aizD{eaPEi6z@DFO9RI! zeM8+K?&neZ^^b@ASYPS4*NKicRq=V;i=ygTO8?3s5PSA1{X^_mpiJ{ue9uu{#y%(m zSCd;Uw_F+0>IM)rkfo1}#1 zO@s7Xp@i=K0^aP9vTdmol;;PPeeNk>J>!&po^&A}$0+-T429C5rLxbD;(+=t%D&|{ zpqAZgSHiovLX#tuLz5}QdOJvoOq&K#sFM;k`3mJszm&tJNNr|&Dn~2mP`q9f{mISt zRgRKi=n(NuiV%{rq$zwawFy@l#TP1 zn>DGzb?&1@aWY1^S>F}v#q-L|^h)3t-IQBuX~@N^lw0FJP}-fQ+}4^wjvK2aDAmBC z2P+BvNhtFlRT6x|!CK5y5`K7-|DX3(Nh%)&7E?n>I^+-Wc%^c0=U<3gEtUI2mqYCp zrrf8L3nQYG2b=Oj9i6Bo!wI~QkCI%D4A9P@%AC~0|UXKhuLS4nxHbf~Yq9#2{|qLxLwGVzk~v5F^9sjc#H{U*p>50uYow3Q{d zC_e_0ngotle(oau9hzJDT_u6ssIT(pNPbAq09Cn1No)BBsv1IPop+h4KDz~+udQlc zl(zqDs%q=EP(|gkY73|GUYiYS)?TjQ-~H5V=TA^+Ctl5dn&N+@R&O;&_bE`1S5|XQ z{sMJ=S2gcuav~opsRiE0L&Sen3oT9uldIKYdui*c?Ny8CN}z<~rCMS?C9m_OS}J-V zU|v^Coukld>J-(vXA|Jyb+ya^TEL4SwajsPerUZ~p?zm4TOL_dSI<=|+^}bXY#Xmu z%#sM^Hb-^+l?J8pcZ;%R5w-G#`%pXnQmdRKQyRQftyZlA_!m{J{;~$JzKU8ihAw!~ z6}8r&JP>(mt96=?{WvjIbqglFuRL9KqijdHnL};jL0g{UrZ#&#n@s&owfPx3`-0om z7WSOmpuTvdwyZ*K*rSfx@H@K7%RX(d(9VGQd1t!j@o@n8ep)E?`} z;6>k1?R`7a2l8fD`)(uQ`0@`O_5K#JL-Uc(Gb;3sROUkQ9N&`4)KbH z(l1dR@`<9_^ndEm#X(?QJk?=o-yxDu5;LgGa$g;upM-NeQ<5!0vjh zQ+H4lU1p3r<46)Mw3J=7SI zOg}a7#z-jr6Vy2wbk-xEtMh7lLu`yy=k*Gqe4w<0wK`jr$qm&7@0@^o8`a?QRLBS_ zr!LJ#Y5oQu2lv>2sVk0k0-GIWQBHcRuB)m*89q{7*YY!zP6gG?vvNae+DYBAe-Gr6 z$Lf}h+)(FbRkyF%Ll!Va4I55rb!07dM_#I+&2v?EI+H0bdPCj0DweY7BI>S5b-_mL zchG;7gTdDwv~T;T?pj?Fs#;FnwWS>7-FfPs%VD@IVE_G6 z5Av13*23zchxe(x=3`MA^;M1hKmogi&1#@a76y22cYy4%#~qy#AG zZPYVIdr~3cl|{KmRb&2a0vh&G&sHNf8-7$h8}$=Po6hP*=dD1`MD=0}Eo9s$_2L~8 zx;6FH%VBO%4xLcresuwkc&S%nCQ$x=dZc>I=`&TXuBq4D7l5rU?clD1>a}l&AR3NR zuP<NiHKi2P-dWUJ$>er_RaFxL+<->e)r5yrAYTtq@3%0>FqKp952D(iy|Vfs z(--U>sXpkj31akDHN~?T*q$+J%79!@3J*}9M%h!rU1qDP^+@d&=1|irF(}2at7$E% zbdqhgns%BhobxuTXvQuQLK0Uulm6_42(Lbeyr^T z@w>SCqg6D-mG$b6PqcvR-PE7W$)c9}s{Wi8M;3CjMK&f`{b`@~n!H~*_2&XQ`@jb3 z&kL0MO;1vPK6eI>Evo*Sk^z}3ME$ij4H({4{k5wg*o|9iMtFCyiRBpD2SUqjV@mJy zV7;d^HlHq_Kpf-N0&X*La{|<-dzrS$590GZrrmr7+2SfQr&{IuNAAJkQe)q%BmG2>7Tim)z}pd zxz>}_twJ^a>AtLPHHsl`jbn8OPNAbK!|MHgK)&Q8Yd9<$`zVEA zms_#E?Q%gRIy2v$Bom|RumLNna*~vf4JsW@z9NDR8cmI*>r2?+jw+ie_F zv&pjU?#(6#mZF|P0-JtnHq_`)HlrU!MrU5J84C-7zhB1e>obGWO3WS;4cRY+*6`vz zbB|J7-+d;xV6x$O7Lxc7toA9kV#78ljmBA&Erzj`r}|PT z7r|ElBsU(_g{`eJ8+du2t&P|Owel*qu91Br@FJeAdomepQUu%7fI3s#>@2hm>Hm}- zEUdR5lvk(Oj{NaZzBXVxB40zPx}WVTI3L(jgzY-l4+zc0_KN|Kn~Jgnl7#M0J{ECo zE0uElv8ck?pl-^}4kuCOQ@kHLvUoV;k5cT|3s*3bwUc&AIQaGz?9Ac*;75M43yq#Y zl)T0+ZW#yGYZ|*`T&D{vVv((WWKqU0VV8YKh$*vI? zWb6BKvy^$^5F?MXC+WVBXXmk}#RDLwc4be4qQOe9WzSLt#e|>j?D@{-kRIdMt4V&4 zW$f&AF#)E{VXr^9LFPNc-t-9v>okLrq4462MG2#iDYB% z4)(P}F|g@9*w;gJ#w66=Ms@`cnZ#_BeB` zO(b~r(cJ22BR~;edxR5Z&5Y-MO+oDbE&I^nl0QKEtUMTbegxfz}xM~;5|2y5` zg%?pUxjGAX+CXmicoHvGmDI0G3@`SGEL@RfUV@TFX?NnKyt)EQmhn>SW1-|<%1gIu z3OT75FGGc9)z5{OnNB;o$D5bAm;v!e@N)gg@^zlU%MWcsJ>!nNd;nEQ)WW=C`=1m) z^yU@+%R&0THJVp`MtWW99IrNf6IjPjyt<&^vq^4V`;ilMsw(ojb!n>)&f#@Es8;-7 z39om;4mtb{uRkRn?9hGQuxmWTfc?BlIxV1YN8U2(FZeij-mVxKs#)M3+1o)@dCNP_ zp|;zj!&K>~ql|pYJ?FdGA^JYy-E#Spbf)rdzA0d?i+GRaxq*rAc+UZ}@_*BLuW4l2 zTD9hVKKYY$59Z$QDbTp(!v{4BfpCAx2lz(Kn9dkpZSPMOMuiN z+^^Do$k=y$wCM_kAK+uq7)sp~qP;Ps+h{&k{|&WA1wK9tnaX*|eEdN&$-nmT@t>ap zV~6tbUlihFK9PI^i}m0WZ})^czAK*;L7%(Pf=?cM8MJIZHNqQ8_iYaL?8B$$zePS` zD)*0|IHN==w-=d5xnDURPT7`3eeB z)uw~FePuIhHfE~h=)!lJ)irWhsIDvbiz!&eF~*o?Y8l-`77yYM)Rh-SlkoPQ#P@uqp_Dy?_}-9Y@V?Q+r;rQn zhv@-@LDOS7_Ld*df@|Q^7ub&su ziRu7Vh{fpnJYorY?n^99&yNr(wCk5fq%hp>lZ)@&SQV_2qa& z@XL9-P~H&9= znto`*Z!aGU{;wZT?Ck-z$)6|o@dhrv;Yl+oiFBUmU|>(4w1^rNd+J$K*Z<;4%L7SP zj_`XlF~uiuCQ>XpIgvk{@f>PDH~uKn1ENw-{`9du4H#XJr)GAwrkCZZJ*I0l){0I4e(d-HT?KuqM{W_k}Z4SkVS$W1mvhg!U z31rDlP3km(PN`7k3Bj$MP7q>u3e@E(!Y;1Sm7j?cndI|E3h`Lb7B{dcE=CAhiQH(5 zWMPPG;C0IiTgi$Ld+!TdI})-X>qJ)2R@#?|oN09ScXx_hQ@%jCH_jsa>?QKArg*~X zghg4i{p^@1_|d@Gk`v8EwYfp z7G+d1;ryGbT?yMn8UF#`YkrBcu4Fk&7Z(+8w5EQ+8d1ePfPzdeszqD@d$Cwl-=2r^ zhCor%={3y&xrv%k1 zaDPHS;Br;8>qPa1X0t_y=?Ykrm!k7ja?|3CMZ5UfL3qZ~Rs_X}Zp&$GcjWTg<#eCh}qZtAP1EZf%e*9)pv`aLKHb= zgo>c$r2kve#60&tP}a2*^CDW&@1$6ice;s%Ybe)z<0*peG+3Z^j1|FE+^H|uRs`4T z2k~D;5!`q#Fs7^sZg~MHxXPk3ZjME@LLCS1%(EyHpNrtkNvVQ2Eh^)VSyY3&h~VL5 z3D@~s6#tDB!KXqX_YD@o*C@eZ9fdvf0pBY{@N>HIy=%qdgH#Pm|00&_q}N#*iRJAx z!1v`A%eQ}}8KJgf#Wc#>8x&y4fnr|yeA3n`!|H&*Pqd0Au#oiSp{quzg&-5A54@7wLD2nG>i>Ni1pe{Qs4yTYeY*gE#Y*AYrDftg- zkvHPV!=cnO_7_LK(BHe95XYvL0<(V(w;u3s1H`fA@nl$@is-0TG?eyQoN-BqVs9v7 zYWYK)2^KNkN&_4ASQG&Z#o6>uz}e*@md5jxy9LDsnvPM%@3Y8@PIB-mtQ2>WmP7eCTqM=;0J3zkD5E}5Bb_QB9UqJPCH6qQwL#q9 zM+T^JA&acS0dfD90r=+=4-!g}{!iZ`lAE|ex(^bM`cn`(r-gVDa0mRiuXr*)H#MJ_ zcyeSYFlf1WHpl}?jSUuMof0Bdqj0^|SCJM;&PUHDp64dnSyf-WEXaX8iQ=X63Lx(x zi|pxj@p7#bM4z_em5uU+wo}EMrS{j5^XrRujp+-vW)bh}AE2SJ#vQ}OfRBwtMy9lXd}mQSn>;(6^C^8UAdRHwkOPBd)}o|Vg>uNO zJ7xm^O3578+`y|AmAMMdp;*sF=FV+E+2NqNE=cBS{uJu=l`>ENBoe+yGVfYyUQHuD z2nWCIBJ)ujpX;+^p}&mk3O8i2?WC?Jk4SroAbP|2F|t$|ZOyO}vb5!P6D+cjP8MZU z7g>546%0fNS$Y$#@X~sV;*ylkg(4||$ts<B@4+DkV&?m5pRouMqIoPh@o@Ld`Nr)()%-S#_+e zQ}+nZrQICdu~)XJPBLNN zEL*Nv25z2|tw#0-oH{vJ&0foTz?QCbaK{IWGCV`Jil;YL%rD!PIR|tKL#Ec00u4^GSW4|;;t4UisA+o?6vPIj%70wr%P=~>Ga@Yo@{7p1&n z&tBR6ze!Lk&Xry-vQgx;y_D>wU49s?EP{n6`!J{_f%5Lc|p?q5Dg*6 zR+oJbkdSUT;Naf&(q~Ny*f>@8ue6z}UtY3*)#hMlSIPb~8I3CiWPiUD@IMcwFO6Tw z6`SOMVdTbd6_Nw17lbHAe(OMW*!lYwatMt>i=(;Z&_&)<-+Ls7Wv;YSK{@P*MyAp( zhtKH(Nk=lG>RPCq56Tf|>4##z$&ojXQxp1}9CI&%vgn&~d^->DVM%ggyC%So=W>$e z1wG`XFY~Eu)=f@XNCV4zAIoWyGN+z70we8nA4Id4cje-u-0VymOFKz}l;gv=H!bL7A zK?bO-CYSFat*BX0t_Vtj`2It#%#sdSrIK9PijFKGRj$cJXFI36T=SkLVv!=(np4P& zew3Rsr(n7T$;~wafva`p=3dLd4hp%o`x_{u3Rz^IcF3*v!`@JwTgaUqS5fHoUhXQC z0a^Qq+*O*`f27=%NQBtZ^lly6h zWZ+*J;p+rV?^I{P;I4UOb$}F{Vp;l=V9Rcd3ipIfQVlp&u?^tqOXt_F2vI?`ZRel zt3MRij`HFHDnPp0<>fK7Gq2akD?@1^KmN$8%hPGZqrSY>)QwE=GkGm(8;xv4*=2lY zZnw&i@gJRmDRbn_IwaLc=F6K~Xf#Vak+<8GfM5;f?YZd?HJZvh?W+UF_sFDM6u2ym zk#~PJhtm3~d@!gj*tsRO7BUiFiy>xeIU%I9aM zg1xsFmoE~Wyx3HiM({o#$P{Q1%YvU^tfJ8Ksp{GI$goeB`4z2$Fz;wC@& zHzFLe@DTZrMlRsKKx22ekXD@1#DoE0Gmd|n+IuGn)p*V z-%86unG+K&w5)afY5x1xO)Z<-Z74AjTDGWcP`+)}a(s9Ub)1iuOZ5i(+e|AsoX&LA ze67ezFCh0gi}L>i}*a#l%Nkwi)|C;!ljy8VJ0e^YZB5DhKM1+92SG>|i|MP=wP zi~QRft>o;PRGKZVm44$*{=ZvR&C2!qR<_7OPFs{wC$(}po>NbEx>oMNSt#F=4$(Sz#ZdQql10(*p4L(7knh8^ z&P8cwa^KWCXU-jelv-E&@F`%eT4-JGc!OvAu6bU%0NjWs(#qqfYTfgZ(};Pm_1G2< znr~+9*w0lPkV*l~$*{U+$v~dKw2=sF*f}`gp>poHpe$*#npC z+O*j%XgvS8Htj1(?;@KvV+g%3af~+OWDVfiCe1%P?L^Vy+RP%9#?Kk2&D_brHzsMb zTyH~^da2F&>I`g|s|8&%px!O1&C5}ejyz3USfm)#g0Jk_!m%|d{2r? z;_tB(InB|Qo&5=Zx45<0h_=Pm2Q0Utg&v^`^I5Hho(%^|-_*8NdO)GoA#FQJ zJDZ$a3%d~w@p`JZV|y&vu~*v81L+U}ceGtGWDnXb&~{HwfhzK7`+D1<@~&Dqs8nO; z$F&3bXaK3hMeV>eDmo9zuSHN$%4&|%B56>Nmp-LsCKN2`qju!fH(_JZ_qBOtHFP)(Jrmr1fG41c6qHI#3#EJw}33*>($zoWXg)W7SygC-9shXt=bLW z>QMe>({9o&dCIw}+HIBYY$>u$OPCx2akih9`1>Asm4@2gO#i?6n0Bvy3VF{$+C#UI z6m>k*QmPiFNvdgDs*4A0MSZTlnzxMVfI-@;h1DS1#%QnZ<$}0cOMCV35HVVN!=nJR zi$!JVY3=P|ihkRc*V5~x0bjpqpO;W`>1`wJTa6;rFA&;)FDP=drD)%mI6=)nNBi-Y z@`k(a+OJ$uP`5PGeudAa{y`osxns&JYwo}}linhquEo}QnQTRCxzUcjD2<+0?3dg0>z!183*i+=Kkh;gu+aY#W*UMBS6MgudUZxTWRjEIEnfdb}A9vNuyd`hgvA^!( zM%s|$lwNj1At;mk>J{&jTi%&VuT+P2vebCJ(sNI+_4D+~n+rqnsIJ?q?4^4}A*WF{O|SOM6G*6|*NiPi>3CVambsk<2Dj;Tnq)w{s;k#sMCw{DyIyxS zm0WhN)a$uX)2dLCUSI76wRc~=zAJ^>E1h*WmY4d81N9~@bcEA9EeiMTdduW&5cM>> z-in486fK|Lx(OK?z@jqayG40wuHM?4?&E7VMQ=UjFyx)(dYhchDc#{M$c(RZQ>-2V&U($eLA>AXHQn-(+^^QJt!Ku&njt9fRpM~k2cKDK(`0AY! zHbJ`B$LL<|^FVRmqxZTM4mRzE-n-TW8Z?}zd;jMN@33>!X!Oy2%Tvzh?5huW zKNEb$1btxFk5u_6pbyU6se707q4lYrKdq=fvM;&iYg`|>mt?}TukKgrHB~@z>!TYo zpu$0YETbb{(NrIIhP2CG_N6{vBR5;QnLZ(w)bHY4eUfqqYQ2m4lu#;@O%K+mpCgMl zB9}frjohtA4t<6ft$eAkKJyQ$mzhVO6+nimd|N$WBz^8tDLo+b7L4|)Md6lD4+y^v zKDC}cdqY#8SFk=uQU$bQBYn=MZ`A+eGxRyf>rrB%=|P{)Qu)l#=N%;dpX;G7FiDv9 z-O(4^ct9cAD+hOt))&%*gBmhf51~edTEwm|o<&)5f#v$r$&9+)qx5Cb=@fP!*Oxt@ z81by4FZ)r7COPBul}Z!vhnw`39q1?*%+yzoVKo0+FPpwvt^ki1t*;LCg=)^#*G|s^ zR{W5@ZUGsZn|t;3wJ9_D?WeDAMDcr(y!!eWAL@kG($`xTa!cRT@IGyAAAQqp(w06S z^w9UN)bY%tZ>>=R?464qc0L{|6Z(!(bYV)8zT+;L;?rIA9bfFE9?d7|J3}ab7bW#w zG~v!(6w!BQG^T{1ioPc`4N68&ecwc??R<#W_ctyNWkyzg{|WMbH7e=hm&n__eW^zn zCPg$O^oWS}RN4HcAF|Osg4s;{@I^nce5Lin)O;5HLHe;O^!-`d>&LHTF0hk+-2SXH z_yQOG_}i^CFc7Psa3N_eXX+>Zu7y0%N{`Ne4l=)8Ka;B>wPxq)=Z;+f-}O{Ke{T+y z4IlK2bX$!~WBMg$XUJiB^thV|;0asxD~H3Oq`cCv{8tES$>$EvdZ=H`LsPYgcF=FQ zZqIx{nX6bYuu(hot2M|V{r;(69ppw0#P|BuJALTP5-iI9!t`syXa(vO{aPG#vAv>?pbp3XfU=rRQc0D1< zAEHIDes{|hD8(!3$-6VaZI$(ufkT;{@+i3$c?r1-#u4A%$TPCwq&N5 z{%3qPs6Fi4^gsLP3)e2t|3py`8TCQ`8yOFlvzDROiiYqGFjyaogbL{nriU49yb~Qk zsKGNYynYLVzwHJ2=7J%T$th)PZD?fBcv7UHQT(8EEM?f{JqL<*cChLpi^`XyMwVXW zd+e)E8974&q4ue6%=9Zpu4WYT*)xnhg-<}OxX;Mnlw!mS-;Bb?=;)SzH;P1L z1H2{}MMwI9*A6wD1|EP~qMlLwtsi9ePDZJ`bb(q)qtvIrz@l*$*{U#$@_Y@WG~K+Y zx<55aFB?euKRVcO`MDPCeix%`bLVn(?(rJ&aGw#Y^Y7!@zjeLDwg8&$^94X4H} zqgpaazps-~+b1s>l9@&wCu-k~2sY{zGr&I=G3t)lM%Awbqi$3n%?UI!+*&uHcHMcy zZG#iUvMEL*B?F? z{M6Ry=t=JVPFJH-O*e>{!;DU+?DXLD2BZ6h6o{$~jh?pUP#0b@dd82VCQ?1aD+@(N zM~)a?UE?904jSI`@6eeEqhIm5)U?iJ_*}|>Qucw-|5QIHdJDt%Ep^S8w6rL0cQ6L` zqVKJ_&lv2hK-tva7(DSOWI{b-NU9r|@S?^LJ3U}7_pKM$<*&xDb{tCQrWR$loyM?P z-7uSb3`X49>DtWuy6ICdGN zeB$71itmRv9UYF z1);9SmN7I7@-N8Pa(WZg)%T4pKd6wAYM*O_`jdNI|I?xfXl;bj?U#JRbz^G>3ah_% zFt*imqLk{B5$56pb@6HA&?h%2E5{m9`JMp};*7&fe?xArXB>G?>KZ@FIQqzsx?)+3 z69ZDI=3C4-F^DYc=erhJ`$XexsdT7k&l>021X27S*2OqKU@ZlWO^w(q2Z2vLjM$eU zG`Ca0xLA%1iZb1}*npbSZ*LkG+fWKMs*!QAE!A*xUokGP^QK$vdmC3~kh^|$*0_=o z2kE97*OJ|+yj=dW zzsnlGLnuv;*=YPe8bO_rqQ>v*6w0mdYW(d@N7m2P_)DTA8!a|6MooZPy0P)^zP%OH z;t!2~&jpm&3MT52cRDIfM3M{)x@0O@DB$p#YN{t|LUD;O)l>Am$0(B@I8XJy1t$MK z4Xnx~Q}?Arq+*CgHGHgTrniII$e`BUF;lj(XagK9*VP1oxllwP+pE4QW$Yo6V#98PLEb*EWn z#8AjOr_CC11E7?cY1(V{SO(mFY-Up2YG~HdX_(CTZPw~flS^gSn{H{}z~@#r8($?Y z=^trPl*(l`T|p(<-51T~#so6GCCyfACW))%5M|0k*N8gL@yD0~+L^5=}M-tNv$E=~2bO zp6@KmGY^Q=w%=`EYz{nL1WJ#Y4tg~-hm@pLYMY-qWYP#q#de!R&iFtcTxkw@L(da$ zn?rtl2OHPUB7a@R9QyDRluwh)5w{rBh84_F<lV5p)>zcXtz8^Izf17JF=0iUJZLTXx71dk0 z%uPw8WmToQ=|5tXFmv-pgQPQQhq9yO2EY62}=ih2C@S*nINw#fVY zT9jwInkU#hi104viL&=0@7yp?ww^+kXsvnDp7|i_ZO04!_FI%kdYjQ+q&B&io6*L%eEOjhr4-uDvee) zcxWa#$3vRO%!CE>+)XnRKhn`W@-{g?SO%pY3Tf#$EGbR>r(%s&&T z$(+#A{5!}G>{})C-_Uf(yl>2Z=gGu6Rk4Ytp)}(4#3n~ZQ`!BTP2cTAW4*O)#*~3j zR@pV1@s(B?t$3j^%!IrOQBgml}Yz1<5AuXz7D|9ylB5QwJQ7XIPd23s-faY{Wrmgs#Wh7$_ zZN;Oggj*@YRwDEY`G1$6Hs^!UP_nkOl}RO2{OYN#+}?t;Wmjz#y~*2ET5PK{g7kRy zMO&rWAz;cYo9hBMsQ>EOT#wNmjXB@hswd}y_%O;=ho1!hc-huKOQte@E1O&Q5XfR* zZH;_LW=buxH5x=L`ODV$nH%JYBwN!YU)Ys9(bfa@*|4<;4S{BMu(kZ^Pw{zWTk9Ya zzNwdOtry$@FEPQ^CORDK)CybMffWC*iMF}-qLuz@Xlq|60rFOm&BORgLKtD|FqtMI z8@66tN&`p~`l zO37ljeg&!0vBBHce>d$wkD4~$wdBpTaGUSB>QLS{w+&d8hYFL0ZG&A%NTsw5K1hki zi*vT&HzL9PZMKocGr$M8w~a2i0_wF~QajVQzlUv76Fa%n zUZrib8~lQJcgGf(Eep+Xm9Wj(?+P*HKiixmb0~>MDgS8%6WLy6^ zxbKv0UWICqW0u(#R(k@`Xqzp#B^6kbI@y9ZIzj#7Y+KZhEa8xxw#7wNF!vd@CHApY z`A7<|Ep0=F; z$_E!BMY|sc+t$^fD%ji8w)H#c=z1QpZD=0|gw(Xihn}!)_MysWz1FtSf<38fE^MK{ zqanTa+U(mhU--P;wk_6M-LzLCtU1^KX{Jck!?MzY1s>{!}ovBd{V%k{SnZ#yL#~!qu zjrX8FVSU@V@%N$jwR_nvHXcrSdz$UyLY-yW!(UJ)hsU+oeB%J*#g^YL`ll$xgN;s(y*1<7^LBl!i?A zu{~Hv7P8iUTXMOoWbh8zl9w$7&0j{@lJ|Xr5Y=su&2&iQvOT7TqA(iUo?lFWGO3L1 z?c)F_MNHefo@C3bO|pIXI03xrHQUDsDqQYuYy0%8I{1xb+vhkp>S)H>zU33t8){(t z=}A%Wv8T45`{;;|`PhDSPN5dgpDgMYsCf$snN6Ox6IP_YZ+E%N6JvxtBG zRCG$nB6D|v;)yI~5Y_kYzszFGO3o&@PnN8UNsj}EWyxXxzqR*(kE-b2$M3zn_d=3e z(tB9~fdoPz(h;elN+1x5ATO{`h;^-i^|fHZUQj@> zH?Y0xtMGr$%$5YuSO34Se#p(k>FVK@_u9T!%hxF8kCQ7!#OZ2phaB@oQCwh9mPqIC{Sx>)h2lD>~PwQDPVR@XL ztY_mv<@5!5UVk@gw_evB)=JW=cjyDZ+k;f>IDHU(eq|EB zs=LSOgWrOmaPr6cus%~Hb<0osh@3ZojxEtgBQlap>-be0xKbZ;Bt=pW{-~FYc^!JC zTpybP#g#NmAKMzhvN-aLJ}$dRvJHPjAAkC3kjgFk_$z;uq{4goRq5WFUu``~#kDd` zpEMUvYGANF>AEsWTQfkP{L~)ceuiG20^Qzkh(4v~lal@1srvL;Ah_smewAm}iR)RH z@~iEc2lQ5Y!2Z@}`t);w|Now;SKhq?WjL3L>#e2wjB{Y$|COoF%0l`5p?&)7#(O1Y z+-v&Wxe%u2>H6GVn*gTrJ5{AJLu3QzgY3uUB0)U(#wa^r|0mtsbenaxr%goTa-e zc1Y?PRj)f2Q0iB2>h-oSvA%oj_4@%%+uHO+s}Te4yGQq)4Xdb3)t7WZU=pa-1F4U} zRokdH7nT4EeoxgmHYees*(z$-e6W{hSvu zw?kLx7jFF))~--o``xTxq`^3S@{4})d-LJa_2pNsHS0Zn&FpP(m&fXBFPJZ>Z*SMH zw*Ek2aWDPqU&>KBu}NQdGhUeX8oz3@M(XQj5PIn)`uY!ml8x=IU+0@3+5Y{Re%%fz znl10?*Vios(($8y!%ml^?(L^<_|zpSd2W5X;x%pLl(bRA6GF(z?QuRB3g*W?n!0SP^8kp5OF;{A0m=x?3+qNGfA>u;ZR zJ)Bvm{`NiJ!z>@t-^qbuD*BK9ZlD!-+$V$d51zDv@*8nQ!_zO(Kl~7^N=(!D9sLQA z%uV|KebC*(5A~0cP|&_U6W0<+vd8KN=Ruf8tNJIGO_A)$PwHQ!o03xYl>TM;kCG~F z(!aj0NRkH)(+_LFZnrGwSM`Dy^usrO3zzME{rlFpVW%$|qW{(x6xYob*XHH=k$vwX zI!)A%Ui_S-eRZ9F^g&cUU3jLUtVQfM^&UgHW0qvUw9K%3Oi4bv-=LFn6`!wws3-Ir9Lq zj5})NZ0jv)<;#q`Gp0!D+Sd%n4shoB_lz!Di=^$n#K<2AM`iB~MnM|9;*bAh^q7og z+~t#2qp%#Btocr(aQzRGeZyv>=e+w6sT?&*?*3R(9(vp;ePx;?l}#}Eb($h+wiU*} zOOlabV8)=U5D(mWiZN(g1~~JoF$Ac$y8cpQ*x+hZzwIrc3D#`SkxTfe|BM{k1I6R+J}s>x2=@4fsY#F&KoY- zW}3#hpO|FxWg6qJJSb`3%`hecCzKMr{Ay2|%CFk47Gt8b7S8BqWAYdfe)4TbxxQYK z8y6VmS3Znlw>YDGe;(q0#W1Gy@<`gv<;Ii?FrwT1M#Y+QkfA(kOv^>4GbP)oyc&vR z!zsp$i%KNfmt)KTwxi~qX3VNU!zE`LbK;Rm$iCN@b7V98g-?yS|EWYSXpJ#%oGED+ zHX8E}eJI&_A2zDy*H~QivLr8>Yj~PJla&A7Yk01P^bZ(f_%8TR zQr~~vSk8_}(oegL%=U)8TKHqM`!0J~pnoFBXa9#3cEqKY)QVrLkadR~)k%{`4vADaWv zX@s$M%q~g&KHs=ZzZLn+7mUkJ2k>yCH1$# z#xMCGHrx;sbyI4|3ZZ)>8>Ln?U zU1!{L#ZgJg8fVy}w);;)T_ZH*f8=>i9W*Ltx-XN(DXB&@A0zoTx7&}Hk z16EcUJMX`^^+Sy3 z6LG5Q>V3wG`yf**HyW?ZeiK%3vhnH~$jZ8r#%qb2CGF~IM(f*U5Weim#yige&6XD# z@2>w=QZN6(z`>c46tmd)@TqN*t>;W*pZTGrty^v!a3Gg^W2JH6`gftYE;A0?QY1-R z?Z(H?BQCh--^RhG=1a;2U5rm%0iuXPqN=R+W7C{b0qn_`;DV9i1juu;8$f`o+)*kkK)u6Q>7hF zMuVxvZ2^XJz)XGRWyu!b(@gytMyMde%;fcbGkv=19_}bIrnd9Lbk;rxuzMZoXfVmM$<) zJ(z&B+a`1Jis6zLbCx-EB;p0-dUNW-z=Zr4nw78rAZZz|nw4Lz#`>>4*__#Zo20yV zhdF!g6sePxVxG2cy`(Bz%+nr&J3Y0RIp<|eQRz{0&U-+wvo@Ni=fN|woo$|e*N>9a zZ@)Qj12QF#KWEN+2a0CWndXAiF_3G=nF~Ljh=QZ_W_80GlEn6!brx)key>@#BuTPm zpJz6Fbsq5l4;xI+C3%uE-*0+vh61@h!ECMtH2TKtW(%BCIj+$>j`uHL14Rq%gq~bF1R}KG;_n7YbDj6W#06FQ&P17=FQ{X zlC4{bx%nnQwA+i#&A-f$)PWC}wn*vGTJp8Iy|rzVq;|T%yl3G3lAOH4 z48G%$l;14#Vf9DM`8Vbx#RIS`W%JSgD$a)79qd`p1Ch-#6bX!LmH(S@Z1$ zUr5^ibIkYd17}K~GvB9;Mj!1k_a>p%d)Z6o-e)oLi+7nH_FE-Mom<4!+Q_fkqnpkB zXO~E-BdOKg|4xad{Ngr0`eKTtzILJc@#~L3w_j?0`~?yWYfST#8w!9{Ut@mq(EBJb zzRvs{5su`ZYlEta5}fHe&-`(Ifh5h}X#Vt!N3!jG z!2ERy9F^Gj%-{CzK%jG*`QIZiOKMK*Mdlxy55Vjm=2zwOyZBYTxXC>7sDh%jO!H_K zu9Ie)M=zc)sq;pfM}Y&#oxe4YK8rB>A>EROj*)E61(vdX4mK?3TDGc_usl0k>Y%42 z>7_WU(NdbD=ro>+lsAL95Nd6 zle;bblqr%n?|#d83?sg^lV$vHSdxCb*)n&hNZOs1mPPkBZ|7I_0>2gCxJ|OnlC6Z| z4G3N*TM6?J_t&La$rmd~;k;?3m6ZS=%(F7Gp}No8Xk~qI1ogl5=U82qL3+CsTZL&@ zUf(BJg)dBz>}k(gMT38k(YPZ(JTA0~mtlQ>x!)@JVXdT%jIsJ`L40t>#a7>< zAwWK^wfZ(eHsm+0zE1(3@8!2ndI(cG>I1946NpH`P;0Mi2>))H}j_hW0=lUSaa4c3S@ zC?e@(YxJu7Q8D?AHMTpRFB-$I+Go?O@!J=n%5{`=>H!$3r_ZovzlP(!`u${`hWwwj zP_Y*LyLGLk{>R_mtvIXodVX~FAtHFUv+Eyo5Lmb z_N~^v2r!iFBl;>JI-vusTKEZl=b*`kH`hxZJIus~9b&vIod!K|7cs8Y*0YNsWK|W`^I2;FV#V>Rw(7>v^$&4fUB|DTQqHrUpK^|*yz-^BJMm@7KE8E@ zwR=vkqtEz1st*lAUCI@c9Nw`tlm*rf$O42O@_*K0y z*ZO5af4K1d2Qc59n+dLrorX(IYu=HypFO-j%m%VW>+VyI)m<%O&aHN2AX{?*@jy^r7@CM z@<_FkTk=Vbl2fY2Z$IFULu$ZpjZzbSI;9%PiL+Ob0K>n;FCU;|-K9`f&n)l=cqG`BQ=Jq?Q8eCzjI=m63=Ui#J33_L+m1ew8#f|C)rhv+w&e_SHZ(W_K4rlD=cR{g%g zH+&|iN^|)vhyhfCAP>5BGN*3KVpXZO#I~l*`N_SeyZqHokLb3+UFCE7TG}>kF1E{x zG=^RAjXjCIHC0V!Ra@mmHv4`#d0Hcev7G;3LM)N$IEzTqs-zY^(|*o^nHVN9u{Vx_ zAO<+W4EjurB#Ct6S&~R^+r&G%wwB^g?exXB<i}Hoj(C=y z5C2~hVdNQ=u7DU!qjR~tvANMv>jtCz?iDVFx0W-v(Y<{6@{$H`o%qV_aa6UG1zi3T z$4tM=(Yw@9>-9OBJq_+gcfeIs;+O&93r~pK?VkG#B6i2}>pJG%)YowzRg!l{!n^ zX-i}=cPYs%euphFE;_b3ZSlL3%c@!&uI0|^Ktqee>v1{ioei~)D(C_tpUb<~gRf`| zp%t{u9jJFydp-Vu(-Uw6T#ZfMwgaDK-*;$7b$8ihm-}%<#Ks$JI{U0dPP?!2llN_G z)l}Kea4eXkbL`k9&CUk*3U;WIoO@r%7rV;j)0p+VJ)`ZqM`C4nTf)vH8Yjtf`{6b5 zHRPAPk%`GD_bzogMuX5g$hl(zk?o|wtr$v8$&es zp-!FnNxv0EdMG-k2S=0F@8&AB(C2ETF?wrj{Sd;oD;~=Z)}JX~kk3AT8aoBQZiB8^ zyGf40WnG(G82oO7oEOWIzOom`#X=VceBOozmoFG|JBsGwV=Ax|ytF*{xNF#}|FWmB zr8j7)Z9VHuBUXx)CUV85aTY(uj4-4%Mkey&`Y$M~;6ux=3T$cT2P^2#kX4YB5WQkyBcu`m<3wz{fyK z+6UsiA)$ApT@OAvIFD(r=^Zj&KFl~*4fx!QXN1}yGeQHSd+muX1}~b?Mzlw0Yu50l zJ&rB>TGlvO4CfeUsU>(amff{i?w8hqPn?x*vYAZps+6)9_R6s=_hBWzx+7~Uv3O6! z2O*o`aS~H~P>V#*5>Q5_@0dA&ii_nc4*X!#CaGN$I(GDbGY5+WKac0W7{~u9@7cmP z?P(|G_sS3CY4JbTQVK~$ajln3!YP0%i5j|d%feFH7-ZF7miVE?6_vQg%e3pI(j*#Hsd-pwxYq= z!mWBOed*?3Iz2TGFMTa6IysNx3)n<{-_hXm)WImihU3fFY9IWmT4yVI3b-3x#g1k5 z?&^9MJTeFDy}uqN#pNq;OssWyyvMfW^tl|3PTyizO>t~9+z0B+?`m*W!*y_k8V>@37Z@7LFL<_!|~UfqJKh zzKG>REOt~k2gm~PXI;dIcCY<4KU#?)vD8OLy8kIZVnh6J{0)B4q|G2lA2T^EJeAAp zy>QvM_fi56p$;Bem?C0MBqE6L+0)!u1y*=#WBo2TIyJETE;v9gwqc8!+UgkP@VM&W zM8h_R+YvMEaMslLWBqUtJ=HF}6IkYQftft;z-(16b~iaH#kcJwtsQyr#Hw9Q0q$*u zn+eTb718Y>dL1N>n2M6v6OV;uC&}rp9VzEC+TipD9DZ*zz1o2oAvq4d9%gwPnj2k1 zV`q@yIU8Lh)a?l`c2q$kxC{|77@SA=D}D!e44sZ@mnYyF;&au67ebB8SB!p1w1gar z)x+EHlWg*}wv=~V5*xhcZFy~sJfG{56KbK%+}!pQ9Y=jI@qqlLEDvTku2gbZ{O2}1 zb3CosS(k%yc4ERPkF%j=1*R9CeE>u7v(hi+1`w5wAYa;^5Q|#s}!A4SmFq4 zB5A^OS8t~vfxFpYTRnsX9v&ygQH}Liho$P{-y%>5VC_>xUE>TmNq=Aw<5yRWAp5Lu z#0LGwMmbxfi<-$2cLrb%=NYg+ROdTutQPyP@K^ z(sPtkEJu%sRSPvetjafhnA1`3bJd>GgWb?w?Vk;ETc(o@_7T^ zYHtH`x|BTjNVQTf4`hxFY6d&Ro{!ywjek5?n_9uy~cfB1H*}jl4w9 zcL|o)C|}5I<4Sao^`^1)E+sJ`z8rW1DT&BRdv88O73+s1M36IZH|J4pL_#ejgnnFlA=tXz~%n;M%tV z7S1}Bg|k8|>`yE#3r&1<{7XR>K?aDMA|1rcf+>Nv2{Yh8m6G0rxK7G~a~o@sR7iC4 z_0TI~^uf>Slm(p?DU-$fluWi`w;U4}7mYvH1(dwtxF+R#+k#;L!-)OlFpF@U!g^vD zEs3y{mUGf4;`0oIaI|2cXr%fG!Ra9wu6$zIL|`dCZ*yHe5G-GS$<)8myIWZV`N?B)*S9*9Nt=K-gVH=zFtdfPhQE|ZCyXkIDP=8LjLHqkA#QBPn z7QFps<-AVnNtjhH+jO6n#8$nfbc@lU1{_no0Vg~1x{?(vc}vOftjIqyIoU?Ow;O{a zCzhaAh&J1Pvn`Fy+^NK~{ts!HT?#p;h-aiDo!m#JPXTa+(6VCIyV0J-9xGRqbI7?S zl}>&%nVo8>2)~h63@4rK`4m{GW4t}K3w?hq5JJ&Asq|_xS?rHnZFwoee$m7@L7fX< zfdJO@o#J5o&jVsP|0Ov_=ayv(2=c%hG!6&t)@~q|E6%dT_Yi@&51NRm2wTr^ATA6L zusinnTWVVC)8(#!liRpP7vYBy$d*i?)7{{A6vAzVPA`U29cX}8-30%x8r}@jWlh5W@~@TQo%O$}ae6M#8x5vuFGq&PXemG_mB|?ftMwi zI}Yr@^1=wa{fpt}ppz;%f812VCH8^F1{ms^61IIW1fk+X<-MNrJa)JY*07=$X1R|~ z>#9drP*x?|;nOnYq3pm9kcpl#w%^m3-C;{*NsFL=He_mACt(vC+5CJk_5Hb847=-m zB__EG09F?{V6H|2;RxmN2ah^zWpiz_09Nn(2-48^H$`I~ziUrqm)&NMXL$pGT4ZjL zlXJ3XH2XXOj_OVHG{KLnbl1Tbag6qQ{Q-8_8Mchzm@{lw%bg|x6zwDRV{_VU1uQ-X z8vW9%ZLw@*cP%|FwX{z^3Imoomy%c9=veA@Epz$Uf|YpvoilBNR3;}jrit-FIp>Yk12Vhq5PVmtwrcZ$XpmwBEYwrEy={P+JB3xb$3aN z&_x4%A6e811P3}e9_VdyR=Wc&Og_h!9ei<>Z9{Crc8-9N4y1MiQazh;i7lrs|BXcU z{zg@2ITvDtgTID_z5aQy?u}k@;w0hbMFUk5+Cpen7dK2%6kY8nOxpLGfP-y%dwp#&1&nrA%!`wlDowu67Em)vF>bJclOO1+wR4aBOcc< zsD9GDVPA|iE&&)$VCs!np)OpjFlTj`0>5+${y1$Z{?XHY!f!@coy-Ge9+~+fkR|7~ zZL~C_?ZBH!lSoaGZy8qX!WR}HJ=tU8p|F;)NRftA1E~n^i^JJSnuf$aBw3^lNXrOu0|_p++5a# z?3M?$JZ&;h&9KX_#hU%^4K|OA)ZET5;bOjb5^&CKHMSVbtfWv8$hxm)8DI%^#kIEd zW1wf#nC14gG&n-$J~(ZoEq;DYCbEZ7ZBL7h7)#bF>UQX3M4SUR*XyHXQ}$%U)YUCf z$6*Y86Y?B+QnHvwF4R;VChp|tD+A3ZMNbRTi^VwV|yQm zFui@}6If;+d+*c9Qp3{0Z3B*lK@zfD&lgp6`r<16~Okq~U}C%pdScC|)6(w06ixOZUjV<#!TD;8&8{wU_;9JUnc^y#qzGXfn_Yg>q zV9r>3dfR@_T;__kCkJQ8*zbz(I+&8PoK0arj&u+~rxfdwhVrvf@mf*=eu+$edO@j! z5wWiOkN))GDyn_-FBkBC<*Q2es{EkBy>RQL;zG!w^;7H z?ZqQcNUt!&!J5>GR=qx3kyyH=K{`#BHp3O zJ7m|U*?Np1Svzi25vH_juO9vfrVHQ+jD_1@P16u!j@pd|z!qF&ODl*_6=@?eN)wu@ zmL$Z!gG=}s_(`%t{<(;j z$ZF7A0^Xq*pENABL8^!-pv5W39D^u(Cb!?zBFGdGST-J}X`+aO)~I+mjNu$khwrhn z4bD*N8aXq8)}k=iw4gx|`)U>**q*H=TVaZYw(zqBZMKZ)FxizS+556fmTIwW%FC(j z)n!WOg76#pyriKTHqy%#2+g=iC19nqgqPs(j9v?4b$E%A+u8#mA+ds3Mxp5nsYle` zk{6c2sYD3xLm-Pt8`1^1heJTTUIYHQhgPi*j#za)?6iP%fZ6aUKtvl6XfooPLZZlf zBUH0hxcd;V76JDR_cwT#@pz(0E6r=D>k8KGk18=Cu#4y^>1Md^|D0?2vx6f9rvXB85xfw58ovL(| z9qf`>a#m`Ja466vsz0EUJ#K$}XfXz7ce6iYOBzUVF&8!xIZDoYNav-oqhpoSs<_O5jeQXezLu(a7|%BAVM|#W`&c2 zK0kL(=A*jh`pHU8YqaSybVSK>l3F5}T+(mwTOaPncKn7CUgVNSW0@Xhu4bS-JJ}rh6QAG=dY0L5a7!+tshCD?pzjCI#7JGd)Ro>-}F;gd(l{$_SV@ONu@p2rN zmj64NqEP)YG@ayVJP}cUPE*C-EmWjJ|S=Z zoQz=|$%slNlpu9+dTO+beiXc~*X`pv=~6Dd52`@{oW)A#qbP{H1k0Qe@w#TXoQ=Uv@7X_0{%d@M$yN5G z;Og(}MW@K;GuaNf<+L;HW(^UjK7!gQ><8PoA?C@kY zr8Qh&Nk)#`6cHUzzJ;)7N+3l+u%6NWQB@2aw-$~s?>-Pp!HfbH?+;8YJC+RY9! zA(;p#bv>Yp?I>24v`#`t$5Tk(({xgqIT1r4&Hp4fGJp9KLnKl#aAGRMyc!T<7N>F% zQlr!p#TXn}4pAYX5DLgB2Lkwx9ePL2nH{Y`CSZeLA#(L7R-#V?f8t(*sKV)hBccRR zK`mwyB{xloSt$4Ks70CsFhek_w>rPG{Ko%7&9BXaO0(a#BKv@n-vnkpYKxgMV^qx| zOb`bxIYj>V3V*$xSk6HTgpRBGWu;Tqq+rVcwM6OiG-As|A=x2Wss>sld~*Q=HL^vw z+4HjK1G(^oqYJqVLl;GC>wH^IPJJjRN*Dt@M1`0Xs?z5ow($dX$mw%KL#am;MvJ?~ z*WxI2Q$nK%crnjtV0AQdA2xyvErTW~MDaxXr$WU{E}r~BjkY@wyn2vYuEgz%4u;*} z1}-;apFREmg7$f*hiE6dK_Sh1h>8=8;vW*vmRzGI2M-QWC#v#QEN?gJ?uN_*2v~Ls zN(cWn$L?UKoFrRqFKx|XNAFV;Sl&@JuHR5WkO&GXEz!rvfoF=wJT4@Z01I;3H`Yjx-g&Z`7wkPk?P|k*6iyPJPLE`_ zE(=3;RU4`vK70rI@S1mcrS!pY+()|wEm>%)Abh8-nYw6HtR z@Om2p?j~Wec4ICn+M*I>QPCoD`Yu-bHVQtiLnz+)b{|q?`cAb6OI-)Xe0MES)1hMl z*X$joc4qMp<45m**>psA(d-oIY%(>?5OaboNlc>(b0$$Xl<#YyEitH3K-h-(u^Fsv zY(~+7BQ$DW{?q72BBQCEFvrkspWBZZ-dP1y3w-yvP&U|5!(N-DCdGXn9T1b}Ybhwz zCcS!qE1gh?&76G@T6^wSi&@q>B)6g?GKXL=uMSr=_Vo2?B9B+waTd!>;6dRW++UA! zu^1(+tRIQiWf)m?Jwc+OfpUR4Zm@JWJmp2G+UN6z#SmtJA9=Ck2ha9Qf^ZKXs}8co zQ6&MPgiy?F2i{I*Ijw3g+t*)?u`EgfQkK^-%7X+iJKP@%s(FGs$1b1CUV+sURk8V> ztLf~{NlGkRHOyvDBez8;cVZuDEiyVj_QV1;?NqW()zadKA|EPJ7h=IgN(DoCW~z=0 zU~dFviU~hL6dl4b@eS7e2q7qAat`hL0dx}#W13%^ve;$lpcHHCOIWJ zy5XQ^j3`g7L7IQKnl>g!PjT~vw~ z*0$UXuuo4@yE}*TB&#sqW!OP5n=iU(Wedco@N(M)evW#wHO0b z1J&NqXVL@wRkp;YC0D<3458#iaIY9YsW^p567|^RArNH5G((*Ly zuyaem@{(FDgWdlhdoCNjOLeqzet<6|e-zj80pf}+C6VQR8XqM0w?hNOxV#uO&wz(+ zp~4#_#z0>w_s++5%=oJarE1Rr7yM*4^D8wTr(Yg3L7+M^ayIHlK;gB|BTArEP6T7u z;EhU3Tm-p<=w9&x_FVm9$cb@Lh842-x%L$JER?Tkzu5t`3b<2=!kYx7oD$l#gWD}& z(q-=`Sx8ZkaEi4hoUdYhO}rI|l-Nfkf-g~sFOW|1?Z_SyjwaGXQC6=06IKGOr?u8z zjAp>w@bdH*RcF%IE=QpNh;hRYrCQ@!UKFij=MB^g#1>1{@1i;($X8$)rV8)+m!TGs zjasRu1mE+HkJm7TJ1XFFjv;QYXgqOz-u8Lem^t@FCU`(1Zj*w2cZGMd<=X+1b<(m_LV2g zr?pe5l^~5$CA|=-i0vyv)fQrActHcW9#*FGTN9r#3RVq?JPztZNn7tayZ8TXBOTV$%kS_dW&`WS7ZG~roR2=CYdbXA; zH<4!*cfxP8re#_xJMt-f`q6XL0MRl)}XY@S9lq`D(gc#^Os* zOn)x#$?DJ(G)CW-u<14M?}QGm4mhq=+CfD7K@dc+(xdjIP^-bS&sSsRqI-d>h&-+^ zVPxXTg&>VhehvL2roojhQImQRMnU`(E~1ZDibhe4_Id&G{uyGt>u*CfP{j~cYumfk zj0TPBgb5Ul9Jo-;%i;baUtT-{r($I<=LZk}C{hewa)EljEN@_kpHebd=1j1+brDJm zca^KDX%saHe5VkT?cy$oOFGOpePmCOi`arx1hET$Qqy}4rY`;5nc&70bs1Q;^@vqr zItu*&G8;lwT1D*6i&Tev;fea|6zY#RJdLzpIH)9DSIF5%ryF>oprUJ|^so9BwqHas z?6=p{tUnoP6*?o;O5Oa`NP7-CVQ)w||D%D1y5j?__`3t``xjjwH_l+UV8?&`B!r>2xn)!Kw;foL!oGc5jb(4hS|U5jR1>voWPRDZ z$-onCoQy3yE7sXf9`slpgPx9Wmn>+)MmElT^38?OkAyKHFi0fwLvdIKbc63jqs?JZ zQK5L}n0HtYMeC-1FZ?BhgGFTZg!@TTDQF8jpOFe`T3PHpht`FC*n&9YwFEge<_kzV zG0DvxEJS+bV3D0Wz)BxNuJpSr)%dm>-_B+82C1>r7GPLWf5wUJd5CF2B1Y(~t7{0w z0sJnh-bKxgO$ZIV4!78!7mit~Tqt=UxEL7;DYA!M`i_#5ajZ)!c8tPmaulSk z^od-subAzsRAal00Rf@vRCLC@EpiFr7lr~T*7LABAg=0|uGp3DDCxkOI{Lnmj`+w) z-%?>Gc~#L7ck9q0_dl!Yyp?cwJ6}}O@FPX^lZiVWga5rfAh|0cS-s3 zBsgs0c#;Bk5vS3rCTAMeRBTkKoNVH=K+kyjFWb{c&5?afei|Z7AqB~nh@^z;K}UD2 zVDcb)!3cqMizxH}9->(hhP^{KvRW^i48+$_jZ{#vFzg+PBla9c7_*aM}wTD3q{= z_v<34VTbwyCER_hdTD35p{-(H3iEDP`%fjmPB4U`ZZbmcya;|Ls*MUJleci3w*(U? z93=pF?1{|?hUaWozq92GMKB!ogGgvdw1uEHvI8Dlk9ey*j17u%HI`cn9B%UcYPQVc zWz8N(Y!iv!p2U z#Z>jl?FpgC9G>%`kla_(;6SuZ0Y?~VhCPTN%#eeoW;XIFl@4f;=V>YI@zb@^;M@n) zPdcS>;|Mt*eus}1AX9X>0EZXleyR3kH_nu`wzsxIABD3h>cDbTYq7&$s(EoCKO^G) z+7?Pv*dC{v(p7lpjTrke>Nd1a(IeY28VJ?SE%<|J(z2w3~Nf2V{&q6ABiwcA{ZmEj&>b1 zx;)Js&Mln`nGluOVZ|X%8=^!?R5}PPp~5yGmpFI?*=qLkule+OBr}XJS9y$ukFJjoJkX z$B8{NuY*^%{5ACkgj4b&WPx^lgI#OSUvEpHL!$^Z7Q#OoD0+Eh4w9!+9p?;Z6IYd^ zE6VA29$~Vy*VPTsD$~J?MQ})X*fQ}|dt!>fDZ|Q()&W{(`%2+S;;by%_Ip~ zCri;G0rgG_t|8%K`?tWY9(Y}S$1X2o@pI%cOev9baZnPrDV-*FvpOccuHlc!W7-lP z$)UrP*slXsgSF0)^Vlm3)i`$R9C--4u39x?u8gR`C)Pu_lZx$`s9_eWE3A7VhHMwo z-K;QCOP(o|5c$Al#Hb>flx2IAX2|rgPUj}2MOX`01A#DJI{iZAYp^C}&nYl^dw+$Gbm)B?!dg5XIRRms!!Zym z-m4Y|%RW%YruNH(d>%`d2wehy@e*5hE4jZk zJ`!kJF46Ob$ZFFa0-ni83E-X_9}zi`w?Z4>1wc%OEXtEXl@O0U_2f7LMnI)h_t2Ro z!j(tV02}V~`@J~woa=f4zq3(S!C)@`Rejk8wB^7b>M88G2XGYGsacxdR=ukmEtGCO zqHUAwLVLG(83buQ+C)jk&g|9GVARI_p$?Vhz%dOS1Dgu{5Z35X{`KtG4Oh#dJpb`M ztvaGQH2F%FAZtC?aDwSxkhPMwm$zm|O-te^YEkIw>Sk<=^8{G7qGju0V-PVk^4g9K zp%I3}{3rLRy?ClWarE&my`pG2$F~%`(XO?q1IW!J$X6V|Lq1VhFNVe)Sv5Fx2K!Mb zJF8p`ETOZOJcbZ~_9m1p#<4HO@R!JN9-p)yC{?g79|AjwEemDgvyXi}p1(ee9~;6N z_o!*Xj9Bfm81~*8c{)3or^T~7lC)U`gRzg?8yW)1qnNlEkVb*?aA_qYkj%bPwb=19 z=s-IzXkl%CJayRO_?K;B4REuPPYa==4awr|7dyg@2R};E3gzDGLmoXDeZCtIFN*aN z&PR~u4Y~BJ&)rDD4X=?q_Yw*%!dtxcH(U#B&1~;loXqzdiZGolC#+J)hvCv&O$G2G zaO?O5?MVy%lB_k`6HbG(Kp_fgT#Ac*Z1tsD%3K;t6u~8kAk6EU{WuNcKRg@DYJa-c znf;NWO=A_KReM5vQn`1-kJ##e3^OCrogE^D^af{1BV@KuvxhDeAf^N>GPSSegt^CY z!I`P$wJqC_$S&WABj7f!SFE=EkH#=}mX@k>2^b@^4?8ps8Vsbq+Ub9k5b_7(yJ^$p zm_nXE05;AJ*l?)o+Oal+eRY!@gI$??Q8-X3OAz>`2hnzQf%ZX+yn~JEqvf&jC0c*> z&L|YV{60{P1;FOTauwb#H8-s*#B1v}*nL4B5j*-{dz?I)eOm$`49mR98%*h=6>EkE zGZ)TZIGGiM$Hups=gqez)3IS~d$wjo^;p-QR9J9~500}}j)RNKFGQ(hbvtPf160@vC|op}`pAwM z?uFwKdO>h^%m8h_yl^nKGSTL{0uYBpDt?MhTB18Lj5{IZbOwhIc>zZF+HGviIlmY4l(qKp?Ei!SS2PtE5(nQ6HfNQpu70Y|5m?GK{2SlJj2qRDOG-LX9%BON{LZd=#riAJb;=j1uY z(oRcCe2&BGg4p1xgS87gC9Q-KjABn5j$rfF%arURcYs_;0-wl5h$bJ!o>Ee6$Oqut z20X=I4LwbJZ^`|Lq;K#HLe~f%ifakYsiefOtEP7d)~)fOM$F@Af`^Sw__4qzF~NjD zvAp40O7Qg&TCp709j;wS?5=**md&#FC^2*NF{qyO(xD5XUB&urv84mhiOa|9M-w@` zM^QRaMk+44;kh$ya5~|u!QVz|6}CQ^?N5V26T(h$_bf7`*fA)l2%RJIYMGW6oK&Wj z%aDj;?Q{up{86{6GdIj7B_)hrin$}~xpI_6=a7Y1H9mIWb5s(1ITf&mNFKS`_Pw3T zhI&=2ZQ&a_J4kg?>kzh0nnaLDZw?#{j93?t1i#x6XlaU`9_OLdUjx5ylK1P!uGf&n(qzir z*`BYlrQ(tia-0>B6Jt6+nnw2cIIU-pjnzKyoY5a+YsN^tIOBo5Z#q3jfLs-M_U!D) zn~7A=*PDCb1O=e_6RE?=T58WHODwchseUUtfh$Ymih>6{S9s;~4JgmC0dmAhZ;iFhc<8+OT=y?P=qO(%?T zc^9W)la8g2k+#CwU1D>xhJwD*cBh=##+9BVI(u}Ec3Nkg8C4GMl0gCP%bXRc5~IV$ zOoLo|+RB1(8$LL-#h&>=O$-)PX=f|{<27Vz_-nx{YP89=TodZV&;2%v(xM7gt;C@! zzzxxM@Pj(-C!3WGYDFT1xV@syT%DdZ&W#gg+$&%Qpm4}_j+s3b7#$Txv6mKW=O;}- z#iFR{Co$mxKC8%(Q<4Z4BqK?ZMCx9&n3kPImGj&-k#|}Q-<(eH6CJRT4cfw-8r~!s zRf;OZ>sAoQcCdlUxSa2ZEc(X4T5+?5PGM=r%3UGK$h6P{h&(RMwn$@Ude8 zzJ^|vtfCQe^GT!jGWL$l!c;V%d=IW`M9j45E*zr|w*$?xx0L5SZls03s1`%0N3-q&<om)ldL26F8gXCvKRnP2E@N%dk7uy=b*$e`xIL~;&Sc4ZO zE}^^z(iWH-aw9lrX!VAk3?BvMT7;d_p*&{nY_Oi4x>k#`Jro+0D>NujOA|nOl_O2#*@uv+tZZPwtX+huusm^;^m6Ad-l*Fk%u0&(TVkmtlwiW zPxDu5@xhx{YFF9S>HK`Od(M}WlA>yx0tpgO7rT4ARvOo>%7~B(q!Y(y#{Bk)e2-=K-$T=oQ;J4$7{9j?5fT9@zhOPV(;kjCcP_A>+AFY>48fwjuwN- z=s-nq-ep>h9aig=J_x%`Tcc%j;}2oB_ZbmH;P4S@rvQl--V}|#&|f4&OR+5dhp zo;{wa#9BGX9`W$Qhy4~PyzX+5*3~$TzfRT+UO}7uNN)nf2V=%b;;5{Q)LH0{Cq#63 zy1+nbD*=ZH`5zacPkb6r|G)pU0+Gx)@8JK(9~dYjmGJ-g2L_6G=UFo#!Q`aUf{glf zJn_%=U8QvyOg3AjfaprPirfU42b!)~|KshcB5!%Z_apr8Nq-Z8L@$i-Bj658AqgNV z-ot+-LD0PFfAk8Y!f9^zCmH%4$1x)R?EleFOoaS)P0c#4smMr9{`(_w9P{@c#B{Jr zZ_?h1SqrD60rig!Y{Bn1OP)5xp?;PfU8Y`pz32@W~%=kg;Z$yqhYcvmmRE^W$Jw(ziiAlr7elEJsjM$4vY&ZDqv6#q}2 z499_I^#oGLxA?Vdxe}OBIf5MC@(dWzuz{yYrV&Nm3=O6QR(YSweHceiJ^3q5PpCuDU3YB8}x;R|K^AYTX_`f=ACCIf<#|=WBI1Jcx>zsqBe7Mg)nR z`$$ByOYXJj^bn9MAsyuS^CiQ7hFxwlSlGnP7T$y{@RyF_=c-o`8rbo`xNr&tn+W}s zi06khAwDbS=iftKPy)q|jickbQQO$arLoB^VT7!L1% z9Zk09vu#QCn1pyb=A82!zyKY#S*dj-V#-=2P4viIiWU_nnxmOd!Cacg2ZikS6ROAn~Fm zvc3&B0j`M{kqjIi@ODgdsjTWgEj1?c44ePH(iQub#G(+cP7T|65zNGggK>()s%4_IThzQHco8+ZZpU5fQAjyvH;L@YC%3 zaFodVMM|0xnjJv`|9a+0@VqF88D45(jFU9WSSTQI#y(9Lot4uugvt=@kxpnYR*0H% qAJe+@H-U*nD>b7wLmfpWk~GT1&?sj({fo;1tpvQmA&+Ti%l{wnP_;+^ delta 25571 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 diff --git a/res/translations/mixxx_es_AR.ts b/res/translations/mixxx_es_AR.ts index 5d9391783fe1..448751f8876f 100644 --- a/res/translations/mixxx_es_AR.ts +++ b/res/translations/mixxx_es_AR.ts @@ -26,17 +26,17 @@ Enable Auto DJ - + Activar Auto DJ Disable Auto DJ - + Desactivar Auto DJ Clear Auto DJ Queue - + Limpiar la cola de Auto DJ @@ -51,17 +51,17 @@ Confirmation Clear - + Confirmación limpiada Do you really want to remove all tracks from the Auto DJ queue? - + Realmente quieres eliminar todas las pistas de la cola de Auto DJ? This can not be undone. - + ¡Esto no puede ser revertido! @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -160,7 +160,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar Lista de Reproducción - + Export Track Files Exportar pistas de audio - + Analyze entire Playlist Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - - + + Export Playlist Exportar lista de reproducción - + Add to Auto DJ Queue (replace) Añadir a la lista de DJ Automático (reemplazar). - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renombrar Lista de Reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Una lista de reproducción ya existe con el mismo nombre - - - + + + A playlist cannot have a blank name. El nombre de una lista de reproduccion no puede estar vacío - + _copy //: Appendix to default name when duplicating a playlist Copiar - - - - - - + + + + + + Playlist Creation Failed Fallo la creación de lista de Reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Confirm Deletion Confirmar Borrado - + Do you really want to delete playlist <b>%1</b>? ¿Desea realmente eliminar la lista de reproducción<b>%1</b>? - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca de tiempo @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artista del Album - + Artist Artista - + Bitrate Tasa de bits - + BPM BPM - + Channels Canales - + Color Color - + Comment Comentario - + Composer Compositor - + Cover Art Portada - + Date Added Fecha de Agregado - + Last Played Última reproducción - + Duration Duración - + Type Tipo - + Genre Genero - + Grouping Agrupación - + Key Clave - + Location Ubicación - + Overview - + Resumen - + Preview Preescucha - + Rating Calificación - + ReplayGain Reproducir otra vez - + Samplerate Tasa de muestreo - + Played Reproducido - + Title Título - + Track # Pista n.º - + Year Año - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recuperando imagen... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computadora" le permite navegar, ver y cargar pistas desde carpetas en su disco duro y dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -806,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Re escanea la librería cuando se inicia Mixxx @@ -856,7 +873,7 @@ trace - Arriba + Perfilar mensajes Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Configura el tamaño máximo del archivo mixxx.log en bytes. Usa -1 para ilimitado. Por defecto es 100 MB, como en 1e5 o 100000000. @@ -866,7 +883,7 @@ trace - Arriba + Perfilar mensajes Overrides the default application GUI style. Possible values: %1 - + Anula el estilo por defecto de la interfaz de usuario de la aplicación. Valores posibles: %1 @@ -1185,12 +1202,12 @@ trace - Arriba + Perfilar mensajes Equalizers - + Ecualizadores Vinyl Control - + Control de vinilo @@ -1983,7 +2000,7 @@ trace - Arriba + Perfilar mensajes Effects - + Efectos @@ -2463,12 +2480,12 @@ trace - Arriba + Perfilar mensajes Move Beatgrid Half a Beat - + Desplaza la cuadricula de tiempo medio pulso Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en pistas con tempo constante. @@ -2666,13 +2683,13 @@ trace - Arriba + Perfilar mensajes Sort hotcues by position - + Ordenar hotcues por posición Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) @@ -3527,7 +3544,7 @@ trace - Arriba + Perfilar mensajes Unknown - + Desconocido @@ -3632,32 +3649,32 @@ trace - Arriba + Perfilar mensajes ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funcionalidad provista por este mapa de controlador será desactivada hasta que el problema sea resuelto. - + You can ignore this error for this session but you may experience erratic behavior. Puedes ignorar este error durante esta sesión, pero podrías experimentar problemas impredecibles. - + Try to recover by resetting your controller. Prueba de corregirlo reseteando la controladora. - + Controller Mapping Error Error del mapa de controlador - + The mapping for your controller "%1" is not working properly. El mapa de tu controlador "%1" no funciona correctamente. - + The script code needs to be fixed. El código del script necesita ser reparado. @@ -3765,7 +3782,7 @@ trace - Arriba + Perfilar mensajes Importar cajón - + Export Crate Exportar cajón @@ -3775,7 +3792,7 @@ trace - Arriba + Perfilar mensajes Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: @@ -3801,17 +3818,17 @@ trace - Arriba + Perfilar mensajes No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) @@ -3937,12 +3954,12 @@ trace - Arriba + Perfilar mensajes Antiguos colaboradores - + Official Website Sitio web oficial - + Donate Donar @@ -3998,7 +4015,7 @@ trace - Arriba + Perfilar mensajes - + Analyze Analizar @@ -4043,17 +4060,17 @@ trace - Arriba + Perfilar mensajes Ejecuta el análisis de cuadrícula de tempo, clave musical y ReplayGain en las pistas seleccionadas. No genera formas de onda para las pistas seleccionadas para ahorrar espacio en disco. - + Stop Analysis Detener análisis - + Analyzing %1% %2/%3 Analizando %1% %2/%3 - + Analyzing %1/%2 Analizando %1/%2 @@ -4164,7 +4181,32 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modos de desvanecimiento de Auto DJ + +Intro completa + Outro: +Reproduce la intro completa y la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea el más corto. Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Desvanecer al iniciar la Outro: +Inicia el fundido cruzado al inicio de la outro. Si la outro es más larga que la intro, +corta el final de la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea más corto.Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Pista completa: +Reproduce la pista completa. Comienza el fundido cruzado desde el +número de segundos seleccionado antes del final de la pista. Un fundido cruzado negativo +agrega silencio entre las pistas. + +Saltar silencio: +Reproduce la pista completa excepto el silencio al inicio y al final. +Inicia el fundido cruzado desde el número de segundos seleccionado antes +del último sonido. + +Saltar silencio e iniciar con volumen al máximo: +Lo mismo que Saltar silencio, pero inicia la transición con el crossfader +centrado, de manera que la intro inicia con el volumen al máximo. @@ -4189,7 +4231,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Saltar silencio e iniciar con volumen al máximo @@ -4322,7 +4364,7 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Analyzer Settings - + Configuración del Analizador @@ -4344,7 +4386,7 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Re-analyze beats when settings change or beat detection data is outdated - + Re-analizar pulsaciones cuando las preferencias cambien o la información sobre pulsaciones sea obsoleta @@ -4470,37 +4512,37 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Si el mapeo no funciona, prueba a activar uno de los controles avanzados siguientes y prueba de nuevo. También puedes volver a detectar el control. - + Didn't get any midi messages. Please try again. No se detectó ningún mensaje MIDI. Por favor, inténtelo de nuevo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No se detectó un mapeado -- Intentelo nuevamente. Asegurese de tocar sólo un control a la vez. - + Successfully mapped control: Control mapeado con éxito: - + <i>Ready to learn %1</i> <i>Preparado para asignar %1</i> - + Learning: %1. Now move a control on your controller. Aprendizaje: %1. Ahora mueva un control en su controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + El control seleccionado no existe. <br>Esto es posiblemente un bug. Por favor repórtelo en el seguidor de bugs de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br> Trataste de vincular: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5198,120 +5240,120 @@ associated with each key. Key palette - + Paleta de notas DlgPrefController - + Apply device settings? ¿Aplicar la configuración del dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configuración debe ser aplicada antes de iniciar el asistente de aprendizaje. ¿Aplicar la configuración y continuar? - + None Ningún - + %1 by %2 %1 por %2 - + Mapping has been edited Se ha editado el mapeo - + Always overwrite during this session Siempre sobreescribir durante esta sesión - + Save As Guardar como - + Overwrite Sobreescribir - + Save user mapping Guardar mapeo del usuario - + Enter the name for saving the mapping to the user folder. Ingresar el nombre del archivo de mapeo para guardarlo en la carpeta de usuario. - + Saving mapping failed Ha fallado el guardado del mapeo - + A mapping cannot have a blank name and may not contain special characters. El nombre del mapeo no puede estar en blanco, ni contener caracteres especiales. - + A mapping file with that name already exists. Ya existe un archivo de mapeo con el mismo nombre. - + Do you want to save the changes? Quieres guardar los cambios? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si usas este mapeo, tu controlador podría no funcionar correctamente. Por favor selecciona otro mapeo o deshabilita el controlador. </b></font><br><br>Este mapeo fue diseñado para un nuevo Motor de Controladores de Mixxx, y no puede ser usado con tu instalación actual.<br>Tu instalación de Mixxx posee la version del Motor de Controladores %1. Este mapeo requiere una versión del Motor de controladores >=%2.<br><br>Para más información visita la wiki de <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versiones del Motor de Controladores</a>. - + Mapping already exists. El mapeo ya existe. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ya existe en la carpeta de mapeos de usuario. <br>¿Deseas sobreescribir o guardar con otro nombre? - + Clear Input Mappings Limpiar mapeos de Entrada - + Are you sure you want to clear all input mappings? Está seguro de querer eliminar todos los mapeos de entrada? - + Clear Output Mappings Limpiar mapeos de Salida - + Are you sure you want to clear all output mappings? Está seguro de querer eliminar todos los mapeos de salida? @@ -5331,62 +5373,62 @@ Apply settings and continue? Device Info - + Información del dispositivo Physical Interface: - + Interfase física Vendor name: - + Nombre del fabricante: Product name: - + Nombre del producto: Vendor ID - + ID del proveedor VID: - + VID: Product ID - + ID del producto PID: - + PID: Serial number: - + Número de serie: USB interface number: - + Número de interfaz USB HID Usage-Page: - + Página de uso HID HID Usage: - + Uso de HID: @@ -5464,7 +5506,7 @@ Apply settings and continue? Data protocol: - + Protocolo de datos: @@ -5474,7 +5516,7 @@ Apply settings and continue? Mapping Settings - + Configuración de mapeo @@ -5527,7 +5569,7 @@ Apply settings and continue? Controllers - + Controladores @@ -5537,7 +5579,7 @@ Apply settings and continue? Enable MIDI Through Port - + Activar puerto de MIDI Through @@ -5642,6 +5684,16 @@ Apply settings and continue? Multi-Sampling Multi-Muestreo + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6169,7 +6221,7 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform Export - + Exportar @@ -6200,12 +6252,12 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform ❯ - + ❮ - + @@ -6256,62 +6308,62 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. El tamaño mínimo de la apariencia seleccionada es mas grande que la resolucion de su pantalla. - + Allow screensaver to run Permite el salvapantallas - + Prevent screensaver from running Evita que se active el salvapantallas - + Prevent screensaver while playing Evita el salvapantallas mientras reproduce - + Disabled Desactivado - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Este skin no soporta esquemas de color - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx debe ser reiniciado para que el nuevo ajuste de locale, escalado o multi-muestreo tenga efecto. @@ -6348,7 +6400,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Analyzer Settings - + Configuración del Analizador @@ -6378,7 +6430,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Key Notation - + Notación de clave musical @@ -6576,7 +6628,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Metadatos significa todos los detalles de la pista (artista, titulo, cantidad de reproducciones, etc) como cuadrículas de tempo, hotcues y bucles. Este cambio solo afecta a la biblioteca de Mixxx. Ningun archivo en el disco será cambiado o eliminado. @@ -6830,7 +6882,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Search-as-you-type timeout: - + Tiempo de espera de búsqueda mientras escribe: @@ -7023,7 +7075,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Reset stem controls on track load - + Reiniciar controles de stem al cargar pista @@ -7481,173 +7533,172 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Habilitado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Para activar el Planificador en tiempo real (actualmente desactivado), mira %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 muestra una lista de tarjetas de sonido y controladores que podrías considerar para utilizar con Mixxx - + Mixxx DJ Hardware Guide Guía de Hardware DJ de Mixxx - + Information Información - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx debe ser reiniciado para que el cambio de ajuste de RubberBand multi-hilo tenga efecto. - + auto (<= 1024 frames/period) auto (<= 1024 fotogramas/período) - + 2048 frames/period 2048 fotogramas/período - + 4096 frames/period 4096 fotogramas/período - + Are you sure? ¿Estás seguro(a)? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Distribuir los canales estéreo en canales mono para su procesamiento en paralelo podría resultar en la pérdida de la compatibilidad mono y una imagen estéreo difusa. No se recomienda al transmitir en vivo o al grabar. - + Are you sure you wish to proceed? ¿Realmente deseas continuar? - + No No - + Yes, I know what I am doing Sí, se lo que estoy haciendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + Main output only Solo Salida principal - + Main and booth outputs Salidas principal y de cabina - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7665,131 +7716,131 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y API de sonido - + Sample Rate Tasa de muestreo - + Audio Buffer Búfer de audio - + Engine Clock Relog del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa el reloj de la tarjeta de sonido para emitir a un público presente y para la menor latencia. <br>Usa el reloj de red para emitir en vivo sin un público presente. - + Main Mix Mezcla principal - + Main Output Mode Modo de Salida principal - + Microphone Monitor Mode Modo de monitorización del micrófono - + Microphone Latency Compensation Compensación de latencia del micrófono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de vaciado del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Bloqueo tonal/Motor de Pitch-bend - + Multi-Soundcard Synchronization Sincronización con Múltiples Tarjetas de Sonido - + Output Salida - + Input Entrada - + System Reported Latency Latencia reportada por el sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente su búfer de audio si el contador de desbordamiento está aumentando o escuchas chasquidos durante la reproducción. - + Main Output Delay Retardo Salida Principal - + Headphone Output Delay Retraso/delay de la Salida de auriculares - + Booth Output Delay Retraso/delay de la salida de cabina - + Dual-threaded Stereo Estéreo en doble-hilo - + Hints and Diagnostics Diagnóstico y sugerencias - + Downsize your audio buffer to improve Mixxx's responsiveness. Disminuya su búfer de audio para mejorar la velocidad de respuesta de Mixxx. - + Query Devices Consultar aparatos @@ -7843,7 +7894,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y Turntable Input Signal Boost - + Amplificación de señal de entrada de Vinilo @@ -7947,12 +7998,12 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y 1/3 of waveform viewer options for "Text height limit" - + 1/3 de visualización de forma de onda Entire waveform viewer - + Visor de forma de onda completa @@ -7985,7 +8036,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y OpenGL Status - + Estado de OpenGL @@ -8140,12 +8191,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferred font size - + Tamaño de tipo de letra preferido Text height limit - + Límite de altura de texto @@ -8185,18 +8236,18 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat grid opacity - + Superar la opacidad de la rejilla Scrolling Waveforms - + Deslizar formas de onda Type - + Tipo @@ -8206,7 +8257,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Set amount of opacity on beat grid lines. - + Establece la cantidad de opacidad en las líneas de la cuadrícula del compás. @@ -8216,17 +8267,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Play marker position - + <br><div><br data-mce-bogus="1"></div> Moves the play marker position on the waveforms to the left, right or center (default). - + Mover the marcador de posición en la pista a la izquierda, derecha o centro (Defabrica). Overview Waveforms - + Visualizar formas de onda @@ -8239,17 +8290,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Sound Hardware - + Hardware de sonido Controllers - + Controladores Library - + Biblioteca @@ -8329,7 +8380,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Key Detection - + Detección de tonalidad @@ -8344,7 +8395,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Vinyl Control - + Control de vinilo @@ -9349,27 +9400,27 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mejor) - + Rubberband R3 (near-hi-fi quality) Banda elástica R3 (calidad casi alta fidelidad) - + Unknown, using Rubberband (better) Desconocido, utilizando Banda elástica (mejor) - + Unknown, using Soundtouch Desconocido, usando Soundtouch @@ -9554,12 +9605,12 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Change color - + Cambiar color Choose a new color - + Escoger un nuevo color @@ -9567,32 +9618,32 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Browse... - + Examinar… No file selected - + No se ha seleccionado ningún archivo Select a file - + Seleccionar un archivo LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9604,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep de OpenGL. - + activate activar - + toggle conmutar - + right derecha - + left izquierda - + right small derecha pequeño - + left small izquierda pequeño - + up arriba - + down abajo - + up small arriba pequeño - + down small abajo pequeño - + Shortcut Atajo @@ -9662,37 +9713,37 @@ de OpenGL. Library - + This or a parent directory is already in your library. Este directorio o su superior ya se encuentra en tu biblioteca. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Este directorio o el indicado no existe o es inaccesible. Cancelando la operación para evitar inconsistencias de biblioteca. - - + + This directory can not be read. Este directorio no puede ser leído. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ha ocurrido un error desconocido. Cancelando la operación para evitar inconsistencias de biblioteca - + Can't add Directory to Library No se pudo agregar el directorio a la biblioteca - + Could not add <b>%1</b> to your library. %2 @@ -9701,27 +9752,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca %2 - + Can't remove Directory from Library No se pudo remover el directorio de la biblioteca. - + An unknown error occurred. Ha ocurrido un error desconocido. - + This directory does not exist or is inaccessible. Este directorio no existe o es inaccesible. - + Relink Directory Reenlazar directorio - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9733,27 +9784,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca LibraryFeature - + Import Playlist Importar Lista de Reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? ¿Sobrescribir archivo? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. Do you really want to overwrite it? - + Ya existe un archivo de lista de reproducción con el nombre "% 1". Se agregó la extensión predeterminada "m3u" porque no se especificó ninguna. ¿Realmente desea sobrescribirla? @@ -9899,253 +9950,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy El dispositivo de sonido está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reintente</b> luego de cerrar las otras aplicaciones o reconectar un dispositivo de sonido - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> las opciones del dispositivo de sonido de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obtenga <b>ayuda</b> del wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Salir</b> de Mixxx. - + Retry Reintentar - + skin apariencia - + Allow Mixxx to hide the menu bar? ¿Permitir a Mixxx ocultar la barra de menú? - + Hide Always show the menu bar? Ocultar - + Always show Mostrar siempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra de menú de Mixxx ha sido ocultada y se puede alternar presionando la tecla <b>Alt</b>. <br><br>Haz clic en <b>%1</b> para aceptar. <br><br>Haz clic en <b>%2</b> para desactivarlo, por ejemplo si usas Mixxx sin un teclado. <br><br>Puedes cambiar este ajuste en cualquier momento en Preferencias -> Interfaz. <br> - + Ask me again Pregúntame de nuevo - - + + Reconfigure Reconfigurar - + Help Ayuda - - + + Exit Salir - - + + Mixxx was unable to open all the configured sound devices. Mixxx no ha podido activar todos los dispositivos de sonido configurados. - + Sound Device Error Error del dispositivo de sonido - + <b>Retry</b> after fixing an issue <b>Reintenta</b> una vez corregido el problema - + No Output Devices No hay dispositivos de salida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx fue configurado sin ningún dispositivo de salida de audio. El procesamiento de audio estará desactivado mientras no se configure un dispositivo de audio de salida. - + <b>Continue</b> without any outputs. <b>Continuar</b> sin ninguna salida. - + Continue Continuar - + Load track to Deck %1 Cargar pista al plato %1 - + Deck %1 is currently playing a track. El plato %1 está reproduciendo una pista. - + Are you sure you want to load a new track? ¿Está seguro de cargar una pista nueva? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control por vinilo. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control passthrough. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this microphone. Do you want to select an input device? No se ha seleccionado un dispositivo de Entrada para este micrófono. ¿Deseas escoger uno ahora? - + There is no input device selected for this auxiliary. Do you want to select an input device? No se ha seleccionado un dispositivo de entrada para este Auxiliar. ¿Deseas escoger uno ahora? - + Scan took %1 - + El escaneo tomo %1 - + No changes detected. - + No se han detectado cambios - - + + %1 tracks in total - + %1 pistas en total - + %1 new tracks found - + Encontradas %1 pistas nuevas - + %1 moved tracks detected - + %1 pistas movidas detectadas - + %1 tracks are missing (%2 total) - + %1 pistas perdidas (%2 en total) - + %1 tracks have been rediscovered - + %1 pistas han sido reencontradas - + Library scan finished - + Escaneo de la biblioteca terminado - + Error in skin file Error en el archivo de la apariencia - + The selected skin cannot be loaded. No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering Renderizado directo de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + El renderizado directo no está habilitado en su máquina. <br><br>Esto significa que las visualizaciones de forma de onda serán muy <br><b>lentas y pueden exigir mucho a su CPU</b>. Actualice su <br>configuración para habilitar la representación directa o desactiv<br> las visualizaciones de forma de onda en las preferencias de Mixxx seleccionando <br>"Vacío" como la pantalla de forma de onda en la sección 'Interfaz'. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -10161,13 +10212,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reproducción @@ -10177,32 +10228,58 @@ Do you want to select an input device? Aleatorizar lista de reproducción - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Las listas de reproducción son listar ordenadas de pistas que te permiten planificar tus sesiones de DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Podría ser necesario saltar algunas pistas en tu lista de reproducción planificada, o añadir algunas pistas diferentes, con el fin de mantener la energía de tu audiencia. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + Create New Playlist Crear nueva lista de reproducción @@ -10212,7 +10289,7 @@ Do you want to select an input device? Mixxx Hotcue Colors - + Colores de hotcues de Mixxx @@ -10220,82 +10297,82 @@ Do you want to select an input device? Serato DJ Track Metadata Hotcue Colors - + Metadatos de colores de hotcues de pistas de Serato DJ Serato DJ Pro Hotcue Colors - + Colores de hotcues de Serato DJ Pro Rekordbox COLD1 Hotcue Colors - + Colores de hotcues de Rekordbox COLD1 Rekordbox COLD2 Hotcue Colors - + Colores de hotcues de Rekordbox COLD2 Rekordbox COLORFUL Hotcue Colors - + Colores de hotcues COLORFUL de Rekordbox Mixxx Track Colors - + Colores de pistas de Mixxx Rekordbox Track Colors - + Colores de pistas de Rekordbox Serato DJ Pro Track Colors - + Colores de pistas de Serato DJ Pro Traktor Pro Track Colors - + Colores de pistas de Traktor Pro VirtualDJ Track Colors - + Colores de pistas de VirtualDJ Mixxx Key Colors - + Colores de notas de Mixxx Traktor Key Colors - + Colores de notas de Traktor Mixed In Key - Key Colors - + Colores de notas de Mixed In Key Protanopia / Protanomaly Key Colors - + Colores de notas de Protanopia/Protanomalía Deuteranopia / Deuteranomaly Key Colors - + Colores de notas de Deuteranopía/Deuteranomalía Tritanopia / Tritanomaly Key Colors - + Colores de notas de Tritanopía/Tritanomalía @@ -10429,7 +10506,7 @@ Do you want to scan your library for cover files now? Switch - + Switch @@ -10514,7 +10591,7 @@ Do you want to scan your library for cover files now? Vinyl Control - + Control de vinilo @@ -10879,7 +10956,7 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p The Mixxx Team - + Equipo de Mixxx @@ -10909,12 +10986,12 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p Gain - + Ganancia Set the gain of metronome click sound - + Configura la ganancia del sonido del metrónomo @@ -11863,7 +11940,7 @@ Consejo: compensa las voces de "ardillitas" o "gruñonas"La cantidad de amplificación aplicada a la señal de audio. A niveles más altos, el audio estará más distorsionado. - + Passthrough Paso @@ -12033,12 +12110,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. varios - + built-in nativo - + missing no encontrado @@ -12166,54 +12243,54 @@ pueden introducir un efecto de "bombeo" y/o distorsión. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listas de reproducción - + Folders Carpetas - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Accesos Directos - + Loops (only the first loop is currently usable in Mixxx) Bucles (solo el primer bucle es utilizable en Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Buscar dispositivos de almacenamiento Rekordbox (refrescar) - + Beatgrids Grillas de pulsos - + Memory cues Cues en memoria - + (loading) Rekordbox (cargando) Rekordbox @@ -12655,22 +12732,22 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Reading track for fingerprinting failed. - + Ha fallado la lectura de la pista para fingerprinting Identifying track through AcoustID - + Identificando pista mediante AcoustID Could not identify track through AcoustID. - + No se pudo identificar la pista mediante AcoustID. Could not find this track in the MusicBrainz database. - + No se pudo encontrar esta pista en la base de datos de MusicBrainz. @@ -12934,7 +13011,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Vinyl Control - + Control de vinilo @@ -13242,7 +13319,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Toggle visibility of Rate Control - + Alternar visibilidad del control de velocidad @@ -13392,7 +13469,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. - + Mantener el clic izquierdo permite previsualizar la posición donde la cabeza de reproducción saltará al soltarlo. El arrastre puede ser abortado con el clic derecho. @@ -13442,12 +13519,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Shows the current volume for the left channel of the main output. - + Muestra el volumen actual para el canal izquierdo en la salida principal. Shows the current volume for the right channel of the main output. - + Muestra el volumen actual para el canal derecho de la salida principal. @@ -13459,27 +13536,27 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Adjusts the main output gain. - + Ajusta el volumen principal Determines the main output by fading between the left and right channels. - + Determina la salida principal desvaneciendo entre los canales izquierdo y derecho. Adjusts the left/right channel balance on the main output. - + Ajusta el balance de los canales izquierdo/derecho en la salida principal. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Desvanecimiento cruzado de la salida de auriculares entre la salida principal y la señal de cueing (PFL o Escucha Pre-Deslizador) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si se activa, la señal principal de la mezcla se reproduce en el canal derecho, mientras que la señal de cueing se reproduce en el canal izquierdo. @@ -13494,12 +13571,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Show/hide the beatgrid controls section - + Mostrar/ocultar la sección de controles de la cuadrícula de tiempo Show/hide the stem mixing controls section - + Mostrar/ocultar la sección de controles de mezcla de stems @@ -13509,17 +13586,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Volume Meters - + Medidores de volumen mix microphone input into the main output. - + mezcla la entrada de micrófono con la salida principal. Auto: Automatically reduce music volume when microphone volume rises above threshold. - + Auto: reduce automáticamente el volumen de la música cuando el volumen del micrófono supera el umbral. @@ -13530,17 +13607,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: configura cuánto se reduce el volumen de la música cuando el volumen de los micrófonos activos supera el umbral. Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + Manual: configura cuánto reducir e If keylock is disabled, pitch is also affected. - + Si el bloqueo tonal se desactiva, la altura también es afectada. @@ -13555,7 +13632,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Raises playback speed in small steps. - + Incrementa la velocidad de reproducción en pasos pequeños. @@ -13570,7 +13647,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Lowers playback speed in small steps. - + Reduce la velocidad de reproducción en pasos pequeños. @@ -13580,12 +13657,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed higher while active (tempo). - + Mantiene la velocidad de reproducción alta cuando se activa (tempo). Holds playback speed higher (small amount) while active. - + Mantiene la velocidad de reproducción alta (pequeña cantidad) cuando se activa. @@ -13595,59 +13672,60 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed lower while active (tempo). - + Mantiene la velocidad de reproducción baja cuando se activa (tempo). Holds playback speed lower (small amount) while active. - + Mantiene la velocidad de reproducción baja (pequeña cantidad) cuando se activa. When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Cuando se pulsa repetidamente, ajusta el tempo para coincidir con la frecuencia de pulsaciones. Tempo Tap - + Seguidor de Tempo (Tempo Tap) Rate Tap and BPM Tap - + Frecuencia de pulsaciones y de BPM Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en +pistas con tempo constante Revert last BPM/Beatgrid Change - + Revierte el último cambio de BPM/cuadrícula de tiempo Revert last BPM/Beatgrid Change of the loaded track. - + Revierte el último cambio de BPM/Cuadrícula de tiempo para la pista cargada. Toggle the BPM/beatgrid lock - + Cambia el bloqueo de BPM/cuadrícula de tiempo Tempo and Rate Tap - + Toques de Tempo y Frecuencia Tempo, Rate Tap and BPM Tap - + Toques de Tempo, Frecuencia y BPM @@ -13663,79 +13741,79 @@ tracks with constant tempo. Left click: shift 10 milliseconds earlier - + Clic izquierdo: adelantar 10 milisegundos Right click: shift 1 millisecond earlier - + Clic derecho: adelantar 1 milisegundo Shift cues later - + Retrasar cues Left click: shift 10 milliseconds later - + Clic izquierdo: retrasar 10 milisegundos Right click: shift 1 millisecond later - + Clic derecho: retrasar 1 milisegundo Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Arrastra un botón de Hotcue aquí para continuar reproduciendo después de soltar la hotcue. Hint: Change the default cue mode in Preferences -> Decks. - + Sugerencia: cambie el modo por defecto de las cues en Preferencias -> Platos. Mutes the selected channel's audio in the main output. - + Silencia el audio del canal seleccionado en la salida principal. Main mix enable - + Activador de mezcla principal Hold or short click for latching to mix this input into the main output. - + Clic sostenido o corto para enganchar, para mezclar esta entrada con la salida principal. If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + Si la hotcue es una cue de bucle, activa el bucle y salta hacia él si se encuentra detrás de la posición de reproducción. If the play position is inside an active loop, stores the loop as loop cue. - + Si la posición de reproducción se encuentra dentro de un bucle activo, almacena el bucle como una hotcue de bucle. Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Arrastrar este botón dentro de otro botón de hotcue para moverlo hacia este (cambiando su número). Si la otra hotcue ya se encuentra definida, las dos son intercambiadas. Expand/Collapse Samplers - + Expandir/contraer samplers Toggle expanded samplers view. - + Alternar la vista expandida de los samplers. @@ -13745,12 +13823,12 @@ tracks with constant tempo. Auto DJ is active - + Auto DJ se encuentra activo Red for when needle skip has been detected. - + Rojo cuando se detecta un salto de aguja. @@ -13790,7 +13868,7 @@ tracks with constant tempo. If the track has no beats the unit is seconds. - + Si la pista no tiene pulsaciones, la unidad es segundos. @@ -13830,12 +13908,12 @@ tracks with constant tempo. Beatloop Anchor - + Ancla del bucle de pulsaciones Define whether the loop is created and adjusted from its staring point or ending point. - + Define si el bucle es creado y ajustado desde su punto de inicio o de final. @@ -13930,12 +14008,12 @@ tracks with constant tempo. Hint: Change the time format in Preferences -> Decks. - + Sugerencia: cambie el formato de tiempo en Preferencias -> Platos. Show/hide intro & outro markers and associated buttons. - + Mostrar/ocultar marcadores de intro y outro, y sus botones asociados. @@ -13948,7 +14026,7 @@ tracks with constant tempo. If marker is set, jumps to the marker. - + Si el marcador se encuentra definido, salta al marcador. @@ -13956,7 +14034,7 @@ tracks with constant tempo. If marker is not set, sets the marker to the current play position. - + Si el marcador no se encuentra definido, lo configura a la posición de reproducción actual. @@ -13964,7 +14042,7 @@ tracks with constant tempo. If marker is set, clears the marker. - + Si el marcador se encuentra definido, lo elimina. @@ -13989,7 +14067,7 @@ tracks with constant tempo. Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajuste la mezcla de la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos @@ -13999,7 +14077,7 @@ tracks with constant tempo. D+W mode: Add wet to dry - + Modo D+W: agregue húmedo a seco @@ -14009,24 +14087,25 @@ tracks with constant tempo. Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajuste cómo se mezcla la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Modo seco / húmedo (líneas cruzadas): Mezcle los fundidos cruzados de la perilla entre seco y húmedo. Use esto para cambiar el sonido de la pista con EQ y efectos de filtro. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Modo Seco+Húmedo (línea seca plana): La perilla de mezcla agrega mojado a seco +Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efectos de filtrado. Route the main mix through this effect unit. - + Enruta la mezcla principal a través de esta unidad de efectos. @@ -14046,42 +14125,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Stem Label - + Etiqueta de stem Name of the stem stored in the stem file - + Nombre del stem almacenado en el archivo de stem Text is displayed in the stem color stored in the stem file - + El texto es presentado con el color del stem almacenado en el archivo de stem this stem color is also used for the waveform of this stem - + este color de stem también es usado en la forma de onda de este stem Stem Mute - + Silenciar stem Toggle the stem mute/unmuted - + Alterna el silencio del stem Stem Volume Knob - + Perilla de volumen del stem Adjusts the volume of the stem - + Ajusta el volumen del stem @@ -14349,7 +14428,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Inactive: parameter not linked - + Inactivo: parámetro no enlazado @@ -14565,17 +14644,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Left click to jump around in the track. - + Clic izquierdo para saltar a lo largo de la pista. Right click hotcues to edit their labels and colors. - + Click derecho en los accesos directos para editar sus etiquetas y colores. Right click anywhere else to show the time at that point. - + Clic derecho en cualquier otra parte para mostrar el tiempo en ese punto. @@ -14670,7 +14749,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Maximize Library - + Maximizar Biblioteca @@ -14685,7 +14764,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Changes the number of hotcue buttons displayed in the deck - + Cambia el número de botones de acceso directo mostrados en el deck @@ -14711,12 +14790,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Opens the track properties editor - + Abre el editor de propiedades de pista Opens the track context menu. - + Abre el menú contextual de la pista @@ -14818,12 +14897,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drag this button onto a Play button while previewing to continue playback after release. - + Arrastre este botón a un boton de Play durante la preescucha para continuar la reproducción tras soltarlo. Dragging with Shift key pressed will not start previewing the hotcue. - + Arrastrar mientras presiona la tecla Shift no iniciará la preescucha de la hotcue. @@ -15257,22 +15336,22 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Replace Existing File? - + ¿Reemplazar el archivo existente? "%1" already exists, replace? - + "%1% ya existe, ¿reemplazar? &Replace - + &Reemplazar Apply to all files - + Aplicar a todos los archivos @@ -15371,7 +15450,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. frameSwapped-signal driven phase locked loop - + Bucle con bloqueo de fase manejado por señal con marco cambiado @@ -15397,12 +15476,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. No color - + Sin color Custom color - + Color personalizado @@ -15455,47 +15534,47 @@ Carpeta: %2 WCueMenuPopup - + Cue number - + Número de cue - + Cue position Posición Marca - + Edit cue label Editar etiqueta de marca - + Label... - + Etiqueta... - + Delete this cue Borrar esta marca - + Toggle this cue type between normal cue and saved loop - + Alterna el tipo de esta cue entre cue normal y bucle guardado - + Left-click: Use the old size or the current beatloop size as the loop size - + Clic izquierdo: usar el tamaño anterior o el del bucle actual como el tamaño de bucle - + Right-click: Use the current play position as loop end if it is after the cue - + Clic derecho: usar la posición de reproducción actual como final del bucle si se encuentra después de la cue - + Hotcue #%1 Acceso DIrecto #%1 @@ -15510,7 +15589,7 @@ Carpeta: %2 Rename Preset - + Renombrar preajuste @@ -15620,407 +15699,437 @@ Carpeta: %2 - Create &New Playlist + Search in Current View... + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + Crear &nueva Playlist + + + Create a new playlist Crear una nueva lista de reproducción - + Ctrl+n Ctrl+N - + Create New &Crate Crear un nuevo&cajón - + Create a new crate Crear un nuevo cajón - + Ctrl+Shift+N Ctrl+Mayús+N - - + + &View &Vista - + Auto-hide menu bar - + Auto-ocultar barra de menú - + Auto-hide the main menu bar when it's not used. - + Auto-ocultar la barra de menú principal cuando no es utilizada. - + May not be supported on all skins. Puede no estar disponible para todas las apariencias. - + Show Skin Settings Menu Mostrar menú de ajustes de aspecto - + Show the Skin Settings Menu of the currently selected Skin Mostrar la configuración actual del menu de tema - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar seccion del microfono - + Show the microphone section of the Mixxx interface. Muestra la sección de control de micrófono de la interfaz de Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar la Sección de Control de Vinilo - + Show the vinyl control section of the Mixxx interface. Muestra la sección de control de vinilo de la interfaz de Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar el reproductor de preescucha - + Show the preview deck in the Mixxx interface. Muestra el reproductor de preescucha en la interfaz de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Muestra carátulas - + Show cover art in the Mixxx interface. Muestra las carátulas en la interfaz de Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximizar la biblioteca para tomar todo el espacio disponible en pantalla. - + Space Menubar|View|Maximize Library - + Espacio - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Mostrar Mixxx a pantalla completa - + &Options &Opciones - + &Vinyl Control Control de &vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con codigo de tiempo en bandejas externas para controlar Mixxx - + Enable Vinyl Control &%1 Habilita el Control por Vinilo &%1 - + &Record Mix &Grabar Mezcla - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar transmisión en &vivo - + Stream your mixes to a shoutcast or icecast server Transmite tus mezclas a un servidor shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar Atajos de &Teclado - + Toggles keyboard shortcuts on or off Activa o desactiva los atajos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar la configuración de Mixxx (p.ej.: reproducción, MIDI, controles) - + &Developer &Desarrollador - + &Reload Skin &Recargar apariencia - + Reload the skin Recargar la apariencia - + Ctrl+Shift+R Ctrl+Mayús+R - + Developer &Tools U&tilidades de desarrollador - + Opens the developer tools dialog Abre el cuadro de diálogo de herramientas de desarrollo - + Ctrl+Shift+T Ctrl+Mayús+T - + Stats: &Experiment Bucket Estadísticas: Contadores &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el modo experimental. Recoje estadísticas en los contadores EXPERIMENT. - + Ctrl+Shift+E Ctrl+Mayús+E - + Stats: &Base Bucket Estadísticas: contadores &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el modo base. Recoje estadísticas en los contadores BASE. - + Ctrl+Shift+B Ctrl+Mayús+B - + Deb&ugger Enabled Dep&uración activada - + Enables the debugger during skin parsing Activa el depurador durante el análisis de la máscara - + Ctrl+Shift+D Ctrl+Mayús+D - + &Help Ay&uda - + Show Keywheel menu title - + Mostrar rueda de notas E&xport Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ Export the library to the Engine DJ format - + Exportar biblioteca al formato Engine DJ - + Show keywheel tooltip text - + Mostrar rueda de notas - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Soporte &comunitario - + Get help with Mixxx Obtener ayuda con Mixxx - + &User Manual Manual de &usuario - + Read the Mixxx user manual. Lea el manual de usuario de Mixxx. - + &Keyboard Shortcuts Atajos de &Teclado - + Speed up your workflow with keyboard shortcuts. Trabaja más rápidamente usando los atajos de teclado. - + &Settings directory &Directorio de configuración - + Open the Mixxx user settings directory. Abre el directorio de configuración de usuario de Mixxx. - + &Translate This Application &Traducir esta aplicación - + Help translate this application into your language. Ayude a traducir esta aplicación a su idioma. - + &About &Acerca de - + About the application Acerca de la aplicación @@ -16036,7 +16145,7 @@ Carpeta: %2 Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - + Listo para reproducir, analizando... @@ -16049,31 +16158,19 @@ Carpeta: %2 Finalizing... Text on waveform overview during finalizing of waveform analysis - + Finalizando... WSearchLineEdit - - Clear input - Clear the search bar input field - Borrar el texto - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input Borrar el texto @@ -16084,93 +16181,87 @@ Carpeta: %2 Buscar... - + Clear the search bar input field - + Limpia el campo de entrada de la barra de búsqueda - - Enter a string to search for - Introducir el texto a buscar + + Return + Volver - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library - Para más información vea el Manual de Usuario> Biblioteca Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Atajo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Poner el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retroceso + + Additional Shortcuts When Focused: + - Shortcuts - Atajos + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Activa la búsqueda antes del tiempo de espera de "búsqueda mientras escribe" o salte a la vista de pistas después + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Ctrl+Espacio - + Toggle search history Shows/hides the search history entries - + Alternar historial de búsqueda - + Delete or Backspace Borrar o Retorno - - Delete query from history - Borrar Consulta del Historial - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Salir de la busqueda + + Delete query from history + Borrar Consulta del Historial @@ -16178,7 +16269,7 @@ Carpeta: %2 Search related Tracks - + Buscar pistas relacionadas @@ -16188,7 +16279,7 @@ Carpeta: %2 harmonic with %1 - + armónico con %1 @@ -16198,7 +16289,7 @@ Carpeta: %2 between %1 and %2 - + entre %1 y %2 @@ -16248,7 +16339,7 @@ Carpeta: %2 &Search selected - + &Búsqueda seleccionada @@ -16286,7 +16377,7 @@ Carpeta: %2 Update external collections - + Actualizar colecciones externas @@ -16296,12 +16387,12 @@ Carpeta: %2 Adjust BPM - + Ajustar BPM Select Color - + Seleccionar color @@ -16469,12 +16560,12 @@ Carpeta: %2 Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) Sort hotcues by position - + Ordenar hotcues por posición @@ -16519,7 +16610,7 @@ Carpeta: %2 Shift Beatgrid Half Beat - + Desplazar la cuadrícula de tiempo medio beat @@ -16607,7 +16698,7 @@ Carpeta: %2 Undo BPM/beats change of %n track(s) - + Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s) @@ -16622,7 +16713,7 @@ Carpeta: %2 Setting rating of %n track(s) - + Definiendo evaluación de %n pistaDefiniendo evaluación de %n pistasDefiniendo evaluación de %n pista(s) @@ -16677,12 +16768,12 @@ Carpeta: %2 Sorting hotcues of %n track(s) by position (remove offsets) - + Ordenando hotcues de %n pista por posición (removiendo desfases)Ordenando hotcues de %n pistas por posición (removiendo desfases)Ordenando hotcues de %n pistas(s) por posición (removiendo desfases) Sorting hotcues of %n track(s) by position - + Ordenando hotcues de %n pista por posiciónOrdenando hotcues de %n pistas por posiciónOrdenando hotcues de %n pista(s) por posición @@ -16707,7 +16798,7 @@ Carpeta: %2 Move these files to the trash bin? - + ¿Mover estos archivos a la papelera? @@ -16733,7 +16824,7 @@ Carpeta: %2 Okay - + Okey @@ -16783,7 +16874,7 @@ Carpeta: %2 Remaining Track File(s) - + Renombrando archivo(s) de pista @@ -16794,7 +16885,7 @@ Carpeta: %2 Clear Reset metadata in right click track context menu in library - + Climpiar @@ -16804,37 +16895,37 @@ Carpeta: %2 Clear BPM and Beatgrid - + Limpia las BPM y la cuadrícula de tiempo Undo last BPM/beats change - + Revertir el último cambio de BPM/pulsaciones Move this track file to the trash bin? - + ¿Mover este archivo de pista a la papelera? Permanently delete this track file from disk? - + ¿Eliminar permanentemente este archivo de pista del disco? All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + Todos los platos donde estas pistas hayan sido cargadas se detendrán, y las pistas serán expulsadas. All decks where this track is loaded will be stopped and the track will be ejected. - + Todos los platos donde esta pista haya sido cargada se detendrán, y la pista será expulsada. Removing %n track file(s) from disk... - + Removiendo %n archivo(s) de pista del disco... @@ -16854,12 +16945,12 @@ Carpeta: %2 Don't show again during this session - + No mostrar nuevamente durante esta sesión The following %1 file(s) could not be moved to trash - + El/los siguiente(s) %1 archivo(s) no pudieron ser movidos a la papelera @@ -16882,7 +16973,7 @@ Carpeta: %2 title - + título @@ -16890,73 +16981,73 @@ Carpeta: %2 Load for stem mixing - + Cargar para mezcla de stems Load pre-mixed stereo track - + Cargar pista estéreo premezclada Load the "%1" stem - + Cargar el stem "%1" Load multiple stem into a stereo deck - + Cargar múltiples stems en un plato estéreo Select stems to load - + Seleccionar stems a cargar Release "CTRL" to load the current selection - + Soltar "Ctrl" para cargar la selección actual Use "CTRL" to select multiple stems - + Use "Ctrl" para seleccionar múltiples stems WTrackTableView - + Confirm track hide Confirmar ocultar pista - + Are you sure you want to hide the selected tracks? ¿Estas seguro de que quieres ocultar las pistas seleccionadas? - + Are you sure you want to remove the selected tracks from AutoDJ queue? ¿Esta seguro de que quiere eliminar las pistas seleccionadas de la cola del AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Estás seguro que quieres eliminar las pistas seleccionada de este cajón? - + Are you sure you want to remove the selected tracks from this playlist? ¿Esta seguro de que desea eliminar las pistas seleccionadas de la lista de reproducción? - + Don't ask again during this session No volver a preguntar durante esta sesión - + Confirm track removal Confirmar eliminación del track @@ -16971,58 +17062,58 @@ Carpeta: %2 Shuffle Tracks - + Mezclar pistas mixxx::CoreServices - + fonts tipos de letra - + database base de datos - + effects efectos - + audio interface interface de sonido - + decks - + decks - + library Biblioteca - + Choose music library directory Elija el directorio de la biblioteca de la música - + controllers Controladores - + Cannot open database No se puede abrir la base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17036,70 +17127,80 @@ Pulse Aceptar para salir. mixxx::DlgLibraryExport - + Entire music library + Biblioteca de música completa + + + + Crates - - Selected crates - Cajas seleccionadas + + Playlists + - + + Selected crates/playlists + + + + Browse Ver - + Export directory - + Exportar directorio - + Database version - + Versión de base de datos - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ - + Export Library To - + Exportar biblioteca a - + No Export Directory Chosen - + No se seleccionó un directorio de exportación - + No export directory was chosen. Please choose a directory in order to export the music library. - + No se escogió un directorio de exportación. Por favor escoja un directorio para poder exportar la biblioteca de música. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + Una base de datos ya existe en el directorio seleccionado. Las pistas exportadas serán añadidas a esta base de datos. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - + Una base de datos ya existe en el directorio seleccionado, pero ocurrió un problema al cargarla. No se garantiza una exportación exitosa en esta situación. @@ -17118,34 +17219,35 @@ Pulse Aceptar para salir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message - + Fallo al exportar %1 - %2: +%3 mixxx::LibraryExporter - + Export Completed - + Exportación completada - - Exported %1 track(s) and %2 crate(s). - Exportados %1 pista(s) y %2 caja(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed - + Exportación fallida - + Exporting to Engine DJ... - + Exportando a Engine DJ... @@ -17153,7 +17255,7 @@ Pulse Aceptar para salir. Abort - + Abortar diff --git a/res/translations/mixxx_es_CO.qm b/res/translations/mixxx_es_CO.qm index d190c988b5d32370cc05ee0ae44854392b7a7843..966ca9937c8a2ff8cc1047390129e216c76976c5 100644 GIT binary patch delta 55112 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 S1{O>L?-TTe=I+ogkpDlS+RPXL delta 25566 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 Enable Auto DJ - + Activar Auto DJ Disable Auto DJ - + Desactivar Auto DJ Clear Auto DJ Queue - + Limpiar la cola de Auto DJ @@ -51,17 +51,17 @@ Confirmation Clear - + Confirmación limpiada Do you really want to remove all tracks from the Auto DJ queue? - + Realmente quieres eliminar todas las pistas de la cola de Auto DJ? This can not be undone. - + ¡Esto no puede ser revertido! @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -160,7 +160,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar Lista de Reproducción - + Export Track Files Exportar pistas de audio - + Analyze entire Playlist Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - - + + Export Playlist Exportar lista de reproducción - + Add to Auto DJ Queue (replace) Añadir a la lista de DJ Automático (reemplazar). - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renombrar Lista de Reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Una lista de reproducción ya existe con el mismo nombre - - - + + + A playlist cannot have a blank name. El nombre de una lista de reproduccion no puede estar vacío - + _copy //: Appendix to default name when duplicating a playlist Copiar - - - - - - + + + + + + Playlist Creation Failed Fallo la creación de lista de Reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Confirm Deletion Confirmar Borrado - + Do you really want to delete playlist <b>%1</b>? ¿Desea realmente eliminar la lista de reproducción<b>%1</b>? - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca de tiempo @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artista del Album - + Artist Artista - + Bitrate Tasa de bits - + BPM BPM - + Channels Canales - + Color Color - + Comment Comentario - + Composer Compositor - + Cover Art Portada - + Date Added Fecha de Agregado - + Last Played Última reproducción - + Duration Duración - + Type Tipo - + Genre Genero - + Grouping Agrupación - + Key Clave - + Location Ubicación - + Overview - + Resumen - + Preview Preescucha - + Rating Calificación - + ReplayGain Reproducir otra vez - + Samplerate Tasa de muestreo - + Played Reproducido - + Title Título - + Track # Pista n.º - + Year Año - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recuperando imagen... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computadora" le permite navegar, ver y cargar pistas desde carpetas en su disco duro y dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -806,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Re escanea la librería cuando se inicia Mixxx @@ -856,7 +873,7 @@ trace - Arriba + Perfilar mensajes Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Configura el tamaño máximo del archivo mixxx.log en bytes. Usa -1 para ilimitado. Por defecto es 100 MB, como en 1e5 o 100000000. @@ -866,7 +883,7 @@ trace - Arriba + Perfilar mensajes Overrides the default application GUI style. Possible values: %1 - + Anula el estilo por defecto de la interfaz de usuario de la aplicación. Valores posibles: %1 @@ -1185,12 +1202,12 @@ trace - Arriba + Perfilar mensajes Equalizers - + Ecualizadores Vinyl Control - + Control de vinilo @@ -1983,7 +2000,7 @@ trace - Arriba + Perfilar mensajes Effects - + Efectos @@ -2463,12 +2480,12 @@ trace - Arriba + Perfilar mensajes Move Beatgrid Half a Beat - + Desplaza la cuadricula de tiempo medio pulso Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en pistas con tempo constante. @@ -2666,13 +2683,13 @@ trace - Arriba + Perfilar mensajes Sort hotcues by position - + Ordenar hotcues por posición Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) @@ -3527,7 +3544,7 @@ trace - Arriba + Perfilar mensajes Unknown - + Desconocido @@ -3632,32 +3649,32 @@ trace - Arriba + Perfilar mensajes ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funcionalidad provista por este mapa de controlador será desactivada hasta que el problema sea resuelto. - + You can ignore this error for this session but you may experience erratic behavior. Puedes ignorar este error durante esta sesión, pero podrías experimentar problemas impredecibles. - + Try to recover by resetting your controller. Prueba de corregirlo reseteando la controladora. - + Controller Mapping Error Error del mapa de controlador - + The mapping for your controller "%1" is not working properly. El mapa de tu controlador "%1" no funciona correctamente. - + The script code needs to be fixed. El código del script necesita ser reparado. @@ -3765,7 +3782,7 @@ trace - Arriba + Perfilar mensajes Importar cajón - + Export Crate Exportar cajón @@ -3775,7 +3792,7 @@ trace - Arriba + Perfilar mensajes Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: @@ -3801,17 +3818,17 @@ trace - Arriba + Perfilar mensajes No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) @@ -3937,12 +3954,12 @@ trace - Arriba + Perfilar mensajes Antiguos colaboradores - + Official Website Sitio web oficial - + Donate Donar @@ -3998,7 +4015,7 @@ trace - Arriba + Perfilar mensajes - + Analyze Analizar @@ -4043,17 +4060,17 @@ trace - Arriba + Perfilar mensajes Ejecuta el análisis de cuadrícula de tempo, clave musical y ReplayGain en las pistas seleccionadas. No genera formas de onda para las pistas seleccionadas para ahorrar espacio en disco. - + Stop Analysis Detener análisis - + Analyzing %1% %2/%3 Analizando %1% %2/%3 - + Analyzing %1/%2 Analizando %1/%2 @@ -4164,7 +4181,32 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modos de desvanecimiento de Auto DJ + +Intro completa + Outro: +Reproduce la intro completa y la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea el más corto. Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Desvanecer al iniciar la Outro: +Inicia el fundido cruzado al inicio de la outro. Si la outro es más larga que la intro, +corta el final de la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea más corto.Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Pista completa: +Reproduce la pista completa. Comienza el fundido cruzado desde el +número de segundos seleccionado antes del final de la pista. Un fundido cruzado negativo +agrega silencio entre las pistas. + +Saltar silencio: +Reproduce la pista completa excepto el silencio al inicio y al final. +Inicia el fundido cruzado desde el número de segundos seleccionado antes +del último sonido. + +Saltar silencio e iniciar con volumen al máximo: +Lo mismo que Saltar silencio, pero inicia la transición con el crossfader +centrado, de manera que la intro inicia con el volumen al máximo. @@ -4189,7 +4231,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Saltar silencio e iniciar con volumen al máximo @@ -4322,7 +4364,7 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Analyzer Settings - + Configuración del Analizador @@ -4344,7 +4386,7 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Re-analyze beats when settings change or beat detection data is outdated - + Re-analizar pulsaciones cuando las preferencias cambien o la información sobre pulsaciones sea obsoleta @@ -4470,37 +4512,37 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Si el mapeo no funciona, prueba a activar uno de los controles avanzados siguientes y prueba de nuevo. También puedes volver a detectar el control. - + Didn't get any midi messages. Please try again. No se detectó ningún mensaje MIDI. Por favor, inténtelo de nuevo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No se detectó un mapeado -- Intentelo nuevamente. Asegurese de tocar sólo un control a la vez. - + Successfully mapped control: Control mapeado con éxito: - + <i>Ready to learn %1</i> <i>Preparado para asignar %1</i> - + Learning: %1. Now move a control on your controller. Aprendizaje: %1. Ahora mueva un control en su controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + El control seleccionado no existe. <br>Esto es posiblemente un bug. Por favor repórtelo en el seguidor de bugs de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br> Trataste de vincular: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5198,120 +5240,120 @@ associated with each key. Key palette - + Paleta de notas DlgPrefController - + Apply device settings? ¿Aplicar la configuración del dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configuración debe ser aplicada antes de iniciar el asistente de aprendizaje. ¿Aplicar la configuración y continuar? - + None Ningún - + %1 by %2 %1 por %2 - + Mapping has been edited Se ha editado el mapeo - + Always overwrite during this session Siempre sobreescribir durante esta sesión - + Save As Guardar como - + Overwrite Sobreescribir - + Save user mapping Guardar mapeo del usuario - + Enter the name for saving the mapping to the user folder. Ingresar el nombre del archivo de mapeo para guardarlo en la carpeta de usuario. - + Saving mapping failed Ha fallado el guardado del mapeo - + A mapping cannot have a blank name and may not contain special characters. El nombre del mapeo no puede estar en blanco, ni contener caracteres especiales. - + A mapping file with that name already exists. Ya existe un archivo de mapeo con el mismo nombre. - + Do you want to save the changes? Quieres guardar los cambios? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si usas este mapeo, tu controlador podría no funcionar correctamente. Por favor selecciona otro mapeo o deshabilita el controlador. </b></font><br><br>Este mapeo fue diseñado para un nuevo Motor de Controladores de Mixxx, y no puede ser usado con tu instalación actual.<br>Tu instalación de Mixxx posee la version del Motor de Controladores %1. Este mapeo requiere una versión del Motor de controladores >=%2.<br><br>Para más información visita la wiki de <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versiones del Motor de Controladores</a>. - + Mapping already exists. El mapeo ya existe. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ya existe en la carpeta de mapeos de usuario. <br>¿Deseas sobreescribir o guardar con otro nombre? - + Clear Input Mappings Limpiar mapeos de Entrada - + Are you sure you want to clear all input mappings? Está seguro de querer eliminar todos los mapeos de entrada? - + Clear Output Mappings Limpiar mapeos de Salida - + Are you sure you want to clear all output mappings? Está seguro de querer eliminar todos los mapeos de salida? @@ -5331,62 +5373,62 @@ Apply settings and continue? Device Info - + Información del dispositivo Physical Interface: - + Interfase física Vendor name: - + Nombre del fabricante: Product name: - + Nombre del producto: Vendor ID - + ID del proveedor VID: - + VID: Product ID - + ID del producto PID: - + PID: Serial number: - + Número de serie: USB interface number: - + Número de interfaz USB HID Usage-Page: - + Página de uso HID HID Usage: - + Uso de HID: @@ -5464,7 +5506,7 @@ Apply settings and continue? Data protocol: - + Protocolo de datos: @@ -5474,7 +5516,7 @@ Apply settings and continue? Mapping Settings - + Configuración de mapeo @@ -5527,7 +5569,7 @@ Apply settings and continue? Controllers - + Controladores @@ -5537,7 +5579,7 @@ Apply settings and continue? Enable MIDI Through Port - + Activar puerto de MIDI Through @@ -5642,6 +5684,16 @@ Apply settings and continue? Multi-Sampling Multi-Muestreo + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6169,7 +6221,7 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform Export - + Exportar @@ -6200,12 +6252,12 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform ❯ - + ❮ - + @@ -6256,62 +6308,62 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. El tamaño mínimo de la apariencia seleccionada es mas grande que la resolucion de su pantalla. - + Allow screensaver to run Permite el salvapantallas - + Prevent screensaver from running Evita que se active el salvapantallas - + Prevent screensaver while playing Evita el salvapantallas mientras reproduce - + Disabled Desactivado - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Este skin no soporta esquemas de color - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx debe ser reiniciado para que el nuevo ajuste de locale, escalado o multi-muestreo tenga efecto. @@ -6348,7 +6400,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Analyzer Settings - + Configuración del Analizador @@ -6378,7 +6430,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Key Notation - + Notación de clave musical @@ -6576,7 +6628,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Metadatos significa todos los detalles de la pista (artista, titulo, cantidad de reproducciones, etc) como cuadrículas de tempo, hotcues y bucles. Este cambio solo afecta a la biblioteca de Mixxx. Ningun archivo en el disco será cambiado o eliminado. @@ -7023,7 +7075,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Reset stem controls on track load - + Reiniciar controles de stem al cargar pista @@ -7481,173 +7533,172 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Habilitado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Para activar el Planificador en tiempo real (actualmente desactivado), mira %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 muestra una lista de tarjetas de sonido y controladores que podrías considerar para utilizar con Mixxx - + Mixxx DJ Hardware Guide Guía de Hardware DJ de Mixxx - + Information Información - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx debe ser reiniciado para que el cambio de ajuste de RubberBand multi-hilo tenga efecto. - + auto (<= 1024 frames/period) auto (<= 1024 fotogramas/período) - + 2048 frames/period 2048 fotogramas/período - + 4096 frames/period 4096 fotogramas/período - + Are you sure? ¿Estás seguro(a)? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Distribuir los canales estéreo en canales mono para su procesamiento en paralelo podría resultar en la pérdida de la compatibilidad mono y una imagen estéreo difusa. No se recomienda al transmitir en vivo o al grabar. - + Are you sure you wish to proceed? ¿Realmente deseas continuar? - + No No - + Yes, I know what I am doing Sí, se lo que estoy haciendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + Main output only Solo Salida principal - + Main and booth outputs Salidas principal y de cabina - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7662,134 +7713,134 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y Sound API - + API de sonido - + Sample Rate Tasa de muestreo - + Audio Buffer Búfer de audio - + Engine Clock Relog del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa el reloj de la tarjeta de sonido para emitir a un público presente y para la menor latencia. <br>Usa el reloj de red para emitir en vivo sin un público presente. - + Main Mix Mezcla principal - + Main Output Mode Modo de Salida principal - + Microphone Monitor Mode Modo de monitorización del micrófono - + Microphone Latency Compensation Compensación de latencia del micrófono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de vaciado del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Bloqueo tonal/Motor de Pitch-bend - + Multi-Soundcard Synchronization Sincronización con Múltiples Tarjetas de Sonido - + Output Salida - + Input Entrada - + System Reported Latency Latencia reportada por el sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente su búfer de audio si el contador de desbordamiento está aumentando o escuchas chasquidos durante la reproducción. - + Main Output Delay Retardo Salida Principal - + Headphone Output Delay Retraso/delay de la Salida de auriculares - + Booth Output Delay Retraso/delay de la salida de cabina - + Dual-threaded Stereo Estéreo en doble-hilo - + Hints and Diagnostics Diagnóstico y sugerencias - + Downsize your audio buffer to improve Mixxx's responsiveness. Disminuya su búfer de audio para mejorar la velocidad de respuesta de Mixxx. - + Query Devices Consultar aparatos @@ -7843,7 +7894,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y Turntable Input Signal Boost - + Amplificación de señal de entrada de Vinilo @@ -7947,12 +7998,12 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y 1/3 of waveform viewer options for "Text height limit" - + 1/3 de visualización de forma de onda Entire waveform viewer - + Visor de forma de onda completa @@ -7985,7 +8036,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y OpenGL Status - + Estado de OpenGL @@ -8140,12 +8191,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferred font size - + Tamaño de tipo de letra preferido Text height limit - + Límite de altura de texto @@ -8185,18 +8236,18 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat grid opacity - + Superar la opacidad de la rejilla Scrolling Waveforms - + Deslizar formas de onda Type - + Tipo @@ -8206,7 +8257,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Set amount of opacity on beat grid lines. - + Establece la cantidad de opacidad en las líneas de la cuadrícula del compás. @@ -8216,17 +8267,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Play marker position - + <br><div><br data-mce-bogus="1"></div> Moves the play marker position on the waveforms to the left, right or center (default). - + Mover the marcador de posición en la pista a la izquierda, derecha o centro (Defabrica). Overview Waveforms - + Visualizar formas de onda @@ -8239,17 +8290,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Sound Hardware - + Hardware de sonido Controllers - + Controladores Library - + Biblioteca @@ -8324,12 +8375,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat Detection - + Detección de pulsaciones Key Detection - + Detección de tonalidad @@ -8344,7 +8395,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Vinyl Control - + Control de vinilo @@ -8362,7 +8413,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferences - + Preferencias @@ -8909,7 +8960,7 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Assume constant tempo - + Asumir tempo constante @@ -9349,27 +9400,27 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mejor) - + Rubberband R3 (near-hi-fi quality) Banda elástica R3 (calidad casi alta fidelidad) - + Unknown, using Rubberband (better) Desconocido, utilizando Banda elástica (mejor) - + Unknown, using Soundtouch Desconocido, usando Soundtouch @@ -9554,12 +9605,12 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Change color - + Cambiar color Choose a new color - + Escoger un nuevo color @@ -9567,32 +9618,32 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Browse... - + Examinar… No file selected - + No se ha seleccionado ningún archivo Select a file - + Seleccionar un archivo LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9604,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep de OpenGL. - + activate activar - + toggle conmutar - + right derecha - + left izquierda - + right small derecha pequeño - + left small izquierda pequeño - + up arriba - + down abajo - + up small arriba pequeño - + down small abajo pequeño - + Shortcut Atajo @@ -9662,37 +9713,37 @@ de OpenGL. Library - + This or a parent directory is already in your library. Este directorio o su superior ya se encuentra en tu biblioteca. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Este directorio o el indicado no existe o es inaccesible. Cancelando la operación para evitar inconsistencias de biblioteca. - - + + This directory can not be read. Este directorio no puede ser leído. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ha ocurrido un error desconocido. Cancelando la operación para evitar inconsistencias de biblioteca - + Can't add Directory to Library No se pudo agregar el directorio a la biblioteca - + Could not add <b>%1</b> to your library. %2 @@ -9701,27 +9752,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca %2 - + Can't remove Directory from Library No se pudo remover el directorio de la biblioteca. - + An unknown error occurred. Ha ocurrido un error desconocido. - + This directory does not exist or is inaccessible. Este directorio no existe o es inaccesible. - + Relink Directory Reenlazar directorio - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9733,27 +9784,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca LibraryFeature - + Import Playlist Importar Lista de Reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? ¿Sobrescribir archivo? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. Do you really want to overwrite it? - + Ya existe un archivo de lista de reproducción con el nombre "% 1". Se agregó la extensión predeterminada "m3u" porque no se especificó ninguna. ¿Realmente desea sobrescribirla? @@ -9899,253 +9950,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy El dispositivo de sonido está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reintente</b> luego de cerrar las otras aplicaciones o reconectar un dispositivo de sonido - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> las opciones del dispositivo de sonido de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obtenga <b>ayuda</b> del wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Salir</b> de Mixxx. - + Retry Reintentar - + skin apariencia - + Allow Mixxx to hide the menu bar? ¿Permitir a Mixxx ocultar la barra de menú? - + Hide Always show the menu bar? Ocultar - + Always show Mostrar siempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra de menú de Mixxx ha sido ocultada y se puede alternar presionando la tecla <b>Alt</b>. <br><br>Haz clic en <b>%1</b> para aceptar. <br><br>Haz clic en <b>%2</b> para desactivarlo, por ejemplo si usas Mixxx sin un teclado. <br><br>Puedes cambiar este ajuste en cualquier momento en Preferencias -> Interfaz. <br> - + Ask me again Pregúntame de nuevo - - + + Reconfigure Reconfigurar - + Help Ayuda - - + + Exit Salir - - + + Mixxx was unable to open all the configured sound devices. Mixxx no ha podido activar todos los dispositivos de sonido configurados. - + Sound Device Error Error del dispositivo de sonido - + <b>Retry</b> after fixing an issue <b>Reintenta</b> una vez corregido el problema - + No Output Devices No hay dispositivos de salida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx fue configurado sin ningún dispositivo de salida de audio. El procesamiento de audio estará desactivado mientras no se configure un dispositivo de audio de salida. - + <b>Continue</b> without any outputs. <b>Continuar</b> sin ninguna salida. - + Continue Continuar - + Load track to Deck %1 Cargar pista al plato %1 - + Deck %1 is currently playing a track. El plato %1 está reproduciendo una pista. - + Are you sure you want to load a new track? ¿Está seguro de cargar una pista nueva? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control por vinilo. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control passthrough. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this microphone. Do you want to select an input device? No se ha seleccionado un dispositivo de Entrada para este micrófono. ¿Deseas escoger uno ahora? - + There is no input device selected for this auxiliary. Do you want to select an input device? No se ha seleccionado un dispositivo de entrada para este Auxiliar. ¿Deseas escoger uno ahora? - + Scan took %1 - + El escaneo tomo %1 - + No changes detected. - + No se han detectado cambios - - + + %1 tracks in total - + %1 pistas en total - + %1 new tracks found - + Encontradas %1 pistas nuevas - + %1 moved tracks detected - + %1 pistas movidas detectadas - + %1 tracks are missing (%2 total) - + %1 pistas perdidas (%2 en total) - + %1 tracks have been rediscovered - + %1 pistas han sido reencontradas - + Library scan finished - + Escaneo de la biblioteca terminado - + Error in skin file Error en el archivo de la apariencia - + The selected skin cannot be loaded. No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering Renderizado directo de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + El renderizado directo no está habilitado en su máquina. <br><br>Esto significa que las visualizaciones de forma de onda serán muy <br><b>lentas y pueden exigir mucho a su CPU</b>. Actualice su <br>configuración para habilitar la representación directa o desactiv<br> las visualizaciones de forma de onda en las preferencias de Mixxx seleccionando <br>"Vacío" como la pantalla de forma de onda en la sección 'Interfaz'. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -10161,13 +10212,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reproducción @@ -10177,32 +10228,58 @@ Do you want to select an input device? Aleatorizar lista de reproducción - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Las listas de reproducción son listar ordenadas de pistas que te permiten planificar tus sesiones de DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Podría ser necesario saltar algunas pistas en tu lista de reproducción planificada, o añadir algunas pistas diferentes, con el fin de mantener la energía de tu audiencia. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + Create New Playlist Crear nueva lista de reproducción @@ -10212,7 +10289,7 @@ Do you want to select an input device? Mixxx Hotcue Colors - + Colores de hotcues de Mixxx @@ -10220,82 +10297,82 @@ Do you want to select an input device? Serato DJ Track Metadata Hotcue Colors - + Metadatos de colores de hotcues de pistas de Serato DJ Serato DJ Pro Hotcue Colors - + Colores de hotcues de Serato DJ Pro Rekordbox COLD1 Hotcue Colors - + Colores de hotcues de Rekordbox COLD1 Rekordbox COLD2 Hotcue Colors - + Colores de hotcues de Rekordbox COLD2 Rekordbox COLORFUL Hotcue Colors - + Colores de hotcues COLORFUL de Rekordbox Mixxx Track Colors - + Colores de pistas de Mixxx Rekordbox Track Colors - + Colores de pistas de Rekordbox Serato DJ Pro Track Colors - + Colores de pistas de Serato DJ Pro Traktor Pro Track Colors - + Colores de pistas de Traktor Pro VirtualDJ Track Colors - + Colores de pistas de VirtualDJ Mixxx Key Colors - + Colores de notas de Mixxx Traktor Key Colors - + Colores de notas de Traktor Mixed In Key - Key Colors - + Colores de notas de Mixed In Key Protanopia / Protanomaly Key Colors - + Colores de notas de Protanopia/Protanomalía Deuteranopia / Deuteranomaly Key Colors - + Colores de notas de Deuteranopía/Deuteranomalía Tritanopia / Tritanomaly Key Colors - + Colores de notas de Tritanopía/Tritanomalía @@ -10429,7 +10506,7 @@ Do you want to scan your library for cover files now? Switch - + Switch @@ -10514,7 +10591,7 @@ Do you want to scan your library for cover files now? Vinyl Control - + Control de vinilo @@ -10879,7 +10956,7 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p The Mixxx Team - + Equipo de Mixxx @@ -10909,12 +10986,12 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p Gain - + Ganancia Set the gain of metronome click sound - + Configura la ganancia del sonido del metrónomo @@ -11863,7 +11940,7 @@ Consejo: compensa las voces de "ardillitas" o "gruñonas"La cantidad de amplificación aplicada a la señal de audio. A niveles más altos, el audio estará más distorsionado. - + Passthrough Paso @@ -12033,12 +12110,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. varios - + built-in nativo - + missing no encontrado @@ -12166,54 +12243,54 @@ pueden introducir un efecto de "bombeo" y/o distorsión. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listas de reproducción - + Folders Carpetas - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Accesos Directos - + Loops (only the first loop is currently usable in Mixxx) Bucles (solo el primer bucle es utilizable en Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Buscar dispositivos de almacenamiento Rekordbox (refrescar) - + Beatgrids Grillas de pulsos - + Memory cues Cues en memoria - + (loading) Rekordbox (cargando) Rekordbox @@ -12655,22 +12732,22 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Reading track for fingerprinting failed. - + Ha fallado la lectura de la pista para fingerprinting Identifying track through AcoustID - + Identificando pista mediante AcoustID Could not identify track through AcoustID. - + No se pudo identificar la pista mediante AcoustID. Could not find this track in the MusicBrainz database. - + No se pudo encontrar esta pista en la base de datos de MusicBrainz. @@ -12934,7 +13011,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Vinyl Control - + Control de vinilo @@ -13242,7 +13319,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Toggle visibility of Rate Control - + Alternar visibilidad del control de velocidad @@ -13392,7 +13469,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. - + Mantener el clic izquierdo permite previsualizar la posición donde la cabeza de reproducción saltará al soltarlo. El arrastre puede ser abortado con el clic derecho. @@ -13442,12 +13519,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Shows the current volume for the left channel of the main output. - + Muestra el volumen actual para el canal izquierdo en la salida principal. Shows the current volume for the right channel of the main output. - + Muestra el volumen actual para el canal derecho de la salida principal. @@ -13459,27 +13536,27 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Adjusts the main output gain. - + Ajusta el volumen principal Determines the main output by fading between the left and right channels. - + Determina la salida principal desvaneciendo entre los canales izquierdo y derecho. Adjusts the left/right channel balance on the main output. - + Ajusta el balance de los canales izquierdo/derecho en la salida principal. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Desvanecimiento cruzado de la salida de auriculares entre la salida principal y la señal de cueing (PFL o Escucha Pre-Deslizador) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si se activa, la señal principal de la mezcla se reproduce en el canal derecho, mientras que la señal de cueing se reproduce en el canal izquierdo. @@ -13494,12 +13571,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Show/hide the beatgrid controls section - + Mostrar/ocultar la sección de controles de la cuadrícula de tiempo Show/hide the stem mixing controls section - + Mostrar/ocultar la sección de controles de mezcla de stems @@ -13509,17 +13586,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Volume Meters - + Medidores de volumen mix microphone input into the main output. - + mezcla la entrada de micrófono con la salida principal. Auto: Automatically reduce music volume when microphone volume rises above threshold. - + Auto: reduce automáticamente el volumen de la música cuando el volumen del micrófono supera el umbral. @@ -13530,17 +13607,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: configura cuánto se reduce el volumen de la música cuando el volumen de los micrófonos activos supera el umbral. Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + Manual: configura cuánto reducir e If keylock is disabled, pitch is also affected. - + Si el bloqueo tonal se desactiva, la altura también es afectada. @@ -13555,7 +13632,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Raises playback speed in small steps. - + Incrementa la velocidad de reproducción en pasos pequeños. @@ -13570,7 +13647,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Lowers playback speed in small steps. - + Reduce la velocidad de reproducción en pasos pequeños. @@ -13580,12 +13657,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed higher while active (tempo). - + Mantiene la velocidad de reproducción alta cuando se activa (tempo). Holds playback speed higher (small amount) while active. - + Mantiene la velocidad de reproducción alta (pequeña cantidad) cuando se activa. @@ -13595,59 +13672,60 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed lower while active (tempo). - + Mantiene la velocidad de reproducción baja cuando se activa (tempo). Holds playback speed lower (small amount) while active. - + Mantiene la velocidad de reproducción baja (pequeña cantidad) cuando se activa. When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Cuando se pulsa repetidamente, ajusta el tempo para coincidir con la frecuencia de pulsaciones. Tempo Tap - + Seguidor de Tempo (Tempo Tap) Rate Tap and BPM Tap - + Frecuencia de pulsaciones y de BPM Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en +pistas con tempo constante Revert last BPM/Beatgrid Change - + Revierte el último cambio de BPM/cuadrícula de tiempo Revert last BPM/Beatgrid Change of the loaded track. - + Revierte el último cambio de BPM/Cuadrícula de tiempo para la pista cargada. Toggle the BPM/beatgrid lock - + Cambia el bloqueo de BPM/cuadrícula de tiempo Tempo and Rate Tap - + Toques de Tempo y Frecuencia Tempo, Rate Tap and BPM Tap - + Toques de Tempo, Frecuencia y BPM @@ -13663,79 +13741,79 @@ tracks with constant tempo. Left click: shift 10 milliseconds earlier - + Clic izquierdo: adelantar 10 milisegundos Right click: shift 1 millisecond earlier - + Clic derecho: adelantar 1 milisegundo Shift cues later - + Retrasar cues Left click: shift 10 milliseconds later - + Clic izquierdo: retrasar 10 milisegundos Right click: shift 1 millisecond later - + Clic derecho: retrasar 1 milisegundo Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Arrastra un botón de Hotcue aquí para continuar reproduciendo después de soltar la hotcue. Hint: Change the default cue mode in Preferences -> Decks. - + Sugerencia: cambie el modo por defecto de las cues en Preferencias -> Platos. Mutes the selected channel's audio in the main output. - + Silencia el audio del canal seleccionado en la salida principal. Main mix enable - + Activador de mezcla principal Hold or short click for latching to mix this input into the main output. - + Clic sostenido o corto para enganchar, para mezclar esta entrada con la salida principal. If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + Si la hotcue es una cue de bucle, activa el bucle y salta hacia él si se encuentra detrás de la posición de reproducción. If the play position is inside an active loop, stores the loop as loop cue. - + Si la posición de reproducción se encuentra dentro de un bucle activo, almacena el bucle como una hotcue de bucle. Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Arrastrar este botón dentro de otro botón de hotcue para moverlo hacia este (cambiando su número). Si la otra hotcue ya se encuentra definida, las dos son intercambiadas. Expand/Collapse Samplers - + Expandir/contraer samplers Toggle expanded samplers view. - + Alternar la vista expandida de los samplers. @@ -13745,12 +13823,12 @@ tracks with constant tempo. Auto DJ is active - + Auto DJ se encuentra activo Red for when needle skip has been detected. - + Rojo cuando se detecta un salto de aguja. @@ -13790,7 +13868,7 @@ tracks with constant tempo. If the track has no beats the unit is seconds. - + Si la pista no tiene pulsaciones, la unidad es segundos. @@ -13830,12 +13908,12 @@ tracks with constant tempo. Beatloop Anchor - + Ancla del bucle de pulsaciones Define whether the loop is created and adjusted from its staring point or ending point. - + Define si el bucle es creado y ajustado desde su punto de inicio o de final. @@ -13930,12 +14008,12 @@ tracks with constant tempo. Hint: Change the time format in Preferences -> Decks. - + Sugerencia: cambie el formato de tiempo en Preferencias -> Platos. Show/hide intro & outro markers and associated buttons. - + Mostrar/ocultar marcadores de intro y outro, y sus botones asociados. @@ -13948,7 +14026,7 @@ tracks with constant tempo. If marker is set, jumps to the marker. - + Si el marcador se encuentra definido, salta al marcador. @@ -13956,7 +14034,7 @@ tracks with constant tempo. If marker is not set, sets the marker to the current play position. - + Si el marcador no se encuentra definido, lo configura a la posición de reproducción actual. @@ -13964,7 +14042,7 @@ tracks with constant tempo. If marker is set, clears the marker. - + Si el marcador se encuentra definido, lo elimina. @@ -13989,7 +14067,7 @@ tracks with constant tempo. Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajuste la mezcla de la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos @@ -13999,7 +14077,7 @@ tracks with constant tempo. D+W mode: Add wet to dry - + Modo D+W: agregue húmedo a seco @@ -14009,24 +14087,25 @@ tracks with constant tempo. Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajuste cómo se mezcla la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Modo seco / húmedo (líneas cruzadas): Mezcle los fundidos cruzados de la perilla entre seco y húmedo. Use esto para cambiar el sonido de la pista con EQ y efectos de filtro. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Modo Seco+Húmedo (línea seca plana): La perilla de mezcla agrega mojado a seco +Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efectos de filtrado. Route the main mix through this effect unit. - + Enruta la mezcla principal a través de esta unidad de efectos. @@ -14046,42 +14125,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Stem Label - + Etiqueta de stem Name of the stem stored in the stem file - + Nombre del stem almacenado en el archivo de stem Text is displayed in the stem color stored in the stem file - + El texto es presentado con el color del stem almacenado en el archivo de stem this stem color is also used for the waveform of this stem - + este color de stem también es usado en la forma de onda de este stem Stem Mute - + Silenciar stem Toggle the stem mute/unmuted - + Alterna el silencio del stem Stem Volume Knob - + Perilla de volumen del stem Adjusts the volume of the stem - + Ajusta el volumen del stem @@ -14349,7 +14428,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Inactive: parameter not linked - + Inactivo: parámetro no enlazado @@ -14565,17 +14644,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Left click to jump around in the track. - + Clic izquierdo para saltar a lo largo de la pista. Right click hotcues to edit their labels and colors. - + Click derecho en los accesos directos para editar sus etiquetas y colores. Right click anywhere else to show the time at that point. - + Clic derecho en cualquier otra parte para mostrar el tiempo en ese punto. @@ -14670,7 +14749,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Maximize Library - + Maximizar Biblioteca @@ -14685,7 +14764,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Changes the number of hotcue buttons displayed in the deck - + Cambia el número de botones de acceso directo mostrados en el deck @@ -14711,12 +14790,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Opens the track properties editor - + Abre el editor de propiedades de pista Opens the track context menu. - + Abre el menú contextual de la pista @@ -14818,12 +14897,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drag this button onto a Play button while previewing to continue playback after release. - + Arrastre este botón a un boton de Play durante la preescucha para continuar la reproducción tras soltarlo. Dragging with Shift key pressed will not start previewing the hotcue. - + Arrastrar mientras presiona la tecla Shift no iniciará la preescucha de la hotcue. @@ -15257,22 +15336,22 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Replace Existing File? - + ¿Reemplazar el archivo existente? "%1" already exists, replace? - + "%1% ya existe, ¿reemplazar? &Replace - + &Reemplazar Apply to all files - + Aplicar a todos los archivos @@ -15371,7 +15450,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. frameSwapped-signal driven phase locked loop - + Bucle con bloqueo de fase manejado por señal con marco cambiado @@ -15397,12 +15476,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. No color - + Sin color Custom color - + Color personalizado @@ -15455,47 +15534,47 @@ Carpeta: %2 WCueMenuPopup - + Cue number - + Número de cue - + Cue position Posición Marca - + Edit cue label Editar etiqueta de marca - + Label... - + Etiqueta... - + Delete this cue Borrar esta marca - + Toggle this cue type between normal cue and saved loop - + Alterna el tipo de esta cue entre cue normal y bucle guardado - + Left-click: Use the old size or the current beatloop size as the loop size - + Clic izquierdo: usar el tamaño anterior o el del bucle actual como el tamaño de bucle - + Right-click: Use the current play position as loop end if it is after the cue - + Clic derecho: usar la posición de reproducción actual como final del bucle si se encuentra después de la cue - + Hotcue #%1 Acceso DIrecto #%1 @@ -15510,7 +15589,7 @@ Carpeta: %2 Rename Preset - + Renombrar preajuste @@ -15620,407 +15699,437 @@ Carpeta: %2 - Create &New Playlist + Search in Current View... + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + Crear &nueva Playlist + + + Create a new playlist Crear una nueva lista de reproducción - + Ctrl+n Ctrl+N - + Create New &Crate Crear un nuevo&cajón - + Create a new crate Crear un nuevo cajón - + Ctrl+Shift+N Ctrl+Mayús+N - - + + &View &Vista - + Auto-hide menu bar - + Auto-ocultar barra de menú - + Auto-hide the main menu bar when it's not used. - + Auto-ocultar la barra de menú principal cuando no es utilizada. - + May not be supported on all skins. Puede no estar disponible para todas las apariencias. - + Show Skin Settings Menu Mostrar menú de ajustes de aspecto - + Show the Skin Settings Menu of the currently selected Skin Mostrar la configuración actual del menu de tema - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar seccion del microfono - + Show the microphone section of the Mixxx interface. Muestra la sección de control de micrófono de la interfaz de Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar la Sección de Control de Vinilo - + Show the vinyl control section of the Mixxx interface. Muestra la sección de control de vinilo de la interfaz de Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar el reproductor de preescucha - + Show the preview deck in the Mixxx interface. Muestra el reproductor de preescucha en la interfaz de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Muestra carátulas - + Show cover art in the Mixxx interface. Muestra las carátulas en la interfaz de Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximizar la biblioteca para tomar todo el espacio disponible en pantalla. - + Space Menubar|View|Maximize Library - + Espacio - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Mostrar Mixxx a pantalla completa - + &Options &Opciones - + &Vinyl Control Control de &vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con codigo de tiempo en bandejas externas para controlar Mixxx - + Enable Vinyl Control &%1 Habilita el Control por Vinilo &%1 - + &Record Mix &Grabar Mezcla - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar transmisión en &vivo - + Stream your mixes to a shoutcast or icecast server Transmite tus mezclas a un servidor shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar Atajos de &Teclado - + Toggles keyboard shortcuts on or off Activa o desactiva los atajos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar la configuración de Mixxx (p.ej.: reproducción, MIDI, controles) - + &Developer &Desarrollador - + &Reload Skin &Recargar apariencia - + Reload the skin Recargar la apariencia - + Ctrl+Shift+R Ctrl+Mayús+R - + Developer &Tools U&tilidades de desarrollador - + Opens the developer tools dialog Abre el cuadro de diálogo de herramientas de desarrollo - + Ctrl+Shift+T Ctrl+Mayús+T - + Stats: &Experiment Bucket Estadísticas: Contadores &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el modo experimental. Recoje estadísticas en los contadores EXPERIMENT. - + Ctrl+Shift+E Ctrl+Mayús+E - + Stats: &Base Bucket Estadísticas: contadores &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el modo base. Recoje estadísticas en los contadores BASE. - + Ctrl+Shift+B Ctrl+Mayús+B - + Deb&ugger Enabled Dep&uración activada - + Enables the debugger during skin parsing Activa el depurador durante el análisis de la máscara - + Ctrl+Shift+D Ctrl+Mayús+D - + &Help Ay&uda - + Show Keywheel menu title - + Mostrar rueda de notas E&xport Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ Export the library to the Engine DJ format - + Exportar biblioteca al formato Engine DJ - + Show keywheel tooltip text - + Mostrar rueda de notas - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Soporte &comunitario - + Get help with Mixxx Obtener ayuda con Mixxx - + &User Manual Manual de &usuario - + Read the Mixxx user manual. Lea el manual de usuario de Mixxx. - + &Keyboard Shortcuts Atajos de &Teclado - + Speed up your workflow with keyboard shortcuts. Trabaja más rápidamente usando los atajos de teclado. - + &Settings directory &Directorio de configuración - + Open the Mixxx user settings directory. Abre el directorio de configuración de usuario de Mixxx. - + &Translate This Application &Traducir esta aplicación - + Help translate this application into your language. Ayude a traducir esta aplicación a su idioma. - + &About &Acerca de - + About the application Acerca de la aplicación @@ -16036,7 +16145,7 @@ Carpeta: %2 Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - + Listo para reproducir, analizando... @@ -16049,31 +16158,19 @@ Carpeta: %2 Finalizing... Text on waveform overview during finalizing of waveform analysis - + Finalizando... WSearchLineEdit - - Clear input - Clear the search bar input field - Borrar el texto - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input Borrar el texto @@ -16084,93 +16181,87 @@ Carpeta: %2 Buscar... - + Clear the search bar input field - + Limpia el campo de entrada de la barra de búsqueda - - Enter a string to search for - Introducir el texto a buscar + + Return + Volver - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library - Para más información vea el Manual de Usuario> Biblioteca Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Atajo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Poner el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retroceso + + Additional Shortcuts When Focused: + - Shortcuts - Atajos + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Activa la búsqueda antes del tiempo de espera de "búsqueda mientras escribe" o salte a la vista de pistas después + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Ctrl+Espacio - + Toggle search history Shows/hides the search history entries - + Alternar historial de búsqueda - + Delete or Backspace Borrar o Retorno - - Delete query from history - Borrar Consulta del Historial - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Salir de la busqueda + + Delete query from history + Borrar Consulta del Historial @@ -16178,7 +16269,7 @@ Carpeta: %2 Search related Tracks - + Buscar pistas relacionadas @@ -16188,7 +16279,7 @@ Carpeta: %2 harmonic with %1 - + armónico con %1 @@ -16198,7 +16289,7 @@ Carpeta: %2 between %1 and %2 - + entre %1 y %2 @@ -16248,7 +16339,7 @@ Carpeta: %2 &Search selected - + &Búsqueda seleccionada @@ -16286,7 +16377,7 @@ Carpeta: %2 Update external collections - + Actualizar colecciones externas @@ -16296,12 +16387,12 @@ Carpeta: %2 Adjust BPM - + Ajustar BPM Select Color - + Seleccionar color @@ -16469,12 +16560,12 @@ Carpeta: %2 Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) Sort hotcues by position - + Ordenar hotcues por posición @@ -16519,7 +16610,7 @@ Carpeta: %2 Shift Beatgrid Half Beat - + Desplazar la cuadrícula de tiempo medio beat @@ -16607,7 +16698,7 @@ Carpeta: %2 Undo BPM/beats change of %n track(s) - + Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s) @@ -16622,7 +16713,7 @@ Carpeta: %2 Setting rating of %n track(s) - + Definiendo evaluación de %n pistaDefiniendo evaluación de %n pistasDefiniendo evaluación de %n pista(s) @@ -16677,12 +16768,12 @@ Carpeta: %2 Sorting hotcues of %n track(s) by position (remove offsets) - + Ordenando hotcues de %n pista por posición (removiendo desfases)Ordenando hotcues de %n pistas por posición (removiendo desfases)Ordenando hotcues de %n pistas(s) por posición (removiendo desfases) Sorting hotcues of %n track(s) by position - + Ordenando hotcues de %n pista por posiciónOrdenando hotcues de %n pistas por posiciónOrdenando hotcues de %n pista(s) por posición @@ -16707,7 +16798,7 @@ Carpeta: %2 Move these files to the trash bin? - + ¿Mover estos archivos a la papelera? @@ -16733,7 +16824,7 @@ Carpeta: %2 Okay - + Okey @@ -16783,7 +16874,7 @@ Carpeta: %2 Remaining Track File(s) - + Renombrando archivo(s) de pista @@ -16794,7 +16885,7 @@ Carpeta: %2 Clear Reset metadata in right click track context menu in library - + Climpiar @@ -16804,37 +16895,37 @@ Carpeta: %2 Clear BPM and Beatgrid - + Limpia las BPM y la cuadrícula de tiempo Undo last BPM/beats change - + Revertir el último cambio de BPM/pulsaciones Move this track file to the trash bin? - + ¿Mover este archivo de pista a la papelera? Permanently delete this track file from disk? - + ¿Eliminar permanentemente este archivo de pista del disco? All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + Todos los platos donde estas pistas hayan sido cargadas se detendrán, y las pistas serán expulsadas. All decks where this track is loaded will be stopped and the track will be ejected. - + Todos los platos donde esta pista haya sido cargada se detendrán, y la pista será expulsada. Removing %n track file(s) from disk... - + Removiendo %n archivo(s) de pista del disco... @@ -16854,12 +16945,12 @@ Carpeta: %2 Don't show again during this session - + No mostrar nuevamente durante esta sesión The following %1 file(s) could not be moved to trash - + El/los siguiente(s) %1 archivo(s) no pudieron ser movidos a la papelera @@ -16882,7 +16973,7 @@ Carpeta: %2 title - + título @@ -16890,73 +16981,73 @@ Carpeta: %2 Load for stem mixing - + Cargar para mezcla de stems Load pre-mixed stereo track - + Cargar pista estéreo premezclada Load the "%1" stem - + Cargar el stem "%1" Load multiple stem into a stereo deck - + Cargar múltiples stems en un plato estéreo Select stems to load - + Seleccionar stems a cargar Release "CTRL" to load the current selection - + Soltar "Ctrl" para cargar la selección actual Use "CTRL" to select multiple stems - + Use "Ctrl" para seleccionar múltiples stems WTrackTableView - + Confirm track hide Confirmar ocultar pista - + Are you sure you want to hide the selected tracks? ¿Estas seguro de que quieres ocultar las pistas seleccionadas? - + Are you sure you want to remove the selected tracks from AutoDJ queue? ¿Esta seguro de que quiere eliminar las pistas seleccionadas de la cola del AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Estás seguro que quieres eliminar las pistas seleccionada de este cajón? - + Are you sure you want to remove the selected tracks from this playlist? ¿Esta seguro de que desea eliminar las pistas seleccionadas de la lista de reproducción? - + Don't ask again during this session No volver a preguntar durante esta sesión - + Confirm track removal Confirmar eliminación del track @@ -16971,58 +17062,58 @@ Carpeta: %2 Shuffle Tracks - + Mezclar pistas mixxx::CoreServices - + fonts tipos de letra - + database base de datos - + effects efectos - + audio interface interface de sonido - + decks - + decks - + library Biblioteca - + Choose music library directory Elija el directorio de la biblioteca de la música - + controllers Controladores - + Cannot open database No se puede abrir la base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17036,70 +17127,80 @@ Pulse Aceptar para salir. mixxx::DlgLibraryExport - + Entire music library + Biblioteca de música completa + + + + Crates - - Selected crates - Cajas seleccionadas + + Playlists + - + + Selected crates/playlists + + + + Browse Ver - + Export directory - + Exportar directorio - + Database version - + Versión de base de datos - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ - + Export Library To - + Exportar biblioteca a - + No Export Directory Chosen - + No se seleccionó un directorio de exportación - + No export directory was chosen. Please choose a directory in order to export the music library. - + No se escogió un directorio de exportación. Por favor escoja un directorio para poder exportar la biblioteca de música. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + Una base de datos ya existe en el directorio seleccionado. Las pistas exportadas serán añadidas a esta base de datos. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - + Una base de datos ya existe en el directorio seleccionado, pero ocurrió un problema al cargarla. No se garantiza una exportación exitosa en esta situación. @@ -17118,34 +17219,35 @@ Pulse Aceptar para salir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message - + Fallo al exportar %1 - %2: +%3 mixxx::LibraryExporter - + Export Completed - + Exportación completada - - Exported %1 track(s) and %2 crate(s). - Exportados %1 pista(s) y %2 caja(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed - + Exportación fallida - + Exporting to Engine DJ... - + Exportando a Engine DJ... @@ -17153,7 +17255,7 @@ Pulse Aceptar para salir. Abort - + Abortar diff --git a/res/translations/mixxx_es_ES.qm b/res/translations/mixxx_es_ES.qm index 810af7d212c0a28632d35156a46e084b25aa4d39..8d85ae979c81c8ad4690af7a626cdc466a93ce1a 100644 GIT binary patch delta 54665 zcmXV&cR)`67st=%e#TwN-ee?XWR)!=tB{pdMA<7VBclhELb9n4AtDlGlOm%~Mj|64 zdu02{$nSKY-(RoidDPRrpU?T6^FHHR7gRO;TlF>7O`}f$fHgqXIY=8I584})1|Bd- zU2h?q0(Dq`Yz8oVia|Qt7TFwN#1W)DfM@adv<4V?57`-{O#_f!K-!F-ffMoxvMWdt z#oyNrq{vms?qHI(t;H8TK#FRE>p-|*lka`s& zH{c({3uQC$5Becz0dpIOoC~baIOHPyd>3*lUcg9X07%^xidW(Wav4b9zv2$y&-JbW(7u@XJ?-&Ae&7Xk8wli`CvqD|;WF|O zkgxdtrXGC&s^h*Ev)L&#XW}2n_jFB+LDu`RK@tB4ITM%I4!Ij7>k(!iod?jf5fFde zDx^4x|K78BiI*es4{mz~;M@ho#v&xXkHT$qISLS@fvNZfA9xm^7yd$I9zdV&xNS?2 zOMv{Yh+GD=_eX@CWw+1WW^RJ^fX5%*9{Qwdv z0P-5`V(Kh3HhYlre1ZH+1X_0~P^a%eyL3mJ+K9x98U6!k*Iyu+zPAP11C8YSM4-XN z#!>^=Yz_B5%gjAtz~Z(5^S)?Mr1nBy09a-Z>=543_(WjGx&b*h2AKzJBECQQ5!kE{ zV3%WngyZWh28`|jcB30eo?n37MLXE`)}V>a`)j=5fw{mQHUjByQ(&(H(FX1UdylV~ z53r9h$Q{Ug`0wKl(!scG_@0>ruphgD{CWUfLp$<_243eV+D0Yd4qE^!*cc?!7Z_w! zhMW0oAn;a2CSa>S18?V#d-@P~_r7QpK?bRv3cRNSfb9@7hvgZh7wZ}1m6`zWjZ6RL zxj~-mg!~5Z&dngdUjV$%e2^OK20j??yhgr3Dt!a)wH!p&HsIq-$si)j0Uv(>$Y)RB zGnWH=A8nAoC<%Pd2HeBHz(a5a_AuaK0U*7mz$5$t>=F!03B3%mCYyk7?FuZx7I<_K zkovt1N-jF^od9GTe!e#!sO4lcS2P4}iW>#QZXWQ1c%_ZgfG0QryMqRp-~^;)Rf8<0 z8}O8|7$%0A*~-hHq%<%{C-pG%;uwRx60YR$rTFuqX0}>qkcL{AxqFs0M)je+04!$U2J9M>T_ns{4yxwM}eO03%pBB6O^3(8DL%@lv;QTsKXs7z1tF4 zv<9W$p9j`23d-zW1QIwv*`%33CuTr-xiyH75>%Mx3{qb^sOYd9*xtubaU-6JYagLX zH-8W|-J!h-W1AXBL)}MQV^t2t=m^K2jwKpi5nkquwLC(>kIV%_UX_#y*WrPpMu@sY+%dd!ER^| zqz~8?N5V_Ppvfs85N-NF(@H0RG(7|@pf(}dqYgX4q1can zPlZdjXxVVOBXmd)1hI4? z^stY{IL@HQrVSvMTM9jG@qAaCU}n=_2B}udOw$K5SFbiR=AxMy-ORkY!^~?x42t+V z(DT1?c>W*k2j_9Izy|n&OGC8U`6mtX-qj3>v(v%F0Uc7nV&oR!t`)$gCGKGo{v1-A zy8HN!6jZz8hd|kU_p^H1zIq5?yRO^pWuQ$1I0F)hvORx(9tO z1_9K_G1H-vLGo*-K^m@^xo@38ap)qrnl_~Xc+3FT9sL1D|AW3f5nXJgL0Wc!ncZ4L zzaeQr+ch+^+g#|E5(c7Q4e0kN0;KwtVZaJJEseXtfD>UrQftA0YiEFkR)>Kj&=LKe z4Fku`0+Bu*22R=s)M5a*S)K>TEd!?F7j%{txZ%=}q8s2AumW9XDKkUc!=Q;AJzyUg z{CXp>t$SdI7LKy5ISjdS2P5B6Gjn}lXti1ZW5Qr);2mHwxiECaKRlNEVd&XpjH(QV zUX1{9p^ZTrGTb23TA5(j_zl1g=-@sc_cEp?xKE4%KKCiOPfh~TXs$ta>LIwtCZaC* z4en{vKy>&C9=Z)c?L0GEelT;mW{_I$F>__CnY%`sd9b3HSI3!o&2-lMBGcNSNcaLC zW8(p0dVw};`&a7Bi1 zN4bcO?9gWz@zfFoX$vEMqb)u0f{|Tt=`Sw^uZ<2s4mJm`uSMwpx2M2p2fX8b0!Dj} z0f^iWV?8bcnb!}-qDzLV9boKr48eca!}ulFqpkd}@yvrY^|_RxVelVQuu+d$ehf~|WpfDNh+ zQDLa}PVR#3HRFLzC=c6v90s;gh3NMM0QFnIu8Lv6FRXxFS&qOjc7@#+Od3GBRuI$a z1@N3G*kd&sqyg_>Pp|~M!YYUj%0^xH1Y&pMUY)85`yZiJ9PuB-J;Y;oFBRg`U4dL| z3WvNWpc+br1do#dcLqU1Hg4%KS4hk#)&oP}*dcVmeR{%)uqr6+{+PKZ1x}d4iubNH zoLuG!kns#o-bG!vrzM=4kPmeE9XNd;3Iv}GsZAV#WLAQ-Hoibllz_`aTI2aX1efQw z#`A3pmkZFi`c8u@3sC{>C;{ni5dar2K>AGd2hTJ}--KbiQ7l|rwFac@IdE+c`jbi(3$w1>e`9@Kh(j_xx)h?X-sfoE%ZsuYzBdcY*jZ5&jfk=;FG!%-y_~4yPgnvgd3!eRkz@_HE-n=BlrwG^>PRL`FQ%k-P>Wc}(?#gB! zTuyj>OMs)kM81oOv)fRjOs$0q_zzJdtw0RRB>GVX@Xf*?&u>R8pI8FVyHCmwx&Tr) zPAVKqNBuwLBdJs|62zrCq;g~Q(FqGlm5>5p{0yn?IT{m;tEBp7Jf1^hiPcb7kV^L= zwRYJ8gdHQ+Syrf&Kao0H{DHknC3R2X?=@&n>QzeyUQH$qzA{uud(0epgfvXO2O@Sb zX)**e;Dwz?lewvw|1D@vnktzft*uO&z3~OnC!e%Y=+%hub&O&C1#YG^;l0-U0XgzgW`!38q~S-jnXnkPp2`-x=sq3tEza z3Acd%Jxd1u$^&u!A{iRz2QrBy?ygNR(TFF*-E%?Qwk4kB(3ZyjBO{|7f#=R4qr5Xg ze40x}#aV$gXD#u1?18GoX*1RAms~H4~qT9-Dx79QZW zQP3FJrEBD-R0qWBSaQ?%Bany<$vVVGF z{9nF=;l>p>bmkmO>@1yf#<`%&dVnh`)Af)%hT zAIL*nbU=Iel1FWafyiA?^6Yj2tNV!L9g%zwjH`sw72 zFP^HY%%F+P4IrPIV!fvEO!8?<6bO$$)Hp4mt9H}hTJ%l&# z@~%|(Wbyk~Qo}w2fJCn{D23Zg4YN!ZAY494jV$f}?bu4P`}G`1=bHvacSoto#axj3 z$4X64qbpt2QEJ}2FR-tHQj1si09z(V4k>uSVe_PxkQ!r0aa7e#=#$e5TZY z`Fboqc9sTgLRY>ZPZ~6df^>hVG&DRD=-5Bf&@Jfj&Us0uk^S%&%3qX5?n2}H-a_)~ zg$^lwvovNODxW?}q%r@JfwxGP#$Lm%c(F>F;GPV`Yr8bzGpgE;OQeabgMqr0l_ov^ z5BQ_%$RglFrb&}4qH)f8E=~8o4b<_OG{4zn3o+1T&`~qTf6)8}{FYNtX3OtW{y?C({m^Bs1=qM?u2>042Q3`SJ z1Rga&3h@ZTe4wV8EyE0ohts4L@2vpZ=1ZXsu#gcvLRxEyY5vx)X2zL9r41+g0}bqF zP|PbKMK&WqrnHkHyMF=FKVRCuq%07phSH9M`$4SvEbS;N3sT5wX?OU3kS(f6F_ST^ zPE3>bly|~>;Ec4_23>LW&(hvaX_!UZNwIU=V0~b+nI_%LRTKaJe)n1_cC!OWQmz!c z!xkmeDQSOkc6%?*AT>Ejak&_;Q?^P6ZMp&dZ<%zMZ3NgkP&)D;7t3p22FdgUDe)r; zirw9% z$81U;DK)7Oh)ZqhlFd%6qL!B~rQnVD9+WQKMxzVAE?tRn1d=#OO2^tC9NQyhq|C#3Bz z)DfWLASwHSABZ#bdWJS$f_W>$7-;I>G@f#a4v5wJ^zN8&n-oISr7I6 zlThj1I!j;&HM7IxA%RCSK$~bD$?xHm}=uNe+_=R&@P>WE^_xntw78z)C3*XQZnP^1W zN2z6$KZu4kX-O!+Y?#rKRj~|rbt*0S2#qf12`v-l3hWc1<<4QbepE$TF~$evl9y=J zs;R)so~2czv1loW(K=OH04>ph)@^|oysDgu+D`HT>Gn|C;8ij}Y)jhkA_L|ylQ!yx zGJMrQYS#v(S4EXJB^bp%t)|VZp!F|)MD1haK}3wFZJJ_9e&I&ira5ZJTZFb5>xU)Q zhqUeA`xr|m(hid>L9EN59c|F}cWy~L=HZGs-KU)kj$<|46iS_lC$RQoktm}(yr5ls zqt%z2K)Y_k0z}0XWET$aWAnI#QQVwC>6|)Fo#fkg6fnHLWjx z{(-s{JErN)Y2U%?L9%f(v*ji_XrnX0jeT@*=`f(NgX!RgC~{42XVD?!|DiT(ONSPB zr;^rE4__?3ziCE2_T#Cz!s&>5_8@YisONE%U|0Uqk-f_RzY|PH??s!K=1IqF#L7ud zPdctnJSH+$blh}o+hmrZ(5DFFH+U z^}{=J3#7AQF3^FE>FhyRNQOu{yZDN;#u}vUo6>m!=-KwIq4NT*f!*__3(o|AbZ!V; zGzyhbialMlvNEuOa@4d1MQP4yYD!54;f2M}S9ttl66j*~8Kk!>>EcSksFDxU#YKK5 zkhTA4fN|&PG{Dyit@{xTob8FOb}|imi9UV19bI-Db^Xv5GY?pR~mNb0jgaex?$@sAf5Uc6x~AU#xo;zp`wt6y% zpCjpsmv$Hxb$Z%_2?vX*P0tUF#zH-j{Mnn96v zj9&3VBWiS$UU^#tFt(OKUN4lU59^AZj`=j>ZzrrBZKv0c;7ab?OEcG&17XpaX31#m zrU-hY2I`8wfz)*4Y8NcCcc8cKrGW4)NpHW#P6%6a(X!Gfd6|3dH0z?J#=jy`n3ynfjv`mp%>`fjIrA@RU{`qC!_qd}y`)2B6; z0-yhuJ`Kivz@{&Kmd{ZW?l938d%J>g-AG^0^#M^gn!c&Qfhz6jn~#nlD%_)QN5lgi z(2f>BCeT0q=%+58z&}@}UnbzzcpflwOcwo;gSHX(g?{T>1L(qU^xF~KV>e&=eX1L< z)g|fASD3!vN~A>%u-+KElm0u7J;OMY4db>LT=pk2*%@1BE&ed0qw#PDQ+pKv|5l5s zAx|+KAIP-XQ6SduW7>{Zz+O5ty*dSU=nJ#Jx*xyOn3evElIp=FR(6UN5Vz~B>>CuZ z2OqPF^~Zx$b1$njeGEt+HnJ+w7lC(-VO5(A#QcB25>|B;ipkAgnblSdyQh}18qM(d zxeaDD9-)V;R>W#y(kM(#nYFtcz?uwZy(JAurGczYk1inQc4l?$Z-L} z1U}Y@buPdg7*&OJPr{z!tX$T+20E%Go0x0K-XNNlVEuxy?e^$1>;D?JGHDhYwA|4I zeAFB^xQsuD5}XYljfq5)j%?`qvH)|f*sw8p=l@PHj|J%2dTd}LKKr9}S7e?aP-xsL z&Bi%}p*CE_#`$9qTiKM2JAiH0KGoQSLq$N&?qpNut^vsZ#C#g(qU9n}ENU^_$I`c?DRHPHcXHCy=32&2+EF7FN88r>7J1Pe7efdm1xU3qeWt ziY;xk8`#BY7HF~zz*0#UwrouRM!iyOdBSdhYTwOlw!|P^>|^E{OEdSlnwhc4%&T|J zyxz>9h(FC%?!}&QuN_z-^aiR8Vqww+5Oof)HJeVOR4c_cph%UR$}`hOCu}xt{mnLQ zMPqA}$~K)I0kjumn+LxDrha1K&Sy}wH84o?-xw5U+ZmKKXBOeJ5nXs`7FmFm%@oGA zx}%NsCT#1-0a$vS!?vDAhcnQZZ9Ov^m;RAK{1$96231)qE^gyM3%z5za$c)->8>JD}3JtSp%3?IbI zLUycY43PQD*|D?&od4N5j-9Z;p1!((ojRC@63WM*2%pMMYe@jZcCoV&SZ*(Un4L|m zk6Ut%r39eX%dNxGhC~6s)Q+Y3+2Ei-TXt~=`gUH0U6JtjY%8%Vf0s=x3)}3{if;yGeFnSH_B>8M+-0}c&jj}GCA%}+ z73lU-?9K>J%!Y@uoW+<#)~#!1kj!#cVWVRITZ7WpSeCOM3zxsfv3oc%#rzs0QA_%b zW)Bv<0BO{F_9)R6c;kQU>0{G#fax7sesNc8;W3s!bRp0|>)G>VO@T~EG;_{1_Ua27 zQ^P&%-M%28S4*0CZM>P+)7ks%4VdZtWFPjRR;-)BKJBmrT7511Y(fX-`i_0Rijr>P zQ}+2;7|@|r*q7$Gf?2@6m|o$Y&Fs&<%Ei3QzAyC!al*uY?8mX3$oK5Op6FVAkF%dE zs{_qAW#+ZAW?rAceq#LRU6--ngC+t0@Rk(~4nmE1ffXG_AHOJ?gGE_vQvcx4KOZD{ z5_&LP>6J@4-ipoK}Dwgk{ zb46awYB7jKMJ8VD>o=fZeR=ijGl8d^=QX>X1aU8%+w@ojFyeth8g|^ENOI;jzp>ht zeTUce9|J5Rgx9x2&spaHZyBy{XO}T^B8-PLn z+#%csZ>Sk}I9v;JNYi58azixA<$(sJw+;q*`WfE3S_-f=*1WaHLgX~wW;}jT)Ggkw z6Aqx1wC3%OSHc?cX5L}UAYjQ(+|eDiUY)AkaU(`e>qfj|t2F%HINos#e*fK#2Kk*A zyki`y?IHQR6VFEdU(=s=8h{zip;X@KOaxH!AMf<32g>A3-nmp3(8Axm^P_C6lEv_@ ze{iomjO5*e8UT&B#=Bpz1HP+>_h=A-Lrk9B`2f!Jd^^B<-R=bRKc2K75#`KhRcXxqB}RryWAL zdmIiZbQs8o_xJ89x#IflO7zF}9`fydbU>B(xHSQo|2uT%<6_Vw4clPm@IpQgr4+Hh%qLPzFuGLalV+pw zZ92p!7bg-UQ~4AtR5bQC_!PThuHjQ=KSdwEgHKt5S}$TKpMv=Ubv(d*mZKlpn#HI0 zz#AJG&8Pcgs@5`>&)A7JQ+FVrx!RNjP-_VH9rhhy$woe}UOE<)Z}WMXVZiSN^ZDsm zY#Pwfpcrh)7Z$&FE5R3yK?&BP6%V-P17ciH9%yO>)ZT*!S3%`e^oR$q$MYXOhllhU z0VMJd4@u~Oe<#nNxE;z@hGVYz_AU=K;b4K(eMA;_<9A;wZ#j*zE2Uh=cD=h-QRFV$e(Xm zfO&hzT)wdIq);@2IVM%%_COXp#yB7;YIbp_bCpGU6oMR`4+ZwU#ck!&r zu}3`SP8*Q=nF9F!MHjFLHJG5f=R|G1mS?eQBk(6imvpoL1~MFDA)BVUZ9gG=beMbcU+W@z~lkvvw}ey_Q9Y?S|sYMivi&M zMV%9DB3AqKPSJ)%LeXPloU z8qUGvUTdLA*fq!prbLORwKSj`ABbk|VZfZHh!$`M8w3?ZtH3rOnr#rRtK%=cjuq{P zSYbkPU33^;57;^z;TXOXc$){JW8IS2)fyq3Qp=(-e=&1!2hpts+Jxz*=)PecFujN9 zG1VKu%FE2=rYXh?x~`d-dzTm#hnkBXnfQZ^ItrJ%=K+RN;Sz?9qyIe7+d&5DrH|+x zX9@5w%piYIL-e^n3}{<>;cB%T$M#MMx5jx`Zu=<)wX_3p{UU}`$Gl?yV=?5%T%4X6 zCEQ1I_i{MA}qqJF}2J|4^E*2441JAkxkG4c=^>9)>h z#yu8Z;d$7wOcLIWw`29oLU=dp3iNz^;f<5gkP#`oee!_)^%A2e1cTU+AjV9>Fn;rf z7~7&U@EUu>xI-<##6DaW6MCbAIKD$nT;+*ZSXxXn?leYBIwoULs)U#vG!TTdB&IZr z0BOfaF(noMP-?K4nspMJ&|AffdkL6De-XaDU4cy=Bj)t(3{bdM%q`yQ9Z$sEugkG( zc2D@Nyo9l2s#qW}a~k$QEKu^XkPx^^EL@G6FS$UNs-wWji4mri5-xc!vG_M;ueH~U zC6TuQ9#s_qxv_W}EDZ85uSDQGEZNk4DuNecthk*oLMCK_I8sG~EcHfFyIZVyihgBB z7qOD#3i{j=E3e`OPWUZCKV$Bh2+E;Asfm;?}65(ZVZ-bVL@DC0klPV%Y^TY63M?@7*!3@4E zw%Z2+TsgE&|PlTvxUIEX7Gf=Y^n(N-WU zo5c|aI}qhsi$vKKq@eyH@zo0;FE)#lQ_%RD^%kbnrSXgG7K+o(>#^KkL!2Hp3Xj`J zaduTANP4zNDTT-F;9ZeY`Y6E9Y2tzf2cG#}T-fFaM0FJxFJ=NPJ0vcZ@CVYQuDG-U z3y@73iz_p5W!}~l858kF3R{b->k9yWyb{;CI0E;aC$8n}0&(lDNn{r1cAH{E<|i8f zzvJRYYqaX)RmF`RIGV*@i(9>MtcG3?x0V$Ew|^~e_h|ue@`uQ|iNYn+Rowm66^Qd; zaetf(&Z4s;%`Dch^i~Z zKODJ$UO6(oy8}$r zH(Z9ZBT^T+Q7Ag3+i7y+VYfgmxi2@lJr*n+8GFL#L;hUdJE>?C1W zwt6W$Rls=OV7)={>W|!gy(O@W`LgqNwD#^R~`A|Sjhl+(B+HRBX(i!8f$tRnhXI3HWn&cFBuyRuJ;*%KjyBC91!d7gxhHepyL*@m>lnYK*+Z?iM}= zvPxd^%?4mcvK)L(1?lcRIiyr=9A=v?udG%Bq$=SidF4!dl;0q)OmReUxm#ZO13lIP zFFABnaRzik4!ztS#Iig&G;1@aP+QDw=_;>s{|WGIjJ)c3G6=R`UOfl({Ezwa>i^PE zIc=2Jr4|Ca8!vCj$EPH!osf$Y6EgU-99{y{9RK6wo0k7^XXU_`*%u3`tzp-oHG+n-H#D5q0UY|VR|4ot~I8McE`LCSU ztSZ3yH*$VGS6qsAN95Nb>#z>kSbn{-Iq+WN= zg5`IsQT@97k_%ct2lyT>e_4agrFX04@AlQOU(i|p@e-Aj#RmDmHC7;1a*%)i#k}F} zZ~0f5Bor{8Zvlkj^MdiMDt;3N9*^GlyX}e4JAH91gEkmXz|I z1F!-bsg&OokMqU3N`+NY|beQc{zw=o)39Sf!I^5q~NuTkp0!)VyAK&j`5 zr=e7yQh#<8AbwSqMt3nR?>(%QE{Z@fxthdb3NR`1;GY+Zx^NeLra`3IcQRP z*rFJeZzw%GqoV;ZNcFo}Ty|U)NqrPrsueZeLWKOLxWgS#QPJ#}1@HeH7;_ z7@W3WR(fTkhrHvW^ltJB#D9Yo*N2$GeeR?5^TG>$?x6HL91kqNh0=e|XrPm8DgCpf zK-4p>SKRxQ1JZlG;&C$`=)%d$@RqZ2&~Sj_`C|}{PNym(C!NPeV?$+h1I+nsf|M~I z76bFA%2>Bg0KSgO_~Mny?W;^|hxPmgamv(@7?!UsQ>MnDO$_?3_%wcl6_CEl^bQoD zVXiWh;udeXr_4Hsr^{p;q4>%eW}AFhW~brtyIfA0OK#(-@KyYxu}rq8r?T)odbBBB zm4(kS+`2Yb7P;e{uPd!A{$q#2Btu!U6dhB8Daz8R_&nfoMVB~Ca_GowFN%9f6(->XF{TT;BR6FOblVqAzxiRzGxOS?#kx`n63v$PWZ z!48{FJCvRFwSc})RAMe(Mvu!8F^nhip^(ks;-=9ir-&?Dkn3FZ%|fFnw|{+w&JLA z^4(740OeFYv{u^$<<#E@5Qi2h$raCos2HuBE7J&Dvt5<*CoTfpH%+;4F9^uC?aC#5 ztVTTVs9d(O0Wqnil71r_*qx?I#?g2nkHeLWA5}oI-e~61<;vA^I8_U0%=Fo&n2J9j z%g!1f(CK58tM=%S{_In(j&lUo+fTWAdj#&8w?Xmasd8-+-T_^#Tua9;_Rk8+wGWv8 zo07~7b5yR=M1bGN4f6Lf%60#X0Dn#?H%p+gKAx)Fvb%uw!kx;krlB}ZV`);dbNqpK zZ?4?k;RmFasyy6Rgn9aDC9iTJPQ^JXPa0VPv00!zEu9DCLqDa!D+ZNXAYIps&8KZtETmEXfQ0QWDg{4Tbcu#5Y&3b&w% z%8D<%-8+@N^8oRVsQe)YrIL~=qeEkNJF7D42h#7Ws)xJ)sP1iMv)2a6xACfl2gV*# z_!PBtSRlI0r)rt@s9+Y&Q_DD^=387!Em!pv_Uqi$id|46UJ6#Lp1`f!&_u14Uqx;$Q>9Isk`{)?H=UW0UVXM^H`yIN-{u59ns zYMpgs@%&FeqSh;n0Gj()t>38*HjNxqTW4#KT3HyRGwjty7xB5BLl@Piv*rWWmZ;4i zqV{wY3#Cm8P~;Th~y5eTh=r%-97|$_lkjQXq)QV^znV9kE?EOLg38 z1$=!;wIeA4KA^4IxwAj^|LXQoJ0C6ranfCN^8X5A{6n=z*h!H7l~kSaLS$ZAb(w92 zDOo3j{K09}<>6S2Zrjw}pWH!ebYAT<9)p%g6NBV?yxQlk9q?0Y)xM=E(9lb2-};^) zJ}*=I4Z`q#`SJeq7d_n84G(Mo|%hXA|8IXY%2F2iXb^6u?A*$~!M_~6}s(znjp#8?H z^Pk^CWBRO`@BsyS>9J}mcA?_1x@41%d)~nyztBhxxQ1~(X^|RmyBAQqmTKV4by%3F zZ|1X4YVebEyx|&Zh$UV~w4X^`aUApZ$N)3Fu5)l};Okj~Fl&pQXB{@+8?3u7X%vG7w(%Qy`1g{f(;!fmz*($n)X4xS{RUC=hT}s4gp`+SG_ad3G4r7{MEaWWw22g zrsiI?#fMMcnpv{4nck%gisReV$6+sk{!CP#9sG)Sz}4sJSWql6Mtw1D7qEg{^~EZD zu>4G@`q~X2P8phHru#JY^>oYuZzrg)7hDB?Ggp1HJsy+Zck0^|%>Uu<5cTcDT>#I5 z)c4~tTYYD5P~2Lje$ZS&jBKEO2;B{=qQCmFc^-(wrs`*k-SJ0L)gQMDfV*~4e;q>| z@jFTV9foOoN}>Aucmj4t{M6sqQOa#)>fhnGWutzof6;VA$HQvTwAmol`K12KHT6K( zxl;Z2f&)o=pg~)VPR9pmkcc)gevn2iP;ht%O*-uWr2Yy`I)m?r{?^!`3n0TKjs3R( zXfr=e8I6fZqhki8Lp3$6pf^YZs%aLDutS>kO)Jq5C7xGH&GJQ8w5^R=$yY@{KY3_n zOwD63+l|)Be6RvO)j_M~hhLP@PODy01(A17tNt04j4Nn0>{p{;NZ0DL;UGQzpw;V) z8qRgP)^M;72x}*;aSwm&8y0AGCyKB}bYHW(?usp%KU$NXm|-n%tTlW8McDCmD{5!B^XSGgO@sxPK zFvzV>Xk9j7iFSWEt*bg4gV7kRM>ytyHJr4btPMWCm#g(`HXB6E2U;(ZkN)F=)(fj> ze9cU)*I^vVxcf)z*91@1^oAyFfDLxBjs$1}>Z0{0_Sf9I!~pf|rFnEf2eY@6HvCj? zfTa_)k<+lU;Z~@P!paDVtEqW^OvZG*sWy6uD^|s?nR#HEHl}?!EYVn**}RcKGW3_3 z?#B#@b3c*Tw%>26u8loe4Xe>EW_rllgxZ)&?fRolm^%eiF9Q2anbt)BH}J z1F33#ZGQZJ_{i4-&7_?KW;*4rEnavYB#YMC60BPD4hOWQ(LTW1RnwMc`eF)ZsV#j} z8AyV!7C0Tt@!pfQz%3}B-DGW93|`QYYTC-?gFwpfrL9c(ianoa+N$uQ_#cq`(N=#= z0(P2eYw}xQ(dmq~sXxva-PW{lOK)ssyw$?n9>(~8;DQ$JycOuw-DZZiHgnYuGk0It z!f)>c2pnpV_g|q!;FGPQeyA34o&o5W%&aUK6gR(U5xG9t(ruwd6fFnwvXvHD8!M_e zcW6;Lc*>eR(V}o3g)}p1+qbD`op*<8J36CrIQeKh{P8@u7^dwgn2GOCYSHi+GZzi{ z1vycR9&-^BhxgjfUlq|vduTDmwd1I1+Fo~zW{G>Xz0r7V&)RFT6B_{a->2=HoDQUh zs>N0F1O6bX|@T$yd9nZwFTDu6Aoaj#hR! zs%6_`g3#`3*(>n9<5TU3e_eSshHVZW8U; zemur2?6mwiPfSGKY0o{galGfX_Wbb-LHxJd7eOCA+M6j;#vtxNj8PT&)brT^$H9+mfNHlK-O03-M{$*?|)J68H~oaAW-kQ z;x@L~i0+&m5A>-_QuV=zZtmL}W)7y}u2n zSZSX605_asT>M=h@G}pf#!P*XT|Bn!KkI{<=Ar)YH$opV1d~Y5%le273ot4b>Z2-S zrDN-K-FqLdz|bN3=m?Bvil;vMd<)D0zv*K(l>_=_uRgvW8mVyA#~;Q-<7JUPIV%xM zGZFgKnnf7CAL!F7Zvc8aL!a?76X?w5`kV*;z#iAp=Sl;xWDEM-&L#|}9=G&>_P=m^ z&RP$&w7_)vrXFxyQ!vNlL}tu^zYs~*y@IX*?3 zq_1rL1b8QBJ+wO(SaKfgq1&vm1p7c=)f+wG1SfrUbqQ$icKRCAOsss|Ev2t@Mo02r zGksl$cOX)K>+7&v4gQk8?hMXym7l3^s)u2C%{D!JHpT{ePY-_+jfKU#NL0I@D(aE; zSOt4OOW(2wx6Zw{zO_#vK-ffsY*J5syBAhI+y2m_D-Q$sdRUMCoeaYLx^CKKe9%wd z_0R&y(u!v09I49Ek1oQM+2W-iFN@-|!efJEMm_yhfCsSIoAuKZG3?sL>1U5% zR(r3Po?QI*sxQK^kRJ^h=#4 zW8NO6Us|bPEl1TaYq*DVxPJNDM&Kku&xp$dnx3g&J9QhA(Z@)v@2zz)NM|JLSzbOM zdQ{hM)%ghY*=0SacRsL{kM$g^e(@7TzrUdlh=OhU{YdnXtvvLHw#|U^*80PBYq2II z2I~(Ge8vwh>yNbp5a6vp#)cwSKj|+nWdoV}On>)yDUfPc^!LNimp4DCfBZBXnA1@G zQvwz)<9_L%f3?6Fl1ciPbVr~C?)vu%9E826UN{I<@X5w{;Q`$969@HQ1M+}}t+SAJ zV5M~`@^4>!{_jtQ1x2HxmxMv~va$vL=Z{6F9~PqQKp=xMEVN*(@7;H{&`V&j30-SZ zVl|%Qz^xXgOz2`eovrbIN<(`n>NsS@Mcj?0#NSdcCO?-4n|p*-_G~*`E88<#+2N-prTRUsU)ea2 z?nbTuPd3StaEUg!`&xJ|eY7E8?3bkNS7}4(^9%d%4QW$P+! zblxjK$9ihx5E;n>#`3E=_|?+mZGN@({7_u0U)83}fs-0|Qk!yZg`}=IO`H1I ze#!RAwOVBcbo;=$+O%Ge!e+d!&6tG&m%hNS@|pd`_58{FYJKuFt(_jQz22(LSPlID z=dD`x-Mf*FFBR9nKc>~Jf_*>xur@0f<@ZO|X|tREiHeB}v^jIYOsyYjbN1W>holwP zn{mBUn|phiWMh4_`3t|0q_PkA)w1I}ZJ}Y4)Jf~Lg_l5jcF)%qKKTRy%-QYQ!nZd9 zCc8{?q)(SD=J#6dhWV0Oe~MQ74X$;ynlm43cVCj`tlBLpYp&HAR|87@v{-Ahek@tA z_Du%?PTMAHi&i2AJb0?+y%1K>GG1F!h`=OpsTRn5NK#kq)mlr+knf+ZEv?>yjZSZB z%Pe5px7uIRmgV0jNssr`mbniAZp+b@QBCNfGqhz`Tj`x;THC`%0GCbD+TQ;_vYzvu zwqoBnNjY>>JEscb`SlOlc}KvElTx$`TL($Dz2mi2&th#yT&G=f*XOWy1H^UU5$#eH z#_5BwT(YiO6m`9YnyJt z3p1|cS9MmcwpqqN*N)IOzYUaZ!YkUfzDY>owrSVyhN9VOXxB9YjFQ%B*FWNvl(#l& zTRw0CLCMi>SOyB7w^6&X^LA|4IilS>@@&Ze{aa&Bi+Y3hlEV@g( z^GA5I_g86m{{q*{^@MisP?Tg?dujLXhum*Z((ZrvQb~GaingmSJeiVjwTFj1CRqcA zw7rzLIKQ*Dcb`R4FMM2k?7cEc@qM5@j-&Ua{M-0dIirTIkpDdcw0}E3f#>q5_VhDA zwF+~zX9E)?%XJ5}eG|WhGz7Kh-drh33uW!4b!#Pc;c42--Jg~$U;LoGa(Oq&`u1V% z)d%unjQVM>9sm-0-uv2X{Soi8720d3KPy=(v$WUGyAICmD(&?hU%@PI(%#5}V(OKp zy%}f+9{0Xqd;3wVWNn>+D;lmIp}q4CNR|4q_U^CW0+N}g9efwM`~J(d_mEIfKfNE< zGEm|t?eIJ>)3~16`|GAjwv1`ok!%A?vPAp1@*CKWp4z9^mP+!lOzo%&?Dn>M_*J=N zp?37<&n4x{-r85~uftAX+N}N543V_*Qh(G{PuvRBtmhs*@rTut`p^MA z>EnAPwf%lwI|L^D&Zq0Q0J3@Xpx&;3ewQS_@vfeHw+A&~DSFBRsNNfw>ltdTBpoQ! zGt-}FiLy{^s=mR@VlT_=Y`jE@hkx)2IAG!hYz@3-sL$~LE zf;N3PP;cehTz%xQI+R?E)lYp0Uh_p8^@_8QioK!_t|(x>VhOI_;(8yhKjYf|Km2k` zQrC{b^;gNZaI0Q12VA@MB3z-d);^<8*ml084tZOjc+n`yI&+^s@mmIGa-V+MRfi?@ zi!1fXzzL<4c7C;G{fA%GJ=g1#9Sw-@2k2ABW8kMeqgQI1CE3$gue@p(irq@}%7X>? z-g1pTt+z)~Z&|5NyBIUtwo|WKvkDo?hxIe^k?G8MRIlC$MY5$;uer2Ll6`OLHNbY1 zf@AuuDl}ZSML#PUiG;i+{j6iRO7ilX^*P^HBNy}!ecnVvQZH%O=YRQ*WG%ZzuRW^> z_5X+U+PhwsY@e;s>s(vl|JTmZ8`{7`AG!6$4d+YB!GpTXJcQcssk&=ex@226Om|Jh zv8lG(^hGzOVyPDCi%S8iE-ukMtshF3pPO{gMsWY&Cv@M%??B-c=*!tLN&3#MFMl=( z9*$2x=eE9*v}3n^?g7}EsY!bKtr*y(68(aLHxd7T`J{f~Y1J6OYx?TL(~vy+mS2@m z59oiJnF70?ssAl>y<{7=LBF&rOR_$r>sNSQg1Ek=U-1wQB*=eXUpsz}qbu810a6&vU;GZ+~!;j6EEEm6^ zf8Y#A(x?B>Kl&9>^0f=~ucz;ol+G{e-z-}uNgLkPzd76{$rD$#>)#$j%?8BjyOe>F z?amkV|1Dl6$^WU>e@#HFccaO#mQBwYQuq1Td_LJwXor*074h$K^iWk&LmW}PZ zjN+|`+h;WyJ(uQ5(oGK;CCNCFLA${yc^DCoqtYm?0y=*07JgO!b(&GyhR;U_@T>CQ zbBxlPewJ*{-C*>({1!=iILRnad0CRjuQLXGGGDSDE;fc72De{)uQB`cM2 zSh9FZjZ-T@`S#mtj8kEJ)YVTJqX$2T%*DgTm={M&w$wDEq7j%)*#u)kZ$zz+Y%(U+ z4?+pW%f`fGFjgz4@vFLQt#MicoXy9RjY+rMD@jW)GEP67g0$OX#?%#~BsJj%WBM4x z3)T{2`YvEXfe}Xa%U`275T}GYz72pNwMxzPaqPva8C25j1?-axR$wk2b-}%PyTwWkq78DxZ zTcAL$yTNE}05tll!)SwZDr-HBa}GT(DSf*c=Ou5K@_gsD<2qF@51+~y^PIkLy~g-Y-96b zV7slOjOzy#!=X54Yta> zjYqzPp19O*>@mkf9H;ZE@}CA{?=VQgh1VPHkDqf5woolFp2Bgcw)0;#o?h8ql9D$Y z&w+X5x1TXy>H_ES!=c8@+Ix_Kp2lls5X;pU8m})nBB=)-F%IkmWd?YR|IkLG_dLd1 zX{hyHKG%5bNz8oBEaRPl7f4d)i^bKvn_txjA2kkMSSBg<8%rC}9hC{};Pk7)Xjx~N<0!JljgYnZ_yCv%{gN*+j zdmgrb%!X{UOZw z?-NY@>!Yxa)uyp8LsIX&*fi<>tsn8La!G=j+`Ju%>=84i&laF%KbtA@5cfAuHq$S& zNVbdX%&dws$@b+bA?u+)Dxkrwn{@0ab7A^z#7QSSbWI?>X+H00PGflE(*O;Zl zzJ?$Fu~|Ct7!Z#=W}jt{?@!!j+1G0&bxd!w{5He~cRXqKD;+Lb-zzrzwSYG)UbEk0 zfam)Zngi~~l8#$t4srkyDSpx%JQL4fGSeJ_ld)ynBy)JreE9!GnmMAxhrIka^ORY; zC29C|<|(e#fZy}YQ~n0|ztADBuNR8zfuK3^QHW=kwdUv`6p?g_IqrgcQ89UgIiUxh z@0G`|>W5dDr`@wivb_7fdHNw3smG6)vtPn-UxTvDGm-z37FL)G{@uP-vgBu*jzyy+ z%bt(T`jI)3E%7O{ej^mf;TufnqoXD3k26iz-8C4{x#prfSAkdF(ASc zeFa`~%afS-kK@c6UjJ26e|gkwzo`j_kH3;--tu(~LZ=k-){Br#s+wR5-0xlUw&(j} zjUDFS?}Hd^-fM2}eK|CyY;Hdaaq3)V-u?V=i0`B3J+F?ElsiV4|3rXc>H3(t6L^AU z>+9yfMtm(<^=r-hMm;Y{6R$NN7>Ws}foH$VLflZ@ZtmWYAX&$pVm?v^qfq&l`N*5V z<)>wvkFU&^)YCsTAK!!mrN+pe1X&dQe*@73lD+vZEs zq~YdEbs&{dX}&sdzGS^&hxzJ}8cF(ooca3lQkc!j<{N2{>x?=4Dtj+74-~-&^=&oZ z%9Rn{|75;(PXLwBADC}{v<3TvlFfI%M<6oeCiCFJ-IC>f**w@XSh7xj*?ey&q^td( zA@lHnWs-I7zs$q0ydxwpOw&T4R2DzR=T%MLT-tBbw>|F;B{%LhOD(*Wdgj0;wj@Wu<@MNkTfukdPKkaYQBhn1XiFVy+%ZYXaY|Kuz=cY6zebXzl!PdQRQG>(wc263O<6V$r z!@tqN{fje8ea>d@Qm5VFcH09!N8Mt-y}{>gwg;M=(OE3PES#e;kSuGyG?v}n-BR4y znBa-_9;`e2LiYJKY}hKJ(eC{4>??G61#9kYDQ07K%h|y-u3oHmx7>B-i;J%@*yk@> zvz5-%mpXmH7giMRbgfvFDUV|PcUrT8qpwPw=mDYZk{^?>^NG}P!UaIKucfl+;0tRo zzy=rQ-?O-XPkWuW)m?A*cmwuY-1fG5f_twj*!l96HL_e0ZCduQCAmsQRvj&u)X0Cv zS}Y1~TVEJ_^s4-wJ+E4nn0G(^T8u|(1w9>nAa4HCF9onpZuZ3*C6A3>tafK>x5zrn zu*fDGUah9JOJ#VDxWbKL`!E4NKDXd^Ki;dwUAi*@_ll+d(aDSJHc)EiGpqk-r8%4-h=zW!r~{J$doV|eHJ9x@U`c16y=BwbryffZyCTV&kluTS(_iQCh!MD5 zwLXWhE%?(deNtsh9Pc)QB0hFgwUWd9L#?UolCv%8vzsxs<^2CLKJ7+MDq`(gsSO09 z5fE7*Kb)9-ar^`kg;s%x3xeVwwGzPRdJv1At_qIcmeDT8Z^s+`@V{NEl*UPYa3!v2 z#y`O$^u1FWj8Ak&JWJ0<{*SHlIn~a9m}9eJxvROgSul~`wZdulHgNJcyOu9sUgq{T z;;X43v&&T$c8T>)o(nVmQ>vScp5y??)c_R4W~2Yz!7 zw&PLU5dQ^JZq3-ad`qZ6evOSCtz@v~QA++*k7!oND?9q0EjO1$w;pt$S=7>cfg(hU zYRSvwIwdQ3_xT36cx69p8vA03Rb_W?w`i>932SOyY>H=%tzXpY5AeCvIvs&Va294@ zcP@9-1>9|Rug7U`a=05HDvkh6iVL#WgRf|2VJ)!C6=;H3dHex~2W>f-U3S*8`EmdwADM^4z|}XcV%6=$z`m()!HRA zy1P6vK|Yfew#aF0OSRlN_|~q@vWq?czFaUgo&+si{``_RDk(XYq^!n8W;KbX;h@h< z9wc`SUDQ|JH*Ll+X*wSlsX-c{U1|bF1K^ofj4>jRbUz}Pq{5+$qupdzdwl_WlQ&QY z0R!!V5AEsRv;NOD%L-T8GUk?`Unl3#rD&T*LVRuKRPw_NI4}+xOKG&v(&PHHw|M<7 zZU;)jI@;UN;0N~xm;Br{bjG>zCw+p4F6@((INs|C_`Ghn)5nh9A@>NKeY@-^%S@<( ztay2^G-FyF{A3TFV=D+&FHF}Hr9^2mhDD0i%lgl>r46-9z46R+P>J7!no8vB+(M6_ zg;r3IS`jMI)#2qlI~G3jl{eZ%SnS#JZ_1_R(KqlQ(L%HndpIW5iRj18t`AwVSWST? zU+%-c=qzWn$24)Xbcin`sR18`D^x}`NNvZksBvLHnm}kfmVwxSl%QCIRy-pVPk8=# zrWOBUL+OL5x1x<$kI?(9Z;O(|wudY#jmplRT5d^YEsIoDDZ}H5Z0}q0z^snsBMQ6F zvx_b0Zs{Mq{liqYAXDz_iuEMKo5p=2IRvvt=1SiSvt^f-V00&03aG|J^d@M+#~v)) zo0rnDH}1y#U#y2q(DuZY_&;9CM*Pagzo_(NZ)Dn%Q;4wRK?<@f zB!4St33@XGpviI~JDO|BU<15zD$BUnnw???ZHX5I#UU(2H}+zNoY+aQu!o&dVCi-W z8BuZ^$O~AC#uM>-BUVM+C9Wf5M%|H0AwHzvNt~Q)e}*LsttH}SB3pk@&OdI%J?Y`) zc+m;HL@Z68$?Z6<(cq0AW)+gKk&|KPE+w(E83cqUHnUjr{33R!&IgaKfqDwK znw@>@%bHwuO-{IkcDNJ%CYU0pugpHV0sigrEjfHnd$Ys0*je8vu@&A4b>?@vopta` z>>b-J!wjg8u>mo7dwX@j;R}pNEM~A)E&>SU3PaxC!W<8W;C4F1Odyh!F;w z93DOiKE*!vy4C>vDDkY52od+%ar9^>=O~^aphqJ0(Q({=l^%&z^ z+)^%U^1|!mZcrIqi$?f=kr5GbC_G|?$#PbEqTdMzsU8l36ONN0e%zeHEsV8$oQ-he z;kQJZ5esd1)YtnH{fJ>abxyPqSmtzsmOKcYObB?zTnR z39nr(joZT)6RUtxl_mc6RI=MooJpeF0Uy$jPztYh7>r#o3>Sx4UUzG=b3|ed@tva? zairfKKkz>GS}+7>AsP!N=Mheg-_9LOhrQ0}2{?!Qob@p=@by8z#94w3h4An;{KT4E z)Ryv&%M#g=|H^5hM_!j(l!5`$gs`$D#X!c1{F!R58==eCq1BeWwA2&DShP|8wtTx) zp3jxiA8Wdy$0?7f8&XQk51|(vIV&;UbRVx}I zZ-^AQ(4PEtKpck(ZRupB!oy%QYAoH@zxpbptUaYs?AE@@bYut0LDf-_N1|7|RD%Y| zJd%G)-A5WHFPMy?2&nN#*YFKOU?~4$X+V^CA96m5>M!Bg+Uvb=!YQ_QE_e9@Wg}~+ z`bO0>kq&Y#b|PwVfXNyW7Xx~M3iLT!$a!}`4{^<8ucUa69ucwyT{^PXH)^EA-sE#O zoZ6EODN}k{dXC~(R4h40@vrenXn_N z8=tadbU*HmxIXpBJ05mJBc_wnWO-}2U77~Zh$KxoCxTiOTKF(%XWZ*XwbSRqfIY3v zwN77nVZUv%jGfx&q-~Hi#E7v1lbH!kH7+`ZjG5Kr$k_AQJ3BO+)foWOaYUXqxkB_g z$bM29EyZ97T7bMqyGWP?vj7tuCK4M|Z^`aSktt~(u_R)QG4|EMuLv52hPW(Kv;`x9 zl+|G}oLn=RSWGZw8||9ky*cJv8LF7C#d0C(@^cSGBrwltp2 zJ}b6nvf9N!zP6OBYA2zdn%VXq)+{!1p_;%xyG~9>D+CPYB#Y&2CiH^>Yj$=IYe~rL zX|0;qX$n+UxipX+yvAD0`dtR6w98f2qO8pR{+uu0XSWsmr+x@%XWetT~|t ztE@xiq)}Kj@_?}dECuhd_f}hSvoa@m0xq}?Cw+0#YU@Lmym8=*R+W^VTe_83wdaSf1v$m}YFv4;;;O8C%(DaNl;Sp7d?#GvhCm;?&(+uj{p}OpfzMtN#@9;A z_!QWe>#eJk>|p~5W6u_q+X{4jdW+L@+Eg;SfmU|qCDsB~o2{nGAoz9Gd{%XJesF|KT7g#Lh@hoa!xMG8Nq-9}Sfs1j-Uc}> zc*TvK+2&M4#RqS+sr|j^S>!i}2=y2VMP34_Acw>a?ag6j^uxy;+`p?^1!-mq2`Q&R z*g!O_l1gDM?2cymloTY`!(2&rnxII*su&fZR>7%bg4X>Oi!^|pajGR_7=^e2h=QO= zglZHr$Ls!-8s~CAcTUbh9HXVSaziPbtlz3^;`e~RH(p}R4yo5$XC{xG2jxtvnEWAu z3B|A?ibd%@_4_sEB!cle^iM#wSPO5k@|xTMu^IN9=0ykuE^l@O5X04Tp7ysm>s$>k z9+3euhMg#5{kKCB=l;VwVz%A|Fa_~LE!uSicifdVMjMZ)suA&m*X{KYw%>IsLWsJy z7}7VMz9HL-HI%J*q7N4aB6}mCh8Jqo4A%0LY#Z;z;Nz8k>i8zF7haMBQOUAD*8!^= zZ|zrardM;P5W}Xn{-}x2l{VYuNfvn_bDXc{uv^ZwWV82o+4=}90e`wRb$Ai{ zPRbM%h4FRrRAW#MEw|9Jg1w0C$xQ)9%uJgtzdOD!!jcUHdlcb!5?o&tlnVop!JDq3 zTobhwA&Ou!`1tJhIo3iepdEH)vMmcpghPrY=B^pb6{H)^t{@!`l}I~!D8wo%?q7s_ zozLm0Cr}?x`OA0!7D+-BH4khp!Z!gYf-MNwG6ZFaHNk(i&N>H$#U9E5&~3q*DtHq? z9_0fy=xEu6(4E1gaQyWEi@Z>EHr9&959dkTBJD+x44jg zgXSzL9sr{iaJWn3+duytY&#}xP3@g9ktiMF+H8W)fQ3Qm4=wKU*UnOZLB#AH$;g`ZqBt=edk))Brr3ATXqmJioNG_>;8t{087c*h2%Xy0!Fn2xk z$SR0Yk%5jp9Eo4YernBQZw<62vR^NgyCl)#2!rZp@t|rTYVy14QI|N>I3SJn?@h<>M#sPJ2Kex;>pKH zERBJS(7lEGIE0c>E-s93f+X~M(S+ufKpXU-a4e6XDMBdTP|wMcP^u^1uR~f55|LbF z>k^t)YCF|pR)o!`z>kq^&9D^r6GonZYZ8xmw<}|+NRZnpWey$fart5Fh5W7QZF|6) zHUy3ZIdiczl!uk4t66NuX_m~?baE58jrSvUOd62&A7bmuCY0NLJf%BHE?y z@f&ig$XSd9Cp{~it#E}L9&d}wVK28wKQ=pn=m2Gj8(vm)c$snIiwtl~`~XQqMFv=j zg5(9W|vOKr?#jD%>gxFh$ee@cYS}e)06Z$AihuL{o0l{I9bs4w?=-FMg~P1 zc_`N+3Ut_tuWhMAQ$3E7I2St5gMT>g8HjtPqtdl}AAVm>r9CZigVz~WNVk%ScLJ&Fi!=K#L8dtW;hpnef728<@WK@ zr&jd0pTM9o4v6pPPjwRm7mw>^z+dd9DtTHkDz5-6q&O%w_tFi8H7E z#ePOc`iZf{Wy#ju5wV8<5@$?|G{+a=0-H6frb3#6;d9Q23PUdND~Bjr!*c({Ay-8D zhz9``< zkxpnm{t}sfQyEZ)qR1*a3HD-!XN&!GB}Z~D+v%IkWe^pV3sI1X3lc? z0<8`=N+|#A%tKF2uuYxLY};&I6x(SImxmo%WlLjIH`-D|B^zxI4^5c|)f1_~6m@L< z-?8Pfdu~x}EP1Kb#?&jJeMMeJU@ugk$!%_QV8w)BkZ00}9tgu|b^;>wc$-82-e>zn z&(i?bE#owX^BR3itwsb_*A%+xfNf$YP0ELX7jAb8dvT{FJy^aj!8B^3{!We4(HwgH zkj*`Vb^i!Ob{FIVXDpVLA8Y!_LmICa|Ji){NOPA5t1J zK3WwC+fG;ne8>PdD-r*y6)^iaALg>cPSR0}1WFls1c^0{#)(dXFnrt#sApA&tyw7) zHVH4@1vm;AG27h(sOpZNEEzQf0u!i9fgz#OF;JveY#gX@1mM{K|B??Q5XO1OqJGmK zm|Ssu-)z(%<+7er(B5(V!eT`#s-nRtA4b)2!-%dy(d2N~~FNtCo z3TLVKvFcqVZ+5JBk;p)J2f0BMR?sKH@^CNOcgYOI>al*Q$_@*H^mz+BdxCK64GzE> z^<|-Z2jR3$`IY|<<$+cYs!QIP0#G|r8<@f_uv-(R)r89e32OTbC4pW~BBxe3VGBPW znOIMNX)~4VP|B%Fxux)NL}81x+wn$ts6enp`seJ*9*50rkarBzOtJ10DoCd4Zwi}k)Xdx^`_(i$iQ0NUt5 z8U~Es%)PrPbg~SBTY_qX_@~0f3C@NF3bk52u0W`4v{GqF+7p`*>(^V(2^v4D?4j!c zi?6%EmiT`*lX-LFN;NTF;)L*+PBN#zIu+Mgqw5jtNkz1VjeIBDqvkp z+5VkMTF$;`3zUl{QiLlU+0h43xcm1IS|I?G1tA8G(Q+n@WCX9P2R=**PQ*G0y;?!PW>Up=QPzM8 zAizP*E}--+O$612Z~I(+gusqkKty1CpA)q~7I!_{J5EVU`ZPA3;EoG2vPcYDfxnYB ziUp!R_S^%?=;LQIf1;AYZ1vXEc8Z?jXo$J}mH90e^Mj4_qj+{1=2X{2iJkBiNmfss zCfyCs&)W;tytG1iE;@NXvOy|;H3O3MDOMR4HfK(pJZ#?wBRkEhzs3^`@UI*{n-Y>C!BaO=3r( zrzn%p$CV3Wh#8e3rfc7NxgFqOBo?$Co@2p$QmKfme z#Wjjmv&a^<>m1wQU|ygzE8hiCIygb;njpHyU|4|{PB6qYU2bFhJ+|C|qOe)mAyS-G zh)AYle6;RVL_*(_oReB5Clg65_QlO|MtZFJxPE-32#x6zm8_A`awJ+a@^zq|I5>pt z2C1o%s)8Zm(43cO+)fNcv#onZ!x?yP+Hawb(PTto?XFF5|U4_ zt&dwD&R$S0bpYh4>W&aJ2d}`#2fmla1#zJAC8Ar47Z#rg2V4)I*-cL=IiWQT%K5T< zE8G1h>OXpU5ya5y=Fm9&9N#7ghzd%{Y=TH^{{|T$&qCW^_F^YBsd#b);2K{uWzP7J z_<{*rM}Qeh3#qI5H`}^)3af3l<2xmt-Pu`9WiKv)SsU7@8f@WDVEsJ{EkIr$>mIjt0yd>V+zQ z=rie(N$lVzCA;#K;|5Pl%3Wvtq*5uGgV=vX{1z#oqPr9$M3|t8kG74q7a@L<(lK>D(D=ZEnCuxVRss?7*HWJKLA2>j{}1m`|3q#%-3`|bwP|e zC1AE_MpCdGC?X(uPh3F^virDS4aSVDs%W1m8o$0Ic@A!(VJ?ZQg_H`Ly0umA^q?z~v;QVKj*odX|Uyi0^nqff#-5w3i4Z7WpneG;+Oj zd14#Tg^p+!)!A?!%TpuU!y~?2*45<(w_pQ{u;j!HNKf$n}73BiqGOlTc##hSH2a za=Ceux7p!Ap_z}Y@;YTt!{EP1ni4}F+<+`eyHhX zE@VR}yTYqX4>)z z+e;eU$SYBRLbV#DBPdH_U+nSL@`C25ZT7V#(tbGsI)H;jNdw4| zd>***AZNlEoYTNjq~67oWU3};Y_p;Gc{gz*<7W7RedDT zrF6FEU0J1VB^vuY4ada(-Xg@CkTqC<^4J3KI&zSX*UH2%0RMt^5>QRLs3)g&BC!RP zPqrSk6uih=1fGRhFpkXp?mDE0=CmnSb)Gc{-sN(zwg6)Y%qtJ`m*65&+$01YR9V!S z%AT;i1tTj*%E|3$0jpFCjl-7oQqw}8u2ddN?6#Q~zX^1O6el@Bs1!x3QG>v~xB>C) zH*4U#-1{@4&Cs3jpOy`@*#`>aO$I%_2x-J5cwi&!!d2(WJW@9S*Oo0oJ8}iv{+*K5 zcl9549$ssNd~D?)1kamW)O6nYX(#V|@ClvMmJcf6M?gsN0Q_mxbBSDM-%)lklF;3k zD~YoAp9on952@osrCCv=OtmFKNsuIvc>8dl>j#jEgjqxmv~7t9NMV34yy+(LeY_%~ zB@;$t$NeB|j|_N*5uY^Gj46dlle~z+s@5u9bGc2065z7Vff!5$wgJq=0fEr2E0n*< z@)kB`ostvW_dqtgaxy@bD_>SJgj-08ib7~na&VL_ydCbz!v|2dGvyjZ8yxF&78ub7Stv+{`)f=6zg*6NxMX9{?AR23irc(#%4I~w`bVz zce*=af}zptlwTE9?m<2u8+(nCfue9kpc(9vI}xVd6G9aA`E{zw{++L;^6DlTnRGVo z9VL-<@!AsEmeGhcuHT{6%YD|QGZtVDG1t<8 z9aX?7FdlNa8XMi=SdQN%1-_`Yxdq{!*X|Nqsv>b`trPVhywH%fe6JLSMsHMh$;t(M ziOw!ki>)w7!7(3Ycp{EAIg%s-kxEMP7DV;o5hw^D{PavmUn0h#?34CHI z=0Gh6R-uKG9CXX!_IughSxSDAhz-c~6}81cr?HEH=rE&IN$n(tNPyi_zgO_`FDY zM#?#2^XcB97w+QM(J3Ch54QJjN*BH5cY0vKO-kl)N}I*D82jRMNRJbnk1i!CNa`T; z!zLxcsvPEvR=7{e<%GEVc_o2OIR)G#4@b0Km7}I_DnjYH*m~NBtz8F;GbB|`&Lyoc z5cfzKYm{3#U$Qa#mBcBhVY<)Ew!b%Jp0P)8C*--x$BXQVhga3Ssb<2=d^ z%~sMCP8B9^frx*xRW6bH1j}B?VtxNEXXtVBFPqFN{|nwtoeOD2!N5aGB9A*8JfaOi?7oka}9 zQ%)6(PAhW=3_zbq5|0biac=_uhMpsPDbNmV*gYa=B~hEgq&nCFM9rNdBiut%F=LkgQjuXjfuKx9)QAPf;qY*wP+12p~I zma)kP?c7pgO)TsgH!Tc^56por8JM9^sBFJW$w`>ep}#C|7~G>p5z!9s4QU10&h}hx zNk}b?wL1bkTM>q_r#(0uV(SW^6DY92Ym`)^#YZ3;!Q~?$3m<2+t++8p+FIiLGuF-DzA4+;f4q681>fK zo_?qko%*Fx#?Lv4=9rRW8hA)0YQg+$?_?#z>?gQg&%r$Hd5SE_96d+z%7BbWXcKId9>9;7$Ffa5i|)XgiWteva_a&*ST&I zYK@XhE_P_6n#KlhQd1aeR#N$fqk_WYTWUel$LR~Wpm|Xb%$DrJ5E{nI)7cxhfynEh zQN|i_fE|*706(v(UH$@R&v5WW3aS4%=lMj=W-q;=+=3uz#|o53>`Rq1sN9{vCc)L? zkVB}9GGF=(aE-mj(ZV|CAiLQ5rg9_n!VE~&BA9yaWZ!k6EqS)UqasR(7+SPOs7EVz zkz@RTvxsOvi%+nr2QEImH9zf#ZbF?Wua%D0ji2$ek`c-}puA?27qMMu%H!FLAu3MQ zNeCLP3GBQx=3nA#xv!juLw8vIS#l}sw?Ix}RcFb=*?g~Jl0K6dUN}!=lBl*>q~2oF8a^YUuDP{n z6NbR)CX~cW8~sH(n@5Daa@P^y`2p(&)K{Iq&5~{K4yYRrRj?mV$415Xe^yLpJgrn@ z4T^7Hc$Q>^nEz>H&Oducd9xf9c|yga2_k=Ve!ro)CpXJoyGEC~B(D94%3ae8l}qZo z@1);tn|g}Z;~iV>agvtHJ#w~C=1;z>yk^zUg_ZVT#FX`Quof5if9uU~i-JB&CL6m$ z8J5;(267(4vPOb|P|JJD=nSM*=Kg>KyHF~b?nzSmCTUaqK=TE6o0en>xWvk zp!Q?u;Su{0BUP`Cy>R;wF2y*pqpeoeuF6-j8y6{AY?=ytQ`s4F_)=BN6yg<6tb}58 zj046}7s6Q7wPLRx5`bZ=N;;0_=H^~xxS~Q>Dh`~;YfsWuSBjvM+3W|D-ecqZ>~VkC zi%+PZ6T1mLnV_~QI2mRFINB9PVaRujDCscSqM86_h9F@u)lutovzAko^u845#o2s_ z2r*AbJDk8@f~n{A7pPCKVn+`VcJQJtooXp;U5|ewnZGfMAN9a~c~Hp;jW*SF3GA^o z@(h-p1Ij<2t)8h5!-h(4c+`IOpKPS+W)xY|nEp3gf|*)FN0)JiBumATbJWakv;{Nz zMs$`nSV79UcnKXN>z7qTLeSCP)SX7OJxoaJoPxd%>#qNR19i7d&gPWMh8> z*S_3KeK*0n8&-VD<>1S^2dbmk3LhNGs#AgM*0C45Bk#X|fvt#pTde#sB}pE~77kLo zD_F}GZ|LGdY9AF_D`Nr0!bPb1{J9QUy$$s+YJI#`xTmPxDv7C`UR1JiywgtlItI*k zx`Z=nfZecF%_=|3pZLYC9tdDbjTZYoN*By&84c*Y8vlPd{FIM{qbejvK+O zgbdNaJi@)B^@{G;;c5?$&&-2IG#*ylf6yjM* z>4{?!pzYYZ2Q4{l@p{!{$s5#!wA8UUyc1=v&^&;oDL3jDuRl9d{VHu-__)@%E}7>X zoB?yieb&t2C;v#u$_)2upFkTtDRns!ZHN(v9zIpQq*L1Y&`eaHm)Vy7x8XD7Cw3q&N65~QaI!y-|OrdMzeP)n2;eHwg-rm98SyKfja zt@oj1%VTeWcMe;Y2w)HkOi&S9KORL|6DFvAbDHns66{>7QI zTxU@ct~Oh2LjtN2u0KxY033O~G(6r&^!3iPnJThVy2Gm>_e8bITHfWPCvb3|DcVTl zc$Afhk}dYdWbD&=XtH|!%1dD?1N4jQWLgYA0GVs7-cs zCtTwE9;z9<;bo2WKMyIC&i_)i2>QbfHg<}dUHnF5Sm^h}NFp-62$YFb&oC8F!lxGKuYSOm%|`uKQ42aQLnRLc z;>OAP{-AUTw!f~W5$+9=k`m!nKNu4mHAT(MTXCE&kJt}dsut$hZA}YfDI^iX3X{@^ zc+H~7Kpe_U#)V8i9fcGTEO7*YkNfrUk}xD{bTA}Z=s;Ub>=-W(W%S(qzQd!DjigP_ zTqcMWSxXOWSsh?g)6>M%Ni|?XXoW!e z!UQGjRI>CjPAreLN(>-ks&MlnGsqdNJa$6ZQ!kw=po(7 zlI*s;-o21gro*2&zlOJH3Ue3hA)IXG9i^+Nl;N z;uQTZY*xRu_V0>uQFulQTAbe@)~chb&?mZ3dE;6E^T5_EQ8U@hCF;twNvQo4MM1Q- zCxDn-#d_BA}=bJZJ34jCJwa61CE-=UtGmOzC(#OS;*X%iJri z>FkbNr1=bNhi3N;MqZ$-0f^Z|pIXSqELC&*W)6G&MH5u5tPXTf<4mMe#77fp*C4#M{azt_{ zg#8s|I`Lb5lbamAX0Hcj;vD_Qc3*luqONvIJueqdKY#TZR%$=@`V3Dnw^3JVm`{D zczE3as*W=(d93+oOXqeGDUeDMz9D%YF%2?%ESw)+PDc7dWIYJ&q7oD6aoliwQLPfr ze;~bq#i4pSP975C@RPhg3tu}IVWS52$?%;zvuk_~_RMNENxnZeF-I&b6-Cg`Wsl*sn`c+4 z$)V)c>UFl>Gs2tFDOE_c@$q?+{*N4_5rwtbmGgnxUvQQsFS)|&=@}64q=UA-v45Ne zui}F(X!fp4)QSXs61>?;G|8ott@|FLxA$DNOW)XuCPn<%ZY(GkpZmh(7>C!_-(;_K zc}DXor_73P3TxzKj@#AV?EIsaME2~tYI6Trn?1s9Mu|-g|31XoS$zp=L zgJX8}1#UlxSd@HnqD1(N{HR697Pu$v`rupK`1$bo#0oD|Gv@r?p9>$!qO(I=)QrD$ zK>VEl{|<;}FJ7%?=GK7M$!R6FiFtawEPyTCtQHO<*MQtJaV2F)P6=!fE!?a>czYUE zzx>Ag(bechC)yJSMsg7d@gvMge2A?H;WO?z{cA|DfrF z=zMtN?myjlbh4-X>B)NR9S`*9>&3FSsjqcf3$Ms6l{3dS_$RahvXq^-P3>w2u}PEA z{98Hmllc)20@*4b+kURvhpoF)O~6*VTed-W?YIM;0sbb-cS=%ySc+iz*wGqWj!sMw zhBeVwVHecgxNm~&j#;bP{_NBC%ufiD+az>1Vn5r+#>80KS7 zpD7OvzVuRlmoEG@ez@>)@3I{$N%d`4vn}|0Fo&kv(z1v#lPO;rQ2szhAGo2r4ij(8I^{AQGg zlV3`w`w>z@j27(zzmt4M_MgxbXY+7|e?gBO!9wHsmnfT|JON{A#-E3Ap*mlnogC70 z(CB$uGx(k$G(5g$#?&Hm3*1CF>MMeB2wxxE@>_il;`Xp1eznMNjCqT( zP$WHUDrpLobLGALR=cxsT!?Tn<7UC|m-4#J{R4i9E>AZqt&h!3Or;}R@RNPwI5ae5 zhx(zC)D^B;xagfZ_Q<)WQQg$q&;VZIV&M-RyHCxwv8$I@x+R4ZV6+Q_jeStfW9bj7 zQ@V&h8o)QIM8~6WC!ZdAUzLYoejYYD!&=DBn2u#x^j~;ym363N!#UU4IfUDa{j#Ld z1foHOS1xu#snTT(?ooi+fzJ5M&nN3}s1g-43%`n_i;!O~M=a-YTb?d}Vyc5iT*3-x zThnmjD*<_}@UWDO_AACl4?F-u8-JEwxbOt}4Cf?zkY1s4xV%0@!q`DX41}nKpQuO2 zIHT~fnXfgOITwz}4+9YJ2niNxY<1v>qX5+?gD3p0b#?SBDlSZcjk|Ej1?j6YcELkx zq4M$X5-vF7k}m9>b!sMz6%Ri^LeA5vFX`$@CdBbOqYWO+zbls~8@q$F2_ zPne)X$LL@}K56R+1mW_}N-it7!e+4f4`YMGr>iZg8R_Apam9||@L!~&SL#xF!Azcr zF6D!9q70c5UWf?BRO98n{T?vYHTSr8uw*e@iWVrP#|a(pf7_C|X$8$L{Bo3Ecz;QA zVk{e!_h!gnv$ub-6a)`mq_V^@YDO^kjfC7T0Ic}dX&eLM@4<6hAQ|SvtWkh1}K+?OpVYUCXh zKxv+-;d$0L{EI7r4M9_JH>8(Hn6O_;l&lgeU7^vCD^VY%WC~W=jnf!kC N6FLo@w^z-O{~vbuAQ%7u delta 25772 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 diff --git a/res/translations/mixxx_es_ES.ts b/res/translations/mixxx_es_ES.ts index 181086cd7ee1..7c3c0d8cd4b3 100644 --- a/res/translations/mixxx_es_ES.ts +++ b/res/translations/mixxx_es_ES.ts @@ -26,17 +26,17 @@ Enable Auto DJ - + Activar Auto DJ Disable Auto DJ - + Desactivar Auto DJ Clear Auto DJ Queue - + Vaciar la cola de Auto DJ @@ -51,22 +51,22 @@ Confirmation Clear - + Confirmación limpiada Do you really want to remove all tracks from the Auto DJ queue? - + ¿Realmente quieres eliminar todas las pistas de la cola de Auto DJ? This can not be undone. - + ¡Esto no puede ser revertido! Add Crate as Track Source - Usar cajón como fuente de pistas + Usar el cajón como fuente de pistas @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -160,7 +160,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -190,114 +190,120 @@ Duplicar - - + + Import Playlist Importar lista de reproducción - + Export Track Files Exportar pistas - + Analyze entire Playlist Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - - + + Export Playlist Exportar lista de reproducción - + Add to Auto DJ Queue (replace) Añadir a la cola de Auto DJ (reemplaza) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renombrar lista de reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Ya existe una lista de reproducción con ese nombre. - - - + + + A playlist cannot have a blank name. El nombre de la lista de reproducción no puede quedar en blanco. - + _copy //: Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallado la creación de la lista de reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Confirm Deletion Confirmar Borrado - + Do you really want to delete playlist <b>%1</b>? - Do you really want to delete playlist -%1? + ¿Deseas realmente eliminar la lista de reproducción<b>%1</b>? - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -305,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca de tiempo @@ -318,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -326,142 +332,142 @@ BaseTrackTableModel - + Album Álbum - + Album Artist Artista del álbum - + Artist Artista - + Bitrate Tasa de bits - + BPM BPM - + Channels Canales - + Color Color - + Comment Comentario - + Composer Compositor - + Cover Art Carátula - + Date Added Fecha añadida - + Last Played Última reproducción - + Duration Duración - + Type Tipo - + Genre Género - + Grouping Grupo - + Key Clave - + Location Ubicación - + Overview - + Resumen - + Preview Preescucha - + Rating Puntuación - + ReplayGain Ganancia de reproducción - + Samplerate Velocidad de muestreo - + Played Reproducido - + Title Título - + Track # Pista n.º - + Year Año - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recuperando imagen... @@ -610,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Equipo" te permite navegar, ver y abrir las pistas de las carpetas del disco duro o de dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -734,12 +750,12 @@ The file '%1' could not be found. - + El archivo '%1' no se encontró. The file '%1' could not be loaded. - + El archivo '%1' no se pudo cargar. @@ -807,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Re escanea la librería cuando se inicia Mixxx @@ -857,7 +873,7 @@ trace - Arriba + Perfilar mensajes Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Configura el tamaño máximo del archivo mixxx.log en bytes. Usa -1 para ilimitado. Por defecto es 100 MB, como en 1e5 o 100000000. @@ -867,7 +883,7 @@ trace - Arriba + Perfilar mensajes Overrides the default application GUI style. Possible values: %1 - + Anula el estilo por defecto de la interfaz de usuario de la aplicación. Valores posibles: %1 @@ -2358,7 +2374,7 @@ trace - Arriba + Perfilar mensajes Main Output delay - + Retardo (delay) de la Salida principal @@ -2464,12 +2480,12 @@ trace - Arriba + Perfilar mensajes Move Beatgrid Half a Beat - + Desplaza la cuadricula de tiempo medio pulso Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en pistas con tempo constante. @@ -2667,13 +2683,13 @@ trace - Arriba + Perfilar mensajes Sort hotcues by position - + Ordenar hotcues por posición Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) @@ -3528,7 +3544,7 @@ trace - Arriba + Perfilar mensajes Unknown - + Desconocido @@ -3633,32 +3649,32 @@ trace - Arriba + Perfilar mensajes ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funcionalidad provista por este mapa de controlador será desactivada hasta que el problema sea resuelto. - + You can ignore this error for this session but you may experience erratic behavior. Puedes ignorar este error durante esta sesión, pero podrías experimentar problemas impredecibles. - + Try to recover by resetting your controller. Prueba de corregirlo reseteando la controladora. - + Controller Mapping Error Error del mapa de controlador - + The mapping for your controller "%1" is not working properly. El mapa de tu controlador "%1" no funciona correctamente. - + The script code needs to be fixed. El código del script necesita ser reparado. @@ -3766,7 +3782,7 @@ trace - Arriba + Perfilar mensajes Importar cajón - + Export Crate Exportar cajón @@ -3776,7 +3792,7 @@ trace - Arriba + Perfilar mensajes Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: @@ -3802,17 +3818,17 @@ trace - Arriba + Perfilar mensajes No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) @@ -3938,12 +3954,12 @@ trace - Arriba + Perfilar mensajes Antiguos colaboradores - + Official Website Sitio web oficial - + Donate Donar @@ -3999,7 +4015,7 @@ trace - Arriba + Perfilar mensajes - + Analyze Analizar @@ -4044,17 +4060,17 @@ trace - Arriba + Perfilar mensajes Ejecuta el análisis de cuadrícula de tempo, clave musical y ReplayGain en las pistas seleccionadas. No genera formas de onda para las pistas seleccionadas para ahorrar espacio en disco. - + Stop Analysis Detener análisis - + Analyzing %1% %2/%3 Analizando %1% %2/%3 - + Analyzing %1/%2 Analizando %1/%2 @@ -4165,12 +4181,37 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modos de desvanecimiento de Auto DJ + +Intro completa + Outro: +Reproduce la intro completa y la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea el más corto. Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Desvanecer al iniciar la Outro: +Inicia el fundido cruzado al inicio de la outro. Si la outro es más larga que la intro, +corta el final de la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea más corto.Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Pista completa: +Reproduce la pista completa. Comienza el fundido cruzado desde el +número de segundos seleccionado antes del final de la pista. Un fundido cruzado negativo +agrega silencio entre las pistas. + +Saltar silencio: +Reproduce la pista completa excepto el silencio al inicio y al final. +Inicia el fundido cruzado desde el número de segundos seleccionado antes +del último sonido. + +Saltar silencio e iniciar con volumen al máximo: +Lo mismo que Saltar silencio, pero inicia la transición con el crossfader +centrado, de manera que la intro inicia con el volumen al máximo. Full Intro + Outro - + Entrada + Salida completa @@ -4190,7 +4231,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Saltar silencio e iniciar con volumen al máximo @@ -4471,37 +4512,37 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Si el mapeo no funciona, prueba a activar uno de los controles avanzados siguientes y prueba de nuevo. También puedes volver a detectar el control. - + Didn't get any midi messages. Please try again. No se detectó ningún mensaje MIDI. Por favor, inténtelo de nuevo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No se detectó un mapeado -- Intentelo nuevamente. Asegurese de tocar sólo un control a la vez. - + Successfully mapped control: Control mapeado con éxito: - + <i>Ready to learn %1</i> <i>Preparado para asignar %1</i> - + Learning: %1. Now move a control on your controller. Aprendizaje: %1. Ahora mueva un control en su controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + El control seleccionado no existe. <br>Esto es posiblemente un bug. Por favor repórtelo en el seguidor de bugs de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br> Trataste de vincular: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5199,120 +5240,120 @@ associated with each key. Key palette - + Paleta de notas DlgPrefController - + Apply device settings? ¿Aplicar la configuración del dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configuración debe ser aplicada antes de iniciar el asistente de aprendizaje. ¿Aplicar la configuración y continuar? - + None Ningún - + %1 by %2 %1 por %2 - + Mapping has been edited Se ha editado el mapeo - + Always overwrite during this session Siempre sobreescribir durante esta sesión - + Save As Guardar como - + Overwrite Sobreescribir - + Save user mapping Guardar mapeo del usuario - + Enter the name for saving the mapping to the user folder. Ingresar el nombre del archivo de mapeo para guardarlo en la carpeta de usuario. - + Saving mapping failed Ha fallado el guardado del mapeo - + A mapping cannot have a blank name and may not contain special characters. El nombre del mapeo no puede estar en blanco, ni contener caracteres especiales. - + A mapping file with that name already exists. Ya existe un archivo de mapeo con el mismo nombre. - + Do you want to save the changes? Quieres guardar los cambios? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si usas este mapeo, tu controlador podría no funcionar correctamente. Por favor selecciona otro mapeo o deshabilita el controlador. </b></font><br><br>Este mapeo fue diseñado para un nuevo Motor de Controladores de Mixxx, y no puede ser usado con tu instalación actual.<br>Tu instalación de Mixxx posee la version del Motor de Controladores %1. Este mapeo requiere una versión del Motor de controladores >=%2.<br><br>Para más información visita la wiki de <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versiones del Motor de Controladores</a>. - + Mapping already exists. El mapeo ya existe. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ya existe en la carpeta de mapeos de usuario. <br>¿Deseas sobreescribir o guardar con otro nombre? - + Clear Input Mappings Limpiar mapeos de Entrada - + Are you sure you want to clear all input mappings? Está seguro de querer eliminar todos los mapeos de entrada? - + Clear Output Mappings Limpiar mapeos de Salida - + Are you sure you want to clear all output mappings? Está seguro de querer eliminar todos los mapeos de salida? @@ -5332,62 +5373,62 @@ Apply settings and continue? Device Info - + Información del dispositivo Physical Interface: - + Interfase física: Vendor name: - + Nombre del fabricante: Product name: - + Nombre del producto: Vendor ID - + ID del proveedor VID: - + VID: Product ID - + ID del producto PID: - + PID: Serial number: - + Número de serie: USB interface number: - + Número de interfaz USB HID Usage-Page: - + Página de uso HID HID Usage: - + Uso de HID: @@ -5465,7 +5506,7 @@ Apply settings and continue? Data protocol: - + Protocolo de datos: @@ -5475,7 +5516,7 @@ Apply settings and continue? Mapping Settings - + Configuración de mapeo @@ -5538,7 +5579,7 @@ Apply settings and continue? Enable MIDI Through Port - + Activar puerto de MIDI Through @@ -5643,6 +5684,16 @@ Apply settings and continue? Multi-Sampling Multi-Muestreo + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6170,7 +6221,7 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform Export - + Exportar @@ -6201,12 +6252,12 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform ❯ - + ❮ - + @@ -6257,62 +6308,62 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. El tamaño mínimo de la apariencia seleccionada es mas grande que la resolucion de su pantalla. - + Allow screensaver to run Permite el salvapantallas - + Prevent screensaver from running Evita que se active el salvapantallas - + Prevent screensaver while playing Evita el salvapantallas mientras reproduce - + Disabled Desactivado - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Este skin no soporta esquemas de color - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx debe ser reiniciado para que el nuevo ajuste de locale, escalado o multi-muestreo tenga efecto. @@ -7024,7 +7075,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Reset stem controls on track load - + Reiniciar controles de stem al cargar pista @@ -7482,173 +7533,172 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Para activar el Planificador en tiempo real (actualmente desactivado), mira %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 muestra una lista de tarjetas de sonido y controladores que podrías considerar para utilizar con Mixxx - + Mixxx DJ Hardware Guide Guía de Hardware DJ de Mixxx - + Information Información - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx debe ser reiniciado para que el cambio de ajuste de RubberBand multi-hilo tenga efecto. - + auto (<= 1024 frames/period) auto (<= 1024 fotogramas/período) - + 2048 frames/period 2048 fotogramas/período - + 4096 frames/period 4096 fotogramas/período - + Are you sure? ¿Estás seguro(a)? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Distribuir los canales estéreo en canales mono para su procesamiento en paralelo podría resultar en la pérdida de la compatibilidad mono y una imagen estéreo difusa. No se recomienda al transmitir en vivo o al grabar. - + Are you sure you wish to proceed? ¿Realmente deseas continuar? - + No No - + Yes, I know what I am doing Sí, se lo que estoy haciendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + Main output only Solo Salida principal - + Main and booth outputs Salidas principal y de cabina - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7666,131 +7716,131 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y API de sonido - + Sample Rate Frecuencia de muestreo - + Audio Buffer Búfer de audio - + Engine Clock Relog del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa el reloj de la tarjeta de sonido para emitir a un público presente y para la menor latencia. <br>Usa el reloj de red para emitir en vivo sin un público presente. - + Main Mix Mezcla principal - + Main Output Mode Modo de Salida principal - + Microphone Monitor Mode Modo de monitorización del micrófono - + Microphone Latency Compensation Compensación de latencia del micrófono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de vaciado del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Bloqueo tonal/Motor de Pitch-bend - + Multi-Soundcard Synchronization Sincronización con Múltiples Tarjetas de Sonido - + Output Salida - + Input Entrada - + System Reported Latency Latencia reportada por el sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente su búfer de audio si el contador de desbordamiento está aumentando o escuchas chasquidos durante la reproducción. - + Main Output Delay Retardo Salida Principal - + Headphone Output Delay Retraso/delay de la Salida de auriculares - + Booth Output Delay Retraso/delay de la salida de cabina - + Dual-threaded Stereo Estéreo en doble-hilo - + Hints and Diagnostics Diagnóstico y sugerencias - + Downsize your audio buffer to improve Mixxx's responsiveness. Disminuya su búfer de audio para mejorar la velocidad de respuesta de Mixxx. - + Query Devices Consultar aparatos @@ -7948,12 +7998,12 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y 1/3 of waveform viewer options for "Text height limit" - + 1/3 de visualización de forma de onda Entire waveform viewer - + Visor de forma de onda completa @@ -7986,7 +8036,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y OpenGL Status - + Estado de OpenGL @@ -8141,12 +8191,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferred font size - + Tamaño de tipo de letra preferido Text height limit - + Límite de altura de texto @@ -8186,18 +8236,18 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat grid opacity - + Superar la opacidad de la rejilla Scrolling Waveforms - + Deslizar formas de onda Type - + Tipo @@ -8207,7 +8257,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Set amount of opacity on beat grid lines. - + Establece la cantidad de opacidad en las líneas de la cuadrícula del compás. @@ -8217,17 +8267,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Play marker position - + <br><div><br data-mce-bogus="1"></div> Moves the play marker position on the waveforms to the left, right or center (default). - + Mover the marcador de posición en la pista a la izquierda, derecha o centro (Defabrica). Overview Waveforms - + Visualizar formas de onda @@ -8468,7 +8518,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se No cues matched the specified criteria. - + Ninguna marca igualó el criterio especificado. @@ -9350,27 +9400,27 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mejor) - + Rubberband R3 (near-hi-fi quality) Banda elástica R3 (calidad casi alta fidelidad) - + Unknown, using Rubberband (better) Desconocido, utilizando Banda elástica (mejor) - + Unknown, using Soundtouch Desconocido, usando Soundtouch @@ -9555,12 +9605,12 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Change color - + Cambiar color Choose a new color - + Escoger un nuevo color @@ -9568,32 +9618,32 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Browse... - + Examinar… No file selected - + No se ha seleccionado ningún archivo Select a file - + Seleccionar un archivo LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9605,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep de OpenGL. - + activate activar - + toggle conmutar - + right derecha - + left izquierda - + right small derecha pequeño - + left small izquierda pequeño - + up arriba - + down abajo - + up small arriba pequeño - + down small abajo pequeño - + Shortcut Atajo @@ -9663,37 +9713,37 @@ de OpenGL. Library - + This or a parent directory is already in your library. Este directorio o su superior ya se encuentra en tu biblioteca. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Este directorio o el indicado no existe o es inaccesible. Cancelando la operación para evitar inconsistencias de biblioteca. - - + + This directory can not be read. Este directorio no puede ser leído. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ha ocurrido un error desconocido. Cancelando la operación para evitar inconsistencias de biblioteca - + Can't add Directory to Library No se pudo agregar el directorio a la biblioteca - + Could not add <b>%1</b> to your library. %2 @@ -9702,27 +9752,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca %2 - + Can't remove Directory from Library No se pudo remover el directorio de la biblioteca. - + An unknown error occurred. Ha ocurrido un error desconocido. - + This directory does not exist or is inaccessible. Este directorio no existe o es inaccesible. - + Relink Directory Reenlazar directorio - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9734,27 +9784,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca LibraryFeature - + Import Playlist Importar lista de reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? ¿Sobrescribir archivo? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. Do you really want to overwrite it? - + Ya existe un archivo de lista de reproducción con el nombre "% 1". Se agregó la extensión predeterminada "m3u" porque no se especificó ninguna. ¿Realmente desea sobrescribirla? @@ -9900,253 +9950,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy El dispositivo de sonido está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reintente</b> luego de cerrar las otras aplicaciones o reconectar un dispositivo de sonido - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> las opciones del dispositivo de sonido de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obtenga <b>ayuda</b> del wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Salir</b> de Mixxx. - + Retry Reintentar - + skin apariencia - + Allow Mixxx to hide the menu bar? ¿Permitir a Mixxx ocultar la barra de menú? - + Hide Always show the menu bar? Ocultar - + Always show Mostrar siempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra de menú de Mixxx ha sido ocultada y se puede alternar presionando la tecla <b>Alt</b>. <br><br>Haz clic en <b>%1</b> para aceptar. <br><br>Haz clic en <b>%2</b> para desactivarlo, por ejemplo si usas Mixxx sin un teclado. <br><br>Puedes cambiar este ajuste en cualquier momento en Preferencias -> Interfaz. <br> - + Ask me again Pregúntame de nuevo - - + + Reconfigure Reconfigurar - + Help Ayuda - - + + Exit Salir - - + + Mixxx was unable to open all the configured sound devices. Mixxx no ha podido activar todos los dispositivos de sonido configurados. - + Sound Device Error Error del dispositivo de sonido - + <b>Retry</b> after fixing an issue <b>Reintenta</b> una vez corregido el problema - + No Output Devices No hay dispositivos de salida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx fue configurado sin ningún dispositivo de salida de audio. El procesamiento de audio estará desactivado mientras no se configure un dispositivo de audio de salida. - + <b>Continue</b> without any outputs. <b>Continuar</b> sin ninguna salida. - + Continue Continuar - + Load track to Deck %1 Cargar pista al plato %1 - + Deck %1 is currently playing a track. El plato %1 está reproduciendo una pista. - + Are you sure you want to load a new track? ¿Está seguro de cargar una pista nueva? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control por vinilo. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control passthrough. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this microphone. Do you want to select an input device? No se ha seleccionado un dispositivo de Entrada para este micrófono. ¿Deseas escoger uno ahora? - + There is no input device selected for this auxiliary. Do you want to select an input device? No se ha seleccionado un dispositivo de entrada para este Auxiliar. ¿Deseas escoger uno ahora? - + Scan took %1 - + El escaneo tomo %1 - + No changes detected. - + No se han detectado cambios - - + + %1 tracks in total - + %1 pistas en total - + %1 new tracks found - + Encontradas %1 pistas nuevas - + %1 moved tracks detected - + %1 pistas movidas detectadas - + %1 tracks are missing (%2 total) - + %1 pistas perdidas (%2 en total) - + %1 tracks have been rediscovered - + %1 pistas han sido reencontradas - + Library scan finished - + Escaneo de la biblioteca terminado - + Error in skin file Error en el archivo de la apariencia - + The selected skin cannot be loaded. No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering Renderizado directo de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + El renderizado directo no está habilitado en su máquina. <br><br>Esto significa que las visualizaciones de forma de onda serán muy <br><b>lentas y pueden exigir mucho a su CPU</b>. Actualice su <br>configuración para habilitar la representación directa o desactiv<br> las visualizaciones de forma de onda en las preferencias de Mixxx seleccionando <br>"Vacío" como la pantalla de forma de onda en la sección 'Interfaz'. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -10162,13 +10212,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reproducción @@ -10178,32 +10228,58 @@ Do you want to select an input device? Aleatorizar lista de reproducción - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Las listas de reproducción son listar ordenadas de pistas que te permiten planificar tus sesiones de DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Podría ser necesario saltar algunas pistas en tu lista de reproducción planificada, o añadir algunas pistas diferentes, con el fin de mantener la energía de tu audiencia. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + Create New Playlist Crear nueva lista de reproducción @@ -10213,7 +10289,7 @@ Do you want to select an input device? Mixxx Hotcue Colors - + Colores de hotcues de Mixxx @@ -10221,82 +10297,82 @@ Do you want to select an input device? Serato DJ Track Metadata Hotcue Colors - + Metadatos de colores de hotcues de pistas de Serato DJ Serato DJ Pro Hotcue Colors - + Colores de hotcues de Serato DJ Pro Rekordbox COLD1 Hotcue Colors - + Colores de hotcues de Rekordbox COLD1 Rekordbox COLD2 Hotcue Colors - + Colores de hotcues de Rekordbox COLD2 Rekordbox COLORFUL Hotcue Colors - + Colores de hotcues COLORFUL de Rekordbox Mixxx Track Colors - + Colores de pistas de Mixxx Rekordbox Track Colors - + Colores de pistas de Rekordbox Serato DJ Pro Track Colors - + Colores de pistas de Serato DJ Pro Traktor Pro Track Colors - + Colores de pistas de Traktor Pro VirtualDJ Track Colors - + Colores de pistas de VirtualDJ Mixxx Key Colors - + Colores de notas de Mixxx Traktor Key Colors - + Colores de notas de Traktor Mixed In Key - Key Colors - + Colores de notas de Mixed In Key Protanopia / Protanomaly Key Colors - + Colores de notas de Protanopia/Protanomalía Deuteranopia / Deuteranomaly Key Colors - + Colores de notas de Deuteranopía/Deuteranomalía Tritanopia / Tritanomaly Key Colors - + Colores de notas de Tritanopía/Tritanomalía @@ -10430,7 +10506,7 @@ Do you want to scan your library for cover files now? Switch - + Switch @@ -10880,7 +10956,7 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p The Mixxx Team - + Equipo de Mixxx @@ -10910,12 +10986,12 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p Gain - + Ganancia Set the gain of metronome click sound - + Configura la ganancia del sonido del metrónomo @@ -11864,7 +11940,7 @@ Consejo: compensa las voces de "ardillitas" o "gruñonas"La cantidad de amplificación aplicada a la señal de audio. A niveles más altos, el audio estará más distorsionado. - + Passthrough Paso @@ -12034,12 +12110,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. varios - + built-in nativo - + missing no encontrado @@ -12167,54 +12243,54 @@ pueden introducir un efecto de "bombeo" y/o distorsión. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listas de reproducción - + Folders Carpetas - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Accesos Directos - + Loops (only the first loop is currently usable in Mixxx) Bucles (solo el primer bucle es utilizable en Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Buscar dispositivos de almacenamiento Rekordbox (refrescar) - + Beatgrids Grillas de pulsos - + Memory cues Cues en memoria - + (loading) Rekordbox (cargando) Rekordbox @@ -12656,22 +12732,22 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Reading track for fingerprinting failed. - + Ha fallado la lectura de la pista para fingerprinting Identifying track through AcoustID - + Identificando pista mediante AcoustID Could not identify track through AcoustID. - + No se pudo identificar la pista mediante AcoustID. Could not find this track in the MusicBrainz database. - + No se pudo encontrar esta pista en la base de datos de MusicBrainz. @@ -13243,7 +13319,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Toggle visibility of Rate Control - + Alternar visibilidad del control de velocidad @@ -13393,7 +13469,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. - + Mantener el clic izquierdo permite previsualizar la posición donde la cabeza de reproducción saltará al soltarlo. El arrastre puede ser abortado con el clic derecho. @@ -13443,12 +13519,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Shows the current volume for the left channel of the main output. - + Muestra el volumen actual para el canal izquierdo en la salida principal. Shows the current volume for the right channel of the main output. - + Muestra el volumen actual para el canal derecho de la salida principal. @@ -13460,27 +13536,27 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Adjusts the main output gain. - + Ajusta el volumen principal Determines the main output by fading between the left and right channels. - + Determina la salida principal desvaneciendo entre los canales izquierdo y derecho. Adjusts the left/right channel balance on the main output. - + Ajusta el balance de los canales izquierdo/derecho en la salida principal. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Desvanecimiento cruzado de la salida de auriculares entre la salida principal y la señal de cueing (PFL o Escucha Pre-Deslizador) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si se activa, la señal principal de la mezcla se reproduce en el canal derecho, mientras que la señal de cueing se reproduce en el canal izquierdo. @@ -13495,12 +13571,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Show/hide the beatgrid controls section - + Mostrar/ocultar la sección de controles de la cuadrícula de tiempo Show/hide the stem mixing controls section - + Mostrar/ocultar la sección de controles de mezcla de stems @@ -13510,17 +13586,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Volume Meters - + Medidores de volumen mix microphone input into the main output. - + mezcla la entrada de micrófono con la salida principal. Auto: Automatically reduce music volume when microphone volume rises above threshold. - + Auto: reduce automáticamente el volumen de la música cuando el volumen del micrófono supera el umbral. @@ -13531,17 +13607,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: configura cuánto se reduce el volumen de la música cuando el volumen de los micrófonos activos supera el umbral. Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + Manual: configura cuánto reducir e If keylock is disabled, pitch is also affected. - + Si el bloqueo tonal se desactiva, la altura también es afectada. @@ -13556,7 +13632,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Raises playback speed in small steps. - + Incrementa la velocidad de reproducción en pasos pequeños. @@ -13571,7 +13647,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Lowers playback speed in small steps. - + Reduce la velocidad de reproducción en pasos pequeños. @@ -13581,12 +13657,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed higher while active (tempo). - + Mantiene la velocidad de reproducción alta cuando se activa (tempo). Holds playback speed higher (small amount) while active. - + Mantiene la velocidad de reproducción alta (pequeña cantidad) cuando se activa. @@ -13596,59 +13672,60 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed lower while active (tempo). - + Mantiene la velocidad de reproducción baja cuando se activa (tempo). Holds playback speed lower (small amount) while active. - + Mantiene la velocidad de reproducción baja (pequeña cantidad) cuando se activa. When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Cuando se pulsa repetidamente, ajusta el tempo para coincidir con la frecuencia de pulsaciones. Tempo Tap - + Seguidor de Tempo (Tempo Tap) Rate Tap and BPM Tap - + Frecuencia de pulsaciones y de BPM Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en +pistas con tempo constante Revert last BPM/Beatgrid Change - + Revierte el último cambio de BPM/cuadrícula de tiempo Revert last BPM/Beatgrid Change of the loaded track. - + Revierte el último cambio de BPM/Cuadrícula de tiempo para la pista cargada. Toggle the BPM/beatgrid lock - + Cambia el bloqueo de BPM/cuadrícula de tiempo Tempo and Rate Tap - + Toques de Tempo y Frecuencia Tempo, Rate Tap and BPM Tap - + Toques de Tempo, Frecuencia y BPM @@ -13659,84 +13736,84 @@ tracks with constant tempo. Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Cambia marcas importadas desde Serato o Rekordbox si están ligeramente desfazadas. Left click: shift 10 milliseconds earlier - + Clic izquierdo: adelantar 10 milisegundos Right click: shift 1 millisecond earlier - + Clic derecho: adelantar 1 milisegundo Shift cues later - + Retrasar cues Left click: shift 10 milliseconds later - + Clic izquierdo: retrasar 10 milisegundos Right click: shift 1 millisecond later - + Clic derecho: retrasar 1 milisegundo Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Arrastra un botón de Hotcue aquí para continuar reproduciendo después de soltar la hotcue. Hint: Change the default cue mode in Preferences -> Decks. - + Sugerencia: cambie el modo por defecto de las cues en Preferencias -> Platos. Mutes the selected channel's audio in the main output. - + Silencia el audio del canal seleccionado en la salida principal. Main mix enable - + Activador de mezcla principal Hold or short click for latching to mix this input into the main output. - + Clic sostenido o corto para enganchar, para mezclar esta entrada con la salida principal. If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + Si la hotcue es una cue de bucle, activa el bucle y salta hacia él si se encuentra detrás de la posición de reproducción. If the play position is inside an active loop, stores the loop as loop cue. - + Si la posición de reproducción se encuentra dentro de un bucle activo, almacena el bucle como una hotcue de bucle. Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Arrastrar este botón dentro de otro botón de hotcue para moverlo hacia este (cambiando su número). Si la otra hotcue ya se encuentra definida, las dos son intercambiadas. Expand/Collapse Samplers - + Expandir/contraer samplers Toggle expanded samplers view. - + Alternar la vista expandida de los samplers. @@ -13746,12 +13823,12 @@ tracks with constant tempo. Auto DJ is active - + Auto DJ se encuentra activo Red for when needle skip has been detected. - + Rojo cuando se detecta un salto de aguja. @@ -13791,7 +13868,7 @@ tracks with constant tempo. If the track has no beats the unit is seconds. - + Si la pista no tiene pulsaciones, la unidad es segundos. @@ -13831,12 +13908,12 @@ tracks with constant tempo. Beatloop Anchor - + Ancla del bucle de pulsaciones Define whether the loop is created and adjusted from its staring point or ending point. - + Define si el bucle es creado y ajustado desde su punto de inicio o de final. @@ -13931,12 +14008,12 @@ tracks with constant tempo. Hint: Change the time format in Preferences -> Decks. - + Sugerencia: cambie el formato de tiempo en Preferencias -> Platos. Show/hide intro & outro markers and associated buttons. - + Mostrar/ocultar marcadores de intro y outro, y sus botones asociados. @@ -13949,7 +14026,7 @@ tracks with constant tempo. If marker is set, jumps to the marker. - + Si el marcador se encuentra definido, salta al marcador. @@ -13957,7 +14034,7 @@ tracks with constant tempo. If marker is not set, sets the marker to the current play position. - + Si el marcador no se encuentra definido, lo configura a la posición de reproducción actual. @@ -13965,7 +14042,7 @@ tracks with constant tempo. If marker is set, clears the marker. - + Si el marcador se encuentra definido, lo elimina. @@ -13990,7 +14067,7 @@ tracks with constant tempo. Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajuste la mezcla de la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos @@ -14000,7 +14077,7 @@ tracks with constant tempo. D+W mode: Add wet to dry - + Modo D+W: agregue húmedo a seco @@ -14010,24 +14087,25 @@ tracks with constant tempo. Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajuste cómo se mezcla la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Modo seco / húmedo (líneas cruzadas): Mezcle los fundidos cruzados de la perilla entre seco y húmedo. Use esto para cambiar el sonido de la pista con EQ y efectos de filtro. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Modo Seco+Húmedo (línea seca plana): La perilla de mezcla agrega mojado a seco +Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efectos de filtrado. Route the main mix through this effect unit. - + Enruta la mezcla principal a través de esta unidad de efectos. @@ -14047,42 +14125,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Stem Label - + Etiqueta de stem Name of the stem stored in the stem file - + Nombre del stem almacenado en el archivo de stem Text is displayed in the stem color stored in the stem file - + El texto es presentado con el color del stem almacenado en el archivo de stem this stem color is also used for the waveform of this stem - + este color de stem también es usado en la forma de onda de este stem Stem Mute - + Silenciar stem Toggle the stem mute/unmuted - + Alterna el silencio del stem Stem Volume Knob - + Perilla de volumen del stem Adjusts the volume of the stem - + Ajusta el volumen del stem @@ -14556,7 +14634,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drag this item to other decks/samplers, to crates and playlist or to external file manager. - + Arrastra este elemento a otros decks/samplers, a cajas y listas de reproducción o a un gestor de archivos externo. @@ -14566,17 +14644,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Left click to jump around in the track. - + Clic izquierdo para saltar a lo largo de la pista. Right click hotcues to edit their labels and colors. - + Click derecho en los accesos directos para editar sus etiquetas y colores. Right click anywhere else to show the time at that point. - + Clic derecho en cualquier otra parte para mostrar el tiempo en ese punto. @@ -14671,7 +14749,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Maximize Library - + Maximizar Biblioteca @@ -14686,7 +14764,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Changes the number of hotcue buttons displayed in the deck - + Cambia el número de botones de acceso directo mostrados en el deck @@ -14712,12 +14790,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Opens the track properties editor - + Abre el editor de propiedades de pista Opens the track context menu. - + Abre el menú contextual de la pista @@ -14819,12 +14897,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drag this button onto a Play button while previewing to continue playback after release. - + Arrastre este botón a un boton de Play durante la preescucha para continuar la reproducción tras soltarlo. Dragging with Shift key pressed will not start previewing the hotcue. - + Arrastrar mientras presiona la tecla Shift no iniciará la preescucha de la hotcue. @@ -15258,22 +15336,22 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Replace Existing File? - + ¿Reemplazar el archivo existente? "%1" already exists, replace? - + "%1% ya existe, ¿reemplazar? &Replace - + &Reemplazar Apply to all files - + Aplicar a todos los archivos @@ -15372,7 +15450,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. frameSwapped-signal driven phase locked loop - + Bucle con bloqueo de fase manejado por señal con marco cambiado @@ -15398,12 +15476,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. No color - + Sin color Custom color - + Color personalizado @@ -15456,47 +15534,47 @@ Carpeta: %2 WCueMenuPopup - + Cue number - + Número de cue - + Cue position Posición Marca - + Edit cue label - + Editar etiqueta de marca - + Label... - + Etiqueta... - + Delete this cue Borrar esta marca - + Toggle this cue type between normal cue and saved loop - + Alterna el tipo de esta cue entre cue normal y bucle guardado - + Left-click: Use the old size or the current beatloop size as the loop size - + Clic izquierdo: usar el tamaño anterior o el del bucle actual como el tamaño de bucle - + Right-click: Use the current play position as loop end if it is after the cue - + Clic derecho: usar la posición de reproducción actual como final del bucle si se encuentra después de la cue - + Hotcue #%1 Hotcue #%1 @@ -15511,7 +15589,7 @@ Carpeta: %2 Rename Preset - + Renombrar preajuste @@ -15621,407 +15699,437 @@ Carpeta: %2 + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Crear &nueva Playlist - + Create a new playlist Crear una nueva lista de reproducción - + Ctrl+n Ctrl+N - + Create New &Crate Crear un nuevo&cajón - + Create a new crate Crear un nuevo cajón - + Ctrl+Shift+N Ctrl+Mayús+N - - + + &View &Vista - + Auto-hide menu bar - + Auto-ocultar barra de menú - + Auto-hide the main menu bar when it's not used. - + Auto-ocultar la barra de menú principal cuando no es utilizada. - + May not be supported on all skins. Puede no estar disponible para todas las apariencias. - + Show Skin Settings Menu Mostrar menú de ajustes de aspecto - + Show the Skin Settings Menu of the currently selected Skin Mostrar el menú de ajustes de aspecto del seleccionado actualmente - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar seccion del microfono - + Show the microphone section of the Mixxx interface. Muestra la sección de control de micrófono de la interfaz de Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar la Sección de Control de Vinilo - + Show the vinyl control section of the Mixxx interface. Muestra la sección de control de vinilo de la interfaz de Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar el reproductor de preescucha - + Show the preview deck in the Mixxx interface. Muestra el reproductor de preescucha en la interfaz de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Muestra carátulas - + Show cover art in the Mixxx interface. Muestra las carátulas en la interfaz de Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximizar la biblioteca para tomar todo el espacio disponible en pantalla. - + Space Menubar|View|Maximize Library - + Espacio - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Mostrar Mixxx a pantalla completa - + &Options &Opciones - + &Vinyl Control Control de &vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con codigo de tiempo en bandejas externas para controlar Mixxx - + Enable Vinyl Control &%1 Habilita el Control por Vinilo &%1 - + &Record Mix &Grabar Mezcla - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar transmisión en &vivo - + Stream your mixes to a shoutcast or icecast server Transmite tus mezclas a un servidor shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar Atajos de &Teclado - + Toggles keyboard shortcuts on or off Activa o desactiva los atajos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar la configuración de Mixxx (p.ej.: reproducción, MIDI, controles) - + &Developer &Desarrollador - + &Reload Skin &Recargar apariencia - + Reload the skin Recargar la apariencia - + Ctrl+Shift+R Ctrl+Mayús+R - + Developer &Tools U&tilidades de desarrollador - + Opens the developer tools dialog Abre el cuadro de diálogo de herramientas de desarrollo - + Ctrl+Shift+T Ctrl+Mayús+T - + Stats: &Experiment Bucket Estadísticas: Contadores &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el modo experimental. Recoje estadísticas en los contadores EXPERIMENT. - + Ctrl+Shift+E Ctrl+Mayús+E - + Stats: &Base Bucket Estadísticas: contadores &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el modo base. Recoje estadísticas en los contadores BASE. - + Ctrl+Shift+B Ctrl+Mayús+B - + Deb&ugger Enabled Dep&uración activada - + Enables the debugger during skin parsing Activa el depurador durante el análisis de la máscara - + Ctrl+Shift+D Ctrl+Mayús+D - + &Help Ay&uda - + Show Keywheel menu title - + Mostrar rueda de notas E&xport Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ Export the library to the Engine DJ format - + Exportar biblioteca al formato Engine DJ - + Show keywheel tooltip text - + Mostrar rueda de notas - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Soporte &comunitario - + Get help with Mixxx Obtener ayuda con Mixxx - + &User Manual Manual de &usuario - + Read the Mixxx user manual. Lea el manual de usuario de Mixxx. - + &Keyboard Shortcuts Atajos de &Teclado - + Speed up your workflow with keyboard shortcuts. Trabaja más rápidamente usando los atajos de teclado. - + &Settings directory &Directorio de configuración - + Open the Mixxx user settings directory. Abre el directorio de configuración de usuario de Mixxx. - + &Translate This Application &Traducir esta aplicación - + Help translate this application into your language. Ayude a traducir esta aplicación a su idioma. - + &About &Acerca de - + About the application Acerca de la aplicación @@ -16037,7 +16145,7 @@ Carpeta: %2 Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - + Listo para reproducir, analizando... @@ -16050,31 +16158,19 @@ Carpeta: %2 Finalizing... Text on waveform overview during finalizing of waveform analysis - + Finalizando... WSearchLineEdit - - Clear input - Clear the search bar input field - Borrar el texto - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input Borrar el texto @@ -16085,93 +16181,87 @@ Carpeta: %2 Buscar... - + Clear the search bar input field - + Limpia el campo de entrada de la barra de búsqueda - - Enter a string to search for - Introducir el texto a buscar + + Return + Volver - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library - Para más información vea el Manual de Usuario> Biblioteca Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Atajo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Poner el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retroceso + + Additional Shortcuts When Focused: + - Shortcuts - Atajos + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Activa la búsqueda antes del tiempo de espera de "búsqueda mientras escribe" o salte a la vista de pistas después + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Ctrl+Espacio - + Toggle search history Shows/hides the search history entries - + Alternar historial de búsqueda - + Delete or Backspace Borrar o Retorno - - Delete query from history - Borrar Consulta del Historial - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Salir de la busqueda + + Delete query from history + Borrar Consulta del Historial @@ -16179,7 +16269,7 @@ Carpeta: %2 Search related Tracks - + Buscar pistas relacionadas @@ -16189,7 +16279,7 @@ Carpeta: %2 harmonic with %1 - + armónico con %1 @@ -16199,7 +16289,7 @@ Carpeta: %2 between %1 and %2 - + entre %1 y %2 @@ -16249,7 +16339,7 @@ Carpeta: %2 &Search selected - + &Búsqueda seleccionada @@ -16287,7 +16377,7 @@ Carpeta: %2 Update external collections - + Actualizar colecciones externas @@ -16297,12 +16387,12 @@ Carpeta: %2 Adjust BPM - + Ajustar BPM Select Color - + Seleccionar color @@ -16470,12 +16560,12 @@ Carpeta: %2 Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) Sort hotcues by position - + Ordenar hotcues por posición @@ -16520,7 +16610,7 @@ Carpeta: %2 Shift Beatgrid Half Beat - + Desplazar la cuadrícula de tiempo medio beat @@ -16608,7 +16698,7 @@ Carpeta: %2 Undo BPM/beats change of %n track(s) - + Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s) @@ -16623,7 +16713,7 @@ Carpeta: %2 Setting rating of %n track(s) - + Definiendo evaluación de %n pistaDefiniendo evaluación de %n pistasDefiniendo evaluación de %n pista(s) @@ -16678,12 +16768,12 @@ Carpeta: %2 Sorting hotcues of %n track(s) by position (remove offsets) - + Ordenando hotcues de %n pista por posición (removiendo desfases)Ordenando hotcues de %n pistas por posición (removiendo desfases)Ordenando hotcues de %n pistas(s) por posición (removiendo desfases) Sorting hotcues of %n track(s) by position - + Ordenando hotcues de %n pista por posiciónOrdenando hotcues de %n pistas por posiciónOrdenando hotcues de %n pista(s) por posición @@ -16708,7 +16798,7 @@ Carpeta: %2 Move these files to the trash bin? - + ¿Mover estos archivos a la papelera? @@ -16734,7 +16824,7 @@ Carpeta: %2 Okay - + Okey @@ -16784,7 +16874,7 @@ Carpeta: %2 Remaining Track File(s) - + Renombrando archivo(s) de pista @@ -16795,7 +16885,7 @@ Carpeta: %2 Clear Reset metadata in right click track context menu in library - + Climpiar @@ -16805,37 +16895,37 @@ Carpeta: %2 Clear BPM and Beatgrid - + Limpia las BPM y la cuadrícula de tiempo Undo last BPM/beats change - + Revertir el último cambio de BPM/pulsaciones Move this track file to the trash bin? - + ¿Mover este archivo de pista a la papelera? Permanently delete this track file from disk? - + ¿Eliminar permanentemente este archivo de pista del disco? All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + Todos los platos donde estas pistas hayan sido cargadas se detendrán, y las pistas serán expulsadas. All decks where this track is loaded will be stopped and the track will be ejected. - + Todos los platos donde esta pista haya sido cargada se detendrán, y la pista será expulsada. Removing %n track file(s) from disk... - + Removiendo %n archivo(s) de pista del disco... @@ -16855,12 +16945,12 @@ Carpeta: %2 Don't show again during this session - + No mostrar nuevamente durante esta sesión The following %1 file(s) could not be moved to trash - + El/los siguiente(s) %1 archivo(s) no pudieron ser movidos a la papelera @@ -16883,7 +16973,7 @@ Carpeta: %2 title - + título @@ -16891,73 +16981,73 @@ Carpeta: %2 Load for stem mixing - + Cargar para mezcla de stems Load pre-mixed stereo track - + Cargar pista estéreo premezclada Load the "%1" stem - + Cargar el stem "%1" Load multiple stem into a stereo deck - + Cargar múltiples stems en un plato estéreo Select stems to load - + Seleccionar stems a cargar Release "CTRL" to load the current selection - + Soltar "Ctrl" para cargar la selección actual Use "CTRL" to select multiple stems - + Use "Ctrl" para seleccionar múltiples stems WTrackTableView - + Confirm track hide Confirmar ocultar pista - + Are you sure you want to hide the selected tracks? ¿Estas seguro de que quieres ocultar las pistas seleccionadas? - + Are you sure you want to remove the selected tracks from AutoDJ queue? ¿Esta seguro de que quiere eliminar las pistas seleccionadas de la cola del AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Estás seguro que quieres eliminar las pistas seleccionada de este cajón? - + Are you sure you want to remove the selected tracks from this playlist? ¿Esta seguro de que desea eliminar las pistas seleccionadas de la lista de reproducción? - + Don't ask again during this session No volver a preguntar durante esta sesión - + Confirm track removal Confirmar eliminación del track @@ -16972,58 +17062,58 @@ Carpeta: %2 Shuffle Tracks - + Mezclar pistas mixxx::CoreServices - + fonts tipos de letra - + database base de datos - + effects efectos - + audio interface interface de sonido - + decks - + decks - + library Biblioteca - + Choose music library directory Elija el directorio de la biblioteca de la música - + controllers - + Controladores - + Cannot open database No se puede abrir la base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17037,70 +17127,80 @@ Pulse Aceptar para salir. mixxx::DlgLibraryExport - + Entire music library + Biblioteca de música completa + + + + Crates - - Selected crates - Cajas seleccionadas + + Playlists + - + + Selected crates/playlists + + + + Browse Ver - + Export directory - + Exportar directorio - + Database version - + Versión de base de datos - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ - + Export Library To - + Exportar biblioteca a - + No Export Directory Chosen - + No se seleccionó un directorio de exportación - + No export directory was chosen. Please choose a directory in order to export the music library. - + No se escogió un directorio de exportación. Por favor escoja un directorio para poder exportar la biblioteca de música. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + Una base de datos ya existe en el directorio seleccionado. Las pistas exportadas serán añadidas a esta base de datos. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - + Una base de datos ya existe en el directorio seleccionado, pero ocurrió un problema al cargarla. No se garantiza una exportación exitosa en esta situación. @@ -17119,34 +17219,35 @@ Pulse Aceptar para salir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message - + Fallo al exportar %1 - %2: +%3 mixxx::LibraryExporter - + Export Completed - + Exportación completada - - Exported %1 track(s) and %2 crate(s). - Exportados %1 pista(s) y %2 caja(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed - + Exportación fallida - + Exporting to Engine DJ... - + Exportando a Engine DJ... @@ -17154,7 +17255,7 @@ Pulse Aceptar para salir. Abort - + Abortar @@ -17162,7 +17263,7 @@ Pulse Aceptar para salir. No network access - + Sin conexión a la red diff --git a/res/translations/mixxx_es_MX.qm b/res/translations/mixxx_es_MX.qm index 3adc212aa965c0aae7a695399e5dc40e48e45c03..968126c38cbae315066f449ded8f483121c9a2c5 100644 GIT binary patch delta 54505 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 z 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 X;qH~W0*gz)79lZK4sCi;TPgoP;XD^t delta 25616 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 diff --git a/res/translations/mixxx_es_MX.ts b/res/translations/mixxx_es_MX.ts index 0947c8991dbf..f0e558627127 100644 --- a/res/translations/mixxx_es_MX.ts +++ b/res/translations/mixxx_es_MX.ts @@ -26,17 +26,17 @@ Enable Auto DJ - + Activar Auto DJ Disable Auto DJ - + Desactivar Auto DJ Clear Auto DJ Queue - + Limpiar la cola de Auto DJ @@ -51,17 +51,17 @@ Confirmation Clear - + Confirmación limpiada Do you really want to remove all tracks from the Auto DJ queue? - + Realmente quieres eliminar todas las pistas de la cola de Auto DJ? This can not be undone. - + ¡Esto no puede ser revertido! @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -160,7 +160,7 @@ - + Create New Playlist Crear una nueva lista de reproducción @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar Lista de Reproducción - + Export Track Files Exportar pistas de audio - + Analyze entire Playlist Analizar toda la lista de reproducción - + Enter new name for playlist: Introducir nuevo nombre de Lista de Repoducción - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Introducir nuevo nombre de lista de reproducción - - + + Export Playlist Exportar lista de reproducción - + Add to Auto DJ Queue (replace) Añadir a la lista de DJ Automático (reemplazar). - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renombrar Lista de Reproducción - - + + Renaming Playlist Failed Renombrando lista de reproducción fallida - - - + + + A playlist by that name already exists. Una lista de reproducción ya existe con el mismo nombre - - - + + + A playlist cannot have a blank name. El nombre de una lista de reproduccion no puede estar vacío - + _copy //: Appendix to default name when duplicating a playlist Copiar - - - - - - + + + + + + Playlist Creation Failed Fallo la creación de lista de Reproducción - - + + An unknown error occurred while creating playlist: Un error desconocido ocurrio mientras la creacion de la lista de reproducción - + Confirm Deletion Confirmar Borrado - + Do you really want to delete playlist <b>%1</b>? ¿Desea realmente eliminar la lista de reproducción<b>%1</b>? - + M3U Playlist (*.m3u) Lista de Reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca de tiempo @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se puede cargar la pista @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artista del Album - + Artist Artista - + Bitrate Tasa de Muestreo - + BPM BPM - + Channels Canales - + Color Color - + Comment Comentario - + Composer Compositor - + Cover Art Portada - + Date Added Fecha de Agregado - + Last Played Última reproducción - + Duration Duración - + Type Tipo - + Genre Genero - + Grouping Agrupación - + Key Tono - + Location Ubicación - + Overview - + Resumen - + Preview Vista Previa - + Rating Calificación - + ReplayGain Reproducir otra vez - + Samplerate Tasa de muestreo - + Played Reproducido - + Title Título - + Track # Pista # - + Year Año - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recuperando imagen... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computadora" le permite navegar, ver y cargar pistas desde carpetas en su disco duro y dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -806,7 +823,7 @@ Rescans the library when Mixxx is launched. - + Re escanea la librería cuando se inicia Mixxx @@ -856,7 +873,7 @@ trace - Arriba + Perfilar mensajes Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Configura el tamaño máximo del archivo mixxx.log en bytes. Usa -1 para ilimitado. Por defecto es 100 MB, como en 1e5 o 100000000. @@ -866,7 +883,7 @@ trace - Arriba + Perfilar mensajes Overrides the default application GUI style. Possible values: %1 - + Anula el estilo por defecto de la interfaz de usuario de la aplicación. Valores posibles: %1 @@ -1185,12 +1202,12 @@ trace - Arriba + Perfilar mensajes Equalizers - + Ecualizadores Vinyl Control - + Control de Vinilos @@ -1983,7 +2000,7 @@ trace - Arriba + Perfilar mensajes Effects - + Efectos @@ -2463,12 +2480,12 @@ trace - Arriba + Perfilar mensajes Move Beatgrid Half a Beat - + Desplaza la cuadricula de tiempo medio pulso Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en pistas con tempo constante. @@ -2666,13 +2683,13 @@ trace - Arriba + Perfilar mensajes Sort hotcues by position - + Ordenar hotcues por posición Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) @@ -3527,7 +3544,7 @@ trace - Arriba + Perfilar mensajes Unknown - + Desconocido @@ -3632,32 +3649,32 @@ trace - Arriba + Perfilar mensajes ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funcionalidad provista por este mapa de controlador será desactivada hasta que el problema sea resuelto. - + You can ignore this error for this session but you may experience erratic behavior. Puedes ignorar este error durante esta sesión, pero podrías experimentar problemas impredecibles. - + Try to recover by resetting your controller. Prueba de corregirlo reseteando la controladora. - + Controller Mapping Error Error del mapa de controlador - + The mapping for your controller "%1" is not working properly. El mapa de tu controlador "%1" no funciona correctamente. - + The script code needs to be fixed. El código del script necesita ser reparado. @@ -3765,7 +3782,7 @@ trace - Arriba + Perfilar mensajes Importar cajón - + Export Crate Exportar cajón @@ -3775,7 +3792,7 @@ trace - Arriba + Perfilar mensajes Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: @@ -3801,17 +3818,17 @@ trace - Arriba + Perfilar mensajes No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) - + M3U Playlist (*.m3u) Lista de Reproducción M3U (*.m3u) @@ -3937,12 +3954,12 @@ trace - Arriba + Perfilar mensajes Antiguos colaboradores - + Official Website Sitio web oficial - + Donate Donar @@ -3998,7 +4015,7 @@ trace - Arriba + Perfilar mensajes - + Analyze Analizar @@ -4043,17 +4060,17 @@ trace - Arriba + Perfilar mensajes Ejecuta el análisis de cuadrícula de tempo, clave musical y ReplayGain en las pistas seleccionadas. No genera formas de onda para las pistas seleccionadas para ahorrar espacio en disco. - + Stop Analysis Detener análisis - + Analyzing %1% %2/%3 Analizando %1% %2/%3 - + Analyzing %1/%2 Analizando %1/%2 @@ -4164,7 +4181,32 @@ Skip Silence Start Full Volume: The same as Skip Silence, but starting transitions with a centered crossfader, so that the intro starts at full volume. - + Modos de desvanecimiento de Auto DJ + +Intro completa + Outro: +Reproduce la intro completa y la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea el más corto. Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Desvanecer al iniciar la Outro: +Inicia el fundido cruzado al inicio de la outro. Si la outro es más larga que la intro, +corta el final de la outro. Usa la duración de la intro o la outro como +el tiempo de fundido cruzado, el que sea más corto.Si no se ha marcado una intro u outro, +usa el tiempo de fundido cruzado seleccionado. + +Pista completa: +Reproduce la pista completa. Comienza el fundido cruzado desde el +número de segundos seleccionado antes del final de la pista. Un fundido cruzado negativo +agrega silencio entre las pistas. + +Saltar silencio: +Reproduce la pista completa excepto el silencio al inicio y al final. +Inicia el fundido cruzado desde el número de segundos seleccionado antes +del último sonido. + +Saltar silencio e iniciar con volumen al máximo: +Lo mismo que Saltar silencio, pero inicia la transición con el crossfader +centrado, de manera que la intro inicia con el volumen al máximo. @@ -4189,7 +4231,7 @@ crossfader, so that the intro starts at full volume. Skip Silence Start Full Volume - + Saltar silencio e iniciar con volumen al máximo @@ -4322,7 +4364,7 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Analyzer Settings - + Configuración del Analizador @@ -4344,7 +4386,7 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Re-analyze beats when settings change or beat detection data is outdated - + Re-analizar pulsaciones cuando las preferencias cambien o la información sobre pulsaciones sea obsoleta @@ -4470,37 +4512,37 @@ A menudo resulta en cuadrículas de más calidad, pero no lo hacemos bien en pis Si el mapeo no funciona, prueba a activar uno de los controles avanzados siguientes y prueba de nuevo. También puedes volver a detectar el control. - + Didn't get any midi messages. Please try again. No se detectó ningún mensaje MIDI. Por favor, inténtelo de nuevo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. No se detectó un mapeado -- Intentelo nuevamente. Asegurese de tocar sólo un control a la vez. - + Successfully mapped control: Control mapeado con éxito: - + <i>Ready to learn %1</i> <i>Preparado para asignar %1</i> - + Learning: %1. Now move a control on your controller. Aprendizaje: %1. Ahora mueva un control en su controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + El control seleccionado no existe. <br>Esto es posiblemente un bug. Por favor repórtelo en el seguidor de bugs de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br> Trataste de vincular: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5198,120 +5240,120 @@ associated with each key. Key palette - + Paleta de notas DlgPrefController - + Apply device settings? ¿Aplicar la configuración del dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configuración debe ser aplicada antes de iniciar el asistente de aprendizaje. ¿Aplicar la configuración y continuar? - + None Ningún - + %1 by %2 %1 por %2 - + Mapping has been edited Se ha editado el mapeo - + Always overwrite during this session Siempre sobreescribir durante esta sesión - + Save As Guardar como - + Overwrite Sobreescribir - + Save user mapping Guardar mapeo del usuario - + Enter the name for saving the mapping to the user folder. Ingresar el nombre del archivo de mapeo para guardarlo en la carpeta de usuario. - + Saving mapping failed Ha fallado el guardado del mapeo - + A mapping cannot have a blank name and may not contain special characters. El nombre del mapeo no puede estar en blanco, ni contener caracteres especiales. - + A mapping file with that name already exists. Ya existe un archivo de mapeo con el mismo nombre. - + Do you want to save the changes? Quieres guardar los cambios? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si usas este mapeo, tu controlador podría no funcionar correctamente. Por favor selecciona otro mapeo o deshabilita el controlador. </b></font><br><br>Este mapeo fue diseñado para un nuevo Motor de Controladores de Mixxx, y no puede ser usado con tu instalación actual.<br>Tu instalación de Mixxx posee la version del Motor de Controladores %1. Este mapeo requiere una versión del Motor de controladores >=%2.<br><br>Para más información visita la wiki de <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versiones del Motor de Controladores</a>. - + Mapping already exists. El mapeo ya existe. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> ya existe en la carpeta de mapeos de usuario. <br>¿Deseas sobreescribir o guardar con otro nombre? - + Clear Input Mappings Limpiar mapeos de Entrada - + Are you sure you want to clear all input mappings? Está seguro de querer eliminar todos los mapeos de entrada? - + Clear Output Mappings Limpiar mapeos de Salida - + Are you sure you want to clear all output mappings? Está seguro de querer eliminar todos los mapeos de salida? @@ -5331,62 +5373,62 @@ Apply settings and continue? Device Info - + Información del dispositivo Physical Interface: - + Interfase física Vendor name: - + Nombre del fabricante: Product name: - + Nombre del producto: Vendor ID - + ID del proveedor VID: - + VID: Product ID - + ID del producto PID: - + PID: Serial number: - + Número de serie: USB interface number: - + Número de interfaz USB HID Usage-Page: - + Página de uso HID HID Usage: - + Uso de HID: @@ -5464,7 +5506,7 @@ Apply settings and continue? Data protocol: - + Protocolo de datos: @@ -5474,7 +5516,7 @@ Apply settings and continue? Mapping Settings - + Configuración de mapeo @@ -5527,7 +5569,7 @@ Apply settings and continue? Controllers - + Controladores @@ -5537,7 +5579,7 @@ Apply settings and continue? Enable MIDI Through Port - + Activar puerto de MIDI Through @@ -5642,6 +5684,16 @@ Apply settings and continue? Multi-Sampling Multi-Muestreo + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6169,7 +6221,7 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform Export - + Exportar @@ -6200,12 +6252,12 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform ❯ - + ❮ - + @@ -6256,62 +6308,62 @@ Siempre puedes arrastrar y tirar pistas en la pantalla para clonar una plataform DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. El tamaño mínimo de la apariencia seleccionada es mas grande que la resolucion de su pantalla. - + Allow screensaver to run Permite el salvapantallas - + Prevent screensaver from running Evita que se active el salvapantallas - + Prevent screensaver while playing Evita el salvapantallas mientras reproduce - + Disabled Desactivado - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Este skin no soporta esquemas de color - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx debe ser reiniciado para que el nuevo ajuste de locale, escalado o multi-muestreo tenga efecto. @@ -6348,7 +6400,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Analyzer Settings - + Configuración del Analizador @@ -6378,7 +6430,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Key Notation - + Notación de clave musical @@ -6576,7 +6628,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Metadatos significa todos los detalles de la pista (artista, titulo, cantidad de reproducciones, etc) como cuadrículas de tempo, hotcues y bucles. Este cambio solo afecta a la biblioteca de Mixxx. Ningun archivo en el disco será cambiado o eliminado. @@ -7023,7 +7075,7 @@ y te permite ajustar su pitch para lograr mezclas armónicas. Reset stem controls on track load - + Reiniciar controles de stem al cargar pista @@ -7481,173 +7533,172 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Habilitado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Para activar el Planificador en tiempo real (actualmente desactivado), mira %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 muestra una lista de tarjetas de sonido y controladores que podrías considerar para utilizar con Mixxx - + Mixxx DJ Hardware Guide Guía de Hardware DJ de Mixxx - + Information Información - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx debe ser reiniciado para que el cambio de ajuste de RubberBand multi-hilo tenga efecto. - + auto (<= 1024 frames/period) auto (<= 1024 fotogramas/período) - + 2048 frames/period 2048 fotogramas/período - + 4096 frames/period 4096 fotogramas/período - + Are you sure? ¿Estás seguro(a)? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Distribuir los canales estéreo en canales mono para su procesamiento en paralelo podría resultar en la pérdida de la compatibilidad mono y una imagen estéreo difusa. No se recomienda al transmitir en vivo o al grabar. - + Are you sure you wish to proceed? ¿Realmente deseas continuar? - + No No - + Yes, I know what I am doing Sí, se lo que estoy haciendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + Main output only Solo Salida principal - + Main and booth outputs Salidas principal y de cabina - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7665,131 +7716,131 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y API de sonido - + Sample Rate Tasa de muestreo - + Audio Buffer Búfer de audio - + Engine Clock Relog del motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa el reloj de la tarjeta de sonido para emitir a un público presente y para la menor latencia. <br>Usa el reloj de red para emitir en vivo sin un público presente. - + Main Mix Mezcla principal - + Main Output Mode Modo de Salida principal - + Microphone Monitor Mode Modo de monitorización del micrófono - + Microphone Latency Compensation Compensación de latencia del micrófono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de vaciado del búfer - + 0 0 - + Keylock/Pitch-Bending Engine Bloqueo tonal/Motor de Pitch-bend - + Multi-Soundcard Synchronization Sincronización con Múltiples Tarjetas de Sonido - + Output Salida - + Input Entrada - + System Reported Latency Latencia reportada por el sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente su búfer de audio si el contador de desbordamiento está aumentando o escuchas chasquidos durante la reproducción. - + Main Output Delay Retardo Salida Principal - + Headphone Output Delay Retraso/delay de la Salida de auriculares - + Booth Output Delay Retraso/delay de la salida de cabina - + Dual-threaded Stereo Estéreo en doble-hilo - + Hints and Diagnostics Diagnóstico y sugerencias - + Downsize your audio buffer to improve Mixxx's responsiveness. Disminuya su búfer de audio para mejorar la velocidad de respuesta de Mixxx. - + Query Devices Consultar aparatos @@ -7843,7 +7894,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y Turntable Input Signal Boost - + Aumento de la Señal de Entrada del Tornamesa @@ -7947,12 +7998,12 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y 1/3 of waveform viewer options for "Text height limit" - + 1/3 de visualización de forma de onda Entire waveform viewer - + Visor de forma de onda completa @@ -7985,7 +8036,7 @@ El objetivo de sonoridad es aproximado y asume que la preganancia de la pista y OpenGL Status - + Estado de OpenGL @@ -8140,12 +8191,12 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Preferred font size - + Tamaño de tipo de letra preferido Text height limit - + Límite de altura de texto @@ -8185,18 +8236,18 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Beat grid opacity - + Superar la opacidad de la rejilla Scrolling Waveforms - + Deslizar formas de onda Type - + Tipo @@ -8206,7 +8257,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Set amount of opacity on beat grid lines. - + Establece la cantidad de opacidad en las líneas de la cuadrícula del compás. @@ -8216,17 +8267,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Play marker position - + <br><div><br data-mce-bogus="1"></div> Moves the play marker position on the waveforms to the left, right or center (default). - + Mover the marcador de posición en la pista a la izquierda, derecha o centro (Defabrica). Overview Waveforms - + Visualizar formas de onda @@ -8239,17 +8290,17 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Sound Hardware - + Hardware de sonido Controllers - + Controladores Library - + Biblioteca @@ -8329,7 +8380,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Key Detection - + Detección de tonalidad @@ -8344,7 +8395,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se Vinyl Control - + Control de vinilo @@ -8373,7 +8424,7 @@ Elija entre los distintos tipos de visualización para la forma de onda, que se TextLabel - + Etiqueta @@ -9349,27 +9400,27 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mejor) - + Rubberband R3 (near-hi-fi quality) Banda elástica R3 (calidad casi alta fidelidad) - + Unknown, using Rubberband (better) Desconocido, utilizando Banda elástica (mejor) - + Unknown, using Soundtouch Desconocido, usando Soundtouch @@ -9554,12 +9605,12 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Change color - + Cambiar color Choose a new color - + Escoger un nuevo color @@ -9567,32 +9618,32 @@ A menudo resulta en una cuadrícula de mayor calidad, pero no lo hacemos bien en Browse... - + Examinar… No file selected - + No se ha seleccionado ningún archivo Select a file - + Seleccionar un archivo LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9604,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep de OpenGL. - + activate activar - + toggle conmutar - + right derecha - + left izquierda - + right small derecha pequeño - + left small izquierda pequeño - + up arriba - + down abajo - + up small arriba pequeño - + down small abajo pequeño - + Shortcut Atajo @@ -9662,37 +9713,37 @@ de OpenGL. Library - + This or a parent directory is already in your library. Este directorio o su superior ya se encuentra en tu biblioteca. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Este directorio o el indicado no existe o es inaccesible. Cancelando la operación para evitar inconsistencias de biblioteca. - - + + This directory can not be read. Este directorio no puede ser leído. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ha ocurrido un error desconocido. Cancelando la operación para evitar inconsistencias de biblioteca - + Can't add Directory to Library No se pudo agregar el directorio a la biblioteca - + Could not add <b>%1</b> to your library. %2 @@ -9701,27 +9752,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca %2 - + Can't remove Directory from Library No se pudo remover el directorio de la biblioteca. - + An unknown error occurred. Ha ocurrido un error desconocido. - + This directory does not exist or is inaccessible. Este directorio no existe o es inaccesible. - + Relink Directory Reenlazar directorio - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9733,27 +9784,27 @@ Cancelando la operación para evitar inconsistencias de biblioteca LibraryFeature - + Import Playlist Importar Lista de Reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? ¿Sobrescribir archivo? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. Do you really want to overwrite it? - + Ya existe un archivo de lista de reproducción con el nombre "% 1". Se agregó la extensión predeterminada "m3u" porque no se especificó ninguna. ¿Realmente desea sobrescribirla? @@ -9899,253 +9950,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy El dispositivo de sonido está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reintente</b> luego de cerrar las otras aplicaciones o reconectar un dispositivo de sonido - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigure</b> las opciones del dispositivo de sonido de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obtenga <b>ayuda</b> del wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Salir</b> de Mixxx. - + Retry Reintentar - + skin apariencia - + Allow Mixxx to hide the menu bar? ¿Permitir a Mixxx ocultar la barra de menú? - + Hide Always show the menu bar? Ocultar - + Always show Mostrar siempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra de menú de Mixxx ha sido ocultada y se puede alternar presionando la tecla <b>Alt</b>. <br><br>Haz clic en <b>%1</b> para aceptar. <br><br>Haz clic en <b>%2</b> para desactivarlo, por ejemplo si usas Mixxx sin un teclado. <br><br>Puedes cambiar este ajuste en cualquier momento en Preferencias -> Interfaz. <br> - + Ask me again Pregúntame de nuevo - - + + Reconfigure Reconfigurar - + Help Ayuda - - + + Exit Salir - - + + Mixxx was unable to open all the configured sound devices. Mixxx no ha podido activar todos los dispositivos de sonido configurados. - + Sound Device Error Error del dispositivo de sonido - + <b>Retry</b> after fixing an issue <b>Reintenta</b> una vez corregido el problema - + No Output Devices No hay dispositivos de salida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx fue configurado sin ningún dispositivo de salida de audio. El procesamiento de audio estará desactivado mientras no se configure un dispositivo de audio de salida. - + <b>Continue</b> without any outputs. <b>Continuar</b> sin ninguna salida. - + Continue Continuar - + Load track to Deck %1 Cargar pista al plato %1 - + Deck %1 is currently playing a track. El plato %1 está reproduciendo una pista. - + Are you sure you want to load a new track? ¿Está seguro de cargar una pista nueva? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control por vinilo. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hay ningún dispositivo de entrada seleccionado para el control passthrough. Por favor, seleccione un dispositivo de entrada en las preferencias de hardware de sonido. - + There is no input device selected for this microphone. Do you want to select an input device? No se ha seleccionado un dispositivo de Entrada para este micrófono. ¿Deseas escoger uno ahora? - + There is no input device selected for this auxiliary. Do you want to select an input device? No se ha seleccionado un dispositivo de entrada para este Auxiliar. ¿Deseas escoger uno ahora? - + Scan took %1 - + El escaneo tomo %1 - + No changes detected. - + No se han detectado cambios - - + + %1 tracks in total - + %1 pistas en total - + %1 new tracks found - + Encontradas %1 pistas nuevas - + %1 moved tracks detected - + %1 pistas movidas detectadas - + %1 tracks are missing (%2 total) - + %1 pistas perdidas (%2 en total) - + %1 tracks have been rediscovered - + %1 pistas han sido reencontradas - + Library scan finished - + Escaneo de la biblioteca terminado - + Error in skin file Error en el archivo de la apariencia - + The selected skin cannot be loaded. No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering Renderizado directo de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + El renderizado directo no está habilitado en tu máquina.<br><br>Esto significa que la pantalla de la forma de onda será muy <br><b>lenta y puede agobiar a tu CPU fuertemente</b>. Ya sea que actualices tu<br>configuración para habilitar renderizado directo, o deshabilitar<br>las pantallas de forma de onda en las preferencias de Mixxx seleccionando <br>"Vacío" como la pantalla de forma de onda en la sección 'Interface'. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -10161,13 +10212,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reproducción @@ -10177,32 +10228,58 @@ Do you want to select an input device? Aleatorizar lista de reproducción - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Las listas de reproducción son listar ordenadas de pistas que te permiten planificar tus sesiones de DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Podría ser necesario saltar algunas pistas en tu lista de reproducción planificada, o añadir algunas pistas diferentes, con el fin de mantener la energía de tu audiencia. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + Create New Playlist Crear una nueva lista de reproducción @@ -10212,7 +10289,7 @@ Do you want to select an input device? Mixxx Hotcue Colors - + Colores de hotcues de Mixxx @@ -10220,82 +10297,82 @@ Do you want to select an input device? Serato DJ Track Metadata Hotcue Colors - + Metadatos de colores de hotcues de pistas de Serato DJ Serato DJ Pro Hotcue Colors - + Colores de hotcues de Serato DJ Pro Rekordbox COLD1 Hotcue Colors - + Colores de hotcues de Rekordbox COLD1 Rekordbox COLD2 Hotcue Colors - + Colores de hotcues de Rekordbox COLD2 Rekordbox COLORFUL Hotcue Colors - + Colores de hotcues COLORFUL de Rekordbox Mixxx Track Colors - + Colores de pistas de Mixxx Rekordbox Track Colors - + Colores de pistas de Rekordbox Serato DJ Pro Track Colors - + Colores de pistas de Serato DJ Pro Traktor Pro Track Colors - + Colores de pistas de Traktor Pro VirtualDJ Track Colors - + Colores de pistas de VirtualDJ Mixxx Key Colors - + Colores de notas de Mixxx Traktor Key Colors - + Colores de notas de Traktor Mixed In Key - Key Colors - + Colores de notas de Mixed In Key Protanopia / Protanomaly Key Colors - + Colores de notas de Protanopia/Protanomalía Deuteranopia / Deuteranomaly Key Colors - + Colores de notas de Deuteranopía/Deuteranomalía Tritanopia / Tritanomaly Key Colors - + Colores de notas de Tritanopía/Tritanomalía @@ -10429,7 +10506,7 @@ Do you want to scan your library for cover files now? Switch - + Switch @@ -10514,7 +10591,7 @@ Do you want to scan your library for cover files now? Vinyl Control - + Control de vinilo @@ -10879,7 +10956,7 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p The Mixxx Team - + Equipo de Mixxx @@ -10909,12 +10986,12 @@ Si la amplitud es cero, este parámetro permite mover la posición manualmente p Gain - + Ganancia Set the gain of metronome click sound - + Configura la ganancia del sonido del metrónomo @@ -11863,7 +11940,7 @@ Consejo: compensa las voces de "ardillas" o "gruñonas"La cantidad de amplificación aplicada a la señal de audio. A niveles más altos, el audio estará más distorsionado. - + Passthrough Paso @@ -12033,12 +12110,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. varios - + built-in nativo - + missing no encontrado @@ -12166,54 +12243,54 @@ pueden introducir un efecto de "bombeo" y/o distorsión. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listas de reproducción - + Folders Carpetas - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues Accesos Directos - + Loops (only the first loop is currently usable in Mixxx) Bucles (solo el primer bucle es utilizable en Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Buscar dispositivos de almacenamiento Rekordbox (refrescar) - + Beatgrids Grillas de pulsos - + Memory cues Marcas en Memoria - + (loading) Rekordbox (cargando) Rekordbox @@ -12655,22 +12732,22 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Reading track for fingerprinting failed. - + Ha fallado la lectura de la pista para fingerprinting Identifying track through AcoustID - + Identificando pista mediante AcoustID Could not identify track through AcoustID. - + No se pudo identificar la pista mediante AcoustID. Could not find this track in the MusicBrainz database. - + No se pudo encontrar esta pista en la base de datos de MusicBrainz. @@ -12934,7 +13011,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Vinyl Control - + Control de vinilo @@ -13242,7 +13319,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Toggle visibility of Rate Control - + Alternar visibilidad del control de velocidad @@ -13392,7 +13469,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. - + Mantener el clic izquierdo permite previsualizar la posición donde la cabeza de reproducción saltará al soltarlo. El arrastre puede ser abortado con el clic derecho. @@ -13442,12 +13519,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Shows the current volume for the left channel of the main output. - + Muestra el volumen actual para el canal izquierdo en la salida principal. Shows the current volume for the right channel of the main output. - + Muestra el volumen actual para el canal derecho de la salida principal. @@ -13459,27 +13536,27 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Adjusts the main output gain. - + Ajusta el volumen principal Determines the main output by fading between the left and right channels. - + Determina la salida principal desvaneciendo entre los canales izquierdo y derecho. Adjusts the left/right channel balance on the main output. - + Ajusta el balance de los canales izquierdo/derecho en la salida principal. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Desvanecimiento cruzado de la salida de auriculares entre la salida principal y la señal de cueing (PFL o Escucha Pre-Deslizador) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si se activa, la señal principal de la mezcla se reproduce en el canal derecho, mientras que la señal de cueing se reproduce en el canal izquierdo. @@ -13494,12 +13571,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Show/hide the beatgrid controls section - + Mostrar/ocultar la sección de controles de la cuadrícula de tiempo Show/hide the stem mixing controls section - + Mostrar/ocultar la sección de controles de mezcla de stems @@ -13509,17 +13586,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Volume Meters - + Medidores de volumen mix microphone input into the main output. - + mezcla la entrada de micrófono con la salida principal. Auto: Automatically reduce music volume when microphone volume rises above threshold. - + Auto: reduce automáticamente el volumen de la música cuando el volumen del micrófono supera el umbral. @@ -13530,17 +13607,17 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: configura cuánto se reduce el volumen de la música cuando el volumen de los micrófonos activos supera el umbral. Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + Manual: configura cuánto reducir e If keylock is disabled, pitch is also affected. - + Si el bloqueo tonal se desactiva, la altura también es afectada. @@ -13555,7 +13632,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Raises playback speed in small steps. - + Incrementa la velocidad de reproducción en pasos pequeños. @@ -13570,7 +13647,7 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Lowers playback speed in small steps. - + Reduce la velocidad de reproducción en pasos pequeños. @@ -13580,12 +13657,12 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed higher while active (tempo). - + Mantiene la velocidad de reproducción alta cuando se activa (tempo). Holds playback speed higher (small amount) while active. - + Mantiene la velocidad de reproducción alta (pequeña cantidad) cuando se activa. @@ -13595,59 +13672,60 @@ pueden introducir un efecto de "bombeo" y/o distorsión. Holds playback speed lower while active (tempo). - + Mantiene la velocidad de reproducción baja cuando se activa (tempo). Holds playback speed lower (small amount) while active. - + Mantiene la velocidad de reproducción baja (pequeña cantidad) cuando se activa. When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Cuando se pulsa repetidamente, ajusta el tempo para coincidir con la frecuencia de pulsaciones. Tempo Tap - + Seguidor de Tempo (Tempo Tap) Rate Tap and BPM Tap - + Frecuencia de pulsaciones y de BPM Adjust beatgrid by exactly one half beat. Usable only on tracks with constant tempo. - + Ajusta la cuadrícula de tiempo en exactamente medio beat. Solo se puede usar en +pistas con tempo constante Revert last BPM/Beatgrid Change - + Revierte el último cambio de BPM/cuadrícula de tiempo Revert last BPM/Beatgrid Change of the loaded track. - + Revierte el último cambio de BPM/Cuadrícula de tiempo para la pista cargada. Toggle the BPM/beatgrid lock - + Cambia el bloqueo de BPM/cuadrícula de tiempo Tempo and Rate Tap - + Toques de Tempo y Frecuencia Tempo, Rate Tap and BPM Tap - + Toques de Tempo, Frecuencia y BPM @@ -13663,12 +13741,12 @@ tracks with constant tempo. Left click: shift 10 milliseconds earlier - + Clic izquierdo: adelantar 10 milisegundos Right click: shift 1 millisecond earlier - + Clic derecho: adelantar 1 milisegundo @@ -13678,64 +13756,64 @@ tracks with constant tempo. Left click: shift 10 milliseconds later - + Clic izquierdo: retrasar 10 milisegundos Right click: shift 1 millisecond later - + Clic derecho: retrasar 1 milisegundo Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Arrastra un botón de Hotcue aquí para continuar reproduciendo después de soltar la hotcue. Hint: Change the default cue mode in Preferences -> Decks. - + Sugerencia: cambie el modo por defecto de las cues en Preferencias -> Platos. Mutes the selected channel's audio in the main output. - + Silencia el audio del canal seleccionado en la salida principal. Main mix enable - + Activador de mezcla principal Hold or short click for latching to mix this input into the main output. - + Clic sostenido o corto para enganchar, para mezclar esta entrada con la salida principal. If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + Si la hotcue es una cue de bucle, activa el bucle y salta hacia él si se encuentra detrás de la posición de reproducción. If the play position is inside an active loop, stores the loop as loop cue. - + Si la posición de reproducción se encuentra dentro de un bucle activo, almacena el bucle como una hotcue de bucle. Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Arrastrar este botón dentro de otro botón de hotcue para moverlo hacia este (cambiando su número). Si la otra hotcue ya se encuentra definida, las dos son intercambiadas. Expand/Collapse Samplers - + Expandir/contraer samplers Toggle expanded samplers view. - + Alternar la vista expandida de los samplers. @@ -13745,12 +13823,12 @@ tracks with constant tempo. Auto DJ is active - + Auto DJ se encuentra activo Red for when needle skip has been detected. - + Rojo cuando se detecta un salto de aguja. @@ -13790,7 +13868,7 @@ tracks with constant tempo. If the track has no beats the unit is seconds. - + Si la pista no tiene pulsaciones, la unidad es segundos. @@ -13830,12 +13908,12 @@ tracks with constant tempo. Beatloop Anchor - + Ancla del bucle de pulsaciones Define whether the loop is created and adjusted from its staring point or ending point. - + Define si el bucle es creado y ajustado desde su punto de inicio o de final. @@ -13930,12 +14008,12 @@ tracks with constant tempo. Hint: Change the time format in Preferences -> Decks. - + Sugerencia: cambie el formato de tiempo en Preferencias -> Platos. Show/hide intro & outro markers and associated buttons. - + Mostrar/ocultar marcadores de intro y outro, y sus botones asociados. @@ -13948,7 +14026,7 @@ tracks with constant tempo. If marker is set, jumps to the marker. - + Si el marcador se encuentra definido, salta al marcador. @@ -13956,7 +14034,7 @@ tracks with constant tempo. If marker is not set, sets the marker to the current play position. - + Si el marcador no se encuentra definido, lo configura a la posición de reproducción actual. @@ -13964,7 +14042,7 @@ tracks with constant tempo. If marker is set, clears the marker. - + Si el marcador se encuentra definido, lo elimina. @@ -13989,7 +14067,7 @@ tracks with constant tempo. Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajuste la mezcla de la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos @@ -13999,7 +14077,7 @@ tracks with constant tempo. D+W mode: Add wet to dry - + Modo D+W: agregue húmedo a seco @@ -14009,7 +14087,7 @@ tracks with constant tempo. Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajuste cómo se mezcla la señal seca (entrada) con la señal húmeda (salida) de la unidad de efectos @@ -14028,7 +14106,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Route the main mix through this effect unit. - + Enruta la mezcla principal a través de esta unidad de efectos. @@ -14048,42 +14126,42 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Stem Label - + Etiqueta de stem Name of the stem stored in the stem file - + Nombre del stem almacenado en el archivo de stem Text is displayed in the stem color stored in the stem file - + El texto es presentado con el color del stem almacenado en el archivo de stem this stem color is also used for the waveform of this stem - + este color de stem también es usado en la forma de onda de este stem Stem Mute - + Silenciar stem Toggle the stem mute/unmuted - + Alterna el silencio del stem Stem Volume Knob - + Perilla de volumen del stem Adjusts the volume of the stem - + Ajusta el volumen del stem @@ -14351,7 +14429,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Inactive: parameter not linked - + Inactivo: parámetro no enlazado @@ -14567,7 +14645,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Left click to jump around in the track. - + Clic izquierdo para saltar a lo largo de la pista. @@ -14577,7 +14655,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Right click anywhere else to show the time at that point. - + Clic derecho en cualquier otra parte para mostrar el tiempo en ese punto. @@ -14672,7 +14750,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Maximize Library - + Maximizar Biblioteca @@ -14687,7 +14765,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Changes the number of hotcue buttons displayed in the deck - + Cambia el número de botones de acceso directo mostrados en el deck @@ -14713,12 +14791,12 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Opens the track properties editor - + Abre el editor de propiedades de pista Opens the track context menu. - + Abre el menú contextual de la pista @@ -14820,12 +14898,12 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Drag this button onto a Play button while previewing to continue playback after release. - + Arrastre este botón a un boton de Play durante la preescucha para continuar la reproducción tras soltarlo. Dragging with Shift key pressed will not start previewing the hotcue. - + Arrastrar mientras presiona la tecla Shift no iniciará la preescucha de la hotcue. @@ -15259,22 +15337,22 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect Replace Existing File? - + ¿Reemplazar el archivo existente? "%1" already exists, replace? - + "%1% ya existe, ¿reemplazar? &Replace - + &Reemplazar Apply to all files - + Aplicar a todos los archivos @@ -15373,7 +15451,7 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect frameSwapped-signal driven phase locked loop - + Bucle con bloqueo de fase manejado por señal con marco cambiado @@ -15399,12 +15477,12 @@ Utiliza esto para cambiar únicamente la señal afectada (mojada) con EQ y efect No color - + Sin color Custom color - + Color personalizado @@ -15457,47 +15535,47 @@ Carpeta: %2 WCueMenuPopup - + Cue number Número de Marca - + Cue position Posición Marca - + Edit cue label Editar etiqueta de marca - + Label... - + Etiqueta... - + Delete this cue Borrar esta marca - + Toggle this cue type between normal cue and saved loop - + Alterna el tipo de esta cue entre cue normal y bucle guardado - + Left-click: Use the old size or the current beatloop size as the loop size - + Clic izquierdo: usar el tamaño anterior o el del bucle actual como el tamaño de bucle - + Right-click: Use the current play position as loop end if it is after the cue - + Clic derecho: usar la posición de reproducción actual como final del bucle si se encuentra después de la cue - + Hotcue #%1 Acceso DIrecto #%1 @@ -15512,7 +15590,7 @@ Carpeta: %2 Rename Preset - + Renombrar preajuste @@ -15622,407 +15700,437 @@ Carpeta: %2 - Create &New Playlist + Search in Current View... + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + Crear &nueva Playlist + + + Create a new playlist Crear una nueva lista de reproducción - + Ctrl+n Ctrl+N - + Create New &Crate Crear un nuevo&cajón - + Create a new crate Crear un nuevo cajón - + Ctrl+Shift+N Ctrl+Mayús+N - - + + &View &Vista - + Auto-hide menu bar - + Auto-ocultar barra de menú - + Auto-hide the main menu bar when it's not used. - + Auto-ocultar la barra de menú principal cuando no es utilizada. - + May not be supported on all skins. Puede no estar disponible para todas las apariencias. - + Show Skin Settings Menu Mostrar menú de ajustes de aspecto - + Show the Skin Settings Menu of the currently selected Skin Mostrar la configuración actual del menu de tema - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar seccion del microfono - + Show the microphone section of the Mixxx interface. Muestra la sección de control de micrófono de la interfaz de Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar la Sección de Control de Vinilo - + Show the vinyl control section of the Mixxx interface. Muestra la sección de control de vinilo de la interfaz de Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar el reproductor de preescucha - + Show the preview deck in the Mixxx interface. Muestra el reproductor de preescucha en la interfaz de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Muestra carátulas - + Show cover art in the Mixxx interface. Muestra las carátulas en la interfaz de Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximizar la biblioteca para tomar todo el espacio disponible en pantalla. - + Space Menubar|View|Maximize Library - + Espacio - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Mostrar Mixxx a pantalla completa - + &Options &Opciones - + &Vinyl Control Control de &vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con codigo de tiempo en bandejas externas para controlar Mixxx - + Enable Vinyl Control &%1 Habilita el Control por Vinilo &%1 - + &Record Mix &Grabar Mezcla - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar transmisión en &vivo - + Stream your mixes to a shoutcast or icecast server Transmite tus mezclas a un servidor shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar Atajos de &Teclado - + Toggles keyboard shortcuts on or off Activa o desactiva los atajos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar la configuración de Mixxx (p.ej.: reproducción, MIDI, controles) - + &Developer &Desarrollador - + &Reload Skin &Recargar apariencia - + Reload the skin Recargar la apariencia - + Ctrl+Shift+R Ctrl+Mayús+R - + Developer &Tools U&tilidades de desarrollador - + Opens the developer tools dialog Abre el cuadro de diálogo de herramientas de desarrollo - + Ctrl+Shift+T Ctrl+Mayús+T - + Stats: &Experiment Bucket Estadísticas: Contadores &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Activa el modo experimental. Recoje estadísticas en los contadores EXPERIMENT. - + Ctrl+Shift+E Ctrl+Mayús+E - + Stats: &Base Bucket Estadísticas: contadores &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Activa el modo base. Recoje estadísticas en los contadores BASE. - + Ctrl+Shift+B Ctrl+Mayús+B - + Deb&ugger Enabled Dep&uración activada - + Enables the debugger during skin parsing Activa el depurador durante el análisis de la máscara - + Ctrl+Shift+D Ctrl+Mayús+D - + &Help Ay&uda - + Show Keywheel menu title - + Mostrar rueda de notas E&xport Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ Export the library to the Engine DJ format - + Exportar biblioteca al formato Engine DJ - + Show keywheel tooltip text - + Mostrar rueda de notas - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Soporte &comunitario - + Get help with Mixxx Obtener ayuda con Mixxx - + &User Manual Manual de &usuario - + Read the Mixxx user manual. Lea el manual de usuario de Mixxx. - + &Keyboard Shortcuts Atajos de &Teclado - + Speed up your workflow with keyboard shortcuts. Trabaja más rápidamente usando los atajos de teclado. - + &Settings directory &Directorio de configuración - + Open the Mixxx user settings directory. Abre el directorio de configuración de usuario de Mixxx. - + &Translate This Application &Traducir esta aplicación - + Help translate this application into your language. Ayude a traducir esta aplicación a su idioma. - + &About &Acerca de - + About the application Acerca de la aplicación @@ -16038,7 +16146,7 @@ Carpeta: %2 Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - + Listo para reproducir, analizando... @@ -16051,31 +16159,19 @@ Carpeta: %2 Finalizing... Text on waveform overview during finalizing of waveform analysis - + Finalizando... WSearchLineEdit - - Clear input - Clear the search bar input field - Borrar el texto - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input Borrar el texto @@ -16086,93 +16182,87 @@ Carpeta: %2 Buscar... - + Clear the search bar input field - + Limpia el campo de entrada de la barra de búsqueda - - Enter a string to search for - Introducir el texto a buscar + + Return + Volver - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library - Para más información vea el Manual de Usuario> Biblioteca Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Atajo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Poner el cursor aquí + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Tecla de retroceso + + Additional Shortcuts When Focused: + - Shortcuts - Atajos + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Activa la búsqueda antes del tiempo de espera de "búsqueda mientras escribe" o salte a la vista de pistas después + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Ctrl+Espacio - + Toggle search history Shows/hides the search history entries - + Alternar historial de búsqueda - + Delete or Backspace Borrar o Retorno - - Delete query from history - Borrar Consulta del Historial - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Salir de la busqueda + + Delete query from history + Borrar Consulta del Historial @@ -16180,7 +16270,7 @@ Carpeta: %2 Search related Tracks - + Buscar pistas relacionadas @@ -16190,7 +16280,7 @@ Carpeta: %2 harmonic with %1 - + armónico con %1 @@ -16200,7 +16290,7 @@ Carpeta: %2 between %1 and %2 - + entre %1 y %2 @@ -16250,7 +16340,7 @@ Carpeta: %2 &Search selected - + &Búsqueda seleccionada @@ -16288,7 +16378,7 @@ Carpeta: %2 Update external collections - + Actualizar colecciones externas @@ -16303,7 +16393,7 @@ Carpeta: %2 Select Color - + Seleccionar color @@ -16471,12 +16561,12 @@ Carpeta: %2 Sort hotcues by position (remove offsets) - + Ordenar hotcues por posición (removiendo desfases) Sort hotcues by position - + Ordenar hotcues por posición @@ -16521,7 +16611,7 @@ Carpeta: %2 Shift Beatgrid Half Beat - + Desplazar la cuadrícula de tiempo medio beat @@ -16609,7 +16699,7 @@ Carpeta: %2 Undo BPM/beats change of %n track(s) - + Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s)Deshacer cambios de BPM/pulsaciones de %n pista(s) @@ -16624,7 +16714,7 @@ Carpeta: %2 Setting rating of %n track(s) - + Definiendo evaluación de %n pistaDefiniendo evaluación de %n pistasDefiniendo evaluación de %n pista(s) @@ -16679,12 +16769,12 @@ Carpeta: %2 Sorting hotcues of %n track(s) by position (remove offsets) - + Ordenando hotcues de %n pista por posición (removiendo desfases)Ordenando hotcues de %n pistas por posición (removiendo desfases)Ordenando hotcues de %n pistas(s) por posición (removiendo desfases) Sorting hotcues of %n track(s) by position - + Ordenando hotcues de %n pista por posiciónOrdenando hotcues de %n pistas por posiciónOrdenando hotcues de %n pista(s) por posición @@ -16709,7 +16799,7 @@ Carpeta: %2 Move these files to the trash bin? - + ¿Mover estos archivos a la papelera? @@ -16735,7 +16825,7 @@ Carpeta: %2 Okay - + Okey @@ -16785,7 +16875,7 @@ Carpeta: %2 Remaining Track File(s) - + Renombrando archivo(s) de pista @@ -16796,7 +16886,7 @@ Carpeta: %2 Clear Reset metadata in right click track context menu in library - + Climpiar @@ -16806,37 +16896,37 @@ Carpeta: %2 Clear BPM and Beatgrid - + Limpia las BPM y la cuadrícula de tiempo Undo last BPM/beats change - + Revertir el último cambio de BPM/pulsaciones Move this track file to the trash bin? - + ¿Mover este archivo de pista a la papelera? Permanently delete this track file from disk? - + ¿Eliminar permanentemente este archivo de pista del disco? All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + Todos los platos donde estas pistas hayan sido cargadas se detendrán, y las pistas serán expulsadas. All decks where this track is loaded will be stopped and the track will be ejected. - + Todos los platos donde esta pista haya sido cargada se detendrán, y la pista será expulsada. Removing %n track file(s) from disk... - + Removiendo %n archivo(s) de pista del disco... @@ -16856,12 +16946,12 @@ Carpeta: %2 Don't show again during this session - + No mostrar nuevamente durante esta sesión The following %1 file(s) could not be moved to trash - + El/los siguiente(s) %1 archivo(s) no pudieron ser movidos a la papelera @@ -16884,7 +16974,7 @@ Carpeta: %2 title - + título @@ -16892,73 +16982,73 @@ Carpeta: %2 Load for stem mixing - + Cargar para mezcla de stems Load pre-mixed stereo track - + Cargar pista estéreo premezclada Load the "%1" stem - + Cargar el stem "%1" Load multiple stem into a stereo deck - + Cargar múltiples stems en un plato estéreo Select stems to load - + Seleccionar stems a cargar Release "CTRL" to load the current selection - + Soltar "Ctrl" para cargar la selección actual Use "CTRL" to select multiple stems - + Use "Ctrl" para seleccionar múltiples stems WTrackTableView - + Confirm track hide Confirmar ocultar pista - + Are you sure you want to hide the selected tracks? ¿Estas seguro de que quieres ocultar las pistas seleccionadas? - + Are you sure you want to remove the selected tracks from AutoDJ queue? ¿Esta seguro de que quiere eliminar las pistas seleccionadas de la cola del AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Estás seguro que quieres eliminar las pistas seleccionada de este cajón? - + Are you sure you want to remove the selected tracks from this playlist? ¿Esta seguro de que desea eliminar las pistas seleccionadas de la lista de reproducción? - + Don't ask again during this session No volver a preguntar durante esta sesión - + Confirm track removal Confirmar eliminación del track @@ -16973,58 +17063,58 @@ Carpeta: %2 Shuffle Tracks - + Mezclar pistas mixxx::CoreServices - + fonts tipos de letra - + database base de datos - + effects efectos - + audio interface interface de sonido - + decks - + decks - + library Biblioteca - + Choose music library directory Elija el directorio de la biblioteca de la música - + controllers Controladores - + Cannot open database No se puede abrir la base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17038,70 +17128,80 @@ Pulse Aceptar para salir. mixxx::DlgLibraryExport - + Entire music library + Biblioteca de música completa + + + + Crates - - Selected crates - Cajas seleccionadas + + Playlists + - + + Selected crates/playlists + + + + Browse Ver - + Export directory - + Exportar directorio - + Database version - + Versión de base de datos - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Exportar biblioteca a Engine DJ - + Export Library To - + Exportar biblioteca a - + No Export Directory Chosen - + No se seleccionó un directorio de exportación - + No export directory was chosen. Please choose a directory in order to export the music library. - + No se escogió un directorio de exportación. Por favor escoja un directorio para poder exportar la biblioteca de música. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + Una base de datos ya existe en el directorio seleccionado. Las pistas exportadas serán añadidas a esta base de datos. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - + Una base de datos ya existe en el directorio seleccionado, pero ocurrió un problema al cargarla. No se garantiza una exportación exitosa en esta situación. @@ -17120,34 +17220,35 @@ Pulse Aceptar para salir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message - + Fallo al exportar %1 - %2: +%3 mixxx::LibraryExporter - + Export Completed - + Exportación completada - - Exported %1 track(s) and %2 crate(s). - Exportados %1 pista(s) y %2 caja(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed - + Exportación fallida - + Exporting to Engine DJ... - + Exportando a Engine DJ... @@ -17155,7 +17256,7 @@ Pulse Aceptar para salir. Abort - + Abortar diff --git a/res/translations/mixxx_et.qm b/res/translations/mixxx_et.qm index 656f2f55076e6e22bfd46c3cae9381f9f4da3970..99f097fc329a67e82418526d82086732d0592928 100644 GIT binary patch delta 496 zcmXBQOK1~u7zFU||FK<@?QWAMf>qN)LdnG?Rj~0Ovqx~K6t|(h&JnZ_y*#r!Ep{DKV7hD*G?lL*^2^Ck^ zXTOl1j@5}uo6^E;r(d$ra)mjUhU(sj5%*~kz;pK`FUQe#hdJBAPUVE~!BE0nJch?g zgp1eF=%m6t+RAxeoIt$$Y_Ly`U7R8ET8@1`9Fx}^t#fF0o1xNv`IXT_bl;TMHIwK- zQhs+iLZqkU4ZdFd-s zo=ajEetU*_C5eOHNGKmu-i+QL5_67H+c9W6E+vrirbR#0-c`xuA&w{}gWfhdkvop6x_u-u&weMCG@&HNQ85tJTA`pVgb%f6A<=pa1{> delta 608 zcma)1Ur3X26urOe{_mUL+U%vqps*24e2LbJS~&JqG7L#H#IW4724lu%Z)Pu}H3%w> zQIh-TJ~#hm${wN^y;xBYJq?10o~ox_g0R9NeKqK*hb~;sy_b8>Irnp&Kke|Xy&}Ki zN{M|xh>oj7!J!78*&;g8Ms)OD1B+=q6Z;K85M`41DB3OgW}?1VL}djoPKoV`$}z$D z>uAySa&{D9-J3mG5A__rPm~7r`0fz-e>PBkiJ;!cxipgc51dyJHq073hl?6{ccpG{ z3obXqWt!&fBg~mR4i&n4C#yuuk9D&#jc54^Y9NTqw39aT4v5lm;my3r` zGkZ9{iMn}Ed_}*-!%MB0vb6KkAXc@mdndWKEZK6dU;Q6PB$`fJ>@8vFDJO!7% zol71B?QWh|5Vfa79pCJ0yl@ceu4}wdM4Q9Mh35!626!otszdW#f#mEnMjrNS4}HO~ z(dey4vj9`!0lt&|5(kDZT)E(Rm9u|PO7 zDVnsQM1Gp2I7P`zf3Bp)(v&h0x}5kQ1_K2sL7~5jO@YMj(7*Jsx_%7)8wV E0i9sNF#rGn diff --git a/res/translations/mixxx_et.ts b/res/translations/mixxx_et.ts index 60170e09d075..97608bbe9fe6 100644 --- a/res/translations/mixxx_et.ts +++ b/res/translations/mixxx_et.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source - + Auto DJ Automaatne DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source @@ -147,28 +147,28 @@ BasePlaylistFeature - + New Playlist Uus esitusnimekiri - + Add to Auto DJ Queue (bottom) Lisa auto-DJ järjekorda (alla) - + Create New Playlist Loo uus esitusloend - + Add to Auto DJ Queue (top) Lisa auto-DJ järjekorda (üles) - + Remove Eemalda @@ -178,12 +178,12 @@ Nimeta ümber - + Lock Lukus - + Duplicate duplikaat @@ -204,24 +204,24 @@ Analüüsi terve esitusloend - + Enter new name for playlist: Sisesta uus nimi esitusloendile: - + Duplicate Playlist - - + + Enter name for new playlist: Sisesta uue esitusloendi nimi: - + Export Playlist Ekspordi esitusloend @@ -231,70 +231,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Muuda esitusloendi nime - - + + Renaming Playlist Failed Esitusloendi ümbernimetamine nurjus - - - + + + A playlist by that name already exists. Selle nimega esitusloend juba eksisteerib. - - - + + + A playlist cannot have a blank name. Esitusloend ei saa olla nimeta. - + _copy //: Appendix to default name when duplicating a playlist _kopeeri - - - - - - + + + + + + Playlist Creation Failed Esitusloendi loomine nurjus - - + + An unknown error occurred while creating playlist: Teadmatu viga tekkis esitusloendi tegemisel: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U Esitusloend (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Esitusloend (*.m3u);;M3U8 Esitusloend (*.m3u8);;PLSEsitusloend (*.pls);;Tekst CSV (*.csv);;Loetav tekst (*.txt) @@ -302,12 +309,12 @@ BaseSqlTableModel - + # Nr - + Timestamp Ajatempel @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ei suuda lugu laadida. @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Albumi esitaja - + Artist Esitaja - + Bitrate Bitikiirus - + BPM Lööki minutis - + Channels Kanalid - + Color - + Comment Märkus - + Composer Helilooja - + Cover Art Katte kunst - + Date Added Lisamise kuupäev - + Last Played - + Duration Kestus - + Type Tüüp - + Genre Žanr - + Grouping Rühmitamine - + Key Helistik - + Location Asukoht - + + Overview + + + + Preview Eelvaade - + Rating Hinnang - + ReplayGain - + Samplerate - + Played Mängitud - + Title Pealkiri - + Track # Lugu nr - + Year Aasta - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -541,67 +553,77 @@ BrowseFeature - + Add to Quick Links Lisa otselinkidesse - + Remove from Quick Links Eemalda otselinkidest - + Add to Library Lisa kogumikku - + Refresh directory tree - + Quick Links Kiirlingid - - + + Devices Seadmed - + Removable Devices Eemaldatavad seadmed - - + + Computer Arvuti - + Music Directory Added Muusikakataloog edukalt lisatud - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan Skänni - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -747,87 +769,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -837,27 +859,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1039,13 +1066,13 @@ trace - Above + Profiling messages - + Set to full volume Sea volüüm maksimumile - + Set to zero volume Sea volüüm nulli @@ -1070,13 +1097,13 @@ trace - Above + Profiling messages - + Headphone listen button Kõrvaklappidega kuulamise nupp - + Mute button Vaigistusnupp @@ -1087,25 +1114,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1146,22 +1173,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1171,193 +1198,193 @@ trace - Above + Profiling messages Ekvalaiserid - + Vinyl Control - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1473,20 +1500,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume Täisvolüüm - + Zero Volume Nullvolüüm @@ -1502,7 +1529,7 @@ trace - Above + Profiling messages - + Mute Vaigista @@ -1513,7 +1540,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1534,25 +1561,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1622,82 +1649,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1738,451 +1765,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Lisa auto-DJ järjekorda (alla) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Lisa auto-DJ järjekorda (üles) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track - + Load selected track and play - - + + Record Mix - + Toggle mix recording - + Effects Efektid - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle Lülita - + Toggle the current effect Lülita praegust efekti - + Next Järgmine - + Switch to next effect - + Previous Eelmine - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain Tugevus - + Gain knob Helitugevuse nupp - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Auto DJ lüliti - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2197,102 +2224,102 @@ trace - Above + Profiling messages Kõrvaklappide tundlikkus - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2444,1041 +2471,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Mikrofon sees/väljas - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Automaatne DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface Kasutajaliides - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide Eelvaate Rada kuva/peida - + Show/hide the preview deck Kuva/peida eelvaate rada - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3593,32 +3642,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3662,13 +3711,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Eemalda - + Create New Crate @@ -3678,132 +3727,132 @@ trace - Above + Profiling messages Nimeta ümber - - + + Lock Lukus - + Export Crate as Playlist - + Export Track Files - + Duplicate duplikaat - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Plaadikastid - - + + Import Crate Impordi kast - + Export Crate Ekspordi kast - + Unlock Võta lukust lahti - + An unknown error occurred while creating crate: Plaadikasti loomisel esines tundmatu viga: - + Rename Crate Nimeta plaadikast ümber - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Plaadikasti ümbernimetamine ebaõnnestus - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Esitusloend (*.m3u);;M3U8 Esitusloend (*.m3u8);;PLSEsitusloend (*.pls);;Tekst CSV (*.csv);;Loetav tekst (*.txt) - + M3U Playlist (*.m3u) M3U Esitusloend (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Plaadikasti nimi ei saa olla tühi. - + A crate by that name already exists. Sellise nimega kast on juba olemas. @@ -3898,12 +3947,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4022,72 +4071,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Hüpe - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Sekundid - + Auto DJ Fade Modes Full Intro + Outro: @@ -4118,80 +4167,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat Kordus - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Automaatne DJ - + Shuffle Juhuesitus - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4414,37 +4463,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> <i>Valmis õppima %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4483,17 +4532,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5146,113 +5195,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Pole - + %1 by %2 %1 - %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Tõrkeotsing - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5265,105 +5314,105 @@ Apply settings and continue? Kontrolleri nimi - + Enabled Lubatud - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Kirjeldus: - + Support: Toetus: - + Screens preview - + Input Mappings - - + + Search - - + + Add Lisa - - + + Remove Eemalda @@ -5378,22 +5427,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: Autor: - + Name: Nimi: @@ -5403,28 +5452,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Tühjenda kõik - + Output Mappings @@ -5583,6 +5632,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6174,62 +6233,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Info - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7396,173 +7455,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Lubatud - + Stereo Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Seadistamise viga @@ -7580,131 +7638,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate Diskreetimissagedus - + Audio Buffer Audiopuhver - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Väljund - + Input Sisend - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7859,27 +7917,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7892,250 +7951,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate Kaadrisagedus - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Madal - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High Kõrge - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8143,47 +8208,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers Kontrollerid - + Library Fonoteek - + Interface Liides - + Waveforms - + Mixer Miksija - + Auto DJ Automaatne DJ - + Decks - + Colors @@ -8218,47 +8283,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efektid - + Recording Salvestamine - + Beat Detection - + Key Detection Helistiku tuvastamine - + Normalization Normaliseerimine - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control - + Live Broadcasting - + Modplug Decoder @@ -8291,22 +8356,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Alusta salvestamist - + Recording to file: - + Stop Recording Peata salvestamine - + %1 MiB written in %2 @@ -8614,284 +8679,284 @@ This can not be undone! Summaarne - + Filetype: Failitüüp: - + BPM: Tempo: - + Location: Asukoht: - + Bitrate: Bitikiirus: - + Comments - + BPM Lööki minutis - + Sets the BPM to 75% of the current value. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Lugu nr - + Album Artist Albumi esitaja - + Composer Helilooja - + Title Pealkiri - + Grouping Rühmitamine - + Key Helistik - + Year Aasta - + Artist Esitaja - + Album Album - + Genre Žanr - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM Topelt BPM - + Halve BPM Pool BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous &Eelmine - + Move to the next item. "Next" button - + &Next &Järgmine - + Duration: Kestvus: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Ava failisirvias - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Rakenda - + &Cancel &Katkesta - + (no color) @@ -9048,7 +9113,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9250,27 +9315,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9414,38 +9479,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. @@ -9453,12 +9518,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9466,18 +9531,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9485,15 +9550,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9504,57 +9569,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate aktiveeri - + toggle lüliti - + right paremale - + left vasakule - + right small - + left small - + up üles - + down alla - + up small - + down small - + Shortcut Otsetee @@ -9562,62 +9627,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9627,22 +9692,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Impordi esitusloend - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Esitusloendi failid (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9689,27 +9754,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9769,18 +9834,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Kadunud lood - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9792,208 +9857,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry Proovi uuesti - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Seadista uuesti - + Help Abi - - + + Exit Välju - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue Jätka - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? Oled sa kindel, et tahad laadida uue loo? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Kinnita väljumine - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10009,13 +10115,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Lukus - - + + Playlists Esitusloendid @@ -10025,32 +10131,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Võta lukust lahti - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Loo uus esitusloend @@ -11541,7 +11673,7 @@ Fully right: end of the effect period - + Deck %1 Rada %1 @@ -11674,7 +11806,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11705,7 +11837,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11838,12 +11970,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11878,42 +12010,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11971,54 +12103,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Esitusloendid - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12153,19 +12285,19 @@ may introduce a 'pumping' effect and/or distortion. Lukus - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12577,7 +12709,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12759,7 +12891,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Katte kunst @@ -12995,197 +13127,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13423,924 +13555,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle Lülita - + Toggle the current effect. - + Next Järgmine - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Eelmine - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse Vastupidi - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Mängi/peata - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14475,33 +14615,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) (mängides) @@ -14521,205 +14661,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (peatamise ajal) - + Cue - + Headphone Kõrvaklapid - + Mute Vaigista - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Kui ükski rada ei mängi, sünkroniseerub esimese rajaga millel on BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock Kell - + Displays the current time. Jooksva aja kuvamine. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14764,254 +14914,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward Kiiresti edasi - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat Kordus - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Väljasta - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration Loo kestvus - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist Loo esitaja - + Displays the artist of the loaded track. - + Track Title Loo pealkiri - + Displays the title of the loaded track. - + Track Album Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15019,12 +15169,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15032,47 +15182,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15244,47 +15389,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15408,407 +15553,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view + + + + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist Uue esitusnimekirja loomine - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Vaade - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library Tühik - + &Full Screen &Täisekraan - + Display Mixxx using the full screen - + &Options &Seaded - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Luba &klaviatuuri otseteed - + Toggles keyboard shortcuts on or off Lülitab klaviatuuri otseteed sisse või välja - + Ctrl+` Ctrl+` - + &Preferences &Valikud - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Arendaja &Tööriistad - + Opens the developer tools dialog - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Abi - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual &Kasutusjuhend - + Read the Mixxx user manual. - + &Keyboard Shortcuts &Klaviatuuri Otseteed - + Speed up your workflow with keyboard shortcuts. Kiirenda oma tööd kasutades klaviatuuri otseteid. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Tõlgi see rakendus - + Help translate this application into your language. - + &About &Teave - + About the application Teave rakendusest @@ -15816,25 +15992,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15843,25 +16019,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15872,169 +16036,163 @@ This can not be undone! Otsi... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Otsetee + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Nupp - + harmonic with %1 - + BPM Lööki minutis - + between %1 and %2 - + Artist Esitaja - + Album Artist Albumi esitaja - + Composer Helilooja - + Title Pealkiri - + Album Album - + Grouping Rühmitamine - + Year Aasta - + Genre Žanr - + Directory - + &Search selected @@ -16042,599 +16200,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Rada - + Sampler - + Add to Playlist Lisa esitusnimekirja - + Crates Plaadikastid - + Metadata - + Update external collections - + Cover Art Katte kunst - + Adjust BPM - + Select Color - - + + Analyze Analüüsi - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Lisa auto-DJ järjekorda (alla) - + Add to Auto DJ Queue (top) Lisa auto-DJ järjekorda (üles) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Eemalda - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Seaded - + Open in File Browser Ava failisirvias - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Hinnang - + Cue Point - + + Hotcues - + Intro - + Outro - + Key Nupp - + ReplayGain - + Waveform - + Comment Märkus - + All Kõik - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Lukusta BPM - + Unlock BPM Eemalda BMP lukk - + Double BPM Topelt BPM - + Halve BPM Pool BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Rada %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Loo uus esitusloend - + Enter name for new playlist: Sisesta uue esitusloendi nimi: - + New Playlist Uus esitusnimekiri - - - + + + Playlist Creation Failed Esitusloendi loomine nurjus - + A playlist by that name already exists. Selle nimega esitusloend juba eksisteerib. - + A playlist cannot have a blank name. Esitusloend ei saa olla nimeta. - + An unknown error occurred while creating playlist: Teadmatu viga tekkis esitusloendi tegemisel: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Katkesta - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Sulge - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16650,37 +16834,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16688,37 +16872,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16726,60 +16910,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Näita või peida tulpasi. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database Ei suuda avada andmebaasi - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16790,67 +16979,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Sirvi - + Export directory - + Database version - + Export Ekspordi - + Cancel Katkesta - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16871,7 +17071,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16881,23 +17081,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_eu.qm b/res/translations/mixxx_eu.qm index e0f1210c84d227f37cc60b44da95188a44d5c7a9..58e6770a719a3981a47265acaa9a495975e2bdc4 100644 GIT binary patch delta 445 zcmXAjUr1AN9L3M?yPw-_|J-a5tFUNx37dfrj)=0tbR{-ON@MLs5nqz~6p0Tdh*%F% z%6CS8U=OKx)7^QS8(A>&C2JXUi+# z=^1p!rhzV0X>79PNKm$)L(&wd*ply$wmr(&;;v|~j{qZM;#PhHC>2C1xeXMPJXtpMeR@`Yw^m*bpv zsZ3x7DOJfmWfEjtyz^AAO*oX+We!{PvY-Mzs}&cb#M$ozJ0Y|Yq5 z!hF}=L5qD{aX%pQ1E2H6>Wo1pc`XFQ!iv`P4Or^oagR!Kt892yL_H6AHOju`9UBYx zxyyHtjK6I867*)0L;hBp|Iau4riietT^7w;snw{Ub2M<8=DRr+NYIkq6zHLRnq{z= a&j%yISLzF{&+*Li1ztUItaSO^u73|yzL?$s delta 571 zcmZ9HT}V@L7{;Iff2W<}ock~#Y)fRV73d-_ntdsTIcv;8WGS`_L#0M?LR%j~UsOba znet{N4Fhv?y3M2eXb6QjQWSz0k|gL|U4*xzE>h^kZlV`neizU4!1Jv4Ym@=apoP^9 zS>M_wMu5g~;Ox&l&mRF!Rssz>@{E@a{P}ypSS9O?NLGh=nF6$7i6buQofO1bn}T;Y8D;EiDu#D zsdqr;xG*BC9WspiMTc&>N{9`p!@?gZE!OhP1ImdG9!ru{dcl*IDJ?m8a-7zr2%l`H zhXps-5^WZ=n15>%t5IO|mv(VQEj+tSojNyHEELz>;WIa>vd~qWD3{urN&r`>Bs+fq zDH8y$HO*#^ap zGM{cIt7$)<(v#QZP*#S%Z+~kTiv?a diff --git a/res/translations/mixxx_eu.ts b/res/translations/mixxx_eu.ts index 2b80212ca903..518820c3c7f6 100644 --- a/res/translations/mixxx_eu.ts +++ b/res/translations/mixxx_eu.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Kendu kaxa pistaren iturri bezala - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Gehitu kaxa pistaren iturri bezala @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Erreprodukzio-zerrenda berria - + Add to Auto DJ Queue (bottom) Gehitu Auto DJ ilarara (bukaeran) - + Create New Playlist Erreprodukzio-zerrenda berria sortu - + Add to Auto DJ Queue (top) Gehitu Auto DJ ilarara (hasieran) - + Remove Kendu @@ -180,12 +180,12 @@ Berrizendatu - + Lock Blokeatu - + Duplicate Bikoiztu @@ -206,24 +206,24 @@ Erreprodukzio-zerrenda osoa aztertu - + Enter new name for playlist: Erreprodukzio-zerrendaren izen berria sartu: - + Duplicate Playlist Bikoiztu erreprodukzio-zerrenda - - + + Enter name for new playlist: Erreprodukzio-zerrenda berriaren izena sartu: - + Export Playlist Esportatu erreprodukzio-zerrenda @@ -233,70 +233,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Berrizendatu erreprodukzio-zerrenda - - + + Renaming Playlist Failed Ezin izan da erreprodukzio-zerrenda berrizendatu - - - + + + A playlist by that name already exists. Badago izen bereko beste erreproduzkio-zerrenda bat - - - + + + A playlist cannot have a blank name. Erreprodukzio-Zerrenda batek ezin du izen hutsik izan - + _copy //: Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Ezin izan da erreprodukzio-zerrenda sortu - - + + An unknown error occurred while creating playlist: Errore ezezagun bat gertatu da erreprodukzio zerrenda sortzean: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U erreproduzio-zerrenda (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U erreprodukzio-zerrenda (*.m3u);;M3U8 erreprodukzio-zerrenda (*.m3u8);;PLS erreprodukzio-zerrenda (*.pls);;CSV testua (*.csv);;Testu hutsa (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Denbora-marka @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ezin izan da pista kargatu @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Albuma - + Album Artist Albumaren artista - + Artist Artista - + Bitrate Bit tasa - + BPM BPM - + Channels Kanalak - + Color Kolorea - + Comment Iruzkina - + Composer Konpositorea - + Cover Art Azalaren irudia - + Date Added Gehitze-data: - + Last Played - + Duration Iraupena - + Type Mota - + Genre Generoa - + Grouping Taldeka - + Key Tonalitatea - + Location Kokalekua - + + Overview + + + + Preview Aurreikusi - + Rating Balorazioa - + ReplayGain ReplayGain - + Samplerate - + Played Jotakoak - + Title Titulua - + Track # Pista-zenbakia - + Year Urtea - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Gehitu esteka azkarretara - + Remove from Quick Links Kendu esteka azkarretatik - + Add to Library Liburutegira gehitu - + Refresh directory tree - + Quick Links Esteka azkarrak - - + + Devices Gailuak - + Removable Devices Gailu aldagarriak - - + + Computer Ordenagailua - + Music Directory Added Musika-direktorioa gehitu da - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -839,27 +861,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1041,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume - + Set to zero volume @@ -1072,13 +1099,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button @@ -1089,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1148,22 +1175,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1173,193 +1200,193 @@ trace - Above + Profiling messages Ekualizadoreak - + Vinyl Control Binilo kontrola - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop Sortu %1-taupada begizta - + Create temporary %1-beat loop roll Sortu behin behineko %1-taupada begizta erroilua @@ -1475,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1504,7 +1531,7 @@ trace - Above + Profiling messages - + Mute @@ -1515,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1536,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1624,82 +1651,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid Doitu taupada sarea - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1740,451 +1767,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve Begizta erdibitu - + Loop Double Begizta bikoiztu - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Gehitu Auto DJ ilarara (bukaeran) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Gehitu Auto DJ ilarara (hasieran) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track Kargatu aukeratutako pista - + Load selected track and play Kargatu aukeratutako pista eta erreproduzitu - - + + Record Mix - + Toggle mix recording - + Effects Efektuak - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Hurrengoa - + Switch to next effect - + Previous Aurrekoa - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain Irabazia - + Gain knob Irabazi kisketa - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2199,102 +2226,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2446,1041 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Mikrofonoa on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Auto DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface Erabiltzaile interfazea - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3595,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3664,13 +3713,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Kendu - + Create New Crate @@ -3680,132 +3729,132 @@ trace - Above + Profiling messages Berrizendatu - - + + Lock Blokeatu - + Export Crate as Playlist - + Export Track Files Pisten fitxategiak esportatu - + Duplicate Bikoiztu - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Kaxak - - + + Import Crate Inportatu kaxa - + Export Crate Esportatu kaxa - + Unlock Desblokeatu - + An unknown error occurred while creating crate: Errore ezezagun bat gertatu da kaxa sortzean: - + Rename Crate Berrizendatu kaxa - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Ezin inan da kaxa berrizendatu - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U erreprodukzio-zerrenda (*.m3u);;M3U8 erreprodukzio-zerrenda (*.m3u8);;PLS erreprodukzio-zerrenda (*.pls);;CSV testua (*.csv);;Testu hutsa (*.txt) - + M3U Playlist (*.m3u) M3U erreproduzio-zerrenda (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Kaxak DJ bezala erabili nahi duzun musika antolatzeko bikainak dira - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Kaxak zure musika nahieran antolatzea baimentzen dizute! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Kaxa batek ezin du izena hutsik izan - + A crate by that name already exists. Izen hori duen beste kaxa bat bada @@ -3900,12 +3949,12 @@ trace - Above + Profiling messages Lehengo - + Official Website - + Donate @@ -4024,72 +4073,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Jauzi - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Segundoak - + Auto DJ Fade Modes Full Intro + Outro: @@ -4120,80 +4169,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat Errepikatu - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Auto DJ - + Shuffle Nahastu - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4416,37 +4465,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4485,17 +4534,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5148,113 +5197,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Bat ere ez - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5267,105 +5316,105 @@ Apply settings and continue? - + Enabled Gaitua - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: - + Support: - + Screens preview - + Input Mappings - - + + Search - - + + Add Gehitu - - + + Remove Kendu @@ -5380,22 +5429,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5405,28 +5454,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Garbitu dena - + Output Mappings @@ -5585,6 +5634,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6176,62 +6235,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Informazioa - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7398,173 +7457,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Gaitua - + Stereo Estereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Konfigurazio-errorea @@ -7582,131 +7640,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate Lagintze-maiztasuna - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Irteera - + Input Sarrera - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7861,27 +7919,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7894,250 +7953,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Grabea - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High Agudoa - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8145,47 +8210,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Soinu Hardware-a - + Controllers - + Library Liburutegia - + Interface Interfazea - + Waveforms - + Mixer Nahastailea - + Auto DJ Auto DJ - + Decks - + Colors @@ -8220,47 +8285,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efektuak - + Recording Grabaketa - + Beat Detection Taupada Detekzioa - + Key Detection - + Normalization Normalizatu - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Binilo kontrola - + Live Broadcasting - + Modplug Decoder @@ -8293,22 +8358,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Grabatzen hasi - + Recording to file: - + Stop Recording Grabaketa gelditu - + %1 MiB written in %2 @@ -8616,284 +8681,284 @@ This can not be undone! Laburpena - + Filetype: - + BPM: BPM: - + Location: Kokapena: - + Bitrate: Bit-tasa: - + Comments - + BPM BPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Pista-zenbakia - + Album Artist Albumaren artista - + Composer Konpositorea - + Title Titulua - + Grouping Taldeka - + Key Tonalitatea - + Year Urtea - + Artist Artista - + Album Albuma - + Genre Generoa - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM Bikoiztu BPMa - + Halve BPM Erdibitu BPMa - + Clear BPM and Beatgrid Garbitu BPM eta taupada sarea - + Move to the previous item. "Previous" button - + &Previous &Aurrekoa - + Move to the next item. "Next" button - + &Next &Hurrengoa - + Duration: Iraupena: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Ireki fitxategi kudeatzailean - + Samplerate: - + Track BPM: Pistaren BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Erritmora klikatu - + Hint: Use the Library Analyze view to run BPM detection. Aholkua: Liburutegiko Analizatu ikuspegia erabili BPM detekzioa abiarazteko. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Aplikatu - + &Cancel &Ezeztatu - + (no color) @@ -9050,7 +9115,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9252,27 +9317,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9416,38 +9481,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library Aukeratu zure iTunes liburutegia - + (loading) iTunes (kargatzen) iTunes - + Use Default Library Lehenetsitako liburutegia erabili - + Choose Library... Liburutegia aukeratu - + Error Loading iTunes Library Errorea iTunes Liburutegia kargatzerakoan - + There was an error loading your iTunes library. Check the logs for details. @@ -9455,12 +9520,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9468,18 +9533,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9487,15 +9552,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9506,57 +9571,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate aktibatu - + toggle - + right eskuina - + left ezkerra - + right small - + left small - + up gora - + down behera - + up small - + down small - + Shortcut Lasterbidea @@ -9564,62 +9629,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9629,22 +9694,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Inportatu erreprodukzio-zerrenda - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Erreprodukzio-zerrenda fitxategiak (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9691,27 +9756,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9771,18 +9836,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9794,208 +9859,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. Laguntza<b>Eskuratu</b> Mixxx wikitik. - - - + + + <b>Exit</b> Mixxx. <b>atera</b> Mixxx-etik. - + Retry Berriz saiatu - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Birkonfiguratu - + Help Laguntza - - + + Exit Irten - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue Jarraitu - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Irtetzea konfirmatu - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10011,13 +10117,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Blokeatu - - + + Playlists Erreprodukzio-zerrendak @@ -10027,32 +10133,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desblokeatu - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Erreprodukzio-zerrenda berria sortu @@ -11543,7 +11675,7 @@ Fully right: end of the effect period - + Deck %1 @@ -11676,7 +11808,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11707,7 +11839,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11840,12 +11972,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11880,42 +12012,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11973,54 +12105,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Erreprodukzio-zerrendak - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12155,19 +12287,19 @@ may introduce a 'pumping' effect and/or distortion. Blokeatu - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12579,7 +12711,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12761,7 +12893,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Azalaren irudia @@ -12997,197 +13129,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13425,924 +13557,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Sampler Bankua Gorde - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Kargatu Sampler Bankua - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Hurrengoa - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Aurrekoa - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Doitu taupada sarea - + Adjust beatgrid so the closest beat is aligned with the current play position. Doitu taupada sarea taupada hurbilena oraingo erreprodukzio posizioarekin lerrokatu dadin. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14477,33 +14617,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14523,205 +14663,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone - + Mute - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock Erlojua - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14766,254 +14916,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward Aurreratze azkarra - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat Errepikatu - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Egotzi - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve Begizta erdibitu - + Halves the current loop's length by moving the end marker. Uneko begiztaren luzera erdibitzen du bukaera marka mugituz. - + Deck immediately loops if past the new endpoint. Erreproduzigailua berehala begiztatzen du bukaera puntua igarotakoan. - + Loop Double Begizta bikoiztu - + Doubles the current loop's length by moving the end marker. Uneko begiztaren luzera bikoizten du bukaera marka mugituz. - + Beatloop Taupada begizta - + Toggles the current loop on or off. Uneko begizta gaitu ala desgaitzen du - + Works only if Loop-In and Loop-Out marker are set. Begizta sarrera eta begizta irteera markak ezarrita badaude dabil soilik. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist Pistaren artista - + Displays the artist of the loaded track. - + Track Title Pistaren izenburua - + Displays the title of the loaded track. - + Track Album Albuma - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15021,12 +15171,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15034,47 +15184,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15246,47 +15391,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15410,407 +15555,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view + + + + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist Sortu erreprodukzio-zerrenda berria - + Ctrl+n - + Create New &Crate - + Create a new crate Sortu kaxa berria - + Ctrl+Shift+N - - + + &View &Ikusi - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen &Pantaila osoa - + Display Mixxx using the full screen Erakutsi Mixxx pantaila osoa erabiliz - + &Options &Aukerak - + &Vinyl Control &Binilo Kontrola - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix &Nahasketa Grabatu - + Record your mix to a file Zure Nahasketa Fitxategi Batean Gorde - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences &Hobespenak - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &Laguntza - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Komunitatearen Laguntza - + Get help with Mixxx - + &User Manual &Erabiltzaile Liburua - + Read the Mixxx user manual. Mixxx-en erabiltzaile liburua irakurri - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application Aplikazio Hau &Itzuli - + Help translate this application into your language. Lagundu aplikazio hau zure hizkuntzara itzultzen - + &About &Honi buruz - + About the application Aplikazioari buruz @@ -15818,25 +15994,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15845,25 +16021,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15874,169 +16038,163 @@ This can not be undone! Bilatu... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Lasterbidea + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Tonalitatea - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artista - + Album Artist Albumaren artista - + Composer Konpositorea - + Title Titulua - + Album Albuma - + Grouping Taldeka - + Year Urtea - + Genre Generoa - + Directory - + &Search selected @@ -16044,599 +16202,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist Gehitu erreprodukzio-zerrendara - + Crates Kaxak - + Metadata - + Update external collections - + Cover Art Azalaren irudia - + Adjust BPM - + Select Color - - + + Analyze Aztertu - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Gehitu Auto DJ ilarara (bukaeran) - + Add to Auto DJ Queue (top) Gehitu Auto DJ ilarara (hasieran) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Kendu - + Remove from Playlist - + Remove from Crate - + Hide from Library Liburutegitik ezkutatu - + Unhide from Library Liburutegitik ezkutatzeari utzi - + Purge from Library Kendu liburutegitik - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Propietateak - + Open in File Browser Ireki fitxategi kudeatzailean - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Balorazioa - + Cue Point - + + Hotcues - + Intro - + Outro - + Key Tonalitatea - + ReplayGain ReplayGain - + Waveform - + Comment Iruzkina - + All Guztiak - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM - + Unlock BPM - + Double BPM Bikoiztu BPMa - + Halve BPM Erdibitu BPMa - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Erreprodukzio-zerrenda berria sortu - + Enter name for new playlist: Idatzi erreprodukzio-zerrendaren izena - + New Playlist Erreprodukzio-zerrenda berria - - - + + + Playlist Creation Failed Ezin izan da erreprodukzio-zerrenda sortu - + A playlist by that name already exists. Badago izen bereko beste erreproduzkio-zerrenda bat - + A playlist cannot have a blank name. Erreprodukzio-Zerrenda batek ezin du izen hutsik izan - + An unknown error occurred while creating playlist: Errore ezezagun bat gertatu da erreprodukzio zerrenda sortzean: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Ezeztatu - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Itxi - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16652,37 +16836,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16690,37 +16874,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16728,60 +16912,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Erakutsi ala ezkutatu Zutabeak + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Aukeratu musika liburutegiaren direktorioa - + controllers - + Cannot open database Ezin da datu-basea ireki - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16792,67 +16981,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Arakatu - + Export directory - + Database version - + Export Esportatu - + Cancel Ezeztatu - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16873,7 +17073,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16883,23 +17083,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_fa.qm b/res/translations/mixxx_fa.qm index e852c288a9b2fb1dd0c294c599cd6c03bb7c792d..e00a10ce159b5c8bc663b6b968cfd6f059c8cc98 100644 GIT binary patch delta 452 zcmXBQJ4hP=9LMqh{k_~>E-$E|OVgo^%~BH_LIfYNh@7!vLC_9X)Y4Lrdl)YdDc+`A z6_g*93bB(*AygrY)gbr+vveq}D5zbs6ztTYON9n*`i$Qnzl{|>dB-dFgsIiY*+T797VhQinF~a$w_*1sRLp z6z8I-dM(ZekyIN2M;RLm6Ft@yEB>poomws&*yyRVQS z7!g!pJOxG{1kFGSyReIh-9$yyeU?F@Aw(c_)7OPTXA?x|z~TQK&hPpEpL1Sc!Ml?< zxkGpVdhL9Z@(AE?0iZ*-u7|n+`da|@K3mu1EWiK(MB`-Bxy;4QfoAzQ&3x) zE9%;Hn5d>7=tad!o%*9}I1do%q`dwD#@>)19Av(i+~F&A3J#3dQ&5=2_-C>i0@kjP z2mHpV8}TgwWQJ(MFw;=D?cx11`gebO0IY+8c#JHc_78i~$lV)j0^(Q^HbYr?ms}?(^EF_9{9G9s@Ok+Am1@Rtg z4dkxuM(r}?D_xjaqNkN!%m!$UOLCsvRdw~@Cqn?SYu4un1OSuY`f(foQL|xPoz5_S z`pDeHs-6gGx!rYAUo;d*O4?XRQh6bdNoV*mtRzyJG#U;?gEW#adZEYXONhur`pWwYS=6@nplAq|!ppUSnoW%)^-( f*0#}ZD2J2`=tWK?M{o~)$yL)sd()i%{8`ICrr+CI diff --git a/res/translations/mixxx_fa.ts b/res/translations/mixxx_fa.ts index 181bc75412fe..84a9247c2057 100644 --- a/res/translations/mixxx_fa.ts +++ b/res/translations/mixxx_fa.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source پاک کردن کلکسیون - + Auto DJ دی‌جی خودکار - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source افزودن کلکسیون @@ -147,28 +147,28 @@ BasePlaylistFeature - + New Playlist فهرست‌پخش جدید - + Add to Auto DJ Queue (bottom) افزودن به صف دی‌جی خودکار (پایین) - + Create New Playlist ساخت فهرست پخش جدید - + Add to Auto DJ Queue (top) افزودن به صف دی‌جی خودکار (بالا) - + Remove حذف @@ -178,12 +178,12 @@ نام‌گذاری دوباره - + Lock قفل - + Duplicate کپی همسان @@ -204,24 +204,24 @@ تحلیل فهرست‌پخش جاری - + Enter new name for playlist: نام جدید برای فهرست‌پخش - + Duplicate Playlist کپی همسان از فهرست‌پخش - - + + Enter name for new playlist: نام جدید برای فهرست‌پخش - + Export Playlist برون ریزی فهرست پخش @@ -231,70 +231,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist نام‌گذاری دوباره فهرست‌پخش - - + + Renaming Playlist Failed خطا در نام‌گذاری فهرست‌پخش - - - + + + A playlist by that name already exists. فهرست‌پخشی با این نام از پیش موجود است. - - - + + + A playlist cannot have a blank name. فهرست‌پخش نمیتواند بدون نام باشد - + _copy //: Appendix to default name when duplicating a playlist کپی - - - - - - + + + + + + Playlist Creation Failed خطا در ایجاد فهرست‌پخش - - + + An unknown error occurred while creating playlist: خطایی ناشناخته در هنگام تولید فهرست‌پخش رخ داده است : - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) فهرست پخش M3U (فایل .m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U فهرست‌پخش (*.m3u);;M3U8 فهرست‌پخش (*.m3u8);;PLS فهرست‌پخش (*.pls);;Text CSV (*.csv);; متن قابل خواندن (*.txt) @@ -302,12 +309,12 @@ BaseSqlTableModel - + # # - + Timestamp زمان ثبت شده در سیستم @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. بارگزاری قطعه امکان‌پذیر نیست. @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album کل %n آلبوم - + Album Artist هنرمند آلبوم - + Artist کل %n هنرمند - + Bitrate میزان ارسال بیت - + BPM BPM - + Channels کانال‌ها - + Color رنگ - + Comment دیدگاه - + Composer آهنگساز - + Cover Art جلد - + Date Added تاریخ افزودن - + Last Played - + Duration مدت پخش - + Type نوع - + Genre ژانر - + Grouping دسته بندی - + Key کلید - + Location موقعیت - + + Overview + + + + Preview پیش‌نمایش - + Rating رتبه‌دهی - + ReplayGain - + Samplerate - + Played پخش شده - + Title سمت - + Track # قطعه # - + Year سال - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links افزودن به پیوندهای سریع - + Remove from Quick Links حذف از پیوندهای سریع - + Add to Library - + Refresh directory tree - + Quick Links پیوندهای سریع - - + + Devices دستگاه‌ها - + Removable Devices دستگاههای جداشدنی - - + + Computer کامپیوتر - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -839,27 +861,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1041,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume روی کامل گذاشتن - + Set to zero volume روی 0 گذاشتن @@ -1072,13 +1099,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button دکمه قطع صدا @@ -1089,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1148,22 +1175,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1173,193 +1200,193 @@ trace - Above + Profiling messages اکولایزرها - + Vinyl Control - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 ۱۶ - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1475,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume صدای کامل - + Zero Volume صدای 0 @@ -1504,7 +1531,7 @@ trace - Above + Profiling messages - + Mute بی صدا @@ -1515,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1536,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1624,82 +1651,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1740,451 +1767,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) افزودن به صف دی‌جی خودکار (پایین) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) افزودن به صف دی‌جی خودکار (بالا) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track - + Load selected track and play - - + + Record Mix - + Toggle mix recording - + Effects جلوه‌ها - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next - + Switch to next effect - + Previous - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain سود - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2199,102 +2226,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2446,1041 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ دی‌جی خودکار - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface واسط کاربر - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3595,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3664,13 +3713,13 @@ trace - Above + Profiling messages CrateFeature - + Remove حذف - + Create New Crate @@ -3680,132 +3729,132 @@ trace - Above + Profiling messages نام‌گذاری دوباره - - + + Lock قفل - + Export Crate as Playlist - + Export Track Files برون ریزی فهرست پخش - + Duplicate کپی همسان - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates کلکسیون - - + + Import Crate - + Export Crate - + Unlock بازکردن قفل - + An unknown error occurred while creating crate: - + Rename Crate - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U فهرست‌پخش (*.m3u);;M3U8 فهرست‌پخش (*.m3u8);;PLS فهرست‌پخش (*.pls);;Text CSV (*.csv);; متن قابل خواندن (*.txt) - + M3U Playlist (*.m3u) فهرست پخش M3U (فایل .m3u) - + Crates are a great way to help organize the music you want to DJ with. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -3900,12 +3949,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4026,72 +4075,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds ثانیه - + Auto DJ Fade Modes Full Intro + Outro: @@ -4122,80 +4171,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat تکرار - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ دی‌جی خودکار - + Shuffle درهم ریختن - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4418,37 +4467,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4487,17 +4536,17 @@ You tried to learn: %1,%2 - + Log - + Search جستوجو - + Stats @@ -5150,113 +5199,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None هیچکدام - + %1 by %2 %1 بر اساس %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5269,105 +5318,105 @@ Apply settings and continue? - + Enabled فعال‌شده - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: توضیح: - + Support: پشتیبانی: - + Screens preview - + Input Mappings - - + + Search جستوجو - - + + Add افزودن - - + + Remove حذف @@ -5382,22 +5431,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5407,28 +5456,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All پاک کردن همه - + Output Mappings @@ -5587,6 +5636,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6178,62 +6237,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information اطلاعات - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7400,173 +7459,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled فعال‌شده - + Stereo استریو - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error خطای پیکربندی @@ -7584,131 +7642,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate سرعت نمونه - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output خروجی - + Input ورودی - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7863,27 +7921,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7896,250 +7955,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate سرعت فریم‌ها - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low پایین - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High بالا - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8147,47 +8212,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers - + Library کتابخانه - + Interface واسط - + Waveforms - + Mixer مخلوط‌کن - + Auto DJ دی‌جی خودکار - + Decks - + Colors @@ -8222,47 +8287,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects جلوه‌ها - + Recording ضبط - + Beat Detection - + Key Detection - + Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control - + Live Broadcasting - + Modplug Decoder @@ -8295,22 +8360,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording - + Recording to file: - + Stop Recording - + %1 MiB written in %2 @@ -8618,284 +8683,284 @@ This can not be undone! چکیده - + Filetype: - + BPM: BPM: - + Location: مکان: - + Bitrate: نرخ بیت: - + Comments - + BPM BPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # قطعه # - + Album Artist هنرمند آلبوم - + Composer آهنگساز - + Title سمت - + Grouping دسته بندی - + Key کلید - + Year سال - + Artist کل %n هنرمند - + Album کل %n آلبوم - + Genre ژانر - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous &قبلی‌ - + Move to the next item. "Next" button - + &Next &بعدی‌ - + Duration: مدت‌زمان: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color رنگ - + Date added: - + Open in File Browser بازکردن در ... - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &اعمال‌ - + &Cancel &لغو - + (no color) @@ -9052,7 +9117,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9256,27 +9321,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9420,38 +9485,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. @@ -9459,12 +9524,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9472,18 +9537,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9491,15 +9556,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9510,57 +9575,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate فعالسازی - + toggle ضامن - + right راست - + left چپ - + right small - + left small - + up بالا - + down پایین - + up small - + down small - + Shortcut میان‌بر @@ -9568,62 +9633,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9633,22 +9698,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist درون ریزی فهرست‌پخش - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) نوع فایل فهرست‌پخش (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9695,27 +9760,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9775,18 +9840,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9798,208 +9863,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry تلاش دوباره - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure پیکربندی مجدد - + Help راهنما - - + + Exit خروج - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue ادامه - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10015,13 +10121,13 @@ Do you want to select an input device? PlaylistFeature - + Lock قفل - - + + Playlists فهرست‌های پخش @@ -10031,32 +10137,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock بازکردن قفل - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist ساخت فهرست پخش جدید @@ -11547,7 +11679,7 @@ Fully right: end of the effect period - + Deck %1 دک %1 @@ -11680,7 +11812,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11711,7 +11843,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11844,12 +11976,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11884,42 +12016,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11977,54 +12109,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists فهرست‌های پخش - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12159,19 +12291,19 @@ may introduce a 'pumping' effect and/or distortion. قفل - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12583,7 +12715,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12765,7 +12897,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art جلد @@ -13001,197 +13133,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play نواختن - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13429,924 +13561,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse معکوس - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause پخش/مکث - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14481,33 +14621,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14527,205 +14667,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone هد‌فون - + Mute بی صدا - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock ساعت - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14770,254 +14920,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat تکرار - + When active the track will repeat if you go past the end or reverse before the start. - + Eject پس زدن - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album آلبوم - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15025,12 +15175,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15038,47 +15188,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - Overwrite Existing File? + + Replace Existing File? - - "%1" already exists, overwrite? + + "%1" already exists, replace? - &Overwrite + &Replace - - Over&write All - - - - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15250,47 +15395,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15414,407 +15559,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view - + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist ایجاد یک فهرست‌پخش جدید - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &نما‌ - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+5 - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen &تمام صفحه - + Display Mixxx using the full screen - + &Options &گزینه‌ها‌ - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` Ctrl+` - + &Preferences &تنظیمات‌ - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &راهنما - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx &دریافت کمک از Mixxx - + &User Manual &راهنمای کاربری - + Read the Mixxx user manual. خواندن راهنمای کاربری Mixxx - + &Keyboard Shortcuts &میانبر های کیبورد - + Speed up your workflow with keyboard shortcuts. سرعت کار خود را با میانبر های کیبورد افزایش دهید! - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &این نرم افزار را ترجمه کنید - + Help translate this application into your language. در ترجمه این نرم افزار به زبان خودتان کمک کنید - + &About &درباره - + About the application درباره این نرم افزار @@ -15822,25 +15998,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15849,25 +16025,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - پاکسازی داده ها - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun جستوجو - + Clear input پاکسازی داده ها @@ -15878,169 +16042,163 @@ This can not be undone! جستجو... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - میان‌بر + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - تمرکز + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - خروج از جستوجو + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key کلید - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist کل %n هنرمند - + Album Artist هنرمند آلبوم - + Composer آهنگساز - + Title سمت - + Album کل %n آلبوم - + Grouping دسته بندی - + Year سال - + Genre ژانر - + Directory - + &Search selected @@ -16048,599 +16206,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck دسته - + Sampler - + Add to Playlist افزودن به فهرست پخش - + Crates کلکسیون - + Metadata - + Update external collections - + Cover Art جلد - + Adjust BPM - + Select Color - - + + Analyze تحلیل - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) افزودن به صف دی‌جی خودکار (پایین) - + Add to Auto DJ Queue (top) افزودن به صف دی‌جی خودکار (بالا) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove حذف - + Remove from Playlist - + Remove from Crate - + Hide from Library از کتابخانه پنهان کن - + Unhide from Library ظاهر سازی در کتابخانه - + Purge from Library پاکسازی کتابخانه - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties مشخصات - + Open in File Browser بازکردن در ... - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating رتبه‌دهی - + Cue Point - + + Hotcues - + Intro - + Outro - + Key کلید - + ReplayGain - + Waveform - + Comment دیدگاه - + All همه - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 دک %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist ساخت فهرست پخش جدید - + Enter name for new playlist: نام جدید برای فهرست‌پخش - + New Playlist فهرست‌پخش جدید - - - + + + Playlist Creation Failed خطا در ایجاد فهرست‌پخش - + A playlist by that name already exists. فهرست‌پخشی با این نام از پیش موجود است. - + A playlist cannot have a blank name. فهرست‌پخش نمیتواند بدون نام باشد - + An unknown error occurred while creating playlist: خطایی ناشناخته در هنگام تولید فهرست‌پخش رخ داده است : - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel انصراف - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16656,37 +16840,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16694,37 +16878,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16732,60 +16916,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. نمایش یا پنهان سازی ستون ها + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16796,67 +16985,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse انتخاب فایل - + Export directory - + Database version - + Export - + Cancel انصراف - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16877,7 +17077,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16887,23 +17087,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_fi.qm b/res/translations/mixxx_fi.qm index ed01cc2160389a0153522c10076eab016e0b753c..91d9d1db279f10270a967792a0831d94f5037728 100644 GIT binary patch delta 554 zcmXBPO-Pdg7{Kx8dEDD;+nRGO_hD@7-S+OY4a!!cQOsIPn&3q|EKe~iWC#hvm?b$z z2O;5cX=Fka9@<*Q0wagDV>Rd!9U{7vow5w04~b}Or{C=l|GPP1k%gHKoP4w=gp&0D zz{z_6ndc2T4iNPNjNY${_E$WH`?-h?rR@m7zzaZk55LDG$+6ODN+8*u@#Cg`vdpnU z@zrcO1APZ?0c^yeFO&mFP1HrFnbksqtjjzm6v=j_l{~iM##0qdS!$xn;cilI>)+V{!|$-m{#0O=4u|} zS!IBnPr0g0P;iYqRS~kMN@X78SD$M7T0EUrZJVcSSkJRwlO%tXGnx>2UUFG8Y?e1fk9HlvxFvetRRD&zMPD`mxG&6|Eg#7J zfc4r0IUaIaYaySX7qo{^;y2pQBrkKh^)gw1aE~rP-c26SrLdVl>5Alx@@(56c?S4P z+n^+0Qm#hF0h&HG6u&p@?W&7XN9nA-9m)N>l-?aca!zugy%yQxxM7&~&T!d~Am3|t u7?;TYhpWarEf?}r0I|Py(e;lrrfv%UoT`{sDkhXIbJK^hdqwQRh1UNBe5Ppt delta 726 zcma)%TS$`u6vxjwyL@YYI$frljosY7Id?&%=0il1Zk23;WHmwz*<2Z8hE61~dQe6X zM08yDEOGgep~(av@}YW(!l%&aLiP{^K~@kH#Gt+udZ~vF9Dawx|NQ@)F;-1vRp&P2 z%~?|b?N$T8t{lL~{dIB&z-}+VvD<4z$6Zciy*kW*<|~{-No%tMv^@rN+jt36n&zsanv~2H~ zknN+`bb1Wn^9~G}s{!uWF*NnJkk6XO$MnZ!V4QhRC9)v+7MZm zIjoiR&L_%Cdlmrex|EkwS(#2A(fYO04dv9?Z*qd2=d=l`n_yE>h#VdHc#(kkg_EL0 z9v6>_0rDQ^MbS*|ef&|(knIhpi!)?x#^c{fVtKfe5 z03iB9@MQdeeixf`E95@U1zp1K9M!Z<#sF^hY7R!q0lFGBv0C{_lV6kaeE{^9@knU{ zKH`Pa_vFfQuIwaPU$8^(C(kms>j!a_7xmL5`FLpKeyR=dk_^`&_LiHe8uH=t3MBXI ze0-B1N$Td&3R(M{n=3oXKES!k1bOFJG)$6Xh35?8l|3`fhaz?n` - + Remove Crate as Track Source Poista levylaukku olemasta raitalähde - + Auto DJ Auto-DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Lisää levylaukku raitalähteeksi @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Uusi soittolista - + Add to Auto DJ Queue (bottom) Lisää Auto DJ -jonon loppuun - + Create New Playlist Luo uusi soittolista - + Add to Auto DJ Queue (top) Lisää Auto DJ -jonon alkuun - + Remove Poista @@ -180,12 +180,12 @@ Muuta nimeä - + Lock Lukitse - + Duplicate Monista @@ -206,24 +206,24 @@ Analysoi koko soittolista - + Enter new name for playlist: Anna uusi nimi soittolistalle - + Duplicate Playlist Duplikoi soittolista - - + + Enter name for new playlist: Anna nimi uudelle soittolistalle - + Export Playlist Vie soittolista @@ -233,70 +233,77 @@ Lisää Auto DJ -jonoon (korvaa) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Nimeä soittolista uudelleen - - + + Renaming Playlist Failed Soittolistan uudelleennimeäminen epäonnistui - - - + + + A playlist by that name already exists. Samanniminen soittolista on jo olemassa. - - - + + + A playlist cannot have a blank name. Soittolistan nimi ei voi olla tyhjä. - + _copy //: Appendix to default name when duplicating a playlist _kopioi - - - - - - + + + + + + Playlist Creation Failed Soittolistan luominen epäonnistui - - + + An unknown error occurred while creating playlist: Soittolistan luonnissa tapahtui tuntematon virhe: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U Soittolista (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) m3u-soittolista (*.m3u);;m3u8-soittolista (*.m3u8);;pls-soittolista (*.pls);;CSV-tekstitiedosto (*.csv);;Luettava tekstitiedosto (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Aikaleima @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kappaletta ei voitu ladata. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Levy - + Album Artist Albumin esittäjä - + Artist Esittäjä - + Bitrate Bittinopeus - + BPM BPM - + Channels Kanavat - + Color Väri - + Comment Kommentti - + Composer Säveltäjä - + Cover Art Kansikuva - + Date Added Lisäyspäivä - + Last Played Viimeksi soitettu - + Duration Kesto - + Type Tyyppi - + Genre Tyylilaji - + Grouping Ryhmittely - + Key Sävellaji - + Location Sijainti - + + Overview + + + + Preview Esikatselu - + Rating Arvostelu - + ReplayGain ReplayGain (toiston voimakkuuden tasoitus) - + Samplerate Näytteenottotaajuus - + Played Soitettu - + Title Kappale - + Track # Raidan # - + Year Vuosi - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Lisää pikalinkkejä - + Remove from Quick Links Poista pikalinkeistä - + Add to Library Lisää kirjastoon - + Refresh directory tree - + Quick Links Pikalinkit - - + + Devices Laitteet - + Removable Devices Irrotettavat laitteet - - + + Computer Tietokone - + Music Directory Added Musiikkikansio lisätty - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Lisäsit yhden tahi useamman musiikkihakemiston. Raidat näiden hakemistojen sisällä eivät tule tarjolle ennen kuin kirjastosi uudelleenskannataan. Haluatko skannata sen lävitse nyt? - + Scan Skannaa - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Tietokone" mahdollistaa navigoinnin, tarkastelun ja raitojen lataamisen kiintolevysi kansioista sekä ulkoisista laitteista. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: Mixx on avoimen lähdekoodin DJ-ohjelma. Lisätietoja näet täältä: - + Starts Mixxx in full-screen mode Käynnistää Mixxx:in kokoruututilassa - + Use a custom locale for loading translations. (e.g 'fr') Ota käyttöön oma kotoistus ja kieli ladataksesi käännöksiä. (esim. 'fi') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. Päällimmäinen hakemisto josta Mixx etsii hyödykkeitä kuten MIDI-kartoitukset, vakiollisen asennussijainnin ohittaminen. - + Path the debug statistics time line is written to Polku johon virhekorjaustilaston aikajana kirjoitetaan - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads Laittaa Mixxx:in näyttämään/kirjoittamaan talteen kaiken sen vastaanottaman ohjain-datan sekä kirjaamaan nuo ladatut toiminnot - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. Kytkee päälle kehittäjätilan. Sisältää tietojen lisäkirjauksia, suorituskykyyn liittyviä tilastoja, sekä kehittäjätyökalujen valikon. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. Kytkee päälle turvatun tilan. Päältä otetaan pois OpenGL-ääniaaltomuodot sekä pyörivät vinyylivimpaimet. Kokeile tätä vaihtoehtotilaa mikäli Mixxx kaatuu käynnistyksen yhteydessä. - + [auto|always|never] Use colors on the console output. [auto|always|never] Käytä päätteen tulosteissa värejä. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -844,27 +866,32 @@ virheenkorjaukseen liittyvät - kuten yllä + bugeihin liittyvät/kehittäjälii jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. Asettaa kirjaustason asteelle jossa kirjauspuskuri huuhtaistaan mixxx.log -tiedostoon. <level> on yksi arvoista jotka määritetään yllä --log-level tasolla. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1046,13 +1073,13 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Set to full volume Aseta äänenvoimakkuus täysille - + Set to zero volume Aseta äänenvoimakkuus nollalle @@ -1077,13 +1104,13 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Headphone listen button Kuulokekuuntelun nappi - + Mute button Hiljennä-nappi @@ -1094,25 +1121,25 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Mix orientation (e.g. left, right, center) Miksauksen suunta (vasen, oikea, keskellä) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1153,22 +1180,22 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit BPM-syötön nappi - + Toggle quantize mode Kvantisoinnin valintanappi - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode Valitse sävellajin lukitustila @@ -1178,193 +1205,193 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit Taajuuskorjaimet - + Vinyl Control Ohjainlevy - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Ohjainlevyn käynnistystila (päällä/pois/kuuma) - + Toggle vinyl-control mode (ABS/REL/CONST) Ohjainlevyn ohjaustila (abs./suht./vakio) - + Pass through external audio into the internal mixer - + Cues Cue-nappi - + Cue button Cue-nappi - + Set cue point Aseta cue-piste - + Go to cue point - + Go to cue point and play - + Go to cue point and stop Siirry cue-pisteeseen ja pysäytä - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues Nopea merkki - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 Poista hotcue-piste %1 - + Set hotcue %1 Aseta hotcue-piste %1 - + Jump to hotcue %1 Siirry hotcue-pisteeseen %1 - + Jump to hotcue %1 and stop Siirry hotcue-pisteeseen %1 ja pysäytä - + Jump to hotcue %1 and play Siirry hotcue-pisteeseen %1 ja toista. - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping Loopit - + Loop In button Loopin aloitusnappi - + Loop Out button Loopin lopetusnappi - + Loop Exit button - + 1/2 - + 1 1 - + 2 - + 4 - + 8 - + 16 - + 32 - + 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop Luo %1-tahdin looppi - + Create temporary %1-beat loop roll @@ -1482,20 +1509,20 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1511,7 +1538,7 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Mute Hiljennä @@ -1522,7 +1549,7 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Headphone Listen @@ -1543,25 +1570,25 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1631,82 +1658,82 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Adjust Beatgrid Säädä Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1747,451 +1774,451 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit Matalien taajuuksien korjain - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue Cue-nappi - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Lisää Auto DJ -jonon loppuun - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Lisää Auto DJ -jonon alkuun - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track Lataa valittu kappale - + Load selected track and play Lataa valittu kappale ja soita - - + + Record Mix - + Toggle mix recording - + Effects Efektit - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Seuraava - + Switch to next effect - + Previous Edellinen - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain Herkkyys - + Gain knob Sisääntulon herkkyys - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2206,102 +2233,102 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2453,1041 +2480,1063 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) Lisää Auto DJ -jonoon (korvaa) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Mikrofoni päällä/pois - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Auto-DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface Käyttöliittymä - + Samplers Show/Hide - + Show/hide the sampler section Näytä tai piilota näytesoittimet - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section Näytä tai piilota ohjainlevyjen valinnat - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget Näytä tai piilota pyörivä ohjainlevy - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3602,32 +3651,32 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3671,13 +3720,13 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit CrateFeature - + Remove Poista - + Create New Crate @@ -3687,132 +3736,132 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit Muuta nimeä - - + + Lock Lukitse - + Export Crate as Playlist - + Export Track Files Vie raitatiedostoja - + Duplicate Monista - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Levylaukut - - + + Import Crate Tuo levylaukku - + Export Crate Vie levylaukku - + Unlock Poista lukitus - + An unknown error occurred while creating crate: Levylaukkua tuotaessa tapahtui tuntematon virhe: - + Rename Crate Muuta levylaukun nimeä - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Levylaukun uudelleennimeäminen epäonnistui - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) m3u-soittolista (*.m3u);;m3u8-soittolista (*.m3u8);;pls-soittolista (*.pls);;CSV-tekstitiedosto (*.csv);;Luettava tekstitiedosto (*.txt) - + M3U Playlist (*.m3u) M3U Soittolista (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Levylaukkujen avulla voit helpommin järjestellä musiikkisi DJ-käyttöön. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Levylaukkujen avulla voit järjestellä musiikkisi kuten haluat! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Levylaukun nimi ei voi olla tyhjä - + A crate by that name already exists. Samanniminen levylaukku on jo olemassa. @@ -3907,12 +3956,12 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit Aikaisemmat avustajat - + Official Website - + Donate @@ -4031,72 +4080,72 @@ jäljitys - kuten yllä + henkilökuvaliitteiset viestit DlgAutoDJ - + Skip Ohita - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds sekuntia - + Auto DJ Fade Modes Full Intro + Outro: @@ -4127,80 +4176,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat Kertaa - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Auto-DJ - + Shuffle Sekoita - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4423,37 +4472,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4492,17 +4541,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5155,114 +5204,114 @@ associated with each key. DlgPrefController - + Apply device settings? Otetaanko laitteen asetukset käyttöön? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Laitteen asetukset tulee ottaa käyttöön ennen ohjatun määrittelyn käynnistämistä. Haluatko ottaa asetukset käyttöön ja jatkaa? - + None Määrittelemätön - + %1 by %2 %1 (tehnyt %2) - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5275,105 +5324,105 @@ Haluatko ottaa asetukset käyttöön ja jatkaa? Ohjaimen nimi - + Enabled Käytössä - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Kuvaus: - + Support: Tuki: - + Screens preview - + Input Mappings - - + + Search - - + + Add Lisää - - + + Remove Poista @@ -5388,22 +5437,22 @@ Haluatko ottaa asetukset käyttöön ja jatkaa? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5413,28 +5462,28 @@ Haluatko ottaa asetukset käyttöön ja jatkaa? Ohjattu määrittely (vain MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Tyhjennä kaikki - + Output Mappings @@ -5593,6 +5642,16 @@ Haluatko ottaa asetukset käyttöön ja jatkaa? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6184,62 +6243,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Tietoja - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7406,173 +7465,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Käytössä - + Stereo Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Virhe asetuksissa @@ -7590,131 +7648,131 @@ The loudness target is approximate and assumes track pregain and main output lev Äänirajapinta - + Sample Rate Näytteenottotaajuus - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Ulostulo - + Input Sisääntulo - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices Etsi laitteita @@ -7869,27 +7927,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available OpenGL ei ole käytettävissä - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7902,250 +7961,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate Kehysnopeus - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain Näytettävä herkkyys - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies Visuaalinen säädin keskialueen taajuuksille - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Matala - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies Visuaalinen säädin korkeille taajuuksille - + Visual gain of the low frequencies Visuaalinen säädin matalille taajuksille - + High Korkea - + Global visual gain Yleinen visuaalinen säädin - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8153,47 +8218,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Ääniliitynnät - + Controllers Ohjaimet - + Library Kirjasto - + Interface Käyttöliittymä - + Waveforms - + Mixer Mikseri - + Auto DJ Auto-DJ - + Decks - + Colors @@ -8228,47 +8293,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efektit - + Recording Nauhoitus - + Beat Detection Iskuntunnistus - + Key Detection - + Normalization Normalisointi - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Ohjainlevy - + Live Broadcasting Verkkojulkaisu - + Modplug Decoder @@ -8301,22 +8366,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Aloita tallennus - + Recording to file: - + Stop Recording Lopeta tallennus - + %1 MiB written in %2 @@ -8624,284 +8689,284 @@ This can not be undone! Yhteenveto - + Filetype: Tiedostotyyppi: - + BPM: BPM: - + Location: Sijainti: - + Bitrate: Bittinopeus: - + Comments - + BPM BPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Raidan # - + Album Artist Albumin esittäjä - + Composer Säveltäjä - + Title Kappale - + Grouping Ryhmittely - + Key Sävellaji - + Year Vuosi - + Artist Esittäjä - + Album Levy - + Genre Tyylilaji - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM Tuplaa BPM - + Halve BPM Puolita BPM - + Clear BPM and Beatgrid Tyhjennä BPM ja iskuverkko - + Move to the previous item. "Previous" button - + &Previous &Edellinen - + Move to the next item. "Next" button - + &Next &Seuraava - + Duration: Kesto: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color Väri - + Date added: - + Open in File Browser Avaa tiedostoselain - + Samplerate: - + Track BPM: Tempo (BPM): - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Naputa tahdissa - + Hint: Use the Library Analyze view to run BPM detection. Vinkki: voit käynnistää tempotunnistuksen kirjaston analysointinäkymstä. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Käytä - + &Cancel &Peru - + (no color) @@ -9058,7 +9123,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9260,27 +9325,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9424,38 +9489,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library Valitse iTunes kirjastosi - + (loading) iTunes (ladataan) iTunes - + Use Default Library Käytä oletuskirjastoa - + Choose Library... Valitse kirjasto... - + Error Loading iTunes Library Virhe ladattaessa iTunes-kirjastoa - + There was an error loading your iTunes library. Check the logs for details. @@ -9463,12 +9528,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9476,18 +9541,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9495,15 +9560,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9514,57 +9579,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate aktivoi - + toggle näkyvyys - + right oikea - + left vasen - + right small - + left small - + up ylös - + down alas - + up small - + down small - + Shortcut Pikakuvake @@ -9572,62 +9637,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9637,22 +9702,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Tuo soittolista - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Soittolistan tiedostot (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9699,27 +9764,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9779,18 +9844,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Puuttuvat kappaleet - + Hidden Tracks Piilotetut kappaleet - Export to Engine Prime + Export to Engine DJ @@ -9802,208 +9867,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Äänilaite on varattu - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Yritä uudelleen</b> suljettuasi toisen ohjelman tai yhdistettyäsi äänilaitteen - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Määrittelle uudestaan</b> Mixxx- äänilaitteidn asetukset. - - + + Get <b>Help</b> from the Mixxx Wiki. Etsi <b>apua</b> Mixxx-wikistä. - - - + + + <b>Exit</b> Mixxx. <b>Sulje</b> Mixxx. - + Retry Yritä uudelleen - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Määrittele uudelleen - + Help Ohje - - + + Exit Sulje - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices Äänilaitteita ei löytynyt - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Äänilaitteita ei ole määritelty mixxx-asetuksissa. Äänen käsittely ei ole käytössä, kunnes kelvollinen toistolaite on määritelty. - + <b>Continue</b> without any outputs. <b>Jatka</b> määrittelemättä äänilaitteita. - + Continue Jatka - + Load track to Deck %1 Lataa kappale dekkiin %1 - + Deck %1 is currently playing a track. Dekki %1 soittaa kappaletta. - + Are you sure you want to load a new track? Haluatko varmasti ladata uuden kappaleen? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Virhe teematiedostossa - + The selected skin cannot be loaded. Valittua teemaa ei voi ladata. - + OpenGL Direct Rendering OpenGL -suorapiirto - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Varmista lopetus - + A deck is currently playing. Exit Mixxx? Dekki soittaa kappaletta. Suljetaanko Mixxx? - + A sampler is currently playing. Exit Mixxx? Näytesoitin on käynnissä. Suljetaanko mixxx? - + The preferences window is still open. Määritys-ikkuna on vielä auki. - + Discard any changes and exit Mixxx? Hylkää kaikki muutokset ja sulje Mixxx @@ -10019,13 +10125,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Lukitse - - + + Playlists Soittolistat @@ -10035,32 +10141,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Poista lukitus - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Jotkut DJ:t luovat soittolistoja ennen esiintymistä, toiset rakentavat soittolistan esityksen aikana. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Käyttäessäsi soittolistaa DJ-esityksen aikana, muista tarkkailla yleisön reaktioita valitsemaasi musiikkiin. - + Create New Playlist Luo uusi soittolista @@ -11551,7 +11683,7 @@ Fully right: end of the effect period - + Deck %1 Dekki %1 @@ -11684,7 +11816,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Läpisyöttö @@ -11715,7 +11847,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11848,12 +11980,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11888,42 +12020,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11981,54 +12113,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Soittolistat - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12163,19 +12295,19 @@ may introduce a 'pumping' effect and/or distortion. Lukitse - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12587,7 +12719,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Pyörivä Vinyyli @@ -12769,7 +12901,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Kansikuva @@ -13005,197 +13137,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Tempon ja BPM:n naputus - + Show/hide the spinning vinyl section. Näytä/Piilota pyörivä vinyylialue - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13433,924 +13565,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Tallenna samplepankki - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Lataa samplepankki - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Seuraava - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Edellinen - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Säädä Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize Kvantisoi - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse Soita takaperin - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Soita/pysäytä - + Jumps to the beginning of the track. Hyppää kappaleen alkuun. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14485,33 +14625,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. Soita tai pysäytä kappale. - + (while playing) @@ -14531,205 +14671,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue Cue-nappi - + Headphone Kuulokkeet - + Mute Hiljennä - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock Kello - + Displays the current time. Näyttää nykyisen ajan. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14774,254 +14924,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Pikakelaus eteenpäin - + Fast rewind through the track. Nopea kappaleen takaperin kelaus. - + Fast Forward Pikakelaus taaksepäin - + Fast forward through the track. Nopea kappaleen etuperin kelaus. - + Jumps to the end of the track. Hyppää kappaleen loppuun. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Sävelkorkeuden säätö - + Pitch Rate Sävelkorkeuden suhde - + Displays the current playback rate of the track. - + Repeat Kertaa - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Poistaa dekistä - + Ejects track from the player. - + Hotcue Nopea merkki - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. Absoluuttinen tila - Kappaleen asento vastaa neulan sijaintia ja nopeutta. - + Relative mode - track speed equals needle speed regardless of needle position. Suhteellinen tila - Neula seuraa kappaleen noupeutta riippumatta neulan sijainnista. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Vakio tila - Kappaleen nopeus vastaa vakionopeutta riippumatta neulan sisääntulosta. - + Vinyl Status Vinyylin tila - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. Puolittaa nykyisen loopin pituuden siirtämällä loppumerkkiä. - + Deck immediately loops if past the new endpoint. Dekki toistaa loopin heti, jos ollaan uuden ohituskohdan ohi - + Loop Double - + Doubles the current loop's length by moving the end marker. Tuplaa nykyisen loopin pituuden siirtämällä loppumerkkiä. - + Beatloop Iskulooppi - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time Kappaleen kesto - + Track Duration Kappaleen kesto - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist Kappaleen esittäjä - + Displays the artist of the loaded track. Näyttää ladatun kappaleen esittäjän. - + Track Title Kappaleen nimi - + Displays the title of the loaded track. Näytää ladatun kappaleen nimi. - + Track Album Kappaleen albumi - + Displays the album name of the loaded track. Näyttää ladatun kappaleen albumin. - + Track Artist/Title - + Displays the artist and title of the loaded track. Näyttää ladatun kappaleen esittäjän ja nimen. @@ -15029,12 +15179,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15042,47 +15192,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15254,47 +15399,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15418,407 +15563,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view + + + + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist Luo uusi soittolista - + Ctrl+n - + Create New &Crate - + Create a new crate Luo uusi levylaukku - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Näytä - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Ei välttämättä tue kaikkia kalvoja. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen K&okoruututila - + Display Mixxx using the full screen Näytä Mixxx kokoruututilassa - + &Options &Valinnat - + &Vinyl Control &Levyohjain - + Use timecoded vinyls on external turntables to control Mixxx Ohjaa mixxx:iä levysoittimilla ja aikakoodatuilla levyillä - + Enable Vinyl Control &%1 - + &Record Mix N&auhoita miksaus - + Record your mix to a file Nauhoita miksauksesi tiedostoon - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Ota suora nettijulkaisu käyttöön - + Stream your mixes to a shoutcast or icecast server Lähetä miksauksesi shoutcast- tai icecast-palvelimelle - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Ota &Näppäimistö pikakuvakkeet käyttöön - + Toggles keyboard shortcuts on or off Määrittää ovatko pikanäppäimet käytössä - + Ctrl+` Ctrl+` - + &Preferences &Asetukset - + Change Mixxx settings (e.g. playback, MIDI, controls) Muokkaa ohjelman asetuksia (toistoa, MIDI-ohjaimia jne.) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &Ohje - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Mixxx-yhteisö (englanniksi) - + Get help with Mixxx Pyydä apua Mixxx:in kanssa - + &User Manual &Käyttöohje - + Read the Mixxx user manual. Lue Mixxx-käyttöohjetta. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Käännä tätä ohjelmaa - + Help translate this application into your language. Auta tämän ohjelman kääntämisessä kielellesi. - + &About &Tietoja - + About the application Tietoja ohjelmasta @@ -15826,25 +16002,25 @@ This can not be undone! WOverview - + Passthrough Läpisyöttö - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15853,25 +16029,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15882,169 +16046,163 @@ This can not be undone! Etsi... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Pikakuvake + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Sävellaji - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Esittäjä - + Album Artist Albumin esittäjä - + Composer Säveltäjä - + Title Kappale - + Album Levy - + Grouping Ryhmittely - + Year Vuosi - + Genre Tyylilaji - + Directory - + &Search selected @@ -16052,599 +16210,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Dekki - + Sampler Näytesoitin - + Add to Playlist Lisää soittolistaan - + Crates Levylaukut - + Metadata - + Update external collections - + Cover Art Kansikuva - + Adjust BPM - + Select Color - - + + Analyze Analysoi - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Lisää Auto DJ -jonon loppuun - + Add to Auto DJ Queue (top) Lisää Auto DJ -jonon alkuun - + Add to Auto DJ Queue (replace) Lisää Auto DJ -jonoon (korvaa) - + Preview Deck - + Remove Poista - + Remove from Playlist - + Remove from Crate - + Hide from Library Piilota kirjastosta. - + Unhide from Library Näytä kirjastossa. - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Ominaisuudet - + Open in File Browser Avaa tiedostoselain - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Arvostelu - + Cue Point - + + Hotcues Nopea merkki - + Intro - + Outro - + Key Sävellaji - + ReplayGain ReplayGain (toiston voimakkuuden tasoitus) - + Waveform - + Comment Kommentti - + All Kaikki - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Lukitse BPM - + Unlock BPM Poista BPM-lukitus - + Double BPM Tuplaa BPM - + Halve BPM Puolita BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Dekki %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Luo uusi soittolista - + Enter name for new playlist: Anna nimi uudelle soittolistalle - + New Playlist Uusi soittolista - - - + + + Playlist Creation Failed Soittolistan luominen epäonnistui - + A playlist by that name already exists. Samanniminen soittolista on jo olemassa. - + A playlist cannot have a blank name. Soittolistan nimi ei voi olla tyhjä. - + An unknown error occurred while creating playlist: Soittolistan luonnissa tapahtui tuntematon virhe: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Keskeytä - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Sulje - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16660,37 +16844,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16698,37 +16882,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16736,60 +16920,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Näytä tai piilota sarakkeita. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Valitse musiikkikokoelman sijainti - + controllers - + Cannot open database Tietokantaa ei voida avata - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16803,67 +16992,78 @@ Valitse OK poistuaksesi. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Selaa - + Export directory - + Database version - + Export Vie - + Cancel Keskeytä - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16884,7 +17084,7 @@ Valitse OK poistuaksesi. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16894,23 +17094,23 @@ Valitse OK poistuaksesi. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_fr.qm b/res/translations/mixxx_fr.qm index 01e81edcb56894abef75591119ebc543cc042d2d..a5f5f92ba862333b0754bdf4db77d21b6699639a 100644 GIT binary patch delta 27965 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 delta 26770 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

M0w116D+X{B5^5QJ$qz{PNP5Oeam z-2E&-xysdHn0$V57;o}3+HM7ZakF+<(1Dyc{iy=e?auLLqC4gdJMm^s(RJI=o;Sll zhVDidC%v&nHl}l0h&A4OkkfZ>Kqr37*=6)8p9`FS{=acgmT5ySbmYya=YyEy#9MU4 zh^CdqTZ~8lf67DNa)p4gn?HH$LD=MWKD>=J>hk4Xxm9gF$eDY&eKHF1*TLMmH432= z$el0xf#ltm8+yD0U3wZf_|^k#h~piTD?u_}!Cl{FAkA07-EvFN|KG3Yoef?fHMQfN z<4`!7>3HX}twHEVx%)9cwlX#NpA44_I&n z#2_8_>3|n_7)+>ke8vYKm*gS+8=;%0KEy7SI&Iu-bEPnvOqL00@bXV zPkoKT@$xaB=8=Hp@JAjiqaxaOn#Z=ol@HpU<}-fBg2kWbiJ2QfI_krdPo#jbsxO~q z@hj*mX7H4c53OPxUAvI-wBWZG$Z+H7(tJ=n z^Ld7GcQ#Ti$$ZVqS`dBu^R*86=JKYieB&@zj0cAE&6dXj=4A7&NjR>n{P?zc`S@ai z$hTj>(V#QuJMQ302ZMU?ol|Ck($tJ+zYD;mlm0wsaUcj$R=kl1?8|e@x?qiu^B;bS z0kQZGp6`+l!pRbD%zuM7YW@q~U*?75xSk)l)d%E2Nr00Xb=I2sTMixKk z=QiRJj^)|>eAFXQ2N?MI=uK#j*BbeSegfz`7xD{JQP|ce@=~h|5MMktp;9>ezj(b7 zPkEY94cW;{{T6}nx-GwKUIx;1Z+nH`5Zc-+$-tuj|o;YQjIH zWPp@$lz-S2h|cH}6Uv1L_{RwzXxIP1|Cxrub%^m#L-vC>s5P&jj7IFiol&4p;D=Ku zezer)#o$^Tc{AH+R@FMg;kk2?n=W!&vea#fuE1@H5HLhLa8;1Bb2UOsZA+QZR+p&R z;mb@*OUs0U(lW98!Gh5Xr3t*iZLPFc)Lb@7PnL#j5`N@@a7|gfrJ!S1wX3dRt%tge z7g!EfuM=%afI9N?m!swrsM>3J0cyFYH4KDAh=*u!fdLQ(5ikuBAkMTEiEFt4DEMIm z6XT;@282aSONa}Lh}5nJt8HuuUK#*j!*IOR_uo?$)2Y6uQw;y_6yhHl79TNXu5WBa zQo`pu|KHOKjDc!Tos&2I1WSymP?1?5rKQf(S!z3Sg{C&v zJ~4@r@%k`*LSlSW%w&CHtUkf?9Q~x&cvDHfXo@$DfGJq7xPOZ(`Xoe{j?xbJ<1R@M zg%3@HNNvqGV%v2YHD;ul&#b7#|K7@UV%w(pvoNuEqa;Z9_cpSrGN$9Y_3Mm#dQ&}& zzz4GfaimLpb*Rbm$3s z%`-%`^NjqwiGmS}f4*3lc<6}xogf7-{Ji)1XczFpzs~=*hnKcEMD;Qis$l2@HKdsq ze@bqtRTj$43ocDnt6g-iTIW2)N*kG?Q?xZ9QtN{I8&$JTszaj$u50ngu{rmTjE;;* zjGU;Ch!0DQOwgL2Qtb@Yp%2g=?Ckn)5gmPI#bM*&-5tB=6XQ{?of8cDuo&ETZ+sx`yK2{dQS}7@rRpHz Fe*n&LSk?dl diff --git a/res/translations/mixxx_fr.ts b/res/translations/mixxx_fr.ts index 43285b58ba9d..c00ac34b264b 100644 --- a/res/translations/mixxx_fr.ts +++ b/res/translations/mixxx_fr.ts @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nouvelle liste de lecture @@ -160,7 +160,7 @@ - + Create New Playlist Créer une nouvelle liste de lecture @@ -190,113 +190,120 @@ Dupliquer - - + + Import Playlist Importer une liste de lecture - + Export Track Files Exporter les fichiers des pistes - + Analyze entire Playlist Analyser la liste de lecture entière - + Enter new name for playlist: Entrer le nouveau nom de la liste de lecture : - + Duplicate Playlist Dupliquer la liste de lecture - - + + Enter name for new playlist: Entrer le nom de la nouvelle liste de lecture : - - + + Export Playlist Exporter la liste de lecture - + Add to Auto DJ Queue (replace) Ajouter à la file d'attente Auto-DJ (Remplacer) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + Exporter vers Engine DJ + + + Rename Playlist Renommer la liste de lecture - - + + Renaming Playlist Failed Échec pour renomer la liste de lecture - - - + + + A playlist by that name already exists. Une liste de lecture du même nom exise déjà - - - + + + A playlist cannot have a blank name. Une liste de lecture ne peut pas être sans nom. - + _copy //: Appendix to default name when duplicating a playlist _copie - - - - - - + + + + + + Playlist Creation Failed La création de la liste de lecture a échouée - - + + An unknown error occurred while creating playlist: Une erreur inconnue s'est produite à la création de la liste de lecture : - + Confirm Deletion Confirmer la suppression - + Do you really want to delete playlist <b>%1</b>? Voulez-vous vraiment supprimer la liste de lecture <b>%1</b>? - + M3U Playlist (*.m3u) Liste de lecture M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Liste de lecture M3U (*.m3u);;Liste de lecture M3U8 (*.m3u8);;Liste de lecture PLS (*.pls);;Texte CSV (*.csv);;Texte (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # - + Timestamp Horodatage @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Impossible de charger la piste. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artiste de l'album - + Artist Artiste - + Bitrate Débit - + BPM BPM - + Channels Canaux - + Color Couleur - + Comment Commentaire - + Composer Compositeur - + Cover Art Pochette d'album - + Date Added Date d'ajout - + Last Played Dernière écoute - + Duration Durée - + Type Type - + Genre Genre - + Grouping Regroupement - + Key Tonalité - + Location Emplacement - + Overview - + Aperçu - + Preview Aperçu - + Rating Notation - + ReplayGain ReplayGain - + Samplerate Taux d'échantillonnage - + Played Joué - + Title Titre - + Track # Piste n° - + Year Année - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Récupération de l'image... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Ordinateur" vous permet de naviguer, voir et charger les pistes dans les répertoires de votre disque dur et périphériques externes. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3633,32 +3650,32 @@ trace : ci-dessus + messages de profilage ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La fonctionnalité fournie par ce mappage de contrôleur sera désactivée jusqu'à ce que le problème soit résolu. - + You can ignore this error for this session but you may experience erratic behavior. Vous pouvez ignorer cette erreur pour la durée de la session mais il se peut que vous observiez un comportement erratique. - + Try to recover by resetting your controller. Tenter de récupérer en redémarrant votre contrôleur. - + Controller Mapping Error Erreur du mappage contrôleur - + The mapping for your controller "%1" is not working properly. Le mappage pour votre contrôleur "%1" ne fonctionne pas correctement. - + The script code needs to be fixed. Le code du script doit être corrigé. @@ -3766,7 +3783,7 @@ trace : ci-dessus + messages de profilage Importer un bac - + Export Crate Exporter un bac @@ -3776,7 +3793,7 @@ trace : ci-dessus + messages de profilage Déverrouiller - + An unknown error occurred while creating crate: Une erreur inconnue s'est produite lors de la création du bac : @@ -3802,17 +3819,17 @@ trace : ci-dessus + messages de profilage Le renommage du bac a échoué - + Crate Creation Failed Échec de création d'un bac - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Liste de lecture M3U (*.m3u);;Liste de lecture M3U8 (*.m3u8);;Liste de lecture PLS (*.pls);;Texte CSV (*.csv);;Texte (*.txt) - + M3U Playlist (*.m3u) Liste de lecture M3U (*.m3u) @@ -3938,12 +3955,12 @@ trace : ci-dessus + messages de profilage Anciens contributeurs - + Official Website Site Internet officiel - + Donate Donation @@ -3999,7 +4016,7 @@ trace : ci-dessus + messages de profilage - + Analyze Analyser @@ -4044,17 +4061,17 @@ trace : ci-dessus + messages de profilage Lance les détections de grille rythmique, tonalité et ReplayGain sur les pistes sélectionnées. Ne génère pas leur formes d'ondes pour économiser l'espace disque. - + Stop Analysis Arrêter l'analyse - + Analyzing %1% %2/%3 Analyse %1% %2/%3% - + Analyzing %1/%2 Analyse %1/%2 @@ -4496,37 +4513,37 @@ Résulte souvent en de meilleures grilles rythmiques, mais ne marchera pas bien Si l'assignation ne fonctionne pas, essayez d'activer une option avancée ci-dessous et testez le contrôle à nouveau. Ou cliquez sur Réessayer pour recommencer la détection du contrôle MIDI. - + Didn't get any midi messages. Please try again. Aucun message MIDI reçu. Veuillez réessayer. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Impossible de détecter une association de contrôle -- veuillez réessayer. Assurez-vous de ne toucher qu'un contrôle à la fois. - + Successfully mapped control: Contrôle assigné avec succès : - + <i>Ready to learn %1</i> <i>Prêt pour apprendre %1</i> - + Learning: %1. Now move a control on your controller. Apprentissage de : %1. Maintenant bouger un contrôle de votre contrôleur. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 Le contrôle sélectionné n'existe pas.<br>Il s'agit probablement d'un bug. Veuillez le signaler sur le bug tracker de Mixxx. <br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>Vous avez essayé d'apprendre : %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5233,114 +5250,114 @@ associé à chaque tonalité. DlgPrefController - + Apply device settings? Appliquer les paramètres du périphérique ? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Vos paramètres doivent être appliqués avant de démarrer l'assistant d'apprentissage. Appliquer les paramètres et continuer ? - + None Aucune - + %1 by %2 %1 par %2 - + Mapping has been edited Le mappage à été modifié - + Always overwrite during this session Toujours écraser durant cette session - + Save As Enregistrer sous - + Overwrite Écraser - + Save user mapping Enregistrer le mappage utilisateur - + Enter the name for saving the mapping to the user folder. Entrer le nom pour enregistrer le mappage dans le dossier de l'utilisateur - + Saving mapping failed L'enregistrement du mappage à échoué - + A mapping cannot have a blank name and may not contain special characters. Un mappage ne peut pas avoir un nom vide et ne peut pas contenir des caractères spéciaux. - + A mapping file with that name already exists. Un fichier de mappage utilise déjà ce nom. - + Do you want to save the changes? Voulez-vous enregistrer les modifications ? - + Troubleshooting Dépannage - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Si vous utilisez ce mappage, votre contrôleur risque de ne pas fonctionner correctement. Veuillez sélectionner un autre mappage ou désactiver le contrôleur.</b></font><br><br>Ce mappage a été conçu pour un moteur de contrôleur Mixxx plus récent et ne peut pas être utilisé sur votre installation de Mixxx actuelle.<br>Votre installation de Mixxx a la version Controller Engine %1. Ce mappage nécessite une version de Controller Engine >= %2.<br><br>Pour plus d'informations, visitez la page wiki sur<a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Versions de Controller Engine</a>. - + Mapping already exists. Le mappage existe déjà. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> existe déjà dans le dossier des mappages de l'utilisateur.<br>Écraser ou utiliser un autre nom ? - + Clear Input Mappings Effacer les associations de contrôles d'entrées - + Are you sure you want to clear all input mappings? Voulez-vous vraiment effacer toutes les associations de contrôles d'entrées ? - + Clear Output Mappings Effacer les associations de contrôles de sorties - + Are you sure you want to clear all output mappings? Voulez-vous vraiment effacer toutes les associations de contrôles de sortie ? @@ -5671,6 +5688,16 @@ Appliquer les paramètres et continuer ? Multi-Sampling Multi-échantillonnage + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5707,7 +5734,7 @@ Appliquer les paramètres et continuer ? Mixxx mode (no blinking) - mode Mixxx (sans clignottement) + mode Mixxx (sans clignotement) @@ -6285,62 +6312,62 @@ Vous pouvez toujours glisser-déposer des pistes sur l'écran pour cloner u DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. La taille minimale du thème sélectionné est plus grande que la résolution de votre écran. - + Allow screensaver to run Autoriser l'économiseur d'écran - + Prevent screensaver from running Interdire l'économiseur d'écran - + Prevent screensaver while playing Interdire l'économiseur d'écran pendant la lecture - + Disabled Désactivé - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Ce thème n'accepte pas les modèles de couleurs - + Information Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx doit être redémarré avant que les nouveaux paramètres régionaux, de mise à l'échelle ou de multi-échantillonnage ne prennent effet. @@ -7510,173 +7537,172 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Par défaut (délai long) - + Experimental (no delay) Expérimental (sans délai) - + Disabled (short delay) Désactivé (délai court) - + Soundcard Clock Horloge carte son - + Network Clock Horloge réseau - + Direct monitor (recording and broadcasting only) Moniteur direct (seulement enregistrement et diffusion) - + Disabled Désactivé - + Enabled Activé - + Stereo Stéréo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Pour activer la planification en temps réel (actuellement désactivée), consulter le %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. Le %1 répertorie les cartes son et les contrôleurs que vous pouvez envisager d'utiliser avec Mixxx. - + Mixxx DJ Hardware Guide Guide Mixxx du matériel DJ - + Information Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx doit être redémarré avant que la modification du paramètre multi-thread RubberBand ne prenne effet. - + auto (<= 1024 frames/period) auto (<= 1024 images/période) - + 2048 frames/period 2048 images/période - + 4096 frames/period 4096 images/période - + Are you sure? Est-vous sûr ? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. La distribution des canaux stéréo en canaux mono pour un traitement parallèle entrainera une perte de compatibilité mono et une image stéréo diffuse. Il n'est pas recommandé pendant la diffusion ou l'enregistrement. - + Are you sure you wish to proceed? Êtes-vous sûr de vouloir continuer ? - + No Non - + Yes, I know what I am doing Oui, je sais ce que je fais - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Les entrées microphone sont à contretemps dans l'enregistrement et le signal diffusé, comparées à ce que vous entendez. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mesurer la latence du trajet aller-retour et entrez-la ci-dessus pour la compensation de latence du microphone afin d'aligner la synchronisation du microphone. - - + Refer to the Mixxx User Manual for details. Se référer au manuel utilisateur de Mixxx pour les détails. - + Configured latency has changed. La latence configurée à changé. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Réinitialisez la latence du trajet aller-retour et entrez-la ci-dessus pour la compensation de latence du microphone afin d'aligner la synchronisation du microphone. - + Realtime scheduling is enabled. La planification en temps réel est activé. - + Main output only Sortie principale seulement - + Main and booth outputs Sorties principale et cabine - + %1 ms %1 ms - + Configuration error Erreur de configuration @@ -7694,131 +7720,131 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos API sonore - + Sample Rate Taux d'échantillonnage - + Audio Buffer Tampon audio - + Engine Clock Moteur de l'horloge - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Utiliser l'horloge de la carte son pour les réglages d'un publique en direct et la plus faible latence.<br>Utiliser l'horloge réseau pour la diffusion sans un publique en direct. - + Main Mix Mix principal - + Main Output Mode Mode Sortie principale - + Microphone Monitor Mode Mode moniteur microphone - + Microphone Latency Compensation Compensation latence du microphone - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Compteur de sous-alimentation du tampon - + 0 0 - + Keylock/Pitch-Bending Engine Moteur de Verrouillage de tonalité/Distorsion de hauteur tonale - + Multi-Soundcard Synchronization Synchronisation de plusieurs cartes-son - + Output Sortie - + Input Entrée - + System Reported Latency Latence indiquée par le système - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Augmentez le tampon audio si le compteur de sous-alimentation augmente ou si des pops se font entendre pendant la lecture. - + Main Output Delay Délai de la sortie principale - + Headphone Output Delay Délai de la sortie casque - + Booth Output Delay Délai de la sortie cabine - + Dual-threaded Stereo Stéréo à double thread - + Hints and Diagnostics Astuces et Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. Diminuez le tampon audio pour améliorer la réactivité de Mixxx. - + Query Devices Interroger périphériques @@ -9378,27 +9404,27 @@ Résulte souvent en de meilleures grilles rythmiques, mais ne marchera pas bien EngineBuffer - + Soundtouch (faster) Soundtouch (plus rapide) - + Rubberband (better) Rubberband (mieux) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (qualité quasi-hi-fi) - + Unknown, using Rubberband (better) Inconnu, utilisation de Rubberband (meilleure) - + Unknown, using Soundtouch Inconnu, utilisant Soundtouch @@ -9613,15 +9639,15 @@ Résulte souvent en de meilleures grilles rythmiques, mais ne marchera pas bien LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Mode sécurisé activé - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9633,57 +9659,57 @@ Shown when VuMeter can not be displayed. Please keep d'OpenGL. - + activate activer - + toggle activer/désactiver - + right droite - + left gauche - + right small droit, petit - + left small gauche, petit - + up haut - + down bas - + up small haut, petit - + down small bas, petit - + Shortcut Raccourci @@ -9691,37 +9717,37 @@ d'OpenGL. Library - + This or a parent directory is already in your library. Ce répertoire ou un répertoire parent est déjà dans votre bibliothèque. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Ce répertoire ou un répertoire listé n'existe pas ou est inaccessible. Abandonner l'opération pour éviter les incohérences de la bibliothèque - - + + This directory can not be read. Ce répertoire ne peut pas être lu. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Une erreur inconnue est survenue. Abandonner l'opération pour éviter les incohérences de la bibliothèque - + Can't add Directory to Library Impossible d'ajouter un répertoire à la bibliothèque - + Could not add <b>%1</b> to your library. %2 @@ -9730,27 +9756,27 @@ Abandonner l'opération pour éviter les incohérences de la bibliothèque< %2 - + Can't remove Directory from Library Impossible de retirer un répertoire à la bibliothèque - + An unknown error occurred. Une erreur inconnue est survenue. - + This directory does not exist or is inaccessible. Ce répertoire n'existe pas ou est inaccessible. - + Relink Directory Reconnecter le répertoire - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9762,22 +9788,22 @@ Abandonner l'opération pour éviter les incohérences de la bibliothèque< LibraryFeature - + Import Playlist Importer une liste de lecture - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Fichiers de liste de lecture (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Remplacer le fichier ? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9931,253 +9957,253 @@ Voulez-vous vraiment l'écraser ? MixxxMainWindow - + Sound Device Busy Carte son occupée - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Réessayer</b> après avoir fermé l'autre application ou avoir reconnecté le périphérique de son - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurer</b> les options audio de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Trouver <b>de l'aide</b> sur le Wiki Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Quitter</b> Mixxx. - + Retry Réessayer - + skin thème - + Allow Mixxx to hide the menu bar? Autoriser Mixxx à masquer la barre de menu ? - + Hide Always show the menu bar? Masquer - + Always show Toujours montrer - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barre de menu Mixxx est masquée et peut être basculée d'une simple pression sur le bouton <b>Alt</b>.<br><br>Clic <b>%1</b> pour accepter.<br><br>Clic <b>%2</b> pour désactiver, par exemple si vous n'utilisez pas Mixxx avec un clavier.<br><br>Vous pouvez modifier ce paramètre à tout moment dans Préférences --> Interface.<br> - + Ask me again Demandez-le moi encore - - + + Reconfigure Reconfigurer - + Help Aide - - + + Exit Quitter - - + + Mixxx was unable to open all the configured sound devices. Mixxx n'est pas parvenu à ouvrir tous les périphériques de son configurés. - + Sound Device Error Erreur de périphérique de son - + <b>Retry</b> after fixing an issue <b>Réessayer</b> après avoir solutionné un problème - + No Output Devices Aucun périphérique de sortie - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx a été configuré sans aucun périphérique de sortie audio. Sans périphérique de sortie configuré, le traitement du son sera désactivé . - + <b>Continue</b> without any outputs. <b>Continuer</b> sans aucune sortie. - + Continue Continuer - + Load track to Deck %1 Charger la piste sur la platine %1 - + Deck %1 is currently playing a track. La platine %1 est en cours de lecture d'une piste. - + Are you sure you want to load a new track? Êtes-vous certain de vouloir charger une nouvelle piste ? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Aucun périphérique d'entrée n'est sélectionné pour ce contrôle vinyle. Veuillez d'abord en sélectionner un dans les Préférences du matériel sonore. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Il n'y a aucun périphérique d'entrée sélectionné pour ce contrôle intermédiaire. Veuillez d'abord en sélectionner un dans les Préférences du matériel sonore. - + There is no input device selected for this microphone. Do you want to select an input device? Aucun périphérique d'entrée n'est sélectionné pour ce microphone. Voulez-vous sélectionner un périphérique d'entrée ? - + There is no input device selected for this auxiliary. Do you want to select an input device? Aucun périphérique d'entrée n'est sélectionné pour cet auxiliaire. Voulez-vous sélectionner un périphérique d'entrée ? - + Scan took %1 - + Le scan a pris %1 - + No changes detected. - + Aucun changement détecté. - - + + %1 tracks in total - + %1 pistes au total - + %1 new tracks found - + %1 nouvelles pistes trouvées - + %1 moved tracks detected - + %1 pistes déplacées détectées - + %1 tracks are missing (%2 total) - + %1 titres sont manquants (%2 au total) - + %1 tracks have been rediscovered - + %1 pistes ont été redécouvertes - + Library scan finished - + Analyse de la bibliothèque terminée - + Error in skin file Erreur dans le fichier du thème - + The selected skin cannot be loaded. Le thème sélectionné ne peut pas être chargé. - + OpenGL Direct Rendering Rendu Direct OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Le rendu direct n'est pas activé sur votre machine.<br><br> Cela signifie que l'affichage de la forme d'onde sera très<br><b>lent et risque de surcharger votre processeur</b>. Mettez à jour votre<br>configuration pour activer le rendu direct ou désactivez<br>les affichages de forme d'onde dans les préférences de Mixxx en sélectionnant<br>"Vide" comme affichage de forme d'onde dans la section "Interface". - - - + + + Confirm Exit Confirmer la fermeture - + A deck is currently playing. Exit Mixxx? Une platine est en cours de lecture. Quitter Mixxx ? - + A sampler is currently playing. Exit Mixxx? Un échantillonneur est en cours de lecture. Quitter Mixxx ? - + The preferences window is still open. La fenêtre de Préférences est déjà ouverte. - + Discard any changes and exit Mixxx? Abandonner toutes les modifications et quitter Mixxx ? @@ -10193,13 +10219,13 @@ Voulez-vous sélectionner un périphérique d'entrée ? PlaylistFeature - + Lock Verrouiller - - + + Playlists Listes de lecture @@ -10209,32 +10235,58 @@ Voulez-vous sélectionner un périphérique d'entrée ? Mélanger la liste de lecture - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Déverrouiller - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Les listes de lectures sont des listes ordonnées de pistes qui vous permettent de planifier vos sessions de mixage. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Il peut être nécessaire de sauter quelques pistes de la liste de lecture que vous avez préparée ou d'ajouter des pistes différentes afin d'entretenir la ferveur de votre public. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Certains DJ préparent des listes de lecture avant leurs performances publiques quand d'autres préfèrent les constituer à la volée. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Lorsque vous utilisez des listes de lecture pendant des sessions de mixage, souvenez-vous de porter une attention toute particulière à la façon dont votre public réagit à la musique que vous avez choisie de jouer. - + Create New Playlist Créer une nouvelle liste de lecture @@ -11894,7 +11946,7 @@ Astuce : compense les voix de "canard" ou "grondante"La quantité d'amplification appliquée au signal audio. À des niveaux plus élevés, l'audio sera plus déformé. - + Passthrough Passerelle @@ -12065,12 +12117,12 @@ du signal d'entrée, des temps de relâchement courts peuvent introduire un divers - + built-in intégré - + missing manquant @@ -12198,54 +12250,54 @@ du signal d'entrée, des temps de relâchement courts peuvent introduire un RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Listes de lecture - + Folders Répertoires - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Lit les bases de données exportées pour les lecteurs Pioneer CDJ / XDJ en utilisant le mode d'exportation Rekordbox.<br/>Rekordbox peut uniquement exporter vers des périphériques USB ou SD avec un système de fichiers FAT ou HFS.<br/>Mixxx peut lire une base de données à partir de n'importe quel périphérique contenant des dossiers de base de données (<tt>PIONEER</tt> et <tt>contenu</tt>).<br/>Ne sont pas prises en charge les bases de données Rekordbox qui ont été déplacées vers un périphérique externe via<br/><i>Préférences> Avancé> Gestion de la base de données</i>.<br/><br/>Les données suivantes sont lues : - + Hot cues Repères rapides - + Loops (only the first loop is currently usable in Mixxx) Boucles (actuellement, seule la première boucle est disponible dans Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Vérifie les périphériques USB/SD Rekordbox connectés (actualise) - + Beatgrids Grilles rythmiques - + Memory cues Repères mémoire - + (loading) Rekordbox (chargement) Rekordbox @@ -15490,47 +15542,47 @@ Cette opération est irréversible ! WCueMenuPopup - + Cue number Numéro de repère - + Cue position Position du repère - + Edit cue label Modifie l'étiquette du repère - + Label... Etiquette... - + Delete this cue Supprimer ce repère - + Toggle this cue type between normal cue and saved loop Activer/désactiver ce type de repère entre le repère normal et la boucle enregistrée - + Left-click: Use the old size or the current beatloop size as the loop size Clic-gauche : utiliser l'ancienne taille ou la taille actuelle de boucle de battement comme taille de boucle - + Right-click: Use the current play position as loop end if it is after the cue Clic-droit : utiliser la position de lecture actuelle comme sortie de boucle si elle se situe après le repère - + Hotcue #%1 Repère rapide #%1 @@ -15655,323 +15707,353 @@ Cette opération est irréversible ! + Search in Current View... + Rechercher dans la vue actuelle... + + + + Search for tracks in the current library view + Rechercher des pistes dans la vue actuelle de la bibliothèque + + + + Ctrl+f + Ctrl+f + + + + Search in Tracks Library... + Recherche dans la bibliothèque des pistes... + + + + Search in the internal track collection under "Tracks" in the library + Rechercher dans la collection de pistes interne comme "Pistes" dans la bibliothèque + + + + Ctrl+Shift+F + Ctrl+Shift+F + + + Create &New Playlist Créer une &nouvelle liste de lecture - + Create a new playlist Créer une nouvelle liste de lecture - + Ctrl+n Ctrl+n - + Create New &Crate &Créer un nouveau bac - + Create a new crate Créer un nouveau bac - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Affichage - + Auto-hide menu bar Masquer automatiquement la barre de menu - + Auto-hide the main menu bar when it's not used. Masquer automatiquement la barre de menu principale lorsqu'elle n'est pas utilisée. - + May not be supported on all skins. Peut-être pas supporté sur tous les thèmes - + Show Skin Settings Menu Afficher le menu de réglage du thème - + Show the Skin Settings Menu of the currently selected Skin Afficher le menu paramètres de Thème du thème actuellement sélectionnée - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Afficher la section microphone - + Show the microphone section of the Mixxx interface. Afficher la section microphone de l'interface Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Afficher la section de contrôle des vinyles - + Show the vinyl control section of the Mixxx interface. Afficher la section de contrôle des vinyles de l'interface Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Afficher la platine de pré-écoute - + Show the preview deck in the Mixxx interface. Afficher la platine de pré-écoute dans l'interface de Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Afficher la pochette d'album - + Show cover art in the Mixxx interface. Afficher la pochette d'album dans l'interface Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximiser la bibliothèque - + Maximize the track library to take up all the available screen space. Maximise la bibliothèque de pistes pour occuper tout l'espace d'écran disponible - + Space Menubar|View|Maximize Library Espace - + &Full Screen Plein &écran - + Display Mixxx using the full screen Afficher Mixxx en plein écran - + &Options &Options - + &Vinyl Control Contrôle &Vinyle - + Use timecoded vinyls on external turntables to control Mixxx Utiliser des disques vinyles avec timecode sur un tourne-disque externe pour contrôler Mixxx - + Enable Vinyl Control &%1 Activer le Contrôle Vinyle &%1 - + &Record Mix &Enregistrer le Mix - + Record your mix to a file Enregistrer votre mix dans un fichier - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activer la Diffusion en Direct (&Broadcast) - + Stream your mixes to a shoutcast or icecast server Diffuser vos mixages via un serveur shoutcast ou icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activer les Raccourcis Clavier (&K) - + Toggles keyboard shortcuts on or off Active/désactive les raccourcis claviers - + Ctrl+` Ctrl+` - + &Preferences &Préférences - + Change Mixxx settings (e.g. playback, MIDI, controls) Modifier les paramètres de Mixxx (par ex. lecture, MIDI, contrôleurs) - + &Developer &Développeur - + &Reload Skin &Recharger le thème - + Reload the skin Recharger le thème - + Ctrl+Shift+R Ctrl+Maj+R - + Developer &Tools Ou&Tils de développement - + Opens the developer tools dialog Ouvre le panneau d'outils de dévelopement - + Ctrl+Shift+T Ctrl+Maj+T - + Stats: &Experiment Bucket Statistiques : Paquet &Expérimental - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Active le mode expérimental. Collecte des statistiques dans le paquet de suivi EXPERIMENTAL. - + Ctrl+Shift+E Ctrl+Maj+E - + Stats: &Base Bucket Statistiques : Paquet de &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Active le mode basique. Collecte des statistiques dans le paquet de suivi BASIQUE. - + Ctrl+Shift+B Ctrl+Maj+B - + Deb&ugger Enabled Débogueur activé (&U) - + Enables the debugger during skin parsing Active le debogueur pendant l'analyse syntaxique des apparences - + Ctrl+Shift+D Ctrl+Maj+D - + &Help &Aide - + Show Keywheel menu title Afficher la roue de tonalités @@ -15988,74 +16070,74 @@ Cette opération est irréversible ! Exporter la bibliothèque au format Engine DJ - + Show keywheel tooltip text Afficher la roue de tonalités - + F12 Menubar|View|Show Keywheel F12 - + &Community Support Support &communautaire - + Get help with Mixxx Obtenir de l'aide sur Mixxx - + &User Manual &Manuel utilisateur - + Read the Mixxx user manual. Lire le manuel utilisateur de Mixxx - + &Keyboard Shortcuts &Raccourcis clavier - + Speed up your workflow with keyboard shortcuts. Gagnez en rapidité avec les raccourcis clavier. - + &Settings directory Répertoire des paramètres - + Open the Mixxx user settings directory. Ouvrez le répertoire des paramètres utilisateur Mixxx. - + &Translate This Application &Traduire cette application - + Help translate this application into your language. Aidez à traduire cette application dans votre langage. - + &About À &propos - + About the application A propos de l'application @@ -16090,25 +16172,13 @@ Cette opération est irréversible ! WSearchLineEdit - - Clear input - Clear the search bar input field - Efface la saisie - - - - Ctrl+F - Search|Focus - CTRL+F - - - + Search noun Rechercher - + Clear input Efface la saisie @@ -16119,93 +16189,87 @@ Cette opération est irréversible ! Rechercher... - + Clear the search bar input field Effacer le champ de saisie de la barre de recherche - - Enter a string to search for - Entrer un élément à rechercher + + Return + Retour arrière - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Utilisez des opérateurs tels que bpm: 115-128, artiste: BooFar, -year: 1990 + + Enter a string to search for. + Entrer une chaîne à rechercher. - - For more information see User Manual > Mixxx Library - Pour plus d'informations, voir Manuel de l'utilisateur> Bibliothèque Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + Utiliser des opérateurs comme bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Raccourci + See User Manual > Mixxx Library for more information. + Voir le manuel d’utilisation > Bibliothèque Mixxx pour plus d’informations. - - Ctrl+F - CTRL+F + + Focus/Select All (Search in current view) + Give search bar input focus + Focus/Sélectionner tout (Rechercher dans la vue actuelle) - - Focus - Give search bar input focus - Focus + + Focus/Select All (Search in 'Tracks' library view) + Focus/Sélectionner tout (Rechercher dans la vue bibliothèques des 'Pistes') - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + Raccourcis supplémentaires lorsque focalisé : - Shortcuts - Raccourcis + Trigger search before search-as-you-type timeout or focus tracks view afterwards + Déclenche la recherche avant l'expiration du délai de recherche au-fur-et-à-mesure-de-la-frappe ou passe ensuite à l'affichage des pistes - Return - Retour arrière + Esc or Ctrl+Return + Echap ou Ctrl+Retour arrière - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Déclenche la recherche avant l'expiration du délai de recherche au-fur-et-à-mesure-de-la-frappe ou passe ensuite à l'affichage des pistes + Immediately trigger search and focus tracks view + Exit search bar and leave focus + Activer immédiatement la recherche et le focus sur les pistes - + Ctrl+Space Ctrl + Espace - + Toggle search history Shows/hides the search history entries Activer/désactiver l'historique de recherche - + Delete or Backspace Supprimer ou Retour arrière - - Delete query from history - Supprimer la requête de l'historique + + in search history + dans l'historique de recherche - - Esc - Echap - - - - Exit search - Exit search bar and leave focus - Quitte la recherche + + Delete query from history + Supprimer la requête de l'historique @@ -16331,12 +16395,12 @@ Cette opération est irréversible ! Adjust BPM - Ajuster le BPM + BPM ajustement Select Color - Sélectionner la couleur + Couleur sélection @@ -16961,37 +17025,37 @@ Cette opération est irréversible ! WTrackTableView - + Confirm track hide Confirmer le masquage de la piste - + Are you sure you want to hide the selected tracks? Êtes-vous certain de vouloir masquer les pistes sélectionnées ? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Êtes-vous sûr de vouloir supprimer les pistes sélectionnées de la file d'attente AutoDJ ? - + Are you sure you want to remove the selected tracks from this crate? Êtes-vous sûr de vouloir supprimer les pistes sélectionnées de ce bac ? - + Are you sure you want to remove the selected tracks from this playlist? Êtes-vous sûr de vouloir supprimer les pistes sélectionnées de cette liste de lecture ? - + Don't ask again during this session Ne demandez plus pendant cette session - + Confirm track removal Confirmer la suppression de la piste @@ -17012,52 +17076,52 @@ Cette opération est irréversible ! mixxx::CoreServices - + fonts polices - + database base de données - + effects effets - + audio interface interface audio - + decks platines - + library bibliothèque - + Choose music library directory Choisissez le répertoire de la bibliothèque musicale - + controllers contrôleurs - + Cannot open database Ne peux ouvrir la base de données - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17070,68 +17134,78 @@ Cliquez sur OK pour sortir. mixxx::DlgLibraryExport - + Entire music library Bibliothèque musicale entière - - Selected crates - Bacs sélectionnés + + Crates + + + + + Playlists + + + + + Selected crates/playlists + - + Browse Parcourir - + Export directory Exporter le répertoire - + Database version Version de la base de données - + Export Exporter - + Cancel Annuler - + Export Library to Engine DJ "Engine DJ" must not be translated Exporter la bibliothèque vers Engine DJ - + Export Library To Exporter la bibliothèque vers - + No Export Directory Chosen Aucun répertoire d'exportation choisi - + No export directory was chosen. Please choose a directory in order to export the music library. Aucun répertoire d'exportation n'a été choisi. Veuillez choisir un répertoire afin d'exporter la bibliothèque musicale. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Une base de données existe déjà dans le répertoire choisi. Les pistes exportées seront ajoutées à cette base de données. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Une base de données existe déjà dans le répertoire choisi, mais un problème est survenu lors de son chargement. Dans cette situation, l’exportation n’est pas garantie de réussir. @@ -17152,7 +17226,7 @@ Cliquez sur OK pour sortir. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17163,22 +17237,22 @@ Cliquez sur OK pour sortir. mixxx::LibraryExporter - + Export Completed Exportation terminée - - Exported %1 track(s) and %2 crate(s). - %1 piste(s) et %2 bac(s) ont été exportées. + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Échec de l'exportation - + Exporting to Engine DJ... Exportation en cours vers Engine DJ... diff --git a/res/translations/mixxx_gl.qm b/res/translations/mixxx_gl.qm index 7c3d681a02f73d32eefe32c7254ecb12e35eba16..140e8c292439d8adbdcf245855505fc5b77a1b41 100644 GIT binary patch delta 568 zcmXBQTS(Jk9LDkYefm3cTd7m$A)PhXu=&?U*(w+Y5#~sYC?-T|geXRJQ6dB#E?fmQ zEc)%_w*Pbo*M*0OH;`yVgjj)BDTQIXX>^m_nAnX(YrFc~JU8EG zC+NM93v3+pi277!gg%j5)ep~_*iad=qZv`Q{W@q=-J(vc@C)Zx7-F0j)lLMy2$Mz+ z#6Af7jx-P%rkdh3B5!G{coZHpxl5XLAw>!}QVf$(Y3!OeYcDO9*bu%?lCF^s>!vXI zoiaKf#(vSQ(gAK1nbLlan3FonZHRfvRo;X6W6G2tE7TV#$8TpdMoHFxhHssuicR>O zv{lgz-$Rls+u(_dp~{^ci7s+g^&t9=GF3?^-^g8UgYS))ufEHZng*;wx>`M~uov z_3QSVj7f*`7T(KiJ(3fFQ{ts*lVf5~Oq*MQ@g-Vo=tS5q?ECI;gkMq0vH*XOT#bJb zUllI7lOs4HmYW>B=c7&& U>->&+obwO=;D)*1^Wdfb0N}I8R{#J2 delta 677 zcmZ9IPe{{o7{tsgg2RhFD>Eh-t-2twzD71hGs|3L+$W zxBdLLO}9A@l^WkjDi6UzvIZTBD2N5oCGb)WyH(SmgD<>%E)O4go?j1gQVThEO8Mc3 zx)omKJHptZDC7Fu|JY?^?68rsx2jEI(n2!qmbVcDjgkc>h5s01$5$Dqo5+cI1oMP0 zW1hqRk`l5`c%wp}Y31xO0 zuubTzaykD@mg*R0mgrM;5W&6V(U)VqR!r&FIc99aTeAk4lYp`WB`NMa6@YUse+h_v_` z^}}xSO}CjZxy|@-x3rn{GZ%9*1G8nb^vO5Ax!>h9*rcI2v~^0hC8F#&cgE%D^Vlvs o2HacYDmiOmZsz#!%4l&rHbs&njsfXL7OJI@IMhoY;;1P63toNSuK)l5 diff --git a/res/translations/mixxx_gl.ts b/res/translations/mixxx_gl.ts index 26c7c60391a9..c7969a61a090 100644 --- a/res/translations/mixxx_gl.ts +++ b/res/translations/mixxx_gl.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Retirar caixa como orixe da pista - + Auto DJ DJ automático - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Engadir caixa como orixe da pista @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nova lista de reprodución @@ -160,7 +160,7 @@ - + Create New Playlist Crear unha nova lista de reprodución @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar unha lista de reprodución - + Export Track Files Exportar pistas a ficheiros - + Analyze entire Playlist Analizar toda a lista d reprodución - + Enter new name for playlist: Escriba o novo nome para a lista de reprodución - + Duplicate Playlist Duplicar a lista de reprodución - - + + Enter name for new playlist: Escriba o nome para a nova lista de reprodución - - + + Export Playlist Exportar a lista de reprodución - + Add to Auto DJ Queue (replace) Engadir á cola do DJ automático (trocar) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Cambiar o nome da lista de reprodución - - + + Renaming Playlist Failed Produciuse un erro ao cambiarlle o nome a lista de reprodución - - - + + + A playlist by that name already exists. Xa existe unha lista de reprodución con ese nome. - - - + + + A playlist cannot have a blank name. Unha lista de reprodución non pode ter un nome baleiro. - + _copy //: Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Non foi posíbel crear a lista de reprodución - - + + An unknown error occurred while creating playlist: Produciuse un erro descoñecido mentres se creaba a lista de reprodución: - + Confirm Deletion Confimar o borrado - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) Lista de reprodución M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reprodución M3U (*.m3u);;Lista de reprodución M3U8 (*.m3u8);;Lista de reprodución PLS (*.pls);;Texto CSV (*.csv);;Texto lexíbel (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # Num. - + Timestamp Marca de tempo @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Non foi posíbel cargar a pista. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Álbum - + Album Artist Interprete do álbum - + Artist Interprete - + Bitrate Taxa de bits - + BPM BPM - + Channels Canles - + Color Cor - + Comment Comentario - + Composer Compositor - + Cover Art Deseño da portada - + Date Added Data de engadido - + Last Played Último reproducido - + Duration Duración - + Type Tipo - + Genre Xénero - + Grouping Agrupación - + Key Clave - + Location Localización - + + Overview + + + + Preview Escoita previa - + Rating Cualificación - + ReplayGain ReplayGain - + Samplerate - + Played Reproducidas - + Title Título - + Track # Pista num. - + Year Ano - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Engadir a ligazóns rápidas - + Remove from Quick Links Retirar de ligazóns rápidas - + Add to Library Engadir a fonoteca - + Refresh directory tree - + Quick Links Ligazóns rápidas - - + + Devices Dispositivos - + Removable Devices Dispositivos extraíbeis - - + + Computer Computador - + Music Directory Added Engadido o directorio de música - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Engadiu un ou máis directorios de música. As pistas destes directorios non estarán dispoñíbeis ata que volva a examinar a fonoteca. Quere examinala agora? - + Scan Examinar - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. «Computador» permítelle navegar, ver, e cargar pistas desde cartafoles no disco ríxido e nos dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1046,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Estabelecer o volume no máximo - + Set to zero volume Estabelecer o volume a cero @@ -1077,13 +1099,13 @@ trace - Above + Profiling messages Botón de desprazamento inverso (Censor) - + Headphone listen button Botón de escoita por auriculares - + Mute button Botón de silencio @@ -1094,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Orientación da mestura (p-ex. esquerda, dereita, centro) - + Set mix orientation to left Estabelecer a orientación da mestura cara a esquerda - + Set mix orientation to center Estabelecer a orientación da mestura no centro - + Set mix orientation to right Estabelecer a orientación da mestura cara a dereita @@ -1153,22 +1175,22 @@ trace - Above + Profiling messages Botón de toque de BPM - + Toggle quantize mode Conmutador do modo de cuantización - + One-time beat sync (tempo only) Sincronizar só unha vez o golpe (só o tempo) - + One-time beat sync (phase only) Sincronizar só unha vez o golpe (só a fase) - + Toggle keylock mode Conmutador do modo de bloqueo tonal @@ -1178,193 +1200,193 @@ trace - Above + Profiling messages Ecualizadores - + Vinyl Control Control do vinilo - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Conmutador do modo de punto de referencia do control de vinilo (APAGADO/UNHA/ACTIVO) - + Toggle vinyl-control mode (ABS/REL/CONST) Conmutador do Control do vinilo (ABS/REL/CONST) - + Pass through external audio into the internal mixer Enviar o son externo ao mesturador interno - + Cues Referencias - + Cue button Botón de punto de referencia - + Set cue point Estabelecer o punto de referencia - + Go to cue point Ir o punto de referencia - + Go to cue point and play Ir o punto de referencia e reproducir - + Go to cue point and stop Ir o punto de referencia e deter - + Preview from cue point Escoita previa do punto de referencia - + Cue button (CDJ mode) Botón de punto de referencia (modo CDJ) - + Stutter cue Referencia repetida (tatexo) - + Hotcues Referencias activas - + Set, preview from or jump to hotcue %1 Estabelecer, preescoitar ou ir á referencia activa %1 - + Clear hotcue %1 Limpar a referencia activa %1 - + Set hotcue %1 Estabelecer a referencia activa %1 - + Jump to hotcue %1 Saltar á referencia activa %1 - + Jump to hotcue %1 and stop Saltar á referencia activa %1 e deter - + Jump to hotcue %1 and play Saltar á referencia activa %1 e reproducir - + Preview from hotcue %1 Escoita previa desde a referencia activa %1 - - + + Hotcue %1 Referencia activa %1 - + Looping Repetición en bucle - + Loop In button Botón para o comezo do bucle - + Loop Out button Botón para a fin do bucle - + Loop Exit button Botón de saída do bucle - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Mover o bucle cara diante en %1 golpes - + Move loop backward by %1 beats Mover o bucle cara atrás en %1 golpes - + Create %1-beat loop Crear un bucle de %1 golpes - + Create temporary %1-beat loop roll Crear un bucle temporal constante de %1 golpes @@ -1480,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader Control de volume - + Full Volume Volume máximo - + Zero Volume Volume cero @@ -1509,7 +1531,7 @@ trace - Above + Profiling messages - + Mute Silenciar @@ -1520,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen Escoita por auriculares @@ -1541,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation Orientación - + Orient Left Orientar cara a esquerda - + Orient Center Orientar ao centro - + Orient Right Orientar cara a dereita @@ -1629,82 +1651,82 @@ trace - Above + Profiling messages Axustar a grella do ritmo cara a dereita - + Adjust Beatgrid Axustar a grella do ritmo - + Align beatgrid to current position Aliñar a grella do ritmo á posición actual - + Adjust Beatgrid - Match Alignment Axustar a grella do ritmo, deixala aliñada - + Adjust beatgrid to match another playing deck. Axustar a grella do ritmo para que coincida co outro prato en reprodución - + Quantize Mode Modo de cuantización - + Sync Sincronizar - + Beat Sync One-Shot Sincroniza o ritmo ao premer - + Sync Tempo One-Shot Sincroniza o tempo ao premer - + Sync Phase One-Shot Sincroniza a fase ao premer - + Pitch control (does not affect tempo), center is original pitch Control de ton (non afecta ao tempo), no centro está o ton orixinal - + Pitch Adjust Axuste de ton - + Adjust pitch from speed slider pitch Axuste o ton dende o esvarador de ton - + Match musical key Coincidir coa clave musical - + Match Key Coincidir coa clave - + Reset Key Restabelecer a clave - + Resets key to original Restabelecer a clave á orixinal @@ -1745,451 +1767,451 @@ trace - Above + Profiling messages EQ graves - + Toggle Vinyl Control Conmutador do Control do vinilo - + Toggle Vinyl Control (ON/OFF) Conmutador do Control do vinilo (acendido/apagado) - + Vinyl Control Mode Modo do Control do vinilo - + Vinyl Control Cueing Mode Modo de Control dos puntos de referencia con vinilo - + Vinyl Control Passthrough Paso do son de entrada do Control do vinilo - + Vinyl Control Next Deck Control do vinilo ao seguinte prato - + Single deck mode - Switch vinyl control to next deck Modo de prato único - Pasar o control do vinilo para o seguinte prato - + Cue Referencia - + Set Cue Estabelecer a referencia - + Go-To Cue Ir á referencia - + Go-To Cue And Play Ir á e reproducir - + Go-To Cue And Stop Ir á referencia e deter - + Preview Cue Escoita previa do punto de referencia - + Cue (CDJ Mode) Punto de referencia (modo CDJ) - + Stutter Cue Referencia repetida (tatexo) - + Go to cue point and play after release Ir á referencia e reproducir após soltar - + Clear Hotcue %1 Limpar a referencia activa %1 - + Set Hotcue %1 Estabelecer a referencia activa %1 - + Jump To Hotcue %1 Saltar á referencia activa %1 - + Jump To Hotcue %1 And Stop Saltar á referencia activa %1 e deter - + Jump To Hotcue %1 And Play Saltar á referencia activa %1 e reproducir - + Preview Hotcue %1 Escoita previa da referencia activa %1 - + Loop In Inicio do bucle - + Loop Out Fin do bucle - + Loop Exit Saír do bucle - + Reloop/Exit Loop Repetir/saír do bucle - + Loop Halve Divide o bucle á metade - + Loop Double Duplica a lonxitude do bucle - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Mover o bucle +%1 golpes - + Move Loop -%1 Beats Mover o bucle -%1 golpes - + Loop %1 Beats Bucle de %1 golpes - + Loop Roll %1 Beats Bucle corredizo de %1 golpes - + Add to Auto DJ Queue (bottom) Engadir á cola de DJ automático (abaixo) - + Append the selected track to the Auto DJ Queue Engade as pistas seleccionadas na fin da cola de Auto DJ - + Add to Auto DJ Queue (top) Engadir á cola de DJ automático (arriba) - + Prepend selected track to the Auto DJ Queue Engade as pistas seleccionadas no principio da cola de Auto DJ - + Load Track Cargara pista - + Load selected track Cargar a pista seleccionada - + Load selected track and play Cargar a pista seleccionada e reproducila - - + + Record Mix Gravar a mestura - + Toggle mix recording Conmutador da gravación da mestura - + Effects Efectos - + Quick Effects Efectos rápidos - + Deck %1 Quick Effect Super Knob Súper mando de efecto rápido do prato %1 - + Quick Effect Super Knob (control linked effect parameters) Súper mando de efecto rápido (parámetros de efecto asociado ao control) - - + + Quick Effect Efecto rápido - + Clear Unit Limpar a unidade - + Clear effect unit Limpar a unidade de efectos - + Toggle Unit Conmutador da unidade - + Dry/Wet Directo/Procesado - + Adjust the balance between the original (dry) and processed (wet) signal. Axusta o equilibrio entre o sinal orixinal (dry) e o procesado (wet). - + Super Knob Súper mando - + Next Chain Seguinte cadea - + Assign Asignar - + Clear Limpar - + Clear the current effect Limpar o efecto actual - + Toggle Conmutar - + Toggle the current effect Conmutador do efecto actual - + Next Seguinte - + Switch to next effect Pasa ao efecto seguinte - + Previous Anterior - + Switch to the previous effect Pasa ao efecto anterior - + Next or Previous Seguinte ou anterior - + Switch to either next or previous effect Pasa ao anterior ou seguinte efecto - - + + Parameter Value Valor do parámetro - - + + Microphone Ducking Strength Intensidade da atenuación do micrófono - + Microphone Ducking Mode Modo de atenuación do micrófono - + Gain Ganancia - + Gain knob Mando da ganancia - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Conmutador do DJ automático - + Toggle Auto DJ On/Off Conmutador do DJ automático acender/apagar - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Maximiza/Restaura a vista da fonoteca - + Maximize the track library to take up all the available screen space. Maximiza ou restaura a vista da fonoteca per abarcar toda a pantalla - + Effect Rack Show/Hide Amosar/agachar a caixa de efectos - + Show/hide the effect rack Amosar/agachar a caixa de efectos - + Waveform Zoom Out Afastar o zoom da forma da onda @@ -2204,102 +2226,102 @@ trace - Above + Profiling messages Ganancia dos auriculares - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Velocidade de reprodución - + Playback speed control (Vinyl "Pitch" slider) Control de velocidade de reprodución (O ton do vinilo) - + Pitch (Musical key) Ton (clave musical) - + Increase Speed Incrementar a velocidade - + Adjust speed faster (coarse) Axuste da velocidade rápida (basto) - + Increase Speed (Fine) Incrementar a velocidade (fino) - + Adjust speed faster (fine) Axuste da velocidade rápida (fino) - + Decrease Speed Diminuir a velocidade - + Adjust speed slower (coarse) Axuste da velocidade lenta (basto) - + Adjust speed slower (fine) Axuste da velocidade lenta (fino) - + Temporarily Increase Speed Incremento temporal da velocidade - + Temporarily increase speed (coarse) Incremento temporal da velocidade (basto) - + Temporarily Increase Speed (Fine) Incremento temporal da velocidade (fino) - + Temporarily increase speed (fine) Incremento temporal da velocidade (fino) - + Temporarily Decrease Speed Diminución temporal da velocidade - + Temporarily decrease speed (coarse) Diminución temporal da velocidade (basto) - + Temporarily Decrease Speed (Fine) Diminución temporal da velocidade (fino) - + Temporarily decrease speed (fine) Diminución temporal da velocidade (fino) @@ -2451,1053 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock Bloqueo tonal - + CUP (Cue + Play) CUP (Punto de referencia + Reproducir) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up Mover cara arriba - + Equivalent to pressing the UP key on the keyboard Equivalente a premer la tecla frecha ARRIBA no teclado - + Move down Mover cara abaixo - + Equivalent to pressing the DOWN key on the keyboard Equivalente a premer la tecla frecha ABAIXO no teclado - + Move up/down Mover cara arriba/abaixo - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Mover verticalmente en calquera dirección usando un mando, como se se premeran as teclas frecha ARRIBA/ABAIXO - + Scroll Up Páxina arriba - + Equivalent to pressing the PAGE UP key on the keyboard Equivalente a premer a tecla de páxina arriba (RePáx) no teclado - + Scroll Down Páxina abaixo - + Equivalent to pressing the PAGE DOWN key on the keyboard Equivalente a premer a tecla de páxina abaixo (AvPáx) no teclado - + Scroll up/down Páxina arriba/abaixo - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Mover verticalmente en calquera dirección usando un mando, como se se premeran as teclas de avance/retroceso de páxina (RePáx/AvPáx) - + Move left Mover cara a esquerda - + Equivalent to pressing the LEFT key on the keyboard Equivalente a premer la tecla frecha ESQUERDA no teclado - + Move right Mover cara a dereita - + Equivalent to pressing the RIGHT key on the keyboard Equivalente a premer la tecla frecha DEREITA no teclado - + Move left/right Mover cara a esquerda/dereita - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Mover verticalmente en calquera dirección usando un mando, como se se premeran as teclas frecha ESQUERDA/DEREITA - + Move focus to right pane Mover o foco para o panel dereito - + Equivalent to pressing the TAB key on the keyboard Equivalente a premer la tecla TABULADOR no teclado - + Move focus to left pane Mover o foco para o panel esquerdo - + Equivalent to pressing the SHIFT+TAB key on the keyboard Equivalente a premer as teclas MAIÚS+ TABULADOR no teclado - + Move focus to right/left pane Mover o foco para o panel esquerdo/dereito - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Mover o foco para o panel esquerdo ou dereito usando un mando, como se se premera TABULADOR/MAIÚS+TABULADOR - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) Engadir á cola do DJ automático (trocar) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing Activar ou desactivar o procesado de efectos - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset Seguinte axuste previo de cadea - + Previous Chain Cadea anterior - + Previous chain preset Anterior axuste previo de cadea - + Next/Previous Chain Cadea seguinte/anterior - + Next or previous chain preset Seguinte ou anterior axuste previo de cadea - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary Micrófono / Auxiliar - + Microphone On/Off Micrófono acender/apagar - + Microphone on/off Micrófono acender/apagar - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Conmutador do modo de atenuación de micrófono (APAGADO, AUTO, MANUAL) - + Auxiliary On/Off Auxiliar acender/apagar - + Auxiliary on/off Auxiliar acender/apagar - + Auto DJ DJ automático - + Auto DJ Shuffle DJ automático ao chou - + Auto DJ Skip Next Omitir a seguinte no DJ automático - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Esvaecer para a seguinte no DJ automático - + Trigger the transition to the next track Disparar a transición á pista seguinte - + User Interface Interface de usuario - + Samplers Show/Hide Amosar/agachar o reprodutor de mostras - + Show/hide the sampler section Amosar/agachar a sección do reprodutor de mostras - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Amosar/agochar o Control do vinilo - + Show/hide the vinyl control section Amosar/agachar a sección do Control do vinilo - + Preview Deck Show/Hide Amosar/agochar a escoita previa do prato - + Show/hide the preview deck Amosar/agachar a escoita previa do prato - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Amosar/agachar o trebello do vinilo xiratorio - + Show/hide spinning vinyl widget Amosar/agachar o trebello do vinilo xiratorio - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Zoom da forma da onda - + Waveform Zoom Zoom da forma da onda - + Zoom waveform in Achegar o zoom da forma da onda - + Waveform Zoom In Achegar o zoom da forma da onda - + Zoom waveform out Afastar o zoom da forma da onda - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3612,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Tente recuperar reiniciando a controladora. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. É necesario arranxar o código do script @@ -3745,7 +3777,7 @@ trace - Above + Profiling messages Importar un caixón - + Export Crate Exportar un caixón @@ -3755,7 +3787,7 @@ trace - Above + Profiling messages Desbloquear - + An unknown error occurred while creating crate: Produciuse un erro descoñecido ao crear o caixón: @@ -3764,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate Cambiar o nome do caixón - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3787,17 +3813,17 @@ trace - Above + Profiling messages Non foi posíbel cambiarlle o nome ao caixón - + Crate Creation Failed Non foi posíbel crear o caixón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reprodución M3U (*.m3u);;Lista de reprodución M3U8 (*.m3u8);;Lista de reprodución PLS (*.pls);;Texto CSV (*.csv);;Texto lexíbel (*.txt) - + M3U Playlist (*.m3u) Lista de reprodución M3U (*.m3u) @@ -3806,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Os caixóns son un xeito excelente de axudarlle a organizar a música que quere mesturar. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3917,12 +3949,12 @@ trace - Above + Profiling messages Colaboradores anteriores - + Official Website - + Donate @@ -4434,37 +4466,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Se non funciona a asignación, probe a activar un dos controles avanzados seguintes e probe de novo. Tamén pode volver detectar o control. - + Didn't get any midi messages. Please try again. Non se detectou ningunha mensaxe MIDI. Tenteo de novo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Non é posíbel detectar unha asignación -- Tenteo de novo. Asegúrese de tocar só un control de vez. - + Successfully mapped control: Control asignado correctamente: - + <i>Ready to learn %1</i> <i>Preparado para aprender sobre %1</i> - + Learning: %1. Now move a control on your controller. Aprendendor: %1. Agora mova un control do seu controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4503,17 +4535,17 @@ You tried to learn: %1,%2 Envorcar a csv - + Log Rexistro - + Search Buscar - + Stats Estatísticas @@ -5166,114 +5198,114 @@ associated with each key. DlgPrefController - + Apply device settings? Aplicar os axustes do dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Deben aplicarse os axustes antes de iniciar o asistente de aprendizaxe. Aplicar os axustes e continuar? - + None Ningún - + %1 by %2 %1 de %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Solución de problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Limpar as asignacións de entrada - + Are you sure you want to clear all input mappings? Confirma que quere limpar todas as asignacións de entrada? - + Clear Output Mappings Limpar as asignacións de saída - + Are you sure you want to clear all output mappings? Confirma que quere limpar todas as asignacións de saída? @@ -5291,100 +5323,100 @@ Aplicar os axustes e continuar? Activado - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Descrición: - + Support: Asistencia: - + Screens preview - + Input Mappings Asignacións de entrada - - + + Search Buscar - - + + Add Engadir - - + + Remove Retirar @@ -5404,17 +5436,17 @@ Aplicar os axustes e continuar? - + Mapping Info - + Author: Autor: - + Name: Nome: @@ -5424,28 +5456,28 @@ Aplicar os axustes e continuar? Asistente de aprendizaxe (só MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Limpar todo - + Output Mappings Asignacións de saída @@ -5604,6 +5636,16 @@ Aplicar os axustes e continuar? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6195,62 +6237,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. O tamaño mínimo do tema seleccionado é maior que a resolución da súa pantalla. - + Allow screensaver to run Permitir que se execute o protector de pantallas - + Prevent screensaver from running Impide que se execute o protector de pantallas - + Prevent screensaver while playing Impide que se execute o protector de pantallas durante a reprodución - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Este tema non admite esquemas de cor - + Information Información - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7417,173 +7459,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Predeterminado (máis retardado) - + Experimental (no delay) Experimental (sen retardo) - + Disabled (short delay) Desactivado (pouco retardo) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled Desactivado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. A planificación en tempo real está activada. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Produciuse un erro de configuración @@ -7601,131 +7642,131 @@ The loudness target is approximate and assumes track pregain and main output lev API de son - + Sample Rate Taxa de mostraxe - + Audio Buffer Búfer de son - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contador de desbordamento do búfer - + 0 0 - + Keylock/Pitch-Bending Engine Motor de bloqueo tonal/pregado do ton - + Multi-Soundcard Synchronization Sincronización con múltiples tarxetas de son - + Output Saída - + Input Entrada - + System Reported Latency Latencia informada polo sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente búfer de son se o contador de desbordamento está aumentando ou escoita chascar durante a reprodución. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Consellos e diagnósticos - + Downsize your audio buffer to improve Mixxx's responsiveness. Reduza u búfer de son para mellorar a velocidade de resposta do Mixxx. - + Query Devices Consulta a dispositivos @@ -8171,47 +8212,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Hardware de son - + Controllers Controladores - + Library Fonoteca - + Interface Interface - + Waveforms Formas de onda - + Mixer Mesturador - + Auto DJ DJ automático - + Decks - + Colors @@ -8246,47 +8287,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efectos - + Recording Gravando - + Beat Detection Detección de ritmo - + Key Detection Detección de clave musical - + Normalization Normalización - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Control do vinilo - + Live Broadcasting Difusión en directo - + Modplug Decoder Descodificador do Modplug @@ -8642,284 +8683,284 @@ This can not be undone! Resumo - + Filetype: Tipo de ficheiro: - + BPM: BPM: - + Location: Localización: - + Bitrate: Taxa de bits: - + Comments Comentarios - + BPM BPM - + Sets the BPM to 75% of the current value. Estabelece os BPM ao 75% do valor detectado. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Estabelece os BPM ao 50% do valor actual. - + Displays the BPM of the selected track. Amosar os BPM da pista seleccionada. - + Track # Pista num. - + Album Artist Interprete do álbum - + Composer Compositor - + Title Título - + Grouping Agrupación - + Key Clave - + Year Ano - + Artist Interprete - + Album Álbum - + Genre Xénero - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. Estabelece os BPM ao 200% do valor actual. - + Double BPM Duplicar os BPM - + Halve BPM Dividir ÷2 os BPM - + Clear BPM and Beatgrid Limpar os BPM e a grella de ritmo - + Move to the previous item. "Previous" button Mover ao elemento anterior - + &Previous &Anterior - + Move to the next item. "Next" button Mover ao seguinte elemento - + &Next &Seguinte - + Duration: Duración: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color Cor - + Date added: - + Open in File Browser Abrir no navegador de ficheiros - + Samplerate: - + Track BPM: BPM da pista: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo Asumir tempo constante - + Sets the BPM to 66% of the current value. Estabelece os BPM ao 66% do valor actual. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. Estabelece os BPM ao 150% do valor actual. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. Estabelece os BPM ao 133% do valor actual. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Golpee seguindo o ritmo para estabelecer os BPM. - + Tap to Beat Toque para golpe de ritmo - + Hint: Use the Library Analyze view to run BPM detection. Consello: Use a vista de análise na fototeca para executar a detección de BPM. - + Save changes and close the window. "OK" button Gardar os cambios e pechar a xanela. - + &OK &Aceptar - + Discard changes and close the window. "Cancel" button Desbotar os cambios e pechar a xanela. - + Save changes and keep the window open. "Apply" button Gardar os cambios e manter a xanela aberta. - + &Apply A&plicar - + &Cancel &Cancelar - + (no color) @@ -9076,7 +9117,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9278,27 +9319,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (rápido) - + Rubberband (better) Rubberband (mellor) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9513,15 +9554,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo seguro activado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9533,57 +9574,57 @@ Shown when VuMeter can not be displayed. Please keep OpenGL. - + activate activar - + toggle conmutar - + right dereita - + left esquerda - + right small dereita pequeno - + left small esquerda pequeno - + up arriba - + down abaixo - + up small arriba pequeno - + down small abaixo pequeno - + Shortcut Atallo @@ -9591,62 +9632,62 @@ OpenGL. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9656,22 +9697,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importar unha lista de reprodución - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Ficheiros de lista de reprodución (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9718,27 +9759,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found Non se atoparon os controis do Mixxx - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9798,18 +9839,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Non se atopan as pistas - + Hidden Tracks Pistas agachadas - Export to Engine Prime + Export to Engine DJ @@ -9821,209 +9862,250 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy O dispositivo de son está ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Tenteo de novo</b> despois de pechar o outro aplicativo ou de volver conectar un dispositivo de son - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurar</b> os axustes do dispositivo de son do Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obter <b>axuda</b> no wiki de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Saír</b> do Mixxx. - + Retry Tentar de novo - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Volver configurar - + Help Axuda - - + + Exit Saír - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error Produciuse un erro no dispositivo de son - + <b>Retry</b> after fixing an issue - + No Output Devices Non hai dispositivos de saída - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx foi configurado sen ningún dispositivo de saída de son. Se non hai configurado.un dispositivo de saída de son o procesado será desactivado. - + <b>Continue</b> without any outputs. <b>Continuar</b> sen ningunha saída. - + Continue Continuar - + Load track to Deck %1 Cargar a pista no prato %1 - + Deck %1 is currently playing a track. O prato %1 está a reproducir unha pista. - + Are you sure you want to load a new track? Confirma que quere cargar unha nova pista? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Non hai ningún dispositivo de entrada seleccionado para este control de paso. Seleccione antes un dispositivo de entrada nas preferencias de hardware de son. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Produciuse un erro no ficheiro do tema - + The selected skin cannot be loaded. Non foi posíbel cargar o tema seleccionado. - + OpenGL Direct Rendering Debuxado directo OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar a saída - + A deck is currently playing. Exit Mixxx? O prato está reproducindo. Saír do Mixxx? - + A sampler is currently playing. Exit Mixxx? Un mostreador está reproducindo actualmente. Saír dp Mixxx? - + The preferences window is still open. A xanela de preferencias segue aberta. - + Discard any changes and exit Mixxx? Desbotar calquera cambio e saír do Mixxx? @@ -10039,13 +10121,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reprodución @@ -10055,32 +10137,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algúns DJ constrúen listas de reprodución antes de actuar en directo, outros prefiren facelo ao voo. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cando se utiliza unha lista de reprodución durante una sesión de DJ en directo, lembre que debe observar sempre con moita atención como reacciona o público á música que escolleu para reproducir. - + Create New Playlist Crear unha nova lista de reprodución @@ -11571,7 +11679,7 @@ Fully right: end of the effect period - + Deck %1 Prato %1 @@ -11704,7 +11812,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Pasante @@ -11735,7 +11843,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11868,12 +11976,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11908,42 +12016,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12001,54 +12109,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Listas de reprodución - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12607,7 +12715,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Vinilo xirando @@ -12789,7 +12897,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Deseño da portada @@ -13025,197 +13133,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Toque de tempo e BPM - + Show/hide the spinning vinyl section. Amosar/agachar a sección do vinilo xiratorio. - + Keylock Bloqueo tonal - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Reproducir - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13453,926 +13561,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Gardar o banco de mostras - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Cargar o banco de mostras - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Súper mando - + Next Chain Seguinte cadea - + Previous Chain Cadea anterior - + Next/Previous Chain Cadea seguinte/anterior - + Clear Limpar - + Clear the current effect. - + Toggle Conmutar - + Toggle the current effect. - + Next Seguinte - + Clear Unit Limpar a unidade - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit Conmutador da unidade - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Anterior - + Switch to the previous effect. - + Next or Previous Seguinte ou anterior - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Axustar a grella do ritmo - + Adjust beatgrid so the closest beat is aligned with the current play position. Axusta grella de ritmo polo que o ritmo máis próximo aliñase coa reprodución actual. - - + + Adjust beatgrid to match another playing deck. Axustar a grella do ritmo para que coincida co outro prato en reprodución - + If quantize is enabled, snaps to the nearest beat. Se está activada a cuantización, acóplase ao ritmo máis próximo. - + Quantize Cuantizar - + Toggles quantization. Conmutar o modo de cuantización. - + Loops and cues snap to the nearest beat when quantization is enabled. Bucles e referencias axústanse ao ritmo próximo cando a cuantización está activada. - + Reverse Inverter - + Reverses track playback during regular playback. Inverte a reprodución da pista durante unha reprodución normal. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Reproducir/Deter - + Jumps to the beginning of the track. Salta ao principio da pista. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough Activa o paso do son - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14507,33 +14621,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. Reproduce ou detén a pista. - + (while playing) (cando reproduce) @@ -14553,215 +14667,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (cando está detida) - + Cue Referencia - + Headphone Auricular - + Mute Silenciar - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Sincronizase co primeiro prato (en orde numérica) que estea reproducindo unha pista e teña BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Se non hai un prato reproducindo, sincronizase co primeiro prato que teña BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Os pratos non poden sincronizar con mostreadores e os mostreadores só poden sincronizar con pratos. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust Axuste de ton - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Gravar a mestura - + Toggle mix recording. - + Enable Live Broadcasting Activar a difusión en directo - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. A reprodución retomase cando corresponda na pista como se non houbera entrado no bucle. - + Loop Exit Saír do bucle - + Turns the current loop off. Apaga o bucle actual. - + Slip Mode Modo de esvaramento - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Cando está activado, a reprodución continua silenciosa en segundo plano durante un bucle, inversión de xiro, rabuñada, etc. - + Once disabled, the audible playback will resume where the track would have been. Unha vez desactivado, a reprodución sonora retomarase na pista na que debera estar. - + Track Key The musical key of a track Clave da pista - + Displays the musical key of the loaded track. Amosa a clave musical da pista cargada. - + Clock Reloxo - + Displays the current time. Amosa o tempo actual. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14806,254 +14920,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Retroceso rápido - + Fast rewind through the track. Retroceder rápido na pista. - + Fast Forward Avance rápido - + Fast forward through the track. Avance rápido na pista. - + Jumps to the end of the track. Salta á fin da pista. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Control do ton - + Pitch Rate Taxa de ton - + Displays the current playback rate of the track. Amosa a taxa de reprodución actual da pista. - + Repeat Repetición - + When active the track will repeat if you go past the end or reverse before the start. Cando está activada, a pista repetirase se sobrepasa a fin ou cara atrás antes do inicio. - + Eject Expulsar - + Ejects track from the player. Expulsa a pista do reprodutor. - + Hotcue Referencia activa - + If hotcue is set, jumps to the hotcue. Se está estabelecida a referencia activa, salta á referencia activa. - + If hotcue is not set, sets the hotcue to the current play position. Se non está estabelecida a referencia activa, estabelece a referencia activa na posición de reprodución actual. - + Vinyl Control Mode Modo do Control do vinilo - + Absolute mode - track position equals needle position and speed. Modo absoluto - a posición da pista é igual a posición e velocidade da agulla. - + Relative mode - track speed equals needle speed regardless of needle position. Modo relativo - a velocidade da pista é igual á velocidade da agulla sen importar a posición da agulla. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Modo constante - a velocidade da pista é igual á última velocidade constante coñecida, independentemente da entrada da agulla. - + Vinyl Status Estado do vinilo - + Provides visual feedback for vinyl control status: Fornece información visual para o estado do control do vinilo: - + Green for control enabled. Verde para o control activado. - + Blinking yellow for when the needle reaches the end of the record. Amarelo intermitente para cando a agulla chega á fin do disco. - + Loop-In Marker Marcador do inicio do bucle - + Loop-Out Marker Marcador da fin do bucle - + Loop Halve Divide o bucle á metade - + Halves the current loop's length by moving the end marker. Divide á metade a lonxitude do bucle actual movendo o marcador da fin. - + Deck immediately loops if past the new endpoint. O prato reinicia inmediatamente o bucle de sobrepasarse o novo punto de fin. - + Loop Double Duplica a lonxitude do bucle - + Doubles the current loop's length by moving the end marker. Duplica a lonxitude do bucle actual movendo o marcador da fin. - + Beatloop Golpe de bucle - + Toggles the current loop on or off. Conmutar o apagado e activado do bucle actual. - + Works only if Loop-In and Loop-Out marker are set. Só funciona se se estabelecen as marcas de inicio fin do de bucle. - + Vinyl Cueing Mode Modo punto de referencia do vinilo - + Determines how cue points are treated in vinyl control Relative mode: Determina como se tratan os puntos de referencia no modo relativo do control do vinilo: - + Off - Cue points ignored. Apagado: Os puntos de referencia son ignorados. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Unha referencia: Se a agulla fose soltada despois dun punto de referencia, a pista vai buscar ese punto de referencia. - + Track Time Tempo da pista - + Track Duration Duración da pista - + Displays the duration of the loaded track. Amosa a duración da pista cargada. - + Information is loaded from the track's metadata tags. A información cargase desde as etiquetas de metadatos da pista. - + Track Artist Intérprete da pista - + Displays the artist of the loaded track. Amosa o intérprete da pista cargada. - + Track Title Título da pista - + Displays the title of the loaded track. Amosa o título da pista cargada. - + Track Album Álbum da pista - + Displays the album name of the loaded track. Amosa o álbum da pista cargada. - + Track Artist/Title Pista interprete/título - + Displays the artist and title of the loaded track. Amosa o interprete e o título da pista cargada. @@ -15061,12 +15175,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15281,47 +15395,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15446,323 +15560,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Crear unha &nova lista de reprodución - + Create a new playlist Crear unha nova lista de reprodución - + Ctrl+n Ctrl+n - + Create New &Crate Crear un novo &caixón - + Create a new crate Crear un novo caixón - + Ctrl+Shift+N Ctrl+Maiús+N - - + + &View &Ver - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. É probábel que non admita todos os temas. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Amosar a sección do micrófono - + Show the microphone section of the Mixxx interface. Amosa a sección do micrófono na interface do Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Amosar a sección do Control do vinilo - + Show the vinyl control section of the Mixxx interface. Amosa a sección do control do vinilo na interface do Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Amosar a escoita previa do prato - + Show the preview deck in the Mixxx interface. Amosar a escoita previa do prato na interface do Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Amosa o deseño da portada - + Show cover art in the Mixxx interface. Amosar o deseño da portada na interface do Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar a fonoteca - + Maximize the track library to take up all the available screen space. Maximiza ou restaura a vista da fonoteca per abarcar toda a pantalla - + Space Menubar|View|Maximize Library Espazo - + &Full Screen &Pantalla completa - + Display Mixxx using the full screen Amosa o Mixxx usando a pantalla completa - + &Options &Opcións - + &Vinyl Control &Control do vinilo - + Use timecoded vinyls on external turntables to control Mixxx Usar vinilos con código de tempo en xira discos externos para controlar Mixxx - + Enable Vinyl Control &%1 Activar o Control do vinilo &%1 - + &Record Mix &Gravar a mestura - + Record your mix to a file Grava a súa mestura a un ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar a &difusión en directo - + Stream your mixes to a shoutcast or icecast server Difundir as súas mesturas a un servidor Shoutcast ou Icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar os atallos do &teclado - + Toggles keyboard shortcuts on or off Conmutar os atallos de teclado activados ou desactivados - + Ctrl+` Ctrl+` - + &Preferences &Preferencias - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambiar os axustes do Mixxx (p.ex. reprodución, MIDI, controles) - + &Developer &Desenvolvedor - + &Reload Skin &Volver cargar o tema - + Reload the skin Volver cargar o tema - + Ctrl+Shift+R Ctrl+Maiús+R - + Developer &Tools &Ferramentas de desenvolvemento - + Opens the developer tools dialog Abre o cadro de diálogo das ferramentas de desenvolvemento - + Ctrl+Shift+T Ctrl+Maiús+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Maiús+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Maiús+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Maiús+D - + &Help &Axuda - + Show Keywheel menu title @@ -15779,74 +15923,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support Axuda da &comunidade - + Get help with Mixxx Obter axuda con Mixxx - + &User Manual Manual do &usuario - + Read the Mixxx user manual. Lea o manual do usuario do Mixxx. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Traducir este aplicativo - + Help translate this application into your language. Axude a traducir este aplicativo ao seu idioma. - + &About &Sobre - + About the application Sobre o aplicativo @@ -15854,25 +15998,25 @@ This can not be undone! WOverview - + Passthrough Pasante - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15881,25 +16025,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Buscar - + Clear input @@ -15910,169 +16042,163 @@ This can not be undone! Buscar... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Atallo + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Clave - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Interprete - + Album Artist Interprete do álbum - + Composer Compositor - + Title Título - + Album Álbum - + Grouping Agrupación - + Year Ano - + Genre Xénero - + Directory - + &Search selected @@ -16080,620 +16206,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Prato - + Sampler Mostras - + Add to Playlist Engadir á lista de reprodución - + Crates Caixóns - + Metadata Metadatos - + Update external collections - + Cover Art Deseño da portada - + Adjust BPM - + Select Color - - + + Analyze Analizar - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Engadir á cola de DJ automático (abaixo) - + Add to Auto DJ Queue (top) Engadir á cola de DJ automático (arriba) - + Add to Auto DJ Queue (replace) Engadir á cola do DJ automático (trocar) - + Preview Deck Escoita previa do prato - + Remove Retirar - + Remove from Playlist - + Remove from Crate - + Hide from Library Agachar da fonoteca - + Unhide from Library Amosar da fonoteca - + Purge from Library Purgar da fonoteca - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Propiedades - + Open in File Browser Abrir no navegador de ficheiros - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Cualificación - + Cue Point - - + + Hotcues Referencias activas - + Intro - + Outro - + Key Clave - + ReplayGain ReplayGain - + Waveform - + Comment Comentario - + All Todas - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Bloquear os BPM - + Unlock BPM Desbloquear os BPM - + Double BPM Duplicar os BPM - + Halve BPM Dividir ÷2 os BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Prato %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Crear unha nova lista de reprodución - + Enter name for new playlist: Escriba o nome para a nova lista de reprodución - + New Playlist Nova lista de reprodución - - - + + + Playlist Creation Failed Non foi posíbel crear a lista de reprodución - + A playlist by that name already exists. Xa existe unha lista de reprodución con ese nome. - + A playlist cannot have a blank name. Unha lista de reprodución non pode ter un nome baleiro. - + An unknown error occurred while creating playlist: Produciuse un erro descoñecido mentres se creaba a lista de reprodución: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Cancelar - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Pechar - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16709,37 +16840,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16747,37 +16878,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16785,12 +16916,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Amosar ou agachar as columnas. - + Shuffle Tracks @@ -16798,52 +16929,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Escolla o directorio da fonoteca - + controllers - + Cannot open database Non é posíbel abrir a base de datos - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16854,68 +16985,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse Examinar - + Export directory - + Database version - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16936,7 +17077,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16946,23 +17087,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_hi_IN.qm b/res/translations/mixxx_hi_IN.qm index c121bd2b54d66beaa8769af6e887c07d78512323..5c19267877af1a5891ba2e9549a48e14e4ddd9bd 100644 GIT binary patch delta 41 xcmeA?&UpPO;{-XzjE(Z~jEroX>lr69ZkAxKW@U7l92lduc^}7v$jKhbjsPke4ln=! delta 189 zcmcb9l(F+T;{-Xzf{pU=jEoyL*E3FJWN+`WV_=A4+sw~g!^-$>vaf~K=4~7gBI~0V zR2d8z6gcHMeK`#{Jvc=fG&n67G=U-_oCXXEKv^RoTNEto&M6O<73H)8id%4MbAseG zIPHPDeL3|x?Ko9{d`nJ8PBsn(AYcPxRo9Aw{GyW76a`g7g_5Gg AutoDJFeature - + Crates संदूक - + + Enable Auto DJ + + + + + Disable Auto DJ + + + + + Clear Auto DJ Queue + + + + Remove Crate as Track Source क्रेट को ट्रैक स्रोत से हटाएं - + Auto DJ स्वत: डीजे - + + Confirmation Clear + + + + + Do you really want to remove all tracks from the Auto DJ queue? + + + + + This can not be undone. + + + + Add Crate as Track Source क्रेट को ट्रैक स्रोत में जोड़ें @@ -118,154 +148,161 @@ BasePlaylistFeature - + New Playlist नई प्लेलिस्ट - + Add to Auto DJ Queue (bottom) स्वत: डीजे के पंक्ति में जोड़ें (सब से नीचे) - - + + Create New Playlist नई प्लेलिस्ट बनाएं - + Add to Auto DJ Queue (top) स्वत: डीजे के पंक्ति में जोड़ें (सब से ऊपर) - + Remove हटाएं - + Rename नाम बदलें - + Lock लॉक - + Duplicate प्रतिरूप बनाएं - - + + Import Playlist प्लेलिस्ट आयात करें - + Export Track Files ट्रैक फ़ाइलें निर्यात करें - + Analyze entire Playlist पूरी प्लेलिस्ट का विश्लेषण करें - + Enter new name for playlist: प्लेलिस्ट के लिए नया नाम दर्ज करें: - + Duplicate Playlist प्लेलिस्ट का प्रतिरूप बनाएं - - + + Enter name for new playlist: नई प्लेलिस्ट के लिए नाम दर्ज करें: - - + + Export Playlist प्लेलिस्ट निर्यात करें - + Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist प्लेलिस्ट का नाम बदलें - - + + Renaming Playlist Failed प्लेलिस्ट का नामकरण विफल - - - + + + A playlist by that name already exists. उस नाम की एक प्लेलिस्ट पहले से मौजूद है। - - - + + + A playlist cannot have a blank name. एक प्लेलिस्ट में एक खाली नाम नहीं हो सकता। - + _copy //: Appendix to default name when duplicating a playlist _कॉपी - - - - - - + + + + + + Playlist Creation Failed प्लेलिस्ट निर्माण विफल रहा - - + + An unknown error occurred while creating playlist: प्लेलिस्ट बनाते समय एक अज्ञात त्रुटि हुई: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) एम३यू प्लेलिस्ट (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) एम३यू प्लेलिस्ट (*.m3u);;एम३यू८ प्लेलिस्ट (*.m3u8);;पीएलएस प्लेलिस्ट (*.pls);;टेक्स्ट सीएसवी (*.csv);;रीडेबल टेक्स्ट (*.txt) @@ -273,12 +310,12 @@ BaseSqlTableModel - + # # - + Timestamp टाइमस्टैम्प @@ -286,7 +323,7 @@ BaseTrackPlayerImpl - + Couldn't load track. ट्रैक लोड नहीं हो सका @@ -294,137 +331,142 @@ BaseTrackTableModel - + Album एल्बम - + Album Artist एलबम कलाकार - + Artist कलाकार - + Bitrate बिटरेट - + BPM बीपीएम - + Channels चैनल्स - + Color रंग - + Comment टिप्पणी - + Composer संगीतकार - + Cover Art कवर आर्ट - + Date Added तारीख संकलित हुई - + Last Played - + Duration अवधि - + Type प्रकार - + Genre शैली - + Grouping समूहीकरण - + Key चाभी - + Location स्थान - + + Overview + + + + Preview पूर्वावलोकन - + Rating रेटिंग - + ReplayGain - + Samplerate सैम्पलरेट - + Played चलाये जा चुके - + Title शीर्षक - + Track # ट्रैक # - + Year साल - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -446,22 +488,22 @@ BroadcastProfile - + Can't use secure password storage: keychain access failed. सुरक्षित पासवर्ड संग्रहण का उपयोग नहीं कर सकते: कीचेन ऐक्सेस विफल। - + Secure password retrieval unsuccessful: keychain access failed. सुरक्षित पासवर्ड पुनर्प्राप्ति असफल: कीचेन ऐक्सेस विफल। - + Settings error सेटिंग्स त्रुटि - + <b>Error with settings for '%1':</b><br> @@ -512,213 +554,215 @@ BrowseFeature - + Add to Quick Links शीघ्रगामी लिंकों की कड़ी में जोड़े - + Remove from Quick Links शीघ्रगामी लिंकों की कड़ी से हटाएं - + Add to Library लाइब्रेरी में जोड़ें - + Refresh directory tree - + Quick Links शीघ्रगामी लिंक - - + + Devices यंत्र - + Removable Devices - - + + Computer कंप्यूटर - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan जाँच करें - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel - + Preview पूर्वावलोकन - + Filename फ़ाइल का नाम - + Artist कलाकार - + Title शीर्षक - + Album एल्बम - + Track # ट्रैक # - + Year साल - + Genre शैली - + Composer संगीतकार - + Comment टिप्पणी - + Duration अवधि - + BPM बीपीएम - + Key चाभी - + Type प्रकार - + Bitrate बिटरेट - + ReplayGain - + Location स्थान - + Album Artist एलबम कलाकार - + Grouping समूहीकरण - + File Modified फ़ाइल में बदलाव - + File Created फ़ाइल की रचना हुई - + Mixxx Library Mixxx लाइब्रेरी - + Could not load the following file because it is in use by Mixxx or another application. - - BulkController - - - USB Controller - - - CachingReaderWorker - + The file '%1' could not be found. '%1' फ़ाइल नहीं मिली। - + The file '%1' could not be loaded. '%1' फ़ाइल लोड नहीं हो पाया। - + The file '%1' could not be loaded because it contains %2 channels, and only 1 to %3 are supported. - + The file '%1' is empty and could not be loaded. '%1' फ़ाइल खाली है, इसलिए लोड नहीं हुआ। @@ -726,82 +770,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: Mixxx एक सार्वजनिक स्रोत डिस्क जॉकी सॉफ्टवेयर है। अधिक जानकारी के लिए देखें : - + Starts Mixxx in full-screen mode Mixxx को पूरी स्क्रीन में चलाएं - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + + Rescans the library when Mixxx is launched. + + + + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -811,22 +860,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. + + + + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1008,13 +1067,13 @@ trace - Above + Profiling messages - + Set to full volume - + Set to zero volume @@ -1039,13 +1098,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button @@ -1056,25 +1115,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1115,22 +1174,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1140,193 +1199,193 @@ trace - Above + Profiling messages - + Vinyl Control - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 - + 1 - + 2 - + 4 - + 8 - + 16 - + 32 - + 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1442,20 +1501,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1471,7 +1530,7 @@ trace - Above + Profiling messages - + Mute @@ -1482,7 +1541,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1503,25 +1562,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1591,82 +1650,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1707,456 +1766,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) स्वत: डीजे के पंक्ति में जोड़ें (सब से नीचे) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) स्वत: डीजे के पंक्ति में जोड़ें (सब से ऊपर) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track - + Load selected track and play - - + + Record Mix - + Toggle mix recording - + Effects - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next - + Switch to next effect - + Previous - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - - Microphone & Auxiliary Show/Hide - - - - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2171,102 +2225,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2418,1039 +2472,1075 @@ trace - Above + Profiling messages - - - Toggle the BPM/beatgrid lock + + Move Beatgrid Half a Beat - - Revert last BPM/Beatgrid Change + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. - Revert last BPM/Beatgrid Change of the loaded track. + + Toggle the BPM/beatgrid lock - - Sync / Sync Lock + + Revert last BPM/Beatgrid Change - - Internal Sync Leader + + Revert last BPM/Beatgrid Change of the loaded track. - - Toggle Internal Sync Leader + + Sync / Sync Lock + Internal Sync Leader + + + - Internal Leader BPM + Toggle Internal Sync Leader + + Internal Leader BPM + + + + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ स्वत: डीजे - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface - + Samplers Show/Hide - + Show/hide the sampler section - + + Microphone && Auxiliary Show/Hide + keep double & to prevent creation of keyboard accelerator + + + + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star + + Controller + + + Unknown + + + ControllerInputMappingTableModel @@ -3540,12 +3630,12 @@ trace - Above + Profiling messages - + Unnamed - + <i>FPS: %0/%1</i> @@ -3553,32 +3643,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3586,27 +3676,27 @@ trace - Above + Profiling messages ControllerScriptEngineLegacy - + Controller Mapping File Problem - + The mapping for controller "%1" cannot be opened. - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + File: फ़ाइल : - + Error: @@ -3627,13 +3717,13 @@ trace - Above + Profiling messages हटाएं - + Create New Crate - + Rename नाम बदलें @@ -3686,7 +3776,7 @@ trace - Above + Profiling messages - + Export Crate @@ -3696,7 +3786,7 @@ trace - Above + Profiling messages - + An unknown error occurred while creating crate: @@ -3705,12 +3795,6 @@ trace - Above + Profiling messages Rename Crate - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3728,17 +3812,17 @@ trace - Above + Profiling messages - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) एम३यू प्लेलिस्ट (*.m3u);;एम३यू८ प्लेलिस्ट (*.m3u8);;पीएलएस प्लेलिस्ट (*.pls);;टेक्स्ट सीएसवी (*.csv);;रीडेबल टेक्स्ट (*.txt) - + M3U Playlist (*.m3u) एम३यू प्लेलिस्ट (*.m3u) @@ -3747,6 +3831,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3858,12 +3948,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -3919,7 +4009,7 @@ trace - Above + Profiling messages - + Analyze विश्लेषण @@ -3969,12 +4059,12 @@ trace - Above + Profiling messages - + Analyzing %1% %2/%3 - + Analyzing %1/%2 @@ -3982,92 +4072,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds - - Full Intro + Outro - - - - - Fade At Outro Start - - - - - Full Track - - - - - Skip Silence - - - - + Auto DJ Fade Modes Full Intro + Outro: @@ -4089,59 +4159,89 @@ silence between tracks. Skip Silence: Play the whole track except for silence at the beginning and end. Begin crossfading from the selected number of seconds before the -last sound. +last sound. + +Skip Silence Start Full Volume: +The same as Skip Silence, but starting transitions with a centered +crossfader, so that the intro starts at full volume. + - - Repeat + + Full Intro + Outro - - Auto DJ requires two decks assigned to opposite sides of the crossfader. + + Fade At Outro Start - - One deck must be stopped to enable Auto DJ mode. + + Full Track + + + + + Skip Silence + + + + + Skip Silence Start Full Volume + + + + + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. + + + + + Repeat + + + + + Auto DJ requires two decks assigned to opposite sides of the crossfader. - - Decks 3 and 4 must be stopped to enable Auto DJ mode. + + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ स्वत: डीजे - + Shuffle - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4160,7 +4260,7 @@ If no track sources are configured, the track is added from the library instead. - + Choose between different algorithms to detect beats. @@ -4195,23 +4295,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - - Choose Analyzer + + Use rhythmic channel when analysing stem file - - Analyzer Settings + + Disabled - - Enable Fast Analysis (For slow computers, may be less accurate) + + Enforced - - Assume constant tempo (Recommended) + + Choose Analyzer + + + + + Analyzer Settings + + + + + Enable Fast Analysis (For slow computers, may be less accurate) + + + + + Assume constant tempo (Recommended) @@ -4349,32 +4464,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 + + + + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4413,17 +4533,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -4489,7 +4609,7 @@ You tried to learn: %1,%2 - + &Close @@ -4576,42 +4696,42 @@ You tried to learn: %1,%2 - + Add Random Tracks - + Enable random track addition to queue - + Add random tracks from Track Source if the specified minimum tracks remain - + Minimum allowed tracks before addition - + Minimum number of tracks after which random tracks may be added - + Crossfader Behaviour - + Reset the Crossfader back to center after disabling AutoDJ - + Hint: Resetting the crossfader to center will cause a drop of the main output's volume if you've selected "Constant Power" crossfader curve in the Mixer preferences. @@ -4679,62 +4799,62 @@ You tried to learn: %1,%2 - - - - + + + + Action failed क्रिया: विफल रही - + You can't create more than %1 source connections. - + Source connection %1 %1 स्त्रोत से संपर्क जुड़ा - + At least one source connection is required. कम से कम एक स्त्रोत से संपर्क होना आवश्यक है। - + Are you sure you want to disconnect every active source connection? - - + + Confirmation required - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. - + Are you sure you want to delete '%1'? - + Renaming '%1' - + New name for '%1': - + Can't rename '%1' to '%2': name already in use @@ -5007,13 +5127,13 @@ Two source connections to the same server that have the same mountpoint can not DlgPrefColors - - + + By hotcue number - + Color रंग @@ -5056,132 +5176,133 @@ Two source connections to the same server that have the same mountpoint can not Replace… - - - DlgPrefController - - Apply device settings? + + When key colors are enabled, Mixxx will display a color hint +associated with each key. - - Your settings must be applied before starting the learning wizard. -Apply settings and continue? + + Enable Key Colors - - None + + Key palette + + + DlgPrefController - - %1 by %2 + + Apply device settings? - - No Name + + Your settings must be applied before starting the learning wizard. +Apply settings and continue? - - No Description + + None - - No Author + + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5189,65 +5310,115 @@ Apply settings and continue? DlgPrefControllerDlg - - (device category goes here) - - - - + Controller Name - + Enabled सक्रिय किये हुए - - Description: + + Device Info - - Support: + + Physical Interface: + + + + + Vendor name: + + + + + Product name: + + + + + Vendor ID + + + + + VID: + + + + + Product ID + + + + + PID: + + + + + Serial number: + + + + + USB interface number: + + + + + HID Usage-Page: + + + + + HID Usage: - - Mapping settings + + Description: + + + + + Support: - + Screens preview - + Input Mappings - - + + Search - - + + Add - - + + Remove हटाएं - + Click to start the Controller Learning wizard. @@ -5257,48 +5428,53 @@ Apply settings and continue? - - Controller Setup - - - - + Load Mapping: - + Mapping Info - + Author: - + Name: - + Learning Wizard (MIDI Only) - + + Data protocol: + + + + Mapping Files: - - + + Mapping Settings + + + + + Clear All - + Output Mappings @@ -5306,22 +5482,28 @@ Apply settings and continue? DlgPrefControllers - + + %1 is a virtual controller that allows to use e.g. the 'MIDI for light' mapping.<br/>You need to restart Mixxx in order to enable it.<br/><b>Note:</b> mappings meant for physical controllers can cause issues and even render the Mixxx GUI unresponsive when being loaded to %1. + text enclosed in <b> is bold, <br/> is a linebreak %1 is the placehodler for 'MIDI Through Port' + + + + Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the %1. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx. - + Mixxx DJ Hardware Guide - + MIDI Mapping File Format - + MIDI Scripting with Javascript @@ -5344,17 +5526,22 @@ Apply settings and continue? - + + Enable MIDI Through Port + + + + Mappings - + Open User Mapping Folder - + Resources संसाधन @@ -5364,7 +5551,7 @@ Apply settings and continue? - + You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. @@ -5446,6 +5633,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5902,124 +6099,134 @@ You can always drag-and-drop tracks on screen to clone a deck. - - + + Effect Chain Presets - + Drag and drop to rearrange lists and copy chains between lists. Create and edit chain presets in the effect units in the main window. Please refer the manual for further details. - + Chain presets from these lists will be selectable in the given order in the main window and from controllers (depending on the controller mapping). - + Effects in this chain preset: - + effect 1 name - + effect 2 name - + effect 3 name - + Import - + Rename नाम बदलें - + Export निर्यात करें - + Delete - + Quick Effect Chain Presets - - + + Visible Effects - + Drag and drop to rearrange lists and show or hide effects. - + Hidden Effects - + + ❯ + + + + + ❮ + + + + Effect load behavior - + Keep metaknob position - + Reset metaknob to effect default - + Effect Info - + Version: - + Description: - + Author: - + Name: - + Type: @@ -6027,62 +6234,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes इस स्किन में रंग परियोजना का समर्थन नहीं है - + Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -6095,193 +6302,208 @@ You can always drag-and-drop tracks on screen to clone a deck. - + When key detection is enabled, Mixxx detects the musical key of your tracks and allows you to pitch adjust them for harmonic mixing. - + Enable Key Detection - + Choose Analyzer - + Choose between different algorithms to detect keys. - + Analyzer Settings - + Enable Fast Analysis (For slow computers, may be less accurate) - + Re-analyze keys when settings change or 3rd-party keys are present - + + Exclude rhythmic channel when analysing stem file + + + + + Disabled + + + + + Enforced + + + + Key Notation - + Lancelot - + Lancelot/Traditional - + OpenKey - + OpenKey/Traditional - + Traditional - + Custom - + A - + Bb - + B - + C - + Db - + D - + Eb - + E - + F - + F# - + G - + Ab - + Am - + Bbm - + Bm - + Cm - + C#m - + Dm - + Ebm - + Em - + Fm - + F#m - + Gm - + G#m @@ -6289,72 +6511,72 @@ and allows you to pitch adjust them for harmonic mixing. DlgPrefLibrary - + See the manual for details - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan जाँच करें - + Item is not a directory or directory is missing - + Choose a music directory - + Confirm Directory Removal - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Hide Tracks - + Delete Track Metadata - + Leave Tracks Unchanged - + Relink music directory to new location - + Select Library Font @@ -6716,22 +6938,22 @@ and allows you to pitch adjust them for harmonic mixing. - + Only allow EQ knobs to control EQ-specific effects - + Uncheck to allow any effect to be loaded into the EQ knobs. - + Use the same EQ filter for all decks - + Uncheck to allow different decks to use different EQ effects. @@ -6741,17 +6963,17 @@ and allows you to pitch adjust them for harmonic mixing. - + Quick Effect - + Bypass EQ effect processing - + When checked, EQs are not processed, improving performance on slower computers. @@ -6776,39 +6998,44 @@ and allows you to pitch adjust them for harmonic mixing. - + + Reset stem controls on track load + + + + Equalizer frequency Shelves - + High EQ - - + + 16 Hz - - + + 20.05 kHz - + Low EQ - + Main EQ - + Reset Parameter @@ -7116,7 +7343,7 @@ and allows you to pitch adjust them for harmonic mixing. DlgPrefReplayGain - + %1 LUFS (adjust by %2 dB) @@ -7229,173 +7456,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled सक्रिय किये हुए - + Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms - + Configuration error @@ -7413,131 +7639,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output - + Input - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7692,17 +7918,28 @@ The loudness target is approximate and assumes track pregain and main output lev - + + 1/3 of waveform viewer + options for "Text height limit" + + + + + Entire waveform viewer + + + + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7715,245 +7952,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - - Time until next marker + + Preferred font size - - Placement + + Text height limit + + + + + Time until next marker - - Font size + + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -7961,47 +8209,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers - + Library - + Interface - + Waveforms - + Mixer मिक्सर - + Auto DJ स्वत: डीजे - + Decks - + Colors रंग @@ -8036,47 +8284,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects - + Recording - + Beat Detection - + Key Detection - + Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control - + Live Broadcasting - + Modplug Decoder @@ -8109,22 +8357,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording - + Recording to file: रिकॉर्डिंग करने की फ़ाइल: - + Stop Recording - + %1 MiB written in %2 @@ -8179,27 +8427,27 @@ Select from different types of displays for the waveform, which differ primarily नए क्यू का रंग - + Selecting database rows... - + No colors changed! कोई रंग नहीं बदला गया ! - + No cues matched the specified criteria. - + Confirm Color Replacement रंग बदलाव की पुष्टि करें - + The colors of %1 cues in %2 tracks will be replaced. This change cannot be undone! Are you sure? %2 ट्रैक्स के %1 क्यूस के रंग बदले जाएँगे। इस बदलाव को वापिस नहीं लिया जा सकता। क्या आप निश्चित हैं? @@ -8251,7 +8499,7 @@ Select from different types of displays for the waveform, which differ primarily एलबम कलाकार - + Fetching track data from the MusicBrainz database @@ -8328,72 +8576,67 @@ Select from different types of displays for the waveform, which differ primarily - + Original tags - + Metadata applied - + %1 - - Could not find this track in the MusicBrainz database. - - - - + Suggested tags - + The results are ready to be applied - + Can't connect to %1: %2 - + Looking for cover art - + Cover art found, receiving image. - + Cover Art is not available for selected metadata - + Metadata & Cover Art applied - + Selected cover art applied - + Cover Art File Already Exists - + File: %1 Folder: %2 Override existing file? @@ -8437,102 +8680,102 @@ This can not be undone! - + Filetype: फ़ाइल प्रकार: - + BPM: - + Location: - + Bitrate: - + Comments - + BPM बीपीएम - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # ट्रैक # - + Album Artist एलबम कलाकार - + Composer संगीतकार - + Title शीर्षक - + Grouping समूहीकरण - + Key चाभी - + Year साल - + Artist कलाकार - + Album एल्बम - + Genre शैली @@ -8542,179 +8785,179 @@ This can not be undone! - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color रंग - + Date added: - + Open in File Browser फ़ाइल ब्राउज़र में खोलें - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply - + &Cancel - + (no color) @@ -8782,12 +9025,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Re-Import Metadata from files - + Color @@ -8871,7 +9114,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9050,7 +9293,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EffectParameterSlotBase - + No effect loaded. @@ -9073,27 +9316,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9237,54 +9480,86 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. + + LegacyControllerColorSetting + + + Change color + + + + + Choose a new color + + + + + LegacyControllerFileSetting + + + Browse... + + + + + + No file selected + + + + + Select a file + + + LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9295,57 +9570,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9353,62 +9628,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9418,22 +9693,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist प्लेलिस्ट आयात करें - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) प्लेलिस्ट फ़ाइलस (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? क्या फ़ाइल के ऊपर लिखें ? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9483,32 +9758,27 @@ Do you really want to overwrite it? MidiController - - MIDI Controller - - - - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9568,18 +9838,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9591,208 +9861,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -9808,52 +10119,169 @@ Do you want to select an input device? PlaylistFeature - + Lock लॉक - - + + Playlists - + Shuffle Playlist - - Unlock + + Unlock all playlists - - Playlists are ordered lists of tracks that allow you to plan your DJ sets. + + Delete all unlocked playlists - - It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. + + Unlock - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. + + + + + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. + + + + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist नई प्लेलिस्ट बनाएं + + PredefinedColorPaletes + + + Mixxx Hotcue Colors + + + + + PredefinedColorPalettes + + + Serato DJ Track Metadata Hotcue Colors + + + + + Serato DJ Pro Hotcue Colors + + + + + Rekordbox COLD1 Hotcue Colors + + + + + Rekordbox COLD2 Hotcue Colors + + + + + Rekordbox COLORFUL Hotcue Colors + + + + + Mixxx Track Colors + + + + + Rekordbox Track Colors + + + + + Serato DJ Pro Track Colors + + + + + Traktor Pro Track Colors + + + + + VirtualDJ Track Colors + + + + + Mixxx Key Colors + + + + + Traktor Key Colors + + + + + Mixed In Key - Key Colors + + + + + Protanopia / Protanomaly Key Colors + + + + + Deuteranopia / Deuteranomaly Key Colors + + + + + Tritanopia / Tritanomaly Key Colors + + + QMessageBox @@ -10203,8 +10631,8 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx - + Feedback @@ -10253,8 +10681,8 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx - + Triplets @@ -10321,8 +10749,8 @@ Default: flat top - + Depth @@ -10386,13 +10814,13 @@ With width at zero, this allows for manually sweeping over the entire delay rang - + Intensity of the effect - + Divide rounded 1/2 beats of the Period parameter by 3. @@ -10413,40 +10841,55 @@ With width at zero, this allows for manually sweeping over the entire delay rang - + Metronome - + + The Mixxx Team + + + + Adds a metronome click sound to the stream - + BPM बीपीएम - + Set the beats per minute value of the click sound - + Sync - + Synchronizes the BPM with the track if it can be retrieved + + + Gain + + + + + Set the gain of metronome click sound + + - + Period @@ -10543,15 +10986,15 @@ Higher values result in less attenuation of high frequencies. - - + + Low - + Gain for Low Filter @@ -10678,7 +11121,7 @@ Higher values result in less attenuation of high frequencies. - + Gain for Low Filter (neutral at 1.0) @@ -10688,60 +11131,60 @@ Higher values result in less attenuation of high frequencies. - + Phaser - + Stereo - + Stages - + Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - + Period of the LFO (low frequency oscillator) 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Controls how much of the output signal is looped - - + + Range - + Controls the frequency range across which the notches sweep. - + Number of stages - + Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others @@ -10894,12 +11337,12 @@ Higher values result in less attenuation of high frequencies. - + This stream is online for testing purposes! - + Live Mix @@ -11212,7 +11655,7 @@ Fully right: end of the effect period - + MP3 encoding is not supported. Lame could not be initialized @@ -11234,7 +11677,7 @@ Fully right: end of the effect period - + Deck %1 डेक %1 @@ -11274,52 +11717,52 @@ Fully right: end of the effect period - + Pitch Shift - + Raises or lowers the original pitch of a sound. - + Pitch - + The pitch shift applied to the sound. - + The range of the Pitch knob (0 - 2 octaves). - + Semitones - + Change the pitch in semitone steps instead of continuously. - + Formant - + Preserve the resonant frequencies (formants) of the human vocal tract and other instruments. Hint: compensates "chipmunk" or "growling" voices @@ -11367,7 +11810,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11398,170 +11841,170 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 - - + + Compressor - + Auto Makeup Gain - + Makeup - + The Auto Makeup button enables automatic gain adjustment to keep the input signal and the processed output signal as close as possible in perceived loudness - + Off - + On - + Threshold (dBFS) - + Threshold - + The Threshold knob adjusts the level above which the compressor starts attenuating the input signal - + Ratio (:1) - + Ratio - + The Ratio knob determines how much the signal is attenuated above the chosen threshold. For a ratio of 4:1, one dB remains for every four dB of input signal above the threshold. At a ratio of 1:1 no compression is happening, as the input is exactly the output. - + Knee (dBFS) - + Knee - + The Knee knob is used to achieve a rounder compression curve - + Attack (ms) - + Attack - + The Attack knob sets the time that determines how fast the compression will set in once the signal exceeds the threshold - + Release (ms) - + Release - + The Release knob sets the time that determines how fast the compressor will recover from the gain reduction once the signal falls under the threshold. Depending on the input signal, short release times may introduce a 'pumping' effect and/or distortion. - - + + Level - + The Level knob adjusts the level of the output signal after the compression was applied - + various - + built-in - + missing - + Distribute stereo channels into mono channels processed in parallel. - + Warning! - + Processing stereo signal as mono channel may result in pitch and tone imperfection, and this is mono-incompatible, due to third party limitations. - + Dual threading mode is incompatible with mono main mix. - + Dual threading mode is only available with RubberBand. @@ -11571,42 +12014,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11664,54 +12107,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -11719,8 +12162,8 @@ may introduce a 'pumping' effect and/or distortion. RhythmboxFeature - - + + Rhythmbox @@ -11766,34 +12209,34 @@ may introduce a 'pumping' effect and/or distortion. SeratoFeature - - - + + + Serato - + Reads the following from the Serato Music directory and removable devices: - + Tracks - + Crates संदूक - + Check for Serato databases (refresh) - + (loading) Serato @@ -11801,64 +12244,64 @@ may introduce a 'pumping' effect and/or distortion. SetlogFeature - + Join with previous (below) - + Mark all tracks played - + Finish current and start new - + Lock all child playlists - + Unlock all child playlists - + Delete all unlocked child playlists - + History - + Unlock - + Lock लॉक - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12151,12 +12594,27 @@ may introduce a 'pumping' effect and/or distortion. - - Identifying track through Acoustid + + Reading track for fingerprinting failed. + + + + + Identifying track through AcoustID + + + + + Could not identify track through AcoustID. + + + + + Could not find this track in the MusicBrainz database. - + Retrieving metadata from MusicBrainz @@ -12214,656 +12672,656 @@ may introduce a 'pumping' effect and/or distortion. - + Use the mouse to scratch, spin-back or throw tracks. - + Waveform Display - + Shows the loaded track's waveform near the playback position. - + Drag with mouse to make temporary pitch adjustments. - + Scroll to change the waveform zoom level. - + Waveform Zoom Out - + Waveform Zoom In - + Waveform Zoom - - + + Spinning Vinyl - + Rotates during playback and shows the position of a track. - + Right click to show cover art of loaded track. - + Gain - + Adjusts the pre-fader gain of the track (to avoid clipping). - + (too loud for the hardware and is being distorted). - + Indicates when the signal on the channel is clipping, - + Channel Volume Meter - + Shows the current channel volume. - + Microphone Volume Meter - + Shows the current microphone volume. - + Auxiliary Volume Meter - + Shows the current auxiliary volume. - + Auxiliary Peak Indicator - + Indicates when the signal on the auxiliary is clipping, - + Volume Control - + Adjusts the volume of the selected channel. - + Booth Gain - + Adjusts the booth output gain. - + Crossfader - + Balance - + Headphone Volume - + Adjusts the headphone output volume. - + Headphone Gain - + Adjusts the headphone output gain. - + Headphone Mix - + Headphone Split Cue - + Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - + Microphone - + Show/hide the Microphone section. - + Sampler - + Show/hide the Sampler section. - + Vinyl Control - + Show/hide the Vinyl Control section. - + Preview Deck - + Show/hide the Preview deck. - - - + + + Cover Art कवर आर्ट - + Show/hide Cover Art. - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Show Library - + Show or hide the track library. - + Show Effects - + Show or hide the effects. - + Toggle Mixer - + Show or hide the mixer. - + Show/hide volume meters for channels and main output. - + Microphone Volume - + Adjusts the microphone volume. - + Microphone Gain - + Adjusts the pre-fader microphone gain. - + Auxiliary Gain - + Adjusts the pre-fader auxiliary gain. - + Microphone Talk-Over - + Hold-to-talk or short click for latching to - + Microphone Talkover Mode - + Off: Do not reduce music volume - + Manual: Reduce music volume by a fixed amount set by the Strength knob. - + Behavior depends on Microphone Talkover Mode: - + Off: Does nothing - + Change the step-size in the Preferences -> Decks menu. - + Low EQ - + Adjusts the gain of the low EQ filter. - + Mid EQ - + Adjusts the gain of the mid EQ filter. - + High EQ - + Adjusts the gain of the high EQ filter. - + Hold-to-kill or short click for latching. - + High EQ Kill - + Holds the gain of the high EQ to zero while active. - + Mid EQ Kill - + Holds the gain of the mid EQ to zero while active. - + Low EQ Kill - + Holds the gain of the low EQ to zero while active. - + Displays the tempo of the loaded track in BPM (beats per minute). - + Tempo - + Key The musical key of a track चाभी - + BPM Tap - + When tapped repeatedly, adjusts the BPM to match the tapped BPM. - + Adjust BPM Down - + When tapped, adjusts the average BPM down by a small amount. - + Adjust BPM Up - + When tapped, adjusts the average BPM up by a small amount. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -12873,1092 +13331,1165 @@ may introduce a 'pumping' effect and/or distortion. - + + Left click and hold allows to preview the position where the play head will jump to on release. Dragging can be aborted with right click. + + + + Big Spinny/Cover Art - + Show a big version of the Spinny or track cover art if enabled. - + Main Output Peak Indicator - + Indicates when the signal on the main output is clipping, - + Main Output L Peak Indicator - + Indicates when the left signal on the main output is clipping, - + Main Output R Peak Indicator - + Indicates when the right signal on the main output is clipping, - + Main Channel L Volume Meter - + Shows the current volume for the left channel of the main output. - + Shows the current volume for the right channel of the main output. - - + + Main Output Gain - - + + Adjusts the main output gain. - + Determines the main output by fading between the left and right channels. - + Adjusts the left/right channel balance on the main output. - + Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Show/hide Cover Art of the selected track in the library. - + Show/hide the scrolling waveforms - + Show/hide the beatgrid controls section - + + Show/hide the stem mixing controls section + + + + Hide all skin sections except the decks to have more screen space for the track library. - + Volume Meters - + mix microphone input into the main output. - + Auto: Automatically reduce music volume when microphone volume rises above threshold. - - + + Adjust the amount the music volume is reduced with the Strength knob. - + Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - + If keylock is disabled, pitch is also affected. - + Speed Up - + Raises the track playback speed (tempo). - + Raises playback speed in small steps. - + Slow Down - + Lowers the track playback speed (tempo). - + Lowers playback speed in small steps. - + Speed Up Temporarily (Nudge) - + Holds playback speed higher while active (tempo). - + Holds playback speed higher (small amount) while active. - + Slow Down Temporarily (Nudge) - + Holds playback speed lower while active (tempo). - + Holds playback speed lower (small amount) while active. - + When tapped repeatedly, adjusts the tempo to match the tapped BPM. - + Tempo Tap - + Rate Tap and BPM Tap - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + + Hint: Change the default cue mode in Preferences -> Decks. + + + + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. + + + + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + + Stem Label + + + + + Name of the stem stored in the stem file + + + + + Text is displayed in the stem color stored in the stem file + + + + + this stem color is also used for the waveform of this stem + + + + + Stem Mute + + + + + Toggle the stem mute/unmuted + + + + + Stem Volume Knob + + + + + Adjusts the volume of the stem + + + + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. - + Channel Peak Indicator @@ -13978,143 +14509,143 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Right click hotcues to edit their labels and colors. - + Right click anywhere else to show the time at that point. - + Channel L Peak Indicator - + Indicates when the left signal on the channel is clipping, - + Channel R Peak Indicator - + Indicates when the right signal on the channel is clipping, - + Channel L Volume Meter - + Shows the current channel volume for the left channel. - + Channel R Volume Meter - + Shows the current channel volume for the right channel. - + Microphone Peak Indicator - + Indicates when the signal on the microphone is clipping, - + Sampler Volume Meter - + Shows the current sampler volume. - + Sampler Peak Indicator - + Indicates when the signal on the sampler is clipping, - + Preview Deck Volume Meter - + Shows the current Preview Deck volume. - + Preview Deck Peak Indicator - + Indicates when the signal on the Preview Deck is clipping, - + Maximize Library - + Microphone Talkover Ducking Strength - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14129,215 +14660,225 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Main Channel R Volume Meter - + (while stopped) - + Cue - + Headphone - + Mute - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator - + If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). @@ -14347,289 +14888,284 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Change the crossfader curve in Preferences -> Crossfader - + Crossfader Orientation - + Set the channel's crossfader orientation. - + Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - + Activate Vinyl Control from the Menu -> Options. - + Displays the current musical key of the loaded track after pitch shifting. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - - Hint: Change the default cue mode in Preferences -> Interface. - - - - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -14637,12 +15173,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -14650,33 +15186,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - Overwrite Existing File? + + Replace Existing File? - - "%1" already exists, overwrite? + + "%1" already exists, replace? - - &Overwrite + + &Replace - - Over&write All + + Apply to all files @@ -14685,12 +15221,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - - Skip &All - - - - + Export Error @@ -14698,7 +15229,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportWizard - + Export Track Files To @@ -14706,23 +15237,23 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportWorker - - + + Export process was canceled - + Error removing file %1: %2. Stopping. - + Error exporting track %1 to %2: %3. Stopping. - + Error exporting tracks @@ -14730,23 +15261,23 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TraktorFeature - - + + Traktor - + (loading) Traktor - + Error Loading Traktor Library - + There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. @@ -14862,47 +15393,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -14925,7 +15456,7 @@ This can not be undone! - + Save snapshot @@ -15026,407 +15557,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... + + + + + Search for tracks in the current library view - - Export the library to the Engine Prime format + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library - + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen - + Display Mixxx using the full screen - + &Options - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application - + Help translate this application into your language. - + &About - + About the application @@ -15434,25 +15996,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15461,25 +16023,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - - - - + Search noun - + Clear input @@ -15490,169 +16040,163 @@ This can not be undone! - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history - - - - - Esc + + in search history - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key चाभी - + harmonic with %1 - + BPM बीपीएम - + between %1 and %2 - + Artist कलाकार - + Album Artist एलबम कलाकार - + Composer संगीतकार - + Title शीर्षक - + Album एल्बम - + Grouping समूहीकरण - + Year साल - + Genre शैली - + Directory - + &Search selected @@ -15660,594 +16204,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist - + Crates संदूक - + Metadata - + Update external collections - + Cover Art कवर आर्ट - + Adjust BPM - + Select Color रंग चुनें - - + + Analyze विश्लेषण - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) स्वत: डीजे के पंक्ति में जोड़ें (सब से नीचे) - + Add to Auto DJ Queue (top) स्वत: डीजे के पंक्ति में जोड़ें (सब से ऊपर) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove हटाएं - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser फ़ाइल ब्राउज़र में खोलें - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating रेटिंग - + Cue Point - + + Hotcues - + Intro - + Outro - + Key चाभी - + ReplayGain - + Waveform - + Comment टिप्पणी - + All - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 डेक %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist नई प्लेलिस्ट बनाएं - + Enter name for new playlist: नई प्लेलिस्ट के लिए नाम दर्ज करें: - + New Playlist नई प्लेलिस्ट - - - + + + Playlist Creation Failed प्लेलिस्ट निर्माण विफल रहा - + A playlist by that name already exists. उस नाम की एक प्लेलिस्ट पहले से मौजूद है। - + A playlist cannot have a blank name. एक प्लेलिस्ट में एक खाली नाम नहीं हो सकता। - + An unknown error occurred while creating playlist: प्लेलिस्ट बनाते समय एक अज्ञात त्रुटि हुई: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) %n ट्रैक(स) का रंग बदला जा रहा हैट्रैक(स) का रंग बदला जा रहा है - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel रद्द करें - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + + Don't show again during this session + + + + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16260,40 +16835,78 @@ This can not be undone! + + WTrackStemMenu + + + Load for stem mixing + + + + + Load pre-mixed stereo track + + + + + Load the "%1" stem + + + + + Load multiple stem into a stereo deck + + + + + Select stems to load + + + + + Release "CTRL" to load the current selection + + + + + Use "CTRL" to select multiple stems + + + WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16301,60 +16914,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16365,67 +16983,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse - + Export directory - + Database version - + Export निर्यात करें - + Cancel रद्द करें - - Export Library to Engine Prime - लाइब्रेरी को इंजन प्राइम में निर्यात करें + + Export Library to Engine DJ + "Engine DJ" must not be translated + - + Export Library To लाइब्रेरी को निर्यात करें - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16443,31 +17072,36 @@ Click OK to exit. + + mixxx::EnginePrimeExportJob + + + Failed to export track %1 - %2: +%3 + %1 is the artist %2 is the title and %3 is the original error message + + + mixxx::LibraryExporter - + Export Completed निर्यात सफल हुआ - - Exported %1 track(s) and %2 crate(s). - %1 ट्रैक(स) और %2 क्रेट(स) का सफल निर्यात हुआ + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed निर्यात असफल - - - Export failed: %1 - निर्यात असफल: %1 - - Exporting to Engine Prime... + Exporting to Engine DJ... @@ -16479,69 +17113,6 @@ Click OK to exit. रद्द करें - - mixxx::hid::DeviceCategory - - - HID Interface %1: - - - - - Generic HID Pointer - - - - - Generic HID Mouse - - - - - Generic HID Joystick - - - - - Generic HID Game Pad - - - - - Generic HID Keyboard - - - - - Generic HID Keypad - - - - - Generic HID Multi-axis Controller - - - - - Unknown HID Desktop Device: - - - - - Apple HID Infrared Control - - - - - Unknown Apple HID Device: - - - - - Unknown HID Device: - - - mixxx::network::WebTask diff --git a/res/translations/mixxx_hu.qm b/res/translations/mixxx_hu.qm index f1d1eb984763a2a4db89c611042356a96000af32..e8771895a34298bec7501943ff3a4d60f56f73f7 100644 GIT binary patch delta 10329 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 delta 7884 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 diff --git a/res/translations/mixxx_hu.ts b/res/translations/mixxx_hu.ts index 8322277bb728..c5691d88cecb 100644 --- a/res/translations/mixxx_hu.ts +++ b/res/translations/mixxx_hu.ts @@ -26,45 +26,45 @@ Enable Auto DJ - + Auto DJ engedélyezése Disable Auto DJ - + Auto DJ letiltása Clear Auto DJ Queue - + Auto DJ-lista ürítése - + Remove Crate as Track Source Rekesz, mint zene forrás eltávoltása - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + Biztosan el akarod távolítani az összes számot az Auto DJ-listából? - + This can not be undone. - + Ezt a műveletet nem lehet visszavonni. - + Add Crate as Track Source Rekesz, mint zene forrás hozzáadása @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Új lejátszólista - + Add to Auto DJ Queue (bottom) Hozzáadás az Auto DJ listához (végére) - + Create New Playlist Új lejátszólista készítése - + Add to Auto DJ Queue (top) Hozzáadás az Auto DJ listához (elejére) - + Remove Eltávolítás @@ -180,12 +180,12 @@ Átnevezés - + Lock Zárolás - + Duplicate Másolat @@ -206,24 +206,24 @@ Teljes lejátszólista elemzése - + Enter new name for playlist: Add meg a lejátszólista új nevét: - + Duplicate Playlist Lejátszólista másolata - - + + Enter name for new playlist: Add meg az új lejátszólista nevét: - + Export Playlist Lejátszólista exportálása @@ -233,70 +233,77 @@ Hozzáadás az Auto DJ listához (csere) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Lejátszólista átnevezése - - + + Renaming Playlist Failed Lejátszólista átnevezése sikertelen - - - + + + A playlist by that name already exists. Egy lejátszólista ezzel a névvel már létezik. - - - + + + A playlist cannot have a blank name. A lejátszólista nem tartalmazhat üres helyet. - + _copy //: Appendix to default name when duplicating a playlist _másolás - - - - - - + + + + + + Playlist Creation Failed Lejátszólista készítése sikertelen - - + + An unknown error occurred while creating playlist: Ismeretlen hiba történt a lejátszólista készítésekor: - + Confirm Deletion - + Törlés megerősítése - + Do you really want to delete playlist <b>%1</b>? - + Biztos törölni akarod a(z) <b>„%1”</b> lejátszólistát? - + M3U Playlist (*.m3u) M3U lejátszási lista (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U lejátszási lista (*.m3u);;M3U8 lejátszási lista (*.m3u8);;PLS lejátszási lista (*.pls);;Szöveg CSV (*.csv);;Olvasható szöveg (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Időbélyeg @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nem lehet a számot betölteni. @@ -325,140 +332,145 @@ BaseTrackTableModel - + Album Album - + Album Artist Album Előadó - + Artist Előadó - + Bitrate Bitráta - + BPM BPM - + Channels Csatornák - + Color Szín - + Comment Megjegyzés - + Composer Szerző - + Cover Art Borító - + Date Added Hozzáadás dátuma - + Last Played - + Legutóbb játszott - + Duration Időtartam - + Type Típus - + Genre Műfaj - + Grouping Csoportosítás - + Key Hangnem - + Location Hely - + + Overview + Áttekintés + + + Preview Előnézet - + Rating Értékelés - + ReplayGain Visszajátszás hangerősítése - + Samplerate Mintavételezési frekvencia - + Played Játszott - + Title Cím - + Track # Zeneszám # - + Year Év - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk - + Kép betöltése... @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Hozzáadás gyorshivatkozásokhoz - + Remove from Quick Links Eltávolítás a gyorshivatkozások közül - + Add to Library Hozzáadás könyvtárhoz - + Refresh directory tree - + Quick Links Gyors Linkek - - + + Devices Eszközök - + Removable Devices Cserélhető eszközök - - + + Computer Számítógép - + Music Directory Added Zenei könyvtár hozzáadva - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Hozzáadtál egy vagy több zenei könyvtárat. A zeneszámok ezekben a könyvtárakban nem lesznek elérhetők, amíg újra nem olvastatod a könyvtáraidat. Szeretnéd most újraolvastatni? - + Scan Beolvasás - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. A "Számítógép" enged navigálni, megnézni és betölteni számokat a mappákból a merevlemezeden, vagy cserélhető adattárolókból + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -738,7 +760,7 @@ The file '%1' could not be loaded because it contains %2 channels, and only 1 to %3 are supported. - + A(z) „%1” fájlt nem lehet betölteni, mert %2 csatornát tartalmaz, de csak 1-%3 számú csatorna támogatott. @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + A Mixxx egy nyílt forráskódú DJ szoftver. Bővebb információkért lásd: - + Starts Mixxx in full-screen mode Teljes képernyős módban indítja el a Mixxx-et - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Elindítja az Auto DJ-t a Mixxx indításakor. - + Rescans the library when Mixxx is launched. - + Újra átvizsgálja a könyvtárat a Mixxx indításakor. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. [auto|always|never] Színek használata a konzolos kimeneten. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -839,27 +861,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + Felülírja az alkalmazás alapértelmezett GUI stílusát. Lehetséges értékek: %1 + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1041,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Teljes hangerő - + Set to zero volume Nulla hangerő @@ -1072,13 +1099,13 @@ trace - Above + Profiling messages Visszafele görgetés (Cenzúra) gomb - + Headphone listen button Fejhallgató belehallgatás gomb - + Mute button Némítás @@ -1089,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Keverő orientáció (pl. bal, jobb, közép) - + Set mix orientation to left Keverés orientáció beállítása balra - + Set mix orientation to center Keverés orientáció beállítása középre - + Set mix orientation to right Keverés orientáció beállítása jobbra @@ -1148,22 +1175,22 @@ trace - Above + Profiling messages BPM koppintás gomb - + Toggle quantize mode Kvantálási mód kapcsolása - + One-time beat sync (tempo only) Egyszeres ütemigazítás (csak BPM) - + One-time beat sync (phase only) Egyszeres ütemigazítás (csak fázis) - + Toggle keylock mode Hangszín zár kapcsoló @@ -1173,193 +1200,193 @@ trace - Above + Profiling messages Hangszínszabályzók - + Vinyl Control Bakelit vezérlés - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Bakelit vezérlési mód váltása (ABSZ/REL/KONST) - + Pass through external audio into the internal mixer - + Cues Cue pontok - + Cue button Cue gomb - + Set cue point Cue pont beállítása - + Go to cue point Cue pontra ugrás - + Go to cue point and play Cue pontra ugrás és lejátszás - + Go to cue point and stop Cue pontra ugrás és megállítás - + Preview from cue point Előhallgatás cue ponttól - + Cue button (CDJ mode) Cue gomb (CDJ mód) - + Stutter cue - + Hotcues Hotcue pontok - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 Hotcue %1 törlése - + Set hotcue %1 Hotcue %1 beállítása - + Jump to hotcue %1 Ugrás a(z) % 1 hotcue-hoz - + Jump to hotcue %1 and stop Ugrás a(z) hotcue-hoz és stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 Hotcue %1 - + Looping Ismétlés - + Loop In button Ismétlés kezdete gomb - + Loop Out button Ismétlés vége gomb - + Loop Exit button Ismétlésből kilépés gomb - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Ismétlés előre mozgatása %1 ütemmel - + Move loop backward by %1 beats Ismétlés hátra mozgatása %1 ütemmel - + Create %1-beat loop %1 ütem ismétlésének létrehozása - + Create temporary %1-beat loop roll %1 ütem ismétlésének átmeneti létrehozása csúsztatással @@ -1475,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader Hangerő Fader - + Full Volume Teljes hangerő - + Zero Volume Némítás @@ -1504,7 +1531,7 @@ trace - Above + Profiling messages - + Mute Némítás @@ -1515,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1536,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation Tájolás - + Orient Left Balra igazítás - + Orient Center Középre igazítás - + Orient Right Jobbra igazítás @@ -1624,82 +1651,82 @@ trace - Above + Profiling messages Ütemrács mozgatása jobbra - + Adjust Beatgrid Ütemrács igazítása - + Align beatgrid to current position Ütemrács igazítása a jelenlegi pozícióra - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. Ütemrács igazítása másik futó lemezjátszóhoz. - + Quantize Mode Kvantált mód - + Sync Szinkron - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch Hangmagasság vezérlő (nincs hatással a tempóra), középen az eredeti érték - + Pitch Adjust Hangmagasság állítás - + Adjust pitch from speed slider pitch Hangmagasság állítása a sebesség csúszkával - + Match musical key Zenei hangnem illesztése - + Match Key Hangnem illesztése - + Reset Key Hangnem visszaállítása - + Resets key to original Visszaállítja a hangnemet az eredetire @@ -1740,453 +1767,453 @@ trace - Above + Profiling messages Mély EQ - + Toggle Vinyl Control Bakelit vezérlés kapcsolása - + Toggle Vinyl Control (ON/OFF) Bakelit vezérlés kapcsolása (BE/KI) - + Vinyl Control Mode Bakelit vezérlés mód - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck Bakelit vezérlés következő lejátszó - + Single deck mode - Switch vinyl control to next deck Egylejátszós mód - Bakelit vezérlés váltása a következő lejátszóra - + Cue Cue - + Set Cue Cue pont beállítása - + Go-To Cue Cue pontra ugrás - + Go-To Cue And Play Cue pontra ugrás és lejátszás - + Go-To Cue And Stop Cue pontra ugrás és megállítás - + Preview Cue Cue pont előhallgatása - + Cue (CDJ Mode) Cue (CDJ mód) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 Hotcue %1 törlés - + Set Hotcue %1 Hotcue %1 beállítás - + Jump To Hotcue %1 Ugrás a %1 Hotcue - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 Hotcue %1 előnézet - + Loop In Ismétlést kezd - + Loop Out Ismétlést zár - + Loop Exit Ismétlésből kilép - + Reloop/Exit Loop Újraismétlés/kilépés - + Loop Halve Ismétlés felezése - + Loop Double Ismétlés kétszerezése - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Ismétlés mozgatása +%1 ütemmel - + Move Loop -%1 Beats Ismétlés mozgatása -%1 ütemmel - + Loop %1 Beats %1 ütem ismétlése - + Loop Roll %1 Beats %1 ütem ismétlése csúsztatással - + Add to Auto DJ Queue (bottom) Hozzáadás az Auto DJ listához (végére) - + Append the selected track to the Auto DJ Queue A kiválasztott szám hozzáadása az Auto DJ lejátszási listájának végére - + Add to Auto DJ Queue (top) Hozzáadás az Auto DJ listához (elejére) - + Prepend selected track to the Auto DJ Queue A kiválasztott szám hozzáadása az Auto DJ lejátszási listájának elejére - + Load Track Szám betöltése - + Load selected track Kiválasztott szám betöltése - + Load selected track and play Kiválasztott szám betöltése és lejátszás - - + + Record Mix Mix felvétele - + Toggle mix recording Mix felvételének kapcsolása - + Effects Effektek - + Quick Effects Gyors effektek - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect Gyors effekt - + Clear Unit Egység ürítése - + Clear effect unit - + Toggle Unit Egység kapcsolása - + Dry/Wet Száraz/nedves - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob Super potméter - + Next Chain Következő lánc - + Assign - + Hozzárendelés - + Clear - + Törlés - + Clear the current effect - + A jelenlegi effekt törlése - + Toggle - + Toggle the current effect - + Next Következő - + Switch to next effect - + Váltás a következő effektre - + Previous Előző - + Switch to the previous effect - + Váltás az előző effektre - + Next or Previous Következő vagy előző - + Switch to either next or previous effect - - + + Parameter Value Paraméter érték - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Előerősítés - + Gain knob - + Shuffle the content of the Auto DJ queue Az Auto DJ lejátszási lista tartalmának összekeverése. - + Skip the next track in the Auto DJ queue Az Auto DJ lejátszási lista következő számának átugrása - + Auto DJ Toggle Auto DJ kapcsolása - + Toggle Auto DJ On/Off Auto DJ be/kikapcsolása - + Show/hide the microphone & auxiliary section Megmutatja/elrejti a mikrofon és külső bemenet részt - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide Keverő mutatása/rejtése - + Show or hide the mixer. Megmutatja vagy elrejti a keverőt - + Cover Art Show/Hide (Library) Borítókép mutatása/rejtése (Könyvtár) - + Show/hide cover art in the library Megmutatja vagy elrejti a könyvtárban a borítóképet - + Library Maximize/Restore Könyvtár maximalizálása/visszaállítása - + Maximize the track library to take up all the available screen space. Maximalizálja a számkönyvtárat, hogy minden elérhető helyet elfoglaljon a képernyőn. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out - + Hullámforma kicsinyítése @@ -2199,102 +2226,102 @@ trace - Above + Profiling messages Fejhallgató erősítés - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Lejátszási sebesség - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) Hangmagasság (Zenei hangnem) - + Increase Speed Sebesség növelése - + Adjust speed faster (coarse) Sebesség növelése (durva) - + Increase Speed (Fine) Sebesség növelése (finom) - + Adjust speed faster (fine) Sebesség növelése (finom) - + Decrease Speed Sebesség csökkentése - + Adjust speed slower (coarse) Sebesség csökkentése (durva) - + Adjust speed slower (fine) Sebesség csökkentése (finom) - + Temporarily Increase Speed Sebesség növelése átmenetileg - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Sebesség ideiglenes csökkentése - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2368,7 +2395,7 @@ trace - Above + Profiling messages Halve BPM - + BPM felezése @@ -2378,17 +2405,17 @@ trace - Above + Profiling messages 2/3 BPM - + 2/3 BPM Multiply current BPM by 0.666 - + Jelenlegi BPM 0.666-szorosa 3/4 BPM - + 3/4 BPM @@ -2398,7 +2425,7 @@ trace - Above + Profiling messages 4/3 BPM - + 4/3 BPM @@ -2408,7 +2435,7 @@ trace - Above + Profiling messages 3/2 BPM - + 3/2 BPM @@ -2418,7 +2445,7 @@ trace - Above + Profiling messages Double BPM - + BPM duplázása @@ -2446,1041 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed Sebesség - + Decrease Speed (Fine) - + Pitch (Musical Key) Hangmagasság (Zenei hangnem) - + Increase Pitch Hangmagasság növelése - + Increases the pitch by one semitone Hangmagasság növelése félhanggal - + Increase Pitch (Fine) Hangmagasság növelése (finom) - + Increases the pitch by 10 cents - + Decrease Pitch Hangmagasság csökkentése - + Decreases the pitch by one semitone Hangmagasság csökkentése félhanggal - + Decrease Pitch (Fine) Hangmagasság csökkentése (finom) - + Decreases the pitch by 10 cents - + Keylock Hangnemzár - + CUP (Cue + Play) CUP (Cue + Lejátszás) - + Shift cue points earlier Cue pontok igazítása korábbra - + Shift cue points 10 milliseconds earlier Cue pontok igazítása 10 milliszekundummal korábbra - + Shift cue points earlier (fine) Cue pontok igazítása korábbra (finom) - + Shift cue points 1 millisecond earlier Cue pontok igazítása 1 milliszekundummal korábbra - + Shift cue points later Cue pontok igazítása későbbre - + Shift cue points 10 milliseconds later Cue pontok igazítása 10 milliszekundummal későbbre - + Shift cue points later (fine) Cue pontok igazítása későbbre (finom) - + Shift cue points 1 millisecond later Cue pontok igazítása 1 milliszekundummal későbbre - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 Hotcuek %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats Kiválasztott ütemek ismétlése - + Create a beat loop of selected beat size Kiválasztott ütemszámú ismétlés indítása - + Loop Roll Selected Beats Kiválasztott ütemek ismétlése csúsztatással - + Create a rolling beat loop of selected beat size Kiválasztott ütemszámú ismétlés indítása csúsztatással - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats Ütemek ismétlése - + Loop Roll Beats Ütemek ismétlése csúsztatással - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position Ismétlés be/kikapcsolása és ugrás az ismétlés kezdőpontjára, ha az ismétlés a lejátszótű mögött van - + Reloop And Stop Újraismétlés és megállítás - + Enable loop, jump to Loop In point, and stop Ismétlés bekapcsolása, kezdetére ugrás és megállítása - + Halve the loop length Az ismétlés hosszának felezése - + Double the loop length Az ismétlés hosszának duplázása - + Beat Jump / Loop Move Ütemugrás / Ismétlés mozgatása - + Jump / Move Loop Forward %1 Beats Ugorj / Mozgasd az ismétlést %1 ütemmel előre - + Jump / Move Loop Backward %1 Beats Ugorj / Mozgasd az ismétlést %1 ütemmel vissza - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navigáció - + Move up Mozgás fel - + Equivalent to pressing the UP key on the keyboard Megegyezik a FEL billentyűvel - + Move down Mozgás le - + Equivalent to pressing the DOWN key on the keyboard Megegyezik a LE billentyűvel - + Move up/down Fel/le mozgás - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Mozogj függőlegesen mindkét irányba enkóder használatával, mintha a FEL/LE gombokat nyomkodnád - + Scroll Up Tekerés fel - + Equivalent to pressing the PAGE UP key on the keyboard Megegyezik a PAGE UP billentyűvel - + Scroll Down Tekerés le - + Equivalent to pressing the PAGE DOWN key on the keyboard Megegyezik a PAGE DOWN billentyűvel - + Scroll up/down Tekerés fel/le - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Tekerj függőlegesen mindkét irányba enkóder használatával, mintha a PGUP/PGDOWN billentyűket nyomkodnád - + Move left Mozgás balra - + Equivalent to pressing the LEFT key on the keyboard Megegyezik a BAL billentyűvel - + Move right Mozgás jobbra - + Equivalent to pressing the RIGHT key on the keyboard Megegyezik a JOBB billentyűvel - + Move left/right Mozgás balra/jobbra - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Mozogj vízszintesen mindkét irányba enkóder használatával, mintha a BAL/JOBB billentyűket nyomkodnád - + Move focus to right pane Fókusz mozgatása a jobb panelra - + Equivalent to pressing the TAB key on the keyboard Megegyezik a TAB billentyűvel - + Move focus to left pane Fókusz mozgatása a bal panelra - + Equivalent to pressing the SHIFT+TAB key on the keyboard Megegyezik a SHIFT+TAB billentyűkombinációval - + Move focus to right/left pane Fókusz mozgatása a jobb/bal panelra - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Fókusz mozgatása egy panellal jobbra vagy balra, mintha a TAB/SHIFT+TAB billentyűket nyomkodnád - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item Ugrás az utoljára kiválasztott elemhez - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play Szám betöltése és lejátszás - + Add to Auto DJ Queue (replace) Hozzáadás az Auto DJ listához (csere) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button Gyors effekt engedély gomb - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle Mix mód kiválsztás - + Toggle effect unit between D/W and D+W modes - + Next chain preset Következő lánc beállítás - + Previous Chain Előző lánc - + Previous chain preset Előző lánc beállítás - + Next/Previous Chain Következő/előző lánc - + Next or previous chain preset - - + + Show Effect Parameters Effekt paraméterek mutatása - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off Kikrofon ki/be - + Microphone on/off Mikrofon be/ki - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off AUX ki/be - + Auxiliary on/off - + Auto DJ Auto DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface Felhasználói felület - + Samplers Show/Hide Sampler mutat/elrejt - + Show/hide the sampler section Sampler szekció mutat/elrejt - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator Mikrofon és külső bemenetek mutatása/rejtése - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Hanghullámforma zoom - + Waveform Zoom Hanghullámforma zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3595,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Probáld resetelni a controllered - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3664,13 +3713,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Eltávolítás - + Create New Crate Új Rekesz készítése @@ -3680,132 +3729,132 @@ trace - Above + Profiling messages Átnevezés - - + + Lock Zárolás - + Export Crate as Playlist Rekesz exportálása mint lejátszólista - + Export Track Files Zeneszám fájlok exportálása - + Duplicate Másolat - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Rekeszek - - + + Import Crate Rekesz importálása - + Export Crate Rekesz exportálása - + Unlock Feloldás - + An unknown error occurred while creating crate: Egy ismeretlen hiba lépett fel a rekesz készítése közben: - + Rename Crate Rekesz átnevezése - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Rekesz átnevezése sikertelen - + Crate Creation Failed Rekesz elkészítése sikertelen - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U lejátszási lista (*.m3u);;M3U8 lejátszási lista (*.m3u8);;PLS lejátszási lista (*.pls);;Szöveg CSV (*.csv);;Olvasható szöveg (*.txt) - + M3U Playlist (*.m3u) M3U lejátszási lista (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! A Rekeszekkel tudod a zenéidet úgy rendszerezni, ahogy szeretnéd! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Rekesz neve nem lehet üres. - + A crate by that name already exists. Rekesz ezzel a névvel már létezik. @@ -3900,12 +3949,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4024,72 +4073,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Kihagyás - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist Lejátszólista ismétlése - + Determines the duration of the transition - + Seconds - + Auto DJ Fade Modes Full Intro + Outro: @@ -4120,80 +4169,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Auto DJ - + Shuffle Összekeverés - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4416,37 +4465,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4485,17 +4534,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5148,113 +5197,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Nincs - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5267,105 +5316,105 @@ Apply settings and continue? - + Enabled Engedélyezve - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: - + Support: - + Screens preview - + Input Mappings - - + + Search - - + + Add Hozzáadás - - + + Remove Eltávolítás @@ -5380,22 +5429,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5405,28 +5454,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Összes törlése - + Output Mappings @@ -5585,6 +5634,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6195,62 +6254,62 @@ Fogd-és-vidd módszerrel mindig másolhatsz lejátszókat. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. A kiválasztott kinézet mérete nagyobb, mint a képernyőd felbontása. - + Allow screensaver to run Képernyővédő engedése - + Prevent screensaver from running Képernyővédő letiltása - + Prevent screensaver while playing Képernyővédő letiltása lejátszás közben - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Ez a kinézet nem támogat színsémákat - + Information Információ - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7417,173 +7476,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled Letiltva - + Enabled Engedélyezve - + Stereo Sztereó - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error @@ -7601,131 +7659,131 @@ The loudness target is approximate and assumes track pregain and main output lev Zene API - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Kimenet - + Input Bemenet - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay Fő kimenet késleltetése - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7880,27 +7938,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7913,250 +7972,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Alacsony - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High Magas - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - - Enable waveform caching + + Enable waveform caching + + + + + Generate waveforms when analyzing library + + + + + Beat grid opacity - - Generate waveforms when analyzing library + + Scrolling Waveforms - - Beat grid opacity + + + Type - + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8164,47 +8229,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Zene Hardware - + Controllers - + Library Könyvtár - + Interface Felület - + Waveforms - + Mixer Keverő - + Auto DJ Auto DJ - + Decks - + Colors @@ -8239,47 +8304,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Effektek - + Recording Rögzítés - + Beat Detection - + Key Detection - + Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Bakelit vezérlés - + Live Broadcasting Élő közvetítés - + Modplug Decoder @@ -8312,22 +8377,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording - + Recording to file: - + Stop Recording - + %1 MiB written in %2 @@ -8635,284 +8700,284 @@ This can not be undone! Összegzés - + Filetype: Fájltípus: - + BPM: BPM: - + Location: Hely: - + Bitrate: Bitráta: - + Comments Megjegyzések: - + BPM BPM - + Sets the BPM to 75% of the current value. A BPM-et a jelenlegi érték 75%-ára állítja - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. A BPM-et a jelenlegi érték 50%-ára állítja - + Displays the BPM of the selected track. A kiválasztott szám BPM értékét mutatja. - + Track # Zeneszám # - + Album Artist Album Előadó - + Composer Szerző - + Title Cím - + Grouping Csoportosítás - + Key Billentyű - + Year Év - + Artist Előadó - + Album Album - + Genre Műfaj - + ReplayGain: - + Sets the BPM to 200% of the current value. A BPM-et a jelenlegi érték 200%-ára állítja - + Double BPM BPM duplázása - + Halve BPM BPM felezése - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: Időtartam: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color Szín - + Date added: - + Open in File Browser Megnyitás fájlkezelőben - + Samplerate: - + Track BPM: Zene BPM - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Alkalmaz - + &Cancel &Mégsem - + (no color) @@ -9069,7 +9134,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9271,27 +9336,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9435,38 +9500,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. @@ -9474,12 +9539,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9487,18 +9552,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9506,15 +9571,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9525,57 +9590,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9583,62 +9648,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9648,22 +9713,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Lejátszólista importálása - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Lejátszólista típusok - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9710,27 +9775,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9790,18 +9855,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9813,208 +9878,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy A hangeszköz foglalt - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. Kapjon <b>segítséget</b> a Mixxx Wikiből. - - - + + + <b>Exit</b> Mixxx. - + Retry Újra - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Újrakonfigurálás - + Help Súgó - - + + Exit Kilépés - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10030,13 +10136,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Zárolás - - + + Playlists Lejátszólista @@ -10046,32 +10152,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Feloldás - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Megeshet, hogy ki kell hagynod pár számot az előkészített lejátszólistádból, vagy egyéb számokat is be kell fűznöd, hogy fenntartsd a buli energiaszintjét. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Néhány DJ az élő előadása előtt állít össze lejátszási listákat, míg mások szeretik inkább az előadásuk helyszínén összerakni a sajátjaikat. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Új lejátszólista készítése @@ -11563,7 +11695,7 @@ Fully right: end of the effect period - + Deck %1 @@ -11696,7 +11828,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11727,7 +11859,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11860,12 +11992,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11900,42 +12032,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11993,54 +12125,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Lejátszólista - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12175,19 +12307,19 @@ may introduce a 'pumping' effect and/or distortion. Zárolás - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12599,7 +12731,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12781,7 +12913,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Borító @@ -13017,197 +13149,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock Hangnemzár - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Lejátszás - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13445,924 +13577,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters Effekt paraméterek mutatása - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Super potméter - + Next Chain Következő lánc - + Previous Chain Előző lánc - + Next/Previous Chain Következő/előző lánc - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Következő - + Clear Unit Egység ürítése - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit Egység kapcsolása - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Előző - + Switch to the previous effect. - + Next or Previous Következő vagy előző - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Ütemrács igazítása - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. Ütemrács igazítása másik futó lemezjátszóhoz. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14497,33 +14637,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14543,205 +14683,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue Cue - + Headphone Fejhallgató - + Mute Némítás - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust Hangmagasság állítás - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix Mix felvétele - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit Ismétlésből kilép - + Turns the current loop off. - + Slip Mode Csúsztató mód - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14786,254 +14936,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Gyors hátracsévélés - + Fast rewind through the track. - + Fast Forward Gyors előrecsévélés - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Kiadás - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode Bakelit vezérlés mód - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve Ismétlés felezése - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double Ismétlés kétszerezése - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15041,12 +15191,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? A kiválasztott számok benne vannak a következő lejátszólistákban:%1Amennyiben elrejted őket, akkor el lesznek távolítva a listákból. Biztos folytatni akarod? @@ -15054,47 +15204,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15266,47 +15411,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15430,407 +15575,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F - + Create &New Playlist - + Create a new playlist Új lejátszólista létrehozása - + Ctrl+n - + Create New &Crate - + Create a new crate Új rekesz készítése - + Ctrl+Shift+N - - + + &View &Nézet - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. Maximalizálja a számkönyvtárat, hogy minden elérhető helyet elfoglaljon a képernyőn. - + Space Menubar|View|Maximize Library - + &Full Screen &Teljes képernyő - + Display Mixxx using the full screen A Mixxx teljes képernyőben mutatása - + &Options &Opciók - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx Használjon időkódos lemezeket a külső lemezjátszókon a Mixxx vezérléséhez - + Enable Vinyl Control &%1 - + &Record Mix &Mix felvétele - + Record your mix to a file A mix rögzítése fileba - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server Közvetítse a mixeit shoutcast vagy icecast serverre - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences &Testreszabás - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &Súgó - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. A Mixxx felhasználói beállítások könyvtár megnyitása. - + &Translate This Application - + Help translate this application into your language. - + &About - + About the application Az alkalmazásról @@ -15838,25 +16014,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15865,25 +16041,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15894,169 +16058,163 @@ This can not be undone! Keresés... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history - - - - - Esc + + in search history - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Billentyű - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Előadó - + Album Artist Album Előadó - + Composer Szerző - + Title Cím - + Album Album - + Grouping Csoportosítás - + Year Év - + Genre Műfaj - + Directory - + &Search selected @@ -16064,599 +16222,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist Hozzáadás lejátszólistához - + Crates Rekeszek - + Metadata - + Update external collections - + Cover Art Borító - + Adjust BPM - + Select Color - - + + Analyze Elemzés - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Hozzáadás az Auto DJ listához (végére) - + Add to Auto DJ Queue (top) Hozzáadás az Auto DJ listához (elejére) - + Add to Auto DJ Queue (replace) Hozzáadás az Auto DJ listához (csere) - + Preview Deck - + Remove Eltávolítás - + Remove from Playlist Eltávolítás a lejátszólistából - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser Megnyitás fájlkezelőben - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Értékelés - + Cue Point - + + Hotcues Hotcue pontok - + Intro - + Outro - + Key Billentyű - + ReplayGain Visszajátszás hangerősítése - + Waveform - + Comment Megjegyzés - + All Mind - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM BPM zárolása - + Unlock BPM BPM zárolás feloldása - + Double BPM BPM duplázása - + Halve BPM BPM felezése - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Új lejátszólista készítése - + Enter name for new playlist: Add meg az új lejátszólista nevét: - + New Playlist Új lejátszólista - - - + + + Playlist Creation Failed Lejátszólista készítése sikertelen - + A playlist by that name already exists. Egy lejátszólista ezzel a névvel már létezik. - + A playlist cannot have a blank name. A lejátszólista nem tartalmazhat üres helyet. - + An unknown error occurred while creating playlist: Ismeretlen hiba történt a lejátszólista készítésekor: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Mégsem - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. A Track fájl törölve lett a meghajtóról, és kitisztítva a Mixxx adatbázisból. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk Ez a track fájl nem törölhető a meghajtóról - + Remaining Track File(s) Hátralévő Track Fájl(ok) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16672,37 +16856,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16710,37 +16894,37 @@ This can not be undone! WTrackTableView - + Confirm track hide Track elrejtés megerősítése - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? Biztosan el akarod távolítani a kijelölt számokat ebből a lejátszólistából? - + Don't ask again during this session Ne kérdezzen rá többször ebben a munkamenetben - + Confirm track removal @@ -16748,60 +16932,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Oszlop mutatása vagy elrejtése. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Válasszon zene gyűjtemény könyvtárat - + controllers - + Cannot open database Az adatbázis megnyitása nem sikerült - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16812,67 +17001,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Böngészés - + Export directory - + Database version - + Export Exportálás - + Cancel Mégsem - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16893,7 +17093,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16903,23 +17103,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_id.qm b/res/translations/mixxx_id.qm index 63c46250dc8bb5ec66f7cfdd91c4a92157f07895..1e841013b7134479376c80382792d0cac91d2dd6 100644 GIT binary patch delta 376 zcmXBMze@sf7{~GF`{;S<3DFN4L~4n%Ahg2l2SMPF1yV#uMTJ3-5rl-A`7@!Q$sv0b z3W|oxMZ)1EA_y7^ilV8f+LppeKWf(G*n;ootFs#*M~p$mqk!3zdxvtcM(e zhmB6MKlixR>#?jF*+;BFsny8h?~5C@y?hqM5E_a?xemEL9s+Yid!bTFr_gSdrV%#q{dV-b@COaGN#g?$v(_8`E6qs19eYf zj96XCz);7v`3W0+I{6Q)98;~!WEnO&rfToWHf-^XCnwKg3u7t?nEZv!jj3kgWE*xf zrmBd^CG2TT)h(0nu&XovoXo#xYfzPp;wAW2(`Z zyoOUvsY-=ww+GOD467hCi#LRp{SKka-cA0(nGUothAWM!GI#P3u5iY4lV!Nol**#{ z*tnN6Fqkgpvo31~hK@d;OL{W{gQzfHc%L5wLv82e6mCDJ3hl{TxZTC>^DjMT$iSdx z%D>B;g@J)xBNOQPGn)l@l8R(`7@QeO7>XEj7_=GOIDl?pU;|<2lA;`Kx5@MCBsDQq p@C2tO7A0rYxaB987Ne;aVPkM*C}v28o5bu|oD4E%b8+2KZUAPcj_Uvb diff --git a/res/translations/mixxx_id.ts b/res/translations/mixxx_id.ts index 42d1c31e39b5..60ab85e9ed7f 100644 --- a/res/translations/mixxx_id.ts +++ b/res/translations/mixxx_id.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source @@ -147,28 +147,28 @@ BasePlaylistFeature - + New Playlist Playlist Baru - + Add to Auto DJ Queue (bottom) Tambahkan ke Auto DJ (bawah) - + Create New Playlist Buat Playlist Baru - + Add to Auto DJ Queue (top) Tambahkan ke Auto DJ (atas) - + Remove Hapus @@ -178,12 +178,12 @@ Ganti Nama - + Lock Kunci - + Duplicate Duplikasi @@ -204,24 +204,24 @@ Analisa Seluruh Playlist - + Enter new name for playlist: Ganti nama baru untuk Playlist ini: - + Duplicate Playlist Duplikasi Playlist - - + + Enter name for new playlist: Masukkan nama baru untuk Playlist ini: - + Export Playlist Ekspor Playlist @@ -231,70 +231,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Ganti Nama Playlist - - + + Renaming Playlist Failed Ganti Nama Playlist Gagal - - - + + + A playlist by that name already exists. Nama playlist tersebut sudah digunakan - - - + + + A playlist cannot have a blank name. Playlist tidak bisa memiliki nama kosong - + _copy //: Appendix to default name when duplicating a playlist _salin - - - - - - + + + + + + Playlist Creation Failed Pembuatan Playlist Tidak Berhasil - - + + An unknown error occurred while creating playlist: Kesalahan yang tidak diketahui terjadi saat membuat playlist: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Teks CSV (*.csv);;Teks Terbaca (*.txt) @@ -302,12 +309,12 @@ BaseSqlTableModel - + # # - + Timestamp Penanda waktu @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Tidak dapat memuat lagu @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artis dari Album - + Artist Artis - + Bitrate Bitrasi - + BPM DPM - + Channels - + Color - + Comment Komentar - + Composer Penyusun - + Cover Art Gambar - + Date Added Tanggal Ditambahkan - + Last Played - + Duration Durasi - + Type Jenis - + Genre Aliran - + Grouping Kelompok - + Key Kunci - + Location Tempat - + + Overview + + + + Preview Pratinjau - + Rating Penilaian - + ReplayGain - + Samplerate - + Played Dimainkan - + Title Judul - + Track # Lagu # - + Year Tahun - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -541,67 +553,77 @@ BrowseFeature - + Add to Quick Links Tambahkan ke Link Cepat - + Remove from Quick Links Hapus dari Link Cepat - + Add to Library Tambahkan ke Library - + Refresh directory tree - + Quick Links Link Cepat - - + + Devices Perangkat - + Removable Devices Perangkat Removable - - + + Computer - + Music Directory Added Berkas Musik Ditambahkan - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan Pindai - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -747,87 +769,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -837,27 +859,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1039,13 +1066,13 @@ trace - Above + Profiling messages - + Set to full volume buat jadi volume maksimal - + Set to zero volume buat jadi tidak ada volume @@ -1070,13 +1097,13 @@ trace - Above + Profiling messages - + Headphone listen button Tombol dengar headphone - + Mute button Tombol diam @@ -1087,25 +1114,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Orientasi mix (misalnya kiri, tengah, kanan) - + Set mix orientation to left Jadikan orientasi mix ke kiri - + Set mix orientation to center Jadikan orientasi mix ke tengah - + Set mix orientation to right Jadikan orientasi mix ke kanan @@ -1146,22 +1173,22 @@ trace - Above + Profiling messages Tombol sadap BPM - + Toggle quantize mode Mode pengalihan quantisasi - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode Aktifkan mode Keylock @@ -1171,193 +1198,193 @@ trace - Above + Profiling messages Equalizer - + Vinyl Control Kontrol Vinil - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Pengalihan mode penanda kontrol-vinil (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Pengalihan mode kontrol-vinil (ABS/REL/CONST) - + Pass through external audio into the internal mixer Sambungkan Audio eksternal ke Mixer internal - + Cues Penanda - + Cue button Tombol penanda - + Set cue point Atur titik penanda - + Go to cue point Lompat ke titik penanda - + Go to cue point and play Lompat ke titik penanda dan play - + Go to cue point and stop Ke titik penanda dan stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues Penanda Utama - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 Hapus penanda tepat %1 - + Set hotcue %1 - + Jump to hotcue %1 Loncat ke penanda tepat %1 - + Jump to hotcue %1 and stop Loncat ke penanda tepat %1 dan stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping Putaran - + Loop In button Tombol Masuk Putaran - + Loop Out button Tombol Keluar Putaran - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 - + 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop Buat %1-putaran ketukan - + Create temporary %1-beat loop roll @@ -1473,20 +1500,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1502,7 +1529,7 @@ trace - Above + Profiling messages - + Mute @@ -1513,7 +1540,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1534,25 +1561,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1622,82 +1649,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1738,451 +1765,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Tambahkan ke Auto DJ (bawah) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Tambahkan ke Auto DJ (atas) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track Muat lagu yang dipilih - + Load selected track and play Buka trek terpilih dan mainkan - - + + Record Mix - + Toggle mix recording - + Effects Efek - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next - + Switch to next effect - + Previous - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob Tombol tambah - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2197,102 +2224,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2444,1041 +2471,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Mikrofon on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Auto DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface Antarmuka Pengguna - + Samplers Show/Hide - + Show/hide the sampler section Tampilkan/sembunyikan seksi sampler/contoh - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section Tampil/sembunyikan bagian kontrol vinil - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget Tampil/sembunyikan bagian widget vinil - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3593,32 +3642,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3662,13 +3711,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Hapus - + Create New Crate @@ -3678,132 +3727,132 @@ trace - Above + Profiling messages Ganti Nama - - + + Lock Kunci - + Export Crate as Playlist - + Export Track Files - + Duplicate Duplikasi - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Peti - - + + Import Crate Impor Peti - + Export Crate Ekspor Peti - + Unlock Buka Kunci - + An unknown error occurred while creating crate: Kesalahan tidak diketahui terjadi saat membuat peti: - + Rename Crate Ubah nama peti - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Penamaan Peti Gagal - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Teks CSV (*.csv);;Teks Terbaca (*.txt) - + M3U Playlist (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Peti merupakan cara yang baik membantu mengatur musik yang akan di mix. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Peti memberi kebebasan Anda mengatur musik seperti yang diinginkan! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Sebuah peti tidak dapat memiliki nama kosong - + A crate by that name already exists. Sebuah peti dengan nama tersebut sudah ada @@ -3898,12 +3947,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4022,72 +4071,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Detik - + Auto DJ Fade Modes Full Intro + Outro: @@ -4118,80 +4167,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Auto DJ - + Shuffle Acak - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4414,37 +4463,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4483,17 +4532,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5146,113 +5195,113 @@ associated with each key. DlgPrefController - + Apply device settings? Terapkan pengaturan perangkat? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Tidak ada - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5265,105 +5314,105 @@ Apply settings and continue? - + Enabled - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: - + Support: - + Screens preview - + Input Mappings - - + + Search - - + + Add Tambah - - + + Remove Hapus @@ -5378,22 +5427,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5403,28 +5452,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Hapus Semua - + Output Mappings @@ -5583,6 +5632,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6174,62 +6233,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7396,173 +7455,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms - + Configuration error @@ -7580,131 +7638,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output - + Input - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7859,27 +7917,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7892,250 +7951,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate Tingkat bingkai - - Displays which OpenGL version is supported by the current platform. - Menampilkan versi OpenGL yang didukung oleh platform saat ini. + + OpenGL Status + - - Waveform - + + Displays which OpenGL version is supported by the current platform. + Menampilkan versi OpenGL yang didukung oleh platform saat ini. - + Normalize waveform overview - + Average frame rate - + Visual gain Tambah visual - + Default zoom level Waveform zoom - + Displays the actual frame rate. Menampilkan frame rate yang sebenarnya. - + Visual gain of the middle frequencies Tambahan visual suntuk frekuensi tengah - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Rendah - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies Tambahan visual suntuk frekuensi tinggi - + Visual gain of the low frequencies Tambahan visual suntuk frekuensi rendah - + High Tinggi - + Global visual gain Tambahan visual global - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. Sinkronkan tingkat tanjak di semua tampilan bentuk gelombang. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8143,47 +8208,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers - + Library Pustaka - + Interface - + Waveforms - + Mixer Mixer - + Auto DJ Auto DJ - + Decks - + Colors @@ -8218,47 +8283,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efek - + Recording - + Beat Detection - + Key Detection - + Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Kontrol Vinil - + Live Broadcasting - + Modplug Decoder @@ -8291,22 +8356,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording - + Recording to file: - + Stop Recording - + %1 MiB written in %2 @@ -8614,284 +8679,284 @@ This can not be undone! - + Filetype: - + BPM: BPM - + Location: - + Bitrate: - + Comments - + BPM DPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Lagu # - + Album Artist Artis dari Album - + Composer Penyusun - + Title Judul - + Grouping Kelompok - + Key Kunci - + Year Tahun - + Artist Artis - + Album Album - + Genre Aliran - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM - + Clear BPM and Beatgrid Hapus DPM dan Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Buka di Browser Berkas - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply - + &Cancel - + (no color) @@ -9048,7 +9113,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9250,27 +9315,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9414,38 +9479,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. @@ -9453,12 +9518,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9466,18 +9531,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9485,15 +9550,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9504,57 +9569,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9562,62 +9627,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9627,22 +9692,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Impor Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Berkas Daftar putar (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9689,27 +9754,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9769,18 +9834,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9792,208 +9857,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10009,13 +10115,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Kunci - - + + Playlists @@ -10025,32 +10131,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Buka Kunci - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Buat Playlist Baru @@ -11541,7 +11673,7 @@ Fully right: end of the effect period - + Deck %1 Deck %1 @@ -11674,7 +11806,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11705,7 +11837,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11838,12 +11970,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11878,42 +12010,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11971,54 +12103,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12153,19 +12285,19 @@ may introduce a 'pumping' effect and/or distortion. Kunci - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12577,7 +12709,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12759,7 +12891,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Gambar @@ -12995,197 +13127,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13423,924 +13555,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14475,33 +14615,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14521,205 +14661,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone - + Mute - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14764,254 +14914,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15019,12 +15169,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15032,47 +15182,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15244,47 +15389,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15408,407 +15553,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view - + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen - + Display Mixxx using the full screen - + &Options - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application - + Help translate this application into your language. - + &About - + About the application @@ -15816,25 +15992,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15843,25 +16019,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15872,169 +16036,163 @@ This can not be undone! Pencarian... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Kunci - + harmonic with %1 - + BPM DPM - + between %1 and %2 - + Artist Artis - + Album Artist Artis dari Album - + Composer Penyusun - + Title Judul - + Album Album - + Grouping Kelompok - + Year Tahun - + Genre Aliran - + Directory - + &Search selected @@ -16042,599 +16200,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist Tambah ke Daftar Putar - + Crates Peti - + Metadata - + Update external collections - + Cover Art Gambar - + Adjust BPM - + Select Color - - + + Analyze Menganalisis - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Tambahkan ke Auto DJ (bawah) - + Add to Auto DJ Queue (top) Tambahkan ke Auto DJ (atas) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Hapus - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Pengaturan - + Open in File Browser Buka di Browser Berkas - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Penilaian - + Cue Point - + + Hotcues Penanda Utama - + Intro - + Outro - + Key Kunci - + ReplayGain - + Waveform - + Comment Komentar - + All - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Kunci DPM - + Unlock BPM Buka Kunci BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Buat Playlist Baru - + Enter name for new playlist: Masukkan nama baru untuk Playlist ini: - + New Playlist Playlist Baru - - - + + + Playlist Creation Failed Pembuatan Playlist Tidak Berhasil - + A playlist by that name already exists. Nama playlist tersebut sudah digunakan - + A playlist cannot have a blank name. Playlist tidak bisa memiliki nama kosong - + An unknown error occurred while creating playlist: Kesalahan yang tidak diketahui terjadi saat membuat playlist: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16650,37 +16834,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16688,37 +16872,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16726,60 +16910,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Tampilkan atau sembunyikan kolom. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Pilih petunjuk pustaka musik. - + controllers - + Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16790,67 +16979,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Telusuri - + Export directory - + Database version - + Export - + Cancel - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16871,7 +17071,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16881,23 +17081,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_it.qm b/res/translations/mixxx_it.qm index d05328dbf672e5bf73b74ce657be2022b75d2c41..77b46f739d19bfb8ca80c308efa6594f1fd19f96 100644 GIT binary patch delta 26296 zcmX7wbwCwQ5Xa|kcdyx26kWv1{O9Z zc3}H6@%QE4U!S|<#og}g%y(w?@ja@<@tGwS6te}EBBHWHMazTEBpqmMQm&X~k~vlb zs}oahf;EV`6*0-0<-EQok#7K4o2YvTSf8lJaIiVagX6#!BoB!MTarA~1#~BQm=$aV zo&#HxO&;+X2W?0mxeV+?-0v-sJcXF&J|fl{Uw|(G<+FFdAbb(Ng!Lu4bQ3TJU+7N6 zN8$^Qfuo4$?gfq|u6clyaQ!tHi5uAhM&Wykg7a`g_&UDQMsnyX9IVA1)dIJJE5Y3$ zMt~nBd3Y=EGTw+M;}1aGu;@UH$`PpyH(CNbPAnmer~;mJ20j^N%2qIpSc#M1I9$gA zR&GSBJ038H!(M_me_{>1F|rPL0fwY@84U3#5Fg$x9dstS6h5GKMT`Ukr{NqQP$y>u z3V_o|K8G8xkJptBCTa|p!H6}+jhu_dNOvLWd_Hg`p12eEfTXK~G2r;lVt0vbIS198 z>=y=3GRgdBn&fJ{NyQT*&}Jlt7DL}=JxPDlOvn!ZNNzu2hNyRJC&cFpkookVFxiC?e8pQn# z8xCsX09M|`m!zGi!Tuy)8Do+;&o;?hy$5F!zmB=@@|C!!8<QQVe2RD5Tu&v;^OU=wGz5Sx)>8@-8-Hi+5$@7WJV;6mbZ;*M2KD*p9B%-5t`#CMz} zUivceeXU4}y#+obUiK03gCB@j%^-em14-lYnk$^xg=peeTajG56!F{HL@|;{QF9XU zj4C9j`4N9L6;pkN_`B+4V;4IU|FD7BMO^%F2QQdol9j7slGjTk{vAel+n7KwV8A`edzjUq6@xZb)0<{s|{<$rrgc+|oC zmp_(sfcacxl10BU$!`oH(GEkNp_vqu^MGH89<(zlrZ|x3h7tMI-K3m8hD4uPr1U>b zqF)LrSfZl;DU#BPkQh0O=w&C9Voo6vV`4C6y-CcpZ6Mw&l0GNh>swu;$%{u z+QKAz>qcUQJMsQCNF-#FRAh}wx#S2EYl)BrXq>seThnKBVo%qs6E=eAU(qcoU{35P4e`@Bz{NYg^%s5z0oA=cG=Eh z&FvhAp~vf#w(CgQ7*5i_W~9JI*y@XKH5<3;h%_x6{S2A zuM<l~;;X1R3 z_ijmrV`25jS5UE55hTv{qLS{@HmqOs#N|@x;JK1^l7Bzgu zh;}+rlhmnrLSJfAJAt_Rg4!&JA!ThH@~DJmT&##m8@cu~59IrcO){?wcKVI6bNG5Y zV_fWvoo45f`z95S(d6-80pg2#lV`up#B)s~ugWmm5#3D+vY1qSJCRo%_?X7!z~v<5 zqU2RK)<#lH|C|F-dK@IL;2@&nQFeC58*nbY9AT36+-~QHE95n#D`LS>@FcOepUG?X zY?5%z>mY2X#CP&K1UKAxA$gs{4V8AIwhQ3x%C(|)mi0t4iOha^=Zf8volhW-nCRuP^JHvcUDqdBn{Srh*pZwH*4PtyRf9fET z;YknK`7F~UD;Pi>eNPj!B->eVHFdQ4&nG1?h&mpRCh>t&$B*#{Fd@`=HlFO&dFp&1 znxr+`sPm;G#NGQ)mtJr{ci&T&expd~^N6|(+CuV!)6~`BB+WHl5E{x#S-s&hJ1}U;yzu-_xw$gc4gYRZz6RsQ5sKl zkGfC22~X)w-Dm&9GR;TbkERe0Y){=U#v@wpG0D0#u=8pV_2?f%Jh&G5^~cmUJxYE9 z;U%3D$#3u;l8WCm$%m)f$ZvBpzOWMcogPNwkwN|zXL!7tcGi~c^x0!leyo^e-TK-Y z+R)Cir|pbwYv+=+cE)KYm9}_&-z0dx-sC^(A@OH3$bZIiV%=#=SH^^Ag4@_9i$r(;CC0;yL;c((CVsn-((o{eRx*KZit(lXS$1!DTbrqt(4 zHVMy76kG>S+IcYr2ZazVcuRf#&yduA67_{^rXnAx@8wY92i8;nYVnBw`Crf=SgR6K zl!o?A2ItYxg(pa<`HDiPts=QiX$n2j1cKux4d48jXiP2|>l00K{D9xYJ__oQk)BhmR`9Rv4jybgsq~r@ZI>4Xy?MNaab)W;$ z#fbG(?HsWX%$d3gbZ~kAQOZ#|c)K=M&2Bn0Ad^_v-E?>xK4)toI#JDyq^-Z`w5>rH zvB(2-&KG*m{R^ENTOaFtJDtmdQ916W^An+Xmb9kSu28OrG)f%_e~@yXQkNipmncY= z<}Dz3<0rbb5sqcrIJ!0k#`>ffr8{8?LVPHF?UN&OH z*80(_{-=o#9!syrIg|8iCB5yuh3K&dy&a!TO1;AL_DFtW&o|OLb4nl3r(`&ukRJ4T z1TwFpYi;y33`0IDhQ2LAlseOZzGYq_c}x)f*U}9-UC^(hP&Knk(4U+eTXuy0oXjF= z=~VjL22bd)oU%WM;>HKjzr9Fez1B%|wkGj4mnA7Qo4AvwBt6O?QEk1%!l3^{f7m&$ zp(H9g5N)+hlhoUUEa$tV4J}Rl>ReErCM*XYEF<;_s&$3T27Se)eIxbI&4xt+DWSCcLBQMq13o4 zmi2)eQsd3lNKtP~jrUhV{y)bmHO_d5b^car{M3n9qZ3k-7Os%kd88)CVn}+BBDI_e ztJM;vR!#`3@wuedO)$r=`$?@IClg(sE46-_!!J^Y5iq`sBz4(&9m;sF)IBkrlm!JP zzxLITFMO4H`rRdEa9$~(0BojIZmD;In~lWe22x;98YxlRq`*WclG}PqeIEHkE_arK zszsCNdPWM0zChC85mNBUE+pToEcIQA>lgn?1KNBc*7>6}U`-hDC%dG9vm%lEjgto6 zizYVljWlRLO;YlFm42O)TG)6z8f^MBhIo zRX-!yej@?BP*9rOC5^<%C(`6q2yWMEOH*7i75Z>#nk}#>DKnl(GfIJdT1qn!dgZI> zQuHx6h)O4=`LPv9E_Og#FzzQQxz3XQ zHIh6RfDzyiX+PFIiytbbG+KpX)_EzV4QwlFzI5g^YCuOfQa>#tx&BA#f^!X`o;9V5`w?#4`bcT7=aY0kTDr0kp3$wTbmjO}l5BaT zt933C?cZTi^qnSMZRASwvSrfMEM(A=Mo8D>a-_Iik*AKnyp3q53mueE5 z)j~=Sf`7STTOy?gClM=@S4#g8K%(vw>6XhLVzX~bw{}O6nC>Ip9k`g}8nMz{q)ZgD zT)MZaAjz$VN*Uxt?D1?VqY@m+%68I&hCN6bAxRH+BiIZmCuJUn5pEnMJu83_w6v98 z-71I&NReKLVU_qFv(wgZne?%`50T4L>Em)NvtPNT&(AP)1qw+&`ohXFr21%W}DFN?#)5fn4@v9g+r3l%0DtC)(sDm*0UK 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%0Dl46~-!bmEWy!Esqw@_p{_(dyTDv;zC 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 A+yDRo diff --git a/res/translations/mixxx_it.ts b/res/translations/mixxx_it.ts index 75bd2bcbb6a5..fe1b0c0cd9e3 100644 --- a/res/translations/mixxx_it.ts +++ b/res/translations/mixxx_it.ts @@ -26,17 +26,17 @@ Enable Auto DJ - + Attiva Auto DJ Disable Auto DJ - + Disattiva Auto DJ Clear Auto DJ Queue - + Pulisci Coda Auto DJ @@ -51,17 +51,17 @@ Confirmation Clear - + Conferma rimozione Do you really want to remove all tracks from the Auto DJ queue? - + Vuoi rimuovere tutte le tracce dalla coda dell'Auto DJ? This can not be undone. - + Non può essere annullato. @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nuova Playlist @@ -160,7 +160,7 @@ - + Create New Playlist Crea Nuova Playlist @@ -190,113 +190,120 @@ Duplica - - + + Import Playlist Importa Playlist - + Export Track Files Esporta Files Tracce - + Analyze entire Playlist Analizza l'intera Playlist - + Enter new name for playlist: Inserisci il nuovo nome per la playlist: - + Duplicate Playlist Duplica Playlist - - + + Enter name for new playlist: Inserisci il nome per la playlist: - - + + Export Playlist Esporta Playlist - + Add to Auto DJ Queue (replace) Aggiungi a Auto DJ (sostituisce) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Rinomina Playlist - - + + Renaming Playlist Failed Errore nel rinominare la Playlist - - - + + + A playlist by that name already exists. Esiste già una playlist con questo nome. - - - + + + A playlist cannot have a blank name. Il nome della playlist non può essere vuoto. - + _copy //: Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Creazione della Playlist non Riuscita - - + + An unknown error occurred while creating playlist: Errore sconosciuto durante la creazione della playlist: - + Confirm Deletion Conferma Cancellazione - + Do you really want to delete playlist <b>%1</b>? Sei davvero sicuro di voler cancellare la playlist <b>%1</b>? - + M3U Playlist (*.m3u) Playlist M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Testo CSV (*.csv);;File testuale (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Marca temporale @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Impossibile caricare la traccia. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artista Album - + Artist Artista - + Bitrate Bitrate - + BPM BPM - + Channels Canali - + Color Colore - + Comment Commento - + Composer Autore - + Cover Art Immagine Copertina - + Date Added Data di Importazione - + Last Played Ultima Riproduzione - + Duration Durata - + Type Tipo - + Genre Genere - + Grouping Gruppo - + Key Chiave - + Location Posizione - + Overview - + Preview Anteprima - + Rating Voto - + ReplayGain ReplayGain - + Samplerate Frequenza di campionamento - + Played Riprodotta - + Title Titolo - + Track # Traccia # - + Year Anno - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Recupero immagine ... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computer" permette di navigare, vedere, e caricare tracce da cartelle sul tuo hard disk o dispositivi esterni. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3527,7 +3544,7 @@ traccia - Come sopra + Messaggi di profilazione Unknown - + Sconosciuto @@ -3632,32 +3649,32 @@ traccia - Come sopra + Messaggi di profilazione ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. La funzionalità fornita da questo mapping controller sarà disabilitata fino a che il problema non sarà risolto. - + You can ignore this error for this session but you may experience erratic behavior. Puoi ignorare questo errore per questa sessione ma puoi incontrare comportamenti incoerenti. - + Try to recover by resetting your controller. Tenta il ripristino tramite la reimpostazione ai valori predefiniti del tuo controller. - + Controller Mapping Error Errore Mappatura Controller - + The mapping for your controller "%1" is not working properly. La mappatura per il tuo controller "%1" non funziona correttamente. - + The script code needs to be fixed. Il codice dello script deve essere riparato. @@ -3765,7 +3782,7 @@ traccia - Come sopra + Messaggi di profilazione Importa il Contenitore - + Export Crate Esporta il Contenitore @@ -3775,7 +3792,7 @@ traccia - Come sopra + Messaggi di profilazione Sblocca - + An unknown error occurred while creating crate: Si è verificato un errore sconosciuto durante la creazione del contenitore: @@ -3801,17 +3818,17 @@ traccia - Come sopra + Messaggi di profilazione Impossibile Rinominare il Contenitore - + Crate Creation Failed Impossibile Creare il Contenitore - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Testo CSV (*.csv);;File testuale (*.txt) - + M3U Playlist (*.m3u) Playlist M3U (*.m3u) @@ -3914,7 +3931,7 @@ traccia - Come sopra + Messaggi di profilazione Mixxx %1.%2 Development Team - + Mixxx %1.%2 Development Team @@ -3937,12 +3954,12 @@ traccia - Come sopra + Messaggi di profilazione Collaboratori passati - + Official Website Sito Ufficiale - + Donate Dona @@ -3998,7 +4015,7 @@ traccia - Come sopra + Messaggi di profilazione - + Analyze Analizza @@ -4043,17 +4060,17 @@ traccia - Come sopra + Messaggi di profilazione Rileva chiave, ReplayGain e beat sulle tracce selezionate. Non genera forme d'onda per le tracce selezionate per risparmiare spazio su disco. - + Stop Analysis Arresta l'analisi - + Analyzing %1% %2/%3 Analisi %1% %2/%3 - + Analyzing %1/%2 Analisi %1/%2 @@ -4307,7 +4324,7 @@ Spesso si avrà un buon risultato con tracce a ritmo costante, non funzionerà b Disabled - + Disattivato @@ -4469,37 +4486,37 @@ Spesso si avrà un buon risultato con tracce a ritmo costante, non funzionerà b Se la mappatura non sta funzionando, prova ad abilitare un opzione avanzata fra le seguenti e prova nuovamente il controllo. Oppure clicca Riprova per rilevare nuovamente il controllo midi. - + Didn't get any midi messages. Please try again. Non ho ricevuto nessun messaggio midi. Riprova. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Impossibile rilevare una mappatura -- riprova. Assicurati di toccare solo un controllo alla volta. - + Successfully mapped control: Controllo mappato con successo: - + <i>Ready to learn %1</i> <i>Pronto ad imparare %1</i> - + Learning: %1. Now move a control on your controller. Imparando: %1. Ora muovi un controllo sul tuo controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5205,114 +5222,114 @@ associated with each key. DlgPrefController - + Apply device settings? Applicare le impostazioni della periferica? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? La configurazione deve essere applicata prima di iniziare l'auto apprendimento. Applicare la configurazione e continuare? - + None Nessuno/a - + %1 by %2 %1 da %2 - + Mapping has been edited La mappatura è stata modificata - + Always overwrite during this session Sovrascrivi sempre durante questa sessione - + Save As Salva come - + Overwrite Sovrascrivi - + Save user mapping Salva mappatura utente - + Enter the name for saving the mapping to the user folder. Digita il nome per salvare la mappatura nella cartella utente. - + Saving mapping failed Salvataggio mappatura fallito - + A mapping cannot have a blank name and may not contain special characters. Una mappatura non può avere un nome nullo e non deve contenere caratteri speciali. - + A mapping file with that name already exists. Un file mappatura con lo stesso nome esiste già. - + Do you want to save the changes? Vuoi salvare le modifiche? - + Troubleshooting Risoluzione dei problemi - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>ISe si utilizza questa mappatura, il controller potrebbe non funzionare correttamente. Selezionare un'altra mappatura o disabilitare il controller.</b></font><br><br>Questa mappatura è stata progettata per un nuovo motore di controllo Mixxx e non può essere utilizzata nell'installazione corrente di Mixxx.<br>L'installazione di Mixxx ha Controller Engine versione %1. Questa mappatura richiede una versione del motore di controllo >= %2.<br><br>Per maggiori informazioni visita la pagina wiki su <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. La mappatura esiste già. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> esiste già nella cartella mappatura dell'utente.<br>Sovrascrivo o salvo con un nuovo nome? - + Clear Input Mappings Elimina le Mappature di Ingresso - + Are you sure you want to clear all input mappings? Sei sicuro di voler eliminare tutte le mappature di ingresso? - + Clear Output Mappings Elimina le Mappature di Uscita - + Are you sure you want to clear all output mappings? Sei sicuro di voler eliminare tutte le mappature di uscita? @@ -5332,7 +5349,7 @@ Applicare la configurazione e continuare? Device Info - + Info del dispositivo @@ -5372,7 +5389,7 @@ Applicare la configurazione e continuare? Serial number: - + Numero seriale: @@ -5643,6 +5660,16 @@ Applicare la configurazione e continuare? Multi-Sampling Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5656,7 +5683,7 @@ Applicare la configurazione e continuare? Off - + Off @@ -6201,12 +6228,12 @@ Puoi sempre trascinare tracce sullo schermo per clonare un deck. ❯ - + ❮ - + @@ -6257,62 +6284,62 @@ Puoi sempre trascinare tracce sullo schermo per clonare un deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. La dimensione minore della skin selezionata è maggiore della risoluzione del tuo schermo. - + Allow screensaver to run Permette di avviare il salvaschermo - + Prevent screensaver from running Evita l'avvio del salvaschermo - + Prevent screensaver while playing Evita l'avvio del salvaschermo durante la riproduzione - + Disabled Disabilitato - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Questa skin non supporta gli schemi di colore. - + Information Informazione - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx deve essere riavviato prima che le nuove impostazioni di localizzazione, scalatura o multi-sampling abbiano effetto. @@ -6368,7 +6395,7 @@ and allows you to pitch adjust them for harmonic mixing. Disabled - + Disattivato @@ -7481,173 +7508,172 @@ Il target di intensità sonora è approssimativo e presuppone che il pregain del DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Predefinita (ritardo lungo) - + Experimental (no delay) Sperimentale (nessun ritardo) - + Disabled (short delay) Disabilitato (ritardo corto) - + Soundcard Clock Clock Scheda Audio - + Network Clock Clock Rete - + Direct monitor (recording and broadcasting only) Monitor diretto (solo registrazione e trasmissione) - + Disabled Disabilitato - + Enabled Attivato - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Per abilitare lo scheduling Realtime (attualmente disabilitato), vedere il %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. Le %1 liste schede audio e controllori che puoi voler considerare per l'uso con Mixxx. - + Mixxx DJ Hardware Guide Mixxx DJ Guida Hardware - + Information Informazione - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx deve essere riavviato prima che la modifica delle impostazioni di RubberBand multi-thread abbia effetto. - + auto (<= 1024 frames/period) automatico (<= 1024 fotogrammi/periodo) - + 2048 frames/period 2048 fotogrammi/periodo - + 4096 frames/period 4096 fotogrammi/periodo - + Are you sure? Sei sicuro? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. La diffusione di canali stereo in canali mono per l'elaborazione parallela comporta la perdita della compatibilità mono e un'immagine stereo diffusa. Non è consigliabile durante la trasmissione o la registrazione. - + Are you sure you wish to proceed? Si è sicuri di voler procedere? - + No No - + Yes, I know what I am doing Si, sò cosa stò facendo - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Gli inputs microfonici sono fuori tempo nel segnale di registrazione & trasmissione rispetto a quanto senti. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Misura la latenza di round trip e la impone per la Compensazione della Latenza Microfono per allineare la temporizzazione microfono. - - + Refer to the Mixxx User Manual for details. Riferirsi al Manuale Utente Mixxx per dettagli. - + Configured latency has changed. La latenza configurata è cambiata. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Rimisura la latenza di round trip e la impone per la Compensazione della Latenza Microfono per allineare la temporizzazione microfono. - + Realtime scheduling is enabled. Realtime scheduling è abilitato. - + Main output only Solo uscita master - + Main and booth outputs Uscite master e booth - + %1 ms %1 ms - + Configuration error Errore di configurazione @@ -7665,131 +7691,131 @@ Il target di intensità sonora è approssimativo e presuppone che il pregain del API audio - + Sample Rate Frequenza di campionamento - + Audio Buffer Buffer Audio - + Engine Clock Motore Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Usa il clock della scheda audio per le impostazioni dell'ascolto dal vivo e la più bassa latenza.<br>Usa il clock di rete per trasmissione senza ascolto dal vivo. - + Main Mix Mix Principale - + Main Output Mode Modo Uscita Main - + Microphone Monitor Mode Modo Monitor Microfono - + Microphone Latency Compensation Compensazione Latenza Microfono - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Numero Buffer Underflow - + 0 0 - + Keylock/Pitch-Bending Engine Motore KeyLock/Pitch-Bending - + Multi-Soundcard Synchronization Sincronizzazione Schede Audio Multiple - + Output - + Uscita - + Input Ingresso - + System Reported Latency Latenza Sistema Riscontrata - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumenta il tuo buffer audio se il contatore di underflow aumenta oppure se senti dei salti o rumori durante la musica. - + Main Output Delay Ritardo Uscita Master - + Headphone Output Delay Ritardo Uscita Cuffia - + Booth Output Delay Ritardo Uscita Booth - + Dual-threaded Stereo - + Hints and Diagnostics Suggerimenti e Diagnostica - + Downsize your audio buffer to improve Mixxx's responsiveness. Diminuisci il tuo buffer audio per aumentare la responsività di Mixxx - + Query Devices Interroga i dispositivi @@ -8948,7 +8974,7 @@ Spesso si avrà un buon risultato con tracce a ritmo costante, non funzionerà b Tap to Beat - + Premi alla Battuta @@ -9348,27 +9374,27 @@ Spesso si avrà un buon risultato con tracce a ritmo costante, non funzionerà b EngineBuffer - + Soundtouch (faster) Soundtouch (più veloce) - + Rubberband (better) Rubberband (migliore) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (qualità quasi-alta-fedeltà) - + Unknown, using Rubberband (better) Sconosciuto, usando Rubberband (migliore) - + Unknown, using Soundtouch Sconosciuto, utilizzando Soundtouch @@ -9553,12 +9579,12 @@ Spesso si avrà un buon risultato con tracce a ritmo costante, non funzionerà b Change color - + Cambia colore Choose a new color - + Scegli un nuovo colore @@ -9566,32 +9592,32 @@ Spesso si avrà un buon risultato con tracce a ritmo costante, non funzionerà b Browse... - + Cerca... No file selected - + Nessun file selezionato Select a file - + Seleziona un file LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modalità Sicura Attivata - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9603,57 +9629,57 @@ Shown when VuMeter can not be displayed. Please keep supporto OpenGL. - + activate Attiva - + toggle Attiva - + right destra - + left sinistra - + right small destra piccolo - + left small sinistra poco - + up su - + down giù - + up small su poco - + down small giu poco - + Shortcut Scorciatoia da tastiera @@ -9661,37 +9687,37 @@ supporto OpenGL. Library - + This or a parent directory is already in your library. Questa o una cartella superiore è già presente nella tua libreria. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Questa o una cartella elencata non esiste o è inaccessibile. Interrompi l'operazione per evitare incongruenze nella libreria - - + + This directory can not be read. La cartella non può essere letta. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Si è verificato un errore sconosciuto. Interrompi l'operazione per evitare incongruenze nella libreria - + Can't add Directory to Library Non posso aggiungere la Cartella alla Libreria - + Could not add <b>%1</b> to your library. %2 @@ -9700,27 +9726,27 @@ Interrompi l'operazione per evitare incongruenze nella libreria - + Can't remove Directory from Library Non posso rimuovere la Cartella dalla Libreria - + An unknown error occurred. Si è verificato un errore sconosciuto - + This directory does not exist or is inaccessible. La cartella non esiste o non è accessibile. - + Relink Directory Ricollega Cartella - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9732,22 +9758,22 @@ Interrompi l'operazione per evitare incongruenze nella libreria LibraryFeature - + Import Playlist Importa Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) File playlist (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Sovrascrivo File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9901,253 +9927,253 @@ Vuoi veramente sovrascriverlo? MixxxMainWindow - + Sound Device Busy Periferica audio occupata - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Riprova</b> dopo aver chiuso l'altra applicazione o riconnesso la periferica audio - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Riconfigura</b> settaggi dei dispositivi di Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Ottieni <b>Aiuto</b> dal Wiki di Mixxx - - - + + + <b>Exit</b> Mixxx. <b>Uscire</b> da Mixxx - + Retry Riprova - + skin skin - + Allow Mixxx to hide the menu bar? Permetti a Mixxx di nascondere la barra dei menu? - + Hide Always show the menu bar? Nascondi - + Always show Mostra sempre - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barra dei menu di Mixxx è nascosta e può essere attivata/disattivata con una singola pressione del tasto <b>Alt</b> .<br><br>Clicca <b>%1</b> per confermare.<br><br>Clicca <b>%2</b> per non confermare, per esempio se non usi Mixxx con una tastiera.<br><br>Puoi cambiare in ogni momento queste impostazioni da Preferenze -> Interfaccia.<br> - + Ask me again Chiedi nuovamente - - + + Reconfigure Riconfigura - + Help Guida - - + + Exit Esci - - + + Mixxx was unable to open all the configured sound devices. Mixxx non ha potuto aprire tutti i dispositivi musicali configurati. - + Sound Device Error Errore Dispositivo Sound - + <b>Retry</b> after fixing an issue <b>Riprova</b> dopo aver corretto un problema - + No Output Devices Nessun dispositivo di output - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx è stato configurato senza un dispositivo audio di output. L'elaborazione audio sarà disabilitata senza un dispositivo audio configurato. - + <b>Continue</b> without any outputs. <b>Continua</b> senza alcun output - + Continue Continua - + Load track to Deck %1 Carica una traccia dal mazzo %1 - + Deck %1 is currently playing a track. Il mazzo %1 sta correntemente riproducendo una traccia. - + Are you sure you want to load a new track? Sei sicuro di voler caricare una nuova traccia? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Non è stato selezionato nessuno dispositivo di input per il controllo vinile. Prego selezionare prima un dispositivo di controllo di input nel pannello di preferenze hardware. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Nessun dispositivo di input è stato selezionato per il controllo diretto passtrough. Prego selezionare prima un dispositivo di input nel pannello di preferenze hardware. - + There is no input device selected for this microphone. Do you want to select an input device? Non c'è nessun dispositivo di input selezionato per questo microfono. Vuoi selezionare un dispositivo di input? - + There is no input device selected for this auxiliary. Do you want to select an input device? Non c'è nessun dispositivo di input selezionato per questo ausiliare. Vuoi selezionare un dispositivo di input? - + Scan took %1 - + No changes detected. - + Nessun cambiamento rilevato. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Errore nel file della Skin - + The selected skin cannot be loaded. La seguente Skin non può essere caricata. - + OpenGL Direct Rendering Rendering Diretto OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Direct rendering non è abilitato sulla tua macchina.<br><br>Ciò significa che la visualizzazione delle forme d'onda sarà molto<br><b>lento e può impattare sulla tua CPU pesantemente</b>. Aggiorna la tua<br>configurazione per abilitare il direct rendering, or disabilita la visualizzazione<br>della forma d'onda nelle preferenze di Mixxx selezionando<br>"Vuota" come visualizzazione di forma d'onda nella sezione 'Interfaccia'. - - - + + + Confirm Exit Conferma uscita - + A deck is currently playing. Exit Mixxx? Un deck è in riproduzione. Uscire da Mixxx? - + A sampler is currently playing. Exit Mixxx? Un campionamento è attualmente in riproduzione. Uscire da Mixxx? - + The preferences window is still open. La finestra delle Preferenze è ancora aperta. - + Discard any changes and exit Mixxx? Annullare ogni modifica e uscire da Mixxx? @@ -10163,13 +10189,13 @@ Vuoi selezionare un dispositivo di input? PlaylistFeature - + Lock Blocca - - + + Playlists Playlist @@ -10179,32 +10205,58 @@ Vuoi selezionare un dispositivo di input? Mescola Playlist - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Sblocca - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Le playlist sono elenchi ordinati di brani che ti consentono di pianificare i tuoi DJ set. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Potrebbe essere necessario saltare alcune tracce nella playlist preparata o aggiungere alcune tracce diverse per mantenere l'energia del pubblico. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alcuni Djs organizzano le playlist prima della performance live, ma altri preferiscono farle al "volo". - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quando usi una playlist durante una esibizione Live Dj, ricordati sempre di prestare molta attenzione a come il tuo pubblico reagisce alla musica da eseguire che hai selezionato. - + Create New Playlist Crea Nuova Playlist @@ -10542,7 +10594,7 @@ Vuoi scansionare la tua libreria per cercare i file di copertina adesso? Encoder - + Encoder @@ -10883,7 +10935,7 @@ Con larghezza a zero, consente di scorrere manualmente l'intero intervallo The Mixxx Team - + Il Team Mixxx @@ -11868,7 +11920,7 @@ Suggerimento: compensa le voci "chipmunk" o "ringhio"La quantità di amplificazione applicata al segnale audio. Ad alti livelli, il suono sarà più distorto. - + Passthrough Passthrough @@ -12038,12 +12090,12 @@ possono introdurre un effetto di "pompaggio" e/o distorsione.varie - + built-in integrato - + missing mancante @@ -12171,54 +12223,54 @@ possono introdurre un effetto di "pompaggio" e/o distorsione. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Playlist - + Folders Cartelle - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Legge databases esportati dai players Pioneer CDJ / XDJ usando il modo Rekordbox Export.<br/>Rekordbox può esportare solo su USB o dispositivi SD con un file system FAT o HFS.<br/>Mixxx può leggere un database da qualsiasi dispositivo che contiene le cartelle database (<tt>PIONEER</tt> e <tt>Contents</tt>).<br/>Non sono supportati databases Rekordbox che sono stati spostati su un dispositivo esterno usando<br/><i>Preferenze > Avanzate > Gestione Database</i>.<br/><br/>Vengono letti i seguenti dati: - + Hot cues Hot cues - + Loops (only the first loop is currently usable in Mixxx) Loop (solo il primo loop è attualmente utilizzabile in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Verifica la presenza di dispositivi Rekordbox USB / SD collegati (aggiorna) - + Beatgrids Beatgrids - + Memory cues Memoria cues - + (loading) Rekordbox (caricamento) Rekordbox @@ -15279,7 +15331,7 @@ Usalo per modificare solo il segnale modificato (wet) con effetti di EQ e filtro Apply to all files - + Applica a tutti i file @@ -15462,47 +15514,47 @@ Questa azione non può essere annullata! WCueMenuPopup - + Cue number Numero cue - + Cue position Posizione cue - + Edit cue label Modifica etichetta cue - + Label... Etichetta... - + Delete this cue Cancella questa cue - + Toggle this cue type between normal cue and saved loop Alterna questo cue tra il tipo di cue standard ed il loop salvato - + Left-click: Use the old size or the current beatloop size as the loop size Clic-sinistro del mouse: Usa la vecchia dimensione o la dimensione del beatloop corrente come dimensione del loop - + Right-click: Use the current play position as loop end if it is after the cue Clic-destro: Utilizza la posizione di riproduzione corrente come fine loop, se esso è dopo la cue. - + Hotcue #%1 Hotcue #%1 @@ -15627,323 +15679,353 @@ Questa azione non può essere annullata! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + Ctrl+f + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Crea una &Nuova Playlist - + Create a new playlist Crea una nuova playlist - + Ctrl+n Ctrl+n - + Create New &Crate Crea Nuovo &Contenitore - + Create a new crate Crea un nuovo contenitore - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Vista - + Auto-hide menu bar Auto-nascondi la barra del menu - + Auto-hide the main menu bar when it's not used. Auto-nasconde la barra del menu quando non viene usata. - + May not be supported on all skins. Potrebbe non essere supportata su tutte le skin - + Show Skin Settings Menu Mostra Menu Impostazioni Skin - + Show the Skin Settings Menu of the currently selected Skin Mostra Menu Impostazioni Skin della Skin correntemente selezionata - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostra la Sezione Microfono - + Show the microphone section of the Mixxx interface. Mostra la Sezione Microfono dell'interfaccia Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostra la Sezione Controllo Vinile - + Show the vinyl control section of the Mixxx interface. Mosta la sezione Vinyl Control della Interfaccia Mixxx - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostra Anteprima Deck - + Show the preview deck in the Mixxx interface. Mostra l'anteprima del deck nell'interfaccia di Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Mostra Copertina - + Show cover art in the Mixxx interface. Mostra la copertina nell'interfaccia Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Massimizza Libreria - + Maximize the track library to take up all the available screen space. Massimizza la libreria tracce per occupare tutto lo spazio disponibile sullo schermo - + Space Menubar|View|Maximize Library Spazio - + &Full Screen &Schermo intero - + Display Mixxx using the full screen Visualizza Mixxx a schermo intero - + &Options &Opzioni - + &Vinyl Control Controllo &Vinile - + Use timecoded vinyls on external turntables to control Mixxx Usa vinili timecoded su piatti esterni per controllare Mixxx - + Enable Vinyl Control &%1 Abilita Controllo Vinile &%1 - + &Record Mix &Registra il Mixaggio - + Record your mix to a file Registra il tuo Mixaggio su un file - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Abilita Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server Invia i tuoi mix a un server shoutcast o icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Attiva Scorciatoie da Tastiera - + Toggles keyboard shortcuts on or off Alterna le scorciatoie da Tastiera On/Offf - + Ctrl+` Ctrl+` - + &Preferences &Preferenze - + Change Mixxx settings (e.g. playback, MIDI, controls) Cambia le impostazioni di Mixxx (per esempio la riproduzione, i Midi, i controlli) - + &Developer &Sviluppatore - + &Reload Skin Ricarica la Skin - + Reload the skin Ricarica la Skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Strumenti Sviluppa&tori - + Opens the developer tools dialog Apre lo strumento dialogo sviluppatore - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Statistiche: Cassetto &Esperimento - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Abilita il modo esperimento. Colleziona statistiche nel cassetto di tracciamento esperimento. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Statistiche: Cassetto &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Abilita Modo Base. Colleziona statistiche nel cassetto tracciamento Base - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Deb&ugger Abilitato - + Enables the debugger during skin parsing Abilita il debugger durante l'analisi skin - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Aiuto - + Show Keywheel menu title Mostra ruota di chiave @@ -15960,74 +16042,74 @@ Questa azione non può essere annullata! Esporta la libreria nel formato Engine DJ - + Show keywheel tooltip text Mostra ruota di chiave - + F12 Menubar|View|Show Keywheel F12 - + &Community Support Supporto della &comunità - + Get help with Mixxx Ottieni dell'aiuto con Mixxx - + &User Manual Manuale &Utente - + Read the Mixxx user manual. Leggi il manuale utente di Mixxx - + &Keyboard Shortcuts Scorciatoie da tastiera - + Speed up your workflow with keyboard shortcuts. Velocizza il tuo flusso di lavoro con le scorciatoie da tastiera. - + &Settings directory Cartella Impostazioni - + Open the Mixxx user settings directory. Apre la directory delle impostazioni utente di Mixxx. - + &Translate This Application &Traduci questa applicazione - + Help translate this application into your language. Aiutaci a tradurre questo programma nella tua lingua. - + &About &Informazioni su - + About the application Informazioni sull'applicazione @@ -16062,25 +16144,13 @@ Questa azione non può essere annullata! WSearchLineEdit - - Clear input - Clear the search bar input field - Cancella l'input - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Cerca - + Clear input Cancella l'input @@ -16091,93 +16161,87 @@ Questa azione non può essere annullata! Cerca... - + Clear the search bar input field Pulisce il campo della barra di ricerca - - Enter a string to search for - Inserisci una stringa da cercare + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Usa operatori come bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Per maggiori informazioni vedi il Manuale Utente > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Scorciatoia da tastiera + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Il centro + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Del + + Additional Shortcuts When Focused: + - Shortcuts - Scorciatoie + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Attiva la ricerca prima del timeout della ricerca-come-tu-scrivi o salta alla visualizzazione dei brani in seguito + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl+Spazio - + Toggle search history Shows/hides the search history entries Attiva/disattiva cronologia ricerche - + Delete or Backspace Cancella o Backspace - - Delete query from history - Cancella query dallo storico - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Esci dalla ricerca + + Delete query from history + Cancella query dallo storico @@ -16740,7 +16804,7 @@ Questa azione non può essere annullata! Okay - + Okay @@ -16933,37 +16997,37 @@ Questa azione non può essere annullata! WTrackTableView - + Confirm track hide Conferma nascondimento traccia - + Are you sure you want to hide the selected tracks? Sei sicuro di voler nascondere le tracce selezionate? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Sei sicuro di voler rimuovere le tracce selezionate dalla coda di AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Sei sicuro di voler rimuovere le tracce selezionate da questo contenitore? - + Are you sure you want to remove the selected tracks from this playlist? Sei sicuro di voler rimuovere i brani selezionati da questa playlist? - + Don't ask again during this session Non chiedere ancora durante questa sessione - + Confirm track removal Conferma rimozione traccia @@ -16984,52 +17048,52 @@ Questa azione non può essere annullata! mixxx::CoreServices - + fonts font - + database database - + effects effetti - + audio interface interfaccia audio - + decks decks - + library libreria - + Choose music library directory Scegli la cartella della tua libreria musicale - + controllers controllers - + Cannot open database Impossibile aprire il database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17043,68 +17107,78 @@ Clicca su OK per uscire. mixxx::DlgLibraryExport - + Entire music library Intera libreria musica - - Selected crates - Contenitori selezionati + + Crates + + + + + Playlists + + + + + Selected crates/playlists + - + Browse Sfoglia - + Export directory Directory esportazione - + Database version Versione database - + Export Esporta - + Cancel Annulla - + Export Library to Engine DJ "Engine DJ" must not be translated Esporta Libreria su Engine DJ - + Export Library To Esporta Libreria Su - + No Export Directory Chosen Nessuna Cartella di Esportazione Selezionata - + No export directory was chosen. Please choose a directory in order to export the music library. Non è stata scelta alcuna directory di esportazione. Si prega di scegliere una directory per esportare la libreria musicale. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Un database esiste già nella directory scelta. Le tracce esportate verranno aggiunte a questo database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Un database esiste già nella directory scelta, ma c'e' stato un problema durante il caricamento. Il successo dell'esportazione non è garantito in questa situazione. @@ -17125,7 +17199,7 @@ Clicca su OK per uscire. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17135,22 +17209,22 @@ Clicca su OK per uscire. mixxx::LibraryExporter - + Export Completed Esportazione Completata - - Exported %1 track(s) and %2 crate(s). - Esportate %1 tracc(ia/e) e %2 contenitore(i). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Esportazione Fallita - + Exporting to Engine DJ... Esportazione a Engine DJ... diff --git a/res/translations/mixxx_ja.qm b/res/translations/mixxx_ja.qm index a33fd58b433bbef0f4e21c4c968f65e8870faf7b..bbb768211200e530b0f14e8ac7475a286476846b 100644 GIT binary patch delta 9550 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 delta 9149 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 BasePlaylistFeature - + New Playlist プレイリストの新規作成 @@ -158,7 +158,7 @@ - + Create New Playlist 新規プレイリストの作成 @@ -188,113 +188,120 @@ 複製 - - + + Import Playlist プレイリストをインポート - + Export Track Files トラックファイルを出力 - + Analyze entire Playlist すべての曲を解析 - + Enter new name for playlist: プレイリストに新しい名前を付ける - + Duplicate Playlist プレイリストを複製する - - + + Enter name for new playlist: 新しいプレイリストの名前 - - + + Export Playlist プレイリストをエクスポート - + Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist プレイリストの名前の変更 - - + + Renaming Playlist Failed プレイリストの名前の変更に失敗 - - - + + + A playlist by that name already exists. 同じ名前のプレイリストが既にあります。 - - - + + + A playlist cannot have a blank name. プレイリストには名前が必要です。 - + _copy //: Appendix to default name when duplicating a playlist コピー(_C) - - - - - - + + + + + + Playlist Creation Failed プレイリストの作成に失敗 - - + + An unknown error occurred while creating playlist: プレイリストの作成中に不明なエラーが発生しました - + Confirm Deletion 削除の確認 - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U プレイリスト (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3Uプレイリスト (*.m3u);;M3U8プレイリスト (*.m3u8);;PLSプレイリスト (*.pls);;CSVファイル(*.csv);;テキストファイル(*.txt);; @@ -302,12 +309,12 @@ BaseSqlTableModel - + # # - + Timestamp 更新日時 @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. トラックを読み込めませんでした @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album アルバム - + Album Artist アルバム アーティスト - + Artist アーティスト - + Bitrate ビットレート - + BPM BPM - + Channels チャンネル - + Color - + Comment コメント - + Composer 作曲者 - + Cover Art カバーアート - + Date Added 追加日時 - + Last Played 最終プレイ - + Duration 長さ - + Type タイプ - + Genre ジャンル - + Grouping グループ - + Key キー - + Location ファイルの場所 - + + Overview + + + + Preview プレビュー - + Rating 評価 - + ReplayGain リプレイゲイン - + Samplerate サンプルレート - + Played 再生回数 - + Title タイトル - + Track # トラック番号 - + Year 発売年 - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk イメージを取得しています @@ -541,67 +553,77 @@ BrowseFeature - + Add to Quick Links クイックリンクに追加 - + Remove from Quick Links クイックリンクから削除 - + Add to Library ライブラリに追加 - + Refresh directory tree - + Quick Links クイックリンク - - + + Devices デバイス - + Removable Devices リムーバブルデバイス - - + + Computer コンピュータ - + Music Directory Added 音楽フォルダを追加しました - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? いくつかの音楽フォルダが登録されました。が、その中にあるファイルは、ライブラリを再スキャンしないと使えません。すぐに再スキャンを行いますか? - + Scan スキャン - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -2352,7 +2374,7 @@ trace - Above + Profiling messages Headphone - + ヘッドホン @@ -3622,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3755,7 +3777,7 @@ trace - Above + Profiling messages レコードボックスのインポート - + Export Crate レコードボックスのエクスポート @@ -3765,7 +3787,7 @@ trace - Above + Profiling messages ロックを解除 - + An unknown error occurred while creating crate: 新しいレコードボックスを作成中にエラーが発生しました @@ -3774,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate レコードボックスの名前を変更 - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3797,17 +3813,17 @@ trace - Above + Profiling messages レコードボックスの名前変更に失敗 - + Crate Creation Failed レコードボックスの作成に失敗 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3Uプレイリスト (*.m3u);;M3U8プレイリスト (*.m3u8);;PLSプレイリスト (*.pls);;CSVファイル(*.csv);;テキストファイル(*.txt);; - + M3U Playlist (*.m3u) M3U プレイリスト (*.m3u) @@ -3816,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. CratesはDJでしたい音楽を整理しやすくするための優れた方法です。 + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3927,12 +3949,12 @@ trace - Above + Profiling messages 過去の開発 - + Official Website - + Donate @@ -4449,37 +4471,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4518,17 +4540,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5181,113 +5203,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None なし - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5618,6 +5640,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6209,62 +6241,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information 通知 - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7431,173 +7463,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) 標準 (遅延 大) - + Experimental (no delay) 試験中 (遅延無し) - + Disabled (short delay) 無効 (遅延 小) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled 無効 - + Enabled 有効 - + Stereo ステレオ - + Mono モノラル - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error 設定エラー @@ -7615,131 +7646,131 @@ The loudness target is approximate and assumes track pregain and main output lev サウンドAPI - + Sample Rate サンプルレート - + Audio Buffer オーディオバッファ - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix メインミックス - + Main Output Mode メイン出力モード - + Microphone Monitor Mode マイクモニターモード - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine キーロック/ピッチベンド エンジン - + Multi-Soundcard Synchronization - + Output 出力 - + Input 入力 - + System Reported Latency システムで検知した遅延 - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay メイン出力 ディレイ - + Headphone Output Delay ヘッドホン出力 ディレイ - + Booth Output Delay ブース出力 ディレイ - + Dual-threaded Stereo - + Hints and Diagnostics ヒントと診断 - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices デバイスを問い合わせる @@ -8185,47 +8216,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware サウンドハードウェア - + Controllers コントローラ - + Library ライブラリ - + Interface インターフェース - + Waveforms 波形 - + Mixer ミキサー - + Auto DJ オートDJ - + Decks デッキ - + Colors カラー @@ -8260,47 +8291,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects エフェクト - + Recording レコーディング - + Beat Detection ビート検出 - + Key Detection キー検出 - + Normalization ノーマライズ - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> <font color='#BB0000'><b>設定ページにエラーがあります。エラーを修正し、変更を適用してください。</b></font> - + Vinyl Control Vinylコントロール - + Live Broadcasting ライブ放送 - + Modplug Decoder Modplugデコーダ @@ -8950,12 +8981,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Title - + タイトル Artist - + アーティスト @@ -8965,7 +8996,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Album Artist - + アルバム アーティスト @@ -9294,27 +9325,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (高速) - + Rubberband (better) Rubberband (高品質) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9357,7 +9388,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist + Title - + アーティスト + タイトル @@ -9367,7 +9398,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist + Album - + アーティスト + アルバム @@ -9385,7 +9416,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist + Title - + アーティスト + タイトル @@ -9395,7 +9426,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist + Album - + アーティスト + アルバム @@ -9413,7 +9444,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist + Title - + アーティスト + タイトル @@ -9423,7 +9454,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist + Album - + アーティスト + アルバム @@ -9529,15 +9560,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9548,57 +9579,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9606,62 +9637,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9671,22 +9702,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist プレイリストをインポート - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) プレイリスト ファイル (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9813,18 +9844,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9836,208 +9867,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy サウンドデバイスがビジーです。 - + <b>Retry</b> after closing the other application or reconnecting a sound device 他のアプリケーションを閉じるかデバイスを再接続した後で<b>リトライ</b>してください。 - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. Mixxxのサウンドデバイス設定を<b>再設定</b>する。 - - + + Get <b>Help</b> from the Mixxx Wiki. Mixxx Wikiで<b>Help</b>を手に入れてください。 - - - + + + <b>Exit</b> Mixxx. Mixxxを<b>終了</b>する。 - + Retry リトライ - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure 再設定 - + Help ヘルプ - - + + Exit 終了 - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue 続行 - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit 終了の確認 - + A deck is currently playing. Exit Mixxx? デッキは現在再生中です。Mixxxを終了しますか? - + A sampler is currently playing. Exit Mixxx? サンプラーは現在再生中です。MIXXXを終了しますか? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10053,13 +10125,13 @@ Do you want to select an input device? PlaylistFeature - + Lock ロックをかける - - + + Playlists プレイリスト @@ -10069,32 +10141,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock ロックを解除 - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist 新規プレイリストの作成 @@ -11588,7 +11686,7 @@ Fully right: end of the effect period - + Deck %1 デッキ %1 @@ -11721,7 +11819,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough パススルー @@ -11752,7 +11850,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11885,12 +11983,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12018,54 +12116,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists プレイリスト - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -14588,7 +14686,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Headphone - + ヘッドホン @@ -15084,12 +15182,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15304,47 +15402,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15469,323 +15567,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist 新しいプレイリストを作成(&N) - + Create a new playlist 新しいプレイリストを作成 - + Ctrl+n Ctrl+n - + Create New &Crate 新しいレコードボックスを作成(&C) - + Create a new crate 新しいレコードボックスを作成 - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View 表示(&V) - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck プレビューデッキを表示 - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art カバーアートを表示 - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library ライブラリを最大化 - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen 全画面表示 (&F) - + Display Mixxx using the full screen Mixxxを全画面表示にする。 - + &Options オプション(&O) - + &Vinyl Control Vinylコントロール(&V) - + Use timecoded vinyls on external turntables to control Mixxx ターンテーブルとタイムコードの記録されているレコードを使用してMixxxを操作する - + Enable Vinyl Control &%1 - + &Record Mix ミックスを録音する (&R) - + Record your mix to a file ミックスをファイルに録音する - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server shoutcastかicecastサーバーを通じてミックスをストリーミング - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` Ctrl+ - + &Preferences 設定(&P) - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled デバッガを有効化(&u) - + Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Shift+D - + &Help ヘルプ(&H) - + Show Keywheel menu title @@ -15802,74 +15930,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel F12 - + &Community Support コミュニティーのサポート(&C) - + Get help with Mixxx - + &User Manual ユーザーマニュアル(_U) - + Read the Mixxx user manual. Mixxxユーザーマニュアルを読む - + &Keyboard Shortcuts キーボードショートカット(&K) - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application このアプリケーションを翻訳(&T) - + Help translate this application into your language. あなたの言語でこのアプリケーションを翻訳するのを手伝ってください。 - + &About このアプリケーションについて(&A) - + About the application このアプリケーションについて @@ -15877,25 +16005,25 @@ This can not be undone! WOverview - + Passthrough パススルー - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15904,25 +16032,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15933,169 +16049,163 @@ This can not be undone! 検索... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history - - - - - Esc + + in search history - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key キー - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist アーティスト - + Album Artist アルバム アーティスト - + Composer 作曲者 - + Title タイトル - + Album アルバム - + Grouping グループ - + Year 発売年 - + Genre ジャンル - + Directory - + &Search selected @@ -16103,625 +16213,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck デッキ - + Sampler サンプラー - + Add to Playlist プレイリストに追加する - + Crates レコードボックス - + Metadata メタデータ - + Update external collections - + Cover Art カバーアート - + Adjust BPM BPMを調整 - + Select Color カラーを選択 - - + + Analyze 解析 - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) オートDJの最後に追加 - + Add to Auto DJ Queue (top) オートDJの先頭に追加 - + Add to Auto DJ Queue (replace) - + Preview Deck プレビューデッキ - + Remove 削除する - + Remove from Playlist - + Remove from Crate - + Hide from Library ライブラリから隠す - + Unhide from Library - + Purge from Library ライブラリから削除 - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating 評価 - + Cue Point - - + + Hotcues ホットキュー - + Intro - + Outro - + Key キー - + ReplayGain リプレイゲイン - + Waveform 波形 - + Comment コメント - + All 全て - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM BPMを固定 - + Unlock BPM BPMの固定を解除 - + Double BPM 2倍 BPM - + Halve BPM 1/2 BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + Shift Beatgrid Half Beat - + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 デッキ %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist 新規プレイリストの作成 - + Enter name for new playlist: 新しいプレイリストの名前 - + New Playlist プレイリストの新規作成 - - - + + + Playlist Creation Failed プレイリストの作成に失敗 - + A playlist by that name already exists. 同じ名前のプレイリストが既にあります。 - + A playlist cannot have a blank name. プレイリストには名前が必要です。 - + An unknown error occurred while creating playlist: プレイリストの作成中に不明なエラーが発生しました - + Add to New Crate 新しいレコードボックスに追加 - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel キャンセル - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close 閉じる - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16731,43 +16841,43 @@ This can not be undone! title - + タイトル WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16775,37 +16885,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16813,12 +16923,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. 列の表示/非表示 - + Shuffle Tracks @@ -16826,52 +16936,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory 音楽ライブラリのディレクトリを選択してください - + controllers - + Cannot open database データベースが開けません。 - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16885,68 +16995,78 @@ OKを押すと終了します。 mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse ブラウザ - + Export directory - + Database version - + Export エクスポート - + Cancel キャンセル - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16967,7 +17087,7 @@ OKを押すと終了します。 mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16977,23 +17097,23 @@ OKを押すと終了します。 mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_ko.qm b/res/translations/mixxx_ko.qm index a1c3a29500c20533a547fea2799b9838c88d967c..3d2ccdab99a12e758f7c7b4d3f840b38ff279e44 100644 GIT binary patch delta 392 zcmXBPPbhb>2-O34xhEO{G5`PYMAzIKDM_Kxf4X;C*k5I zQCB08|3!G|M1mc9J5m1)(N(RM<0SJuBC?ZDk&)MV4qj!D_i&=5*`tMuEX=Ej>RQ-| zj4sA;ZKycRoWx^^PbDRq93fg+Q{sVTq8lRy^bQUqq%S1+)!%a`as~$n@N0OJ&OY&K z4BAsV_e5c&UI=U7h1;?)J&lOT&E2>)1-Ta;rDIa&1G}Y@?1If4kS_laHP=hmcQ`P| zxEei{Ln)nyV)gL`#;xn@fJtqVu71#_y6ts_!h0T89`2!N_FlV8Z4Rc8I xmKEN5Fjc`f<6EM delta 404 zcmXBPPei0~9LMqR_j#VCW|}`ev;CvVnxr9V*_JLPR!oN>)sTot8cqKUWu&pQR5~;i zA2nh%9Y#rMS!SHKMGF*h_lPsL)3LablRoqoM293UT)(&vT}@%Fr@VIU;I+iyr6{& zY|J-^7@9eNtRc#mT7O}fIfwfqpZZyeBnF9oY$)p!t3(&A@ETowfRHiFO?WllauB-7 z#hZ9FJxRZ7@vk`O{BLlNzej3D_%Scsk%j4P%$wajiz{=GzoXqUEd8m$o@J7!;jm6f z*-waA>!foDht?>2;IaLbjw_**_*lnSNsRkoRvV?WdbFr+XSXTYF+(IJg$7ml#V^cQ z5LXBI1&V!u_q8GW`|SdzJ}mPcl+sRKgSYgIqi~e%RE#9NM5#rae|L`P>$C9G1-;C} S)0(q - + Remove Crate as Track Source 트랙 영역에 삭제 - + Auto DJ 자동 디제잉 - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source 트랙 영역에 추가 @@ -148,7 +148,7 @@ BasePlaylistFeature - + New Playlist 새 재생 목록 @@ -159,7 +159,7 @@ - + Create New Playlist 새 재생 목록 만들기 @@ -189,113 +189,120 @@ 복제 - - + + Import Playlist 재생 목록 가져오기 - + Export Track Files 트랙 파일 익스포트 - + Analyze entire Playlist 전체 재생 목록 분석 - + Enter new name for playlist: 새로운 재생 목록의 이름 입력 : - + Duplicate Playlist 재생 목록 복제 - - + + Enter name for new playlist: 새 재생 목록의 이름을 입력하세요: - - + + Export Playlist 재생 목록 내보내기 - + Add to Auto DJ Queue (replace) 자동 디제잉 대기열에 넣기 (교체) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist 재생 목록 이름 변경 - - + + Renaming Playlist Failed 재생 목록 이름 변경 실패 - - - + + + A playlist by that name already exists. 해당 재생 목록 이름은 이미 존재합니다. - - - + + + A playlist cannot have a blank name. 재생 목록은 공백을 이름으로 가질 수 없습니다. - + _copy //: Appendix to default name when duplicating a playlist _복사 - - - - - - + + + + + + Playlist Creation Failed 재생 목록 생성 실패 - - + + An unknown error occurred while creating playlist: 재생 목록을 생성하는 도중에 알 수 없는 에러가 발생했습니다: - + Confirm Deletion 삭제 확인하기 - + Do you really want to delete playlist <b>%1</b>? 플레이리스트 <b>%1</b>를 삭제하시겠습니까? - + M3U Playlist (*.m3u) M3U 재생 목록 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 재생 목록 (*.m3u);;M3U8 재생 목록 (*.m3u8);;PLS 재생 목록 (*.pls);;CSV 텍스트 (*.csv);;일반 텍스트 (*.txt) @@ -303,12 +310,12 @@ BaseSqlTableModel - + # # - + Timestamp 타임 스탬프 @@ -316,7 +323,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 트랙을 불러올 수 없습니다. @@ -324,137 +331,142 @@ BaseTrackTableModel - + Album 앨범 - + Album Artist 앨범 작가 - + Artist 악곡가 - + Bitrate 품질 - + BPM 분당 박자수 - + Channels 채널 - + Color 색상 - + Comment 덛붙임 - + Composer 작곡가 - + Cover Art 인장 - + Date Added 추가된 날짜 - + Last Played 마지막 재생 - + Duration 길이 - + Type 유형 - + Genre 장르 - + Grouping 그룹핑 - + Key - + Location 위치 - + + Overview + + + + Preview 미리 듣기 - + Rating 별점 - + ReplayGain 리플레이 게인 - + Samplerate 샘플레이트 - + Played 재생됨 - + Title 제목 - + Track # 트랙 번호 - + Year 년도 - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -542,67 +554,77 @@ BrowseFeature - + Add to Quick Links 퀵 링크에 추가 - + Remove from Quick Links 퀵 링크에서 제거 - + Add to Library 라이브러리에 추가 - + Refresh directory tree - + Quick Links 퀵 링크 - - + + Devices 장치 - + Removable Devices 이동식 장치 - - + + Computer 컴퓨터 - + Music Directory Added 음악 디렉토리에 추가됨 - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? 하나 이상의 음악 디렉토리를 추가했습니다. 이 디렉토리의 트랙은 라이브러리를 다시 스캔할 때까지 사용할 수 없습니다. 지금 다시 스캔하시겠습니까? - + Scan 스캔 - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "컴퓨터"를 사용하면 하드 디스크 및 외부 장치의 폴더에서 트랙을 탐색, 확인 및 로드할 수 있습니다. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1045,13 +1067,13 @@ trace - Above + Profiling messages - + Set to full volume 음량 최대로 - + Set to zero volume 음량 0으로 @@ -1076,13 +1098,13 @@ trace - Above + Profiling messages 리버스 롤(Censor) 버튼 - + Headphone listen button 헤드폰 듣기 버튼 - + Mute button 음소거 @@ -1093,25 +1115,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) 믹스 방향 (예: 왼쪽, 오른쪽, 가운데) - + Set mix orientation to left 믹스 방향을 왼쪽으로 설정 - + Set mix orientation to center 믹스 방향을 가운데로 설정 - + Set mix orientation to right 믹스 방향을 오른쪽으로 설정 @@ -1152,22 +1174,22 @@ trace - Above + Profiling messages BPM(분당 박자수) 탭 버튼 - + Toggle quantize mode 양자화(quantize) 모드 토글 - + One-time beat sync (tempo only) 1회 비트 싱크 (템포 전용) - + One-time beat sync (phase only) 1회 비트 싱크 (위상 전용) - + Toggle keylock mode 음높이 고정 모드 토글 @@ -1177,193 +1199,193 @@ trace - Above + Profiling messages 이퀄라이저(EQ) - + Vinyl Control 바이닐(Vinyl) 컨트롤 - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) 바이닐 컨트롤 큐잉 모드 토글 (끄기/1회/핫큐) - + Toggle vinyl-control mode (ABS/REL/CONST) 바이닐 컨트롤 모드 토글 (ABS/REL/CONST) - + Pass through external audio into the internal mixer 외부 오디오를 통해 내부 믹서로 전달 - + Cues - + Cue button 큐 버튼 - + Set cue point 큐 포인트 설정 - + Go to cue point 큐 포인트로 이동 - + Go to cue point and play 큐 포인트로 가서 재생 - + Go to cue point and stop 큐 포인트로 가서 정지 - + Preview from cue point 큐 포인트에서 미리보기 - + Cue button (CDJ mode) 큐 버튼 (CDJ 모드) - + Stutter cue 스터터 큐 - + Hotcues 핫큐 - + Set, preview from or jump to hotcue %1 핫큐 %1 에서 미리보기 또는 이동 설정 - + Clear hotcue %1 핫큐 %1 지우기 - + Set hotcue %1 핫큐 %1 설정 - + Jump to hotcue %1 핫큐 %1 으로 이동 - + Jump to hotcue %1 and stop 핫큐 %1 으로 이동 후 정지 - + Jump to hotcue %1 and play 핫큐 %1 으로 이동 후 재생 - + Preview from hotcue %1 핫큐 %1 했을때 미리듣기 - - + + Hotcue %1 핫큐 %1 - + Looping 반복(루핑) - + Loop In button 반복 들어가기 버튼 - + Loop Out button 반복 나오기 버튼 - + Loop Exit button 반복 나가기 버튼 - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats 루프를 %1 비트 앞으로 이동 - + Move loop backward by %1 beats 루프를 %1 비트 뒤로 이동 - + Create %1-beat loop %1-박자 반복 만들기 - + Create temporary %1-beat loop roll %1-박자 반복 롤 설정 @@ -1479,20 +1501,20 @@ trace - Above + Profiling messages - - + + Volume Fader 음량 페이더 - + Full Volume 최고음량 - + Zero Volume 무음량 @@ -1508,7 +1530,7 @@ trace - Above + Profiling messages - + Mute 음소거 @@ -1519,7 +1541,7 @@ trace - Above + Profiling messages - + Headphone Listen 헤드폰으로 듣기 @@ -1540,25 +1562,25 @@ trace - Above + Profiling messages - + Orientation 크로스페이더 위치 - + Orient Left 크로스페이더 왼쪽으로 위치 - + Orient Center 크로스페이더 중앙으로 위치 - + Orient Right 크로스페이더 오른쪽으로 위치 @@ -1628,82 +1650,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key 초기화 키 - + Resets key to original 원상복구 키 @@ -1744,451 +1766,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 핫큐 %1 지우기 - + Set Hotcue %1 핫큐 %1 설정 - + Jump To Hotcue %1 핫큐 %1 으로 이동 - + Jump To Hotcue %1 And Stop 핫큐 %1 으로 이동 후 정지 - + Jump To Hotcue %1 And Play 핫큐 %1 으로 이동 후 재생 - + Preview Hotcue %1 핫큐 %1 했을때 미리듣기 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) 자동 디제잉 대기열에 넣기 (아래로) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) 자동 디제잉 대기열에 넣기 (위로) - + Prepend selected track to the Auto DJ Queue - + Load Track 트랙 불러오기 - + Load selected track 선택한 트랙 불러오기 - + Load selected track and play 선택한 트랙 불러오고 재생 - - + + Record Mix - + Toggle mix recording - + Effects 이펙트 - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next - + Switch to next effect - + Previous - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob 게인 노브 - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2203,102 +2225,102 @@ trace - Above + Profiling messages 헤드폰 게인 - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2450,1053 +2472,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) 자동 디제잉 대기열에 넣기 (교체) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off 마이크 켜기/끄기 - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ 자동 디제잉 - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track 다음 노래로의 전환 발동 - + User Interface 유저 인터페이스 - + Samplers Show/Hide - + Show/hide the sampler section 샘플러 부분 보이기/가리기 - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section 바이닐 컨트롤 부분 보이기/가리기 - + Preview Deck Show/Hide - + Show/hide the preview deck 덱 미리보기 보기/가기리 - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget 회전하는 바이닐 위젯 보이기/가리기 - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3611,32 +3643,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3744,7 +3776,7 @@ trace - Above + Profiling messages 상자 가져오기 - + Export Crate 상자 내보내기 @@ -3754,7 +3786,7 @@ trace - Above + Profiling messages 잠금 해제 - + An unknown error occurred while creating crate: 상자를 만드는 도중 예상치 못한 에러가 발생했습니다: @@ -3763,12 +3795,6 @@ trace - Above + Profiling messages Rename Crate 상자 이름 변경 - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3786,17 +3812,17 @@ trace - Above + Profiling messages 상자 이름 변경 실패 - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 재생 목록 (*.m3u);;M3U8 재생 목록 (*.m3u8);;PLS 재생 목록 (*.pls);;CSV 텍스트 (*.csv);;일반 텍스트 (*.txt) - + M3U Playlist (*.m3u) M3U 재생 목록 (*.m3u) @@ -3805,6 +3831,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. 상자는 디제잉을 위해 음악을 구성하는 좋은 방법입니다. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3916,12 +3948,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4432,37 +4464,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4501,17 +4533,17 @@ You tried to learn: %1,%2 - + Log - + Search 검색 - + Stats @@ -5164,114 +5196,114 @@ associated with each key. DlgPrefController - + Apply device settings? 장치 설정을 적용하시겠습니까? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? 학습 마법사를 시작하기 전에 설정이 적용되어야 합니다. 설정을 적용하고 계속하시겠습니까? - + None 없음 - + %1 by %2 %1 / %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5289,100 +5321,100 @@ Apply settings and continue? 활성화됨 - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: 설명: - + Support: 지원: - + Screens preview - + Input Mappings - - + + Search 검색 - - + + Add 추가 - - + + Remove 지우기 @@ -5402,17 +5434,17 @@ Apply settings and continue? - + Mapping Info - + Author: 저자: - + Name: 이름: @@ -5422,28 +5454,28 @@ Apply settings and continue? 학습 마법사 (MIDI 전용) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All 모두 삭제 - + Output Mappings 출력 맵핑 @@ -5602,6 +5634,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6193,62 +6235,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information 정보 - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7415,173 +7457,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled 활성화됨 - + Stereo 스테레오 - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms - + Configuration error @@ -7599,131 +7640,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output 출력 - + Input 입력 - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -8169,47 +8210,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers - + Library 라이브러리 - + Interface - + Waveforms - + Mixer 믹서 - + Auto DJ 자동 디제잉 - + Decks - + Colors @@ -8244,47 +8285,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects 이펙트 - + Recording - + Beat Detection - + Key Detection - + Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control 바이닐(Vinyl) 컨트롤 - + Live Broadcasting - + Modplug Decoder @@ -8640,284 +8681,284 @@ This can not be undone! - + Filetype: - + BPM: 분당 박자수: - + Location: - + Bitrate: - + Comments - + BPM 분당 박자수 - + Sets the BPM to 75% of the current value. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # 트랙 번호 - + Album Artist 앨범 작가 - + Composer 작곡가 - + Title 제목 - + Grouping 그룹핑 - + Key - + Year 년도 - + Artist 악곡가 - + Album 앨범 - + Genre 장르 - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color 색상 - + Date added: - + Open in File Browser 파일 탐색기에서 열기 - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply - + &Cancel - + (no color) @@ -9074,7 +9115,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9276,27 +9317,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9511,15 +9552,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9530,57 +9571,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut 단축키 @@ -9588,62 +9629,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9653,22 +9694,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist 재생 목록 가져오기 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 재생 목록 파일 (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9715,27 +9756,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9795,18 +9836,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks 빠진 트랙 - + Hidden Tracks 숨은 트랙 - Export to Engine Prime + Export to Engine DJ @@ -9818,208 +9859,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10035,13 +10117,13 @@ Do you want to select an input device? PlaylistFeature - + Lock 잠그기 - - + + Playlists @@ -10051,32 +10133,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock 잠금 해제 - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist 새 재생 목록 만들기 @@ -11567,7 +11675,7 @@ Fully right: end of the effect period - + Deck %1 덱 %1 @@ -11700,7 +11808,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11731,7 +11839,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11864,12 +11972,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11904,42 +12012,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11997,54 +12105,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12603,7 +12711,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12785,7 +12893,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art 인장 @@ -13021,197 +13129,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play 재생 - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13449,926 +13557,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating 별점 - + Assign ratings to individual tracks by clicking the stars. @@ -14503,33 +14617,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14549,215 +14663,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone - + Mute 음소거 - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode 슬립 모드 - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14802,254 +14916,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind 빠른 되감기 - + Fast rewind through the track. - + Fast Forward 빨리감기 - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject 꺼내다 - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album 앨범 - + Displays the album name of the loaded track. 불려온 트랙의 앨범 이름을 보여줍니다. - + Track Artist/Title 트랙 작가/이름 - + Displays the artist and title of the loaded track. 불려온 트랙의 작가와 곡이름을 보여줍니다. @@ -15057,12 +15171,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15277,47 +15391,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15442,323 +15556,353 @@ This can not be undone! - Create &New Playlist + Search in Current View... + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + + + + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen - + Display Mixxx using the full screen - + &Options - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help - + Show Keywheel menu title @@ -15775,74 +15919,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual &사용설명서 - + Read the Mixxx user manual. Mixxx의 사용설명서를 읽어주세요. - + &Keyboard Shortcuts &단축키 - + Speed up your workflow with keyboard shortcuts. 단축키를 이용하여 작업속도를 높이세요. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &프로그램 번역 - + Help translate this application into your language. 자국어로 번역하는 일을 도와주세요. - + &About - + About the application 이 프로그램에 대해 @@ -15850,25 +15994,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15877,25 +16021,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - - - - + Search noun 검색 - + Clear input @@ -15906,169 +16038,163 @@ This can not be undone! - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - 단축키 + See User Manual > Mixxx Library for more information. + - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key - + harmonic with %1 - + BPM 분당 박자수 - + between %1 and %2 - + Artist 악곡가 - + Album Artist 앨범 작가 - + Composer 작곡가 - + Title 제목 - + Album 앨범 - + Grouping 그룹핑 - + Year 년도 - + Genre 장르 - + Directory - + &Search selected @@ -16076,620 +16202,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist 재생목록에 추가 - + Crates 상자 - + Metadata - + Update external collections - + Cover Art 인장 - + Adjust BPM - + Select Color - - + + Analyze 분석 - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) 자동 디제잉 대기열에 넣기 (아래로) - + Add to Auto DJ Queue (top) 자동 디제잉 대기열에 넣기 (위로) - + Add to Auto DJ Queue (replace) 자동 디제잉 대기열에 넣기 (교체) - + Preview Deck - + Remove 지우기 - + Remove from Playlist - + Remove from Crate - + Hide from Library 라이브러리에서 숨기기 - + Unhide from Library 라이브러리에서 숨김해제 - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser 파일 탐색기에서 열기 - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count 재생 횟수 - + Rating 별점 - + Cue Point 큐포인트 - - + + Hotcues 핫큐 - + Intro - + Outro - + Key - + ReplayGain 리플레이 게인 - + Waveform 웨이브폼 - + Comment 덛붙임 - + All 전체 - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 덱 %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist 새 재생 목록 만들기 - + Enter name for new playlist: 새 재생 목록의 이름을 입력하세요: - + New Playlist 새 재생 목록 - - - + + + Playlist Creation Failed 재생 목록 생성 실패 - + A playlist by that name already exists. 해당 재생 목록 이름은 이미 존재합니다. - + A playlist cannot have a blank name. 재생 목록은 공백을 이름으로 가질 수 없습니다. - + An unknown error occurred while creating playlist: 재생 목록을 생성하는 도중에 알 수 없는 에러가 발생했습니다: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16705,37 +16836,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16743,37 +16874,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16781,12 +16912,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. - + Shuffle Tracks @@ -16794,52 +16925,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory 음악 라이브러리 디렉토리를 선택하세요 - + controllers - + Cannot open database 자료모음을 열 수 없음 - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16850,68 +16981,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse 탐색기 - + Export directory - + Database version - + Export - + Cancel - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16932,7 +17073,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16942,23 +17083,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_lb.qm b/res/translations/mixxx_lb.qm index 8c06dc2a9d7f2b203a606d5f807348d0a1164956..d10add87bcd971d435af3213825a1e9ede6bc9f2 100644 GIT binary patch delta 853 zcmXZaUr5tY6bJC{Z@=HwX*pf=Z)r~O&;I|PZc9UBh6P#=k&;Qcaz=kA8{1Q5B&7yn z02x@m#>t0ap14$WD_* zcSxs;blJfg*MZ&rq+0{ld=MyI`mYS*VshQ*>IHih7TLdm{k{Pdw2(U=kmeE6+Ddv$ zc$-wwYRbkT({sQqXIvm{>WovQ{Q~JuqiOagpt(x!I7*hrNXtCwN%JMC*lnuD$t~p~ zeHUr@McR5uyEo$+=~>}cRr7hXSLq)YEj0fnZFL!ckoFYmUQvcF-vyuv!cTSz;FiqmfvwGt?1|mIUL`M3}eRbrX{Pu=XG7$k|5# delta 781 zcmXZZTS${(7zgnGx9@#*THD-3nQS>|y2H1_x9wA>WOQ0s=nTvh${+%f?0^)miw;Hy z&?4G;%aWoXOa>VV^GYlvF(HbCz$i?-%8N!yffDfQ`#@oqblxEK zFJ$C1c+(27VStQIfVb@e+zbCy;k%MqiAN3asZQDb7Wl7AKuJ5f{w}E{$zTC#ycHda z=YTJV-ToJV|2e6hC4=K+sEZ7jlCf4KXRZR)^W?g{r28}(NRdXXSWwDizGWO-QweBJ zGB84h^#3lA;d`W!7C}>6w||KZjL8>jPsw1O3_T>nEo3ashECoAYG1PKwP^rx(lJ3s zvShrAjRv0po{j8%>bA6T{Nls_8va7 z8j`D%jM&I%F`ut(22>YW#rbj>0}2-Ta;2P9xRVTj5Rqe7iAm-y(~E~*$swjevgi>R z|0I4hml6|B?lA@CMS{l_hd9T*&6_M*hwN!TY{_g}l-tgcRnM%6uFJCi-MVO81eC`l iA0TTQZ4rMRpc}S{`07=uqd;9t?k6wt - + Remove Crate as Track Source - + Auto DJ Auto Dj - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source @@ -147,28 +147,28 @@ BasePlaylistFeature - + New Playlist Nei Playlist - + Add to Auto DJ Queue (bottom) An Playlescht Warteschlang setzen (Ennen) - + Create New Playlist - + Add to Auto DJ Queue (top) An Playlescht Warteschlang setzen (Uewen) - + Remove Läschen @@ -178,12 +178,12 @@ Ëmbenennen - + Lock Späer - + Duplicate @@ -204,24 +204,24 @@ - + Enter new name for playlist: - + Duplicate Playlist Playlescht dublizeieren - - + + Enter name for new playlist: - + Export Playlist Playlescht exportéieren @@ -231,70 +231,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Playlescht Embenennen - - + + Renaming Playlist Failed Embennen ass fehlgeschloen - - - + + + A playlist by that name already exists. Eng Playlescht mam selweschten Numm gett et schon - - - + + + A playlist cannot have a blank name. Eng Playlescht kann net Eidel sin - + _copy //: Appendix to default name when duplicating a playlist _kopéieren - - - - - - + + + + + + Playlist Creation Failed Playlescht konnt net erstallt gin - - + + An unknown error occurred while creating playlist: En onbekannten Fehler ass beim Erstellen vun der Playlescht opgetrueden: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlescht (*.m3u);;M3U8 Playlescht (*.m3u8);;PLS Playlescht (*.pls);;Text CSV (*.csv);;LiesbarenText (*.txt) @@ -302,12 +309,12 @@ BaseSqlTableModel - + # # - + Timestamp Zäitstempel @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Konnt net gelueden gin @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album Album - + Album Artist - + Artist Kënschtler - + Bitrate Bitrate - + BPM BPM - + Channels - + Color - + Comment Kommentar - + Composer Komponist - + Cover Art - + Date Added Datum bäigesat - + Last Played - + Duration Dauer - + Type Typ - + Genre Genre - + Grouping - + Key - + Location Uertschaft - + + Overview + + + + Preview Virschau - + Rating Bewäertung - + ReplayGain - + Samplerate - + Played Gespielt - + Title Titel - + Track # Lied - + Year Joër - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -541,67 +553,77 @@ BrowseFeature - + Add to Quick Links Quick Links dobäisetzen - + Remove from Quick Links Läschen vun den Quick Links - + Add to Library - + Refresh directory tree - + Quick Links Schnell Link - - + + Devices Geräter - + Removable Devices USB Geräter - - + + Computer - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -747,87 +769,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -837,27 +859,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1039,13 +1066,13 @@ trace - Above + Profiling messages - + Set to full volume - + Set to zero volume @@ -1070,13 +1097,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button @@ -1087,25 +1114,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1146,22 +1173,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1171,193 +1198,193 @@ trace - Above + Profiling messages - + Vinyl Control - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 - + 1 - + 2 - + 4 - + 8 - + 16 - + 32 - + 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1473,20 +1500,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1502,7 +1529,7 @@ trace - Above + Profiling messages - + Mute @@ -1513,7 +1540,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1534,25 +1561,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1622,82 +1649,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1738,451 +1765,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) An Playlescht Warteschlang setzen (Ennen) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) An Playlescht Warteschlang setzen (Uewen) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track - + Load selected track and play - - + + Record Mix - + Toggle mix recording - + Effects - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Nächsten - + Switch to next effect - + Previous Fierderun - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2197,102 +2224,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2444,1041 +2471,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Auto Dj - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3593,32 +3642,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3662,13 +3711,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Läschen - + Create New Crate @@ -3678,132 +3727,132 @@ trace - Above + Profiling messages Ëmbenennen - - + + Lock Späer - + Export Crate as Playlist - + Export Track Files - + Duplicate - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Datei - - + + Import Crate Datei importeieren - + Export Crate Datei exporteieren - + Unlock Opgespart - + An unknown error occurred while creating crate: Een fehler ass opgetrueden bei der creatioun vun der datei - + Rename Crate datei embenimmen - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Fehler beim embenennen vun der datei - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlescht (*.m3u);;M3U8 Playlescht (*.m3u8);;PLS Playlescht (*.pls);;Text CSV (*.csv);;LiesbarenText (*.txt) - + M3U Playlist (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Eng datei muss een numm hun. - + A crate by that name already exists. Dest datei mat dem selweschten num gett et schon @@ -3898,12 +3947,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4022,72 +4071,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Iwwersprangen - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds - + Auto DJ Fade Modes Full Intro + Outro: @@ -4118,80 +4167,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Auto Dj - + Shuffle - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4414,37 +4463,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4483,17 +4532,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5146,113 +5195,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Keen - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5265,105 +5314,105 @@ Apply settings and continue? - + Enabled Aktiv - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: - + Support: - + Screens preview - + Input Mappings - - + + Search - - + + Add Dobäifügen - - + + Remove Läschen @@ -5378,22 +5427,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5403,28 +5452,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Alles ausmaachen - + Output Mappings @@ -5583,6 +5632,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6174,62 +6233,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Informatioun - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -6835,7 +6894,7 @@ and allows you to pitch adjust them for harmonic mixing. Crossfader Curve - + Crossfader Curve @@ -7396,173 +7455,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Aktiv - + Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms - + Configuration error @@ -7580,131 +7638,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output - + Input - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7859,27 +7917,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7892,250 +7951,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8143,47 +8208,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers - + Library - + Interface - + Waveforms - + Mixer - + Auto DJ Auto Dj - + Decks - + Colors @@ -8218,47 +8283,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects - + Recording - + Beat Detection - + Key Detection - + Normalization - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control - + Live Broadcasting - + Modplug Decoder @@ -8291,22 +8356,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording - + Recording to file: - + Stop Recording - + %1 MiB written in %2 @@ -8614,284 +8679,284 @@ This can not be undone! - + Filetype: - + BPM: BPM - + Location: - + Bitrate: - + Comments - + BPM BPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Lied - + Album Artist - + Composer Komponist - + Title Titel - + Grouping - + Key - + Year Joër - + Artist Kënschtler - + Album Album - + Genre Genre - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply - + &Cancel - + (no color) @@ -9048,7 +9113,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9250,27 +9315,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9414,38 +9479,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. @@ -9453,12 +9518,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9466,18 +9531,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9485,15 +9550,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9504,57 +9569,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -9562,62 +9627,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9627,22 +9692,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Playlescht emportéieren - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Playlescht Fichieren (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9689,27 +9754,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9769,18 +9834,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9792,208 +9857,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10009,13 +10115,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Späer - - + + Playlists @@ -10025,32 +10131,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Opgespart - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist @@ -11541,7 +11673,7 @@ Fully right: end of the effect period - + Deck %1 @@ -11674,7 +11806,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11705,7 +11837,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11838,12 +11970,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11878,42 +12010,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11971,54 +12103,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12153,19 +12285,19 @@ may introduce a 'pumping' effect and/or distortion. Späer - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12577,7 +12709,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12759,7 +12891,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art @@ -12995,197 +13127,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13423,924 +13555,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Nächsten - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Fierderun - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14475,33 +14615,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14521,205 +14661,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone - + Mute - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14764,254 +14914,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15019,12 +15169,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15032,47 +15182,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15244,47 +15389,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15408,407 +15553,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view + + + + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen - + Display Mixxx using the full screen - + &Options - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application - + Help translate this application into your language. - + &About - + About the application @@ -15816,25 +15992,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15843,25 +16019,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - - - - + Search noun - + Clear input @@ -15872,169 +16036,163 @@ This can not be undone! - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut + See User Manual > Mixxx Library for more information. - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Kënschtler - + Album Artist - + Composer Komponist - + Title Titel - + Album Album - + Grouping - + Year Joër - + Genre Genre - + Directory - + &Search selected @@ -16042,599 +16200,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist - + Crates Datei - + Metadata - + Update external collections - + Cover Art - + Adjust BPM - + Select Color - - + + Analyze - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) An Playlescht Warteschlang setzen (Ennen) - + Add to Auto DJ Queue (top) An Playlescht Warteschlang setzen (Uewen) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Läschen - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Bewäertung - + Cue Point - + + Hotcues - + Intro - + Outro - + Key - + ReplayGain - + Waveform - + Comment Kommentar - + All - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist - + Enter name for new playlist: - + New Playlist Nei Playlist - - - + + + Playlist Creation Failed Playlescht konnt net erstallt gin - + A playlist by that name already exists. Eng Playlescht mam selweschten Numm gett et schon - + A playlist cannot have a blank name. Eng Playlescht kann net Eidel sin - + An unknown error occurred while creating playlist: En onbekannten Fehler ass beim Erstellen vun der Playlescht opgetrueden: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16650,37 +16834,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16688,37 +16872,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16726,60 +16910,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16790,67 +16979,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Duerchsichen - + Export directory - + Database version - + Export Exportéieren - + Cancel - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16871,7 +17071,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16881,23 +17081,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_nb.qm b/res/translations/mixxx_nb.qm index 2f93eacaa6eea3f96869c83f24c7c5a2a5ed10ad..72a1ab3fe588ae3b73017584801e02cee0b303d1 100644 GIT binary patch delta 508 zcmXBMJ!lgF7{>9pZ*q6Z^)6RqK}c(%MI)Aoiu7*&zDhLy()C(~C=nqVd+J&${yik;_YqzENL0DejC5tYIB#N|bvEx~hnIt9oRWH( zD0$q~@?g;uuYI;fRG;+L zW}T;cA9ln6w${)qrMSL=>yjQSr36y;5%-(p?LvOS1VUwFu#5RAkK zk=AgH8m^bCg1z9Z>xhCOmcbdz$u<2B8 z17k{zi(g?VDYlMc+o3v*h#DR$>+yaJ5_i-rR|EK`HrSfRYG8`3 wZ&0)-7dCOup>_&}mgZ6$9qlxZ^n|$n6aC}E&D%XK1G`uIu&|tLijP;+{|KX}4gdfE delta 817 zcmZY5TS${(7zgmjXWx$QU>SjPnT5_wiJ}~N(NK3#mn@>S=md?aD4L0zp|I>^Vln6D zv!ioCB{oQkGz4K6S<=ahF4V9~(Yxp-4TGRw{Xm2+UViV#`+xu6!+U2QA1|O^jT!p_ znu)^x+W?ir0H>exUhD>_Dh4nnd4phW@`aiaPYI z(h}a^?wbUQE(BmX#2ad-pg@m)pjp8P`lralb&8K&c*M%;X@%>;*l%(RrwWGSCIIiE zAeqJL57-3BSC^RY1aGCE09q5gk%wdxS0GGe; z298ir+=DS9jYPXQ_Ce^aDgjW9@anz1XCuPsEp}_LjA|u1nNKZDRItw|N5c{;28L)w zV#h!O)kwA2KS^$>SsmXadZXw9C^;&cp&tN;^F$x#*+a$bG%Gb@WH)JK^|ENG_-n@+ z8+MMmWjYKgDJ9dQ&q7PG798v(Te=;?i!_?vg8nkn$jwLws+C(Y^nhM4q6@?+v=~lO zu_6Zt=BP%|gV7r_s~Ex10(q467-nTkJr0;DPo>AfF{)MBF=(Wes$AUo%m(1QPJdL{ zICO@-+xCweGE&|W4H&=;ZO{xwPyr5bLKC>4bz@g2VQ&v2wv+~UTXRu`!`b9&bvWzj zcp__;e9KMqW>U0~G_NNL|4YbE)j8Un4Ic9qXS-{?cT0MQ2u$qH&dnx)$>m(HDcA|+ uaFrc3LpvMQ4Y_Q;22Gp6bW=y8JJ&_q5;-(|KAY4D3yt;WkDo|PDE - + Remove Crate as Track Source Fjern Kasse som Sporkilde - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Legg til Kasse som Sporkilde @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Ny spilleliste - + Add to Auto DJ Queue (bottom) Legg til Automatisk DJ Kø - + Create New Playlist Opprett ny spilleliste - + Add to Auto DJ Queue (top) Legg til Automatisk DJ Kø (øverst) - + Remove Fjern @@ -180,12 +180,12 @@ Gi nytt navn - + Lock Lås - + Duplicate Duplikat @@ -206,24 +206,24 @@ Analysér hele spillelisten - + Enter new name for playlist: Skriv inn nytt navn for spilleliste: - + Duplicate Playlist Dupliser spillelisten - - + + Enter name for new playlist: Skriv inn nytt navn for spilleliste: - + Export Playlist Eksportér spilleliste @@ -233,70 +233,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Gi spillelisten nytt navn - - + + Renaming Playlist Failed Navngivning av spilleliste mislyktes - - - + + + A playlist by that name already exists. Det finnes allerede en spilleliste med det navnet. - - - + + + A playlist cannot have a blank name. Spillelisten kan ikke ha en tomt navn. - + _copy //: Appendix to default name when duplicating a playlist Kopier - - - - - - + + + + + + Playlist Creation Failed Oppretting av spilleliste mislyktes - - + + An unknown error occurred while creating playlist: Det oppstod en ukjent feil under oppretting av spilleliste: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U spilleliste (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Spilleliste (*.m3u);;M3U8 Spilleliste (*.m3u8);;PLS Spilleliste (*.pls);;Tekst CSV (*.csv);;Lesbar Tekst (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Tidsstempel @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Fikk ikke lastet sporet @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Albumartist - + Artist Artist - + Bitrate Bithastighet - + BPM BPM - + Channels Kanaler - + Color - + Comment Kommentar - + Composer Komponist - + Cover Art Omslagsbilde - + Date Added Dato lagt til - + Last Played - + Duration Varighet - + Type Type - + Genre Sjanger - + Grouping Gruppering - + Key Tast - + Location Plassering - + + Overview + + + + Preview Forhåndsvisning - + Rating Vurdering - + ReplayGain Avspillingsnivå - + Samplerate - + Played Spilt - + Title Tittel - + Track # Spornummer # - + Year År - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Legg til Hurtiglenker - + Remove from Quick Links Fjern fra Hurtiglenker - + Add to Library Legg til bibliotek - + Refresh directory tree - + Quick Links Hurtiglenker - - + + Devices Enheter - + Removable Devices Avtagbare enheter - - + + Computer Datamaskin - + Music Directory Added Musikkmappe lagt til - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Du har lagt til én eller flere musikkmapper. Sporene i disse mappene vil ikke være tilgjengelig før du oppdaterer biblioteket. Vil du oppdatere nå? - + Scan Skann - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -839,27 +861,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1041,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Sett til fullt volum - + Set to zero volume @@ -1072,13 +1099,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button @@ -1089,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1148,22 +1175,22 @@ trace - Above + Profiling messages BPM tappeknapp - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1173,194 +1200,194 @@ trace - Above + Profiling messages Hint - + Vinyl Control Vinylkontroll - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues Markører - + Cue button Markørknapp - + Set cue point Sett markørpunkt - + Go to cue point Gå til markørpunkt - + Go to cue point and play Gå til markørpunkt og spill - + Go to cue point and stop Gå til markørpunkt og stopp - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1476,20 +1503,20 @@ Markørknapp - - + + Volume Fader - + Full Volume Fullt Volum - + Zero Volume @@ -1505,7 +1532,7 @@ Markørknapp - + Mute @@ -1516,7 +1543,7 @@ Markørknapp - + Headphone Listen @@ -1537,25 +1564,25 @@ Markørknapp - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1625,82 +1652,82 @@ Markørknapp - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1741,451 +1768,451 @@ Markørknapp - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode Vinyl Kontrollmodus - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Legg til Automatisk DJ Kø - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Legg til Automatisk DJ Kø (øverst) - + Prepend selected track to the Auto DJ Queue - + Load Track - + Load selected track - + Load selected track and play - - + + Record Mix - + Toggle mix recording - + Effects Effekter - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Neste - + Switch to next effect - + Previous Forrige - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob Forsterker knapp - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2200,102 +2227,102 @@ Markørknapp - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2447,1041 +2474,1063 @@ Markørknapp - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Mikrofon av/på - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Auto DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface Brukergrensesnitt - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3596,32 +3645,32 @@ Markørknapp ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3665,13 +3714,13 @@ Markørknapp CrateFeature - + Remove Fjern - + Create New Crate @@ -3681,132 +3730,132 @@ Markørknapp Gi nytt navn - - + + Lock Lås - + Export Crate as Playlist - + Export Track Files - + Duplicate Duplikat - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Kasser - - + + Import Crate Importer Kasse - + Export Crate Eksporter Kasse - + Unlock Lås opp - + An unknown error occurred while creating crate: En ukjent feil oppstod under oppretting av kasse: - + Rename Crate Endra navn på Kasse - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Endring av kassenavn mislykket - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Spilleliste (*.m3u);;M3U8 Spilleliste (*.m3u8);;PLS Spilleliste (*.pls);;Tekst CSV (*.csv);;Lesbar Tekst (*.txt) - + M3U Playlist (*.m3u) M3U spilleliste (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Kasser er en fin måte å organisere musikken du vil mikse med. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Kasser lar deg organisere musikken som du vil! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. En kasse kan ikke ha blankt navn. - + A crate by that name already exists. Det er allerede en kasse ved det navnet. @@ -3901,12 +3950,12 @@ Markørknapp Tidligere bidragsytere - + Official Website - + Donate @@ -4025,72 +4074,72 @@ Markørknapp DlgAutoDJ - + Skip Hopp over - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Sekunder - + Auto DJ Fade Modes Full Intro + Outro: @@ -4121,80 +4170,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Auto DJ - + Shuffle Tilfeldig rekkefølge - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4417,37 +4466,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4486,17 +4535,17 @@ You tried to learn: %1,%2 - + Log - + Search Søk - + Stats @@ -5149,113 +5198,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Ingen - + %1 by %2 %1 av %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5268,105 +5317,105 @@ Apply settings and continue? - + Enabled Slått på - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Beskrivelse: - + Support: - + Screens preview - + Input Mappings - - + + Search Søk - - + + Add Legg til - - + + Remove Fjern @@ -5381,22 +5430,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5406,28 +5455,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Nullstill alle - + Output Mappings @@ -5586,6 +5635,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6177,62 +6236,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Informasjon - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7399,173 +7458,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Slått på - + Stereo Stereo - + Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Feil i oppsettet @@ -7583,131 +7641,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate Samplingsfrekvens - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Utgang - + Input Inngang - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7862,27 +7920,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available OpenGL ikke tilgjengelig - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7895,250 +7954,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds sekunder - + Low Lav - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High Høy - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8146,47 +8211,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers - + Library Bibliotek - + Interface - + Waveforms - + Mixer Mikser - + Auto DJ Auto DJ - + Decks - + Colors @@ -8221,47 +8286,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Effekter - + Recording Opptak - + Beat Detection - + Key Detection - + Normalization Normalisering - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Vinylkontroll - + Live Broadcasting Direkte Sending - + Modplug Decoder @@ -8294,22 +8359,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Start opptak - + Recording to file: - + Stop Recording Stopp opptak - + %1 MiB written in %2 @@ -8617,284 +8682,284 @@ This can not be undone! - + Filetype: - + BPM: BPM - + Location: - + Bitrate: - + Comments Kommentarer - + BPM BPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Spornummer # - + Album Artist Albumartist - + Composer Komponist - + Title Tittel - + Grouping Gruppering - + Key Tast - + Year År - + Artist Artist - + Album Album - + Genre Sjanger - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM Dobbel BPM - + Halve BPM Halv BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous &Forrige - + Move to the next item. "Next" button - + &Next &Neste - + Duration: Varighet: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Åpne i filutforsker - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Bruk - + &Cancel &Avbryt - + (no color) @@ -9051,7 +9116,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9253,27 +9318,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9417,38 +9482,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library Velg ditt ITunes-bibliotek - + (loading) iTunes (laster) iTunes - + Use Default Library Bruk standardbiblioteket - + Choose Library... Velg bibliotek ... - + Error Loading iTunes Library Feil ved lasting av iTunes-bibliotek - + There was an error loading your iTunes library. Check the logs for details. @@ -9456,12 +9521,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9469,18 +9534,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9488,15 +9553,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9507,57 +9572,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut Snarvei @@ -9565,62 +9630,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9630,22 +9695,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importer spilleliste - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Spilleliste filer (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9692,27 +9757,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9772,18 +9837,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9795,208 +9860,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. Finn <b>Hjelp</b> i Mixxx-wiki'en. - - - + + + <b>Exit</b> Mixxx. - + Retry Prøv igjen - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Sett opp på nytt - + Help Hjelp - - + + Exit Avslutt - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue Fortsett - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10012,13 +10118,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Lås - - + + Playlists Spillelister @@ -10028,32 +10134,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Lås opp - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Opprett ny spilleliste @@ -11544,7 +11676,7 @@ Fully right: end of the effect period - + Deck %1 Spiller %1 @@ -11677,7 +11809,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11708,7 +11840,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11841,12 +11973,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11881,42 +12013,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11974,54 +12106,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Spillelister - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12156,19 +12288,19 @@ may introduce a 'pumping' effect and/or distortion. Lås - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12580,7 +12712,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12762,7 +12894,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Omslagsbilde @@ -12998,197 +13130,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Spill - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13426,924 +13558,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Neste - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Forrige - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14478,33 +14618,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14524,205 +14664,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone - + Mute - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14767,254 +14917,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Løs ut - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode Vinyl Kontrollmodus - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15022,12 +15172,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15035,47 +15185,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15247,47 +15392,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15411,407 +15556,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... + + + + + Search for tracks in the current library view - - Export the library to the Engine Prime format + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist Lag en ny spilleliste - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View &Vis - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen &Fullskjerm - + Display Mixxx using the full screen Vis Mixxx på hele skjermen - + &Options &Alternativer - + &Vinyl Control &Vinylkontroll - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix - + Record your mix to a file - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts - + Toggles keyboard shortcuts on or off - + Ctrl+` - + &Preferences &Innstillinger - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &Hjelp - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support - + Get help with Mixxx - + &User Manual - + Read the Mixxx user manual. Les Mixxx bruksanvisningen. - + &Keyboard Shortcuts &Tastatursnarveier - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application Oversett Denne Applikasjon. - + Help translate this application into your language. Hjelp til med å oversette dette programmet til ditt språk. - + &About &Om - + About the application Om programmet @@ -15819,25 +15995,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15846,25 +16022,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Søk - + Clear input @@ -15875,169 +16039,163 @@ This can not be undone! Søk… - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Snarvei + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Avslutt søk + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Tast - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artist - + Album Artist Albumartist - + Composer Komponist - + Title Tittel - + Album Album - + Grouping Gruppering - + Year År - + Genre Sjanger - + Directory - + &Search selected @@ -16045,599 +16203,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist Legg til i spilleliste - + Crates Kasser - + Metadata - + Update external collections - + Cover Art Omslagsbilde - + Adjust BPM - + Select Color - - + + Analyze Analysér - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Legg til Automatisk DJ Kø - + Add to Auto DJ Queue (top) Legg til Automatisk DJ Kø (øverst) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Fjern - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Egenskaper - + Open in File Browser Åpne i filutforsker - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Vurdering - + Cue Point - + + Hotcues - + Intro - + Outro - + Key Tast - + ReplayGain Avspillingsnivå - + Waveform Bølgeform - + Comment Kommentar - + All Alle - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Lås BPM - + Unlock BPM Åpne BPM - + Double BPM Dobbel BPM - + Halve BPM Halv BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Spiller %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Opprett ny spilleliste - + Enter name for new playlist: Skriv inn nytt navn for spilleliste: - + New Playlist Ny spilleliste - - - + + + Playlist Creation Failed Oppretting av spilleliste mislyktes - + A playlist by that name already exists. Det finnes allerede en spilleliste med det navnet. - + A playlist cannot have a blank name. Spillelisten kan ikke ha en tomt navn. - + An unknown error occurred while creating playlist: Det oppstod en ukjent feil under oppretting av spilleliste: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Avbryt - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Lukk - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16653,37 +16837,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16691,37 +16875,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16729,60 +16913,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Vis eller skjul kolonner + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database Får ikke åpnet databasen - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16793,67 +16982,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Bla gjennom - + Export directory - + Database version - + Export Eksportér - + Cancel Avbryt - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16874,7 +17074,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16884,23 +17084,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_nl.qm b/res/translations/mixxx_nl.qm index 76a8cc3607d820bddd65693298404ede2f26f33e..ae2ce14d4fff4f977f74a755d8261b8fd8938764 100644 GIT binary patch delta 1889 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 U{DUxjt@YTmm16UaY~@J&FPWtITL1t6 diff --git a/res/translations/mixxx_nl.ts b/res/translations/mixxx_nl.ts index 328a03065a8e..1634ffe49a0c 100644 --- a/res/translations/mixxx_nl.ts +++ b/res/translations/mixxx_nl.ts @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nieuwe Afspeellijst @@ -160,7 +160,7 @@ - + Create New Playlist Creëer nieuwe afspeellijst @@ -190,113 +190,120 @@ Dupliceren - - + + Import Playlist Importeer Afspeellijst - + Export Track Files Exporteer Track Bestanden - + Analyze entire Playlist Analyseer hele afspeellijst - + Enter new name for playlist: Voer nieuwe naam in voor Afspeellijst: - + Duplicate Playlist Dupliceer afspeellijst - - + + Enter name for new playlist: Voer naam in voor nieuwe afspeellijst: - - + + Export Playlist Exporteer afspeellijst - + Add to Auto DJ Queue (replace) Voeg toe aan de Auto-DJ wachtrij (vervang) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Hernoem afspeellijst - - + + Renaming Playlist Failed Afspeellijst Hernoemen Mislukt - - - + + + A playlist by that name already exists. Een afspeellijst met deze naam bestaat al. - - - + + + A playlist cannot have a blank name. Een afspeellijst kan geen blanco naam hebben. - + _copy //: Appendix to default name when duplicating a playlist _kopiëren - - - - - - + + + + + + Playlist Creation Failed Creatie Afspeellijst is mislukt - - + + An unknown error occurred while creating playlist: Een onbekende fout trad op bij het creëren van afspeellijst: - + Confirm Deletion Bevestig verwijderen - + Do you really want to delete playlist <b>%1</b>? Weet je zeker dat je de afspeellijst <b>%1</b> wil verwijderen? - + M3U Playlist (*.m3u) M3U Afspeellijst (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Afspeellijst (*.m3u);;M3U8 Afspeellijst (*.m3u8);;PLS Afspeellijst (*.pls);;Tekst CSV (*.csv);;Leesbare Tekst (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Tijdstempel @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kan de Track niet laden. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Album Artiest - + Artist Artiest - + Bitrate Bit Snelheid - + BPM BPM - + Channels Kanalen - + Color Kleur - + Comment Opmerking - + Composer Componist - + Cover Art Cover Art - + Date Added Datum Toegevoegd - + Last Played Laatst Afgespeeld - + Duration Duur - + Type Type - + Genre Genre - + Grouping Groepering - + Key Toonaard (Key) - + Location Locatie - + Overview - + Preview Voorbeluistering - + Rating Waardering - + ReplayGain ReplayGain - + Samplerate Sample Snelheid - + Played Afgespeeld - + Title Titel - + Track # Track # - + Year Jaar - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Afbeelding ophalen @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. De optie "Computer" laat u toe om door mappen te navigeren, nummers te bekijken en te laden van op uw harde schijf en externe apparaten. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3632,32 +3649,32 @@ traceren - Boven + Profileringsberichten ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. De functionaliteit van deze controller-verbinding wordt uitgeschakeld totdat het probleem is opgelost. - + You can ignore this error for this session but you may experience erratic behavior. U kunt deze fout tijdens deze sessie negeren, maar u kunt onregelmatig gedrag ervaren. - + Try to recover by resetting your controller. Probeer te herstellen door uw controller te resetten. - + Controller Mapping Error Controller Mapping Fout - + The mapping for your controller "%1" is not working properly. De mapping voor uw controller "%1" werkt niet goed. - + The script code needs to be fixed. De script code moet hersteld worden. @@ -3765,7 +3782,7 @@ traceren - Boven + Profileringsberichten Importeer Krat - + Export Crate Exporteer Krat @@ -3775,7 +3792,7 @@ traceren - Boven + Profileringsberichten Ontgrendel - + An unknown error occurred while creating crate: Een onbekende fout heeft plaatsgevonden bij het aanmaken van de Krat: @@ -3801,17 +3818,17 @@ traceren - Boven + Profileringsberichten Krat Hernoemen Mislukt - + Crate Creation Failed Krat Aanmaken Mislukt - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Afspeellijst (*.m3u);;M3U8 Afspeellijst (*.m3u8);;PLS Afspeellijst (*.pls);;Tekst CSV (*.csv);;Leesbare Tekst (*.txt) - + M3U Playlist (*.m3u) M3U Afspeellijst (*.m3u) @@ -3937,12 +3954,12 @@ traceren - Boven + Profileringsberichten Eerdere Medewerkers - + Official Website Officiële Website - + Donate Donaties @@ -3998,7 +4015,7 @@ traceren - Boven + Profileringsberichten - + Analyze Analyseer @@ -4043,17 +4060,17 @@ traceren - Boven + Profileringsberichten Voert beatgrid-, toonaard- en afspeelversterking-detectie uit op de geselecteerde Tracks. Genereert geen golfvoren op de geselecteerde Tracks om schijfruimte te besparen. - + Stop Analysis Stop Analyse - + Analyzing %1% %2/%3 Analyseren van %1% %2/%3 - + Analyzing %1/%2 Analyseren van %1/%2 @@ -4497,37 +4514,37 @@ Dit resulteert vaak in Beat-Grids van hogere kwaliteit, maar zal het niet goed d Als de koppeling niet werkt, probeer dan een geavanceerde optie hieronder in te schakelen en probeer het vervolgens opnieuw. Of klik op Opnieuw Proberen om de midi-besturing opnieuw te detecteren. - + Didn't get any midi messages. Please try again. Geen MIDI-berichten ontvangen. Probeer het opnieuw. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Kan een koppeling niet detecteren - probeer het opnieuw a.u.b. Zorg ervoor dat u slechts één bedieningselement tegelijk aanraakt. - + Successfully mapped control: Bediening met succes toegewezen: - + <i>Ready to learn %1</i> <i>Klaar om te leren %1</i> - + Learning: %1. Now move a control on your controller. Aan Het Leren: %1. Verplaats nu een besturingselement op uw controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 Het geselecteerde besturingselement bestaat niet.<br>Dit is mogelijks een bug. Gelieve het te rapporteren op de Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5234,114 +5251,114 @@ die geassocieerd is met elke key. DlgPrefController - + Apply device settings? Apparaatinstellingen toepassen? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Uw instellingen moeten worden toegepast voordat u de leerassistent start. Instellingen toepassen en doorgaan? - + None Geen - + %1 by %2 %1 bij %2 - + Mapping has been edited Toewijzing is bewerkt - + Always overwrite during this session Overschrijf altijd tijdens deze sessie - + Save As Opslaan Als - + Overwrite Overschrijf - + Save user mapping Bewaar gebruikerstoewijzingen - + Enter the name for saving the mapping to the user folder. Voer de naam in voor het opslaan van de toewijzing in de gebruikersmap. - + Saving mapping failed Het opslaan van de toewijzing is mislukt - + A mapping cannot have a blank name and may not contain special characters. Een toewijzing mag geen lege naam hebben en mag geen speciale tekens bevatten. - + A mapping file with that name already exists. Er bestaat al een toewijzingsbestand met die naam. - + Do you want to save the changes? Wilt u de wijzigingen opslaan? - + Troubleshooting Probleemoplossen - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Als u deze mapping gebruikt, werkt uw controller mogelijk niet correct. Selecteer een andere Mapping of schakel de controller uit.</b></font><br><br> Deze Mapping is ontworpen voor een nieuwere Mixxx Controller Engine en kan niet worden gebruikt op je huidige Mixxx-installatien.<br>Je Mixxx-installatie heeft Controller Engine-versie %1. Voor deze mapping is een Controller Engine-versie> = %2 vereist.<br><br> Bezoek voor meer informatie de wikipagina over <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. Er bestaat al een Mapping. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> bestaat al in de map voor Mappings.<br>Overschrijven of opslaan met een nieuwe naam? - + Clear Input Mappings Wis Input-Mappings (Invoerkoppelingen) - + Are you sure you want to clear all input mappings? Weet u het zeker dat u alle Input-Mappings (invoerkoppelingen) wilt wissen? - + Clear Output Mappings Wis Output-Mappings (Uitvoerkoppelingen) - + Are you sure you want to clear all output mappings? Weet u het zeker dat u alle Output-Mappings (Uitvoerkoppelingen) wilt wissen? @@ -5672,6 +5689,16 @@ Instellingen toepassen en doorgaan? Multi-Sampling Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6286,62 +6313,62 @@ U kunt de Tracks ten allen tijde op het scherm slepen en neerzetten om een deck DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. De minimale grootte van de geselecteerde skin is groter dan uw schermresolutie. - + Allow screensaver to run Toestaan dat Schermbeveiliging wordt uitgevoerd. - + Prevent screensaver from running Voorkom dat Schermbeveiliging wordt uitgevoerd - + Prevent screensaver while playing Voorkom Schermbeveiliging tijdens afspelen - + Disabled Uitgeschakeld - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Deze skin ondersteunt geen kleurenschema's - + Information Informatie - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx moet worden herstart vóór de nieuwe regio, schaal of multi-sampling instellingen toegepast worden. @@ -7510,173 +7537,172 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Standaard (lange vertraging) - + Experimental (no delay) Experimenteel (geen vertraging) - + Disabled (short delay) Uitgeschakeld (korte vertraging) - + Soundcard Clock Geluidskaart Klok - + Network Clock Netwerk Klok - + Direct monitor (recording and broadcasting only) Directe monitor (enkel opnemen en uitzenden) - + Disabled Uitgeschakeld - + Enabled Ingeschakeld - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Om Realtime scheduling in te schakelen (momenteel uitgeschakeld), zie de %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. De %1 bevat een lijst met geluidskaarten en controllers die u kunt overwegen voor het gebruik met Mixxx. - + Mixxx DJ Hardware Guide Mixxx DJ Hardware Gids - + Information Informatie - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. Mixxx moet worden herstart alvorens de multi-threaded RubberBand instelling wordt toegepast. - + auto (<= 1024 frames/period) auto (<= 1024 frames/periode) - + 2048 frames/period 2048 frames/periode - + 4096 frames/period 4096 frames/periode - + Are you sure? Weet u zeker? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. Stereo kanalen in mono kanalen omzetten voor gelijktijdige verwerking zal resulteren in een verlies van mono compatibiliteit en een diffuus stereo beeld. Dit wordt niet aangeraden tijdens uitzenden of opname. - + Are you sure you wish to proceed? Weet u zeker dat u wilt doorgaan. - + No Neen - + Yes, I know what I am doing Ja, Ik weet wat ik doe. - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Microfooningangen zijn niet synchroon met het opname- en uitzendsignaal in vergelijking met wat je hoort. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Meet de Round Trip Latency en voer het hierboven in voor Microphone Latency Compensation om de microfoon timing uit te lijnen. - - + Refer to the Mixxx User Manual for details. Raadpleeg de Mixxx-gebruikershandleiding voor meer informatie. - + Configured latency has changed. De geconfigureerde latency is gewijzigd. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Meet opnieuw de Round Trip Latency en voer het hierboven in voor Microphone Latency Compensation om de microfoon timing uit te lijnen. - + Realtime scheduling is enabled. Realtime scheduling is ingeschakeld. - + Main output only Alleen HoofdUitgang - + Main and booth outputs Hoofd en Booth uitgangen - + %1 ms %1 ms - + Configuration error Configuratiefout @@ -7694,131 +7720,131 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out Geluid API - + Sample Rate Samplefrequentie - + Audio Buffer Audio Buffer - + Engine Clock Engine Klok - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Gebruik de geluidskaartklok voor live publieksopstellingen en de laagste latency.<br>Gebruik een netwerkklok voor uitzendingen zonder een live publiek. - + Main Mix Hoofdmix - + Main Output Mode HoofduitgangsModus - + Microphone Monitor Mode Microfoon monitorModus - + Microphone Latency Compensation Compensatie voor microfoonvertraging - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Buffer Underflow Teller - + 0 0 - + Keylock/Pitch-Bending Engine Toonaard (Key)/Toonhoogte (Pitch)-Aanpassings Engine - + Multi-Soundcard Synchronization Synchronisatie van meervoudige geluidskaarten - + Output Uitvoer - + Input Invoer - + System Reported Latency Door systeem gerapporteerde Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Vergroot je geluidsbuffer als de teller voor bufferleegloop verhoogt of als je korte onderbrekingen hoort tijdens het afspelen. - + Main Output Delay Hoofduitgang Delay - + Headphone Output Delay Vertraging hoofdtelefoonuitgang - + Booth Output Delay Vertraging booth-uitgang - + Dual-threaded Stereo Tweevoudige bedraad Stereo - + Hints and Diagnostics Tips en diagnostische gegevens - + Downsize your audio buffer to improve Mixxx's responsiveness. Verklein uw audiobuffer om het reactievermogen van Mixxx te verbeteren. - + Query Devices Vraag apparaten op @@ -9378,27 +9404,27 @@ Dit resulteert vaak in Beat-Grids van hogere kwaliteit, maar zal het niet goed d EngineBuffer - + Soundtouch (faster) Soundtouch (sneller) - + Rubberband (better) Rubberband (beter) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (bijna hi-fi kwaliteit) - + Unknown, using Rubberband (better) Onbekend, Rubberband gebruiken (beter) - + Unknown, using Soundtouch Onbekend, Soundtouch gebruiken @@ -9613,15 +9639,15 @@ Dit resulteert vaak in Beat-Grids van hogere kwaliteit, maar zal het niet goed d LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Veilige Modus ingeschakeld - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9633,57 +9659,57 @@ Shown when VuMeter can not be displayed. Please keep ondersteuning. - + activate Activeer - + toggle Schakelaar - + right rechts - + left links - + right small rechts klein - + left small links klein - + up omhoog - + down omlaag - + up small omhoog klein - + down small omlaag klein - + Shortcut Snelkoppeling @@ -9691,37 +9717,37 @@ ondersteuning. Library - + This or a parent directory is already in your library. Deze map of een bovenliggende map is reeds opgenomen in uw bibliotheek. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Deze map of een opgelijste map bestaat niet of is niet toegankelijk. De operatie wordt afgebroken om fouten in de bibliotheek the vermijden. - - + + This directory can not be read. Deze map kan niet worden uitgelezen. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Een onbekende fout is opgetreden. De operatie wordt afgebroken om fouten in de bibliotheek the vermijden. - + Can't add Directory to Library Deze map kan niet worden toegevoegd aan de bibliotheek. - + Could not add <b>%1</b> to your library. %2 @@ -9730,27 +9756,27 @@ De operatie wordt afgebroken om fouten in de bibliotheek the vermijden. - + Can't remove Directory from Library De map kon niet uit uw bibliotheek verwijderd worden - + An unknown error occurred. Een onbekende fout is opgetreden. - + This directory does not exist or is inaccessible. Deze map bestaat niet of is niet toegankelijk. - + Relink Directory Herlink de map - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9762,22 +9788,22 @@ De operatie wordt afgebroken om fouten in de bibliotheek the vermijden. LibraryFeature - + Import Playlist Importeer Afspeellijst - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Afspeellijstbestanden (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Bestand Overschrijven? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9931,253 +9957,253 @@ Wil je het echt overschrijven? MixxxMainWindow - + Sound Device Busy Geluisapparaat bezig - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Probeer opnieuw</b> na het afsluiten van de andere applicatie of het opnieuw aansluiten van een geluidsapparaat - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Configureer</b> opnieuw de Mixxx instellingen van het geluidsapparaat. - - + + Get <b>Help</b> from the Mixxx Wiki. <b>Hulp</b>zoeken in de Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Verlaat</b> Mixxx. - + Retry Probeer opnieuw - + skin skin - + Allow Mixxx to hide the menu bar? Mixxx toestaan om de menu balk te verbergen? - + Hide Always show the menu bar? Verberg - + Always show Altijd tonen - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label De Mixxx menu balk is verborgen en kan worden opgeroepen met een enkele druk op de <b>Alt</b> toets.<br><br>Click <b>%1</b> om akkoord te gaan.<br><br>Click <b>%2</b> om dit uit te schakelen, bijvoorbeeld wanneer u Mixxx niet met een toetsenbord gebruikt.<br><br>U kan deze instelling altijd wijzigen in de Voorkeuren -> Interface.<br> - + Ask me again Vraag mij opnieuw - - + + Reconfigure Opnieuw configureren - + Help Help - - + + Exit Afsluiten - - + + Mixxx was unable to open all the configured sound devices. Mixxx kon niet alle geconfigureerde geluidsapparaten openen. - + Sound Device Error Fout met geluidsapparaat - + <b>Retry</b> after fixing an issue <b>Probeer opnieuw</b> na het oplossen van een probleem - + No Output Devices Geen uitvoerapparaten - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx is ingesteld zonder uitvoerapparaten voor geluid. Geluidsverwerking wordt uitgeschakeld zonder een geconfigureerd uitvoerapparaat. - + <b>Continue</b> without any outputs. <b>Ga door</b> zonder uitvoer. - + Continue Verdergaan - + Load track to Deck %1 Laad Track in deck %1 - + Deck %1 is currently playing a track. Deck %1 speelt momenteel een Track af. - + Are you sure you want to load a new track? Bent u zeker dat u een nieuwe Track wil laden? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Er is geen invoerapparaat geselecteerd voor deze vinylbesturing. Selecteer eerst een invoerapparaat in de voorkeuren voor geluidshardware. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Er is geen invoerapparaat geselecteerd voor dit Directe Doorvoerapparaat. Selecteer eerst een invoerapparaat in de voorkeuren voor geluidsapparatuur. - + There is no input device selected for this microphone. Do you want to select an input device? Er is geen invoerapparaat geselecteerd voor deze microfoon. Wilt u een invoerapparaat selecteren? - + There is no input device selected for this auxiliary. Do you want to select an input device? Er is geen invoerapparaat geselecteerd voor deze Auxiliary. Wilt u een invoerapparaat selecteren? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Fout in Skin-bestand - + The selected skin cannot be loaded. De geselecteerde Skin kan niet worden geladen. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. OpenGL Directe weergave-herberekening is niet ingeschakeld op uw computer.<br><br> Dit betekent dat de weergave van de golfvormen erg<br><b> traag zal zijn en uw CPU zwaar kan belasten</b>. Werk uw <br> configuratie bij om OpenGL Directe weergave-herberekening mogelijk te maken of schakel<br>de waveform weergaven uit in de Mixxx-voorkeuren door "Leeg" te selecteren<br> als de waveform weergave in het gedeelte "Interface". - - - + + + Confirm Exit Afsluiten bevestigen - + A deck is currently playing. Exit Mixxx? Er is momenteel een deck actief. Mixxx afsluiten? - + A sampler is currently playing. Exit Mixxx? Er is momenteel een sampler actief. Mixxx afsluiten? - + The preferences window is still open. Het scherm "Voorkeuren" staat nog open. - + Discard any changes and exit Mixxx? Wijzigingen negeren en Mixxx afsluiten? @@ -10193,13 +10219,13 @@ Wilt u een invoerapparaat selecteren? PlaylistFeature - + Lock Vergrendel - - + + Playlists Afspeellijsten @@ -10209,32 +10235,58 @@ Wilt u een invoerapparaat selecteren? Afspeellijst door elkaar schudden - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Ontgrendel - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Playlists zijn geordende lijsten met Tracks waarmee u uw DJ-sets kunt plannen. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Het kan nodig zijn om enkele Tracks van uw voorbereide afspeellijst over te slaan of enkele andere Tracks toe te voegen om de energie van uw publiek op peil te houden. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Sommige DJ's maken afspeellijsten voordat ze live optreden, maar anderen bouwen ze liever on-the-fly tijdens hun optreden. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Wanneer u een afspeellijst gebruikt tijdens een live DJ-set, vergeet dan niet om goed op te letten hoe uw publiek reageert op de muziek die u hebt gekozen om te spelen. - + Create New Playlist Creëer nieuwe afspeellijst @@ -11895,7 +11947,7 @@ Tip: compenseer "chipmunk" en "diepeg" stemmen De hoeveelheid versterking die toegepast wordt op het audio signaal. Op een hoger niveau zal het geluid meer worden vervormd (distored)r. - + Passthrough Directe Doorvoer @@ -12064,12 +12116,12 @@ release tijd zorgen voor een pompend effect en/of een vervorming. allerlei - + built-in ingebouwd - + missing ontbrekend @@ -12198,54 +12250,54 @@ release tijd zorgen voor een pompend effect en/of een vervorming. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Afspeellijsten - + Folders Mappen - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Leest databases die zijn geëxporteerd voor Pioneer CDJ / XDJ-spelers met behulp van de <br/>Rekordbox ExportModus.Rekordbox kan alleen exporteren naar USB- of SD-apparaten met een FAT- of HFS-bestandssysteem. <br/>Mixxx kan een database lezen van elk apparaat dat de databasemappen bevat (<tt>PIONEER</tt> en <tt>Inhoud</tt>). <br/>Niet ondersteund worden Rekordbox-databases die zijn verplaatst naar een extern apparaat via <br/><i>Voorkeuren > Geavanceerd > Databasebeheer</i>.<br/><br/>De volgende gegevens worden gelezen: - + Hot cues Hot cues - + Loops (only the first loop is currently usable in Mixxx) Loops (alleen de eerste loop is momenteel bruikbaar in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) Controleer op aangesloten Rekordbox USB / SD-apparaten (vernieuwen) - + Beatgrids Beat-Grids - + Memory cues Memory Cues - + (loading) Rekordbox (laden) Rekordbox @@ -15492,47 +15544,47 @@ Dit kan niet ongedaan gemaakt worden! WCueMenuPopup - + Cue number Cue Nr - + Cue position Cue Positie - + Edit cue label Bewerk Cue Label - + Label... Label... - + Delete this cue Verwijder deze Cue... - + Toggle this cue type between normal cue and saved loop Schakelt dit cue type tussen normale cue en opgeslagen lus cue. - + Left-click: Use the old size or the current beatloop size as the loop size Linker-click: Gebruik de oude grootte of de huidige beatlus grootte als de lusgrootte - + Right-click: Use the current play position as loop end if it is after the cue Rechter-click: Gebruik de huidige afspeelpositie als lus einde indien deze zich achter de cue bevindt. - + Hotcue #%1 Hotcue #%1 @@ -15657,323 +15709,353 @@ Dit kan niet ongedaan gemaakt worden! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Maak &nieuwe Afspeellijst - + Create a new playlist Maak een nieuwe afspeellijst - + Ctrl+n Ctrl+n - + Create New &Crate Creëer nieuwe &Krat - + Create a new crate Creëer een nieuwe Krat - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Bekijk - + Auto-hide menu bar Verberg de menu balk automatisch - + Auto-hide the main menu bar when it's not used. Verberg de hoofd menu balk wanneer deze niet gebruikt wordt. - + May not be supported on all skins. Wordt mogelijk niet op alle Skins ondersteund. - + Show Skin Settings Menu Menu Skin-instellingen weergeven - + Show the Skin Settings Menu of the currently selected Skin Toon het menu Skin-instellingen van de huidig geselecteerde thema - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Laat Microfoon Sectie zien - + Show the microphone section of the Mixxx interface. Toon de microfoonsectie van de Mixxx-interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Toon sectie VinylBediening - + Show the vinyl control section of the Mixxx interface. Toon de sectie VinylBediening van de Mixxx-interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Toon VoorbeluisterDeck - + Show the preview deck in the Mixxx interface. Toon het VoorbeluisterDeck in de Mixxx-interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Toon Cover Art - + Show cover art in the Mixxx interface. Toon Cover Art in de Mixxx-interface. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximaliseer Bibliotheek - + Maximize the track library to take up all the available screen space. Maximaliseer de TrackBibliotheek in de beschikbare schermruimte. - + Space Menubar|View|Maximize Library Spatie - + &Full Screen &Volledig Scherm - + Display Mixxx using the full screen Geef Mixxx weer in volledig scherm - + &Options &Opties - + &Vinyl Control &VinylBediening - + Use timecoded vinyls on external turntables to control Mixxx Gebruik tijdgecodeerde vinyl op externe draaitafels om Mixxx te bedienen - + Enable Vinyl Control &%1 Activeer VinylBediening &%1 - + &Record Mix Mix &Opnemen - + Record your mix to a file Neem je Mix op naar een bestand - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Schakel Live &Uitzenden in - + Stream your mixes to a shoutcast or icecast server Stream je mixen naar een Shoutcast- of Icecast-server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Schakel &Sneltoetsen in - + Toggles keyboard shortcuts on or off ToetsenbordSneltoetsen Aan/Uit-Schakelen - + Ctrl+` Ctrl+` - + &Preferences &Instellingen - + Change Mixxx settings (e.g. playback, MIDI, controls) Mixxx-instellingen wijzigen (bijv. Afspelen, MIDI, BedieningsElementen) - + &Developer &Ontwikkelaar - + &Reload Skin &Herlaad Skin - + Reload the skin Herlaad de Skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Ontwikkelaar &Hulpmiddelen - + Opens the developer tools dialog Opent het dialoogvenster hulpprogramma's voor ontwikkelaars - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Statistieken: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Schakel Experiment-Modus in. Verzamelt statistieken in de EXPERIMENT-Tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Statistieken: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. Schakel Base Modus in. Verzamelt statistieken in de BASE Tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Deb&ugger ingeschakeld - + Enables the debugger during skin parsing Activeert de debugger tijdens het ontleden van het thema - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Help - + Show Keywheel menu title Toon Toonaard (Key)-Rad @@ -15990,74 +16072,74 @@ Dit kan niet ongedaan gemaakt worden! Exporteer de bibliotheek naar het Engine DJ formaat - + Show keywheel tooltip text Toon Toonaard (Key)-Rad - + F12 Menubar|View|Show Keywheel F12 - + &Community Support &Community Ondersteuning - + Get help with Mixxx Zoek hulp bij Mixxx - + &User Manual &Gebruikers Handleiding - + Read the Mixxx user manual. Lees de Mixxx gebruikers handleiding. - + &Keyboard Shortcuts &Toetsenbord Sneltoetsen - + Speed up your workflow with keyboard shortcuts. Versnel uw workflow met sneltoetsen. - + &Settings directory &Instellingen map - + Open the Mixxx user settings directory. Open de map met Mixxx GebruikersInstellingen - + &Translate This Application &Vertaal Deze Applicatie - + Help translate this application into your language. Help om deze applicatie in je eigen taal te vertalen. - + &About &Over - + About the application Over de applicatie @@ -16092,25 +16174,13 @@ Dit kan niet ongedaan gemaakt worden! WSearchLineEdit - - Clear input - Clear the search bar input field - Invoer wissen - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Zoek - + Clear input Invoer wissen @@ -16121,93 +16191,87 @@ Dit kan niet ongedaan gemaakt worden! Zoek... - + Clear the search bar input field Wis het zoektekstveld - - Enter a string to search for - Geef waarde om op te zoeken + + Return + Enter - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Gebruik operatoren zoals BPM: 115-128, Artiest: BooFar, -jaar: 1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Voor meer informatie zie Handleiding > Mixxx Bibliotheek + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Snelkoppeling + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Focus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts - Snelkoppelingen + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - Enter + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Kies Zoek voor zoek-terwijl-je-typt timeout of spring naar de Tracks nadien. + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl+Spatie - + Toggle search history Shows/hides the search history entries Zoekgeschiedenis Tonen/Verbergen-Schakelaar - + Delete or Backspace Delete of Backspace - - Delete query from history - Verwijder zoekterm uit geschiedenis - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Beëindig zoeken + + Delete query from history + Verwijder zoekterm uit geschiedenis @@ -16963,37 +17027,37 @@ Dit kan niet ongedaan gemaakt worden! WTrackTableView - + Confirm track hide Bevestig het verbergen van de Track - + Are you sure you want to hide the selected tracks? Bent u zeker dat u de Track wil verbergen? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Bent u zeker dat u de geselecteerde Track(s) wil verwijderen uit de Auto-DJ afspeelrij? - + Are you sure you want to remove the selected tracks from this crate? Bent u zeker dat u de geselecteerde Track(s) wil verwijderen uit deze Krat? - + Are you sure you want to remove the selected tracks from this playlist? Bent u zeker dat u de geselecteerde Track(s) wil verwijderen uit deze Afspeellijst - + Don't ask again during this session Niet meer vragen tijdens deze sessie - + Confirm track removal Bevestig verwijderen van de Track @@ -17014,52 +17078,52 @@ Dit kan niet ongedaan gemaakt worden! mixxx::CoreServices - + fonts lettertype - + database database - + effects Effecten - + audio interface audio interface - + decks Decks - + library Bibliotheek - + Choose music library directory Kies de map voor de muziekBibliotheek - + controllers Controllers - + Cannot open database Kan de database niet openen - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17073,68 +17137,78 @@ Klik op OK om af te sluiten. mixxx::DlgLibraryExport - + Entire music library Volledige muziekBibliotheek - - Selected crates - Geselecteerde Kratten + + Crates + + + + + Playlists + + + + + Selected crates/playlists + - + Browse Bladeren - + Export directory Exporteer map - + Database version Database versie - + Export Exporteer - + Cancel Annuleer - + Export Library to Engine DJ "Engine DJ" must not be translated Bibliotheek exporteren naar Engine DJ - + Export Library To Exporteer Bibliotheek Naar - + No Export Directory Chosen Geen Export Map gekozen - + No export directory was chosen. Please choose a directory in order to export the music library. Er is geen exportmap gekozen. Kies een map om de muziekBibliotheek naar te exporteren. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Er bestaat al een database in de gekozen directory. Geëxporteerde Tracks worden aan deze database toegevoegd. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Er bestaat al een database in de gekozen directory, maar er is een probleem opgetreden bij het laden ervan. Export zal in deze situatie niet gegarandeerd slagen. @@ -17155,7 +17229,7 @@ Klik op OK om af te sluiten. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17166,22 +17240,22 @@ Klik op OK om af te sluiten. mixxx::LibraryExporter - + Export Completed Exporteren voltooid - - Exported %1 track(s) and %2 crate(s). - %1 Track(s) en %2 Krat(ten) geëxporteerd. + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Exporteren mislukt - + Exporting to Engine DJ... Exporteren naar Engine DJ... diff --git a/res/translations/mixxx_pl.qm b/res/translations/mixxx_pl.qm index 2e9d19708b93ac74f62ee13694282aed13c488ca..15e6982fef55b415ead857dc5718f7d575b091fb 100644 GIT binary patch delta 12430 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 delta 13007 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 ~zNN<;jf_h-Vc{Wir`YTpg`2JE9{2W8O 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 diff --git a/res/translations/mixxx_pl.ts b/res/translations/mixxx_pl.ts index 2c4f97c4d664..4888018f9fd4 100644 --- a/res/translations/mixxx_pl.ts +++ b/res/translations/mixxx_pl.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Usuń Skrzynkę jako źródło utworów - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Dodaj Skrzynkę jako źródło utworów @@ -150,7 +150,7 @@ Importuj jako skrzynkę BasePlaylistFeature - + New Playlist Nowa lista odtwarzania @@ -161,7 +161,7 @@ Importuj jako skrzynkę - + Create New Playlist Utwórz nową listę odtwarzania @@ -191,113 +191,120 @@ Importuj jako skrzynkę Duplikuj - - + + Import Playlist Importuj listę odtwarzania - + Export Track Files Eksportuj pliki utworu - + Analyze entire Playlist Analizuj całą listę odtwarzania - + Enter new name for playlist: Podaj nową nazwę listy odtwarzania: - + Duplicate Playlist Duplikuj listę odtwarzania - - + + Enter name for new playlist: Podaj nazwę dla nowej listy odtwarzania: - - + + Export Playlist Eksportuj listę odtwarzania - + Add to Auto DJ Queue (replace) Dodaj do kolejki Auto DJ (zamień) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Zmień nazwę listy odtwarzania - - + + Renaming Playlist Failed Zmiana nazwy listy odtwarzania nie powiodła się - - - + + + A playlist by that name already exists. Lista odtwarzania o tej nazwie już istnieje. - - - + + + A playlist cannot have a blank name. Lista odtwarzania nie może mieć pustej nazwy. - + _copy //: Appendix to default name when duplicating a playlist _kopia - - - - - - + + + + + + Playlist Creation Failed Tworzenie listy odtwarzania nie powiodło się - - + + An unknown error occurred while creating playlist: Wystąpił nieznany błąd podczas tworzenia listy odtwarzania: - + Confirm Deletion Potwierdź usunięcie - + Do you really want to delete playlist <b>%1</b>? Czy na pewno chcesz usunąć playlistę <b>%1</b>? - + M3U Playlist (*.m3u) Lista odtwarzania M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista odtwarzania M3U (*.m3u);;Lista odtwarzania M3U8 (*.m3u8);;Lista odtwarzania PLS (*.pls);;Tekst CSV (*.csv);;Odczytywalny Tekst (*.txt) @@ -305,12 +312,12 @@ Importuj jako skrzynkę BaseSqlTableModel - + # Nr - + Timestamp Znacznik czasu @@ -318,7 +325,7 @@ Importuj jako skrzynkę BaseTrackPlayerImpl - + Couldn't load track. Nie mogę załadować ścieżki. @@ -326,137 +333,142 @@ Importuj jako skrzynkę BaseTrackTableModel - + Album Album - + Album Artist Wykonawca albumu - + Artist Wykonawca - + Bitrate Bitrate - + BPM BPM - + Channels Kanały - + Color Kolor - + Comment Komentarz - + Composer Kompozytor - + Cover Art Okładka - + Date Added Data dodania - + Last Played Ostatnio grane - + Duration Czas trwania - + Type Typ - + Genre Gatunek - + Grouping Grupowanie - + Key Tonacja - + Location Lokalizacja - + + Overview + + + + Preview Podgląd - + Rating Ocena - + ReplayGain GainPowtórki - + Samplerate Próbkowanie - + Played Zagrane - + Title Tytuł - + Track # Nr ścieżki - + Year Rok - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -544,67 +556,77 @@ Importuj jako skrzynkę BrowseFeature - + Add to Quick Links Dodaj do Szybkich Odnośników - + Remove from Quick Links Usuń z Szybkich Odnośników - + Add to Library Dodaj do Biblioteki - + Refresh directory tree - + Quick Links Szybkie Odnośniki - - + + Devices Nośniki - + Removable Devices Urządzenia wymienne - - + + Computer Komputer - + Music Directory Added Dodano katalog z muzyką - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Dodałeś jeden lub więcej katalogów z muzyką. Utwory z tych katalogów nie będą dostępne dopóki ponownie nie przeskanujesz biblioteki. Czy chcesz zrobić to teraz? - + Scan Skanuj - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Komputer" pozwala Ci nawigować, przeglądać i ładować ścieżki z folderów na dysku twardym komputera oraz na urządzeniach zewnętrznych. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1047,13 +1069,13 @@ trace - Above + Profiling messages - + Set to full volume Ustaw głośność na maksimum - + Set to zero volume Ustaw głośność na zero @@ -1078,13 +1100,13 @@ trace - Above + Profiling messages Przycisk reverse roll (cenzuruj) - + Headphone listen button Przycisk odsłuchu słuchawkowego - + Mute button Przycisk wyciszenia @@ -1095,25 +1117,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Orientacja miksu (np. lewo, prawo, środek) - + Set mix orientation to left Ustaw kierunek miksowania na lewo - + Set mix orientation to center Ustaw kierunek miksowania na środek - + Set mix orientation to right Ustaw kierunek miksowania na prawo @@ -1154,22 +1176,22 @@ trace - Above + Profiling messages Przycisk wstukiwania bitu - + Toggle quantize mode Przełącz tryb kwantyzacji - + One-time beat sync (tempo only) Jednorazowa synchronizacja rytmu (tylko tempo) - + One-time beat sync (phase only) Jednorazowa synchronizacja rytmu (tylko faza) - + Toggle keylock mode Przełącz tryb blokowania @@ -1179,193 +1201,193 @@ trace - Above + Profiling messages Equalizery - + Vinyl Control Kontrola vinylem - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Przełącz kontrolę vinylem w trybie CUE (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Przełącz kontrolę vinylem (ABS/REL/CONST) - + Pass through external audio into the internal mixer Przepuść zewnętrzne audio do wewnętrznego miksera - + Cues Znaczniki Cue - + Cue button Przycisk Cue - + Set cue point Ustaw punkt Cue - + Go to cue point Idź do Cue - + Go to cue point and play Idź do Cue i odtwarzaj - + Go to cue point and stop Idź do Cue i zatrzymaj - + Preview from cue point Podejrzyj od Cue - + Cue button (CDJ mode) Przycisk Cue (tryb CDJ) - + Stutter cue - + Hotcues Znaczniki hotcue - + Set, preview from or jump to hotcue %1 Ustaw, przejrzyj od lub przejdź do hotcue %1 - + Clear hotcue %1 Wyczyść hotcue %1 - + Set hotcue %1 Ustaw hotcue %1 - + Jump to hotcue %1 Przeskocz do hotcue %1 - + Jump to hotcue %1 and stop Przeskocz do hotcue %1 i zatrzymaj - + Jump to hotcue %1 and play Skocz do hotcue %1 i odtwarzaj - + Preview from hotcue %1 Przejrzyj od hotcue %1 - - + + Hotcue %1 Skrót %1 - + Looping Zapętlanie - + Loop In button Przycisk początku pętli - + Loop Out button Przycisk końca pętli - + Loop Exit button Przycisk wyjścia z pętli - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Przesuń pętlę naprzód o %1 beat'ów - + Move loop backward by %1 beats Przesuń pętlę wstecz o %1 beat'ów - + Create %1-beat loop Stwórz %1-beatową pętlę - + Create temporary %1-beat loop roll Utwórz tymczasową pętlę %1-beatową @@ -1481,20 +1503,20 @@ trace - Above + Profiling messages - - + + Volume Fader Regulacja głośności - + Full Volume Maksymalna głóśność - + Zero Volume Głośność zero @@ -1510,7 +1532,7 @@ trace - Above + Profiling messages - + Mute Wycisz @@ -1521,7 +1543,7 @@ trace - Above + Profiling messages - + Headphone Listen Odsłuch na słuchawkach @@ -1542,25 +1564,25 @@ trace - Above + Profiling messages - + Orientation Kierunek - + Orient Left Kierunek w lewo - + Orient Center Kierunek środek - + Orient Right Kierunek w prawo @@ -1630,82 +1652,82 @@ trace - Above + Profiling messages Skoryguj siatkę tempa do prawej - + Adjust Beatgrid Reguluje siatkę uderzeń - + Align beatgrid to current position Wyrównaj siatkę tempa do bieżącej pozycji - + Adjust Beatgrid - Match Alignment Skoryguj siatkę tempa - dopasuj wyrównanie - + Adjust beatgrid to match another playing deck. Skoryguj siatkę tempa aby pasowała do drugiego grającego odtwarzacza. - + Quantize Mode Tryb Kwantyzacji - + Sync Synchronizuj - + Beat Sync One-Shot Synchronizacja bitów One-Shot - + Sync Tempo One-Shot Synchronizacja tempa One-Shot - + Sync Phase One-Shot Synchronizacja fazy One-Shot - + Pitch control (does not affect tempo), center is original pitch Kontrola wysokości dźwięku (nie wpływa na tempo), środek to oryginalna wysokość - + Pitch Adjust Dostosowanie Tonu - + Adjust pitch from speed slider pitch Dostosuj wysokość za pomocą suwaka prędkości - + Match musical key Dopasuj klucz muzyczny - + Match Key Dopasuj Klucz - + Reset Key Przywróć Klucz - + Resets key to original Przywróć klucz do oryginalnego @@ -1746,451 +1768,451 @@ trace - Above + Profiling messages Basy - + Toggle Vinyl Control Przełącza kontrolę winylem - + Toggle Vinyl Control (ON/OFF) Przełącz kontrolę winylem (Włącz/Wyłącz) - + Vinyl Control Mode Tryb kontroli winylem - + Vinyl Control Cueing Mode Przejście kontroli CUE winylu - + Vinyl Control Passthrough Przejście kontroli winylu - + Vinyl Control Next Deck Kontrola Vinyla Następny Deck - + Single deck mode - Switch vinyl control to next deck Tryb pojedynczego odtwarzacza - Przełącz kontrole winylem do następnego odtwarzacza - + Cue Wskaźnik (Cue) - + Set Cue Ustaw wskaźnik (Cue) - + Go-To Cue Idź do Cue - + Go-To Cue And Play Idź do Cue i odtwarzaj - + Go-To Cue And Stop Idź do Cue i zatrzymaj - + Preview Cue Podgląd Cue - + Cue (CDJ Mode) Cue (Tryb CDJ) - + Stutter Cue Wskazóœka CUE - + Go to cue point and play after release Idź do punktu CUE i odtwarzaj po puszczeniu - + Clear Hotcue %1 Wyczysć HotCue %1 - + Set Hotcue %1 Ustaw HotCue %1 - + Jump To Hotcue %1 Skocz do HotCue %1 - + Jump To Hotcue %1 And Stop Skocz do HotCue %1 i zatrzymaj - + Jump To Hotcue %1 And Play Skocz do HotCue %1 i odtwarzaj - + Preview Hotcue %1 Pokaż HotCue %1 - + Loop In Początek pętli - + Loop Out Koniec pętli - + Loop Exit Wyjście z pętli - + Reloop/Exit Loop Powtórz/Wyjdź z pętli - + Loop Halve Połowa pętli - + Loop Double Podwojenie pętli - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Przesuń pętlę +%1 beat'ów - + Move Loop -%1 Beats Przesuń pętlę -%1 beat'ów - + Loop %1 Beats Pętla %1 beat'ów - + Loop Roll %1 Beats Zapętlenie % 1 beat'ów - + Add to Auto DJ Queue (bottom) Dodaj do kolejki Auto DJ (dół) - + Append the selected track to the Auto DJ Queue Dołącz wybrany utwór do kolejki Auto DJ - + Add to Auto DJ Queue (top) Dodaj do kolejki Auto DJ (góra) - + Prepend selected track to the Auto DJ Queue Dodaj wybrany utwór do kolejki Auto DJ - + Load Track Załaduj utwór - + Load selected track Załaduj zaznaczoną scieżkę - + Load selected track and play Załaduj zaznaczoną ścieżkę i odtwórz - - + + Record Mix Zarejestruj mix - + Toggle mix recording Przełącz rejestrację mix'u - + Effects Efekty - + Quick Effects Szybkie efekty - + Deck %1 Quick Effect Super Knob Super Gałka Szybkiego Efektu dla odtwarzacza %1 - + Quick Effect Super Knob (control linked effect parameters) Szybka Super Gałka (kontroluje połączone parametry efektów) - - + + Quick Effect Szybki Efekt - + Clear Unit Wyczyść Jednostkę - + Clear effect unit Wyczyść moduł efektu - + Toggle Unit Przełącz moduł - + Dry/Wet Suchy/Mokry - + Adjust the balance between the original (dry) and processed (wet) signal. Dostosuj balans pomiędzy sygnałem oryginalnym (suchym) i przetworzonym (mokrym). - + Super Knob Super Gałka - + Next Chain Następny łańcuch - + Assign Przypisz - + Clear Wyczyść - + Clear the current effect Wyczyść bieżący efekt - + Toggle Przełącz - + Toggle the current effect Przełącz bieżący efekt - + Next Następny - + Switch to next effect Przełącz do następnego efektu - + Previous Wstecz - + Switch to the previous effect Przełącz do poprzedniego efektu - + Next or Previous Następny lub Poprzedni - + Switch to either next or previous effect Przełącz do następnego lub poprzedniego efektu - - + + Parameter Value Wartość parametru - - + + Microphone Ducking Strength Moc wyciszania mikrofonu - + Microphone Ducking Mode Tryb wyciszania mikrofonu - + Gain Wzmocnienie - + Gain knob Pokrętło wzmocnienia - + Shuffle the content of the Auto DJ queue Przetasuj zawartość kolejki Auto DJ - + Skip the next track in the Auto DJ queue Pomiń następny utwór w kolejce Auto DJ - + Auto DJ Toggle Przełącznik trybu Auto DJ - + Toggle Auto DJ On/Off Włącz/Wyłącz tryb Auto DJ - + Show/hide the microphone & auxiliary section Pokaż/ukryj sekcję mikrofonu i sekcji pomocniczej - + 4 Effect Units Show/Hide 4 jednostki efektów Pokaż/Ukryj - + Switches between showing 2 and 4 effect units Przełącza pomiędzy wyświetlaniem 2 i 4 jednostek efektów - + Mixer Show/Hide Mikser Pokaż/Ukryj - + Show or hide the mixer. Pokazuje lub ukrywa Mikser - + Cover Art Show/Hide (Library) Pokaż/ukryj okładkę (biblioteka) - + Show/hide cover art in the library Pokaż/ukryj okładkę w bibliotece - + Library Maximize/Restore Maksymalizuj/Przywróć Bibliotekę - + Maximize the track library to take up all the available screen space. Maksymalizuj bibliotekę utworów, aby wykorzystać całe dostępne miejsce na ekranie. - + Effect Rack Show/Hide Moduł Efektów Pokaż/Ukryj - + Show/hide the effect rack Pokaż/ukryj Moduł Efektów - + Waveform Zoom Out Zmniejsz wykres dźwięku @@ -2205,102 +2227,102 @@ trace - Above + Profiling messages Wzmocnienie słuchawek - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync Stuknij, aby zsynchronizować tempo (i fazę z włączoną kwantyzacją), przytrzymaj, aby włączyć stałą synchronizację - + One-time beat sync tempo (and phase with quantize enabled) Jednorazowa synchronizacja rytmu (i faza z włączoną kwantyzacją) - + Playback Speed Prędkość odtwarzania - + Playback speed control (Vinyl "Pitch" slider) Kontrola prędkości odtwarzania (suwak Vinyl "Pitch") - + Pitch (Musical key) Wysokość tonu (klucz muzyczny) - + Increase Speed Zwiększ prędkość - + Adjust speed faster (coarse) Regulacja prędkości szybciej (zgrubna) - + Increase Speed (Fine) Zwiększ prędkość (dokładne) - + Adjust speed faster (fine) Regulacja prędkości szybciej (dokładna) - + Decrease Speed Zmniejsz prędkość - + Adjust speed slower (coarse) Regulacja prędkości wolniej (zgrubna) - + Adjust speed slower (fine) Regulacja prędkości wolniej (dokładna) - + Temporarily Increase Speed Tymczasowo Zwiększ prędkość - + Temporarily increase speed (coarse) Tymczasowo zwiększ prędkość (zgrubnie) - + Temporarily Increase Speed (Fine) Tymczasowo Zwiększ prędkość (Dokładnie) - + Temporarily increase speed (fine) Tymczasowo zwiększ prędkość (Dokładnie) - + Temporarily Decrease Speed Tymczasowo Zmniejsz prędkość - + Temporarily decrease speed (coarse) Tymczasowo zmniejsz prędkość (zgrubnie) - + Temporarily Decrease Speed (Fine) Tymczasowo Zmniejsz prędkość(dokładnie) - + Temporarily decrease speed (fine) Tymczasowo zmniejsz prędkość (dokładnie) @@ -2452,1053 +2474,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock Synchronizacja / Blokada synchronizacji - + Internal Sync Leader Główna synchronizacja wewnętrzna - + Toggle Internal Sync Leader Przełącz główną synchronizację wewnętrzną - - + + Internal Leader BPM Główna synchronizacja wewnętrzna BPM - + Internal Leader BPM +1 Główna synchronizacja wewnętrzna BPM +1 - + Increase internal Leader BPM by 1 Zwiększ główne wewnętrzne BPM o 1 - + Internal Leader BPM -1 Główna synchronizacja wewnętrzna BPM -1 - + Decrease internal Leader BPM by 1 Zmniejsz główne wewnętrzne BPM o 1 - + Internal Leader BPM +0.1 Główna synchronizacja wewnętrzna BPM +0,1 - + Increase internal Leader BPM by 0.1 Zwiększ główne wewnętrzne BPM o 0,1 - + Internal Leader BPM -0.1 Główna synchronizacja wewnętrzna BPM -0,1 - + Decrease internal Leader BPM by 0.1 Zmniejsz główne wewnętrzne BPM o 0,1 - + Sync Leader Główna synchronizacja - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) 3-stanowy przełącznik/wskaźnik trybu synchronizacji (wyłączony, miękki lider, wyraźny lider) - + Speed Prędkość - + Decrease Speed (Fine) Zmniejsz prędkość (dobrze) - + Pitch (Musical Key) Wysokość tonu (klawisz muzyczny) - + Increase Pitch Zwiększ wysokość tonu - + Increases the pitch by one semitone Zwiększa wysokość dźwięku o jeden półton - + Increase Pitch (Fine) Zwiększ wysokość dźwięku (dokładnie) - + Increases the pitch by 10 cents Zwiększa wysokość dźwięku o 10 centów - + Decrease Pitch Zmniejsz wysokość tonu - + Decreases the pitch by one semitone Zmniejsza wysokość dźwięku o jeden półton - + Decrease Pitch (Fine) Zmniejsza wysokość dźwięku (dokładnie) - + Decreases the pitch by 10 cents Zmniejsza wysokość dźwięku o 10 centów - + Keylock Blokada przycisków - + CUP (Cue + Play) CUP (CUE + start) - + Shift cue points earlier Cofnij do wcześniejszego punktu CUE - + Shift cue points 10 milliseconds earlier Przesuń punkty CUE 10 milisekund wstecz - + Shift cue points earlier (fine) Przesuń punkty CUE wstecz (dokładnie) - + Shift cue points 1 millisecond earlier Przesuń punkty CUE o 1 milisekundę wstecz - + Shift cue points later Przesuń punkt CUE dalej - + Shift cue points 10 milliseconds later Przesuń punkty CUE 10 milisekund dalej - + Shift cue points later (fine) Przesuń punkty CUE dalej (dokładnie) - + Shift cue points 1 millisecond later Przesuń punkty CUE o 1 milisekundę dalej - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 Szybkie CUE %1-%2 - + Intro / Outro Markers Markery Intro / Outro - + Intro Start Marker Start Intro Marker - + Intro End Marker Stop Intro Marker - + Outro Start Marker Start Outro Marker - + Outro End Marker Stop Outro Marker - + intro start marker start intro marker - + intro end marker stop intro marker - + outro start marker start outro marker - + outro end marker stop outro marker - + Activate %1 [intro/outro marker Aktywacja %1 - + Jump to or set the %1 [intro/outro marker Przejdź do lub ustaw %1 - + Set %1 [intro/outro marker Ustaw %1 - + Set or jump to the %1 [intro/outro marker Ustaw lub Przejdź do %1 - + Clear %1 [intro/outro marker Czyść %1 - + Clear the %1 [intro/outro marker Czyść w %1 - + if the track has no beats the unit is seconds - + Loop Selected Beats Zapętl wybrane uderzenia - + Create a beat loop of selected beat size Utwórz pętlę beatów o wybranym rozmiarze beatów - + Loop Roll Selected Beats Zapętl wybrane rytmy - + Create a rolling beat loop of selected beat size Utwórz pętlę rytmiczną o wybranym rozmiarze - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats Pętla bitów - + Loop Roll Beats Zapętlone rytmy - + Go To Loop In Przejdź do początku pętli - + Go to Loop In button Przejdź do początku przycisku Zapętlenie - + Go To Loop Out Przejdź na koniec pętli - + Go to Loop Out button Przejdź na koniec przycisku Zapętlenie - + Toggle loop on/off and jump to Loop In point if loop is behind play position Włącz/wyłącz pętlę i przejdź do punktu Loop In, jeśli pętla znajduje się za pozycją odtwarzania - + Reloop And Stop Uruchom ponownie i zatrzymaj - + Enable loop, jump to Loop In point, and stop Włącz pętlę, przejdź do punktu Loop In i zatrzymaj się - + Halve the loop length Zmniejsz o połowę długość pętli - + Double the loop length Podwoić długość pętli - + Beat Jump / Loop Move Beat skok / ruch w pętli - + Jump / Move Loop Forward %1 Beats Skok / Przesuń pętlę do przodu %1 beat - + Jump / Move Loop Backward %1 Beats Skok / Przesuń pętlę w tył %1 beat - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats Przeskocz do przodu o %1 uderzeń lub, jeśli włączona jest pętla, przesuń pętlę do przodu o %1 uderzeń - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats Przeskocz w tył o %1 uderzeń lub, jeśli włączona jest pętla, przesuń pętlę w tył o %1 uderzeń - + Beat Jump / Loop Move Forward Selected Beats Beat skok / Ruch w pętli Przesuń do przodu wybrane beaty - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats Przeskocz do przodu o wybraną liczbę uderzeń lub, jeśli włączona jest pętla, przesuń pętlę do przodu o wybraną liczbę uderzeń - + Beat Jump / Loop Move Backward Selected Beats Beat skok / Ruch w pętli Przesuń wstecz wybrane beaty - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats Przeskocz do tyłu o wybraną liczbę uderzeń lub, jeśli włączona jest pętla, przesuń pętlę do tyłu o wybraną liczbę uderzeń - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward Beat skok / Ruch w pętli Przesuń do przodu - + Beat Jump / Loop Move Backward Beat skok / Ruch w pętli Przesuń wstecz - + Loop Move Forward Pętla Przejdź do przodu - + Loop Move Backward Pętla Przejdź do tyłu - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Nawigacja - + Move up Przesuń w górę - + Equivalent to pressing the UP key on the keyboard Równoznaczne z wciśnięciem klawisza W GÓRĘ na klawiaturze - + Move down Przesuń w dół - + Equivalent to pressing the DOWN key on the keyboard Równoznaczne z wciśnięciem klawisza W DÓŁ na klawiaturze - + Move up/down Przesuń w górę/w dół - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Przesuń pionowo w dowolnym kierunku używając gałki lub wciskając klawisze W GÓRĘ/W DÓŁ - + Scroll Up Przewiń w górę - + Equivalent to pressing the PAGE UP key on the keyboard Równoznaczne z wciśnięciem klawisza PG UP na klawiaturze - + Scroll Down Przewiń w dół - + Equivalent to pressing the PAGE DOWN key on the keyboard Równoznaczne z wciśnięciem klawisza PG DN na klawiaturze - + Scroll up/down Przewiń w górę/w dół - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Przewiń pionowo w dowolnym kierunku używając gałki lub wciskając klawisze PG UP/PG DN - + Move left Przesuń w lewo - + Equivalent to pressing the LEFT key on the keyboard Równoznaczne z wciśnięciem klawisza LEWO na klawiaturze - + Move right Przesuń w prawo - + Equivalent to pressing the RIGHT key on the keyboard Równoznaczne z wciśnięciem klawisza PRAWO na klawiaturze - + Move left/right Przesuń w lewo/prawo - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Poruszaj się poziomo w dowolnym kierunku za pomocą pokrętła, tak jakbyś naciskał klawisze LEWO/PRAWO - + Move focus to right pane Przenieś fokus do prawego panelu - + Equivalent to pressing the TAB key on the keyboard Odpowiednik przytrzymywania klawisza TAB na klawiaturze - + Move focus to left pane Przenieś fokus do lewego panelu - + Equivalent to pressing the SHIFT+TAB key on the keyboard Odpowiednik naciśnięcia klawiszy SHIFT+TAB na klawiaturze - + Move focus to right/left pane Przenieś fokus do prawego/lewego panelu - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Przesuń fokus o jedno okienko w prawo lub w lewo za pomocą pokrętła, tak jak przy naciśnięciu klawiszy TAB/SHIFT+TAB - + Sort focused column Sortuj wybraną kolumnę - + Sort the column of the cell that is currently focused, equivalent to clicking on its header Posortuj kolumnę aktualnie aktywnej komórki, co odpowiada kliknięciu jej nagłówka - + Go to the currently selected item Przejdź do aktualnie wybranego elementu - + Choose the currently selected item and advance forward one pane if appropriate Wybierz aktualnie wybrany element i w razie potrzeby przejdź do przodu o jedno okienko - + Load Track and Play Załaduj utwór i odtwarzaj - + Add to Auto DJ Queue (replace) Dodaj do kolejki Auto DJ (zamień) - + Replace Auto DJ Queue with selected tracks Zastąp kolejkę Auto DJ wybranymi utworami - + Select next search history Wybierz następną historię wyszukiwania - + Selects the next search history entry Wybiera następny wpis w historii wyszukiwania - + Select previous search history Wybierz poprzednią historię wyszukiwania - + Selects the previous search history entry Wybiera poprzedni wpis historii wyszukiwania - + Move selected search entry Przenieś wybrany wpis wyszukiwania - + Moves the selected search history item into given direction and steps Przesuwa wybrany element historii wyszukiwania w określonym kierunku i krokach - + Clear search Wyczyść wyszukiwanie - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button Deck %1 Przycisk włączania szybkich efektów - + Quick Effect Enable Button Przycisk włączania szybkiego efektu - + Enable or disable effect processing Włącz lub wyłącz przetwarzanie efektu - + Super Knob (control effects' Meta Knobs) Super pokrętło (meta pokrętła efektów sterujących) - + Mix Mode Toggle Przełącznik trybu miksowania - + Toggle effect unit between D/W and D+W modes Przełącz jednostkę efektu pomiędzy trybami D/W i D+W - + Next chain preset Ustawienie następnego łańcucha - + Previous Chain Poprzedni Łańcuch - + Previous chain preset Ustawienie poprzedniego łańcucha - + Next/Previous Chain Następny/Poprzedni Łańcuch - + Next or previous chain preset Ustawienie następnego lub poprzedniego łańcucha. - - + + Show Effect Parameters Pokaż parametry efektu - + Effect Unit Assignment Przypisanie jednostki efektu - + Meta Knob Pokrętło Meta - + Effect Meta Knob (control linked effect parameters) Pokrętło Efektu Meta (kontrola parametrów powiązanych efektów) - + Meta Knob Mode Tryb Pokrętła Meta - + Set how linked effect parameters change when turning the Meta Knob. Ustaw sposób zmiany parametrów połączonych efektów podczas obracania pokrętła Meta. - + Meta Knob Mode Invert Odwrócenie trybu pokrętła Meta - + Invert how linked effect parameters change when turning the Meta Knob. Odwróć sposób, w jaki zmieniają się parametry połączonych efektów podczas obracania pokrętła Meta. - - + + Button Parameter Value Wartość parametru przycisku - + Microphone / Auxiliary Mikrofon / Zewnętrze - + Microphone On/Off Włącz/Wyłącz mikrofon - + Microphone on/off włącz/wyłącz mikrofon - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Przełącz tryb wyciszania mikrofonu(Wyłącz, Auto, Ręcznie) - + Auxiliary On/Off Zewnętrzny Włącz/Wyłącz - + Auxiliary on/off Zewnętrzny włącz/wyłącz - + Auto DJ Auto DJ - + Auto DJ Shuffle Wymieszaj Auto DJ - + Auto DJ Skip Next Auto DJ Skok do następnego - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Auto DJ Wycisz do następnego - + Trigger the transition to the next track Przełącz przejście do następnego utworu - + User Interface Interfejs Użytkownika - + Samplers Show/Hide Samplery Pokaż/Ukryj - + Show/hide the sampler section Pokaż/Ukryj sekcje samplera - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator Mikrofon i urządzenie pomocnicze Pokaż/Ukryj - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting Rozpocznij/zatrzymaj transmisję na żywo - + Stream your mix over the Internet. Transmituj swój mix przez Internet. - + Start/stop recording your mix. Rozpocznij/zatrzymaj nagrywanie miksu. - - + + Samplers Próbniki - + Vinyl Control Show/Hide Kontrola winylem Pokaż/Ukryj - + Show/hide the vinyl control section Pokaż/Ukryj sekcje kontroli winylem - + Preview Deck Show/Hide Pokaż/Schowaj Deck podglądowy - + Show/hide the preview deck Pokaż/ukryj podgląd decka - + Toggle 4 Decks Przełącz 4 odtwarzacze. - + Switches between showing 2 decks and 4 decks. Przełącza między wyświetlaniem 2 i 4 odtwarzaczy. - + Cover Art Show/Hide (Decks) Pokaż/ukryj okładkę (Decki) - + Show/hide cover art in the main decks Pokaż/ukryj okładkę na głównych deckach - + Vinyl Spinner Show/Hide Pokaż/Ukryj tarczę winyla - + Show/hide spinning vinyl widget Pokaż/Ukryj wirującą płytę vinylową - + Vinyl Spinners Show/Hide (All Decks) Spinnery winylowe Pokaż/Ukryj (wszystkie decki) - + Show/Hide all spinnies Pokaż/ukryj wszystkie krążki - + Toggle Waveforms Przełącz przebiegi - + Show/hide the scrolling waveforms. Pokaż/ukryj przewijane przebiegi. - + Waveform zoom Skalowanie wykresu dźwięku - + Waveform Zoom Skalowanie wykresu dźwięku - + Zoom waveform in Powiększ wykres dźwięku - + Waveform Zoom In Powiększ wykres dźwięku - + Zoom waveform out Zmniejsz wykres dźwięku - + Star Rating Up Ocena gwiazdkowa w górę - + Increase the track rating by one star Zwiększ ocenę utworu o jedną gwiazdkę - + Star Rating Down Ocena gwiazdkowa w dół - + Decrease the track rating by one star Zmniejsz ocenę utworu o jedną gwiazdkę @@ -3613,32 +3645,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Funkcjonalność zapewniana przez to mapowanie kontrolera zostanie wyłączona do czasu rozwiązania problemu. - + You can ignore this error for this session but you may experience erratic behavior. Możesz zignorować ten błąd w tej sesji, ale może wystąpić nieprawidłowe zachowanie. - + Try to recover by resetting your controller. Spróbuj przwrócić resetując swój kontroler - + Controller Mapping Error Błąd mapowania kontrolera - + The mapping for your controller "%1" is not working properly. Mapowanie kontrolera „%1” nie działa poprawnie. - + The script code needs to be fixed. Kod skryptu musi zostać naprawiony. @@ -3746,7 +3778,7 @@ trace - Above + Profiling messages Importuj skrzynkę - + Export Crate Eksportuj Skrzynkę @@ -3756,7 +3788,7 @@ trace - Above + Profiling messages Odblokuj - + An unknown error occurred while creating crate: Podczas tworzenia skrzynki pojawił się nieznany błąd: @@ -3765,12 +3797,6 @@ trace - Above + Profiling messages Rename Crate Zmień nazwę skrzynki - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3788,17 +3814,17 @@ trace - Above + Profiling messages Zmiana nazwy skrzynki nie powiodła się - + Crate Creation Failed Tworzenie skrzynki nie powiodło się - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista odtwarzania M3U (*.m3u);;Lista odtwarzania M3U8 (*.m3u8);;Lista odtwarzania PLS (*.pls);;Tekst CSV (*.csv);;Odczytywalny Tekst (*.txt) - + M3U Playlist (*.m3u) Lista odtwarzania M3U (*.m3u) @@ -3807,6 +3833,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Skrzynki to świetny sposób na organizację muzyki, którą chcesz mixować. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3918,12 +3950,12 @@ trace - Above + Profiling messages Byli współpracownicy - + Official Website Oficjalna strona internetowa - + Donate Wspomóż @@ -4447,37 +4479,37 @@ Często skutkuje wyższą jakością siatek beatowych, ale nie sprawdzi się dob Jeżeli mapowanie nie działa prawidłowo spróbuj włączyć opcje zaawansowane poniżej i wypróbuj kontrolkę ponownie. Możesz też kliknąć Ponów aby wykryć kontrolkę midi jeszcze raz. - + Didn't get any midi messages. Please try again. Nie otrzymano żadnych poleceń midi. Proszę spróbować ponownie. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Nie można wykryć mapowania - proszę spróbować jeszcze raz. Upewnij się, ze dotykasz tylko jednej kontrolki w danym momencie. - + Successfully mapped control: Kontrolka zamapowana prawidłowo: - + <i>Ready to learn %1</i> <i>Gotowy do nauki %1</i> - + Learning: %1. Now move a control on your controller. Uczenie: %1. Rusz teraz wybraną kontrolką na Twoim kontrolerze midi. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4518,17 +4550,17 @@ Próbowałeś się nauczyć: %1,%2 Zmień w csv - + Log Logowanie - + Search Szukaj - + Stats Statystyki @@ -5181,114 +5213,114 @@ associated with each key. DlgPrefController - + Apply device settings? Zastosować ustawienia urządzenia? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Twoje ustawienia muszą być zapisane przed uruchomieniem kreatora. Zastosować ustawienie i kontynuować? - + None Żadne - + %1 by %2 %1 wykonywane przez %2 - + Mapping has been edited Mapowanie zostało zmodyfikowane - + Always overwrite during this session Zawsze nadpisz podczas tej sesji - + Save As Zapisz Jako - + Overwrite Nadpisz - + Save user mapping Zapisz mapowanie użytkownika - + Enter the name for saving the mapping to the user folder. Wprowadź nazwę, pod którą chcesz zapisać mapowanie w folderze użytkownika. - + Saving mapping failed Zapisanie mapowania nie powiodło się - + A mapping cannot have a blank name and may not contain special characters. Mapowanie nie może mieć pustej nazwy i nie może zawierać znaków specjalnych. - + A mapping file with that name already exists. Plik mapowania o tej nazwie już istnieje. - + Do you want to save the changes? Czy chcesz zapisać zmiany? - + Troubleshooting Rozwiązywanie problemów - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. Mapowanie już istnieje. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> już istnieje w folderze mapowania użytkownika.<br>Zastąpić czy zapisać pod nową nazwą? - + Clear Input Mappings Wyczyść mapowanie przychodzące - + Are you sure you want to clear all input mappings? Czy na pewno wyczyścić wszystkie mapowania przychodzące? - + Clear Output Mappings Wyczyść mapowanie wychodzące - + Are you sure you want to clear all output mappings? Czy na pewno wyczyścić wszystkie mapowania wychodzące? @@ -5306,100 +5338,100 @@ Zastosować ustawienie i kontynuować? Włączony - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Opis: - + Support: Wsparcie: - + Screens preview - + Input Mappings Mapowania przychodzące - - + + Search Szukaj - - + + Add Dodaj - - + + Remove Usuń @@ -5419,17 +5451,17 @@ Zastosować ustawienie i kontynuować? Załaduj mapowanie: - + Mapping Info Informacje o mapowaniu - + Author: Autor: - + Name: Nazwa: @@ -5439,28 +5471,28 @@ Zastosować ustawienie i kontynuować? Kreator uczenia się kontrolera (tylko MIDI) - + Data protocol: - + Mapping Files: Pliki mapowania: - + Mapping Settings - - + + Clear All Wyczyść Wszystko - + Output Mappings Mapowania wychodzące @@ -5619,6 +5651,16 @@ Zastosować ustawienie i kontynuować? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6215,62 +6257,62 @@ Zawsze możesz przeciągnąć i upuścić ścieżki na ekranie, aby sklonować t DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Minimalny rozmiar wybranej skórki jest większy niż dostępna rozdzielczość ekranu. - + Allow screensaver to run Zezwól na uruchomienie wygaszacza ekranu - + Prevent screensaver from running Zapobiegaj uruchomieniu wygaszacza ekranu - + Prevent screensaver while playing Zapobiegaj wygaszaczowi ekranu podczas gry - + Disabled Wyłączone - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Ta skórka nie obsługuje schematów kolorów. - + Information Informacja - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7437,173 +7479,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Domyślne (długie opóźnienie) - + Experimental (no delay) Eksperymentalne (bez opóźnienia) - + Disabled (short delay) Wyłączone (krótkie opóźnienie) - + Soundcard Clock Zegar karty dźwiękowej - + Network Clock Zegar sieciowy - + Direct monitor (recording and broadcasting only) Bezpośrednie monitorowanie (tylko nagrywanie i nadawanie) - + Disabled Wyłączone - + Enabled Włączony - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Aby włączyć planowanie w czasie rzeczywistym (obecnie wyłączone), zobacz %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 zawiera listę kart dźwiękowych i kontrolerów, które warto rozważyć przy korzystaniu z Mixxx. - + Mixxx DJ Hardware Guide Przewodnik po sprzęcie Mixxx DJ - + Information Informacja - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) auto (<= 1024 klatek/okres) - + 2048 frames/period 2048 klatek/okres - + 4096 frames/period 4096 klatek/okres - + Are you sure? Jesteś pewien? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No Nie - + Yes, I know what I am doing Tak, wiem co robię - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Wejścia mikrofonowe są nieaktualne w sygnale nagrywania i nadawania w porównaniu z tym, co słyszysz. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Zmierz opóźnienie w obie strony i wprowadź je powyżej w celu kompensacji opóźnienia mikrofonu, aby dostosować taktowanie mikrofonu. - - + Refer to the Mixxx User Manual for details. Szczegółowe informacje można znaleźć w instrukcji obsługi Mixxx. - + Configured latency has changed. Ustawione opóźnienie zostało zmienione. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Zmierz ponownie opóźnienie w obie strony i wprowadź je powyżej w polu Kompensacja opóźnienia mikrofonu, aby dopasować taktowanie mikrofonu. - + Realtime scheduling is enabled. - + Planowanie w czasie rzeczywistym jest włączone. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Błąd konfiguracji @@ -7621,131 +7662,131 @@ The loudness target is approximate and assumes track pregain and main output lev API Dźwięku - + Sample Rate Próbkowanie - + Audio Buffer Bufor Audio - + Engine Clock Zegar silnika - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Użyj zegara karty dźwiękowej do konfiguracji odbiorców na żywo i najniższego opóźnienia.<br>Użyj zegara sieciowego do transmisji bez publiczności na żywo. - + Main Mix Główny Mix - + Main Output Mode - + Microphone Monitor Mode Tryb monitorowania mikrofonu - + Microphone Latency Compensation Kompensacja opóźnienia mikrofonu - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Licznik niedomiaru bufora - + 0 0 - + Keylock/Pitch-Bending Engine Silnik blokady klawiszy/wyginania tonu - + Multi-Soundcard Synchronization Synchronizacja wielu kart dźwiękowych - + Output Wyjście - + Input Wejście - + System Reported Latency Zgłoszone przez system opóźnienie - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Powiększ bufor audio, jeśli licznik niedopełnienia rośnie lub podczas odtwarzania słychać trzaski. - + Main Output Delay Główne opóźnienie wyjścia - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Podpowiedzi i diagnostyka - + Downsize your audio buffer to improve Mixxx's responsiveness. Zmniejsz Twój bufor audio aby poprawić czas odpowiedzi Mixxx'a. - + Query Devices Zapytaj Urządzenia @@ -8193,47 +8234,47 @@ Wybierz spośród różnych typów wyświetlania przebiegu, które różnią si DlgPreferences - + Sound Hardware Urządzenia Audio - + Controllers Kontrolery - + Library Biblioteka - + Interface Interfejs - + Waveforms Wykresy dźwięku - + Mixer Mikser - + Auto DJ Auto DJ - + Decks Deki - + Colors Kolory @@ -8268,47 +8309,47 @@ Wybierz spośród różnych typów wyświetlania przebiegu, które różnią si &OK - + Effects Efekty - + Recording Nagrywanie - + Beat Detection Detekcja rytmu (beat'u) - + Key Detection Detekcja Klucza - + Normalization Normalizacja - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Kontrola vinylem - + Live Broadcasting Nadawanie Live - + Modplug Decoder Dekoder Modplug @@ -8664,194 +8705,194 @@ This can not be undone! Podsumowanie - + Filetype: Typ pliku: - + BPM: BPM (uderzenia na minutę): - + Location: Lokalizacja: - + Bitrate: Bitrate: - + Comments Komentarze - + BPM BPM - + Sets the BPM to 75% of the current value. Ustawia BPM do 75% obecnej wartości. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Ustawia BPM do 50% obecnej wartości. - + Displays the BPM of the selected track. Wyświetla BPM wybranego utworu. - + Track # Nr ścieżki - + Album Artist Wykonawca albumu - + Composer Kompozytor - + Title Tytuł - + Grouping Grupowanie - + Key Tonacja - + Year Rok - + Artist Wykonawca - + Album Album - + Genre Gatunek - + ReplayGain: GainPowtórki: - + Sets the BPM to 200% of the current value. Ustawia BPM do 200% obecnej wartości. - + Double BPM Podwójny BPM - + Halve BPM Połowa BPM - + Clear BPM and Beatgrid Wyczyść BPM i siatkę beat'u - + Move to the previous item. "Previous" button Przenieś do poprzedniej pozycji. - + &Previous &Poprzedni - + Move to the next item. "Next" button Przenieś do następnej pozycji. - + &Next &Następny - + Duration: Czas trwania: - + Import Metadata from MusicBrainz Importuj metadane z MusicBrainz - + Re-Import Metadata from file Zaimportuj ponownie metadane z pliku - + Color Kolor - + Date added: Data dodania: - + Open in File Browser Otwórz plik w przeglądarce - + Samplerate: Próbkowanie: - + Track BPM: BPM Ścieżki: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. @@ -8860,90 +8901,90 @@ Użyj tego ustawienia, jeśli Twoje utwory mają stałe tempo (np. większość Często skutkuje wyższą jakością siatek beatowych, ale nie sprawdzi się dobrze w przypadku utworów zawierających zmiany tempa. - + Assume constant tempo Załóż stałe tempo - + Sets the BPM to 66% of the current value. Ustawia BPM do 66% obecnej wartości. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. Ustawia BPM do 150% obecnej wartości. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. Ustawia BPM do 133% obecnej wartości. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Uderzaj zgodnie z beat'em aby ustawić BPM zgodnie z tym który uderzasz. - + Tap to Beat Uderzaj do Bitu - + Hint: Use the Library Analyze view to run BPM detection. Podpowiedź: Użyj widoku Analizuj Kolekcję, aby uruchomić wykrywanie BPM. - + Save changes and close the window. "OK" button Zapisz zmiany i zamknij okno. - + &OK &OK - + Discard changes and close the window. "Cancel" button Porzuć zmiany i zamknij okno. - + Save changes and keep the window open. "Apply" button Zapisz zmiany i nie zamykaj okna. - + &Apply Z&astosuj - + &Cancel &Anuluj - + (no color) @@ -9100,7 +9141,7 @@ Często skutkuje wyższą jakością siatek beatowych, ale nie sprawdzi się dob &OK - + (no color) @@ -9302,27 +9343,27 @@ Często skutkuje wyższą jakością siatek beatowych, ale nie sprawdzi się dob EngineBuffer - + Soundtouch (faster) Soundtouch (szybszy) - + Rubberband (better) Rubberband (lepszy) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9537,15 +9578,15 @@ Często skutkuje wyższą jakością siatek beatowych, ale nie sprawdzi się dob LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Tryb Bezpieczny Włączony - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9556,57 +9597,57 @@ Shown when VuMeter can not be displayed. Please keep Brak wsparcia OpenGL. - + activate aktywny - + toggle przełącz - + right w prawo - + left w lewo - + right small odrobinę w prawo - + left small odrobinę w lewo - + up w górę - + down w dół - + up small odrobinę w górę - + down small odrobinę w dół - + Shortcut Skrót @@ -9614,62 +9655,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9679,22 +9720,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importuj listę odtwarzania - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Pliki list odtwarzania (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Nadpisać plik? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9744,27 +9785,27 @@ Czy na pewno chcesz to nadpisać? MidiController - + MixxxControl(s) not found Nie znaleziono MixxxControl(s) - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. Co najmniej jeden element MixxxControl określony w sekcji wyników załadowanego mapowania był nieprawidłowy. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: * Upewnij się, że dane MixxxControls rzeczywiście istnieją. Pełną listę znajdziesz w instrukcji: - + Some LEDs or other feedback may not work correctly. Któryś z LED'ów lub inne sprzężenie zwrotne może nie działać prawidłowo. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Sprawdź, czy nazwy MixxxControl są wpisane poprawnie w pliku odwzorowania (. xml) @@ -9825,18 +9866,18 @@ Czy na pewno chcesz to nadpisać? MixxxLibraryFeature - + Missing Tracks Brakujące utwory - + Hidden Tracks Ukryte utwory - Export to Engine Prime + Export to Engine DJ @@ -9848,211 +9889,252 @@ Czy na pewno chcesz to nadpisać? MixxxMainWindow - + Sound Device Busy Urządzenie dźwiękowe zajęte - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Ponów</b> po zamknięciu innej aplikacji lub podłącz ponownie urządzenie dźwiękowe - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Rekonfiguruj</b> ustawienia urządzeń dźwiękowych Mixxx'a. - - + + Get <b>Help</b> from the Mixxx Wiki. Otrzymaj <b>Pomoc</b> na Wiki Mixxx'a. - - - + + + <b>Exit</b> Mixxx. <b>Wyjdź<b> z Mixxx'a. - + Retry Ponów - + skin Skórka - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Rekonfiguruj - + Help Pomoc - - + + Exit Wyjdź - - + + Mixxx was unable to open all the configured sound devices. W przypadku błędów bazy danych po pomoc skontaktuj się z: - + Sound Device Error Błąd urządzenia dźwiękowego - + <b>Retry</b> after fixing an issue <b>Spróbuj ponownie</b> po rozwiązaniu problemu - + No Output Devices Brak urządzeń wyjściowych. - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx został skonfigurowany bez jakichkolwiek wyjściowych urządzeń dźwiękowych. Przetwarzanie dźwięku będzie wyłączone do czasu skonfigurowania urządzenia wyjściowego. - + <b>Continue</b> without any outputs. <b>Kontynuuj</b> bez urządzeń wyjściowych. - + Continue Dalej - + Load track to Deck %1 Załaduj utwór do odtwarzacza %1 - + Deck %1 is currently playing a track. Odtwarzacz %1 aktualnie odtwarza utwór. - + Are you sure you want to load a new track? Czy na pewno chcesz załadować nowy utwór? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Nie zostało wybrane urządzenie do tej kontroli winylem. Proszę najpierw wybrać urządzenie wejściowe w Urządzeniach Audio. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Nie wybrano żadnego urządzenia wejściowego dla tej kontroli przejścia. Najpierw wybierz urządzenie wejściowe w preferencjach sprzętu dźwiękowego. - + There is no input device selected for this microphone. Do you want to select an input device? Dla tego mikrofonu nie wybrano żadnego urządzenia wejściowego. Czy chcesz wybrać urządzenie wejściowe? - + There is no input device selected for this auxiliary. Do you want to select an input device? Dla tego urządzenia pomocniczego nie wybrano żadnego urządzenia wejściowego. Czy chcesz wybrać urządzenie wejściowe? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Błąd w pliku skórki. - + The selected skin cannot be loaded. Wybrana skórka nie może być załadowana. - + OpenGL Direct Rendering Renderowanie bezpośrednie OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Renderowanie bezpośrednie nie jest włączone na Twoim komputerze.<br><br>Oznacza to, że wyświetlanie przebiegów będzie bardzo <br><b>powolne i może mocno obciążać procesor</b>. Zaktualizuj<br>konfigurację, aby włączyć bezpośrednie renderowanie, albo wyłącz<br>wyświetlanie przebiegu w preferencjach Mixxx, wybierając<br>„Pusty” jako sposób wyświetlania przebiegu w sekcji „Interfejs”. - - - + + + Confirm Exit Potwierdź zamknięcie - + A deck is currently playing. Exit Mixxx? Deck właśnie gra! Wyjść z Mixxx'a? - + A sampler is currently playing. Exit Mixxx? Sampler aktualnie odtwarza. Wyjśc z Mixxx? - + The preferences window is still open. Okno właściwości jest nadal otwarte. - + Discard any changes and exit Mixxx? Porzucić wszystkie zmiany i wyjść z Mixxx? @@ -10068,13 +10150,13 @@ Czy chcesz wybrać urządzenie wejściowe? PlaylistFeature - + Lock Zablokuj - - + + Playlists Listy odtwarzania @@ -10084,32 +10166,58 @@ Czy chcesz wybrać urządzenie wejściowe? Wymieszaj Listę Odtwarzania - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Odblokuj - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Niektórzy didżeje tworzą playlisty przed ich występem na żywo, natomiast inni preferują tworzyć je w locie. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Przy zastosowaniu list odtwarzania podczas występu na żywo, pamiętaj, aby zawsze zwracać baczną uwagę na to, jak publiczność reaguje na muzykę, którą wybrałeś do gry. - + Create New Playlist Utwórz nową listę odtwarzania @@ -10511,7 +10619,7 @@ Jeśli nie chcesz przyznawać Mixxx dostępu, kliknij Anuluj w selektorze plikó Downsampling - + Downsampling @@ -11611,7 +11719,7 @@ Fully right: end of the effect period - + Deck %1 Decka %1 @@ -11744,7 +11852,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Passthrough @@ -11775,7 +11883,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11908,12 +12016,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11948,42 +12056,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12041,54 +12149,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Listy odtwarzania - + Folders Foldery - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Odczytuje bazy danych wyeksportowane dla odtwarzaczy Pioneer CDJ / XDJ przy użyciu trybu eksportu Rekordbox.<br/>Rekordbox może eksportować tylko do urządzeń USB lub SD z systemem plików FAT lub HFS.<br/>Mixxx może odczytać bazę danych z dowolnego urządzenia zawierającego foldery baz danych (<tt>PIONEER</tt> i <tt>Contents</tt>).<br/>Nie obsługiwane są bazy danych Rekordbox, które zostały przeniesione na urządzenie zewnętrzne poprzez<br/><i>Preferencje > Zaawansowane > Zarządzanie bazą danych</i>.<br/><br/>Odczytywane są następujące dane: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12647,7 +12755,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Obracajacy się vinyl @@ -12829,7 +12937,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Okładka @@ -13065,197 +13173,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Tempo i BPM Tap - + Show/hide the spinning vinyl section. Pokaż/ukryj sekcję obracającego się vinyla - + Keylock Blokada przycisków - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Odtwarzaj - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13493,926 +13601,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker Start Intro Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker Stop Intro Marker - + Outro Start Marker Start Outro Marker - + Outro End Marker Stop Outro Marker - + Mix Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Zapisz Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Wczytaj Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters Pokaż parametry efektu - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Super Gałka - + Next Chain Następny łańcuch - + Previous Chain Poprzedni Łańcuch - + Next/Previous Chain Następny/Poprzedni Łańcuch - + Clear Wyczyść - + Clear the current effect. Wyczyść obecny efekt. - + Toggle Przełącz - + Toggle the current effect. Przełącz obecny efekt. - + Next Następny - + Clear Unit Wyczyść Jednostkę - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit Przełącz moduł - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Przełącz do następnego efektu - + Previous Wstecz - + Switch to the previous effect. Przełącz do poprzedniego efektu - + Next or Previous Następny lub Poprzedni - + Switch to either the next or previous effect. Przełącz do następnego lub poprzedniego efektu. - + Meta Knob Pokrętło Meta - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Parametr efektu - + Adjusts a parameter of the effect. Reguluje parametr efektu. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter Parametr Equalizera - + Adjusts the gain of the EQ filter. Reguluje moc filtru korektora. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Podpowiedź: Zmień domyślny tryb korektora w Ustawienia -> Korekcja graficzna - - + + Adjust Beatgrid Reguluje siatkę uderzeń - + Adjust beatgrid so the closest beat is aligned with the current play position. Ustawia siatkę uderzeń tak aby najbliższa linia siatki została wyrównana do aktualnej pozycji odtwarzania. - - + + Adjust beatgrid to match another playing deck. Skoryguj siatkę tempa aby pasowała do drugiego grającego odtwarzacza. - + If quantize is enabled, snaps to the nearest beat. Jeśli kwantyzacja jest włączona, przeskakuje do najbliższego uderzenia. - + Quantize Kwantyzuje - + Toggles quantization. Przełącza kwantyzację. - + Loops and cues snap to the nearest beat when quantization is enabled. Pętle i wskaźniki przeuwają się do najbliższego uderzenia kiedy kwantyzacja jest włączona. - + Reverse Wstecz - + Reverses track playback during regular playback. Odwraca kierunek odtwarzania podczas odtwarzania utworu. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Odtwórz/Wstrzymaj - + Jumps to the beginning of the track. Skacze do początku utworu. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. Zwiększa odstrojenie o jeden półton. - + Decreases the pitch by one semitone. Zmniejsza odstrojenie o jeden półton. - + Enable Vinyl Control Włącz kontrolę vinylem - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Wskazuje, że bufor audio jest za mały, aby wykonać całe przetwarzanie audio. - + Displays cover artwork of the loaded track. Wyświetla okładkę albumu załadowanego utworu. - + Displays options for editing cover artwork. Wyświetla opcje edycji okładki albumu. - + Star Rating Ranking Gwiazdek - + Assign ratings to individual tracks by clicking the stars. Przyporządkowuje ranking do poszczególnych utworów przez kliknięcie gwiazdek. @@ -14547,33 +14661,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Rozpoczyna odtwarzanie od początku utworu. - + Jumps to the beginning of the track and stops. Skacze do początku utworu i zatrzymuje. - - + + Plays or pauses the track. Odtwarza lub pauzuje utwór. - + (while playing) (podczas odtwarzania) @@ -14593,215 +14707,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (kiedy zatrzymane) - + Cue Wskaźnik (Cue) - + Headphone Słuchawka - + Mute Wycisz - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Synchronizuje do pierwszego odtwarzacza (w porządku numerycznym) który gra i ma określony BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Jeśli żaden odtwarzacz nie gra, synchronizuje do pierwszego odtwarzacza który ma podany BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Odtwarzaczy nie można synchronizować do samplerów, a samplery można synchronizować tylko do odtwarzaczy. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. Resetuj klucz do oryginalnego klucza utworu. - + Speed Control Kontrola prędkości - - - + + + Changes the track pitch independent of the tempo. Zmienia wysokość tonu utworu nie zależnie od tempa. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust Dostosowanie Tonu - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Zarejestruj mix - + Toggle mix recording. - + Enable Live Broadcasting Włącz Nadawane na Żywo - + Stream your mix over the Internet. Transmituj swój mix przez Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. Odtwarzanie zostanie wznowione tam, gdzie byłoby gdyby nie było ustawionej pętli. - + Loop Exit Wyjście z pętli - + Turns the current loop off. Wyłącza atualny loop. - + Slip Mode Tryb poślizgu - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Kiedy aktywne, odtwarzanie jest kontynuowane w tle wyciszone podczas trwania pętli, odtwarzania w tył, skreczowania itp. - + Once disabled, the audible playback will resume where the track would have been. Kiedy nieaktywne, odtwarzanie szłyszalne, będzie kontynuowane tam gdzie ścieżki znajdowały się oryginalnie. - + Track Key The musical key of a track Tonacja Ścieżki - + Displays the musical key of the loaded track. Pokazuje tonację załadowanej ścieżki. - + Clock Zegar - + Displays the current time. Wyświetla aktualny czas. - + Audio Latency Usage Meter Wskaźnik użycia bufora opóźnienia audio. - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator Wskaźnik przeładownia bufora opóźnienia audio. @@ -14846,254 +14960,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Szybkie cofanie - + Fast rewind through the track. Szybkie przewijanie (do tyłu) przez ścieżkę. - + Fast Forward Przewiń do przodu - + Fast forward through the track. Szybkie przewijanie (do przodu) przez ścieżkę. - + Jumps to the end of the track. Przeskakuje do końca utworu. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Kontrola wysoości tonu - + Pitch Rate Wysokość tonu. - + Displays the current playback rate of the track. Wyświetla aktualną prędkość utworu. - + Repeat Powtórz - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Wysuń - + Ejects track from the player. Wysuwa ścieżkę z odtwarzacza. - + Hotcue Szybiki znacznik (Hotcue) - + If hotcue is set, jumps to the hotcue. Jeżeli Hotcue jest ustalony, przeskakuje do Hotcue. - + If hotcue is not set, sets the hotcue to the current play position. Jeżeli Hotcue nie jest ustalony, ustala Hotcue na pozycję aktualnie odtwarzaną. - + Vinyl Control Mode Tryb kontroli vinylem - + Absolute mode - track position equals needle position and speed. Tryb bezwzględny - pozycja utworu jest równa pozycji i prędkosci igły. - + Relative mode - track speed equals needle speed regardless of needle position. Tryb względny - Prędkość utworu jest równa prędkości igły niezależnie od jej pozycji. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Tryb stały - prędkość utworu jest równa ostatniej stałej prędkości igły niezależnie od wejścia. - + Vinyl Status Status vinyla - + Provides visual feedback for vinyl control status: Pokazuje wizualne sprzężenie zwrotne stanu kontroli vinylem. - + Green for control enabled. Zielone jeśli kontrola jest włączona. - + Blinking yellow for when the needle reaches the end of the record. Mrugające żółte kiedy igła osiągnie koniec nagrania. - + Loop-In Marker Znacznik początku pętli - + Loop-Out Marker Znacznik końca pętli. - + Loop Halve Połowa pętli - + Halves the current loop's length by moving the end marker. Skraca o połowę aktualną petlę przenosząc znacznik końca pętli. - + Deck immediately loops if past the new endpoint. Odtwarzacz natychmiast zapętla się jeśli przekroczy nowy punkt końcowy. - + Loop Double Podwojenie pętli - + Doubles the current loop's length by moving the end marker. Podwaja długość aktualnej pętli przenosząc znacznik końca pętli. - + Beatloop - + Toggles the current loop on or off. Przełacza biezacą pętlę (Wł./Wył.) - + Works only if Loop-In and Loop-Out marker are set. Dziala tylko iedy znaczniki początku i końca petli są ustawione. - + Vinyl Cueing Mode Tryb CUE Vinyla - + Determines how cue points are treated in vinyl control Relative mode: Ustala jak pozycje CUE są traktowane w trybie względnej kontroli vinyla: - + Off - Cue points ignored. OFF - Pozycje CUE ignorowane. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. One Cue - Kiedy igła zostaje opuszczona po pozycji CUE, przewinie ścieżkę do tej pozycji CUE. - + Track Time Całkowity czas utworu - + Track Duration Czas trwania utworu - + Displays the duration of the loaded track. Wyświetla czas trwania załadowanego utworu. - + Information is loaded from the track's metadata tags. Informacja jest załadowana z metadanych utworu. - + Track Artist Wykonawca utworu. - + Displays the artist of the loaded track. Wyświetla wykonawcę załadowanego utworu. - + Track Title Tytuł utworu - + Displays the title of the loaded track. Wyświetla tytuł załadowanego utworu. - + Track Album Album utworu - + Displays the album name of the loaded track. Wyświetla tytuł albumu, z którego pochodzi utwór. - + Track Artist/Title Wykonawca/tytuł utworu - + Displays the artist and title of the loaded track. Wyświetla nazwę wykonawcy oraz tytuł załadowanego utworu. @@ -15101,12 +15215,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15322,47 +15436,47 @@ This can not be undone! WCueMenuPopup - + Cue number Numer CUE - + Cue position Pozycja CUE - + Edit cue label - + Label... Okładka... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Hotcue #%1 @@ -15487,323 +15601,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Utwórz &Nową Listę Odtwarzania - + Create a new playlist Utwórz nową listę odtwarzania - + Ctrl+n Ctrl+n - + Create New &Crate Utwórz nową &Skrzynkę - + Create a new crate Utwórz nową Skrzynkę - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Widok - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Może nie być wspierane we wszystkich skórkach. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Pokaż Sekcję Mikrofonową - + Show the microphone section of the Mixxx interface. Pokaż sekcję mikrofonu w interfejsie Mixxx'a. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Pokaż Sekcję Kontroli Vinyli - + Show the vinyl control section of the Mixxx interface. Pokaż sekcję kontroli vinyla w interfejsie Mixxx'a. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Pokaż Podgląd Decka - + Show the preview deck in the Mixxx interface. Pokaż podgląd decka w interfejsie Mixxx'a. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Pokaż Okładę - + Show cover art in the Mixxx interface. Pokaż Okładkę w interfejsie Mixxx'a - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maksymalizuj Bibliotekę - + Maximize the track library to take up all the available screen space. Maksymalizuj bibliotekę utworów, aby wykorzystać całe dostępne miejsce na ekranie. - + Space Menubar|View|Maximize Library Spacja - + &Full Screen &Pełny Ekran - + Display Mixxx using the full screen Włącz Mixxx w trybie pełnoekranowym - + &Options &Opcje - + &Vinyl Control Kontrola &Winylem - + Use timecoded vinyls on external turntables to control Mixxx Użyj "timecoded vinyls" na zewnętrznych gramofonach aby kontrolować Mixxx'a - + Enable Vinyl Control &%1 Włącz Kontrolę Winylem &%1 - + &Record Mix &Nagraj Mix - + Record your mix to a file Nagraj swój mix do pliku - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Włącz &Nadawanie na żywo - + Stream your mixes to a shoutcast or icecast server Wysyłaj strumień mixu do serwera shoutcast/icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Włącz skróty &Klawiaturowe - + Toggles keyboard shortcuts on or off Przełącza skróty klawiaturowe (Wł./Wył.) - + Ctrl+` Ctrl+` - + &Preferences &Ustawienia - + Change Mixxx settings (e.g. playback, MIDI, controls) Zmień ustawienia Mixxx (np. odtwarzanie, MIDI, sterowanie) - + &Developer &Programista - + &Reload Skin &Wczytaj ponownie skórkę - + Reload the skin Wczytaj ponownie skórkę - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Narzędzia &Programistyczne - + Opens the developer tools dialog Otwiera okienko dialogowe z narzędziami dla programistów. - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Włącza tryb eksperymentalny. Zbiera statystyki w "Koszyku Śledzenia Eksperymentu". - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. Włącza tryb podstawowy. Zbiera statystyki w "Podstawowym Koszyku Śledzenia". - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing Włącza debugger podczas analizowania skórki - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Pomoc - + Show Keywheel menu title @@ -15820,74 +15964,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support & Wsparcie Mixxx - + Get help with Mixxx Uzyskaj pomoc Mixxx - + &User Manual I instrukcja - + Read the Mixxx user manual. Przeczytaj instrukcję użytkownika Mixxx. - + &Keyboard Shortcuts &Skróty Klawiaturowe - + Speed up your workflow with keyboard shortcuts. Przyśpiesz pracę używając skrótów klawiaturowych - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application Prze&tłumacz ten program - + Help translate this application into your language. Pomóż przetłumaczyć ta Aplikacje Na Twój język. - + &About &O programie - + About the application O programie @@ -15895,25 +16039,25 @@ This can not be undone! WOverview - + Passthrough Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source Ładowanie ścieżki... - + Finalizing... Text on waveform overview during finalizing of waveform analysis Kończenie... @@ -15922,25 +16066,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Wyczyść wejście - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Szukaj - + Clear input Wyczyść wejście @@ -15951,170 +16083,163 @@ This can not be undone! Szukaj... - + Clear the search bar input field - - Enter a string to search for - Wpisz słowo do wyszukania + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Skrót + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Skupienie - + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspce + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Wyjdź z wyszukiwania + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Tonacja - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Wykonawca - + Album Artist Wykonawca albumu - + Composer Kompozytor - + Title Tytuł - + Album Album - + Grouping Grupowanie - + Year Rok - + Genre Gatunek - + Directory - + &Search selected @@ -16122,620 +16247,625 @@ This can not be undone! WTrackMenu - + Load to Załaduj do - + Deck Odtwarzacz - + Sampler - + Add to Playlist Dodaj do listy odtwarzania - + Crates Skrzynki - + Metadata Metadane - + Update external collections - + Cover Art Okładka - + Adjust BPM Ustaw BPM - + Select Color Wybierz Kolor - - + + Analyze Analizuj - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Dodaj do kolejki Auto DJ (dół) - + Add to Auto DJ Queue (top) Dodaj do kolejki Auto DJ (góra) - + Add to Auto DJ Queue (replace) Dodaj do kolejki Auto DJ (zamień) - + Preview Deck Podgląd Decka - + Remove Usuń - + Remove from Playlist - + Remove from Crate - + Hide from Library Ukryj w bibliotece - + Unhide from Library Odkryj w bibliotece - + Purge from Library Usuń z biblioteki - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Właściwości - + Open in File Browser Otwórz plik w przeglądarce - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Ocena - + Cue Point Punkt CUE - - + + Hotcues Znaczniki hotcue - + Intro Intro - + Outro Outro - + Key Tonacja - + ReplayGain GainPowtórki - + Waveform - + Comment Komentarz - + All Wszystko - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Zablokuj BPM - + Unlock BPM Odblokuj BPM - + Double BPM Podwójny BPM - + Halve BPM Połowa BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Decka %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Utwórz nową listę odtwarzania - + Enter name for new playlist: Podaj nazwę dla nowej listy odtwarzania: - + New Playlist Nowa lista odtwarzania - - - + + + Playlist Creation Failed Tworzenie listy odtwarzania nie powiodło się - + A playlist by that name already exists. Lista odtwarzania o tej nazwie już istnieje. - + A playlist cannot have a blank name. Lista odtwarzania nie może mieć pustej nazwy. - + An unknown error occurred while creating playlist: Wystąpił nieznany błąd podczas tworzenia listy odtwarzania: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Anuluj - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Zamknij - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16751,37 +16881,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16789,37 +16919,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16827,12 +16957,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Pokaż lub ukryj kolumny. - + Shuffle Tracks @@ -16840,52 +16970,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Wybierz katalog biblioteki utworów. - + controllers - + Cannot open database Nie mogę otworzyć bazy danych - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16899,68 +17029,78 @@ Kliknij OK aby wyjść. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse Przeglądaj - + Export directory - + Database version - + Export Eksportuj - + Cancel Anuluj - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16981,7 +17121,7 @@ Kliknij OK aby wyjść. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16991,23 +17131,23 @@ Kliknij OK aby wyjść. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_pt.qm b/res/translations/mixxx_pt.qm index 2e07156982a38dee861a21642c172e5d099319b3..fd4b26aa57f932abf2cc9507066182b26829afd3 100644 GIT binary patch literal 297422 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

fgXnWUHXb;yg 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 Xm602EY=}3FRv!6%vFU&C$Rqz3BG*13 delta 13143 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 KLimpar fila do Auto DJ - + Remove Crate as Track Source Remover Caixa como Fonte de Faixas - + Auto DJ Auto DJ - + Confirmation Clear Confirmar limpeza - + Do you really want to remove all tracks from the Auto DJ queue? Você tem certeza que quer remover todas as faixas da fila do Auto DJ? - + This can not be undone. Esta ação não pode ser desfeita. - + Add Crate as Track Source Adicionar Caixa como Fonte de Faixas @@ -147,7 +147,7 @@ BasePlaylistFeature - + New Playlist Nova lista de reprodução @@ -158,7 +158,7 @@ - + Create New Playlist Criar nova lista de reprodução @@ -170,7 +170,7 @@ Remove - + Remover @@ -188,113 +188,120 @@ Duplicado - - + + Import Playlist Importar Playlist - + Export Track Files Exportar Pistas - + Analyze entire Playlist Analisar toda a Lista de reprodução - + Enter new name for playlist: Insira um novo nome para a lista de reprodução: - + Duplicate Playlist Duplicar Playlist - - + + Enter name for new playlist: Entre o nome da nova lista de reprodução - - + + Export Playlist Exportar Playlist - + Add to Auto DJ Queue (replace) Adicionar a fila do Auto DJ (substituir) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renomear Playlist - - + + Renaming Playlist Failed A mudança de nome da Playlist falhou - - - + + + A playlist by that name already exists. Já existe uma Playlist com este nome - - - + + + A playlist cannot have a blank name. A Playlist não pode ter um nome vazio - + _copy //: Appendix to default name when duplicating a playlist _copiar - - - - - - + + + + + + Playlist Creation Failed A criação da Lista de reprodução falhou - - + + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a Playlist - + Confirm Deletion Confimar a remoção - + Do you really want to delete playlist <b>%1</b>? Você realmente deseja excluir a lista de reprodução <b>%1</b>? - + M3U Playlist (*.m3u) Lista de reprodução M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista M3U (*.m3u);;Lista M3U8 (*.m3u8);;Lista PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) @@ -302,12 +309,12 @@ BaseSqlTableModel - + # - + Timestamp Data/Hora @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. NAO FOI Possível carregar a Faixa @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Álbum Artista - + Artist Artista - + Bitrate Bit rate - + BPM - + BPM - + Channels Canais - + Color - + Cor - + Comment Comentário - + Composer Compositor - + Cover Art Capa - + Date Added Data Adicionada - + Last Played Última Execução - + Duration Duração - + Type Tipo - + Genre Gênero - + Grouping Agrupar - + Key Nota - + Location LOCALIZAÇÃO - + + Overview + + + + Preview Prévia - + Rating classificação - + ReplayGain ReplayGain - + Samplerate Taxa de amostragem - + Played Reproduzido - + Title Título - + Track # Faixa # - + Year Ano - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Buscando imagem ... @@ -541,67 +553,77 @@ BrowseFeature - + Add to Quick Links Adicionar AOS Ligações - + Remove from Quick Links Retirar dos links - + Add to Library Adicionar à Biblioteca - + Refresh directory tree Recarregar pastas - + Quick Links Links Rápidos - - + + Devices Dispositivos - + Removable Devices Dispositivos Removíveis - - + + Computer Computador - + Music Directory Added Directoria de Musica Adicionada - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Adicionou uma ou mais diretorias de musicas. As musicas nestas diretorias não estarão disponíveis até atualizar a sua biblioteca. Deseja atualizar agora ? - + Scan - + Examinar - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computador" permite que você navegue, veja e carregue faixas de pastas do seu disco rígido ou de dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -678,7 +700,7 @@ Bitrate - + Bit rate @@ -688,7 +710,7 @@ Location - + LOCALIZAÇÃO @@ -726,7 +748,7 @@ The file '%1' could not be found. - + O arquivo '%1' não pôde ser encontrado. @@ -888,7 +910,7 @@ trace - Above + Profiling messages Remove Palette - + Remover Paleta @@ -916,7 +938,7 @@ trace - Above + Profiling messages No control chosen. - + Nenhum controlo escolhido. @@ -994,7 +1016,7 @@ trace - Above + Profiling messages Effect Rack %1 - + Rack de Efeitos %1 @@ -1004,7 +1026,7 @@ trace - Above + Profiling messages Mixer - + Mixer @@ -1025,7 +1047,7 @@ trace - Above + Profiling messages Headphone delay - + Atraso Auscultador @@ -1044,13 +1066,13 @@ trace - Above + Profiling messages - + Set to full volume Volume Máximo - + Set to zero volume Volume Mínimo @@ -1075,15 +1097,15 @@ trace - Above + Profiling messages Tecla de rolagem inversa (Censurar) - + Headphone listen button Botão de audição dos fones - + Mute button - + Tecla de Silêncio @@ -1092,27 +1114,27 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Orientação da Mistura (ex.: esquerda, direita, centro) - + Set mix orientation to left - + Definir orientação da mistura à esquerda - + Set mix orientation to center Definir orientação da mixagem para o centro - + Set mix orientation to right - + Definir orientação da mistura à direita @@ -1151,22 +1173,22 @@ trace - Above + Profiling messages Botão de batimento BPM - + Toggle quantize mode Activar/desactivar o modo de quantificação - + One-time beat sync (tempo only) - + Sincronização pontual da batida (só tempo) - + One-time beat sync (phase only) - + Sincronização pontual da batida (só fase) - + Toggle keylock mode Activar/desactivar o modo de bloqueio @@ -1176,193 +1198,193 @@ trace - Above + Profiling messages Equalizadores - + Vinyl Control Controlo Vinilo - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Activar/desactivar o modo de marcação do controlo vinilo (OFF/UM/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Activar/desactivar o modo de controlo vinilo (ABS/REL/CONST) - + Pass through external audio into the internal mixer Passar audio externo para o misturador interno - + Cues Marcas - + Cue button Tecla de marca - + Set cue point Definir o ponto de marcação - + Go to cue point Ir para marca - + Go to cue point and play Ir para marca e tocar - + Go to cue point and stop Ir para o ponto de marcação e parar - + Preview from cue point - + Antevisão a partir do ponto de marcação - + Cue button (CDJ mode) Botão Cue (modo CDJ) - + Stutter cue - + Marcação Stutter - + Hotcues Marcações - + Set, preview from or jump to hotcue %1 Definir, escutar de ou pular ao hotcue %1 - + Clear hotcue %1 Apagar o marcador %1 - + Set hotcue %1 - + Definir a Hot Cue %1 - + Jump to hotcue %1 Ir para o marcador %1 - + Jump to hotcue %1 and stop Ir para o marcador %1 e parar - + Jump to hotcue %1 and play Pular para hotcue %1 e jogar - + Preview from hotcue %1 - + Antevisão a partir da Hot Cue %1 - - + + Hotcue %1 Pistas Quentes %1 - + Looping Looping - + Loop In button Tecla de entrada em Loop - + Loop Out button Botão de saída de Loop - + Loop Exit button Botão de saída de ciclo - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Mover o loop para frente %1 batidas - + Move loop backward by %1 beats - + Move o loop para trás %1 batidas - + Create %1-beat loop Criar um loop com %1 tempos - + Create temporary %1-beat loop roll Criar temporariamente %1 -beat loop roll @@ -1374,7 +1396,7 @@ trace - Above + Profiling messages Slot %1 - + Compartimento %1 @@ -1384,12 +1406,12 @@ trace - Above + Profiling messages Headphone Split Cue - + Escuta Dividida no Auscultador Headphone Delay - + Atraso Auscultador @@ -1419,7 +1441,7 @@ trace - Above + Profiling messages Strip Search - + Busca pela Faixa @@ -1478,22 +1500,22 @@ trace - Above + Profiling messages - - + + Volume Fader Fader de Volume - + Full Volume Volume Total - + Zero Volume - + Volume Zero @@ -1503,11 +1525,11 @@ trace - Above + Profiling messages Track Gain knob - + Botão de Ganho da Faixa - + Mute Mutar @@ -1518,14 +1540,14 @@ trace - Above + Profiling messages - + Headphone Listen - + Escuta de Auscultador Headphone listen (pfl) button - + Botão de escuta de auscultador (PFL) @@ -1539,25 +1561,25 @@ trace - Above + Profiling messages - + Orientation Orientação - + Orient Left Orientação à Esquerda - + Orient Center Orientação ao Centro - + Orient Right Orientação à Direita @@ -1574,7 +1596,7 @@ trace - Above + Profiling messages BPM +0.1 - + BPM +0.1 @@ -1589,7 +1611,7 @@ trace - Above + Profiling messages Adjust Beatgrid Faster +.01 - + Ajustar Grelha de Batidas Mais Rápido +.01 @@ -1604,12 +1626,12 @@ trace - Above + Profiling messages Decrease track's average BPM by 0.01 - + Atrasa o BPM médio da faixa de 0.01 Move Beatgrid Earlier - + Mover Grelha de Batidas Cedo @@ -1619,7 +1641,7 @@ trace - Above + Profiling messages Move Beatgrid Later - + Mover Grelha de Batidas Tarde @@ -1627,84 +1649,84 @@ trace - Above + Profiling messages Move a grade de batidas à direita - + Adjust Beatgrid Ajustar a grelha ritmica - + Align beatgrid to current position - + Alinhar a grade de batidas à posição atual - + Adjust Beatgrid - Match Alignment - + Ajustar Grelha de Batidas - Igualar Alinhamento - + Adjust beatgrid to match another playing deck. - + Ajusta a grelha de batidas para corresponder um outro leitor em reprodução. - + Quantize Mode - + Modo Quantização - + Sync Sincronizar - + Beat Sync One-Shot Sincronizar a Batida De Uma Vez - + Sync Tempo One-Shot - + Sincronizar o Tempo De Uma Vez - + Sync Phase One-Shot Sincronizar a Fase De Uma Vez - + Pitch control (does not affect tempo), center is original pitch - + Controlo de tom (não afeta o tempo), ao centro é o tom original - + Pitch Adjust - + Ajustar Tom - + Adjust pitch from speed slider pitch - + Ajustar o tom com o cursor de velocidade - + Match musical key - + Igualar o tom musical - + Match Key - + Igualar Tom - + Reset Key - + Redefinir o Tom - + Resets key to original - + Redefine o tom para o original @@ -1714,7 +1736,7 @@ trace - Above + Profiling messages Mid EQ - + Equalizador dos Médios @@ -1743,563 +1765,563 @@ trace - Above + Profiling messages Equalizador dos Graves - + Toggle Vinyl Control - + Alternar Controlo do Vinil - + Toggle Vinyl Control (ON/OFF) Alternar o Controle por Vinil (Ligado/Desligado) - + Vinyl Control Mode Modo de Controlo Vinilo - + Vinyl Control Cueing Mode - + Controlo do Vinil Modo Marcação - + Vinyl Control Passthrough - + Controlo do Vinil Passthrough - + Vinyl Control Next Deck - + Controlo do Vinil Próximo Leitor - + Single deck mode - Switch vinyl control to next deck - + Modo leitor único - Comutar o controlo do vinil para Próximo Leitor - + Cue Marca de início - + Set Cue - + Definir Cue - + Go-To Cue - + Ir Para Cue - + Go-To Cue And Play - + Ir para Marcação e Tocar - + Go-To Cue And Stop - + Ir para Marcação e Parar - + Preview Cue - + Antevisão Marcação - + Cue (CDJ Mode) - + Cue (Modo CDJ) - + Stutter Cue - + Marcação Stutter - + Go to cue point and play after release Avança até ao Cue Point e toca a faixa após largar o botão. - + Clear Hotcue %1 Limpar Hotcue %1 - + Set Hotcue %1 - + Definir Hot Cue %1 - + Jump To Hotcue %1 Pular Para Hotcue %1 - + Jump To Hotcue %1 And Stop - + Pular Para Hotcue %1 e Parar - + Jump To Hotcue %1 And Play Pular Para Hotcue %1 e Tocar - + Preview Hotcue %1 - + Escutar Hotcue %1 - + Loop In - + Início de Loop - + Loop Out Saída do Loop - + Loop Exit - + Saída do Loop - + Reloop/Exit Loop - + Reloopar/Sair do Loop - + Loop Halve Reduz o loop a metade - + Loop Double Duplicação do loop - + 1/32 1/32 - + 1/16 1/16 - + 1/8 - + 1/8 - + 1/4 - + 1/4 - + Move Loop +%1 Beats - + Mover Loop +%1 Batidas - + Move Loop -%1 Beats - + Mover o Loop -%1 Batidas - + Loop %1 Beats - + Loopar %1 Batidas - + Loop Roll %1 Beats - + Loopar Temporariamente %1 Batidas - + Add to Auto DJ Queue (bottom) Juntar à fila Auto DJ (em baixo) - + Append the selected track to the Auto DJ Queue - + Coloca a faixa selecionada no final da fila Auto DJ - + Add to Auto DJ Queue (top) Juntar à fila Auto DJ (em cima) - + Prepend selected track to the Auto DJ Queue - + Adicionar a faixa selecionada no começo da fila do Auto DJ - + Load Track - + Carregar Faixa - + Load selected track - + Carregar a faixa seleccionada - + Load selected track and play Carregar faixa selecionada e reproduzir - - + + Record Mix Gravar Mixagem - + Toggle mix recording - + Alternar gravação da mistura - + Effects Efeitos - + Quick Effects - + Efeitos Rápidos - + Deck %1 Quick Effect Super Knob - + Super Botão de Efeito Rápido do Deck %1 - + Quick Effect Super Knob (control linked effect parameters) - + Super Botão de Efeito Rápido (controla os parâmetros do efeito a que está ligado) - - + + Quick Effect - + Efeito Rápido - + Clear Unit - + Limpar Unidade - + Clear effect unit Limpar unidade de efeitos - + Toggle Unit - + Ligar/Desligar Unidade - + Dry/Wet - + Seco/Molhado - + Adjust the balance between the original (dry) and processed (wet) signal. Define o balançoentre o sinal original (seco) e o processado (molhado). - + Super Knob - + Super Botão - + Next Chain - + Próxima Corrente - + Assign Atribuir - + Clear - + Limpar - + Clear the current effect - + Limpar o efeito corrente - + Toggle Ligar/Desligar - + Toggle the current effect - + Alternar o efeito corrente - + Next Seguinte - + Switch to next effect Muda para o próximo efeito - + Previous Anterior - + Switch to the previous effect - + Trocar para o efeito anterior - + Next or Previous - + Próximo ou Anterior - + Switch to either next or previous effect - + Comutar quer para o próximo ou anterior efeito - - + + Parameter Value - + Valor do Parâmetro - - + + Microphone Ducking Strength Força da Redução de Música do Microfone - + Microphone Ducking Mode Modo de Redução de Música do Microfone - + Gain Ganho - + Gain knob Controlo de Ganho - + Shuffle the content of the Auto DJ queue Reproduzir aleatoriamente o conteúdo da fila Auto DJ - + Skip the next track in the Auto DJ queue - + Pular a próxima faixa na fila do Auto DJ - + Auto DJ Toggle Ligar/Desligar Auto DJ - + Toggle Auto DJ On/Off - + Ligar/Desligar Auto DJ - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Mostra ou oculta o misturador. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximizar/Restaurar Biblioteca - + Maximize the track library to take up all the available screen space. - + Maximiza a biblioteca de faixas para ocupar todo o espaço disponível do ecrã. - + Effect Rack Show/Hide Mostrar/Ocultar Prateleira de Efeitos - + Show/hide the effect rack - + Mostra/Oculta a prateleira de efeitos - + Waveform Zoom Out - + Reduzir Forma de Onda Headphone Gain - + Ganho Auscultador Headphone gain - + Ganho dos auscultadores - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync Toque para sincronizar o tempo (e fase com a quantização ativada), segure para ativar a sincronização permanente - + One-time beat sync tempo (and phase with quantize enabled) - + Tempo de sincronização de batida única (e fase com quantização ativada) - + Playback Speed - + Velocidade da Reprodução - + Playback speed control (Vinyl "Pitch" slider) Controle da velocidade da reprodução (Deslizante de "Pitch" do Vinil) - + Pitch (Musical key) Pitch (Tom musical) - + Increase Speed - + Aumentar a Velocidade - + Adjust speed faster (coarse) - + Aumentar a velocidade (grosso) - + Increase Speed (Fine) - + Aumentar Velocidade (Fino) - + Adjust speed faster (fine) Aumentar a velocidade (fino) - + Decrease Speed Diminuir a Velocidade - + Adjust speed slower (coarse) - + Diminuir a velocidade (grosso) - + Adjust speed slower (fine) Diminuir a velocidade (fino) - + Temporarily Increase Speed Temporariamente Aumentar a Velocidade - + Temporarily increase speed (coarse) - + Temporariamente aumentar a velocidade (grosso) - + Temporarily Increase Speed (Fine) Temporariamente Aumentar a Velocidade (Fino) - + Temporarily increase speed (fine) Temporariamente aumentar a velocidade (fino) - + Temporarily Decrease Speed - + Temporariamente Diminuir a Velocidade - + Temporarily decrease speed (coarse) - + Diminuir a velocidade temporariamente (grosseiro) - + Temporarily Decrease Speed (Fine) - + Temporariamente Diminuir a Velocidade (Fino) - + Temporarily decrease speed (fine) - + Temporariamente diminuir a velocidade (fino) @@ -2350,7 +2372,7 @@ trace - Above + Profiling messages Headphone - + Auscultador @@ -2449,1053 +2471,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Velocidade - + Decrease Speed (Fine) Diminuir velocidade (Fino) - + Pitch (Musical Key) Pitch (Tom musical) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock Trava de Tom - + CUP (Cue + Play) CUP (Cue + Play, ou seja Cue + Toca a faixa) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Loop de Batidas Selecionadas - + Create a beat loop of selected beat size - + Criar um loop de batida do tamanho de batida selecionada - + Loop Roll Selected Beats - + Batidas Selecionadas da Lista de Loop - + Create a rolling beat loop of selected beat size - + Criar um loop rolado de batidas do tamanho selecionado - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In Ir para Loop In - + Go to Loop In button Botão de Ir para o Fim do Loop - + Go To Loop Out Ir para o Fim do Loop - + Go to Loop Out button Botão de Ir para o Fim do Loop - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Alterna entre ligar/desligar o loop e salta para o ponto Início de Loop, se o loop estiver atrás da posição de leitura - + Reloop And Stop - + Reloop e Parar - + Enable loop, jump to Loop In point, and stop - + Ativa o loop, salta para o ponto de Início de Loop, e pára. - + Halve the loop length - + Reduzir o loop pela metade - + Double the loop length - + Duplica o comprimento do loop - + Beat Jump / Loop Move - + Saltar Batidas / Mover Loop - + Jump / Move Loop Forward %1 Beats - + Mover o loop para frente %1 batidas - + Jump / Move Loop Backward %1 Beats Mover o loop para atrás %1 batidas - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Saltar para a frente %1 batidas, ou se o loop estiver ativado, mover o loop para a frente %1 batidas - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Saltar para trás %1 batidas, ou se o loop estiver ativado, mover o loop para trás %1 batidas - + Beat Jump / Loop Move Forward Selected Beats - + Saltar Batidas / Mover Loop Frente Batidas Selecionadas - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Saltar para a frente do número de batidas selecionadas, ou se o loop estiver ativado, mover o loop para a frente o número de batidas selecionadas - + Beat Jump / Loop Move Backward Selected Beats - + Saltar Batida / Mover Loop Atraso Batidas Selecionadas - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Saltar para trás o número de batidas selecionadas, ou se o loop estiver ativado, mover o loop para trás o número de batidas selecionadas - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navegação - + Move up Mover acima - + Equivalent to pressing the UP key on the keyboard Equivalente a pressionar a SETA ACIMA no teclado - + Move down Mover abaixo - + Equivalent to pressing the DOWN key on the keyboard Equivalente a pressionar a SETA ABAIXO no teclado - + Move up/down Mover acima/abaixo - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Move verticalmente em uma das direções usando um botão, como se pressionasse as teclas ACIMA/ABAIXO - + Scroll Up Rolar acima - + Equivalent to pressing the PAGE UP key on the keyboard - + Equivalente a pressionar a tecla PAGE UP no teclado - + Scroll Down Rolar abaixo - + Equivalent to pressing the PAGE DOWN key on the keyboard Equivalente a pressionar a tecla PAGE DOWN no teclado - + Scroll up/down Rolar acima/abaixo - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Rolar verticalmente em uma das direções usando um botão, como se pressionasse as teclas PAGE UP/PAGE DOWN - + Move left - + Mover à esquerda - + Equivalent to pressing the LEFT key on the keyboard Equivalente a pressionar a SETA À ESQUERDA no teclado - + Move right - + Mover direita - + Equivalent to pressing the RIGHT key on the keyboard Equivalente a pressionar a SETA À DIREITA no teclado - + Move left/right Mover à esquerda/direita - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Mova horizontalmente em uma das direções usando um botão, como ao pressionar as teclas ESQUERDA/DIREITA - + Move focus to right pane Move o foco ao painel da direita - + Equivalent to pressing the TAB key on the keyboard - + Equivalente a pressionar a tecla TAB no teclado - + Move focus to left pane - + Mover o foco para o painel da esquerda - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Equivalente a pressionar SHIFT+TAB no teclado - + Move focus to right/left pane - + Mover o foco para o painel direita/esquerda - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Move o foco um painel à direita ou esquerda usando um botão, como se pressionasse TAB/SHIFT-TAB - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Ir para o item seleccionado correntemente - + Choose the currently selected item and advance forward one pane if appropriate - + Escolher o item seleccionado correntemente e avançar um para a frente - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Adicionar à Fila Auto DJ (Substituir) - + Replace Auto DJ Queue with selected tracks - + Substituir Fila Auto DJ com as faixas selecionadas - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Botão de Ativar Efeito Rápido no Leitor %1 - + Quick Effect Enable Button - + Botão de Ativar Efeito Rápido - + Enable or disable effect processing Ativar ou desativar processamento de efeitos - + Super Knob (control effects' Meta Knobs) - + Super Botão (controla os efeitos dos Meta Botões) - + Mix Mode Toggle - + Alternar Modo Mistura - + Toggle effect unit between D/W and D+W modes - + Alternar unidade de efeito entre os modos S/M e S+M - + Next chain preset - + Próxima cadeia predefinida - + Previous Chain Corrente Anterior - + Previous chain preset Prédefinição de corrente anterior - + Next/Previous Chain - + Corrente Seguinte/Anterior - + Next or previous chain preset Prédefinição da corrente seguinte ou anterior - - + + Show Effect Parameters - + Mostrar Parâmetros dos Efeitos - + Effect Unit Assignment - + Meta Knob - + Botão Meta - + Effect Meta Knob (control linked effect parameters) - + Meta Botão Efeitos (controla os parâmetros dos efeitos a que está ligado) - + Meta Knob Mode - + Modo Meta Botão - + Set how linked effect parameters change when turning the Meta Knob. - + Define como mudam os efeitos a que está ligado, quando se roda o Meta Botão. - + Meta Knob Mode Invert - + Inverter Modo Meta Botão - + Invert how linked effect parameters change when turning the Meta Knob. - + Inverter como mudam os efeitos a que está ligado, quando se roda o Meta Botão. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microfone / Auxiliar - + Microphone On/Off Ligar/Desligar Microfone - + Microphone on/off Microfone ligar/desligar - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Alternar entre modos de redução de música do microfone (DESLIGADO, AUTOMÁTICO, MANUAL) - + Auxiliary On/Off Ligar/Desligar Auxiliar - + Auxiliary on/off - + Ligar/Desligar Auxiliar - + Auto DJ Auto DJ - + Auto DJ Shuffle - + Embaralhar o Auto DJ - + Auto DJ Skip Next - + Pular a Próxima no Auto DJ - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trocar Para a Próxima no Auto DJ - + Trigger the transition to the next track Desencadear a transição para a próxima faixa - + User Interface Interface do Utilizador - + Samplers Show/Hide - + Samplers Mostrar/Ocultar - + Show/hide the sampler section Mostrar/ocultar a secção sampler - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. Transmite sua mixagem pela Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Mostrar/Ocultar Controle por Vinil - + Show/hide the vinyl control section Mostrar/ocultar a secção controlo vinilo - + Preview Deck Show/Hide - + Leitor de Antevisão Mostrar/Ocultar - + Show/hide the preview deck Mostrar/esconder o leitor anterior - + Toggle 4 Decks - + Ligar/Desligar 4 Decks - + Switches between showing 2 decks and 4 decks. Troca entre a visualização de 2 decks e 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Mostrar/Ocultar Vinil Giratório - + Show/hide spinning vinyl widget Mostrar/ocultar o "widget" vinilo em rotação - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Mostrar/esconder as ondas. - + Waveform zoom Aproximação das ondas - + Waveform Zoom Aproximação das Ondas - + Zoom waveform in - + Ampliar a forma de onda - + Waveform Zoom In Aproximar Ondas - + Zoom waveform out - + Reduzir a forma de onda - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3528,12 +3560,12 @@ trace - Above + Profiling messages Options - + Opções Action - + Ação @@ -3546,7 +3578,7 @@ trace - Above + Profiling messages Channel - + Canal @@ -3561,17 +3593,17 @@ trace - Above + Profiling messages On Value - + Valor On Off Value - + Valor Off Action - + Ação @@ -3581,7 +3613,7 @@ trace - Above + Profiling messages On Range Max - + Alcance Máximo para Ligado @@ -3610,32 +3642,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Tente recuperar reiniciando seu controlador. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. O código do script precisa ser corrigido. @@ -3681,7 +3713,7 @@ trace - Above + Profiling messages Remove - + Remover @@ -3692,7 +3724,7 @@ trace - Above + Profiling messages Rename - + Renomear @@ -3718,17 +3750,17 @@ trace - Above + Profiling messages Analyze entire Crate - + Analisar Toda a Caixa Auto DJ Track Source - + Fonte de Faixas do Auto DJ Enter new name for crate: - + Introduza um novo nome para a caixa: @@ -3743,7 +3775,7 @@ trace - Above + Profiling messages Importar caixa - + Export Crate Exportar caixa @@ -3753,7 +3785,7 @@ trace - Above + Profiling messages Desbloquear - + An unknown error occurred while creating crate: Ocorreu um erro desconhecido durante a criação da caixa: @@ -3762,12 +3794,6 @@ trace - Above + Profiling messages Rename Crate Renomear Caixa - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3785,17 +3811,17 @@ trace - Above + Profiling messages Falha AO renomear a Caixa - + Crate Creation Failed - + Criação da Caixa Falhou - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista M3U (*.m3u);;Lista M3U8 (*.m3u8);;Lista PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) - + M3U Playlist (*.m3u) Lista M3U (*.m3u) @@ -3804,6 +3830,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Grades são uma ótima maneira para ajudar a organizar a música que você quer DJ com. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3884,7 +3916,7 @@ trace - Above + Profiling messages Duplicating Crate Failed - + Falha ao duplicar a caixa @@ -3915,12 +3947,12 @@ trace - Above + Profiling messages Colaboradores antigos - + Official Website - + Donate @@ -3968,7 +4000,7 @@ trace - Above + Profiling messages License - + Licença @@ -4008,7 +4040,7 @@ trace - Above + Profiling messages Selects all tracks in the table below. - + Seleciona todas as faixas da tabela abaixo @@ -4018,7 +4050,7 @@ trace - Above + Profiling messages Runs beatgrid, key, and ReplayGain detection on the selected tracks. Does not generate waveforms for the selected tracks to save disk space. - + Executa a detecção da grade de batidas, do tom e do ReplayGain nas faixas selecionadas. Não gera ondas para as faixas selecionadas para salvar espaço no disco. @@ -4096,12 +4128,12 @@ Shortcut: Shift+F9 Determines the duration of the transition - + Determina a duração da transição. Seconds - + Segundos @@ -4167,7 +4199,7 @@ crossfader, so that the intro starts at full volume. Repeat - + Repetir @@ -4177,7 +4209,7 @@ crossfader, so that the intro starts at full volume. One deck must be stopped to enable Auto DJ mode. - + Um leitor deve ser parado para permitir o modo Auto DJ. @@ -4192,7 +4224,7 @@ crossfader, so that the intro starts at full volume. Displays the duration and number of selected tracks. - + Mostra a duração e número de faixas selecionadas. @@ -4211,7 +4243,8 @@ crossfader, so that the intro starts at full volume. Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. - + Adiciona uma faixa aleatoriamente das fontes de faixas (caixas) à fila Auto DJ. +Se não estão configuradas fontes de faixas, então a faixa é adicionada da biblioteca. @@ -4234,7 +4267,7 @@ If no track sources are configured, the track is added from the library instead. Beat Detection Preferences - + Preferências para a Detecção de Batida @@ -4254,7 +4287,9 @@ This can speed up beat detection on slower computers but may result in lower qua Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Converte batidas detectada pelo analisador em uma grade de batidas de tempo fixo. +Use esta configuração se suas faixas tem um tempo constante (como a maioria das músicas eletrônicas). +Frequentemente resulta em grades de batida de melhor qualidade, e não funciona direito em faixas que tem mudanças de tempo. @@ -4279,12 +4314,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Choose Analyzer - + Escolha o Analisador Analyzer Settings - + Configurações do Analisador @@ -4300,12 +4335,13 @@ Often results in higher quality beatgrids, but will not do well on tracks that h e.g. from 3rd-party programs or Mixxx versions before 1.11. (Not checked: Analyze only, if no beats exist.) - + ex. de programas de terceiros ou versões do Mixxx anteriores a 1.11 +(Não verificado: Analisar apenas, se não existirem batidas) Re-analyze beats when settings change or beat detection data is outdated - + Re-analisar batidas quando as configurações forem alteradas ou quando os dados de detecção de batida estiverem desatualizados @@ -4323,7 +4359,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Close - + Fechar @@ -4333,27 +4369,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Hints: If you're mapping a button or switch, only press or flip it once. For knobs and sliders, move the control in both directions for best results. Make sure to touch one control at a time. - + Dicas: Se você está mapeando um botão ou chave, apenas pressione ou vire uma vez. Para botões de girar e deslizantes, mova o controle em ambas as direções para melhores resultados. Toque apenas um controle de cada vez. Cancel - + Cancelar Advanced MIDI Options - + Opções MIDI Avançadas Switch mode interprets all messages for the control as button presses. - + Modo Switch interpreta todas as mensagens para o controlo como teclas de pressão. Switch Mode - + Modo Switch @@ -4363,27 +4399,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Soft Takeover - + Soft Takeover Reverses the direction of the control. - + Inverte a direção do controlo. Invert - + Inverter For jog wheels or infinite-scroll knobs. Interprets incoming messages in two's complement. - + Para jog wheels ou botões com rolagem infinita. Interpreta as mensagens em um complemento para dois. Jog Wheel / Select Knob - + Jog Wheel / Botão de Seleção @@ -4403,7 +4439,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Click anywhere in Mixxx or choose a control to learn - + Clique em qualquer lugar no Mixxx ou escolha um controle para aprender @@ -4418,55 +4454,58 @@ Often results in higher quality beatgrids, but will not do well on tracks that h If you manipulate the control, you should see the Mixxx user interface respond the way you expect. - + Se você manipular o controle, você deve ver a interface do Mixxx responder da maneira que você espera. Not quite right? - + Ainda não está perfeito? If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - + Se o mapeamento não estiver a funcionar tente validar uma opção avançada abaixo e depois tente o controlo de novo. Ou clique repetir para redetetar o controlo midi. - + Didn't get any midi messages. Please try again. - + Não recebi nenhuma mensagem MIDI. Por favor tente de novo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Não foi possível detectar o mapeamento -- por favor tente de novo. Esteja certo de mexer apenas um controle de cada vez. - + Successfully mapped control: Controle mapeado com sucesso: - + <i>Ready to learn %1</i> <i>Pronto para aprender %1</i> - + Learning: %1. Now move a control on your controller. Aprendendo: %1. Agora mova o controle em seu controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. You tried to learn: %1,%2 - + O controle que você clicou no Mixxx não pode ser mapeado. +Isso pode ser porque você está usando um tema antigo e esse controle não é mais suportado, ou você clicou em um controle que provê feedback visual e só pode ser mapeado em saídas como LEDs por meio de scripts. + +Você tentou mapear: %1,%2 @@ -4482,7 +4521,7 @@ You tried to learn: %1,%2 Developer Tools - + Ferramentas de Desenvolvedor @@ -4492,27 +4531,27 @@ You tried to learn: %1,%2 Dumps all ControlObject values to a csv-file saved in the settings path (e.g. ~/.mixxx) - + Despeja todos os valores ControlObject para um arquivo csv salvo na pasta de configurações (por exemplo ~/.mixxx) Dump to csv - + Descarga para csv - + Log - + Registo - + Search - + Pesquisa - + Stats - + Estatísticas @@ -4624,12 +4663,12 @@ You tried to learn: %1,%2 Minimum available tracks in Track Source - + Número mínimo de faixas disponíveis na Fonte de Faixas Auto DJ Preferences - + Preferências Auto DJ @@ -4644,13 +4683,13 @@ You tried to learn: %1,%2 % - + % Uncheck, to ignore all played tracks. - + Desmarque para ignorar todas as faixas tocadas. @@ -4660,7 +4699,7 @@ You tried to learn: %1,%2 Suspension period for track selection - + Período de suspensão para a seleção de faixas @@ -4670,7 +4709,7 @@ You tried to learn: %1,%2 Enable random track addition to queue - + Ativar adição de faixa aleatória à fila @@ -4680,7 +4719,7 @@ You tried to learn: %1,%2 Minimum allowed tracks before addition - + Mínimo de faixas permitidas antes da adição @@ -4733,7 +4772,7 @@ You tried to learn: %1,%2 Opus - + Opus @@ -4743,17 +4782,17 @@ You tried to learn: %1,%2 HE-AAC - + HE-AAC HE-AACv2 - + HE-AACv2 Automatic - + Automático @@ -4776,28 +4815,28 @@ You tried to learn: %1,%2 You can't create more than %1 source connections. - + Não pode criar mais de %1 ligações fonte. Source connection %1 - + Ligação fonte %1 At least one source connection is required. - + É necessária pelo menos uma ligação fonte. Are you sure you want to disconnect every active source connection? - + Tem a certeza que quer desligar todas as ligações fonte ativas? Confirmation required - + Confirmação necessária @@ -4808,7 +4847,7 @@ Two source connections to the same server that have the same mountpoint can not Are you sure you want to delete '%1'? - + Tem a certeza que quer apagar '%1'? @@ -4818,12 +4857,12 @@ Two source connections to the same server that have the same mountpoint can not New name for '%1': - + Novo nome para '%1': Can't rename '%1' to '%2': name already in use - + Não pode renomear '%1' para '%2': nome já em uso @@ -4851,7 +4890,7 @@ Two source connections to the same server that have the same mountpoint can not Stream name - + Nome da transmissão @@ -4861,37 +4900,37 @@ Two source connections to the same server that have the same mountpoint can not Live Broadcasting source connections - + Ligações fonte Emissão em Direto Delete selected - + Apagar selecionadas Create new connection - + Criar nova ligação Rename selected - + Renomear selecionadas Disconnect all - + Desligar todas Turn on Live Broadcasting when applying these settings - + Ligar Emissão em Direto quando aplicar estas definições Settings for %1 - + Definições para %1 @@ -4926,7 +4965,7 @@ Two source connections to the same server that have the same mountpoint can not Select a source connection above to edit its settings here - + Selecionar uma ligação fonte acima para editar as suas definições aqui @@ -4936,12 +4975,12 @@ Two source connections to the same server that have the same mountpoint can not Plain text - + Texto simples Secure storage (OS keychain) - + Armazenamento seguro (Porta chaves do SO) @@ -5002,7 +5041,7 @@ Two source connections to the same server that have the same mountpoint can not Mount - + Montar @@ -5012,48 +5051,48 @@ Two source connections to the same server that have the same mountpoint can not Password - + Palavra passe Stream info - + Informações do Fluxo Metadata - + Metadado Use static artist and title. - + Usar artista e título estáticos. Static title - + Título estático Static artist - + Artista estático Automatic reconnect - + Religar automático Time to wait before the first reconnection attempt is made. - + Tempo de espera antes da primeira tentativa de religação. seconds - + segundos @@ -5073,22 +5112,22 @@ Two source connections to the same server that have the same mountpoint can not Limit number of reconnection attempts - + Limitar número de tentativas de reconexão Maximum retries - + Máximo de tentativas Reconnect if the connection to the streaming server is lost. - + Religar se a ligação ao servidor de streaming estiver perdida. Enable automatic reconnect - + Ativar reconexão automática @@ -5097,7 +5136,7 @@ Two source connections to the same server that have the same mountpoint can not By hotcue number - + Por número do hotcue @@ -5131,7 +5170,7 @@ Two source connections to the same server that have the same mountpoint can not Hotcue palette - + Paleta de hotcue @@ -5163,116 +5202,116 @@ associated with each key. DlgPrefController - + Apply device settings? Aplicar os parâmetros do dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Os seus parâmetros devem ser aplicados antes de iniciar o Assistente de Aprendizagem Aplicar os parâmetros e continuar? - + None Nenhum - + %1 by %2 %1 por %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Solução de Problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Limpar Mapeamentos de Entrada - + Are you sure you want to clear all input mappings? - + Tem a certeza que deseja limpar todas os mapeamentos de entrada? - + Clear Output Mappings - + Limpar Mapeamentos de Saída - + Are you sure you want to clear all output mappings? - + Tem certeza de que deseja limpar todos os mapeamentos de saída? @@ -5288,102 +5327,102 @@ Aplicar os parâmetros e continuar? Activado - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Descrição - + Support: Suporte: - + Screens preview - + Input Mappings Mapeamento de Entrada - - + + Search Pesquisa - - + + Add Adicionar - - + + Remove - + Remover @@ -5401,19 +5440,19 @@ Aplicar os parâmetros e continuar? - + Mapping Info - + Author: - + Autor: - + Name: - + Nome: @@ -5421,30 +5460,30 @@ Aplicar os parâmetros e continuar? Assistente de Aprendizagem (Só MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Limpar tudo - + Output Mappings - + Mapeamento de Saída @@ -5491,7 +5530,7 @@ Aplicar os parâmetros e continuar? Mixxx did not detect any controllers. If you connected the controller while Mixxx was running you must restart Mixxx first. - + O Mixxx não detectou nenhum controlador. Se você conectou um controlador enquanto o Mixxx estava rodando, você precisa reiniciar o Mixxx primeiro. @@ -5511,12 +5550,12 @@ Aplicar os parâmetros e continuar? Resources - + Recursos Controllers are physical devices that send MIDI or HID signals to your computer over a USB connection. These allow you to control Mixxx in a more hands-on way than a keyboard and mouse. Attached controllers that Mixxx recognizes are shown in the "Controllers" section in the sidebar. - + Controladores são dispositivos físicos que mandam sinais MIDI ou HID para o seu computador em uma conexão USB. Esses permitem que você controle o Mixxx de uma maneira mais tátil do que um teclado ou mouse. Controladores ligados que o Mixxx reconhece são mostrados na seção "Controladores" na barra lateral. @@ -5539,17 +5578,17 @@ Aplicar os parâmetros e continuar? Select from different color schemes of a skin if available. - + Selecione diferentes esquemas de cor de uma skin se disponível. Color scheme - + Esquema de côr Locales determine country and language specific settings. - + A localização determina as configurações específicas de país e língua. @@ -5559,7 +5598,7 @@ Aplicar os parâmetros e continuar? Interface Preferences - + Preferências do Interface @@ -5574,7 +5613,7 @@ Aplicar os parâmetros e continuar? HiDPI / Retina scaling - + Escala HiDPI / Retina @@ -5601,6 +5640,16 @@ Aplicar os parâmetros e continuar? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5747,7 +5796,7 @@ Aplicar os parâmetros e continuar? 16% - + 16% @@ -5770,7 +5819,7 @@ Aplicar os parâmetros e continuar? Deck Preferences - + Preferências Leitor @@ -5832,7 +5881,7 @@ Modo CUP: Elapsed - + Decorrido @@ -5847,7 +5896,7 @@ Modo CUP: Time Format - + Formato de tempo @@ -5861,7 +5910,11 @@ it will place it at the main cue point if the main cue point has been set previo This may be helpful for upgrading to Mixxx 2.3 from earlier versions. If this option is disabled, the intro start point is automatically placed at the first sound. - + Quando o analisador coloca automaticamente o ponto de início da introdução, +ele coloca-o no ponto de referência principal se o ponto de referência principal tiver sido definido anteriormente. +Isso pode ser útil para atualizar para o Mixxx 2.3 de versões anteriores. + +Se essa opção estiver desativada, o ponto de início da introdução é colocado automaticamente no primeiro som. @@ -5871,7 +5924,7 @@ If this option is disabled, the intro start point is automatically placed at the Track load point - + Ponto de carga de rastreamento @@ -5892,7 +5945,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Double-press Load button to clone playing track - + Pressione Carregar duas vezes para clonar uma faixa que está tocando @@ -5925,7 +5978,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Current key - + Tom atual @@ -5935,12 +5988,12 @@ You can always drag-and-drop tracks on screen to clone a deck. Permanent - + Permanente Temporary - + Temporário @@ -5955,17 +6008,17 @@ You can always drag-and-drop tracks on screen to clone a deck. Ramping sensitivity - + Sensibilidade da aceleração Pitch bend behavior - + Comportamento do pitch bend Original key - + Tom original @@ -5975,17 +6028,17 @@ You can always drag-and-drop tracks on screen to clone a deck. Speed/Tempo - + Velocidade/Tempo Key/Pitch - + Tom/Pitch Adjustment buttons: - + Ajustamento das teclas: @@ -6000,32 +6053,32 @@ You can always drag-and-drop tracks on screen to clone a deck. Coarse - + Grosso Fine - + Fino Make the speed sliders work like those on DJ turntables and CDJs where moving downward increases the speed - + Fazer os cursores de velocidade funcionar como os dos gira-discos e CDJs em que a movimentação para baixo aumenta a velocidade. Down increases speed - + Pra baixo aumenta a velocidade Slider range - + Extensão do cursor Adjusts the range of the speed (Vinyl "Pitch") slider. - + Ajusta a extensão do cursor de velocidade ("Pitch" do Vinil) @@ -6035,27 +6088,27 @@ You can always drag-and-drop tracks on screen to clone a deck. Smoothly adjusts deck speed when temporary change buttons are held down - + Suavemente ajusta a velocidade do deck quando os botões de mudança temporário são segurados Smooth ramping - + Rampa Keyunlock mode - + Modo desbloqueio de tecla Reset key - + Reiniciar tom Keep key - + Manter tecla @@ -6073,7 +6126,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Effects Preferences - + Preferências dos Efeitos @@ -6124,7 +6177,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Export - + Exportar @@ -6170,12 +6223,12 @@ You can always drag-and-drop tracks on screen to clone a deck. Keep metaknob position - + Manter posição do metabotão Reset metaknob to effect default - + Reinicia metabotão para efeito padrão @@ -6185,7 +6238,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Version: - + Versão: @@ -6195,78 +6248,78 @@ You can always drag-and-drop tracks on screen to clone a deck. Author: - + Autor: Name: - + Nome: Type: - + Tipo: DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. O tamanho mínimo da skin selecionada é maior do que a sua resolução de tela. - + Allow screensaver to run - + Permitir que o protetor de tela execute - + Prevent screensaver from running - + Prevenir que o protetor de tela execute - + Prevent screensaver while playing - + Prevenir o protetor de tela quando tocando - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Esta Skin não suporta esquemas de cores - + Information Informação - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -6276,7 +6329,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Key Notation Format Settings - + Configurações do Formato da Notação de Tom @@ -6287,7 +6340,7 @@ and allows you to pitch adjust them for harmonic mixing. Enable Key Detection - + Validar Deteção de Tom @@ -6297,7 +6350,7 @@ and allows you to pitch adjust them for harmonic mixing. Choose between different algorithms to detect keys. - + Escolher entre diferentes algoritmos para detetar os tons. @@ -6332,7 +6385,7 @@ and allows you to pitch adjust them for harmonic mixing. Key Notation - + Notação do Tom @@ -6357,17 +6410,17 @@ and allows you to pitch adjust them for harmonic mixing. Traditional - + Tradicional Custom - + Personalizado A - + @@ -6377,17 +6430,17 @@ and allows you to pitch adjust them for harmonic mixing. B - + Si C - + C Db - + Db @@ -6397,92 +6450,92 @@ and allows you to pitch adjust them for harmonic mixing. Eb - + Mib E - + E F - + F F# - + Fá# G - + Sol Ab - + Ab Am - + Lám Bbm - + Bbm Bm - + Bm Cm - + Dóm C#m - + C#m Dm - + Dm Ebm - + Ebm Em - + Em Fm - + Fám F#m - + F#m Gm - + Gm G#m - + Sol#m @@ -6505,7 +6558,7 @@ and allows you to pitch adjust them for harmonic mixing. Scan - + Examinar @@ -6525,27 +6578,27 @@ and allows you to pitch adjust them for harmonic mixing. Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - + O Mixxx não vai mais procurar por novas faixas neste diretório. O que você gostaria de fazer com as faixas deste diretório e subdiretório?<ul><li>Ocultar todas as faixas deste diretório e subdiretórios.</li><li>Excluir todos os metadados para estas faixas do Mixxx permanentemente</li><li>Deixar as faixas inalteradas na sua biblioteca.</li></ul>As faixas ocultas continuarão com os metadados, no caso de você readicioná-las no futuro. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Os metadados referem-se a todos os detalhes das faixas (artista, título, género, etc.) bem como as grelhas de batidas, hotcues e loops. Esta escolha afeta apenas a biblioteca do Mixxx. Nenhumas faixas do disco serão alteradas ou apagadas. Hide Tracks - + Ocultar Faixas Delete Track Metadata - + Apagar Metadados das Faixas Leave Tracks Unchanged - + Deixar Faixas Inalteradas @@ -6563,17 +6616,17 @@ and allows you to pitch adjust them for harmonic mixing. If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - + Se removido, o Mixxx não vai mais poder procurar por novas faixas neste diretório e subdiretórios. Remove - + Remover Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - + Adicione um diretório onde sua música está guardada. O Mixxx vai procurar por novas faixas neste diretório e seus subdiretórios. @@ -6594,7 +6647,7 @@ and allows you to pitch adjust them for harmonic mixing. Relink This will re-establish the links to the audio files in the Mixxx database if you move an music directory to a new location. - + Religar @@ -6649,7 +6702,7 @@ and allows you to pitch adjust them for harmonic mixing. Library Font: - + Fonte da Biblioteca: @@ -6714,7 +6767,7 @@ and allows you to pitch adjust them for harmonic mixing. 250 px - + 250 px @@ -6739,7 +6792,7 @@ and allows you to pitch adjust them for harmonic mixing. Library Row Height: - + Altura da Linha da Biblioteca: @@ -6749,12 +6802,12 @@ and allows you to pitch adjust them for harmonic mixing. ... - + ... px - + px @@ -6779,12 +6832,12 @@ and allows you to pitch adjust them for harmonic mixing. Edit metadata after clicking selected track - + Editar metadados após clicar faixa seleccionada Search-as-you-type timeout: - + Tempo limite de procura ao escrever: @@ -6794,12 +6847,12 @@ and allows you to pitch adjust them for harmonic mixing. Load track to next available deck - + Carregar a faixa no próximo deck disponível External Libraries - + Bibliotecas Externas @@ -6834,12 +6887,12 @@ and allows you to pitch adjust them for harmonic mixing. Show Banshee Library - + Mostrar Biblioteca Banshee Show iTunes Library - + Mostrar a biblioteca iTunes @@ -6859,7 +6912,7 @@ and allows you to pitch adjust them for harmonic mixing. All external libraries shown are write protected. - + Todas as bibliotecas externas mostradas são protegidas contra escrita. @@ -6867,7 +6920,7 @@ and allows you to pitch adjust them for harmonic mixing. Crossfader Preferences - + Preferências do Crossfader @@ -6877,7 +6930,7 @@ and allows you to pitch adjust them for harmonic mixing. Slow fade/Fast cut (additive) - + Atenuação lenta/Corte rápido (aditivo) @@ -6892,7 +6945,7 @@ and allows you to pitch adjust them for harmonic mixing. Scratching - + Scratching @@ -6907,7 +6960,7 @@ and allows you to pitch adjust them for harmonic mixing. Reverse crossfader (Hamster Style) - + Crossfader Invertido (Estilo Hamster) @@ -6917,12 +6970,12 @@ and allows you to pitch adjust them for harmonic mixing. Only allow EQ knobs to control EQ-specific effects - + Apenas deixar botões de EQ controlarem efeitos de EQ Uncheck to allow any effect to be loaded into the EQ knobs. - + Desmarque para deixar qualquer efeito ser carregado para os botões de EQ @@ -6932,7 +6985,7 @@ and allows you to pitch adjust them for harmonic mixing. Uncheck to allow different decks to use different EQ effects. - + Desmarque para deixar decks usarem diferentes efeitos de EQ @@ -6952,17 +7005,17 @@ and allows you to pitch adjust them for harmonic mixing. When checked, EQs are not processed, improving performance on slower computers. - + Quando marcado, os EQs não são processados, melhorando a performance em computadores lentos. Resets the equalizers to their default values when loading a track. - + Redefine os equalizadores para os seus valores padrão ao carregar uma faixa. Reset equalizers on track load - + Redefinir os equalizadores ao carregar uma faixa @@ -6993,13 +7046,13 @@ and allows you to pitch adjust them for harmonic mixing. 16 Hz - + 16 Hz 20.05 kHz - + 20.05 kHz @@ -7022,7 +7075,7 @@ and allows you to pitch adjust them for harmonic mixing. Modplug Preferences - + Preferências Modplug @@ -7032,7 +7085,7 @@ and allows you to pitch adjust them for harmonic mixing. Show Advanced Settings - + Mostrar Configurações Avançadas @@ -7061,12 +7114,12 @@ and allows you to pitch adjust them for harmonic mixing. Bass Expansion - + Expansão de Baixos Bass Range: - + Alcance dos Graves: @@ -7106,12 +7159,12 @@ and allows you to pitch adjust them for harmonic mixing. 10ms - + 10ms 256 - + 256 @@ -7121,12 +7174,12 @@ and allows you to pitch adjust them for harmonic mixing. 100Hz - + 100Hz 250ms - + 250ms @@ -7210,7 +7263,7 @@ and allows you to pitch adjust them for harmonic mixing. Recordings directory invalid - + Diretório de gravações inválido @@ -7269,7 +7322,7 @@ and allows you to pitch adjust them for harmonic mixing. Album - + Album @@ -7433,173 +7486,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Padrão (atraso longo) - + Experimental (no delay) Experimental (sem atraso) - + Disabled (short delay) Desativada (atraso curto) - + Soundcard Clock Relógio da Placa de Som - + Network Clock - + Relógio da Rede - + Direct monitor (recording and broadcasting only) - + Monição direta (apenas gravação e emissão) - + Disabled Desativado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) auto (<= 1024 quadros/período) - + 2048 frames/period 2048 quadros/período - + 4096 frames/period 4096 quadros/período - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + As entradas de microfone estão fora de tempo no sinal gravar e emitir comparado com o que ouve. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - - + Refer to the Mixxx User Manual for details. - + Consulte o Manual do Utilizador do Mixxx para detalhes. - + Configured latency has changed. - + A latência configurada foi alterada. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Volta a medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - + Realtime scheduling is enabled. O agendamento em tempo real está ativado. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Erro de configuração @@ -7617,131 +7669,131 @@ The loudness target is approximate and assumes track pregain and main output lev API (Interface de Programação Aplicacional) do Som - + Sample Rate - + Frequência de Amostragem - + Audio Buffer Buffer de Áudio - + Engine Clock - + Relógio Motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Use o relógio da placa de som para montagens com audiência ao vivo e a menor latência.<br>Use o relógio de rede para emissões sem audiência ao vivo. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Modo Monição Microfone - + Microphone Latency Compensation - + Compensação da Latência do Microfone - - - - + + + + ms milliseconds - + ms - + 20 ms 20 ms - + Buffer Underflow Count Contagem insuficiente no tampão - + 0 - + 0 - + Keylock/Pitch-Bending Engine Motor Keylock/Pitch-Bending - + Multi-Soundcard Synchronization Sincronização de Múltiplas Placas de Som - + Output Saída - + Input Entrada - + System Reported Latency Latência Relatada pelo Sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente o buffer de áudio se o contador de esvaziamentos aumentar ou se você ouvir estouros na reprodução. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Dicas e Diagnóstico - + Downsize your audio buffer to improve Mixxx's responsiveness. Diminua o buffer de áudio para melhorar a capacidade de resposta do Mixxx. - + Query Devices Consultar dispositivos @@ -7810,7 +7862,7 @@ The loudness target is approximate and assumes track pregain and main output lev Vinyl Type - + Tipo do Vinil @@ -7840,7 +7892,7 @@ The loudness target is approximate and assumes track pregain and main output lev Signal Quality - + Qualidade do Sinal @@ -7873,12 +7925,12 @@ The loudness target is approximate and assumes track pregain and main output lev HSV - + HSV RGB - + RGB @@ -7947,12 +7999,12 @@ The loudness target is approximate and assumes track pregain and main output lev Normalize waveform overview - + Normaliza a visualizção da forma de onda Average frame rate - + Taxa média de fotogramas @@ -7978,7 +8030,7 @@ The loudness target is approximate and assumes track pregain and main output lev End of track warning - + Aviso de faixa acabando @@ -7988,12 +8040,12 @@ The loudness target is approximate and assumes track pregain and main output lev Highlight the waveforms when the last seconds of a track remains. - + Realçar as formas de onda quando faltam os últimos segundos da faixa. seconds - + segundos @@ -8018,7 +8070,7 @@ The loudness target is approximate and assumes track pregain and main output lev Middle - + Médios @@ -8049,7 +8101,8 @@ The loudness target is approximate and assumes track pregain and main output lev The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + A forma de onda mostra o envoltório da onda na faixa inteira. +Selecione entre tipos diferentes de visualizações da forma de onda, o que difere principalmente no nível de detalhe mostrado na forma de onda. @@ -8060,12 +8113,13 @@ Select from different types of displays for the waveform overview, which differ The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - + A forma de onda mostra o envoltório da onda na faixa junto à posição corrente de leitura. +Selecione entre tipos diferentes de visualizações da forma de onda, o que difere principalmente no nível de detalhe mostrado na forma de onda. fps - + fps @@ -8115,7 +8169,7 @@ Select from different types of displays for the waveform, which differ primarily Caching - + Caching @@ -8125,7 +8179,7 @@ Select from different types of displays for the waveform, which differ primarily Enable waveform caching - + Ativa o caching das Waveforms @@ -8135,7 +8189,7 @@ Select from different types of displays for the waveform, which differ primarily Beat grid opacity - + Opacidade da grelha de batidas @@ -8156,7 +8210,7 @@ Select from different types of displays for the waveform, which differ primarily Set amount of opacity on beat grid lines. - + Define a quantidade de opacidade das linhas da grelha de batida. @@ -8166,12 +8220,12 @@ Select from different types of displays for the waveform, which differ primarily Play marker position - + Marcador da posição de reprodução Moves the play marker position on the waveforms to the left, right or center (default). - + Move o marcador da posição de reprodução nas formas de onda para a esquerda, direita ou centro (padrão). @@ -8181,53 +8235,53 @@ Select from different types of displays for the waveform, which differ primarily Clear Cached Waveforms - + Limpar Ondas no Cache DlgPreferences - + Sound Hardware Hardware de Som - + Controllers - + Controladores - + Library Biblioteca - + Interface Interface - + Waveforms - + Formas de Onda - + Mixer - + Mixer - + Auto DJ - + Auto DJ - + Decks - + Leitores - + Colors @@ -8259,52 +8313,52 @@ Select from different types of displays for the waveform, which differ primarily &Ok Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - + &Ok - + Effects Efeitos - + Recording Gravação - + Beat Detection Detecção do tempo - + Key Detection - + Detecção de Tom - + Normalization Normalização - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Controlo Vinilo - + Live Broadcasting Difusão em directo - + Modplug Decoder - + Decodificador do Modplug @@ -8387,7 +8441,7 @@ Select from different types of displays for the waveform, which differ primarily Current cue color - + Cor da pista atual @@ -8435,7 +8489,7 @@ Select from different types of displays for the waveform, which differ primarily MusicBrainz - + MusicBrainz @@ -8446,13 +8500,13 @@ Select from different types of displays for the waveform, which differ primarily Track - + Faixa Year - + Ano @@ -8485,13 +8539,13 @@ Select from different types of displays for the waveform, which differ primarily Get API-Key To be able to submit audio fingerprints to the MusicBrainz database, a free application programming interface key (API key) is required. - + Obter API-Key Submit Submits audio fingerprints to the MusicBrainz database. - + Enviar @@ -8506,7 +8560,7 @@ Select from different types of displays for the waveform, which differ primarily Current Cover Art - + Capa de Álbum Atual @@ -8521,7 +8575,7 @@ Select from different types of displays for the waveform, which differ primarily Retry - + Tentar de novo @@ -8531,7 +8585,7 @@ Select from different types of displays for the waveform, which differ primarily &Next - + Segui&nte @@ -8551,12 +8605,12 @@ Select from different types of displays for the waveform, which differ primarily &Close - + &Fechar Original tags - + Etiquetas originais @@ -8571,7 +8625,7 @@ Select from different types of displays for the waveform, which differ primarily Suggested tags - + Etiquetas sugeridas @@ -8627,12 +8681,12 @@ This can not be undone! Export Tracks - + Exportar Faixas Exporting Tracks - + Exportando Faixas @@ -8658,284 +8712,284 @@ This can not be undone! Resumo - + Filetype: Tipo de ficheiro: - + BPM: BPM: - + Location: Localização: - + Bitrate: Débito: - + Comments - + Comentários - + BPM BPM - + Sets the BPM to 75% of the current value. - + Define o BPM para 75% do valor presente. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. - + Define o BPM para 50% do valor atual. - + Displays the BPM of the selected track. - + Exibe o BPM da faixa selecionada. - + Track # Faixa # - + Album Artist Álbum Artista - + Composer - + Compositor - + Title Título - + Grouping Agrupar - + Key Nota - + Year Ano - + Artist Artista - + Album Album - + Genre Gênero - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. - + Define o BPM para 200% do valor atual. - + Double BPM Duplicar o BPM - + Halve BPM Reduzir o BPM a metade - + Clear BPM and Beatgrid Limpar o Tempo (BPM) e a grelha rítmica - + Move to the previous item. "Previous" button Mover para o item anterior. - + &Previous &Anterior - + Move to the next item. "Next" button - + Move para o próximo item. - + &Next Segui&nte - + Duration: Duração: - + Import Metadata from MusicBrainz - + Importar Metadados de MusicBrainz - + Re-Import Metadata from file - + Color cor - + Date added: - + Open in File Browser Abrir no Navegador de Ficheiros - + Samplerate: - + Track BPM: Faixa BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Assumir tempo constante - + Sets the BPM to 66% of the current value. - + Define o BPM para 66% do valor atual. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + Define o BPM para 150% do valor atual. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. - + Define o BPM para 133% do valor atual. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Pressione de acordo com a batida para definir o BPM para velocidade que você está tocando. - + Tap to Beat Bata o ritmo - + Hint: Use the Library Analyze view to run BPM detection. Sugestão: Utilize a vista de Análise da Biblioteca para executar a detecção do BPM. - + Save changes and close the window. "OK" button Salva as alterações e fechar a janela. - + &OK &OK - + Discard changes and close the window. "Cancel" button - + Rejeita as alterações e fecha a janela. - + Save changes and keep the window open. "Apply" button - + Salvar as alterações e deixar a janela aberta. - + &Apply - + &Aplicar - + &Cancel &Cancelar - + (no color) @@ -9092,7 +9146,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9294,27 +9348,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Soundtouch (mais rápido) - + Rubberband (better) Rubberband (melhor) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9344,7 +9398,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Question - + Questão @@ -9352,7 +9406,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Artist - + Artista @@ -9400,7 +9454,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Album - + Album @@ -9529,15 +9583,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - + Modo Segurança Ativado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9549,57 +9603,57 @@ Shown when VuMeter can not be displayed. Please keep para OpenGL. - + activate activar - + toggle alternar - + right direita - + left esquerda - + right small direita (curto) - + left small esquerda (curto) - + up - + cima - + down baixo - + up small cima (curto) - + down small baixo (curto) - + Shortcut Atalho @@ -9607,62 +9661,62 @@ para OpenGL. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9672,22 +9726,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist - + Importar Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Listas de reprodução (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9734,27 +9788,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) não encontrado(s) - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Alguns LEDs ou outros retornos podem não funcionar corretamente. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Marcar para ver se os nomes dos MixxxControl estão escritos corretamente no arquivo de mapeamento (.xml) @@ -9803,7 +9857,7 @@ Do you really want to overwrite it? Your mixxxdb.sqlite file was created by a newer version of Mixxx and is incompatible. - + O seu arquivo mixxxdb.sqlite foi criado por uma versão nova do Mixxx e é incompatível. @@ -9814,231 +9868,274 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Faixas em falta - + Hidden Tracks Faixas escondidas - Export to Engine Prime + Export to Engine DJ Tracks - + Faixas MixxxMainWindow - + Sound Device Busy Dispositivo de som ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Tentar de novo</b> após ter fechado a outra aplicação ou ter religado o dispositivo de som. - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurar</b> as opções áudio do Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Encontrar <b>Ajuda</b> no Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Sair</b> do Mixxx. - + Retry Tentar de novo - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigurar - + Help Ajuda - - + + Exit - + Sair - - + + Mixxx was unable to open all the configured sound devices. - + Mixxx não foi capaz de abrir todos os dispositivos de som configurados. - + Sound Device Error - + Erro Dispositivo de Som - + <b>Retry</b> after fixing an issue <b>Tentar novamente</b> depois de corrigir um problema - + No Output Devices Nenhum dispositivo de saída - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. O Mixxx foi configurado sem nenhum dispositivo de saída audio. Sem dispositivo de saída configurado, o processamento do som será desactivado. - + <b>Continue</b> without any outputs. <b>Continuar</b> sem nenhuma saída. - + Continue Continuar - + Load track to Deck %1 Carregar a faixa no leitor %1 - + Deck %1 is currently playing a track. O leitor %1 está actualmente a ler uma faixa. - + Are you sure you want to load a new track? Tem a certeza de querer carregar uma nova faixa? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + Não existe nenhum dispositivo selecionado para este controlo do vinil. +Por favor, selecione primeiro um dispositivo de entrada, nas preferências de hardware de som. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + Não tem nenhum dispositivo de entrada selecionado para este controle atravessador. +Por favor selecione um dispositivo de entrada nas preferências do hardware de som primeiro. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Erro no ficheiro de tema - + The selected skin cannot be loaded. O tema seleccionado não pode ser carregado - + OpenGL Direct Rendering Processamento Direct OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar saída - + A deck is currently playing. Exit Mixxx? Um leitor está actualmente a tocar. Sair do Mixxx? - + A sampler is currently playing. Exit Mixxx? Uma amostra está actualmente a tocar. Sair do Mixxx? - + The preferences window is still open. A janela de preferências ainda está aberta. - + Discard any changes and exit Mixxx? Rejeitar quaisquer alterações e sair do Mixxx? @@ -10054,13 +10151,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Bloquear - - + + Playlists Listas de reprodução @@ -10070,32 +10167,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJs preparam listas de reprodução antes das suas actuações, mas outros preferem construi-las na altura em que estão a actuar. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quando usa listas de reprodução durante uma actuação de DJ ao vivo, lembre-se de prestar uma atenção particular à forma como o seu público reage à música que escolheu para tocar. - + Create New Playlist Criar nova lista de reprodução @@ -10196,33 +10319,34 @@ Do you want to select an input device? Upgrading Mixxx - + Atualização Mixxx Mixxx now supports displaying cover art. Do you want to scan your library for cover files now? - + O Mixxx agora permite mostrar a capa do disco. +Deseja examinar a sua biblioteca para encontrar ficheiros de capa de disco, agora? Scan - + Examinar Later - + Depois Upgrading Mixxx from v1.9.x/1.10.x. - + Atualização do Mixxx a partir de V1.9.x/1.10.x. Mixxx has a new and improved beat detector. - + O Mixx possui um detetor de batidas novo e aperfeiçoado. @@ -10232,7 +10356,7 @@ Do you want to scan your library for cover files now? This does not affect saved cues, hotcues, playlists, or crates. - + Isto não afeta os pontos cue salvos, hotcues, listas de reprodução ou caixas. @@ -10281,7 +10405,7 @@ Do you want to scan your library for cover files now? Unknown (0x%1) - + Desconhecido (0x%1) @@ -10291,12 +10415,12 @@ Do you want to scan your library for cover files now? Invert - + Inverter Rot64 - + Rot64 @@ -10321,7 +10445,7 @@ Do you want to scan your library for cover files now? Switch - + Comutador @@ -10336,7 +10460,7 @@ Do you want to scan your library for cover files now? SelectKnob - + SelectKnob @@ -10346,7 +10470,7 @@ Do you want to scan your library for cover files now? Script - + Script @@ -10366,7 +10490,7 @@ Do you want to scan your library for cover files now? Booth - + Cabine @@ -10376,7 +10500,7 @@ Do you want to scan your library for cover files now? Left Bus - + Barramento Esquerdo @@ -10391,7 +10515,7 @@ Do you want to scan your library for cover files now? Invalid Bus - + Barramento Inválido @@ -10401,7 +10525,7 @@ Do you want to scan your library for cover files now? Record/Broadcast - + Gravar/Emitir @@ -10437,7 +10561,7 @@ Do you want to scan your library for cover files now? Mixxx Needs Access to: %1 - + Mixxx Precisa Acessar: %1 @@ -10471,7 +10595,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Bit Depth - + Profundidade de Bit @@ -10482,17 +10606,17 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Adds noise by the reducing the bit depth and sample rate - + Adiciona ruído pela redução da Profundidade de Bit e taxa de amostragem The bit depth of the samples - + A profundidade de bit das amostras Downsampling - + Decimação @@ -10502,13 +10626,13 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx The sample rate to which the signal is downsampled - + A taxa de amostragem para a qual este sinal será reduzida Echo - + Eco @@ -10516,13 +10640,13 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Time - + Tempo Ping Pong - + Pingue Pongue @@ -10530,12 +10654,12 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Send - + Enviar How much of the signal to send into the delay buffer - + Quantidade de sinal a enviar para o buffer de atraso @@ -10543,12 +10667,12 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Feedback - + Retorno Stores the input signal in a temporary buffer and outputs it after a short time - + Guarda o sinal de entrada num buffer temporário e fá-lo sair após um pequeno tempo. @@ -10556,17 +10680,19 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Delay time 1/8 - 2 beats if tempo is detected 1/8 - 2 seconds if no tempo is detected - + Tempo de atraso +1/8 - 2 batidas se o BPM tiver sido detetado +1/8 - 2 segundos se o BPM não tiver sido detetado Amount the echo fades each time it loops - + Quantidade de eco que desaparece cada vez que loopa How much the echoed sound bounces between the left and right sides of the stereo field - + Quanto do sinal ecoado ressalta entre os os lados esquerdo e direito do campo estéreo @@ -10581,7 +10707,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Round the Time parameter to the nearest 1/4 beat. - + Arredonda o parâmetro Tempo para o 1/4 de batida mais próxima. @@ -10594,28 +10720,28 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Triplets - + Triplets When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - + Quando o parâmetro Quantização está ativo, divide o parâmetro Tempo arredondado a 1/4 de batida, por 3. Filter - + Filtro Allows only high or low frequencies to play. - + Permite tocar apenas as altas ou baixas frequências. Low Pass Filter Cutoff - + Corte Filtro Passa Baixo @@ -10627,7 +10753,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Corner frequency ratio of the low pass filter - + Frequência de corte do filtro passa baixo @@ -10638,12 +10764,13 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Resonance of the filters Default: flat top - + Ressonancia dos filtros +Padrão: Topo plano High Pass Filter Cutoff - + Corte Filtro Passa Alto @@ -10655,7 +10782,7 @@ Default: flat top Corner frequency ratio of the high pass filter - + Frequência de corte do filtro passa alto @@ -10663,7 +10790,7 @@ Default: flat top Depth - + Profundidade @@ -10675,7 +10802,7 @@ Default: flat top Speed - + Velocidade @@ -10686,58 +10813,61 @@ Default: flat top Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - + Mistura a entrada com uma cópia de si mesma, atrasada e modulada em tonalidade para criar uma filtragem pente Speed of the LFO (low frequency oscillator) 32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected 1/32 - 4 Hz if no tempo is detected - + Velocidade do LFO (oscilador de baixa frequência) +32 - 1/4 batidas arredondadas para 1/2 batida por ciclo LFO se o BPM tiver sido detetado +1/32 - 4 Hz se o BPM não tiver sido detetado Delay amplitude of the LFO (low frequency oscillator) - + Amplitude do atraso do LFO (oscilador de baixa frequência). Delay offset of the LFO (low frequency oscillator). With width at zero, this allows for manually sweeping over the entire delay range. - + Alinhamento do atraso do LFO (oscilador de baixa frequência). +Com a largura a zero, permite o varrimento manual ao longo de toda a extensão do atraso. Regeneration - + Regeneração Regen - + Regerar How much of the delay output is feed back into the input - + Quantidade da saída atrasada que é retornada para a entrada Intensity of the effect - + Intensidade do efeito Divide rounded 1/2 beats of the Period parameter by 3. - + Divide o parâmetro Período, arredondado a 1/2 batidas, por 3. Mix - + Mistura @@ -10747,12 +10877,12 @@ With width at zero, this allows for manually sweeping over the entire delay rang Width - + Largura Metronome - + Metrónomo @@ -10762,7 +10892,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Adds a metronome click sound to the stream - + Adiciona o som dum clique de metrónomo à stream @@ -10772,7 +10902,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Set the beats per minute value of the click sound - + Define o valor do bpm do som do clique @@ -10782,7 +10912,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Synchronizes the BPM with the track if it can be retrieved - + Sincroniza o BPM com a faixa, se este puder ser obtido @@ -10800,7 +10930,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Period - + Período @@ -10811,34 +10941,36 @@ With width at zero, this allows for manually sweeping over the entire delay rang Bounce the sound left and right across the stereo field - + Balança o som entre a esquerda e direita ao longo do campo estéreo How fast the sound goes from one side to another 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Velocidade com que o sinal vai dum lado para o outro +1/4 - 4 batidas arredondado para 1/2 batidas se o BPM tiver sido detetado +1/4 - 4 segundos se o BPM não tiver sido detetado Smoothing - + Suavização Smooth - + Suave How smoothly the signal goes from one side to the other - + Suavidade com que o sinal vai de um lado para o outro How far the signal goes to each side - + Até onde o sinal vai em cada lado @@ -10848,34 +10980,35 @@ With width at zero, this allows for manually sweeping over the entire delay rang Emulates the sound of the signal bouncing off the walls of a room - + Simula o som do sinal sendo refletido nas paredes duma sala Decay - + Declínio Lower decay values cause reverberations to fade out more quickly. - + Valores de declínio baixos causam o desvanecimento das reverberações mais rápido. Bandwidth of the low pass filter at the input. Higher values result in less attenuation of high frequencies. - + Largura de banda do filtro passa baixo na entrada. +Valores mais altos resultam em menos atenuação das altas frequências. How much of the signal to send in to the effect - + Quantidade do sinal a enviar para o efeito Bandwidth - + Largura de Banda @@ -10886,12 +11019,12 @@ Higher values result in less attenuation of high frequencies. Damping - + Amortecimento Higher damping values cause high frequencies to decay more quickly than low frequencies. - + Valores maiores de amortecimento fazem com que frequências altas morram mais rápido do que frequências baixas. @@ -10920,7 +11053,7 @@ Higher values result in less attenuation of high frequencies. Mid - + Médios @@ -10940,7 +11073,7 @@ Higher values result in less attenuation of high frequencies. Gain for Mid Filter - + Ganho para Filtro Médio @@ -10971,7 +11104,7 @@ Higher values result in less attenuation of high frequencies. Kill the High Filter - + Matar o Filtro Agudo @@ -10986,32 +11119,32 @@ Higher values result in less attenuation of high frequencies. Graphic EQ - + EQ Gráfico An 8-band graphic equalizer based on biquad filters - + Um equalizador gráfico de 8 bandas baseado em filtros biquad Gain for Band Filter %1 - + Ganho para o Filtro de Banda %1 Moog Ladder 4 Filter - + Filtro Moog Ladder 4 Moog Filter - + Filtro Moog A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation - + Um filtro Moog ladder de 4 polos, baseado na implementação digital não linear de Antti Houvilainen @@ -11022,17 +11155,17 @@ Higher values result in less attenuation of high frequencies. Resonance - + Ressonância Resonance of the filters. 4 = self oscillating - + Ressonância dos filtros. 4 = auto oscilante Gain for Low Filter (neutral at 1.0) - + Ganho para Filtro de Baixos (neutro a 1.0) @@ -11055,24 +11188,26 @@ Higher values result in less attenuation of high frequencies. Stages - + Estágios Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - + Mistura o sinal de entrada com uma cópia passada através de uma série de filtros para criar uma filtragem em pente Period of the LFO (low frequency oscillator) 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Período do LFO (oscilador de baixa frequência) +1/4 - 4 batidas arrendondadas a 1/2 batida se o BPM tiver sido detetado +1/4 - 4 segundos se o BPM não tiver sido detetado Controls how much of the output signal is looped - + Controla o quanto do sinal da saída é repetido @@ -11080,27 +11215,27 @@ Higher values result in less attenuation of high frequencies. Range - + Extensão Controls the frequency range across which the notches sweep. - + Controla a faixa de frequências que o filtro elimina banda vai atuar. Number of stages - + Número de estágios Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - + Define os LFOs (osciladores de baixa frequência) para os canais esquerdo e direito, desfasados uns com os outros %1 minutes - + %1 minutos @@ -11120,12 +11255,12 @@ Higher values result in less attenuation of high frequencies. Ctrl+u - + Ctrl+u Ctrl+i - + Ctrl+i @@ -11135,7 +11270,7 @@ Higher values result in less attenuation of high frequencies. Ctrl+Shift+O - + Ctrl+Shift+O @@ -11160,12 +11295,12 @@ Higher values result in less attenuation of high frequencies. A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave). - + Um filtro isolador Bessel de 8ª ordem com mixagem Lipshitz e Vanderkooy (unidade perfeita bit a bit, com roll-off de -48db/oitava). LinkwitzRiley8 Isolator - + LinkwitzRiley8 Isolator @@ -11175,7 +11310,7 @@ Higher values result in less attenuation of high frequencies. A Linkwitz-Riley 8th-order filter isolator (optimized crossover, constant phase shift, roll-off -48 dB/octave). - + Um filtro isolador Linkwitz-Riley de 8ª order (crossover otimizado, mudança de fase constante, com roll-off de -48 dB/oitava). @@ -11185,7 +11320,7 @@ Higher values result in less attenuation of high frequencies. BQ EQ - + BQ EQ @@ -11195,7 +11330,7 @@ Higher values result in less attenuation of high frequencies. Device not found - + Dispositivo não encontrado @@ -11205,7 +11340,7 @@ Higher values result in less attenuation of high frequencies. BQ EQ/ISO - + BQ EQ/ISO @@ -11215,7 +11350,7 @@ Higher values result in less attenuation of high frequencies. Loudness Contour - + Curva de Loudness @@ -11227,33 +11362,33 @@ Higher values result in less attenuation of high frequencies. Amplifies low and high frequencies at low volumes to compensate for reduced sensitivity of the human ear. - + Amplifica frequências altas e baixas em volumes baixos para compensar pela sensitividade reduzida do ouvido humano. Set the gain of the applied loudness contour - + Define o ganho da curva de loudness aplicada Use Gain - + Usar Ganho Follow Gain Knob - + Seguir Botão de Ganho This stream is online for testing purposes! - + Esta stream está online para teste! Live Mix - + Mixagem Ao Vivo @@ -11271,18 +11406,18 @@ Higher values result in less attenuation of high frequencies. Bit depth - + Profundidade de bit Bitrate Mode - + Modo da Taxa de Bits 32 bits float - + 32 bits flutuante @@ -11294,33 +11429,33 @@ Higher values result in less attenuation of high frequencies. Adjust the left/right balance and stereo width - + Ajusta o balanço esquerda/direita e a largura estéreo Adjust balance between left and right channels - + Ajusta o balanço entre os canais esquerdo e direito Mid/Side - + Centro/Lado Bypass Fr. - + Ignorar Fr. Bypass Frequency - + Ignorar Frequência Stereo Balance - + Balanço Estéreo @@ -11328,22 +11463,25 @@ Higher values result in less attenuation of high frequencies. Fully left: mono Fully right: only side ambiance Center: does not change the original signal. - + Ajusta a amplitude estéreo alterando o balanço do sinal entre centro e lado. +Tudo esquerda: mono +Tudo direita: apenas o lado ambiente +Centro: não altera o sinal original. Frequencies below this cutoff are not adjusted in the stereo field - + As frequências abaixo deste ponto de corte não são ajustadas no campo estéreo Parametric Equalizer - + Equalizador Paramétrico Param EQ - + EQ Param @@ -11355,71 +11493,75 @@ It is designed as a complement to the steep mixing equalizers. Gain 1 - + Ganho 1 Gain for Filter 1 - + Ganho para o Filtro 1 Q 1 - + Q 1 Controls the bandwidth of Filter 1. A lower Q affects a wider band of frequencies, a higher Q affects a narrower band of frequencies. - + Controla a largura de banda do Filtro 1. +Um Q mais baixo afecta uma banda mais larga de frequências, +um Q mais alto afecta uma banda mais estreita de frequências. Center 1 - + Centro 1 Center frequency for Filter 1, from 100 Hz to 14 kHz - + Frequência central para o Filtro 1, de 100 Hz a 14 kHz Gain 2 - + Ganho 2 Gain for Filter 2 - + Ganho para o Filtro 2 Q 2 - + Q 2 Controls the bandwidth of Filter 2. A lower Q affects a wider band of frequencies, a higher Q affects a narrower band of frequencies. - + Controla a largura de banda do Filtro 2. +Um Q mais baixo afecta uma banda mais larga de frequências, +um Q mais alto afecta uma banda mais estreita de frequências. Center 2 - + Centro 2 Center frequency for Filter 2, from 100 Hz to 14 kHz - + Frequência central para o Filtro 2, de 100 Hz a 14 kHz @@ -11430,72 +11572,79 @@ a higher Q affects a narrower band of frequencies. Cycles the volume up and down - + Sobe e desce o volume num ciclo How much the effect changes the volume - + Até que ponto o efeito altera o volume Rate - + Taxa Rate of the volume changes 4 beats - 1/8 beat if tempo is detected 1/4 Hz - 8 Hz if no tempo is detected - + Taxa das alterações do volume +4 batidas - 1/8 batida se o BPM tiver sido detetado +1/4 Hz - 8 Hz se o BPM não tiver sido detetado Width of the volume peak 10% - 90% of the effect period - + Largura do pico de volume +10% - 90% do período do efeito Shape of the volume modulation wave Fully left: Square wave Fully right: Sine wave - + Forma da onda de modulação do volume +Tudo esquerda: Onda quadrada +Tudo direita: Onda sinusoidal When the Quantize parameter is enabled, divide the effect period by 3. - + Quando o parâmetro Quantização está ativo, divide o período do efeito por 3. Waveform - + Forma de Onda Phase - + Fase Shifts the position of the volume peak within the period Fully left: beginning of the effect period Fully right: end of the effect period - + Desloca a posição do pico de volume dentro do período +Tudo esquerda: início do período do efeito +Tudo direita: fim do período do efeito Round the Rate parameter to the nearest whole division of a beat. - + Aproxima o parâmetro Taxa à divisão inteira mais próxima de uma batida. Triplet - + Terceto @@ -11586,7 +11735,7 @@ Fully right: end of the effect period - + Deck %1 Leitor %1 @@ -11719,7 +11868,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Passagem @@ -11750,7 +11899,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11883,12 +12032,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11923,42 +12072,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11976,7 +12125,7 @@ may introduce a 'pumping' effect and/or distortion. Low Disk Space Warning - + Aviso de Pouco Espaço em Disco @@ -11991,17 +12140,17 @@ may introduce a 'pumping' effect and/or distortion. Could not create audio file for recording! - + Não foi possível criar o arquivo de áudio para a gravação! Ensure there is enough free disk space and you have write permission for the Recordings folder. - + Certifique-se de que há espaço livre suficiente em disco e que você tem permissão para salvar arquivos na sua pasta de gravações. You can change the location of the Recordings folder in Preferences -> Recording. - + Pode alterar o local da pasta Gravações em Preferências -> Gravação. @@ -12016,54 +12165,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Listas de reprodução - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + Cues de memória - + (loading) Rekordbox (carregando) Rekordbox @@ -12292,22 +12441,22 @@ may introduce a 'pumping' effect and/or distortion. Error setting stream IRC! - + Erro a definir a stream IRC! Error setting stream AIM! - + Erro a definir a stream AIM! Error setting stream ICQ! - + Erro a definir a stream ICQ! Error setting stream public! - + Erro ao tornar a stream pública! @@ -12362,27 +12511,27 @@ may introduce a 'pumping' effect and/or distortion. Network cache overflow - + Overflow do cache da rede Connection error - + Erro de ligação One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - + Uma das ligações de Emissão em Direto apresentou este erro:<br><b>Erro com a ligação '%1':</b><br> Connection message - + Mensagem da ligação <b>Message from Live Broadcasting connection '%1':</b><br> - + <b>Mensagem da ligação Emissão em Direto '%1':</b><br> @@ -12392,17 +12541,17 @@ may introduce a 'pumping' effect and/or distortion. Lost connection to streaming server. - + A conexão com o servidor de streaming foi perdida. Please check your connection to the Internet. - + Por favor, verifique a sua conecção à internet. Can't connect to streaming server - + Não se consegue ligar ao servidor de streaming. @@ -12415,7 +12564,7 @@ may introduce a 'pumping' effect and/or distortion. Filtered - + Filtrado @@ -12434,12 +12583,12 @@ may introduce a 'pumping' effect and/or distortion. Two outputs cannot share channels on "%1" - + Duas saídas não podem compartilhar o canal "%1" Error opening "%1" - + Erro abrindo "%1" @@ -12452,7 +12601,7 @@ may introduce a 'pumping' effect and/or distortion. Count - + Contagem @@ -12467,7 +12616,7 @@ may introduce a 'pumping' effect and/or distortion. Sum - + Soma @@ -12492,7 +12641,7 @@ may introduce a 'pumping' effect and/or distortion. Standard Deviation - + Desvio Padrão @@ -12563,7 +12712,7 @@ may introduce a 'pumping' effect and/or distortion. loop active - + loop ativo @@ -12573,7 +12722,7 @@ may introduce a 'pumping' effect and/or distortion. Effects within the chain must be enabled to hear them. - + Os efeitos dentro da cadeia devem estar ativados para serem ouvidos. @@ -12603,12 +12752,12 @@ may introduce a 'pumping' effect and/or distortion. Scroll to change the waveform zoom level. - + Role para modificar o zoom das ondas. Waveform Zoom Out - + Reduzir Forma de Onda @@ -12622,7 +12771,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Vinilo em rotação @@ -12634,7 +12783,7 @@ may introduce a 'pumping' effect and/or distortion. Right click to show cover art of loaded track. - + Clique direito para mostrar a capa do disco da faixa carregada. @@ -12649,7 +12798,7 @@ may introduce a 'pumping' effect and/or distortion. (too loud for the hardware and is being distorted). - + (Muito forte para o hardware e a ser distorcido) @@ -12694,7 +12843,7 @@ may introduce a 'pumping' effect and/or distortion. Indicates when the signal on the auxiliary is clipping, - + Indica quando o sinal auxiliar está clipando. @@ -12704,22 +12853,22 @@ may introduce a 'pumping' effect and/or distortion. Adjusts the volume of the selected channel. - + Ajusta o volume do canal seleccionado. Booth Gain - + Ganho Cabine Adjusts the booth output gain. - + Ajusta o ganho de saída para a cabine. Crossfader - + Crossfader @@ -12739,12 +12888,12 @@ may introduce a 'pumping' effect and/or distortion. Headphone Gain - + Ganho do Fone Adjusts the headphone output gain. - + Ajusta o ganho da saída do fone. @@ -12759,12 +12908,12 @@ may introduce a 'pumping' effect and/or distortion. Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - + Ajusta a Mistura do Auscultador de maneira que no canal esquerdo não está só o sinal puro de escuta. Microphone - + Microfone @@ -12784,7 +12933,7 @@ may introduce a 'pumping' effect and/or distortion. Vinyl Control - + Controlo Vinilo @@ -12804,19 +12953,19 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Capa Show/hide Cover Art. - + Mostrar/ocultar Capa de Disco Toggle 4 Decks - + Ligar/Desligar 4 Decks @@ -12826,32 +12975,32 @@ may introduce a 'pumping' effect and/or distortion. Show Library - + Mostrar Biblioteca Show or hide the track library. - + Mostra ou oculta a biblioteca da faixa. Show Effects - + Mostrar Efeitos Show or hide the effects. - + Mostra ou oculta os efeitos. Toggle Mixer - + Alternar Misturador Show or hide the mixer. - + Mostra ou oculta o misturador. @@ -12876,7 +13025,7 @@ may introduce a 'pumping' effect and/or distortion. Adjusts the pre-fader microphone gain. - + Ajusta o ganho do microfone antes do controlador de transições. @@ -12901,27 +13050,27 @@ may introduce a 'pumping' effect and/or distortion. Microphone Talkover Mode - + Microfone Modo Talkover Off: Do not reduce music volume - + Desligado: Não reduza o volume da música Manual: Reduce music volume by a fixed amount set by the Strength knob. - + Manual: Reduz o volume de música de um valor fixo definido pelo botão Strenght. Behavior depends on Microphone Talkover Mode: - + O comportamento depende do Modo Talkover Microfone: Off: Does nothing - + Desligado: Faz nada @@ -13001,7 +13150,7 @@ may introduce a 'pumping' effect and/or distortion. Tempo - + Tempo @@ -13027,7 +13176,7 @@ may introduce a 'pumping' effect and/or distortion. When tapped, adjusts the average BPM down by a small amount. - + Quando pressionado, diminui um pouco o BPM médio. @@ -13037,202 +13186,202 @@ may introduce a 'pumping' effect and/or distortion. When tapped, adjusts the average BPM up by a small amount. - + Quando pressionado, aumenta um pouco o BPM médio. - + Adjust Beats Earlier - + Ajustar Batidas Cedo - + When tapped, moves the beatgrid left by a small amount. Quando pressionado, move a grade de batidas um pouco para a esquerda. - + Adjust Beats Later - + Adiantar Grade de Batidas - + When tapped, moves the beatgrid right by a small amount. - + Quando batido, move a grelha de batidas para a direita, uma pequena quantidade. - + Tempo and BPM Tap Batimento de Tempo e BPM - + Show/hide the spinning vinyl section. - + Mostrar/ocultar a secção do Vinilo em Rotação - + Keylock Trava de Tom - + Toggling keylock during playback may result in a momentary audio glitch. Ligar/Desligar a trava de tom enquanto tocando pode resultar em um glitch de áudio momentâneo - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Alterna a visibilidade do Controlo da Taxa - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. Coloca um ponto de sinalização na posição atual na forma de onda. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Pára a faixa no CUE Point, OU vai para o CUE Point e reproduz a faixa após soltar o botão (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). Define o CUE point (em modo Pioneer/Mixxx/Numark), define o CUE point e toca após largar a tecla (modo CUP) OU escuta o preview (modo Denon). - + Is latching the playing state. - + Seeks the track to the cue point and stops. Avança a faixa até ao Cue Point e para. - + Play Tocar - + Plays track from the cue point. - + Toca a faixa a partir do ponto de marcação. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Altera a velocidade da faixa (afeta o tempo e o pitch). Se o keylock estiver ativo, apenas o tempo é alterado. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Mostra o alcance atual do deslizante de tempo. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration - + Duração da Gravação @@ -13380,7 +13529,7 @@ may introduce a 'pumping' effect and/or distortion. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: Define o quanto reduzir o volume da música quando o volume de microfones ativos passa de um determinado limite. @@ -13468,933 +13617,941 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. Mostra a duração da gravação em andamento. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Define o marcador Início Loop da faixa para a atual posição de reprodução. - + Press and hold to move Loop-In Marker. - + Pressione e mantenha para mover o marcador Início Loop. - + Jump to Loop-In Marker. - + Saltar para o marcador Início Loop. - + Sets the track Loop-Out Marker to the current play position. - + Define o marcador Fim Loop para a atual posição de reprodução. - + Press and hold to move Loop-Out Marker. - + Pressione e mantenha para mover o marcador Fim Loop. - + Jump to Loop-Out Marker. - + Saltar para o marcador Fim Loop. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Tamanho do Loop de Batidas - + Select the size of the loop in beats to set with the Beatloop button. - + Escolher o tamanho do loop em batidas estabelecer com o botão Loop. - + Changing this resizes the loop if the loop already matches this size. - + Alterando isto redimensiona o loop se o loop já coincide com este tamanho. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Reduz a metade o tamanho dum loop existente, ou reduz a metade o tamanho do próximo loop definido com o botão Loop. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Duplica o tamanho dum loop existente, ou duplica o tamanho do próximo loop definido com o botão Loop. - + Start a loop over the set number of beats. - + Iniciar um loop com o número de batidas prédefinidas. - + Temporarily enable a rolling loop over the set number of beats. - + Ativa temporariamente um loop de rolamento sobre o número de batidas selecionado. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Beatjump/Loop Tamanho Movimento - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Selecione o número de batidas a saltar ou a deslocar o loop com os botões Beatjump Frente/Atrás. - + Beatjump Forward - + Beatjump Frente - + Jump forward by the set number of beats. - + Salta para a frente o número de batidas predefinidas. - + Move the loop forward by the set number of beats. - + Move o loop para a frente o número de batidas prédefinidas. - + Jump forward by 1 beat. - + Salta para a frente 1 batida. - + Move the loop forward by 1 beat. - + Move o loop para a frente 1 batida. - + Beatjump Backward - + Beatjump Atrás - + Jump backward by the set number of beats. - + Salta para trás o número de batidas prédefinidas. - + Move the loop backward by the set number of beats. - + Move o loop para trás o número de batidas prédefinidas. - + Jump backward by 1 beat. - + Salta para trás 1 batida. - + Move the loop backward by 1 beat. - + Move o loop para trás 1 batida. - + Reloop - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Se o loop estiver à frente da posição atual de reprodução, o ciclo de looping começará quando o loop for atingido. - + Works only if Loop-In and Loop-Out Marker are set. - + Funciona apenas se os marcadores de Início Loop e Fim Loop estiverem definidos. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Ativar loop, saltar para o marcador Início Loop, e parar a reprodução. - + Displays the elapsed and/or remaining time of the track loaded. - + Mostra o tempo executado e/ou restante da faixa carregada. - + Click to toggle between time elapsed/remaining time/both. Clique para alternar entre tempo executado/restante tempo/ambos. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Mistura - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajustar a mistura do sinal seco (entrada) com o molhado (saída) da unidade de efeito - + D/W mode: Crossfade between dry and wet - + Modo S/M: crossfade entre seco e molhado - + D+W mode: Add wet to dry - + Modo S/M: adicionar molhado ao seco - + Mix Mode - + Modo Mistura - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajustar a mistura do sinal seco (entrada) com o sinal molhado (saída) da unidade de efeito - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Modo Seco/Molhado (linhas cruzadas): o botão de Mistura faz a transição entre seco e molhado. +Usar isto para alterar o som da faixa com EQ e filtros de efeitos. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Modo Seco+Molhado (linha seca plana): o botão de Mistura adiciona o molhado ao seco. +Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtros de efeitos. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Envia o bus esquerdo do crossfader através desta unidade de efeito. - + Route the right crossfader bus through this effect unit. - + Envia o bus direito do crossfader através desta unidade de efeito. - + Right side active: parameter moves with right half of Meta Knob turn - + Lado direito ativo: o parâmetro muda com meia volta para a direita do Botão Meta - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Menu Definições Skin - + Show/hide skin settings menu - + Mostra/Oculta menu de definições. - + Save Sampler Bank - + Guardar o Banco do Sampler - + Save the collection of samples loaded in the samplers. - + Guarda a colecção de samples carregadas nos samplers. - + Load Sampler Bank Carregar o Banco do Sampler - + Load a previously saved collection of samples into the samplers. - + Carrega uma colecção de samples guardada previamente nos samplers. - + Show Effect Parameters Mostrar Parâmetros do Efeito - + Enable Effect - + Ativar Efeito - + Meta Knob Link - + Ligação Botão Meta - + Set how this parameter is linked to the effect's Meta Knob. - + Definir como este parâmetro está ligado ao botão de efeitos Meta. - + Meta Knob Link Inversion - + Vínculo inverso do Botão Meta - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Inverte a direção que este parâmetro se move quando rodando o efeito do Botão Meta - + Super Knob - + Super Botão - + Next Chain Próxima Corrente - + Previous Chain - + Cadeia Anterior - + Next/Previous Chain - + Corrente Seguinte/Anterior - + Clear - + Limpar - + Clear the current effect. - + Limpa o efeito atual. - + Toggle - + Ligar/Desligar - + Toggle the current effect. - + Liga/Desliga o efeito atual. - + Next Seguinte - + Clear Unit - + Limpar Unidade - + Clear effect unit. Limpa a unidade de efeito. - + Show/hide parameters for effects in this unit. - + Mostra/Oculta parâmetros para efeitos nesta unidade. - + Toggle Unit - + Ligar/Desligar Unidade - + Enable or disable this whole effect unit. - + Ativa ou desativa esta unidade completa de efeito. - + Controls the Meta Knob of all effects in this unit together. - + Controla o Meta Botão de todos os efeitos conjuntamente nesta unidade. - + Load next effect chain preset into this effect unit. - + Carrega a próxima cadeia de efeitos prédefinida nesta unidade de efeito. - + Load previous effect chain preset into this effect unit. - + Carrega a anterior cadeia de efeitos prédefinida nesta unidade de efeito. - + Load next or previous effect chain preset into this effect unit. - + Carrega a próxima ou anterior cadeia de efeitos prédefinida nesta unidade de efeito. - - - - + + + + Assign Effect Unit - + Atribuir Unidade de Efeito - + Assign this effect unit to the channel output. - + Atribuir esta unidade de efeito ao canal de saída. - + Route the headphone channel through this effect unit. - + Encaminha o canal de auscultadores através desta unidade de efeito. - + Route this deck through the indicated effect unit. - + Encaminha este deck através da unidade de efeito indicada. - + Route this sampler through the indicated effect unit. - + Encaminha este sampler através da unidade de efeito indicada. - + Route this microphone through the indicated effect unit. - + Encaminha este microfone através da unidade de efeito indicada. - + Route this auxiliary input through the indicated effect unit. - + Encaminha esta entrada auxiliar através da unidade de efeito indicada. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Esta unidade de efeito deve também ser atribuída a um leitor ou a outra fonte sonora para ouvir o efeito. - + Switch to the next effect. - + Troca para o próximo efeito. - + Previous Anterior - + Switch to the previous effect. Troca para o efeito anterior. - + Next or Previous - + Próximo ou Anterior - + Switch to either the next or previous effect. - + Troca para o efeito seguinte ou anterior. - + Meta Knob - + Botão Meta - + Controls linked parameters of this effect - + Controla os parâmetros deste efeito aqui ligado. - + Effect Focus Button - + Botão de Foco do Efeito - + Focuses this effect. Se foca no efeito. - + Unfocuses this effect. - + Anula o realce deste efeito. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Acesse a página web do seu controlador na wiki do Mixxx para mais informações. - + Effect Parameter - + Parâmetro Efeito - + Adjusts a parameter of the effect. - + Ajusta um parâmetro do efeito. - + Inactive: parameter not linked - + Inativo: parâmetro não ligado - + Active: parameter moves with Meta Knob - + Activo: o parâmetro move-se com o Botão Meta - + Left side active: parameter moves with left half of Meta Knob turn - + Lado esquerdo ativo: o parâmetro move-se com meia volta para a esquerda do Botão Meta - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - + Lado esquerdo e direito ativo: o parâmetro desloca-se ao longo da sua extensão com meia volta do Botão Meta e para trás com a outra meia volta. - - + + Equalizer Parameter Kill Matar Parâmetro do Equalizador - - + + Holds the gain of the EQ to zero while active. - + Mantem o ganho do equalizador em zero quanto ativo. - + Quick Effect Super Knob Super Botão de Efeito Rápido - + Quick Effect Super Knob (control linked effect parameters). - + Super Botão de Efeito Rápido (controla parâmetros de efeitos conectados). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Sugestão: Alterar o modo Efeito Rápido padrão em Preferências -> Equalizadores. - + Equalizer Parameter - + Parâmetro do Equalizador - + Adjusts the gain of the EQ filter. - + Ajusta o ganho do filtro EQ. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Dica: Mude o modo padrão do equalizador em Preferências -> Equalizadores. - - + + Adjust Beatgrid Ajustar a grelha ritmica - + Adjust beatgrid so the closest beat is aligned with the current play position. - + Ajustar a grelha ritmica para que o tempo mais próximo seja alinhado com a posição corrente do cursor. - - + + Adjust beatgrid to match another playing deck. - + Ajusta a grade de batidas para combinar com outro deck tocando. - + If quantize is enabled, snaps to the nearest beat. Quando a quantificação está activada, ajusta-se ao tempo mais próximo. - + Quantize Quantificação - + Toggles quantization. Activa/desactiva a quantificação. - + Loops and cues snap to the nearest beat when quantization is enabled. Os loops e as marcas ajustam-se ao tempo mais próximo quando a quantificação está activada. - + Reverse Inverter - + Reverses track playback during regular playback. Inverte o sentido da leitura da faixa durante a reprodução normal. - + Puts a track into reverse while being held (Censor). Coloca a faixa em reprodução invertida enquanto pressionado (Censurar). - + Playback continues where the track would have been if it had not been temporarily reversed. - + A reprodução continua onde a faixa estaria se ela não estivesse sido temporariamente invertida. - - - + + + Play/Pause - + Leitura/Pausa - + Jumps to the beginning of the track. - + Salta para o início da faixa - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Sincroniza o tempo (BPM) e a fase para a da outra faixa, ou BPM se detectado nos dois. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sincroniza o tempo (BPM) com o da outra faixa, se o BPM for detetado em ambas. - + Sync and Reset Key - + Sincronizar e Reiniciar Tom - + Increases the pitch by one semitone. - + Aumenta a tonalidade de um meio tom. - + Decreases the pitch by one semitone. Diminui o pitch por um semitom. - + Enable Vinyl Control - + Ativar Controle por Vini - + When disabled, the track is controlled by Mixxx playback controls. - + Quando desativado, a faixa é controlada pelos controles de reprodução do Mixxx. - + When enabled, the track responds to external vinyl control. Quando ativado, a faixa responde ao controle por vinil externo - + Enable Passthrough - + Ativar Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Indica que o buffer de áudio é muito pequeno para fazer todo o processamento de aúdio. - + Displays cover artwork of the loaded track. - + Mostra a arte da capa da faixa carregada. - + Displays options for editing cover artwork. - + Mostra as opções para edição da capa do disco. - + Star Rating - + Classificação de Estrela - + Assign ratings to individual tracks by clicking the stars. - + Atribui classificações a faixas individuais clicando nas estrelas. Channel Peak Indicator - + Indicador de Pico de Canal @@ -14434,7 +14591,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Channel R Peak Indicator - + Indicador de Pico do Canal D @@ -14444,12 +14601,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Channel L Volume Meter - + Volume do Canal E Shows the current channel volume for the left channel. - + Mostra o volume atual do canal para o lado esquerdo. @@ -14464,7 +14621,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Microphone Peak Indicator - + Indicador de Pico do Microfone @@ -14504,7 +14661,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Preview Deck Peak Indicator - + Indicador de Pico do Leitor de Antevisão @@ -14514,41 +14671,41 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Maximize Library - + Maximizar Biblioteca Microphone Talkover Ducking Strength - + Amplitude da Redução no Talkover - + Prevents the pitch from changing when the rate changes. - + Previne que o tom mude com as mudanças na taxa do pitch. - + Changes the number of hotcue buttons displayed in the deck - + Altera o número de botões hotcue mostrados no leitor - + Starts playing from the beginning of the track. Começa a tocar do começo da faixa. - + Jumps to the beginning of the track and stops. Pula para o começo da faixa e para. - - + + Plays or pauses the track. Lê ou suspende a leitura da faixa. - + (while playing) (durante a leitura) @@ -14568,217 +14725,217 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (enquanto parado) - + Cue Marca de início - + Headphone Auscultador - + Mute Mutar - + Old Synchronize - + Sincronização Antiga - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Sincroniza com o primeiro Deck (em ordem numérica) que está tocar uma faixa e que tem um BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Se nenhum Deck estiver a tocar, sincroniza com o primeiro Deck que tenha BPM - + Decks can't sync to samplers and samplers can only sync to decks. os Deck não conseguem sincronizar com as amostras e as amostras só conseguem sincronizar com os Decks - + Hold for at least a second to enable sync lock for this deck. - + Manter premido, por pelo menos um segundo, para ativar o bloqueio de sincronização para este leitor. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Decks com trava de sincronização vão tocar no mesmo tempo, e os decks que também tem quantização ativada vão sempre ter suas batidas alinhadas. - + Resets the key to the original track key. - + Reinicia o tom, para o tom original da faixa. - + Speed Control - + Controle de Velocidade - - - + + + Changes the track pitch independent of the tempo. - + Muda o pitch da faixa independentemente do tempo. - + Increases the pitch by 10 cents. - + Aumenta o pitch por 10 cents. - + Decreases the pitch by 10 cents. - + Diminui o pitch por 10 cents. - + Pitch Adjust Ajustar o Pitch - + Adjust the pitch in addition to the speed slider pitch. - + Ajusta o pitch junto com o deslizante de velocidade pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Gravar Mixagem - + Toggle mix recording. - + Ativa/Desativa gravação da mixagem. - + Enable Live Broadcasting - + Ativar Emissão em Direto - + Stream your mix over the Internet. - + Transmite sua mixagem pela Internet. - + Provides visual feedback for Live Broadcasting status: Provê retorno visual para o estado de Transmissão Ao Vivo: - + disabled, connecting, connected, failure. desativado, conectando, conectado, falha. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Quando ativada, o leitor toca o audio que chega diretamente à entrada do vinil. - + Playback will resume where the track would have been if it had not entered the loop. O Playback vai retornar ao ponto onde a faixa teria ficado se não tivesse entrado no loop. - + Loop Exit Sair do Loop - + Turns the current loop off. Desliga o loop - + Slip Mode Modo de deslizamento - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Quando activo, o playback continua abafado em segundo plano durante o loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. Uma vez desactivado, o playback audível será retomado onde a faixa estaria. - + Track Key The musical key of a track Tom da Faixa - + Displays the musical key of the loaded track. - + Mostra o tom musical da faixa carregada. - + Clock Relógio - + Displays the current time. Afixa a hora actual - + Audio Latency Usage Meter - + Uso da Latência de Áudio - + Displays the fraction of latency used for audio processing. - + Mostra a fração da latência usada no processamento de audio. - + A high value indicates that audible glitches are likely. - + Um valor alto indica que ruídos no áudio são prováveis. - + Do not enable keylock, effects or additional decks in this situation. - + Não ative a trava de tom, efeitos ou decks adicionais nessa situação. - + Audio Latency Overload Indicator - + Indicador de Sobrecarga de Latência Audio @@ -14788,7 +14945,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Drop tracks from library, external file manager, or other decks/samplers here. - + Largar faixas da biblioteca, gestor de ficheiros exterior, ou outros leitores/samplers aqui. @@ -14798,17 +14955,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Crossfader Orientation - + Orientação Crossfader Set the channel's crossfader orientation. - + Define a orientação do crossfader entre canais. Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - + Quer para o lado esquerdo do crossfader, ou para o lado direito, ou para o centro (não afetada pelo crossfader) @@ -14818,257 +14975,257 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Displays the current musical key of the loaded track after pitch shifting. - + Mostra o tom musical corrente da faixa carregada, após movimentação do cursor de velocidade/tom. - + Fast Rewind Retorno Rápido - + Fast rewind through the track. Retorno rápido percorrendo a faixa. - + Fast Forward Avanço Rápido - + Fast forward through the track. Avanço rápido percorrendo a faixa. - + Jumps to the end of the track. Salta para o fim da faixa. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - + Define a tonalidade para um tom que permita uma transição harmónica para outra faixa. Requer ter sido detetado um tom em ambos os leitores envolvidos. - - - + + + Pitch Control Controlo da Velocidade - + Pitch Rate Variador de Altura - + Displays the current playback rate of the track. Mostra a velocidade corrente da faixa. - + Repeat Repetir - + When active the track will repeat if you go past the end or reverse before the start. Quando activo, a faixa será repetida se for para além do fim, ou em reverso para além do início. - + Eject Ejectar - + Ejects track from the player. Ejecta a faixa do leitor. - + Hotcue Marcação - + If hotcue is set, jumps to the hotcue. Se o ponto de marcação estiver definido, salta para o ponto de marcação. - + If hotcue is not set, sets the hotcue to the current play position. Se o ponto de marcação não estiver definido, define o ponto de marcação no local de leitura corrente. - + Vinyl Control Mode Modo de Controlo Vinilo - + Absolute mode - track position equals needle position and speed. Modo Absoluto - a posição na faixa é igual à posição e velocidade da agulha. - + Relative mode - track speed equals needle speed regardless of needle position. Modo Relativo - a velocidade da faixa é igual à velocidade da agulha independentemente da posição da agulha. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Modo Constante - a velocidade da faixa é igual à última velocidade instantânea conhecida independentemente da posição da agulha. - + Vinyl Status Estado do Vinilo - + Provides visual feedback for vinyl control status: Fornece um sinal visual para o estado do controlo vinilo: - + Green for control enabled. Verde para controlo activado. - + Blinking yellow for when the needle reaches the end of the record. Amarelo a piscar quando a agulha chega ao fin do disco. - + Loop-In Marker Marcador de Entrada de Loop - + Loop-Out Marker Marcador de Saída de Loop - + Loop Halve Reduz o loop a metade - + Halves the current loop's length by moving the end marker. Reduz a metade o comprimento do loop corrente, movendo o marcador de fim. - + Deck immediately loops if past the new endpoint. O leitor faz loop imdiatamente, se o novo marcador de saída for ultrapassado. - + Loop Double Duplicação do loop - + Doubles the current loop's length by moving the end marker. Duplica o comprimento corrente do loop movendo o marcador de fim. - + Beatloop Loop de Tempos - + Toggles the current loop on or off. Activa ou desactiva o loop corrente. - + Works only if Loop-In and Loop-Out marker are set. Funciona apenas se as marcas de entrada e de saída do loop estiverem definidas. - + Vinyl Cueing Mode Modo de Marcação Vinilo - + Determines how cue points are treated in vinyl control Relative mode: Determina a forma como os pontos de marcação são tratados no modo de controlo vinilo Relativo. - + Off - Cue points ignored. Inactivo - os pontos de marcação são ignorados. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Uma Marca – Se a agulha é largada após o ponto de marcação, a faixa posiciona-se nesse ponto de marcação. - + Track Time Duração da faixa - + Track Duration Duração da Faixa - + Displays the duration of the loaded track. Mostra a duração da faixa carregada. - + Information is loaded from the track's metadata tags. A informação é carregada a partir das etiquetas de metadados da faixa. - + Track Artist Artista da Faixa - + Displays the artist of the loaded track. Mostra o artista da faixa carregada. - + Track Title Título da Faixa - + Displays the title of the loaded track. Mostra o título da faixa. - + Track Album Album da faixa - + Displays the album name of the loaded track. Mostra o nome do album da faixa carregada. - + Track Artist/Title Artista/título da faixa - + Displays the artist and title of the loaded track. Mostra o artista e o título da faixa carregada. @@ -15076,14 +15233,14 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + Ocultar faixas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? - + As faixas selecionadas estão na seguintes playlists: %1 Ocultando-as serão removidas destas playlists. Continuar? @@ -15091,7 +15248,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Export finished - + Exportação terminada @@ -15121,12 +15278,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. &Skip - + P&ular Export Error - + Erro de Exportação @@ -15134,7 +15291,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Export Track Files To - + Exportar Faixas Para @@ -15148,17 +15305,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Error removing file %1: %2. Stopping. - + Erro na remoção do ficheiro %1: %2. Paragem. Error exporting track %1 to %2: %3. Stopping. - + Erro ao exportar faixa %1 para %2: %3. Parando. Error exporting tracks - + Erro ao exportar as faixas @@ -15190,7 +15347,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Timer (Fallback) - + Cronômetro (Retirada) @@ -15200,12 +15357,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Wait for Video sync - + Aguardar pela sincronização Video Sync Control - + Controle de Sincronização @@ -15223,7 +15380,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Time until charged: %1 - + Tempo até carregada: %1 @@ -15233,7 +15390,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Battery fully charged. - + Bateria carregada completamente. @@ -15255,29 +15412,29 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Choose new cover change cover art location - + Escolher nova capa Clear cover clears the set cover art -- does not touch files on disk - + Limpar capa do disco Reload from file/folder reload cover art from file metadata or folder - + Recarregar do arquivo/pasta Image Files - + Arquivos de Imagem Change Cover Art - + Mudar Arte da Capa @@ -15296,47 +15453,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15461,323 +15618,353 @@ This can not be undone! - Create &New Playlist + Search in Current View... - Create a new playlist + Search for tracks in the current library view + + + + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + + Create &New Playlist + Criar &Playlist Nova + + + + Create a new playlist + Criar uma nova playlist + + + Ctrl+n Ctrl+n - + Create New &Crate - + Criar Nova &Caixa - + Create a new crate Criar uma Caixa nova - + Ctrl+Shift+N - + Ctrl+Shift+N - - + + &View &Ver - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Pode não ser compatível com todos os temas - + Show Skin Settings Menu - + Mostrar Menu de Configurações do Tema - + Show the Skin Settings Menu of the currently selected Skin - + Mostra o menu das configurações do tema do tema atualmente selecionado - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar a Secção do Microfone - + Show the microphone section of the Mixxx interface. Mostrar a secção microfone do interface Mixxx - + Ctrl+2 Menubar|View|Show Microphone Section - + Ctrl+2 - + Show Vinyl Control Section Mostrar a Secção de Controle de Vinyl - + Show the vinyl control section of the Mixxx interface. Mostrar a secção Controlo Vinilo do interface Mixxx - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Ctrl+3 - + Show Preview Deck Mostrar o Deck de Pré-visualização - + Show the preview deck in the Mixxx interface. Mostrar o Deck de Pré-visualização no interface do Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck - + Ctrl+4 - + Show Cover Art Mostrar Arte da Capa - + Show cover art in the Mixxx interface. - + Mostrar as capas dos discos no interface Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art - + Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. - + Maximiza a biblioteca de faixas para ocupar todo o espaço disponível do ecrã. - + Space Menubar|View|Maximize Library Espaço - + &Full Screen &Ecrã completo - + Display Mixxx using the full screen Mostrar o Mixxx em ecrã completo - + &Options &Opções - + &Vinyl Control Controlo Vinilo - + Use timecoded vinyls on external turntables to control Mixxx Utilizar discos de vinilo codificados num leitor externo para controlar o Mixxx - + Enable Vinyl Control &%1 - + Ativar Controle por Vinil &%1 - + &Record Mix Gravar a mistura - + Record your mix to a file Gravar a sua mistura num ficheiro - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activar a difusão em directo - + Stream your mixes to a shoutcast or icecast server Difunda as suas misturas via um servidor de "shoutcast" ou "icecast" - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activar atalhos de teclado - + Toggles keyboard shortcuts on or off Activar/desactivar atalhos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferências - + Change Mixxx settings (e.g. playback, MIDI, controls) Modificar os parâmetros do Mixxx (ex. difusão, MIDI, controladores) - + &Developer &Desenvolvedor - + &Reload Skin &Recarregar Skin - + Reload the skin Recarregar a skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools - + &Ferramentas do Desenvolvedor - + Opens the developer tools dialog Abre o diálogo das ferramentas de desenvolvedor - + Ctrl+Shift+T - + Ctrl+Shift+T - + Stats: &Experiment Bucket Dados: Balde de &Experimento - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ativa o modo Experiências. Coleta estatísticas no balde de rastreio EXPERIÊNCIAS. - + Ctrl+Shift+E - + Ctrl+Shift+E - + Stats: &Base Bucket - + Estatísticas: &Balde Base - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ativa o modo base. Coleta dados no balde de localização BASE. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled - + Deb&ugger Ativado - + Enables the debugger during skin parsing - + Ativa o debugger enquanto a skin estiver sendo analisada - + Ctrl+Shift+D - + Ctrl+Shift+D - + &Help &Ajuda - + Show Keywheel menu title @@ -15794,74 +15981,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support Suporte da comunidade - + Get help with Mixxx Obter ajuda sobre o Mixxx - + &User Manual Manual do utilizador - + Read the Mixxx user manual. Ler o manual de utilizador do Mixxx - + &Keyboard Shortcuts - + &Atalhos de Teclado - + Speed up your workflow with keyboard shortcuts. Acelere seu fluxo de trabalho com atalhos de teclado. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Traduzir esta Aplicação - + Help translate this application into your language. Ajude a traduzir esta aplicação na sua linguagem - + &About &Sobre - + About the application Sobre a aplicação @@ -15869,25 +16056,25 @@ This can not be undone! WOverview - + Passthrough Passagem - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15896,25 +16083,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Limpar entrada - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Pesquisa - + Clear input Limpar a entrada @@ -15925,169 +16100,163 @@ This can not be undone! Procurar... - + Clear the search bar input field - - Enter a string to search for - + + Return + Enter - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Atalho + See User Manual > Mixxx Library for more information. + - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return - Enter + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history - - - - - Esc + + in search history - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Nota - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artista - + Album Artist Álbum Artista - + Composer Compositor - + Title Título - + Album Album - + Grouping Agrupar - + Year - + Ano - + Genre Gênero - + Directory - + &Search selected @@ -16095,620 +16264,625 @@ This can not be undone! WTrackMenu - + Load to Carregar para - + Deck Leitor - + Sampler Amostrador - + Add to Playlist Adicionar à Lista de reprodução - + Crates Caixas - + Metadata Metadado - + Update external collections - + Cover Art Capa - + Adjust BPM - + Ajustar BPM - + Select Color - - + + Analyze Analisar - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Juntar à fila Auto DJ (em baixo) - + Add to Auto DJ Queue (top) Juntar à fila Auto DJ (em cima) - + Add to Auto DJ Queue (replace) - + Adicionar à Fila Auto DJ (Substituir) - + Preview Deck Deck de Prá-visualização - + Remove - + Remover - + Remove from Playlist - + Remover da Playlist - + Remove from Crate - + Remover da Caixa - + Hide from Library Ocultar na Biblioteca - + Unhide from Library Reexibir na Biblioteca - + Purge from Library Limpar da Biblioteca - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Propriedades - + Open in File Browser Abrir no Navegador de Ficheiros - + Select in Library - + Import From File Tags Importar Das Tags Ficheiros - + Import From MusicBrainz - + Importar do MusicBrainz - + Export To File Tags - + Exportar Para Tags Ficheiros - + BPM and Beatgrid - + BPM e Grelha de Batidas - + Play Count - + Contador de Leitura - + Rating classificação - + Cue Point - + Ponto de Marcação - - + + Hotcues Marcações - + Intro - + Outro - + Key Nota - + ReplayGain ReplayGain - + Waveform - + Forma de Onda - + Comment Comentário - + All Tudo - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Bloquear o Tempo (BPM) - + Unlock BPM Desbloquear o Tempo (BPM) - + Double BPM Duplicar o BPM - + Halve BPM Reduzir o BPM a metade - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Leitor %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Criar nova lista de reprodução - + Enter name for new playlist: Entre o nome da nova lista de reprodução - + New Playlist Nova lista de reprodução - - - + + + Playlist Creation Failed - + A criação da Lista de reprodução falhou - + A playlist by that name already exists. Já existe uma Playlist com este nome - + A playlist cannot have a blank name. - + A Playlist não pode ter um nome vazio - + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a Playlist - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) Locking BPM of %n track(s)Locking BPM of %n track(s)Bloqueando o BPM de %n faixa(s) - + Unlocking BPM of %n track(s) Unlocking BPM of %n track(s)Unlocking BPM of %n track(s)Desbloqueando o BPM de %n faixa(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) Setting color of %n track(s)Setting color of %n track(s)Mudando a cor de %n faixa(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Cancelar - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Fechar - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16724,37 +16898,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16762,37 +16936,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16800,12 +16974,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Mostrar/ocultar colunas - + Shuffle Tracks @@ -16813,52 +16987,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Escolha a pasta da biblioteca musical - + controllers - + Cannot open database Não é possível abrir a base de dados - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16872,68 +17046,78 @@ Clique em OK para sair. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - - Browse + + Playlists + + + + + Selected crates/playlists - + + Browse + Procurar + + + Export directory - + Database version - + Export Exportar - + Cancel - + Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16943,18 +17127,18 @@ Clique em OK para sair. Export Modified Track Metadata - + Exportar Metadados Modificados da Faixa Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - + O Mixxx poderá esperar para modificar ficheiros até que não estejam carregados em quaisquer leitores ou samplers. Se não vir os metadados alterados noutros programas imediatamente, ejecte a faixa de todos os leitores e samplers ou encerre o Mixxx. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16964,23 +17148,23 @@ Clique em OK para sair. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... @@ -16997,7 +17181,7 @@ Clique em OK para sair. No network access - + Sem acesso a rede diff --git a/res/translations/mixxx_pt_BR.qm b/res/translations/mixxx_pt_BR.qm index 5fd1d7ebcb2912b7bdeeabbdee24a8a212971b37..4c172df81737c76bb1b573ce15db126d1cd75c43 100644 GIT binary patch delta 60915 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 JEqD#i{{#1WPe=d& delta 16670 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 fila do Auto DJ - + Remove Crate as Track Source Remover Caixa como Fonte de Faixas - + Auto DJ Auto DJ - + Confirmation Clear Confirmar limpeza - + Do you really want to remove all tracks from the Auto DJ queue? Você tem certeza que quer remover todas as faixas da fila do Auto DJ? - + This can not be undone. Esta ação não pode ser desfeita. - + Add Crate as Track Source Adicionar Caixa como Fonte de Faixas @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Nova Lista de Reprodução @@ -160,7 +160,7 @@ - + Create New Playlist Criar uma Playlist Nova @@ -190,113 +190,120 @@ Duplicar - - + + Import Playlist Importar Playlist - + Export Track Files Exportar Arquivos de Faixa - + Analyze entire Playlist Analisar toda a Lista de reprodução - + Enter new name for playlist: Digite o novo nome para a lista: - + Duplicate Playlist Duplicar a Lista de Reprodução - - + + Enter name for new playlist: Digite o nome para a nova lista de reprodução: - - + + Export Playlist Exportar Playlist - + Add to Auto DJ Queue (replace) Adicionar a fila do Auto DJ (substituir) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renomear Playlist - - + + Renaming Playlist Failed A mudança de nome da Playlist falhou - - - + + + A playlist by that name already exists. Uma lista de reprodução com esse nome já existe. - - - + + + A playlist cannot have a blank name. Uma lista de reprodução não pode ter um nome em branco. - + _copy //: Appendix to default name when duplicating a playlist _copiar - - - - - - + + + + + + Playlist Creation Failed A criação da Lista de reprodução falhou - - + + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a lista de reprodução: - + Confirm Deletion Confimar a remoção - + Do you really want to delete playlist <b>%1</b>? Você realmente deseja excluir a lista de reprodução <b>%1</b>? - + M3U Playlist (*.m3u) Lista de reprodução M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de Reprodução M3U (*.m3u);;Lista de Reprodução M3U8 (*.m3u8);;Lista de Reprodução PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # - + Timestamp Data/Hora @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Não conseguiu carregar a faixa. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Álbum - + Album Artist Artista do Álbum - + Artist Artista - + Bitrate Taxa de Bits - + BPM BPM - + Channels Canais - + Color Cor - + Comment Comentário - + Composer Compositor - + Cover Art Arte de Capa - + Date Added Data Adicionada - + Last Played Última Execução - + Duration Duração - + Type Tipo - + Genre Gênero - + Grouping Agrupamento - + Key Tom - + Location Localização - + + Overview + + + + Preview Pré-Visualizar - + Rating Classificação - + ReplayGain ReplayGain - + Samplerate Taxa de amostragem - + Played Tocada - + Title Título - + Track # Faixa # - + Year Ano - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Buscando imagem ... @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Adicionar aos Links Rápidos - + Remove from Quick Links Remover dos Links Rápidos - + Add to Library Adicionar à Biblioteca - + Refresh directory tree Recarregar pastas - + Quick Links Links Rápidos - - + + Devices Dispositivos - + Removable Devices Dispositivos Removíveis - - + + Computer Computador - + Music Directory Added - + Pasta de Música Adicionada - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Você adicionou um ou mais diretórios de música. As faixas nesses diretórios não ficarão disponíveis até que você reexamine sua biblioteca. Você quer reexaminar agora? - + Scan - + Examinar - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computador" permite que você navegue, veja e carregue faixas de pastas do seu disco rígido ou de dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -670,7 +692,7 @@ Key - + Nota @@ -705,17 +727,17 @@ File Modified - + Ficheiro Modificado File Created - + Ficheiro Criado Mixxx Library - + Biblioteca Mixxx @@ -728,7 +750,7 @@ The file '%1' could not be found. - + O arquivo '%1' não pôde ser encontrado. @@ -890,7 +912,7 @@ trace - Above + Profiling messages Remove Palette - + Remover Paleta @@ -918,7 +940,7 @@ trace - Above + Profiling messages No control chosen. - + Nenhum controlo escolhido. @@ -986,7 +1008,7 @@ trace - Above + Profiling messages Auxiliary %1 - + Auxiliar %1 @@ -996,7 +1018,7 @@ trace - Above + Profiling messages Effect Rack %1 - + Rack de Efeitos %1 @@ -1027,7 +1049,7 @@ trace - Above + Profiling messages Headphone delay - + Atraso Auscultador @@ -1046,15 +1068,15 @@ trace - Above + Profiling messages - + Set to full volume - + Volume Máximo - + Set to zero volume - + Ajustar para o volume zero @@ -1077,15 +1099,15 @@ trace - Above + Profiling messages Botão de rolagem reversa (Censurar) - + Headphone listen button Tecla de escuta no auscultador - + Mute button - + Tecla de Silêncio @@ -1094,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Orientação da mistura (ex. esquerda, direita, centro) - + Set mix orientation to left Definir orientação da mixagem à esquerda - + Set mix orientation to center Definir orientação da mixagem para o centro - + Set mix orientation to right Definir orientação da mixagem à direita @@ -1130,12 +1152,12 @@ trace - Above + Profiling messages Increase BPM by 1 - + Aumentar BPM em 1 Decrease BPM by 1 - + Diminuir BPM em 1 @@ -1153,24 +1175,24 @@ trace - Above + Profiling messages Botão de toque do BPM - + Toggle quantize mode Ligar/Desligar modo de quantização - + One-time beat sync (tempo only) - + Sincronização pontual da batida (só tempo) - + One-time beat sync (phase only) - + Sincronização pontual da batida (só fase) - + Toggle keylock mode - + Activar/desactivar o modo de bloqueio @@ -1178,193 +1200,193 @@ trace - Above + Profiling messages Equalizadores - + Vinyl Control - + Controlo Vinilo - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Alternar modo de cue do controle por vinil (OFF/UM/QUENTE) - + Toggle vinyl-control mode (ABS/REL/CONST) Alternar modo de controle por vinil (CONST/ABS/REL) - + Pass through external audio into the internal mixer Atravessa o áudio externo no mixer interno - + Cues - + Pontos de marcação - + Cue button Botão de marca - + Set cue point Definir ponto cue - + Go to cue point Ir ao ponto cue - + Go to cue point and play Ir ao ponto cue e tocar - + Go to cue point and stop Ir ao ponto cue e parar - + Preview from cue point - + Antevisão a partir do ponto de marcação - + Cue button (CDJ mode) Botão Cue (modo CDJ) - + Stutter cue - + Marcação Stutter - + Hotcues - + Hotcues - + Set, preview from or jump to hotcue %1 Definir, escutar de ou pular ao hotcue %1 - + Clear hotcue %1 Apagar hotcue %1 - + Set hotcue %1 - + Definir a Hot Cue %1 - + Jump to hotcue %1 Pular para hotcue %1 - + Jump to hotcue %1 and stop Pular para hotcue %1 e parar - + Jump to hotcue %1 and play Pular para hotcue %1 e jogar - + Preview from hotcue %1 - + Antevisão a partir da Hot Cue %1 - - + + Hotcue %1 - + Hot Cue %1 - + Looping Looping - + Loop In button Botão de entrada em Loop - + Loop Out button - + Tecla de Final de Loop - + Loop Exit button - + Botão de saída de ciclo - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Mover o loop para frente %1 batidas - + Move loop backward by %1 beats Mover o loop para atrás %1 batidas - + Create %1-beat loop - + Criar um loop de %1-batidas - + Create temporary %1-beat loop roll Criar loop temporário de %1 batidas @@ -1376,27 +1398,27 @@ trace - Above + Profiling messages Slot %1 - + Compartimento %1 Headphone Mix - + Mistura do auscultador Headphone Split Cue - + Escuta Dividida no Auscultador Headphone Delay - + Atraso Auscultador Play - + Tocar @@ -1480,27 +1502,27 @@ trace - Above + Profiling messages - - + + Volume Fader Fader de Volume - + Full Volume Volume Máximo - + Zero Volume - + Volume Zero Track Gain - + Ganho da Faixa @@ -1509,9 +1531,9 @@ trace - Above + Profiling messages - + Mute - + Mutar @@ -1520,48 +1542,48 @@ trace - Above + Profiling messages - + Headphone Listen - + Escuta de Auscultador Headphone listen (pfl) button - + Botão de escuta de auscultador (PFL) Repeat Mode - + Modo Repetir Slip Mode - + Modo Escorregar - + Orientation Orientação - + Orient Left - + Orientar Esquerda - + Orient Center - + Orientar Centro - + Orient Right - + Orientação à Direita @@ -1586,12 +1608,12 @@ trace - Above + Profiling messages BPM Tap - + Bater BPM Adjust Beatgrid Faster +.01 - + Ajustar Grelha de Batidas Mais Rápido +.01 @@ -1611,7 +1633,7 @@ trace - Above + Profiling messages Move Beatgrid Earlier - + Mover Grelha de Batidas Cedo @@ -1621,7 +1643,7 @@ trace - Above + Profiling messages Move Beatgrid Later - + Mover Grelha de Batidas Tarde @@ -1629,82 +1651,82 @@ trace - Above + Profiling messages Move a grade de batidas à direita - + Adjust Beatgrid - + Ajustar a grelha ritmica - + Align beatgrid to current position Alinhar a grade de batidas à posição atual - + Adjust Beatgrid - Match Alignment Ajustar a Grade de Batidas - Combinar Alinhamento - + Adjust beatgrid to match another playing deck. - + Ajusta a grelha de batidas para corresponder um outro leitor em reprodução. - + Quantize Mode - + Modo Quantização - + Sync - + Sincronizar - + Beat Sync One-Shot Sincronizar a Batida De Uma Vez - + Sync Tempo One-Shot Sincronizar o Tempo De Uma Vez - + Sync Phase One-Shot Sincronizar a Fase De Uma Vez - + Pitch control (does not affect tempo), center is original pitch Controle do pitch (não afeta o tempo), o centro é o pitch original - + Pitch Adjust Ajustar o Pitch - + Adjust pitch from speed slider pitch Ajusta o pitch do deslizante de velocidade pitch - + Match musical key Igualar tom musical - + Match Key Igualar Tom - + Reset Key Redefinir o Tom - + Resets key to original Redefine o tom para o original @@ -1745,451 +1767,451 @@ trace - Above + Profiling messages EQ de Graves - + Toggle Vinyl Control Ligar/Desligar o Controle por Vinil - + Toggle Vinyl Control (ON/OFF) Alternar o Controle por Vinil (Ligado/Desligado) - + Vinyl Control Mode Modo de Controle por Vinil - + Vinyl Control Cueing Mode Modo de Cue do Controle por Vinil - + Vinyl Control Passthrough Repasse do Controle por Vinil - + Vinyl Control Next Deck Próximo Deck do Controle por Vinil - + Single deck mode - Switch vinyl control to next deck Modo de deck único - Mudar o controle por vinil para o próximo deck - + Cue Cue - + Set Cue Definir Cue - + Go-To Cue Ir Para Cue - + Go-To Cue And Play Ir Para Cue e Tocar - + Go-To Cue And Stop Ir Para Cue e Parar - + Preview Cue Escutar Cue - + Cue (CDJ Mode) - + Cue (Modo CDJ) - + Stutter Cue - + Marcação Stutter - + Go to cue point and play after release Avança até ao Cue Point e toca a faixa após largar o botão. - + Clear Hotcue %1 Limpar Hotcue %1 - + Set Hotcue %1 Definir Hotcue %1 - + Jump To Hotcue %1 Pular Para Hotcue %1 - + Jump To Hotcue %1 And Stop Pular Para Hotcue %1 e Parar - + Jump To Hotcue %1 And Play Pular Para Hotcue %1 e Tocar - + Preview Hotcue %1 Escutar Hotcue %1 - + Loop In Entrada do Loop - + Loop Out Saída do Loop - + Loop Exit - + Saída do Loop - + Reloop/Exit Loop Reloopar/Sair do Loop - + Loop Halve Divide o Loop pela Metade - + Loop Double Dobrar o Loop - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Mover o Loop +%1 Batidas - + Move Loop -%1 Beats Mover o Loop -%1 Batidas - + Loop %1 Beats Loopar %1 Batidas - + Loop Roll %1 Beats Loopar Temporariamente %1 Batidas - + Add to Auto DJ Queue (bottom) Adicionar à fila do Auto DJ (embaixo) - + Append the selected track to the Auto DJ Queue - + Coloca a faixa selecionada no final da fila Auto DJ - + Add to Auto DJ Queue (top) Adicionar à Fila do Auto DJ (em cima) - + Prepend selected track to the Auto DJ Queue Adicionar a faixa selecionada no começo da fila do Auto DJ - + Load Track Carregar Faixa - + Load selected track Carregar faixa selecionada - + Load selected track and play Carregar faixa selecionada e tocar - - + + Record Mix Gravar Mixagem - + Toggle mix recording Ligar/Desligar gravação da mixagem - + Effects Efeitos - + Quick Effects Efeitos Rápidos - + Deck %1 Quick Effect Super Knob Super Botão de Efeito Rápido do Deck %1 - + Quick Effect Super Knob (control linked effect parameters) Super Botão de Efeito Rápido (controla parâmetros de efeito ligados) - - + + Quick Effect Efeito Rápido - + Clear Unit Limpar Unidade - + Clear effect unit Limpar unidade de efeitos - + Toggle Unit Ligar/Desligar Unidade - + Dry/Wet Seco/Molhado - + Adjust the balance between the original (dry) and processed (wet) signal. Define o balançoentre o sinal original (seco) e o processado (molhado). - + Super Knob Super Botão - + Next Chain Próxima Corrente - + Assign Atribuir - + Clear Limpar - + Clear the current effect Limpar o efeito atual - + Toggle Ligar/Desligar - + Toggle the current effect Ligar/Desligar o efeito atual - + Next Próximo - + Switch to next effect Muda para o próximo efeito - + Previous Anterior - + Switch to the previous effect Trocar para o efeito anterior - + Next or Previous - + Próximo ou Anterior - + Switch to either next or previous effect Muda para o efeito seguinte ou anterior - - + + Parameter Value Valor do Parâmetro - - + + Microphone Ducking Strength Força da Redução de Música do Microfone - + Microphone Ducking Mode Modo de Redução de Música do Microfone - + Gain Ganho - + Gain knob Botão de ganho - + Shuffle the content of the Auto DJ queue Reproduzir aleatoriamente o conteúdo da fila Auto DJ - + Skip the next track in the Auto DJ queue Pular a próxima faixa na fila do Auto DJ - + Auto DJ Toggle Ligar/Desligar Auto DJ - + Toggle Auto DJ On/Off Ligar/Desligar Auto DJ - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Mostra ou oculta o mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Maximizar/Restaurar Biblioteca - + Maximize the track library to take up all the available screen space. Maximiza a biblioteca de faixas para ocupar todo o espaço de tela disponível. - + Effect Rack Show/Hide Mostrar/Ocultar Prateleira de Efeitos - + Show/hide the effect rack Mostra/Oculta a prateleira de efeitos - + Waveform Zoom Out Afastar Ondas @@ -2204,102 +2226,102 @@ trace - Above + Profiling messages Ganho do fone - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync Toque para sincronizar o tempo (e fase com a quantização ativada), segure para ativar a sincronização permanente - + One-time beat sync tempo (and phase with quantize enabled) Tempo de sincronização de batida única (e fase com quantização ativada) - + Playback Speed Velocidade da Reprodução - + Playback speed control (Vinyl "Pitch" slider) Controle da velocidade da reprodução (Deslizante de "Pitch" do Vinil) - + Pitch (Musical key) Pitch (Tom musical) - + Increase Speed Aumentar a Velocidade - + Adjust speed faster (coarse) Aumentar a velocidade (grosso) - + Increase Speed (Fine) Aumentar a Velocidade (Fino) - + Adjust speed faster (fine) Aumentar a velocidade (fino) - + Decrease Speed Diminuir a Velocidade - + Adjust speed slower (coarse) Diminuir a velocidade (grosso) - + Adjust speed slower (fine) Diminuir a velocidade (fino) - + Temporarily Increase Speed Temporariamente Aumentar a Velocidade - + Temporarily increase speed (coarse) Temporariamente aumentar a velocidade (grosso) - + Temporarily Increase Speed (Fine) Temporariamente Aumentar a Velocidade (Fino) - + Temporarily increase speed (fine) Temporariamente aumentar a velocidade (fino) - + Temporarily Decrease Speed Temporariamente Diminuir a Velocidade - + Temporarily decrease speed (coarse) Temporariamente diminuir a velocidade (grosso) - + Temporarily Decrease Speed (Fine) Temporariamente Diminuir a Velocidade (Fino) - + Temporarily decrease speed (fine) Temporariamente diminuir a velocidade (fino) @@ -2322,7 +2344,7 @@ trace - Above + Profiling messages Skin - + Skin @@ -2451,1053 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Velocidade - + Decrease Speed (Fine) Diminuir velocidade (Fino) - + Pitch (Musical Key) Pitch (Tom musical) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock Trava de Tom - + CUP (Cue + Play) CUP (Cue + Play, ou seja Cue + Toca a faixa) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats Loop de Batidas Selecionadas - + Create a beat loop of selected beat size Criar um loop de batida do tamanho de batida selecionada - + Loop Roll Selected Beats Batidas Selecionadas da Lista de Loop - + Create a rolling beat loop of selected beat size Crie um loop de batida contínua do tamanho de batida selecionada - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In Ir para Loop In - + Go to Loop In button Botão de Ir para o Início do Loop - + Go To Loop Out Ir para o Fim do Loop - + Go to Loop Out button Botão de Ir para o Fim do Loop - + Toggle loop on/off and jump to Loop In point if loop is behind play position Ative/desative a alternância do loop e pule para o ponto Loop In se o loop estiver atrás da posição de reprodução - + Reloop And Stop - + Reloop e Parar - + Enable loop, jump to Loop In point, and stop Ative o loop, pule para o ponto Loop In e pare - + Halve the loop length Reduzir o loop pela metade - + Double the loop length Dobrar o tamanho do loop atual - + Beat Jump / Loop Move Pular batidas e mover loops - + Jump / Move Loop Forward %1 Beats Mover o loop para frente %1 batidas - + Jump / Move Loop Backward %1 Beats Mover o loop para atrás %1 batidas - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Saltar para a frente %1 batidas, ou se o loop estiver ativado, mover o loop para a frente %1 batidas - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Saltar para trás %1 batidas, ou se o loop estiver ativado, mover o loop para trás %1 batidas - + Beat Jump / Loop Move Forward Selected Beats - + Saltar Batidas / Mover Loop Frente Batidas Selecionadas - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Saltar para a frente do número de batidas selecionadas, ou se o loop estiver ativado, mover o loop para a frente o número de batidas selecionadas - + Beat Jump / Loop Move Backward Selected Beats - + Saltar Batida / Mover Loop Atraso Batidas Selecionadas - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Saltar para trás o número de batidas selecionadas, ou se o loop estiver ativado, mover o loop para trás o número de batidas selecionadas - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navegação - + Move up Mover acima - + Equivalent to pressing the UP key on the keyboard Equivalente a pressionar a SETA ACIMA no teclado - + Move down Mover abaixo - + Equivalent to pressing the DOWN key on the keyboard Equivalente a pressionar a SETA ABAIXO no teclado - + Move up/down Mover acima/abaixo - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Move verticalmente em uma das direções usando um botão, como se pressionasse as teclas ACIMA/ABAIXO - + Scroll Up Rolar acima - + Equivalent to pressing the PAGE UP key on the keyboard Equivalente a pressionar a tecla PAGE UP no teclado - + Scroll Down Rolar abaixo - + Equivalent to pressing the PAGE DOWN key on the keyboard Equivalente a pressionar a tecla PAGE DOWN no teclado - + Scroll up/down Rolar acima/abaixo - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Rolar verticalmente em uma das direções usando um botão, como se pressionasse as teclas PAGE UP/PAGE DOWN - + Move left Mover à esquerda - + Equivalent to pressing the LEFT key on the keyboard Equivalente a pressionar a SETA À ESQUERDA no teclado - + Move right Mover à direita - + Equivalent to pressing the RIGHT key on the keyboard Equivalente a pressionar a SETA À DIREITA no teclado - + Move left/right Mover à esquerda/direita - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Mova horizontalmente em uma das direções usando um botão, como ao pressionar as teclas ESQUERDA/DIREITA - + Move focus to right pane Move o foco ao painel da direita - + Equivalent to pressing the TAB key on the keyboard Equivalente a pressionar a tecla TAB no teclado - + Move focus to left pane Move o foco ao painel da esquerda - + Equivalent to pressing the SHIFT+TAB key on the keyboard Equivalente a pressionar SHIFT+TAB no teclado - + Move focus to right/left pane Move o foco ao painel da direita/esquerda - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Move o foco um painel à direita ou esquerda usando um botão, como se pressionasse TAB/SHIFT-TAB - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Ir para o item seleccionado correntemente - + Choose the currently selected item and advance forward one pane if appropriate - + Escolher o item seleccionado correntemente e avançar um para a frente - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Adicionar à Fila Auto DJ (Substituir) - + Replace Auto DJ Queue with selected tracks - + Substituir Fila Auto DJ com as faixas selecionadas - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Botão de Ativar Efeito Rápido no Leitor %1 - + Quick Effect Enable Button - + Botão de Ativar Efeito Rápido - + Enable or disable effect processing Ativar ou desativar processamento de efeitos - + Super Knob (control effects' Meta Knobs) - + Super Botão (controla os efeitos dos Meta Botões) - + Mix Mode Toggle - + Alternar Modo Mistura - + Toggle effect unit between D/W and D+W modes - + Alternar unidade de efeito entre os modos S/M e S+M - + Next chain preset Próxima prédefinição de corrente - + Previous Chain Corrente Anterior - + Previous chain preset Prédefinição de corrente anterior - + Next/Previous Chain Corrente Seguinte/Anterior - + Next or previous chain preset Prédefinição da corrente seguinte ou anterior - - + + Show Effect Parameters Mostrar Parâmetros do Efeito - + Effect Unit Assignment - + Meta Knob Botão Meta - + Effect Meta Knob (control linked effect parameters) - + Meta Botão Efeitos (controla os parâmetros dos efeitos a que está ligado) - + Meta Knob Mode - + Modo Meta Botão - + Set how linked effect parameters change when turning the Meta Knob. - + Define como mudam os efeitos a que está ligado, quando se roda o Meta Botão. - + Meta Knob Mode Invert - + Inverter Modo Meta Botão - + Invert how linked effect parameters change when turning the Meta Knob. - + Inverter como mudam os efeitos a que está ligado, quando se roda o Meta Botão. - - + + Button Parameter Value - + Microphone / Auxiliary Microfone / Auxiliar - + Microphone On/Off Ligar/Desligar Microfone - + Microphone on/off Microfone ligado/desligado - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Alternar entre modos de redução de música do microfone (DESLIGADO, AUTOMÁTICO, MANUAL) - + Auxiliary On/Off Ligar/Desligar Auxiliar - + Auxiliary on/off Ligar/Desligar Auxiliar - + Auto DJ Auto DJ - + Auto DJ Shuffle Embaralhar o Auto DJ - + Auto DJ Skip Next Pular a Próxima no Auto DJ - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Trocar Para a Próxima no Auto DJ - + Trigger the transition to the next track Inicia a transição para a próxima música - + User Interface Interface do Usuário - + Samplers Show/Hide Mostrar/Ocultar Samplers - + Show/hide the sampler section Mostrar/Ocultar a seção dos samplers - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. Transmite sua mixagem pela Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Mostrar/Ocultar Controle por Vinil - + Show/hide the vinyl control section Mostrar/Ocultar a seção controle por vinil - + Preview Deck Show/Hide Mostrar/Ocultar Deck de Pré-escuta - + Show/hide the preview deck Mostrar/Ocultar o deck de pré-escuta - + Toggle 4 Decks Ligar/Desligar 4 Decks - + Switches between showing 2 decks and 4 decks. Troca entre a visualização de 2 decks e 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Mostrar/Ocultar Vinil Giratório - + Show/hide spinning vinyl widget Mostrar/Ocultar a janela do vinil giratório - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Mostrar/esconder as ondas. - + Waveform zoom Aproximação das ondas - + Waveform Zoom Aproximação das Ondas - + Zoom waveform in Aproximar ondas - + Waveform Zoom In Aproximar Ondas - + Zoom waveform out - + Reduzir a forma de onda - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3515,7 +3547,7 @@ trace - Above + Profiling messages Channel - + Canal @@ -3612,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Tente recuperar reiniciando seu controlador. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. O código do script precisa ser corrigido. @@ -3745,7 +3777,7 @@ trace - Above + Profiling messages Importar Caixa - + Export Crate Exportar Caixa @@ -3755,7 +3787,7 @@ trace - Above + Profiling messages Destravar - + An unknown error occurred while creating crate: Ocorreu um erro desconhecido durante a criação do caixa: @@ -3764,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate Renomear Caixa - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3787,17 +3813,17 @@ trace - Above + Profiling messages Falha ao Renomear Caixa - + Crate Creation Failed Criação da Caixa Falhou - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de Reprodução M3U (*.m3u);;Lista de Reprodução M3U8 (*.m3u8);;Lista de Reprodução PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) - + M3U Playlist (*.m3u) Lista de Reprodução M3U (*.m3u) @@ -3806,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Uma ótima maneira para ajudar você a organizar as músicas que você quer tocar é a de colocar elas em caixas. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3917,12 +3949,12 @@ trace - Above + Profiling messages Contribuidores Anteriores - + Official Website - + Donate @@ -3970,7 +4002,7 @@ trace - Above + Profiling messages License - + Licença @@ -4098,7 +4130,7 @@ Shortcut: Shift+F9 Determines the duration of the transition - + Determina a duração da transição. @@ -4194,7 +4226,7 @@ crossfader, so that the intro starts at full volume. Displays the duration and number of selected tracks. - + Mostra a duração e número de faixas selecionadas. @@ -4213,7 +4245,8 @@ crossfader, so that the intro starts at full volume. Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. - + Adiciona uma faixa aleatoriamente das fontes de faixas (caixas) à fila Auto DJ. +Se não estão configuradas fontes de faixas, então a faixa é adicionada da biblioteca. @@ -4256,7 +4289,9 @@ This can speed up beat detection on slower computers but may result in lower qua Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Converte batidas detectada pelo analisador em uma grade de batidas de tempo fixo. +Use esta configuração se suas faixas tem um tempo constante (como a maioria das músicas eletrônicas). +Frequentemente resulta em grades de batida de melhor qualidade, e não funciona direito em faixas que tem mudanças de tempo. @@ -4434,42 +4469,45 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Se o mapeamento não está funcionando, tente ativar uma opção avançada abaixo e tente o controle de novo. Ou clique Tentar de Novo para redetectar o controle MIDI. - + Didn't get any midi messages. Please try again. Não recebi nenhuma mensagem MIDI. Por favor tente de novo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Não foi possível detectar o mapeamento -- por favor tente de novo. Esteja certo de mexer apenas um controle de cada vez. - + Successfully mapped control: Controle mapeado com sucesso: - + <i>Ready to learn %1</i> <i>Pronto para aprender %1</i> - + Learning: %1. Now move a control on your controller. Aprendendo: %1. Agora mova o controle em seu controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. You tried to learn: %1,%2 - + O controle que você clicou no Mixxx não pode ser mapeado. +Isso pode ser porque você está usando um tema antigo e esse controle não é mais suportado, ou você clicou em um controle que provê feedback visual e só pode ser mapeado em saídas como LEDs por meio de scripts. + +Você tentou mapear: %1,%2 @@ -4503,17 +4541,17 @@ You tried to learn: %1,%2 Despeja para csv - + Log Log - + Search Pesquisa - + Stats Dados @@ -4779,28 +4817,28 @@ You tried to learn: %1,%2 You can't create more than %1 source connections. - + Não pode criar mais de %1 ligações fonte. Source connection %1 - + Ligação fonte %1 At least one source connection is required. - + É necessária pelo menos uma ligação fonte. Are you sure you want to disconnect every active source connection? - + Tem a certeza que quer desligar todas as ligações fonte ativas? Confirmation required - + Confirmação necessária @@ -4811,7 +4849,7 @@ Two source connections to the same server that have the same mountpoint can not Are you sure you want to delete '%1'? - + Tem a certeza que quer apagar '%1'? @@ -4821,12 +4859,12 @@ Two source connections to the same server that have the same mountpoint can not New name for '%1': - + Novo nome para '%1': Can't rename '%1' to '%2': name already in use - + Não pode renomear '%1' para '%2': nome já em uso @@ -4864,37 +4902,37 @@ Two source connections to the same server that have the same mountpoint can not Live Broadcasting source connections - + Conexões para Transmissão Ao Vivo Delete selected - + Apagar selecionadas Create new connection - + Criar nova ligação Rename selected - + Renomear selecionadas Disconnect all - + Desligar todas Turn on Live Broadcasting when applying these settings - + Iniciar transmissão ao vivo quando aplicar estas configurações Settings for %1 - + Definições para %1 @@ -4909,7 +4947,7 @@ Two source connections to the same server that have the same mountpoint can not AIM - + AIM @@ -4929,12 +4967,12 @@ Two source connections to the same server that have the same mountpoint can not Select a source connection above to edit its settings here - + Selecionar uma ligação fonte acima para editar as suas definições aqui Password storage - + Armazenamento Palavra Passe @@ -4944,7 +4982,7 @@ Two source connections to the same server that have the same mountpoint can not Secure storage (OS keychain) - + Armazenamento seguro (Porta chaves do SO) @@ -4995,12 +5033,12 @@ Two source connections to the same server that have the same mountpoint can not Host - + Host Login - + Login @@ -5100,7 +5138,7 @@ Two source connections to the same server that have the same mountpoint can not By hotcue number - + Por número do hotcue @@ -5134,7 +5172,7 @@ Two source connections to the same server that have the same mountpoint can not Hotcue palette - + Paleta de hotcue @@ -5166,114 +5204,114 @@ associated with each key. DlgPrefController - + Apply device settings? Aplicar configurações dos dispositivos? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Suas configurações devem ser aplicadas antes de começar o assistente de configuração. Aplicar as configurações e continuar? - + None Nenhuma - + %1 by %2 %1 por %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Solução de Problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Limpar Mapeamentos de Entrada - + Are you sure you want to clear all input mappings? Tem certeza de que deseja limpar todos os mapeamentos de entrada? - + Clear Output Mappings Limpar Mapeamentos de Saída - + Are you sure you want to clear all output mappings? Tem certeza de que deseja limpar todos os mapeamentos de saída? @@ -5291,100 +5329,100 @@ Aplicar as configurações e continuar? Ativada - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Descrição: - + Support: Compatível: - + Screens preview - + Input Mappings Mapeamento de Entrada - - + + Search Pesquisa - - + + Add Adicionar - - + + Remove Remover @@ -5404,17 +5442,17 @@ Aplicar as configurações e continuar? - + Mapping Info - + Author: - + Autor: - + Name: Nome: @@ -5424,28 +5462,28 @@ Aplicar as configurações e continuar? Assistente de Configuração (Somente MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Limpar Tudo - + Output Mappings Mapeamento de Saída @@ -5532,7 +5570,7 @@ Aplicar as configurações e continuar? Skin - + Skin @@ -5604,6 +5642,16 @@ Aplicar as configurações e continuar? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5773,7 +5821,7 @@ Aplicar as configurações e continuar? Deck Preferences - + Preferências Leitor @@ -5850,7 +5898,7 @@ Modo CUP: Time Format - + Formato de tempo @@ -5864,7 +5912,11 @@ it will place it at the main cue point if the main cue point has been set previo This may be helpful for upgrading to Mixxx 2.3 from earlier versions. If this option is disabled, the intro start point is automatically placed at the first sound. - + Quando o analisador coloca automaticamente o ponto de início da introdução, +ele coloca-o no ponto de referência principal se o ponto de referência principal tiver sido definido anteriormente. +Isso pode ser útil para atualizar para o Mixxx 2.3 de versões anteriores. + +Se essa opção estiver desativada, o ponto de início da introdução é colocado automaticamente no primeiro som. @@ -5874,7 +5926,7 @@ If this option is disabled, the intro start point is automatically placed at the Track load point - + Ponto de carga de rastreamento @@ -5895,7 +5947,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Double-press Load button to clone playing track - + Pressione Carregar duas vezes para clonar uma faixa que está tocando @@ -6173,12 +6225,12 @@ You can always drag-and-drop tracks on screen to clone a deck. Keep metaknob position - + Manter posição do metabotão Reset metaknob to effect default - + Reinicia metabotão para efeito padrão @@ -6214,62 +6266,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. O tamanho mínimo da skin selecionada é maior do que a sua resolução de tela. - + Allow screensaver to run Permitir que o protetor de tela execute - + Prevent screensaver from running Prevenir que o protetor de tela execute - + Prevent screensaver while playing Prevenir o protetor de tela quando tocando - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Esta skin não suporta esquemas de cor - + Information Informação - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -6350,7 +6402,7 @@ and allows you to pitch adjust them for harmonic mixing. OpenKey - + OpenKey @@ -6782,12 +6834,12 @@ and allows you to pitch adjust them for harmonic mixing. Edit metadata after clicking selected track - + Editar metadados após clicar faixa seleccionada Search-as-you-type timeout: - + Tempo limite de procura ao escrever: @@ -6895,7 +6947,7 @@ and allows you to pitch adjust them for harmonic mixing. Scratching - + Scratching @@ -7213,7 +7265,7 @@ and allows you to pitch adjust them for harmonic mixing. Recordings directory invalid - + Diretório de gravações inválido @@ -7436,173 +7488,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Padrão (atraso longo) - + Experimental (no delay) Experimental (sem atraso) - + Disabled (short delay) Desativada (atraso curto) - + Soundcard Clock Relógio da Placa de Som - + Network Clock - + Relógio da Rede - + Direct monitor (recording and broadcasting only) - + Monição direta (apenas gravação e emissão) - + Disabled Desativado - + Enabled Ativada - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) auto (<= 1024 quadros/período) - + 2048 frames/period 2048 quadros/período - + 4096 frames/period 4096 quadros/período - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + As entradas de microfone estão fora de tempo no sinal gravar e emitir comparado com o que ouve. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - - + Refer to the Mixxx User Manual for details. - + Consulte o Manual do Utilizador do Mixxx para detalhes. - + Configured latency has changed. - + A latência configurada foi alterada. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Volta a medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - + Realtime scheduling is enabled. O agendamento em tempo real está ativado. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Erro de configuração @@ -7620,131 +7671,131 @@ The loudness target is approximate and assumes track pregain and main output lev API de Som - + Sample Rate Taxa de Amostragem - + Audio Buffer Buffer de Áudio - + Engine Clock - + Relógio Motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Use o relógio da placa de som para montagens com audiência ao vivo e a menor latência.<br>Use o relógio de rede para emissões sem audiência ao vivo. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Modo Monição Microfone - + Microphone Latency Compensation - + Compensação da Latência do Microfone - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contagem de Esvaziamentos do Buffer - + 0 0 - + Keylock/Pitch-Bending Engine Mecanismo da Trava de Tom/Pitch-Bending - + Multi-Soundcard Synchronization Sincronização de Múltiplas Placas de Som - + Output Saída - + Input Entrada - + System Reported Latency Latência Relatada pelo Sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente o buffer de áudio se o contador de esvaziamentos aumentar ou se você ouvir estouros na reprodução. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Dicas e Diagnóstico - + Downsize your audio buffer to improve Mixxx's responsiveness. Diminua o buffer de áudio para melhorar a capacidade de resposta do Mixxx. - + Query Devices Buscar Dispositivos @@ -7813,7 +7864,7 @@ The loudness target is approximate and assumes track pregain and main output lev Vinyl Type - + Tipo do Vinil @@ -8052,7 +8103,8 @@ The loudness target is approximate and assumes track pregain and main output lev The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + A forma de onda mostra o envoltório da onda na faixa inteira. +Selecione entre tipos diferentes de visualizações da forma de onda, o que difere principalmente no nível de detalhe mostrado na forma de onda. @@ -8063,12 +8115,13 @@ Select from different types of displays for the waveform overview, which differ The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - + A forma de onda mostra o envoltório da onda na faixa junto à posição corrente de leitura. +Selecione entre tipos diferentes de visualizações da forma de onda, o que difere principalmente no nível de detalhe mostrado na forma de onda. fps - + fps @@ -8138,7 +8191,7 @@ Select from different types of displays for the waveform, which differ primarily Beat grid opacity - + Opacidade da grelha de batidas @@ -8159,7 +8212,7 @@ Select from different types of displays for the waveform, which differ primarily Set amount of opacity on beat grid lines. - + Define a quantidade de opacidade das linhas da grelha de batida. @@ -8169,12 +8222,12 @@ Select from different types of displays for the waveform, which differ primarily Play marker position - + Marcador da posição de reprodução Moves the play marker position on the waveforms to the left, right or center (default). - + Move o marcador da posição de reprodução nas formas de onda para a esquerda, direita ou centro (padrão). @@ -8190,47 +8243,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Hardware de Som - + Controllers Controladores - + Library Biblioteca - + Interface Interface - + Waveforms Ondas - + Mixer - + Mixer - + Auto DJ - + Auto DJ - + Decks - + Leitores - + Colors @@ -8262,50 +8315,50 @@ Select from different types of displays for the waveform, which differ primarily &Ok Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - + &Ok - + Effects Efeitos - + Recording Gravação - + Beat Detection Detecção de Batida - + Key Detection Detecção de Tom - + Normalization Normalização - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Controle por Vinil - + Live Broadcasting Transmissão Ao Vivo - + Modplug Decoder Decodificador do Modplug @@ -8326,7 +8379,7 @@ Select from different types of displays for the waveform, which differ primarily TextLabel - + TextLabel @@ -8390,7 +8443,7 @@ Select from different types of displays for the waveform, which differ primarily Current cue color - + Cor da pista atual @@ -8661,284 +8714,284 @@ This can not be undone! Resumo - + Filetype: Tipo de arquivo: - + BPM: BPM: - + Location: Localização: - + Bitrate: Taxa de bits: - + Comments Comentários - + BPM BPM - + Sets the BPM to 75% of the current value. Define o BPM para 75% do valor atual. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Define o BPM para 50% do valor atual. - + Displays the BPM of the selected track. Exibe o BPM da faixa selecionada. - + Track # Faixa # - + Album Artist Artista do Álbum - + Composer Compositor - + Title Título - + Grouping Agrupamento - + Key Tom - + Year Ano - + Artist Artista - + Album Álbum - + Genre Gênero - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. Define o BPM para 200% do valor atual. - + Double BPM Dobrar o BPM - + Halve BPM Diminuir o BPM pela metade - + Clear BPM and Beatgrid Limpar BPM e Grade de Batidas - + Move to the previous item. "Previous" button Mover para o item anterior. - + &Previous &Anterior - + Move to the next item. "Next" button Move para o próximo item. - + &Next &Próximo - + Duration: Duração: - + Import Metadata from MusicBrainz - + Importar Metadados de MusicBrainz - + Re-Import Metadata from file - + Color cor - + Date added: - + Open in File Browser Abrir no Navegador de Arquivos - + Samplerate: - + Track BPM: BPM da Faixa: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo Assumir tempo constante - + Sets the BPM to 66% of the current value. Define o BPM para 66% do valor atual. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. Define o BPM para 150% do valor atual. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. Define o BPM para 133% do valor atual. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Pressione de acordo com a batida para definir o BPM para velocidade que você está tocando. - + Tap to Beat Toque a Batida - + Hint: Use the Library Analyze view to run BPM detection. Dica: Use a seção Analise a Biblioteca para executar a detecção de BPM. - + Save changes and close the window. "OK" button Salva as alterações e fechar a janela. - + &OK &OK - + Discard changes and close the window. "Cancel" button Descartar as alterações e fechar a janela. - + Save changes and keep the window open. "Apply" button Salvar as alterações e deixar a janela aberta. - + &Apply &Aplicar - + &Cancel &Cancelar - + (no color) @@ -9095,7 +9148,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9297,27 +9350,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (mais rápido) - + Rubberband (better) Rubberband (melhor) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9532,15 +9585,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Seguro Ativado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9548,60 +9601,61 @@ support. ---------- Shown when VuMeter can not be displayed. Please keep unchanged - + Sem suporte +OpenGL - + activate ativar - + toggle alternar - + right direito - + left esquerdo - + right small direito pequeno - + left small esquerdo pequeno - + up acima - + down abaixo - + up small acima pequeno - + down small abaixo pequeno - + Shortcut Atalho @@ -9609,62 +9663,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9674,22 +9728,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importar Lista de Reprodução - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Arquivos de Lista de Reprodução (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9736,27 +9790,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) não encontrado(s) - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Alguns LEDs ou outros retornos podem não funcionar corretamente. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Marcar para ver se os nomes dos MixxxControl estão escritos corretamente no arquivo de mapeamento (.xml) @@ -9816,18 +9870,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Faixas Faltando - + Hidden Tracks - + Músicas Ocultadas - Export to Engine Prime + Export to Engine DJ @@ -9839,210 +9893,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Dispositivo de Som Ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Tentar novamente</b> após fechar a outra aplicação ou reconectar um dispositivo de som - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurar</b> as configurações de dispositivos de som do Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obter <b>Ajuda</b> na Wiki do Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Sair<b> do Mixxx. - + Retry Repetir - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigurar - + Help Ajuda - - + + Exit Sair - - + + Mixxx was unable to open all the configured sound devices. Mixxx não foi capaz de abrir todos os dispositivos de som configurados. - + Sound Device Error Erro com o Dispositivo de Som - + <b>Retry</b> after fixing an issue <b>Tentar novamente</b> depois de corrigir um problema - + No Output Devices Sem Dispositivos de Saída - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. O Mixxx foi configurado sem nenhum dispositivo de saída de som. O processamento de áudio será desativado sem um dispositivo de saída configurado. - + <b>Continue</b> without any outputs. <b>Continuar</b> sem nenhuma saída. - + Continue Continuar - + Load track to Deck %1 Carregar faixa no Deck %1 - + Deck %1 is currently playing a track. O deck %1 está tocando uma faixa neste momento. - + Are you sure you want to load a new track? Tem certeza de que deseja carregar uma nova faixa? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Não há nenhum dispositivo de entrada selecionado para o controle por vinil. Por favor, selecione um dispositivo de entrada nas preferências do hardware de som. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Não tem nenhum dispositivo de entrada selecionado para este controle atravessador. Por favor selecione um dispositivo de entrada nas preferências do hardware de som primeiro. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Erro no arquivo de skin - + The selected skin cannot be loaded. A skin selecionada não pôde ser carregada. - + OpenGL Direct Rendering Renderização Direta OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar a Saída - + A deck is currently playing. Exit Mixxx? - + Um leitor está presentemente em reprodução. Sair do Mixxx? - + A sampler is currently playing. Exit Mixxx? Um sampler está tocando neste momento. Sair do Mixxx? - + The preferences window is still open. A janela de preferências ainda está aberta. - + Discard any changes and exit Mixxx? Descartar quaisquer mudanças e sair do Mixxx? @@ -10058,13 +10153,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Travar - - + + Playlists Listas de Reprodução @@ -10074,32 +10169,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Destravar - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJs constroem listas de reprodução antes de apresentações ao vivo, mas outros preferem construí-las na hora. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Ao utilizar uma lista de reprodução durante uma apresentação ao vivo, lembre-se de sempre prestar atenção em como o público reage à música que você escolheu tocar. - + Create New Playlist Criar Nova Lista de Reprodução @@ -10326,7 +10447,7 @@ Você quer examinar a sua biblioteca procurando por arquivos de capa agora? Switch - + Comutador @@ -10351,7 +10472,7 @@ Você quer examinar a sua biblioteca procurando por arquivos de capa agora? Script - + Script @@ -10371,12 +10492,12 @@ Você quer examinar a sua biblioteca procurando por arquivos de capa agora? Booth - + Cabine Headphones - + Fones @@ -10401,17 +10522,17 @@ Você quer examinar a sua biblioteca procurando por arquivos de capa agora? Deck - + Leitor Record/Broadcast - + Gravar/Emitir Vinyl Control - + Controlo Vinilo @@ -10487,12 +10608,12 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Adds noise by the reducing the bit depth and sample rate - + Adiciona ruído pela redução da Profundidade de Bit e taxa de amostragem The bit depth of the samples - + A profundidade de bit das amostras @@ -10507,7 +10628,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx The sample rate to which the signal is downsampled - + A taxa de amostragem para a qual este sinal será reduzida @@ -10521,13 +10642,13 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Time - + Tempo Ping Pong - + Pingue Pongue @@ -10553,7 +10674,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Stores the input signal in a temporary buffer and outputs it after a short time - + Guarda o sinal de entrada num buffer temporário e fá-lo sair após um pequeno tempo. @@ -10561,7 +10682,9 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Delay time 1/8 - 2 beats if tempo is detected 1/8 - 2 seconds if no tempo is detected - + Tempo de atraso +1/8 - 2 batidas se o BPM tiver sido detetado +1/8 - 2 segundos se o BPM não tiver sido detetado @@ -10571,7 +10694,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx How much the echoed sound bounces between the left and right sides of the stereo field - + Quanto do sinal ecoado ressalta entre os os lados esquerdo e direito do campo estéreo @@ -10586,7 +10709,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Round the Time parameter to the nearest 1/4 beat. - + Arredonda o parâmetro Tempo para o 1/4 de batida mais próxima. @@ -10599,12 +10722,12 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Triplets - + Triplets When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - + Quando o parâmetro Quantização está ativo, divide o parâmetro Tempo arredondado a 1/4 de batida, por 3. @@ -10615,12 +10738,12 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Allows only high or low frequencies to play. - + Permite tocar apenas as altas ou baixas frequências. Low Pass Filter Cutoff - + Corte Filtro Passa Baixo @@ -10643,12 +10766,13 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Resonance of the filters Default: flat top - + Ressonancia dos filtros +Padrão: Topo plano High Pass Filter Cutoff - + Corte Filtro Passa Alto @@ -10680,7 +10804,7 @@ Default: flat top Speed - + Velocidade @@ -10691,58 +10815,61 @@ Default: flat top Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - + Mistura a entrada com uma cópia de si mesma, atrasada e modulada em tonalidade para criar uma filtragem pente Speed of the LFO (low frequency oscillator) 32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected 1/32 - 4 Hz if no tempo is detected - + Velocidade do LFO (oscilador de baixa frequência) +32 - 1/4 batidas arredondadas para 1/2 batida por ciclo LFO se o BPM tiver sido detetado +1/32 - 4 Hz se o BPM não tiver sido detetado Delay amplitude of the LFO (low frequency oscillator) - + Amplitude do atraso do LFO (oscilador de baixa frequência). Delay offset of the LFO (low frequency oscillator). With width at zero, this allows for manually sweeping over the entire delay range. - + Alinhamento do atraso do LFO (oscilador de baixa frequência). +Com a largura a zero, permite o varrimento manual ao longo de toda a extensão do atraso. Regeneration - + Regeneração Regen - + Regen How much of the delay output is feed back into the input - + Quantidade da saída atrasada que é retornada para a entrada Intensity of the effect - + Intensidade do efeito Divide rounded 1/2 beats of the Period parameter by 3. - + Divide o parâmetro Período, arredondado a 1/2 batidas, por 3. Mix - + Mistura @@ -10757,7 +10884,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Metronome - + Metrónomo @@ -10767,7 +10894,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Adds a metronome click sound to the stream - + Adiciona o som dum clique de metrónomo à stream @@ -10777,7 +10904,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Set the beats per minute value of the click sound - + Define o valor do bpm do som do clique @@ -10787,7 +10914,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Synchronizes the BPM with the track if it can be retrieved - + Sincroniza o BPM com a faixa, se este puder ser obtido @@ -10816,14 +10943,16 @@ With width at zero, this allows for manually sweeping over the entire delay rang Bounce the sound left and right across the stereo field - + Balança o som entre a esquerda e direita ao longo do campo estéreo How fast the sound goes from one side to another 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Velocidade com que o sinal vai dum lado para o outro +1/4 - 4 batidas arredondado para 1/2 batidas se o BPM tiver sido detetado +1/4 - 4 segundos se o BPM não tiver sido detetado @@ -10838,12 +10967,12 @@ With width at zero, this allows for manually sweeping over the entire delay rang How smoothly the signal goes from one side to the other - + Suavidade com que o sinal vai de um lado para o outro How far the signal goes to each side - + Até onde o sinal vai em cada lado @@ -10853,7 +10982,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Emulates the sound of the signal bouncing off the walls of a room - + Simula o som do sinal sendo refletido nas paredes duma sala @@ -10864,18 +10993,19 @@ With width at zero, this allows for manually sweeping over the entire delay rang Lower decay values cause reverberations to fade out more quickly. - + Valores de declínio baixos causam o desvanecimento das reverberações mais rápido. Bandwidth of the low pass filter at the input. Higher values result in less attenuation of high frequencies. - + Largura de banda do filtro passa baixo na entrada. +Valores mais altos resultam em menos atenuação das altas frequências. How much of the signal to send in to the effect - + Quantidade do sinal a enviar para o efeito @@ -11065,14 +11195,16 @@ Higher values result in less attenuation of high frequencies. Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - + Mistura o sinal de entrada com uma cópia passada através de uma série de filtros para criar uma filtragem em pente Period of the LFO (low frequency oscillator) 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Período do LFO (oscilador de baixa frequência) +1/4 - 4 batidas arrendondadas a 1/2 batida se o BPM tiver sido detetado +1/4 - 4 segundos se o BPM não tiver sido detetado @@ -11095,12 +11227,12 @@ Higher values result in less attenuation of high frequencies. Number of stages - + Número de estágios Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - + Define os LFOs (osciladores de baixa frequência) para os canais esquerdo e direito, desfasados uns com os outros @@ -11170,7 +11302,7 @@ Higher values result in less attenuation of high frequencies. LinkwitzRiley8 Isolator - + Isolador LinkwitzRiley8 @@ -11185,12 +11317,12 @@ Higher values result in less attenuation of high frequencies. Biquad Equalizer - + Equalizador Biquad BQ EQ - + EQ BQ @@ -11205,12 +11337,12 @@ Higher values result in less attenuation of high frequencies. Biquad Full Kill Equalizer - + Equalizador Biquado Full Kill BQ EQ/ISO - + EQ/ISO BQ @@ -11299,33 +11431,33 @@ Higher values result in less attenuation of high frequencies. Adjust the left/right balance and stereo width - + Ajusta o balanço esquerdo/direito e a largura estéreo Adjust balance between left and right channels - + Ajusta o balanço entre os canais esquerdo e direito Mid/Side - + Centro/Lado Bypass Fr. - + Ignorar Fr. Bypass Frequency - + Ignorar Frequência Stereo Balance - + Balanço Estéreo @@ -11333,22 +11465,25 @@ Higher values result in less attenuation of high frequencies. Fully left: mono Fully right: only side ambiance Center: does not change the original signal. - + Ajusta a largura estéreo mudando o balanço entre o meio e o lado do canal. +Totalmente à esquerda: mono +Totalmente à direita: apenas ambiente do lado +Centro: não muda o sinal original. Frequencies below this cutoff are not adjusted in the stereo field - + As frequências abaixo deste ponto de corte não são ajustadas no campo estéreo Parametric Equalizer - + Equalizador Paramétrico Param EQ - + EQ Param @@ -11360,71 +11495,75 @@ It is designed as a complement to the steep mixing equalizers. Gain 1 - + Ganho 1 Gain for Filter 1 - + Ganho para o Filtro 1 Q 1 - + Q 1 Controls the bandwidth of Filter 1. A lower Q affects a wider band of frequencies, a higher Q affects a narrower band of frequencies. - + Controla a largura de banda do Filtro 1. +Um Q mais baixo afecta uma banda mais larga de frequências, +um Q mais alto afecta uma banda mais estreita de frequências. Center 1 - + Centro 1 Center frequency for Filter 1, from 100 Hz to 14 kHz - + Frequência central para o Filtro 1, de 100 Hz a 14 kHz Gain 2 - + Ganho 2 Gain for Filter 2 - + Ganho para o Filtro 2 Q 2 - + Q 2 Controls the bandwidth of Filter 2. A lower Q affects a wider band of frequencies, a higher Q affects a narrower band of frequencies. - + Controla a largura de banda do Filtro 2. +Um Q mais baixo afecta uma banda mais larga de frequências, +um Q mais alto afecta uma banda mais estreita de frequências. Center 2 - + Centro 2 Center frequency for Filter 2, from 100 Hz to 14 kHz - + Frequência central para o Filtro 2, de 100 Hz a 14 kHz @@ -11435,12 +11574,12 @@ a higher Q affects a narrower band of frequencies. Cycles the volume up and down - + Sobe e desce o volume num ciclo How much the effect changes the volume - + Até que ponto o efeito altera o volume @@ -11453,54 +11592,61 @@ a higher Q affects a narrower band of frequencies. Rate of the volume changes 4 beats - 1/8 beat if tempo is detected 1/4 Hz - 8 Hz if no tempo is detected - + Taxa das alterações do volume +4 batidas - 1/8 batida se o BPM tiver sido detetado +1/4 Hz - 8 Hz se o BPM não tiver sido detetado Width of the volume peak 10% - 90% of the effect period - + Largura do pico de volume +10% - 90% do período do efeito Shape of the volume modulation wave Fully left: Square wave Fully right: Sine wave - + Forma da onda de modulação do volume +Tudo esquerda: Onda quadrada +Tudo direita: Onda sinusoidal When the Quantize parameter is enabled, divide the effect period by 3. - + Quando o parâmetro Quantização está ativo, divide o período do efeito por 3. Waveform - + Forma de Onda Phase - + Fase Shifts the position of the volume peak within the period Fully left: beginning of the effect period Fully right: end of the effect period - + Desloca a posição do pico de volume dentro do período +Tudo esquerda: início do período do efeito +Tudo direita: fim do período do efeito Round the Rate parameter to the nearest whole division of a beat. - + Aproxima o parâmetro Taxa à divisão inteira mais próxima de uma batida. Triplet - + Terceto @@ -11591,7 +11737,7 @@ Fully right: end of the effect period - + Deck %1 Deck %1 @@ -11724,7 +11870,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Transpassar @@ -11755,7 +11901,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11888,12 +12034,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11928,42 +12074,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11981,7 +12127,7 @@ may introduce a 'pumping' effect and/or distortion. Low Disk Space Warning - + Aviso de Pouco Espaço em Disco @@ -12006,7 +12152,7 @@ may introduce a 'pumping' effect and/or distortion. You can change the location of the Recordings folder in Preferences -> Recording. - + Pode alterar o local da pasta Gravações em Preferências -> Gravação. @@ -12021,54 +12167,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Listas de Reprodução - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + Cues de memória - + (loading) Rekordbox (carregando) Rekordbox @@ -12297,17 +12443,17 @@ may introduce a 'pumping' effect and/or distortion. Error setting stream IRC! - + Erro a definir a stream IRC! Error setting stream AIM! - + Erro a definir a stream AIM! Error setting stream ICQ! - + Erro a definir a stream ICQ! @@ -12372,22 +12518,22 @@ may introduce a 'pumping' effect and/or distortion. Connection error - + Erro de ligação One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - + Uma das ligações de Emissão em Direto apresentou este erro:<br><b>Erro com a ligação '%1':</b><br> Connection message - + Mensagem da ligação <b>Message from Live Broadcasting connection '%1':</b><br> - + <b>Mensagem da ligação Emissão em Direto '%1':</b><br> @@ -12578,7 +12724,7 @@ may introduce a 'pumping' effect and/or distortion. Effects within the chain must be enabled to hear them. - + Os efeitos dentro da cadeia devem estar ativados para serem ouvidos. @@ -12593,7 +12739,7 @@ may introduce a 'pumping' effect and/or distortion. Waveform Display - + Formato da onda de exibição @@ -12627,7 +12773,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Vinil Giratório @@ -12639,7 +12785,7 @@ may introduce a 'pumping' effect and/or distortion. Right click to show cover art of loaded track. - + Clique direito para mostrar a capa do disco da faixa carregada. @@ -12699,7 +12845,7 @@ may introduce a 'pumping' effect and/or distortion. Indicates when the signal on the auxiliary is clipping, - + Indica quando o sinal auxiliar está clipando. @@ -12714,22 +12860,22 @@ may introduce a 'pumping' effect and/or distortion. Booth Gain - + Ganho Cabine Adjusts the booth output gain. - + Ajusta o ganho de saída para a cabine. Crossfader - + Crossfader Balance - + Balanço @@ -12799,7 +12945,7 @@ may introduce a 'pumping' effect and/or distortion. Preview Deck - + Deck de Prá-visualização @@ -12809,7 +12955,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Arte da Capa @@ -12906,7 +13052,7 @@ may introduce a 'pumping' effect and/or distortion. Microphone Talkover Mode - + Microfone Modo Talkover @@ -12916,12 +13062,12 @@ may introduce a 'pumping' effect and/or distortion. Manual: Reduce music volume by a fixed amount set by the Strength knob. - + Manual: Reduz o volume de música de um valor fixo definido pelo botão Strenght. Behavior depends on Microphone Talkover Mode: - + O comportamento depende do Modo Talkover Microfone: @@ -13006,7 +13152,7 @@ may introduce a 'pumping' effect and/or distortion. Tempo - + Tempo @@ -13045,197 +13191,197 @@ may introduce a 'pumping' effect and/or distortion. Quando pressionado, aumenta um pouco o BPM médio. - + Adjust Beats Earlier Atrasar Grade de Batidas - + When tapped, moves the beatgrid left by a small amount. Quando pressionado, move a grade de batidas um pouco para a esquerda. - + Adjust Beats Later Adiantar Grade de Batidas - + When tapped, moves the beatgrid right by a small amount. Quando pressionado, move a grade de batidas um pouco para a direta. - + Tempo and BPM Tap Toque de Tempo e BPM - + Show/hide the spinning vinyl section. Mostra/Oculta a seção do vinil giratório - + Keylock Trava de Tom - + Toggling keylock during playback may result in a momentary audio glitch. Ligar/Desligar a trava de tom enquanto tocando pode resultar em um glitch de áudio momentâneo - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Alterna a visibilidade do Controlo da Taxa - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. Coloca um ponto de sinalização na posição atual na forma de onda. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). Pára a faixa no CUE Point, OU vai para o CUE Point e reproduz a faixa após soltar o botão (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Define o CUE point (em modo Pioneer/Mixxx/Numark), define o CUE point e toca após largar a tecla (modo CUP) OU escuta o preview (modo Denon). - + Is latching the playing state. - + Seeks the track to the cue point and stops. Avança a faixa até ao Cue Point e para. - + Play Tocar - + Plays track from the cue point. - + Toca a faixa a partir do ponto de marcação. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. Altera a velocidade da faixa (afeta o tempo e o pitch). Se o keylock estiver ativo, apenas o tempo é alterado. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Mostra o alcance atual do deslizante de tempo. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration Duração da Gravação @@ -13385,7 +13531,7 @@ may introduce a 'pumping' effect and/or distortion. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: Define o quanto reduzir o volume da música quando o volume de microfones ativos passa de um determinado limite. @@ -13473,926 +13619,934 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. Mostra a duração da gravação em andamento. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Define o marcador Início Loop da faixa para a atual posição de reprodução. - + Press and hold to move Loop-In Marker. - + Pressione e mantenha para mover o marcador Início Loop. - + Jump to Loop-In Marker. - + Saltar para o marcador Início Loop. - + Sets the track Loop-Out Marker to the current play position. - + Define o marcador Fim Loop para a atual posição de reprodução. - + Press and hold to move Loop-Out Marker. - + Pressione e segure para mover o Marcador de Fim de Loop - + Jump to Loop-Out Marker. - + Saltar para o marcador Fim Loop. - + If the track has no beats the unit is seconds. - + Beatloop Size Tamanho do Loop de Batidas - + Select the size of the loop in beats to set with the Beatloop button. - + Escolher o tamanho do loop em batidas estabelecer com o botão Loop. - + Changing this resizes the loop if the loop already matches this size. - + Alterando isto redimensiona o loop se o loop já coincide com este tamanho. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Reduz a metade o tamanho dum loop existente, ou reduz a metade o tamanho do próximo loop definido com o botão Loop. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Duplica o tamanho dum loop existente, ou duplica o tamanho do próximo loop definido com o botão Loop. - + Start a loop over the set number of beats. Cria um loop sobre o número de batidas selecionado - + Temporarily enable a rolling loop over the set number of beats. Ativa temporariamente um loop de rolamento sobre o número de batidas selecionado. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Beatjump/Loop Tamanho Movimento - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Selecione o número de batidas a saltar ou a deslocar o loop com os botões Beatjump Frente/Atrás. - + Beatjump Forward - + Beatjump Frente - + Jump forward by the set number of beats. - + Salta para a frente o número de batidas predefinidas. - + Move the loop forward by the set number of beats. - + Move o loop para a frente o número de batidas prédefinidas. - + Jump forward by 1 beat. - + Salta para a frente 1 batida. - + Move the loop forward by 1 beat. - + Move o loop para a frente 1 batida. - + Beatjump Backward - + Beatjump Atrás - + Jump backward by the set number of beats. - + Salta para trás o número de batidas prédefinidas. - + Move the loop backward by the set number of beats. - + Move o loop para trás o número de batidas prédefinidas. - + Jump backward by 1 beat. - + Salta para trás 1 batida. - + Move the loop backward by 1 beat. - + Move o loop para trás 1 batida. - + Reloop - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Se o loop estiver à frente da posição atual de reprodução, o ciclo de looping começará quando o loop for atingido. - + Works only if Loop-In and Loop-Out Marker are set. - + Funciona apenas se os marcadores de Início Loop e Fim Loop estiverem definidos. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Ativar loop, saltar para o marcador Início Loop, e parar a reprodução. - + Displays the elapsed and/or remaining time of the track loaded. Mostra o tempo executado e/ou restante da faixa carregada. - + Click to toggle between time elapsed/remaining time/both. Clique para alternar entre tempo executado/restante tempo/ambos. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Mistura - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Ajustar a mistura do sinal seco (entrada) com o molhado (saída) da unidade de efeito - + D/W mode: Crossfade between dry and wet - + Modo S/M: crossfade entre seco e molhado - + D+W mode: Add wet to dry - + Modo S/M: adicionar molhado ao seco - + Mix Mode - + Modo Mistura - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Ajustar a mistura do sinal seco (entrada) com o sinal molhado (saída) da unidade de efeito - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Modo Seco/Molhado (linhas cruzadas): o botão de Mistura faz a transição entre seco e molhado. +Usar isto para alterar o som da faixa com EQ e filtros de efeitos. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Modo Seco+Molhado (linha seca plana): o botão de Mistura adiciona o molhado ao seco. +Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtros de efeitos. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Envia o bus esquerdo do crossfader através desta unidade de efeito. - + Route the right crossfader bus through this effect unit. - + Envia o bus direito do crossfader através desta unidade de efeito. - + Right side active: parameter moves with right half of Meta Knob turn - + Lado direito ativo: o parâmetro muda com meia volta para a direita do Botão Meta - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Menu Definições Skin - + Show/hide skin settings menu - + Mostra/Oculta menu de definições. - + Save Sampler Bank Salvar Banco do Sampler - + Save the collection of samples loaded in the samplers. - + Guarda a colecção de samples carregadas nos samplers. - + Load Sampler Bank Carregar Banco do Sampler - + Load a previously saved collection of samples into the samplers. - + Carrega uma colecção de samples guardada previamente nos samplers. - + Show Effect Parameters Mostrar Parâmetros do Efeito - + Enable Effect Ativar Efeito - + Meta Knob Link Vínculo do Botão Meta - + Set how this parameter is linked to the effect's Meta Knob. Defina como este parâmetro está vinculado aos efeitos do Botão Meta. - + Meta Knob Link Inversion Vínculo inverso do Botão Meta - + Inverts the direction this parameter moves when turning the effect's Meta Knob. Inverte a direção que este parâmetro se move quando rodando o efeito do Botão Meta - + Super Knob Super Botão - + Next Chain Próxima Corrente - + Previous Chain Corrente Anterior - + Next/Previous Chain Corrente Seguinte/Anterior - + Clear Limpar - + Clear the current effect. Limpa o efeito atual. - + Toggle Ligar/Desligar - + Toggle the current effect. Liga/Desliga o efeito atual. - + Next Próximo - + Clear Unit Limpar Unidade - + Clear effect unit. Limpa a unidade de efeito. - + Show/hide parameters for effects in this unit. - + Mostra/Oculta parâmetros para efeitos nesta unidade. - + Toggle Unit Ligar/Desligar Unidade - + Enable or disable this whole effect unit. - + Ativa ou desativa esta unidade completa de efeito. - + Controls the Meta Knob of all effects in this unit together. - + Controla o Meta Botão de todos os efeitos conjuntamente nesta unidade. - + Load next effect chain preset into this effect unit. - + Carrega a próxima cadeia de efeitos prédefinida nesta unidade de efeito. - + Load previous effect chain preset into this effect unit. - + Carrega a anterior cadeia de efeitos prédefinida nesta unidade de efeito. - + Load next or previous effect chain preset into this effect unit. - + Carrega a próxima ou anterior cadeia de efeitos prédefinida nesta unidade de efeito. - - - - + + + + Assign Effect Unit - + Atribuir Unidade de Efeito - + Assign this effect unit to the channel output. - + Atribuir esta unidade de efeito ao canal de saída. - + Route the headphone channel through this effect unit. - + Encaminha o canal de auscultadores através desta unidade de efeito. - + Route this deck through the indicated effect unit. - + Encaminha este leitor através da unidade de efeito indicada. - + Route this sampler through the indicated effect unit. - + Encaminha este sampler através da unidade de efeito indicada. - + Route this microphone through the indicated effect unit. - + Encaminha este microfone através da unidade de efeito indicada. - + Route this auxiliary input through the indicated effect unit. - + Encaminha esta entrada auxiliar através da unidade de efeito indicada. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Esta unidade de efeito deve também ser atribuída a um leitor ou a outra fonte sonora para ouvir o efeito. - + Switch to the next effect. Troca para o próximo efeito. - + Previous Anterior - + Switch to the previous effect. Troca para o efeito anterior. - + Next or Previous Próximo ou Anterior - + Switch to either the next or previous effect. Troca para o efeito seguinte ou anterior. - + Meta Knob Botão Meta - + Controls linked parameters of this effect Controla os parâmetros vinculados deste efeito - + Effect Focus Button Botão de Foco do Efeito - + Focuses this effect. Se foca no efeito. - + Unfocuses this effect. Desfoca este efeito. - + Refer to the web page on the Mixxx wiki for your controller for more information. Acesse a página web do seu controlador na wiki do Mixxx para mais informações. - + Effect Parameter Parâmetro do Efeito - + Adjusts a parameter of the effect. Ajusta um parâmetro do efeito. - + Inactive: parameter not linked - + Inativo: parâmetro não ligado - + Active: parameter moves with Meta Knob - + Activo: o parâmetro move-se com o Botão Meta - + Left side active: parameter moves with left half of Meta Knob turn - + Lado esquerdo ativo: o parâmetro move-se com meia volta para a esquerda do Botão Meta - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - + Lado esquerdo e direito ativo: o parâmetro desloca-se ao longo da sua extensão com meia volta do Botão Meta e para trás com a outra meia volta. - - + + Equalizer Parameter Kill Matar Parâmetro do Equalizador - - + + Holds the gain of the EQ to zero while active. Mantem o ganho do equalizador em zero quanto ativo. - + Quick Effect Super Knob Super Botão de Efeito Rápido - + Quick Effect Super Knob (control linked effect parameters). Super Botão de Efeito Rápido (controla parâmetros de efeitos conectados). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. Dica: Mude o modo padrão de Efeito Rápido em Preferências -> Equalizadores. - + Equalizer Parameter Parâmetro do Equalizador - + Adjusts the gain of the EQ filter. Ajusta o ganho do filtro de equalização. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Dica: Mude o modo padrão do equalizador em Preferências -> Equalizadores. - - + + Adjust Beatgrid Ajustar a Grade de Batidas - + Adjust beatgrid so the closest beat is aligned with the current play position. Ajusta a grade de batidas de forma que a batida mais próxima é alinhada com a posição atual. - - + + Adjust beatgrid to match another playing deck. Ajusta a grade de batidas para combinar com outro deck tocando. - + If quantize is enabled, snaps to the nearest beat. Se a quantização estiver ativada, vai para a batida mais próxima. - + Quantize Quantizar - + Toggles quantization. Liga/Desliga a quantização. - + Loops and cues snap to the nearest beat when quantization is enabled. Enquanto a quantização estiver ativada, os loops e os hotcues sempre entrarão na batida mais próxima. - + Reverse - + Inverter - + Reverses track playback during regular playback. Inverte a reprodução da faixa. - + Puts a track into reverse while being held (Censor). Coloca a faixa em reprodução invertida enquanto pressionado (Censurar). - + Playback continues where the track would have been if it had not been temporarily reversed. A reprodução continua onde a faixa estaria se ela não estivesse sido temporariamente invertida. - - - + + + Play/Pause Tocar/Pausar - + Jumps to the beginning of the track. Pula para o início da faixa. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Sincroniza o tempo (BPM) e a fase para a da outra faixa, ou BPM se detectado nos dois. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. Sincroniza o tempo (BPM) para o da outra faixa, ou o BPM se detectado nos dois. - + Sync and Reset Key Sincronizar e Redefinir o Tom - + Increases the pitch by one semitone. Aumenta o pitch por um semitom. - + Decreases the pitch by one semitone. Diminui o pitch por um semitom. - + Enable Vinyl Control Ativar Controle por Vini - + When disabled, the track is controlled by Mixxx playback controls. Quando desativado, a faixa é controlada pelos controles de reprodução do Mixxx. - + When enabled, the track responds to external vinyl control. Quando ativado, a faixa responde ao controle por vinil externo - + Enable Passthrough Ativar Repasse - + Indicates that the audio buffer is too small to do all audio processing. - + Indica que o buffer de áudio é muito pequeno para fazer todo o processamento de aúdio. - + Displays cover artwork of the loaded track. Mostra a arte da capa da faixa carregada. - + Displays options for editing cover artwork. Mostra opções para editar a arte da capa. - + Star Rating Classificação de Estrela - + Assign ratings to individual tracks by clicking the stars. Defina uma classificação para faixas individuais clicando nas estrelas. @@ -14524,36 +14678,36 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Microphone Talkover Ducking Strength - + Amplitude da Redução no Talkover - + Prevents the pitch from changing when the rate changes. Previne que o tom mude com as mudanças na taxa do pitch. - + Changes the number of hotcue buttons displayed in the deck - + Altera o número de botões hotcue mostrados no leitor - + Starts playing from the beginning of the track. Começa a tocar do começo da faixa. - + Jumps to the beginning of the track and stops. Pula para o começo da faixa e para. - - + + Plays or pauses the track. Toca ou pausa uma música. - + (while playing) (enquanto estiver tocando) @@ -14573,215 +14727,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (enquanto parada) - + Cue Cue - + Headphone Fone - + Mute Silenciar - + Old Synchronize Sincronização Antiga - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Sincroniza com o primeiro deck (em ordem numérica) que estiver tocando uma faixa e tem BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Se nenhum deck estiver tocando, sincroniza com o primeiro deck que tiver BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Decks não podem sincronizar com samplers e samplers só podem sincronizar com decks. - + Hold for at least a second to enable sync lock for this deck. Segure por pelo menos um segundo para ativar a trava de sincronização para este deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Decks com trava de sincronização vão tocar no mesmo tempo, e os decks que também tem quantização ativada vão sempre ter suas batidas alinhadas. - + Resets the key to the original track key. Redefine o tom para o tom original da faixa. - + Speed Control Controle de Velocidade - - - + + + Changes the track pitch independent of the tempo. Muda o pitch da faixa independentemente do tempo. - + Increases the pitch by 10 cents. Aumenta o pitch por 10 cents. - + Decreases the pitch by 10 cents. Diminui o pitch por 10 cents. - + Pitch Adjust Ajustar o Pitch - + Adjust the pitch in addition to the speed slider pitch. Ajusta o pitch junto com o deslizante de velocidade pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Gravar Mixagem - + Toggle mix recording. Ativa/Desativa gravação da mixagem. - + Enable Live Broadcasting Ativar Transmissão Ao Vivo - + Stream your mix over the Internet. Transmite sua mixagem pela Internet. - + Provides visual feedback for Live Broadcasting status: Provê retorno visual para o estado de Transmissão Ao Vivo: - + disabled, connecting, connected, failure. desativado, conectando, conectado, falha. - + When enabled, the deck directly plays the audio arriving on the vinyl input. Quando ativado, o deck toca diretamente o áudio chegando na entrada de vinil. - + Playback will resume where the track would have been if it had not entered the loop. A execução vai continuar como se a faixa não estivesse entrado no loop. - + Loop Exit Sair do Loop - + Turns the current loop off. Desliga o loop atual. - + Slip Mode Modo de Deslizamento - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Quando ativo, a execução continua silenciosa no fundo durante um loop, reprodução invertida, um scratch, etc. - + Once disabled, the audible playback will resume where the track would have been. Uma vez desativado, a execução audível continuará onde a música estaria. - + Track Key The musical key of a track Tom da Faixa - + Displays the musical key of the loaded track. Mostra o tom musical da faixa carregada. - + Clock Relógio - + Displays the current time. Mostra a hora atual. - + Audio Latency Usage Meter Uso da Latência de Áudio - + Displays the fraction of latency used for audio processing. Mostra uma fração da latência usada para o processamento de áudio. - + A high value indicates that audible glitches are likely. Um valor alto indica que ruídos no áudio são prováveis. - + Do not enable keylock, effects or additional decks in this situation. Não ative a trava de tom, efeitos ou decks adicionais nessa situação. - + Audio Latency Overload Indicator Indicador de Sobrecarga na Latência do Áudio @@ -14803,17 +14957,17 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Crossfader Orientation - + Orientação do Crossfader Set the channel's crossfader orientation. - + Define a orientação do crossfader entre canais. Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - + Quer para o lado esquerdo do crossfader, ou para o lado direito, ou para o centro (não afetada pelo crossfader) @@ -14826,254 +14980,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Mostra o tom musical atual da faixa carregada depois do pitch alterado. - + Fast Rewind Retrocesso Rápido - + Fast rewind through the track. Rebobina a música rapidamente. - + Fast Forward Avanço Rápido - + Fast forward through the track. Avança rápido pela faixa. - + Jumps to the end of the track. Pula para o fim da faixa. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. Define o pitch para um tom que permite uma transição harmônica da outra faixa. Requer um tom detectado nos dois decks envolvidos, - - - + + + Pitch Control Controle do Pitch - + Pitch Rate Taxa de Pitch - + Displays the current playback rate of the track. Mostra a taxa de reprodução da música em execução. - + Repeat Repetir - + When active the track will repeat if you go past the end or reverse before the start. Quando ativo, a música vai repetir se você passar do final ou inverter a reprodução antes do início. - + Eject Ejetar - + Ejects track from the player. Ejeta a música do deck. - + Hotcue - + Marcação - + If hotcue is set, jumps to the hotcue. Se o hotcue estiver definido, pula para o ele. - + If hotcue is not set, sets the hotcue to the current play position. Se o hotcue não estiver definido, faz um hotcue na posição atual. - + Vinyl Control Mode Modo de Controle por Vinil - + Absolute mode - track position equals needle position and speed. Modo absoluto - a posição da faixa é igual à posição e velocidade da agulha. - + Relative mode - track speed equals needle speed regardless of needle position. Modo relativo - a velocidade da faixa é igual à da agulha, independente da posição. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Modo constante - a velocidade da faixa é igual à última velocidade conhecida, independente da agulha. - + Vinyl Status Estado do Vinil - + Provides visual feedback for vinyl control status: Provê retorno visual para o estado do controle por vinil: - + Green for control enabled. Verde quando o controle estiver ativado. - + Blinking yellow for when the needle reaches the end of the record. Amarelo piscante quando a agulha estiver no fim do disco. - + Loop-In Marker Marca de Entrada do Loop - + Loop-Out Marker Marca de Saída do Loop - + Loop Halve Divide o Loop pela Metade - + Halves the current loop's length by moving the end marker. Diminui o comprimento atual do loop pela metade movendo a marca de saída. - + Deck immediately loops if past the new endpoint. O deck vai loopar imediatamente se passar do novo ponto de saída. - + Loop Double Dobrar o Loop - + Doubles the current loop's length by moving the end marker. Dobra o comprimento do loop atual movendo a marca de saída. - + Beatloop Loop de Batidas - + Toggles the current loop on or off. Alterna o loop atual entre ligado ou desligado. - + Works only if Loop-In and Loop-Out marker are set. Funciona somente se existirem marcas de entrada e saída do loop. - + Vinyl Cueing Mode Modo de Cue do Vinil - + Determines how cue points are treated in vinyl control Relative mode: Determina como os pontos cue são tratados com o controle por vinil em modo relativo: - + Off - Cue points ignored. Desligado - Pontos cue ignorados. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Único - Se a agulha for solta depois doponto cue, a faixa vai até aquele ponto cue. - + Track Time Tempo da Música - + Track Duration Duração da Faixa - + Displays the duration of the loaded track. Mostra a duração da faixa carregada. - + Information is loaded from the track's metadata tags. A informação é carregada a partir das etiquetas de metadados. - + Track Artist Artista da Faixa - + Displays the artist of the loaded track. Mostra o artista da faixa carregada. - + Track Title Título da Faixa - + Displays the title of the loaded track. Exibe o título da faixa carregada. - + Track Album Álbum da Faixa - + Displays the album name of the loaded track. Exibe o nome do álbum da faixa carregada. - + Track Artist/Title Artista/Título da Faixa - + Displays the artist and title of the loaded track. Mostra o artista e título da faixa carregada. @@ -15081,12 +15235,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks Faixas ocultas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? As faixas selecionadas estão na seguinte playlist: %1Ocultá-las as removerá dessas playlists. Continuar? @@ -15266,7 +15420,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Clear cover clears the set cover art -- does not touch files on disk - + Limpar capa do disco @@ -15301,47 +15455,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15466,323 +15620,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Criar &Nova Lista de Reprodução - + Create a new playlist Criar uma nova lista de reprodução - + Ctrl+n Ctrl+n - + Create New &Crate Criar Nova &Caixa - + Create a new crate Criar uma nova caixa - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Exibir - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Pode não ser suportado em todas as skins. - + Show Skin Settings Menu - + Mostrar Menu de Configurações do Tema - + Show the Skin Settings Menu of the currently selected Skin - + Mostra o menu das configurações do tema do tema atualmente selecionado - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar Seção do Microfone - + Show the microphone section of the Mixxx interface. Mostra a seção do microfone na interface do Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Mostrar Seção do Controle por Vinil - + Show the vinyl control section of the Mixxx interface. Mostra a seção do controle por vinil na interface do Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Mostrar Deck de Pré-escuta - + Show the preview deck in the Mixxx interface. Mostra o deck de pré-escuta na interface do Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Mostrar Arte da Capa - + Show cover art in the Mixxx interface. Mostra a arte da capa na interface do Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximiza a biblioteca de faixas para ocupar todo o espaço de tela disponível. - + Space Menubar|View|Maximize Library Espaço - + &Full Screen Te&la cheia - + Display Mixxx using the full screen Exibir o Mixxx usando Tela Cheia - + &Options &Opções - + &Vinyl Control Controle por &Vinil - + Use timecoded vinyls on external turntables to control Mixxx Use vinils com timecode em toca-discos externos para controlar o Mixxx - + Enable Vinyl Control &%1 Ativar Controle por Vinil &%1 - + &Record Mix &Gravar Mixagem - + Record your mix to a file Grave sua mixagem para um arquivo - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Ativar Transmissão Ao &Vivo - + Stream your mixes to a shoutcast or icecast server Transmita suas mixagens para um servidor shoutcast ou icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Ativar Atalhos de &Teclado - + Toggles keyboard shortcuts on or off Ativa/Desativa atalhos de teclado - + Ctrl+` Ctrl+` - + &Preferences &Preferências - + Change Mixxx settings (e.g. playback, MIDI, controls) Muda as configurações do Mixxx (ex.: reprodução, MIDI, controles) - + &Developer &Desenvolvedor - + &Reload Skin &Recarregar Skin - + Reload the skin Recarregar a skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Ferramen&tas de Desenvolvedor - + Opens the developer tools dialog Abre o diálogo das ferramentas de desenvolvedor - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Dados: Balde de &Experimento - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Ativa o modo de experimento. Coleta dados no balde de localização EXPERIMENT. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Dados: Balde &Base - + Enables base mode. Collects stats in the BASE tracking bucket. Ativa o modo base. Coleta dados no balde de localização BASE. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Deb&ugger Ativado - + Enables the debugger during skin parsing - + Ativa o debugger enquanto a skin estiver sendo analisada - + Ctrl+Shift+D Ctrl+Shift+D - + &Help A&juda - + Show Keywheel menu title @@ -15799,74 +15983,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel F12 - + &Community Support &Suporte da Comunidade - + Get help with Mixxx Obtenha ajuda com o Mixxx - + &User Manual Manual do &Usuário - + Read the Mixxx user manual. Leia o manual do usuário do Mixxx. - + &Keyboard Shortcuts Atalhos de &Teclado - + Speed up your workflow with keyboard shortcuts. Acelere seu fluxo de trabalho com atalhos de teclado. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Traduzir Este Programa - + Help translate this application into your language. Ajude a traduzir este aplicativo para o seu idioma. - + &About So&bre - + About the application Sobre a aplicação @@ -15874,25 +16058,25 @@ This can not be undone! WOverview - + Passthrough Transpassar - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15901,25 +16085,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Limpar entrada - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Pesquisa - + Clear input Limpar entrada @@ -15930,169 +16102,163 @@ This can not be undone! Pesquisar... - + Clear the search bar input field - - Enter a string to search for - Insira uma palavra para pesquisar + + Return + Enter - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Atalho + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Foco + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return - Enter + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Sair da pesquisa + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Tom - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artista - + Album Artist Artista do Álbum - + Composer Compositor - + Title Título - + Album Álbum - + Grouping Agrupamento - + Year Ano - + Genre Gênero - + Directory - + &Search selected @@ -16100,620 +16266,625 @@ This can not be undone! WTrackMenu - + Load to - + Carregar no - + Deck - + Deck - + Sampler Sampler - + Add to Playlist Adicionar à Lista de Reprodução - + Crates Caixas - + Metadata Metadado - + Update external collections - + Cover Art Arte da Capa - + Adjust BPM - + Ajustar BPM - + Select Color - - + + Analyze Analisar - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Adicionar à fila do Auto DJ (embaixo) - + Add to Auto DJ Queue (top) Adicionar à Fila do Auto DJ (em cima) - + Add to Auto DJ Queue (replace) - + Adicionar à Fila Auto DJ (Substituir) - + Preview Deck Deck de Pré-escuta - + Remove Remover - + Remove from Playlist - + Remover da Playlist - + Remove from Crate - + Remover da Caixa - + Hide from Library Ocultar da Biblioteca - + Unhide from Library Desocultar da Biblioteca - + Purge from Library Eliminar da Biblioteca - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Propriedades - + Open in File Browser Abrir no Navegador de Arquivos - + Select in Library - + Import From File Tags Importar das Etiquetas do Arquivo - + Import From MusicBrainz - + Importar do MusicBrainz - + Export To File Tags - + Exportar Para Tags Ficheiros - + BPM and Beatgrid - + BPM e Grelha de Batidas - + Play Count - + Contador de Leitura - + Rating Classificação - + Cue Point - + Ponto de Marcação - - + + Hotcues Hotcues - + Intro - + Outro - + Key Tom - + ReplayGain ReplayGain - + Waveform - + Forma de Onda - + Comment Comentário - + All Todos - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Travar o BPM - + Unlock BPM Destravar o BPM - + Double BPM Dobrar o BPM - + Halve BPM Diminuir o BPM pela metade - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Criar Nova Lista de Reprodução - + Enter name for new playlist: Digite o nome para a nova lista de reprodução: - + New Playlist Nova Lista de Reprodução - - - + + + Playlist Creation Failed Falha ao Criar Lista de Reprodução - + A playlist by that name already exists. Uma lista de reprodução com esse nome já existe. - + A playlist cannot have a blank name. Uma lista de reprodução não pode ter um nome em branco. - + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a lista de reprodução: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) Locking BPM of %n track(s)Locking BPM of %n track(s)Bloqueando o BPM de %n faixa(s) - + Unlocking BPM of %n track(s) Unlocking BPM of %n track(s)Unlocking BPM of %n track(s)Desbloqueando BPM de %n faixa(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) Setting color of %n track(s)Setting color of %n track(s)Mudando a cor de %n faixa(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Cancelar - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Fechar - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16729,37 +16900,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16767,37 +16938,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16805,12 +16976,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Mostrar ou ocultar colunas. - + Shuffle Tracks @@ -16818,52 +16989,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Escolha o diretório da biblioteca de música - + controllers - + Cannot open database Não foi possível abrir o banco de dados - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16877,68 +17048,78 @@ Clique OK para sair. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Navegador - + Export directory - + Database version - + Export Exportar - + Cancel Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16948,18 +17129,18 @@ Clique OK para sair. Export Modified Track Metadata - + Exportar Metadados Modificados da Faixa Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - + O Mixxx poderá esperar para modificar ficheiros até que não estejam carregados em quaisquer leitores ou samplers. Se não vir os metadados alterados noutros programas imediatamente, ejecte a faixa de todos os leitores e samplers ou encerre o Mixxx. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16969,23 +17150,23 @@ Clique OK para sair. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... @@ -17002,7 +17183,7 @@ Clique OK para sair. No network access - + Sem acesso a rede diff --git a/res/translations/mixxx_pt_PT.qm b/res/translations/mixxx_pt_PT.qm index 84732894e3338ac4bcf1bf7094d339f5bd187fb6..0128e59693d0dd6f62703af896a02255c65131e5 100644 GIT binary patch delta 24741 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 Sm&7cE{Q~ckKR?gA1OEa+S0R-E delta 17656 zcmYkE2V9QbAOFASoa?&xkUg_XLRn>tWUFNFjE0b`dhno|$ck(sGP7lbTOlKRl#!i? zY$D<@^Z#_+zyJUBe_k)I_jTW0<6PhK-RIoT$=H&!j@d1(V(|3)U0)Jm`sQL{ME4SWwaBWmsmdJ_lu$ z@!xw8Khly&bR-Kk8>1Ysli}b9-1{^bL@Xp8#KW7HA(AHI0d2rZ#Ah!7CljB(8JvOd zM}bjza7}PF9#9=zjL%cR4Hy6hC~X0Ef&0MQ;2~nG9l(2xP{{2c+Bki>LhvtAH|_@F#%sVX#k@+?^$1bV`U*w4|A@Nbyw$!$J{^h2FDA11%p%tMDZZFX?Avo9 z-vDABc9o8lo;{9O**CEnHTaofhCISTpuQY3xD+_&CBvhE~NlRT2$VHu?jHom>3kPkRzgF1781qzDHP*EN$!g`@zdCN zX*J2gX(T>WBzfWjqD`I(MZ_f3Gko+qO=UHuRlwC{<@roJB7u@BCLh*MpskXzUJ`W^S@tiiT zM(Vm*;3iU!zJ)owPwFXIL}Ri@9q*5Uo+N#@-b59K+gR_mLSA;Lja3R2ia*1t#PnOl zUREHx_h*S)K2XVRmKhLLZz{J6N;PK&RqPN+V)Id|wqXSEmQmzrSw(bWze2I25!FhT zh_#wTwcVhs4{K2Ercl<0J*l>L6!DR#s1B4)Jo2JCHypu9RHsRS5DA@TD()rH7K#%`*cd67iUJF3_I1yO_1$(7jvACdMszBj8dD9T4T
^Wb&q^7~e=H@{yrb8DNO{W&u0^w(N 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
*8s9qt4(>>{6X$|w4o zDxdD_Kr~{VLecz;eC{J$bj=C!`QkOCd?BB=;D8Srs(is8xyu(mr;(73$X8q{kQLa}d{{9KJ} zHdrseD21sQoG8DlAQ6?~@+-%cV6sBqyu18rtv!jV&E(g5)C(gE&|Cdy)`q^XUL#SF0hDY67QssfAcwtdxsJwiZBkew|@;XzBcr`m! z$Cb;8_Zq3{GKJ>s4P`}quu^M zHS^a9Vvm}sX01c#BX+)O_Jf@$oxUj)v*J|qriT;1+)6b+3g?wEs21jWkSNGg#ax9W zT5&?Pr~s+eOMBJg7GA`HE~=I+@gjcntZKz>OtEOFS~(9>6a7uKsuLtou9a#{NsB9% z%#W$od~inxvz%(n5oDz)dsRF9R>S9esCHH?BC+?KYNrEuS*Uh9!_2N-SM52B2mYO< z+Itxtj{FO%eHD?qEg7oXhXISnO;v~7T}iB|q)L8;gr)9dRZ1vCPwA@TcDU|OuIhM~ z73iAZQJuEf9U4 zfVpLdJSJvfU3fU3f68n;=?tR-I{@|**U)em8RQ~GzTQLQ^N4K^RQscv6}yhAhfhl; zabvN1_z$?~vlrDPZjB)^zl%DcF3fo7VRdluA>s{$Iym<-MBi6E0j(R0sL@?Lcs=UV+F)ty*Mw8#G;GpCI28SpZu;~@*gBs?x=eCnIFWj4p6Ug zC|>`|oT6T{>>M1!7WJCFP>w-U)Enw_!P2T$y~%YrvD?ekn~%DZxa6qbd?tygdIfc2 zCT{$1U-gdt`RI!4)w`zT5bKny-a8oki8?h^Cs8!GT)ltVUlP|FtBb=oZ?;{1^u$*z z^;A+QJcg)K=2)P;Q@g5#0O0Oz&!R^Qlw0hjBg&YBWSV#rtZonL6{1xBgw6?;JE z6!m?d95|pF>YRp^(6lzIpIe-Ki4EGJemx&CpoFY`9n*+}owxd}beKqc&Bm8@>UT@D zM0fhC^PA-nZHiETUK&MWdMWj{mu^^O_EvxYgZtD>RR1h_nAo~z>Yqv2Ph?-H{@cKT zc)~>W-+m)VsM=^)Ds(C0ibf1Y!gDx9W0Ci5C0aI2V{C!BwK!=^69*t8x}_~*0`UmiJWhf zripGF(S6>QK zseEEN!J2TjKe6YsX8KuZd%HuL>3MKKDI+yAf4jnyUf0ZuawV~KohGVyIo~opT{#fy zDVnGxnBUs=n%V2y5jC~bM5`Q;&EC{RCqQc@H%)X(3xww|&Afs$2u@!#^ACoRXdSLu zsDo&K@765Le27@^NfWyP%Gf?)Qr)n*rKIM7RtI|xt*bet_aXi|U309#8)$QiCgn=;0HQQ0&w64(F+`K{ZVPCq zNp&hB{&R@tR7vdJ`q@}>@-^O4}w>b2Zol4UDpy ztG9=sjki*vWEZ5lHrj#*Uaq0Jb{YM;=(Cz@AJFeBQ($A|1Dfk1nP~e|g+_DS02hmr4R*4KI>ob&%&wO)~55SCwBw4Gv8h@Bg&?HXZ^grk{4F}|U;Yc>Y( zxvbV_WD(xrABC*h5v|WXn9sm4ZFf6Jrcx8FUmtk3QFpaH+&$3Y)N1>k&mqD5v;#6G zp|O#w9oRdAM1oQ4zW_Pq*GTP%6T^^cF>Sy*^#Ar)Ix7bvE5qrD}R<^BrAsa@L9v*4i8n`p(gNg_t04GrCa4M&@7Z16!Lud!XB zC_1JMJ5xl$!AU!@H|X?LJ81%fnPufCZTKw@Xr-NY>L=vyKSH$s=H16WfOcBTJt$G< zquN=k^~CQNC=^4zw6m|7Nc0(}oqZeif9_cAoQa4XOI#F6<_6k%PZ5+J|JE+Fc11_! zkv7Js5~kvTLb0@pcIlQML~RY)^`*9;{=eH#yP+SHk8ja#I+;LhWq0kS?=p$-4DIGf zc(CDb6pH4N+ReZ75Hu{>tu5@ay3MqQ3OtC4hHDR(eMYoc(jHm%3+Xs%kA6rccJQw@ zH5lgCWkwi$ zf1>tUwg)zh#%MF0a6yaT+8gCNATQ{oy*Vxxu3E3XIblDN%m&(f>q-*UJg6ig7c>YWsKkiO+!cNCe;Pc#go%G){VtGe&nt(jif|&|g zqNLO1d&3<2>J0VV5RPl>jCK8q%X4++S4G6zZPHaKfa{*oTxW6eM35O})z$3_k#DZ9 zbLkX`-p?VO>oI8QrhVO zp*ICKi}lxytCLUs2I>AefUVRs3U&Xaqo2QTs%~n^DPlh1x_^_f%>E)t7qvNz_?VZv zsElxIwQ|%&J+44Zeyf`^9@TMdSKXX==*CHBUCeD z)|f_M3#FHCO_%l9G+M{Tia%|vTvoT{_7+Iuoo?*_UlLoo>eil>(CabVSazI3$uLv5 z_CXk$P9JpZYM_LRexXaaD`OMdU0uSrVn*vWZh*BNX{+1hnSlIXcSN@-e8u3 zU|Y><@H6;9w>c0|F?WD&%g=JC1N?M}#l@!6Gu@7X>q+$9r`uCGoY;h>x;?FPiN-nU z_O^y{-fpPdpF0H|(P)L@XKUSo3}iY@Ug-`V=nZRf)E(Y$kEYi~-LWQ~7Lv+b)TP`) ziPg(S9-F6pmQ?q2$2(8OexCj|8ZO${e6&J|?b4+UgzjXy=uY23IX$O>?u=jY)b-J& zH}-;=_SKzhcA0qHdAdt+=ZTltp}V}sm8ixk-L)UHVJ)$`%<7f|5@X$UxBi7oyzHvW za?HSLSbbgALVUh5MR(^@K8cAgx}04U^`N9hV4 zAqf4Kq5GQt2KGHu_d8-YvE=uLy0^#_PzRb%H$a=5n%iHzBmWe2R#e1;d*N*zCQSFJA z7wD@+BP%}Wq<0C04sGtFcbOea>{5HZ>p~A==l%4q$1;gZ^wKxZE=gjhr@onVocO&@ z`c~>}yueSr#iL&=!s8Tu+h-n#&$smL?gn7-DN-SCKStlNFp@;Mb^6ZpCSfxQ>AMCY z-ur*ncN_xzrNsHoQWafK%h z_Sg4mkVB$ugnr1%X+*~=TJ*yz^dXUdOg{okDB?^@eZX2@VqGWb1I{9gZRD&ETwR*D zM{oT|rwkIY!}Vh_k)p*P(ocAqfjNDl|L0L8@r=^?$sD<2>3scUPk7L=@%q`Vev+86 zQ9s9IK#sUnAHB~N4y>0x`e-zE(OMLWnHH6P-Uhr`)s8kcnxK%oG|oIa+} zQ>^74)Gz7?Uw$QBzt|gQ)pm=1>BN=zT&Q1;b{%zh&@VsH7Ta@t^{buW`S#f9*F<3M zeRk;AyxB~w@f>gqcuv3GXAZ*qG5zKW0}%fcQuLdDrIAQqqTgElMZ!S+)@%dOf14Dt z8p~{SjMZ;Xd`8^yheAo8rr(6}@jI9G7YkS6cN_=xSN7zfk&vywmI_Zc;JiX!Vw^s6co>Nz{`$M#&(Yng zqQ8qmL-b44KU|kVtbb{JwliFOZk|4S`7+|qGW6Md3n0>G1N2XH`6L$f)juh2D!mx0 ze{ms;=+hYe`vI_5S3mv7PZ7k!o9RCtC{0YdpfC8@nE0jB`p=g=h_~IK|Ir6wHM~&& zV=p8aKHb1Kb--q{*M<@nm|MQyQ1Uez5*{NAm5+6SZag(queyy`$EAiErz}w@w>KMV zoQWegYrMfR(GDY28EQ{0#3mDWLtUOgLSAa9d!-1!mhv>z{bK^Z8C8h8HjvWErV~Jv+xHm4L$oJQ*z8x$mpF z!-VP)sGw?F3=y?mF^8QElX)6?zMh83_K7fyZidOBxS*fOFxhe#o^HEg^4&W`OHLc6 zo_s?rCeJy}2$v&L|;Njl85l(*r`HI8j@zYXcnT}jj%Z#c&>=apO)igE)LN^*?h;_!E< z111`-b^Hq5m}R)NB$mX5L54f2@B@zX4R;%QART{exHkjgd0D>Uew9d~TCRr2XHhAY zI%#7*_+^4)!j?}{=? zVYpwrM58J`hv-i~qt=WUowD1g+kP9#WglVGeaFwOq$NhXp`(bgcE&O)tZXb=W-MC@ zQ;^=oSZ-qxajChnQg0-yZwf_)Hr%mNl0R{ z(K5z4gXrZ>V^{?Gd1oFPCl)V}j9+4$5?4gD+1_Z`W`a+@Vw_nOvEW2yT4`M1SB`kYO2)+}1`sc}Wn9)4b8e`qP+}(I+F}pc_mFYj z411#Qb1cT4S?$o5w;Ff-TSTJ&2;*L7h`!1WNo^Int{6{0>>DlhYA2%|dTT=!>s;%)} zdq{S}EaUx4C{|fjP3IMJGTPl)a|lbTKu0=TE%FP*amUOx2T#rk4M} zrAKZwwf4aqe`{oF4f_|_pG9Z&rjCJbuz#P=rcPS?$gF&rsau{M za=-;9?|(huK$@7kw?)|XDP`)Og7mrM9#gN|=-I3{oBGB2l4Q5t)PMCl;!o{N12XWY zJMNkWRfUTd%}s;$!GYCJHx0fIW&B2_Vb9Udf1F_o2+cz7*uXS$LMd#&Niv1Li$?vw zw2Nt4ZU*t+2TU_cU&Lf{~~GHO-m20Q>(Jn4+5@++P3B z6zvB|RBWb@H9c-xupKKPc^;;iRcR!;`kPkV%OG*}hG|U-?)QGIX5V1p?w4;_#BOHHS~x|3+L z#&p{31)XW5P>jnlU9!xAxx_y+U7qCthf%?F9inGWA5FI^2ElH-nC`m5gZ=nudW0<* ztj=>&_61a}ZL6Ac8qb8%mbcL~SfL~mO;6EW=3m@RPw%^8e?W}s*&APU$4Z-CY;Z(v zIm7hg*dvT{jOk-)7;$p5hIR|xx<(k>`ODv+F)?7ak@p@dkxq)+Y;>}acjgCQd z+B~y+AAH|uk-152G$QuKo0~h?lh{<-+@khGh&IsNa?~7Dx8CNKb7PUVzgEa<+_TZ~ zj=9YWSOtE2(Qf8pY*-p;4s2BcyX=b0fvXmfWHAStgU+@=SL&O2)c)SMQIbOO`-6G( zp4lX6KAJ~=^oM7>VIJc)34Q;q=5aEt;BG7PxSHN*(?yxX*C8$6v&TH`a2N@yVYYP3 zCqChZd6p^(QS+#IkrYW{UT5>N7-UY_mCeg*Uv}s}fJ`_P{^>y>_G5N@V^2|jeM_?5#WfVyj!vwUU1pe0zVKkgV z<9xY!@hFKD~8Nv$z6wbEx+R4zR>lg6{@ zYHQCathCYkFq+L`)|wOqkATidK;7xmWUO{`x9Yx`6-id*lVV0~3q z)j1Yc*ShB;tH`XH0(Q!1b^Xgan5{2NJc3y-mEcJ%&aD*R8rQWfUmUlgJYOHTx+1S1 zS6GodTc=gx`9`a69UjW9_AdNmIjdU-9;3I`?ZN9w){TAmp9)9E^ZML6d?H`St+gZg zUtt|Rl^>`O7d%R;X$@b&TWG9r<9S1zlE4G1SSy_1Nj0p__^C*VxHg}7i1p4VF4R_^ z?>w=TwUvnUs@xh_UFgbNyR;C&%-XA!SRq*}dWr|7trh!< z9p$Wz$BDirtmiCZvBCOdk?2uB?n;U%Yc-t|F8;2LU0~M&RS9u<;S$)q+O_g$BkQ87VotS0*nCr->9wb*UW`BY?)xBpRq-O zXoKOO$t!$fXx(<8Z40 diff --git a/res/translations/mixxx_pt_PT.ts b/res/translations/mixxx_pt_PT.ts index 2fc647fdfbf9..6d3894ab0712 100644 --- a/res/translations/mixxx_pt_PT.ts +++ b/res/translations/mixxx_pt_PT.ts @@ -39,32 +39,32 @@ Limpar fila do Auto DJ - + Remove Crate as Track Source Remover Caixa como Fonte de Faixas - + Auto DJ - + Auto DJ - + Confirmation Clear Confirmar limpeza - + Do you really want to remove all tracks from the Auto DJ queue? Você tem certeza que quer remover todas as faixas da fila do Auto DJ? - + This can not be undone. Esta ação não pode ser desfeita. - + Add Crate as Track Source Adicionar Caixa como Fonte de Faixas @@ -148,7 +148,7 @@ BasePlaylistFeature - + New Playlist Playlist Nova @@ -159,7 +159,7 @@ - + Create New Playlist Criar uma Playlist Nova @@ -189,113 +189,120 @@ Duplicar - - + + Import Playlist Importar Playlist - + Export Track Files Exportar Faixas - + Analyze entire Playlist Analisar a Playlist inteira - + Enter new name for playlist: Digite o novo nome para a lista: - + Duplicate Playlist Duplicar a Lista de Reprodução - - + + Enter name for new playlist: Digite o nome para a nova lista de reprodução: - - + + Export Playlist Exportar Playlist - + Add to Auto DJ Queue (replace) Adicionar à Fila Auto DJ (Substituir) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Renomear Playlist - - + + Renaming Playlist Failed Renomeação da Playlist Falhou - - - + + + A playlist by that name already exists. Já existe uma playlist com esse nome. - - - + + + A playlist cannot have a blank name. Uma playlist não pode ter um nome em branco. - + _copy //: Appendix to default name when duplicating a playlist _copiar - - - - - - + + + + + + Playlist Creation Failed Criação da Playlist Falhou - - + + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a playlist: - + Confirm Deletion Confimar a remoção - + Do you really want to delete playlist <b>%1</b>? Você realmente deseja excluir a lista de reprodução <b>%1</b>? - + M3U Playlist (*.m3u) Playlist M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Texto CSV (*.csv);;Documento de Texto (*.txt) @@ -303,12 +310,12 @@ BaseSqlTableModel - + # - + # - + Timestamp Data e Hora @@ -316,7 +323,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Não conseguiu carregar a faixa. @@ -324,137 +331,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artista do Album - + Artist Artista - + Bitrate Taxa de Bits - + BPM - + BPM - + Channels Canais - + Color Cor - + Comment Comentário - + Composer Compositor - + Cover Art Capa do Disco - + Date Added Data Adicionada - + Last Played Última Execução - + Duration Duração - + Type Tipo - + Genre Género - + Grouping Agrupamento - + Key Tom - + Location Localização - + + Overview + + + + Preview Antevisão - + Rating Classificação - + ReplayGain ReplayGain - + Samplerate Taxa de amostragem - + Played Tocada - + Title Título - + Track # Faixa # - + Year Ano - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Buscando imagem ... @@ -542,67 +554,77 @@ BrowseFeature - + Add to Quick Links Adicionar a Atalhos - + Remove from Quick Links Remover de Atalhos - + Add to Library Adicionar à Biblioteca - + Refresh directory tree Recarregar pastas - + Quick Links Atalhos - - + + Devices Dispositivos - + Removable Devices Dispositivos Removíveis - - + + Computer Computador - + Music Directory Added Pasta de Música Adicionada - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Adicionou uma ou mais pastas de música. As faixas nestas pastas não estarão disponíveis até reexaminar a sua biblioteca. Deseja reexaminar agora? - + Scan Examinar - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Computador" permite-lhe navegar, ver, e carregar faixas das pastas no seu disco duro e em dispositivos externos. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -684,7 +706,7 @@ ReplayGain - + ReplayGain @@ -727,7 +749,7 @@ The file '%1' could not be found. - + O arquivo '%1' não pôde ser encontrado. @@ -889,7 +911,7 @@ trace - Above + Profiling messages Remove Palette - + Remover Paleta @@ -1045,13 +1067,13 @@ trace - Above + Profiling messages - + Set to full volume Ajustar para o volume máximo - + Set to zero volume Ajustar para o volume zero @@ -1076,13 +1098,13 @@ trace - Above + Profiling messages Botão de rolagem reversa (Censurar) - + Headphone listen button Tecla de escuta no auscultador - + Mute button Tecla de Silêncio @@ -1093,25 +1115,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Orientação da mistura (ex. esquerda, direita, centro) - + Set mix orientation to left Definir orientação da mistura à esquerda - + Set mix orientation to center Definir orientação da mixagem para o centro - + Set mix orientation to right Definir orientação da mistura à direita @@ -1152,22 +1174,22 @@ trace - Above + Profiling messages Botão de toque do BPM - + Toggle quantize mode Alternar modo de quantização - + One-time beat sync (tempo only) Sincronização pontual da batida (só tempo) - + One-time beat sync (phase only) Sincronização pontual da batida (só fase) - + Toggle keylock mode Alternar modo bloqueio de tom @@ -1177,193 +1199,193 @@ trace - Above + Profiling messages Equalizadores - + Vinyl Control Controlo de Vinil - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Alternar modo de marcação do control do vinil (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Alternar modo de controle por vinil (CONST/ABS/REL) - + Pass through external audio into the internal mixer Passar audio externo para o misturador interno - + Cues Pontos de marcação - + Cue button Tecla de Cue - Marcação - + Set cue point Definir ponto de marcação - + Go to cue point Ir para o ponto de marcação - + Go to cue point and play Ir para o ponto de marcação e tocar - + Go to cue point and stop Ir para o ponto de marcação e parar - + Preview from cue point Antevisão a partir do ponto de marcação - + Cue button (CDJ mode) Botão Cue (modo CDJ) - + Stutter cue Marcação Stutter - + Hotcues - + Hot Cues - + Set, preview from or jump to hotcue %1 Definir, escutar de ou pular ao hotcue %1 - + Clear hotcue %1 Limpar a Hot Cue %1 - + Set hotcue %1 Definir a Hot Cue %1 - + Jump to hotcue %1 Saltar para a Hot Cue %1 - + Jump to hotcue %1 and stop Saltar para a Hot Cue %1 e parar - + Jump to hotcue %1 and play Pular para hotcue %1 e jogar - + Preview from hotcue %1 Antevisão a partir da Hot Cue %1 - - + + Hotcue %1 Hot Cue %1 - + Looping Em Loop - + Loop In button Tecla de Início de Loop - + Loop Out button Tecla de Final de Loop - + Loop Exit button Botão de saída de ciclo - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Mover o loop para frente %1 batidas - + Move loop backward by %1 beats Move o loop para trás %1 batidas - + Create %1-beat loop Criar um loop de %1-batidas - + Create temporary %1-beat loop roll Criar um loop rolado temporário de %1-batidas @@ -1479,20 +1501,20 @@ trace - Above + Profiling messages - - + + Volume Fader Cursor de Volume - + Full Volume Volume Máximo - + Zero Volume Volume Zero @@ -1508,7 +1530,7 @@ trace - Above + Profiling messages - + Mute Silênciar @@ -1519,7 +1541,7 @@ trace - Above + Profiling messages - + Headphone Listen Escuta de Auscultador @@ -1540,25 +1562,25 @@ trace - Above + Profiling messages - + Orientation Orientação - + Orient Left Orientar Esquerda - + Orient Center Orientar Centro - + Orient Right Orientar Direita @@ -1575,7 +1597,7 @@ trace - Above + Profiling messages BPM +0.1 - + BPM +0.1 @@ -1628,82 +1650,82 @@ trace - Above + Profiling messages Move a grade de batidas à direita - + Adjust Beatgrid Ajustar Grelha de Batidas - + Align beatgrid to current position Alinhar a grelha de batidas para a posição corrente - + Adjust Beatgrid - Match Alignment Ajustar Grelha de Batidas - Igualar Alinhamento - + Adjust beatgrid to match another playing deck. Ajusta a grelha de batidas para corresponder um outro leitor em reprodução. - + Quantize Mode Modo Quantização - + Sync Sincronização - + Beat Sync One-Shot Sincronizar a Batida De Uma Vez - + Sync Tempo One-Shot Sincronizar Tempo - One-Shot - + Sync Phase One-Shot Sincronizar a Fase De Uma Vez - + Pitch control (does not affect tempo), center is original pitch Controlo de tom (não afeta o tempo), ao centro é o tom original - + Pitch Adjust Ajustar Tom - + Adjust pitch from speed slider pitch Ajustar o tom com o cursor de velocidade - + Match musical key Igualar o tom musical - + Match Key Igualar Tom - + Reset Key Reiniciar Tom - + Resets key to original Reiniciar o tom para o original @@ -1744,451 +1766,451 @@ trace - Above + Profiling messages EQ Baixos - + Toggle Vinyl Control Alternar Controlo do Vinil - + Toggle Vinyl Control (ON/OFF) Alternar o Controle por Vinil (Ligado/Desligado) - + Vinyl Control Mode Modo Controlo do Vinil - + Vinyl Control Cueing Mode Controlo do Vinil Modo Marcação - + Vinyl Control Passthrough Controlo do Vinil Passthrough - + Vinyl Control Next Deck Controlo do Vinil Próximo Leitor - + Single deck mode - Switch vinyl control to next deck Modo leitor único - Comutar o controlo do vinil para Próximo Leitor - + Cue Marcação - + Set Cue Definir Cue - + Go-To Cue Ir para Marcação - + Go-To Cue And Play Ir para Marcação e Tocar - + Go-To Cue And Stop Ir para Marcação e Parar - + Preview Cue Antevisão Marcação - + Cue (CDJ Mode) Cue (Modo CDJ) - + Stutter Cue Marcação Stutter - + Go to cue point and play after release Avança até ao Cue Point e toca a faixa após largar o botão. - + Clear Hotcue %1 Limpar Hotcue %1 - + Set Hotcue %1 Definir Hot Cue %1 - + Jump To Hotcue %1 Pular Para Hotcue %1 - + Jump To Hotcue %1 And Stop Pular Para Hotcue %1 e Parar - + Jump To Hotcue %1 And Play Pular Para Hotcue %1 e Tocar - + Preview Hotcue %1 Antevisão Hot Cue %1 - + Loop In Início de Loop - + Loop Out Final de Loop - + Loop Exit Saída do Loop - + Reloop/Exit Loop Reloop/Saída do Loop - + Loop Halve Divide o Loop pela Metade - + Loop Double Dobrar o Loop - + 1/32 1/32 - + 1/16 1/16 - + 1/8 - + 1/8 - + 1/4 - + 1/4 - + Move Loop +%1 Beats Mover Loop +%1 Batidas - + Move Loop -%1 Beats Mover Loop -%1 Batidas - + Loop %1 Beats Loop %1 Batidas - + Loop Roll %1 Beats Loopar Temporariamente %1 Batidas - + Add to Auto DJ Queue (bottom) Adicionar à fila do Auto DJ (embaixo) - + Append the selected track to the Auto DJ Queue Coloca a faixa selecionada no final da fila Auto DJ - + Add to Auto DJ Queue (top) Adicionar à Fila do Auto DJ (em cima) - + Prepend selected track to the Auto DJ Queue Adicionar a faixa selecionada no começo da fila do Auto DJ - + Load Track Carregar Faixa - + Load selected track Carregar faixa selecionada - + Load selected track and play Carrega a faixa selecionada e toca - - + + Record Mix Gravar Mixagem - + Toggle mix recording Alternar gravação da mistura - + Effects Efeitos - + Quick Effects Efeitos Rápidos - + Deck %1 Quick Effect Super Knob Leitor %1 Super Botão de Efeito Rápido - + Quick Effect Super Knob (control linked effect parameters) Super Botão de Efeito Rápido (controla os parâmetros do efeito a que está ligado) - - + + Quick Effect Efeito Rápido - + Clear Unit Limpar Unidade - + Clear effect unit Limpar unidade de efeitos - + Toggle Unit Alternar Unidade - + Dry/Wet Seco/Molhado - + Adjust the balance between the original (dry) and processed (wet) signal. Define o balançoentre o sinal original (seco) e o processado (molhado). - + Super Knob Super Botão - + Next Chain Próxima Cadeia - + Assign Atribuir - + Clear Limpar - + Clear the current effect Limpar o efeito corrente - + Toggle Ligar/Desligar - + Toggle the current effect Alternar o efeito corrente - + Next Próximo - + Switch to next effect Muda para o próximo efeito - + Previous Anterior - + Switch to the previous effect Comutar para o efeito anterior - + Next or Previous Próximo ou Anterior - + Switch to either next or previous effect Comutar quer para o próximo ou anterior efeito - - + + Parameter Value Valor Parâmetro - - + + Microphone Ducking Strength Força da Redução de Música do Microfone - + Microphone Ducking Mode Modo Talk-Over - + Gain Ganho - + Gain knob Botão de ganho - + Shuffle the content of the Auto DJ queue Reproduzir aleatoriamente o conteúdo da fila Auto DJ - + Skip the next track in the Auto DJ queue Salta a próxima faixa na fila do Auto DJ - + Auto DJ Toggle Ligar/Desligar Auto DJ - + Toggle Auto DJ On/Off Ligar/Desligar Auto DJ - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Mostra ou oculta o misturador. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Maximizar/Restaurar Biblioteca - + Maximize the track library to take up all the available screen space. Maximiza a biblioteca de faixas para ocupar todo o espaço disponível do ecrã. - + Effect Rack Show/Hide Mostrar/Ocultar Prateleira de Efeitos - + Show/hide the effect rack Mostra/Oculta a prateleira de efeitos - + Waveform Zoom Out Reduzir Forma de Onda @@ -2203,102 +2225,102 @@ trace - Above + Profiling messages Ganho dos auscultadores - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync Bater para sincronizar o tempo (e fase com a quantização validada), manter para permitir sincronização permanente - + One-time beat sync tempo (and phase with quantize enabled) Sincronizar o tempo da batida de uma só vez (e fase com a quantização validada) - + Playback Speed Velocidadede Leitura - + Playback speed control (Vinyl "Pitch" slider) Controle da velocidade da reprodução (Deslizante de "Pitch" do Vinil) - + Pitch (Musical key) Tom (Nota musical) - + Increase Speed Aumentar a Velocidade - + Adjust speed faster (coarse) Ajusta a velocidade mais rápida (grosseiro) - + Increase Speed (Fine) Aumentar Velocidade (Fino) - + Adjust speed faster (fine) Aumentar a velocidade (fino) - + Decrease Speed Diminuir a Velocidade - + Adjust speed slower (coarse) Ajusta a velocidade mais lenta (grosseiro) - + Adjust speed slower (fine) Ajusta a velocidade mais lenta (fino) - + Temporarily Increase Speed Temporariamente Aumentar a Velocidade - + Temporarily increase speed (coarse) Aumentar a velocidade temporariamente (grosseiro) - + Temporarily Increase Speed (Fine) Temporariamente Aumentar a Velocidade (Fino) - + Temporarily increase speed (fine) Temporariamente aumentar a velocidade (fino) - + Temporarily Decrease Speed Diminuir Velocidade Temporariamente - + Temporarily decrease speed (coarse) Diminuir a velocidade temporariamente (grosseiro) - + Temporarily Decrease Speed (Fine) Diminuir Velocidade Temporariamente (Fino) - + Temporarily decrease speed (fine) Diminuir a velocidade temporariamente (fino) @@ -2450,1053 +2472,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed Velocidade - + Decrease Speed (Fine) Diminuir velocidade (Fino) - + Pitch (Musical Key) Pitch (Tom musical) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock Bloqueio de Tom - + CUP (Cue + Play) CUP (Cue + Play, ou seja Cue + Toca a faixa) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats Loop de Batidas Selecionadas - + Create a beat loop of selected beat size Criar um loop de batidas do tamanho selecionado - + Loop Roll Selected Beats Loop Rolado Batidas Selecionadas - + Create a rolling beat loop of selected beat size Criar um loop rolado de batidas do tamanho selecionado - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In Ir para Loop In - + Go to Loop In button Botão de Ir para o Fim do Loop - + Go To Loop Out Ir para o Fim do Loop - + Go to Loop Out button Botão de Ir para o Fim do Loop - + Toggle loop on/off and jump to Loop In point if loop is behind play position Alterna entre ligar/desligar o loop e salta para o ponto Início de Loop, se o loop estiver atrás da posição de leitura - + Reloop And Stop Reloop e Parar - + Enable loop, jump to Loop In point, and stop Ativa o loop, salta para o ponto de Início de Loop, e pára. - + Halve the loop length Reduzir o loop pela metade - + Double the loop length Duplica o comprimento do loop - + Beat Jump / Loop Move Saltar Batidas / Mover Loop - + Jump / Move Loop Forward %1 Beats Saltar / Mover o Loop para a Frente %1 Batidas - + Jump / Move Loop Backward %1 Beats Saltar / Mover o Loop para Trás %1 Batidas - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats Saltar para a frente %1 batidas, ou se o loop estiver ativado, mover o loop para a frente %1 batidas - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats Saltar para trás %1 batidas, ou se o loop estiver ativado, mover o loop para trás %1 batidas - + Beat Jump / Loop Move Forward Selected Beats Saltar Batidas / Mover Loop Frente Batidas Selecionadas - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats Saltar para a frente do número de batidas selecionadas, ou se o loop estiver ativado, mover o loop para a frente o número de batidas selecionadas - + Beat Jump / Loop Move Backward Selected Beats Saltar Batida / Mover Loop Atraso Batidas Selecionadas - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats Saltar para trás o número de batidas selecionadas, ou se o loop estiver ativado, mover o loop para trás o número de batidas selecionadas - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navegação - + Move up Mover acima - + Equivalent to pressing the UP key on the keyboard Equivalente a pressionar a SETA ACIMA no teclado - + Move down Mover abaixo - + Equivalent to pressing the DOWN key on the keyboard Equivalente a pressionar a SETA ABAIXO no teclado - + Move up/down Mover acima/abaixo - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Move verticalmente em uma das direções usando um botão, como se pressionasse as teclas ACIMA/ABAIXO - + Scroll Up Rolar Cima - + Equivalent to pressing the PAGE UP key on the keyboard Equivalente a pressionar a tecla PAGE UP no teclado - + Scroll Down Rolar abaixo - + Equivalent to pressing the PAGE DOWN key on the keyboard Equivalente a pressionar a tecla PAGE DOWN no teclado - + Scroll up/down Rolar acima/abaixo - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Rolar verticalmente em uma das direções usando um botão, como se pressionasse as teclas PAGE UP/PAGE DOWN - + Move left Mover esquerda - + Equivalent to pressing the LEFT key on the keyboard Equivalente a pressionar a SETA À ESQUERDA no teclado - + Move right Mover direita - + Equivalent to pressing the RIGHT key on the keyboard Equivalente a pressionar a SETA À DIREITA no teclado - + Move left/right Mover à esquerda/direita - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Mova horizontalmente em uma das direções usando um botão, como ao pressionar as teclas ESQUERDA/DIREITA - + Move focus to right pane Move o foco ao painel da direita - + Equivalent to pressing the TAB key on the keyboard Equivalente a pressionar a tecla TAB no teclado - + Move focus to left pane Mover o foco para o painel da esquerda - + Equivalent to pressing the SHIFT+TAB key on the keyboard Equivalente a pressionar a tecla SHIFT+TAB no teclado - + Move focus to right/left pane Mover o foco para o painel direita/esquerda - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Move o foco um painel à direita ou esquerda usando um botão, como se pressionasse TAB/SHIFT-TAB - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item Ir para o item seleccionado correntemente - + Choose the currently selected item and advance forward one pane if appropriate Escolher o item seleccionado correntemente e avançar um para a frente - + Load Track and Play - + Add to Auto DJ Queue (replace) Adicionar à Fila Auto DJ (Substituir) - + Replace Auto DJ Queue with selected tracks Substituir Fila Auto DJ com as faixas selecionadas - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button Botão de Ativar Efeito Rápido no Leitor %1 - + Quick Effect Enable Button Botão de Ativar Efeito Rápido - + Enable or disable effect processing Ativar ou desativar processamento de efeitos - + Super Knob (control effects' Meta Knobs) Super Botão (controla os efeitos dos Meta Botões) - + Mix Mode Toggle Alternar Modo Mistura - + Toggle effect unit between D/W and D+W modes Alternar unidade de efeito entre os modos S/M e S+M - + Next chain preset Próxima cadeia predefinida - + Previous Chain Corrente Anterior - + Previous chain preset Prédefinição de corrente anterior - + Next/Previous Chain Próxima/Anterior Cadeia - + Next or previous chain preset Prédefinição da corrente seguinte ou anterior - - + + Show Effect Parameters Mostrar Parâmetros dos Efeitos - + Effect Unit Assignment - + Meta Knob Botão Meta - + Effect Meta Knob (control linked effect parameters) Meta Botão Efeitos (controla os parâmetros dos efeitos a que está ligado) - + Meta Knob Mode Modo Meta Botão - + Set how linked effect parameters change when turning the Meta Knob. Define como mudam os efeitos a que está ligado, quando se roda o Meta Botão. - + Meta Knob Mode Invert Inverter Modo Meta Botão - + Invert how linked effect parameters change when turning the Meta Knob. Inverter como mudam os efeitos a que está ligado, quando se roda o Meta Botão. - - + + Button Parameter Value - + Microphone / Auxiliary Microfone / Auxiliar - + Microphone On/Off Microfone Ligar/Desligar - + Microphone on/off Microfone ligar/desligar - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Alternar entre modos de redução de música do microfone (DESLIGADO, AUTOMÁTICO, MANUAL) - + Auxiliary On/Off Ligar/Desligar Auxiliar - + Auxiliary on/off Auxiliar ligar/desligar - + Auto DJ Auto DJ - + Auto DJ Shuffle Auto DJ Aleatório - + Auto DJ Skip Next Auto DJ Saltar Próxima - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Auto DJ Fade para Próxima - + Trigger the transition to the next track Inicia a transição para a próxima música - + User Interface Interface do Utilizador - + Samplers Show/Hide Samplers Mostrar/Ocultar - + Show/hide the sampler section Mostrar/ocultar a seção sampler - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. Fazer stream da sua mistura através da Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Controlo do Vinil Mostrar/Ocultar - + Show/hide the vinyl control section Mostra/oculta a seção de controlo do vinil - + Preview Deck Show/Hide Leitor de Antevisão Mostrar/Ocultar - + Show/hide the preview deck Mostrar/Ocultar o deck de pré-escuta - + Toggle 4 Decks Alternar 4 Leitores - + Switches between showing 2 decks and 4 decks. Comuta entre mostrar 2 leitores e 4 leitores. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Mostrar/Ocultar Vinil Giratório - + Show/hide spinning vinyl widget Mostra/oculta o widget simulador de gira discos a rodar - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Mostrar/esconder as ondas. - + Waveform zoom Aproximação das ondas - + Waveform Zoom Aproximação das Ondas - + Zoom waveform in Ampliar a forma de onda - + Waveform Zoom In Aproximar Ondas - + Zoom waveform out Reduzir a forma de onda - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3611,34 +3643,34 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Tente recuperar reiniciando o seu controlador. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. - + O código do script precisa de ser corrigido. @@ -3744,7 +3776,7 @@ trace - Above + Profiling messages Importar Caixa - + Export Crate Exportar Caixa @@ -3754,7 +3786,7 @@ trace - Above + Profiling messages Destravar - + An unknown error occurred while creating crate: Ocorreu um erro desconhecido ao criar a caixa: @@ -3763,12 +3795,6 @@ trace - Above + Profiling messages Rename Crate Renomear Caixa - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3786,17 +3812,17 @@ trace - Above + Profiling messages Renomeação da Caixa Falhou - + Crate Creation Failed Criação da Caixa Falhou - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Texto CSV (*.csv);;Documento de Texto (*.txt) - + M3U Playlist (*.m3u) Lista de Reprodução M3U (*.m3u) @@ -3805,6 +3831,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Uma ótima maneira para ajudar você a organizar as músicas que você quer tocar é a de colocar elas em caixas. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3916,12 +3948,12 @@ trace - Above + Profiling messages Colaboradores antigos - + Official Website - + Donate @@ -3939,7 +3971,7 @@ trace - Above + Profiling messages Unknown - + Desconhecido @@ -4102,7 +4134,7 @@ Shortcut: Shift+F9 Seconds - + Segundos @@ -4168,7 +4200,7 @@ crossfader, so that the intro starts at full volume. Repeat - + Repetir @@ -4256,7 +4288,9 @@ This can speed up beat detection on slower computers but may result in lower qua Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Converte batidas detectada pelo analisador em uma grade de batidas de tempo fixo. +Use esta configuração se suas faixas tem um tempo constante (como a maioria das músicas eletrônicas). +Frequentemente resulta em grades de batida de melhor qualidade, e não funciona direito em faixas que tem mudanças de tempo. @@ -4376,7 +4410,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Invert - + Inverter @@ -4434,42 +4468,45 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Se o mapeamento não estiver a funcionar tente validar uma opção avançada abaixo e depois tente o controlo de novo. Ou clique repetir para redetetar o controlo midi. - + Didn't get any midi messages. Please try again. - + Não recebi nenhuma mensagem MIDI. Por favor tente de novo. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Não foi possível detectar o mapeamento -- por favor tente de novo. Esteja certo de mexer apenas um controle de cada vez. - + Successfully mapped control: Controle mapeado com sucesso: - + <i>Ready to learn %1</i> <i>Pronto para aprender %1</i> - + Learning: %1. Now move a control on your controller. Aprendendo: %1. Agora mova o controle em seu controlador. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. You tried to learn: %1,%2 - + O controle que você clicou no Mixxx não pode ser mapeado. +Isso pode ser porque você está usando um tema antigo e esse controle não é mais suportado, ou você clicou em um controle que provê feedback visual e só pode ser mapeado em saídas como LEDs por meio de scripts. + +Você tentou mapear: %1,%2 @@ -4485,7 +4522,7 @@ You tried to learn: %1,%2 Developer Tools - + Ferramentas de Desenvolvimento @@ -4503,17 +4540,17 @@ You tried to learn: %1,%2 Descarga para csv - + Log Registo - + Search Procurar - + Stats Estatísticas @@ -4647,7 +4684,7 @@ You tried to learn: %1,%2 % - + % @@ -4736,7 +4773,7 @@ You tried to learn: %1,%2 Opus - + Opus @@ -4746,12 +4783,12 @@ You tried to learn: %1,%2 HE-AAC - + HE-AAC HE-AACv2 - + HE-AACv2 @@ -4839,7 +4876,7 @@ Two source connections to the same server that have the same mountpoint can not Mixxx Icecast Testing - + Mixxx Teste Icecast @@ -4909,7 +4946,7 @@ Two source connections to the same server that have the same mountpoint can not AIM - + AIM @@ -5000,7 +5037,7 @@ Two source connections to the same server that have the same mountpoint can not Login - + Login @@ -5100,7 +5137,7 @@ Two source connections to the same server that have the same mountpoint can not By hotcue number - + Por número do hotcue @@ -5134,7 +5171,7 @@ Two source connections to the same server that have the same mountpoint can not Hotcue palette - + Paleta de hotcue @@ -5166,114 +5203,114 @@ associated with each key. DlgPrefController - + Apply device settings? Aplicar definições do dispositivo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Suas configurações devem ser aplicadas antes de começar o assistente de configuração. Aplicar as configurações e continuar? - + None Nenhum - + %1 by %2 %1 por %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Solução de Problemas - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Limpar Mapeamentos de Entrada - + Are you sure you want to clear all input mappings? Tem a certeza que deseja limpar todas os mapeamentos de entrada? - + Clear Output Mappings Limpar Mapeamentos de Saída - + Are you sure you want to clear all output mappings? Tem certeza de que deseja limpar todos os mapeamentos de saída? @@ -5291,100 +5328,100 @@ Aplicar as configurações e continuar? Ativada - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Descrição: - + Support: Suporte: - + Screens preview - + Input Mappings Mapeamento de Entrada - - + + Search Pesquisa - - + + Add Adicionar - - + + Remove Remover @@ -5404,17 +5441,17 @@ Aplicar as configurações e continuar? - + Mapping Info - + Author: Autor: - + Name: Nome: @@ -5424,28 +5461,28 @@ Aplicar as configurações e continuar? Assistente de Configuração (Somente MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Limpar Tudo - + Output Mappings Mapeamentos de Saída @@ -5604,6 +5641,16 @@ Aplicar as configurações e continuar? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -5617,7 +5664,7 @@ Aplicar as configurações e continuar? Off - + Inactivo @@ -5750,7 +5797,7 @@ Aplicar as configurações e continuar? 16% - + 16% @@ -5899,7 +5946,7 @@ You can always drag-and-drop tracks on screen to clone a deck. Double-press Load button to clone playing track - + Pressione Carregar duas vezes para clonar uma faixa que está tocando @@ -6218,62 +6265,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. O tamanho mínimo da skin selecionada é maior do que a sua resolução de tela. - + Allow screensaver to run Permitir correr o protetor de ecrã - + Prevent screensaver from running Impedir correr o protetor de ecrã - + Prevent screensaver while playing Prevenir o protetor de tela quando tocando - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Esta Skin não suporta esquemas de cores - + Information Informação - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -6354,7 +6401,7 @@ and allows you to pitch adjust them for harmonic mixing. OpenKey - + OpenKey @@ -6364,7 +6411,7 @@ and allows you to pitch adjust them for harmonic mixing. Traditional - + Tradicional @@ -6721,7 +6768,7 @@ and allows you to pitch adjust them for harmonic mixing. 250 px - + 250 px @@ -6756,7 +6803,7 @@ and allows you to pitch adjust them for harmonic mixing. ... - + ... @@ -6874,7 +6921,7 @@ and allows you to pitch adjust them for harmonic mixing. Crossfader Preferences - + Preferências do Crossfader @@ -6899,7 +6946,7 @@ and allows you to pitch adjust them for harmonic mixing. Scratching - + Scratching @@ -6914,7 +6961,7 @@ and allows you to pitch adjust them for harmonic mixing. Reverse crossfader (Hamster Style) - + Crossfader Invertido (Estilo Hamster) @@ -6924,12 +6971,12 @@ and allows you to pitch adjust them for harmonic mixing. Only allow EQ knobs to control EQ-specific effects - + Apenas deixar botões de EQ controlarem efeitos de EQ Uncheck to allow any effect to be loaded into the EQ knobs. - + Desmarque para deixar qualquer efeito ser carregado para os botões de EQ @@ -6939,7 +6986,7 @@ and allows you to pitch adjust them for harmonic mixing. Uncheck to allow different decks to use different EQ effects. - + Desmarque para deixar decks usarem diferentes efeitos de EQ @@ -6959,17 +7006,17 @@ and allows you to pitch adjust them for harmonic mixing. When checked, EQs are not processed, improving performance on slower computers. - + Quando marcado, os EQs não são processados, melhorando a performance em computadores lentos. Resets the equalizers to their default values when loading a track. - + Redefine os equalizadores para os seus valores padrão ao carregar uma faixa. Reset equalizers on track load - + Redefinir os equalizadores ao carregar uma faixa @@ -7000,13 +7047,13 @@ and allows you to pitch adjust them for harmonic mixing. 16 Hz - + 16 Hz 20.05 kHz - + 20.05 kHz @@ -7113,12 +7160,12 @@ and allows you to pitch adjust them for harmonic mixing. 10ms - + 10ms 256 - + 256 @@ -7128,12 +7175,12 @@ and allows you to pitch adjust them for harmonic mixing. 100Hz - + 100Hz 250ms - + 250ms @@ -7217,7 +7264,7 @@ and allows you to pitch adjust them for harmonic mixing. Recordings directory invalid - + Diretório de gravações inválido @@ -7245,7 +7292,7 @@ and allows you to pitch adjust them for harmonic mixing. Recording Preferences - + Preferências Gravação @@ -7271,12 +7318,12 @@ and allows you to pitch adjust them for harmonic mixing. Author - + Autor Album - + Album @@ -7440,173 +7487,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Padrão (atraso longo) - + Experimental (no delay) Experimental (sem atraso) - + Disabled (short delay) Desativada (atraso curto) - + Soundcard Clock Relógio Placa de Som - + Network Clock Relógio da Rede - + Direct monitor (recording and broadcasting only) Monição direta (apenas gravação e emissão) - + Disabled Desativado - + Enabled Ativado - + Stereo Estéreo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) auto (<= 1024 quadros/período) - + 2048 frames/period 2048 quadros/período - + 4096 frames/period 4096 quadros/período - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. As entradas de microfone estão fora de tempo no sinal gravar e emitir comparado com o que ouve. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - - + Refer to the Mixxx User Manual for details. Consulte o Manual do Utilizador do Mixxx para detalhes. - + Configured latency has changed. A latência configurada foi alterada. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Volta a medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - + Realtime scheduling is enabled. O agendamento em tempo real está ativado. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Erro de configuração @@ -7624,131 +7670,131 @@ The loudness target is approximate and assumes track pregain and main output lev API de Som - + Sample Rate Taxa de Amostragem - + Audio Buffer Buffer de Áudio - + Engine Clock Relógio Motor - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Use o relógio da placa de som para montagens com audiência ao vivo e a menor latência.<br>Use o relógio de rede para emissões sem audiência ao vivo. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode Modo Monição Microfone - + Microphone Latency Compensation Compensação da Latência do Microfone - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Contagem Buffer Underflow - + 0 - + 0 - + Keylock/Pitch-Bending Engine Motor Keylock/Pitch-Bending - + Multi-Soundcard Synchronization Sincronização Multi-Soundcard - + Output Saída - + Input Entrada - + System Reported Latency Latência Relatada pelo Sistema - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Aumente o buffer de áudio se o contador de esvaziamentos aumentar ou se você ouvir estouros na reprodução. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Sugestões e Diagnósticos - + Downsize your audio buffer to improve Mixxx's responsiveness. Diminua o buffer de áudio para melhorar a capacidade de resposta do Mixxx. - + Query Devices Questionar os Dispositivos @@ -7817,7 +7863,7 @@ The loudness target is approximate and assumes track pregain and main output lev Vinyl Type - + Tipo do Vinil @@ -7827,12 +7873,12 @@ The loudness target is approximate and assumes track pregain and main output lev Deck 1 - + Deck 1 Deck 2 - + Deck 2 @@ -8196,47 +8242,47 @@ Selecione entre tipos diferentes de visualizações da forma de onda, o que dife DlgPreferences - + Sound Hardware Hardware de Som - + Controllers Controladores - + Library Biblioteca - + Interface Interface - + Waveforms Formas de Onda - + Mixer - + Mixer - + Auto DJ - + Auto DJ - + Decks Leitores - + Colors @@ -8268,50 +8314,50 @@ Selecione entre tipos diferentes de visualizações da forma de onda, o que dife &Ok Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - + &Ok - + Effects Efeitos - + Recording Gravação - + Beat Detection Deteção de Batidas - + Key Detection Deteção do Tom - + Normalization Normalização - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Controlo de Vinil - + Live Broadcasting Transmissão Ao Vivo - + Modplug Decoder Descodificador modplug @@ -8340,7 +8386,7 @@ Selecione entre tipos diferentes de visualizações da forma de onda, o que dife Recordings - + Gravações @@ -8444,7 +8490,7 @@ Selecione entre tipos diferentes de visualizações da forma de onda, o que dife MusicBrainz - + MusicBrainz @@ -8667,284 +8713,284 @@ This can not be undone! Resumo - + Filetype: Tipo de arquivo: - + BPM: BPM: - + Location: Localização: - + Bitrate: Taxa de Bits: - + Comments Comentários - + BPM BPM - + Sets the BPM to 75% of the current value. Define o BPM para 75% do valor presente. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Define o BPM para 50% do valor presente. - + Displays the BPM of the selected track. Mostra o BPM da faixa selecionada. - + Track # Faixa # - + Album Artist Artista do Álbum - + Composer Compositor - + Title Título - + Grouping Agrupamento - + Key Tom - + Year Ano - + Artist Artista - + Album Album - + Genre Gênero - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. Define o BPM para 200% do valor presente. - + Double BPM Dobrar o BPM - + Halve BPM Reduzir a Metade BPM - + Clear BPM and Beatgrid Limpar BPM e Grade de Batidas - + Move to the previous item. "Previous" button Mover para o item anterior. - + &Previous &Anterior - + Move to the next item. "Next" button Mover para o próximo item. - + &Next &Próximo - + Duration: Duração: - + Import Metadata from MusicBrainz Importar Metadados de MusicBrainz - + Re-Import Metadata from file - + Color cor - + Date added: - + Open in File Browser Abrir no Explorador de Ficheiros - + Samplerate: - + Track BPM: BPM da Faixa: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo Assumir tempo constante - + Sets the BPM to 66% of the current value. Define o BPM para 66% do valor presente. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. Define o BPM para 150% do valor presente. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. Define o BPM para 133% do valor presente. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Bater com o ritmo, para definir o BPM igual à velocidade com que está a bater. - + Tap to Beat Toque a Batida - + Hint: Use the Library Analyze view to run BPM detection. Sugestão: Usar a vista Analisador de Biblioteca para executar a deteção de BPM. - + Save changes and close the window. "OK" button Salva as alterações e fechar a janela. - + &OK &OK - + Discard changes and close the window. "Cancel" button Rejeita as alterações e fecha a janela. - + Save changes and keep the window open. "Apply" button Guarda as alterações e mantém a janela aberta. - + &Apply &Aplicar - + &Cancel &Cancelar - + (no color) @@ -9101,7 +9147,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9303,27 +9349,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (mais rápido) - + Rubberband (better) Rubberband (melhor) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9409,7 +9455,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Album - + Album @@ -9538,15 +9584,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Modo Segurança Ativado - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9558,57 +9604,57 @@ Shown when VuMeter can not be displayed. Please keep OpenGL - + activate ativar - + toggle comutar - + right direita - + left esquerda - + right small direita curto - + left small esquerda curto - + up cima - + down abaixo - + up small cima curto - + down small abaixo pequeno - + Shortcut Atalho @@ -9616,62 +9662,62 @@ OpenGL Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9681,22 +9727,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importar Lista de Reprodução - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Ficheiros Playlist (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9719,12 +9765,12 @@ Do you really want to overwrite it? Cancel - + Cancelar Scanning: - + A Examinar: @@ -9743,27 +9789,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) não encontrado - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Alguns LEDs ou outros retornos podem não funcionar corretamente. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Marcar para ver se os nomes dos MixxxControl estão escritos corretamente no arquivo de mapeamento (.xml) @@ -9823,18 +9869,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Faixas Perdidas - + Hidden Tracks Músicas Ocultadas - Export to Engine Prime + Export to Engine DJ @@ -9846,210 +9892,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Dispositivo de Som Ocupado - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Tentar novamente</b> após fechar a outra aplicação ou reconectar um dispositivo de som - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurar</b> as definições dos dispositivos de som do Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Obter <b>Ajuda</b> a partir do Wiki Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Sair</b> do Mixxx. - + Retry Repetir - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigurar - + Help Ajuda - - + + Exit Sair - - + + Mixxx was unable to open all the configured sound devices. Mixxx não foi capaz de abrir todos os dispositivos de som configurados. - + Sound Device Error Erro Dispositivo de Som - + <b>Retry</b> after fixing an issue <b>Tentar novamente</b> depois de corrigir um problema - + No Output Devices Sem Dispositivos de Saída - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. O Mixxx foi configurado sem quaisquer dispositivos de saída de som. O processamento de audio será desativado sem a configuração de um dispositivo de saída. - + <b>Continue</b> without any outputs. <b>Continuar</b> sem quaisquer saídas. - + Continue Continuar - + Load track to Deck %1 Carregar faixa no Deck %1 - + Deck %1 is currently playing a track. O Leitor %1 está presentemente a reproduzir uma faixa. - + Are you sure you want to load a new track? Tem certeza de que deseja carregar uma nova faixa? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Não existe nenhum dispositivo selecionado para este controlo do vinil. Por favor, selecione primeiro um dispositivo de entrada, nas preferências de hardware de som. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Não existe nenhum dispositivo de entrada selecionado para este controlo passthrough. Por favor, selecione primeiro um dispositivo de entrada, nas preferências de hardware de som. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Erro no arquivo de skin - + The selected skin cannot be loaded. A skin selecionada não pôde ser carregada. - + OpenGL Direct Rendering Interpretação Direta de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar a Saída - + A deck is currently playing. Exit Mixxx? Um leitor está presentemente em reprodução. Sair do Mixxx? - + A sampler is currently playing. Exit Mixxx? Um sampler está presentemente em reprodução. Sair do Mixxx? - + The preferences window is still open. A janela de preferências ainda está aberta. - + Discard any changes and exit Mixxx? Descartar quaisquer mudanças e sair do Mixxx? @@ -10065,15 +10152,15 @@ Do you want to select an input device? PlaylistFeature - + Lock Travar - - + + Playlists - + Listas de Reprodução @@ -10081,32 +10168,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Desbloquear - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJs constroem listas de reprodução antes de apresentações ao vivo, mas outros preferem construí-las na hora. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Ao utilizar uma lista de reprodução durante uma apresentação ao vivo, lembre-se de sempre prestar atenção em como o público reage à música que você escolheu tocar. - + Create New Playlist Criar uma Playlist Nova @@ -10308,7 +10421,7 @@ Deseja examinar a sua biblioteca para encontrar ficheiros de capa de disco, agor Rot64 - + Rot64 @@ -10358,7 +10471,7 @@ Deseja examinar a sua biblioteca para encontrar ficheiros de capa de disco, agor Script - + Script @@ -10504,7 +10617,7 @@ If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx Downsampling - + Decimação @@ -10732,7 +10845,7 @@ Com a largura a zero, permite o varrimento manual ao longo de toda a extensão d Regen - + Regen @@ -11143,12 +11256,12 @@ Valores mais altos resultam em menos atenuação das altas frequências. Ctrl+u - + Ctrl+u Ctrl+i - + Ctrl+i @@ -11158,7 +11271,7 @@ Valores mais altos resultam em menos atenuação das altas frequências. Ctrl+Shift+O - + Ctrl+Shift+O @@ -11188,7 +11301,7 @@ Valores mais altos resultam em menos atenuação das altas frequências. LinkwitzRiley8 Isolator - + LinkwitzRiley8 Isolator @@ -11208,7 +11321,7 @@ Valores mais altos resultam em menos atenuação das altas frequências. BQ EQ - + BQ EQ @@ -11228,7 +11341,7 @@ Valores mais altos resultam em menos atenuação das altas frequências. BQ EQ/ISO - + BQ EQ/ISO @@ -11429,7 +11542,7 @@ um Q mais alto afecta uma banda mais estreita de frequências. Q 2 - + Q 2 @@ -11583,7 +11696,7 @@ Tudo direita: fim do período do efeito Dry/Wet - + Seco/Molhado @@ -11623,7 +11736,7 @@ Tudo direita: fim do período do efeito - + Deck %1 Leitor %1 @@ -11756,7 +11869,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Transpassar @@ -11787,7 +11900,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11920,12 +12033,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11960,42 +12073,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12018,7 +12131,7 @@ may introduce a 'pumping' effect and/or distortion. There is less than 1 GiB of usable space in the recording folder - + Há menos de 1 GiB de espaço utilizável na pasta de gravação @@ -12053,54 +12166,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists - + Listas de Reprodução - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + Cues de memória - + (loading) Rekordbox (carregando) Rekordbox @@ -12169,7 +12282,7 @@ may introduce a 'pumping' effect and/or distortion. Tracks - + Faixas @@ -12509,7 +12622,7 @@ may introduce a 'pumping' effect and/or distortion. Min - + Min @@ -12659,7 +12772,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Rotação do Vinil @@ -12731,7 +12844,7 @@ may introduce a 'pumping' effect and/or distortion. Indicates when the signal on the auxiliary is clipping, - + Indica quando o sinal auxiliar está clipando. @@ -12756,7 +12869,7 @@ may introduce a 'pumping' effect and/or distortion. Crossfader - + Crossfader @@ -12841,7 +12954,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Capa do Disco @@ -13038,7 +13151,7 @@ may introduce a 'pumping' effect and/or distortion. Tempo - + Tempo @@ -13077,197 +13190,197 @@ may introduce a 'pumping' effect and/or distortion. Quando batido, ajusta o BPM médio para cima de uma pequena quantidade. - + Adjust Beats Earlier Ajustar Batidas Cedo - + When tapped, moves the beatgrid left by a small amount. Quando pressionado, move a grade de batidas um pouco para a esquerda. - + Adjust Beats Later Ajustar Batidas Tarde - + When tapped, moves the beatgrid right by a small amount. Quando batido, move a grelha de batidas para a direita, uma pequena quantidade. - + Tempo and BPM Tap Bate Tempo e BPM - + Show/hide the spinning vinyl section. Mostrar/ocultar a seção rotação de vinil. - + Keylock Trava de Tom - + Toggling keylock during playback may result in a momentary audio glitch. Alternar o bloqueio de tom durante a reprodução pode resultar em falhas momentâneas do audio. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control Alterna a visibilidade do Controlo da Taxa - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. Coloca um ponto de sinalização na posição atual na forma de onda. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). Pára a faixa no CUE Point, OU vai para o CUE Point e reproduz a faixa após soltar o botão (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). Define o CUE point (em modo Pioneer/Mixxx/Numark), define o CUE point e toca após largar a tecla (modo CUP) OU escuta o preview (modo Denon). - + Is latching the playing state. - + Seeks the track to the cue point and stops. Avança a faixa até ao Cue Point e para. - + Play Tocar - + Plays track from the cue point. Toca a faixa a partir do ponto de marcação. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. Altera a velocidade da faixa (afeta o tempo e o pitch). Se o keylock estiver ativo, apenas o tempo é alterado. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Mostra o alcance atual do deslizante de tempo. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration Duração da Gravação @@ -13417,7 +13530,7 @@ may introduce a 'pumping' effect and/or distortion. Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - + Auto: Define o quanto reduzir o volume da música quando o volume de microfones ativos passa de um determinado limite. @@ -13505,928 +13618,934 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. Mostra a duração da gravação em andamento. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. Define o marcador Início Loop da faixa para a atual posição de reprodução. - + Press and hold to move Loop-In Marker. Pressione e mantenha para mover o marcador Início Loop. - + Jump to Loop-In Marker. Saltar para o marcador Início Loop. - + Sets the track Loop-Out Marker to the current play position. Define o marcador Fim Loop para a atual posição de reprodução. - + Press and hold to move Loop-Out Marker. Pressione e mantenha para mover o marcador Fim Loop. - + Jump to Loop-Out Marker. Saltar para o marcador Fim Loop. - + If the track has no beats the unit is seconds. - + Beatloop Size Tamanho Loop - + Select the size of the loop in beats to set with the Beatloop button. Escolher o tamanho do loop em batidas estabelecer com o botão Loop. - + Changing this resizes the loop if the loop already matches this size. Alterando isto redimensiona o loop se o loop já coincide com este tamanho. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. Reduz a metade o tamanho dum loop existente, ou reduz a metade o tamanho do próximo loop definido com o botão Loop. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. Duplica o tamanho dum loop existente, ou duplica o tamanho do próximo loop definido com o botão Loop. - + Start a loop over the set number of beats. Iniciar um loop com o número de batidas prédefinidas. - + Temporarily enable a rolling loop over the set number of beats. Ativar temporariamente um loop rolado com o número de batidas prédefinidas. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size Beatjump/Loop Tamanho Movimento - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. Selecione o número de batidas a saltar ou a deslocar o loop com os botões Beatjump Frente/Atrás. - + Beatjump Forward Beatjump Frente - + Jump forward by the set number of beats. Salta para a frente o número de batidas predefinidas. - + Move the loop forward by the set number of beats. Move o loop para a frente o número de batidas prédefinidas. - + Jump forward by 1 beat. Salta para a frente 1 batida. - + Move the loop forward by 1 beat. Move o loop para a frente 1 batida. - + Beatjump Backward Beatjump Atrás - + Jump backward by the set number of beats. Salta para trás o número de batidas prédefinidas. - + Move the loop backward by the set number of beats. Move o loop para trás o número de batidas prédefinidas. - + Jump backward by 1 beat. Salta para trás 1 batida. - + Move the loop backward by 1 beat. Move o loop para trás 1 batida. - + Reloop Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. Se o loop estiver à frente da posição atual de reprodução, o ciclo de looping começará quando o loop for atingido. - + Works only if Loop-In and Loop-Out Marker are set. Funciona apenas se os marcadores de Início Loop e Fim Loop estiverem definidos. - + Enable loop, jump to Loop-In Marker, and stop playback. Ativar loop, saltar para o marcador Início Loop, e parar a reprodução. - + Displays the elapsed and/or remaining time of the track loaded. Mostra o tempo executado e/ou restante da faixa carregada. - + Click to toggle between time elapsed/remaining time/both. Clique para alternar entre tempo executado/restante tempo/ambos. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix Mistura - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit Ajustar a mistura do sinal seco (entrada) com o molhado (saída) da unidade de efeito - + D/W mode: Crossfade between dry and wet Modo S/M: crossfade entre seco e molhado - + D+W mode: Add wet to dry Modo S/M: adicionar molhado ao seco - + Mix Mode Modo Mistura - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit Ajustar a mistura do sinal seco (entrada) com o sinal molhado (saída) da unidade de efeito - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. Modo Seco/Molhado (linhas cruzadas): o botão de Mistura faz a transição entre seco e molhado. Usar isto para alterar o som da faixa com EQ e filtros de efeitos. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. Modo Seco+Molhado (linha seca plana): o botão de Mistura adiciona o molhado ao seco. Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtros de efeitos. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. Envia o bus esquerdo do crossfader através desta unidade de efeito. - + Route the right crossfader bus through this effect unit. Envia o bus direito do crossfader através desta unidade de efeito. - + Right side active: parameter moves with right half of Meta Knob turn Lado direito ativo: o parâmetro muda com meia volta para a direita do Botão Meta - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu Menu Definições Skin - + Show/hide skin settings menu Mostra/Oculta menu de definições. - + Save Sampler Bank Salvar Banco do Sampler - + Save the collection of samples loaded in the samplers. Guarda a colecção de samples carregadas nos samplers. - + Load Sampler Bank Carregar o Banco de Amostras - + Load a previously saved collection of samples into the samplers. Carrega uma colecção de samples guardada previamente nos samplers. - + Show Effect Parameters Mostrar Parâmetros do Efeito - + Enable Effect Ativar Efeito - + Meta Knob Link Ligação Botão Meta - + Set how this parameter is linked to the effect's Meta Knob. Definir como este parâmetro está ligado ao botão de efeitos Meta. - + Meta Knob Link Inversion Inversão Ligação Botão Mega - + Inverts the direction this parameter moves when turning the effect's Meta Knob. Inverte a direção com que este parâmetro se move quando se roda o Botão Meta. - + Super Knob Super Botão - + Next Chain Próxima Cadeia - + Previous Chain Cadeia Anterior - + Next/Previous Chain Próxima/Anterior Cadeia - + Clear Limpar - + Clear the current effect. Limpa o efeito presente. - + Toggle Alternar - + Toggle the current effect. Alterna o efeito presente. - + Next Próximo - + Clear Unit Limpar Unidade - + Clear effect unit. Limpa a unidade de efeito. - + Show/hide parameters for effects in this unit. Mostra/Oculta parâmetros para efeitos nesta unidade. - + Toggle Unit Alternar Unidade - + Enable or disable this whole effect unit. Ativa ou desativa esta unidade completa de efeito. - + Controls the Meta Knob of all effects in this unit together. Controla o Meta Botão de todos os efeitos conjuntamente nesta unidade. - + Load next effect chain preset into this effect unit. Carrega a próxima cadeia de efeitos prédefinida nesta unidade de efeito. - + Load previous effect chain preset into this effect unit. Carrega a anterior cadeia de efeitos prédefinida nesta unidade de efeito. - + Load next or previous effect chain preset into this effect unit. Carrega a próxima ou anterior cadeia de efeitos prédefinida nesta unidade de efeito. - - - - + + + + Assign Effect Unit Atribuir Unidade de Efeito - + Assign this effect unit to the channel output. Atribuir esta unidade de efeito ao canal de saída. - + Route the headphone channel through this effect unit. Encaminha o canal de auscultadores através desta unidade de efeito. - + Route this deck through the indicated effect unit. Encaminha este leitor através da unidade de efeito indicada. - + Route this sampler through the indicated effect unit. Encaminha este sampler através da unidade de efeito indicada. - + Route this microphone through the indicated effect unit. Encaminha este microfone através da unidade de efeito indicada. - + Route this auxiliary input through the indicated effect unit. Encaminha esta entrada auxiliar através da unidade de efeito indicada. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. Esta unidade de efeito deve também ser atribuída a um leitor ou a outra fonte sonora para ouvir o efeito. - + Switch to the next effect. Comuta para o próximo efeito. - + Previous Anterior - + Switch to the previous effect. Troca para o efeito anterior. - + Next or Previous Próximo ou Anterior - + Switch to either the next or previous effect. Comuta ou para o próximo efeito, ou efeito anterior. - + Meta Knob Botão Meta - + Controls linked parameters of this effect Controla os parâmetros deste efeito aqui ligado. - + Effect Focus Button Botão Realce Efeito - + Focuses this effect. Realça este efeito. - + Unfocuses this effect. Anula o realce deste efeito. - + Refer to the web page on the Mixxx wiki for your controller for more information. Consultar a página web na wiki Mixxx para mais informação sobre o seu controlador. - + Effect Parameter Parâmetro Efeito - + Adjusts a parameter of the effect. Ajusta um parâmetro do efeito. - + Inactive: parameter not linked Inativo: parâmetro não ligado - + Active: parameter moves with Meta Knob Activo: o parâmetro move-se com o Botão Meta - + Left side active: parameter moves with left half of Meta Knob turn Lado esquerdo ativo: o parâmetro move-se com meia volta para a esquerda do Botão Meta - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half Lado esquerdo e direito ativo: o parâmetro desloca-se ao longo da sua extensão com meia volta do Botão Meta e para trás com a outra meia volta. - - + + Equalizer Parameter Kill Matar Parâmetro do Equalizador - - + + Holds the gain of the EQ to zero while active. Mantem o ganho do equalizador em zero quanto ativo. - + Quick Effect Super Knob Super Botão de Efeito Rápido - + Quick Effect Super Knob (control linked effect parameters). Super Botão de Efeito Rápido (controla parâmetros de efeitos conectados). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. Sugestão: Alterar o modo Efeito Rápido padrão em Preferências -> Equalizadores. - + Equalizer Parameter Parâmetro Equalizador - + Adjusts the gain of the EQ filter. Ajusta o ganho do filtro EQ. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Dica: Mude o modo padrão do equalizador em Preferências -> Equalizadores. - - + + Adjust Beatgrid Ajustar Grelha de Batidas - + Adjust beatgrid so the closest beat is aligned with the current play position. Ajusta a grade de batidas de forma que a batida mais próxima é alinhada com a posição atual. - - + + Adjust beatgrid to match another playing deck. Ajusta a grelha de batidas para corresponder um outro leitor em reprodução. - + If quantize is enabled, snaps to the nearest beat. Se a quantização estiver ativa agarra-se à batida mais próxima. - + Quantize Quantização - + Toggles quantization. Alternar a quantização. - + Loops and cues snap to the nearest beat when quantization is enabled. Enquanto a quantização estiver ativada, os loops e os hotcues sempre entrarão na batida mais próxima. - + Reverse Inverter - + Reverses track playback during regular playback. Inverte a reprodução da faixa. - + Puts a track into reverse while being held (Censor). Coloca a faixa em reprodução invertida enquanto pressionado (Censurar). - + Playback continues where the track would have been if it had not been temporarily reversed. A reprodução continua onde a faixa estaria se ela não estivesse sido temporariamente invertida. - - - + + + Play/Pause Tocar/Pausar - + Jumps to the beginning of the track. Pula para o início da faixa. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Sincroniza o tempo (BPM) e a fase para a da outra faixa, ou BPM se detectado nos dois. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. Sincroniza o tempo (BPM) com o da outra faixa, se o BPM for detetado em ambas. - + Sync and Reset Key Sincronizar e Reiniciar Tom - + Increases the pitch by one semitone. Aumenta a tonalidade de um meio tom. - + Decreases the pitch by one semitone. Diminui o pitch por um semitom. - + Enable Vinyl Control Ativar Controlo de Vinil - + When disabled, the track is controlled by Mixxx playback controls. Quando desativado, a faixa é controlada pelos controlos de reprodução do Mixxx. - + When enabled, the track responds to external vinyl control. Quando ativado, a faixa responde ao controle por vinil externo - + Enable Passthrough Ativar Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Indica que o buffer de áudio é muito pequeno para fazer todo o processamento de aúdio. - + Displays cover artwork of the loaded track. Mostra a capa do disco na faixa carregada. - + Displays options for editing cover artwork. Mostra as opções para edição da capa do disco. - + Star Rating Classificação Estrelas - + Assign ratings to individual tracks by clicking the stars. Atribui classificações a faixas individuais clicando nas estrelas. @@ -14561,33 +14680,33 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr Amplitude da Redução no Talkover - + Prevents the pitch from changing when the rate changes. Impede a mudança de tom quando a velocidade é alterada. - + Changes the number of hotcue buttons displayed in the deck Altera o número de botões hotcue mostrados no leitor - + Starts playing from the beginning of the track. Começa a tocar do começo da faixa. - + Jumps to the beginning of the track and stops. Pula para o começo da faixa e para. - - + + Plays or pauses the track. Toca ou pausa uma música. - + (while playing) (durante a leitura) @@ -14607,215 +14726,215 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr - + (while stopped) (enquanto parada) - + Cue Marcação - + Headphone Auscultador - + Mute Silênciar - + Old Synchronize Sincronização Antiga - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Sincroniza com o primeiro deck (em ordem numérica) que estiver tocando uma faixa e tem BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Se nenhum leitor estiver em reprodução, sincroniza com o primeiro leitor que tenha um BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Os leitores não se podem sincronizar com samplers, e os samplers só se podem sincronizar com os leitores. - + Hold for at least a second to enable sync lock for this deck. Manter premido, por pelo menos um segundo, para ativar o bloqueio de sincronização para este leitor. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Os leitores com sincronização bloqueada tocam todos no mesmo tempo, e os leitores que também tiverem a quantização ativada terão sempre as suas batidas alinhadas. - + Resets the key to the original track key. Reinicia o tom, para o tom original da faixa. - + Speed Control Controlo de Velocidade - - - + + + Changes the track pitch independent of the tempo. Muda o pitch da faixa independentemente do tempo. - + Increases the pitch by 10 cents. Aumenta o tom de 10 centésimos. - + Decreases the pitch by 10 cents. Diminui o tom de 10 centésimos. - + Pitch Adjust Ajustar Tom - + Adjust the pitch in addition to the speed slider pitch. Adiciona o ajuste de tom ao cursor de velocidade. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Gravar Mistura - + Toggle mix recording. Alternar gravação da mistura. - + Enable Live Broadcasting Ativar Emissão em Direto - + Stream your mix over the Internet. Fazer stream da sua mistura através da Internet. - + Provides visual feedback for Live Broadcasting status: Provê retorno visual para o estado de Transmissão Ao Vivo: - + disabled, connecting, connected, failure. desativado, conectando, conectado, falha. - + When enabled, the deck directly plays the audio arriving on the vinyl input. Quando ativada, o leitor toca o audio que chega diretamente à entrada do vinil. - + Playback will resume where the track would have been if it had not entered the loop. A reprodução será retomada onda a faixa estaria se não tivesse entrado em loop. - + Loop Exit Sair do Loop - + Turns the current loop off. Apaga o presente loop. - + Slip Mode Modo de Deslizamento - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Quando ativo, a execução continua silenciosa no fundo durante um loop, reprodução invertida, um scratch, etc. - + Once disabled, the audible playback will resume where the track would have been. Uma vez desativado, a execução audível continuará onde a música estaria. - + Track Key The musical key of a track Tom da Faixa - + Displays the musical key of the loaded track. Mostra o tom musical da faixa carregada. - + Clock Relógio - + Displays the current time. Mostra a hora presente. - + Audio Latency Usage Meter Medidor do Uso da Latência Audio - + Displays the fraction of latency used for audio processing. Mostra a fração da latência usada no processamento de audio. - + A high value indicates that audible glitches are likely. Um valor alto indica que ruídos no áudio são prováveis. - + Do not enable keylock, effects or additional decks in this situation. Não ative bloqueio de tom, efeitos ou leitores adicionais nesta situação. - + Audio Latency Overload Indicator Indicador de Sobrecarga de Latência Audio @@ -14860,254 +14979,254 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr Mostra o tom musical corrente da faixa carregada, após movimentação do cursor de velocidade/tom. - + Fast Rewind Retrocesso Rápido - + Fast rewind through the track. Rebobina a música rapidamente. - + Fast Forward Avanço Rápido - + Fast forward through the track. Avanço rápido através da faixa. - + Jumps to the end of the track. Salta para o fim da faixa. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. Define a tonalidade para um tom que permita uma transição harmónica para outra faixa. Requer ter sido detetado um tom em ambos os leitores envolvidos. - - - + + + Pitch Control Controle do Pitch - + Pitch Rate Variação da Velocidade - + Displays the current playback rate of the track. Mostra a taxa de reprodução da música em execução. - + Repeat Repetir - + When active the track will repeat if you go past the end or reverse before the start. Quando ativo, a música vai repetir se você passar do final ou inverter a reprodução antes do início. - + Eject Extrair - + Ejects track from the player. Extrai a faixa do leitor. - + Hotcue Hot Cue - + If hotcue is set, jumps to the hotcue. Se a hot cue estiver definida, salta para a hot cue. - + If hotcue is not set, sets the hotcue to the current play position. Se a hot cue não estiver definida, define a hot cue para a atual posição a tocar. - + Vinyl Control Mode Modo Controlo do Vinil - + Absolute mode - track position equals needle position and speed. Modo absoluto - a posição da faixa é igual à posição e velocidade da agulha. - + Relative mode - track speed equals needle speed regardless of needle position. Modo relativo - a velocidade da faixa é igual à da agulha, independente da posição. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Modo Constante - a velocidade da faixa é igual à última velocidade estável conhecida, independentemente da informação de entrada da agulha. - + Vinyl Status Estado do Vinil - + Provides visual feedback for vinyl control status: Provê retorno visual para o estado do controle por vinil: - + Green for control enabled. Verde quando o controle estiver ativado. - + Blinking yellow for when the needle reaches the end of the record. Amarelo piscante quando a agulha estiver no fim do disco. - + Loop-In Marker Marcador de Início Loop - + Loop-Out Marker Marca de Saída do Loop - + Loop Halve Reduzir a Metade Loop - + Halves the current loop's length by moving the end marker. Diminui o comprimento atual do loop pela metade movendo a marca de saída. - + Deck immediately loops if past the new endpoint. O leitor entra em loop imediatamente, se ultrapassar o novo ponto final. - + Loop Double Duplicar Loop - + Doubles the current loop's length by moving the end marker. Dobra o comprimento do loop atual movendo a marca de saída. - + Beatloop Loop de Batida - + Toggles the current loop on or off. Alterna entre ligar/desligar o loop corrente. - + Works only if Loop-In and Loop-Out marker are set. Funciona apenas se os marcadores de Início Loop e Fim Loop estiverem definidos. - + Vinyl Cueing Mode Modo de Cue do Vinil - + Determines how cue points are treated in vinyl control Relative mode: Determina como os pontos de marcação são tratados no modo Relativo do controlo de vinil: - + Off - Cue points ignored. Off - Pontos de marcação ignorados. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Único - Se a agulha for solta depois doponto cue, a faixa vai até aquele ponto cue. - + Track Time Tempo da Faixa - + Track Duration Duração Faixa - + Displays the duration of the loaded track. Mostra a duração da faixa carregada. - + Information is loaded from the track's metadata tags. A informação é carregada a partir das etiquetas de metadados da faixa. - + Track Artist Artista da Faixa - + Displays the artist of the loaded track. Mostra o artista da faixa carregada. - + Track Title Título da Faixa - + Displays the title of the loaded track. Mostra o título da faixa carregada. - + Track Album Album Faixa - + Displays the album name of the loaded track. Mostra o nome do álbum da faixa carregada. - + Track Artist/Title Artista/Título da Faixa - + Displays the artist and title of the loaded track. Mostra o artista e o título da faixa carregada. @@ -15115,12 +15234,12 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr TrackCollection - + Hiding tracks Ocultar faixas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? As faixas selecionadas estão na seguintes playlists: %1 Ocultando-as serão removidas destas playlists. Continuar? @@ -15173,7 +15292,7 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr Export Track Files To - + Exportar Faixas Para @@ -15262,7 +15381,7 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr Time until charged: %1 - + Tempo até carregada: %1 @@ -15272,7 +15391,7 @@ Usar isto para alterar apenas o sinal já com os efeitos (molhado) de EQ e filtr Battery fully charged. - + Bateria totalmente carregada. @@ -15335,47 +15454,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15409,7 +15528,7 @@ This can not be undone! %1: %2 %1 = effect name; %2 = effect description - + %1: %2 @@ -15500,323 +15619,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Criar &Playlist Nova - + Create a new playlist Criar uma nova lista de reprodução - + Ctrl+n Ctrl+n - + Create New &Crate Criar Nova &Caixa - + Create a new crate Criar uma caixa nova - + Ctrl+Shift+N - + Ctrl+Shift+N - - + + &View &Exibir - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Pode não ser suportado em todas as skins. - + Show Skin Settings Menu Mostrar Menu de Configurações do Tema - + Show the Skin Settings Menu of the currently selected Skin Mostra o menu das configurações do tema do tema atualmente selecionado - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Mostrar Seção do Microfone - + Show the microphone section of the Mixxx interface. Mostra a seção microfone do interface Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section - + Ctrl+2 - + Show Vinyl Control Section Mostra Seção Controlo do Vinil - + Show the vinyl control section of the Mixxx interface. Mostra a seção controlo de vinil do interface Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Ctrl+3 - + Show Preview Deck Mostrar Leitor Antevisão - + Show the preview deck in the Mixxx interface. Mostra o leitor de antevisão no interface Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck - + Ctrl+4 - + Show Cover Art Mostrar Capa - + Show cover art in the Mixxx interface. Mostrar as capas dos discos no interface Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art - + Ctrl+6 - + Maximize Library Maximizar Biblioteca - + Maximize the track library to take up all the available screen space. Maximiza a biblioteca de faixas para ocupar todo o espaço disponível do ecrã. - + Space Menubar|View|Maximize Library Espaço - + &Full Screen Te&la cheia - + Display Mixxx using the full screen Mostrar o Mixxx utilizando o ecrã inteiro. - + &Options &Opções - + &Vinyl Control Controlo de &Vinil - + Use timecoded vinyls on external turntables to control Mixxx Use vinils com timecode em toca-discos externos para controlar o Mixxx - + Enable Vinyl Control &%1 Ativar Controlo do Vinil &%1 - + &Record Mix &Gravar Mistura - + Record your mix to a file Grave sua mixagem para um arquivo - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Ativar Transmissão Ao &Vivo - + Stream your mixes to a shoutcast or icecast server Difunda as suas misturas via um servidor de "shoutcast" ou "icecast" - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Ativar Atalhos de Teclado - + Toggles keyboard shortcuts on or off Alterna entre ligar/desligar os atalhos de teclado. - + Ctrl+` Ctrl+` - + &Preferences &Preferências - + Change Mixxx settings (e.g. playback, MIDI, controls) Muda as configurações do Mixxx (ex.: reprodução, MIDI, controles) - + &Developer &Desenvolvedor - + &Reload Skin &Recarregar Skin - + Reload the skin Recarregar a skin - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools &Ferramentas do Desenvolvedor - + Opens the developer tools dialog Abre o diálogo das ferramentas do desenvolvedor - + Ctrl+Shift+T - + Ctrl+Shift+T - + Stats: &Experiment Bucket Dados: Balde de &Experimento - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Ativa o modo Experiências. Coleta estatísticas no balde de rastreio EXPERIÊNCIAS. - + Ctrl+Shift+E - + Ctrl+Shift+E - + Stats: &Base Bucket Estatísticas: &Balde Base - + Enables base mode. Collects stats in the BASE tracking bucket. Ativa o modo Base. Coleta estatísticas no balde de rastreio BASE. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Deb&ugger Ativado - + Enables the debugger during skin parsing Ativa o debugger enquanto a skin estiver sendo analisada - + Ctrl+Shift+D - + Ctrl+Shift+D - + &Help &Ajuda - + Show Keywheel menu title @@ -15833,74 +15982,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + F12 - + &Community Support &Apoio da Comunidade - + Get help with Mixxx Obter ajuda com o Mixxx - + &User Manual Manual do &Utilizador - + Read the Mixxx user manual. Ler o manual do utilizador do Mixxx. - + &Keyboard Shortcuts &Atalhos de Teclado - + Speed up your workflow with keyboard shortcuts. Acelere o seu fluxo de trabalho com os atalhos de teclado. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Traduzir Este Programa - + Help translate this application into your language. Ajude a traduzir esta aplicação na sua língua. - + &About So&bre - + About the application Sobre esta aplicação @@ -15908,25 +16057,25 @@ This can not be undone! WOverview - + Passthrough Passagem - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15935,25 +16084,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Limpar entrada - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Procurar - + Clear input Limpar a entrada @@ -15964,169 +16101,163 @@ This can not be undone! Procurar... - + Clear the search bar input field - - Enter a string to search for - Digite uma frase para procurar + + Return + Enter - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Atalho + See User Manual > Mixxx Library for more information. + - - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return - Enter + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history - - - - - Esc + + in search history - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Tom - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artista - + Album Artist Artista do Album - + Composer Compositor - + Title Título - + Album Album - + Grouping Agrupamento - + Year Ano - + Genre Género - + Directory - + &Search selected @@ -16134,620 +16265,625 @@ This can not be undone! WTrackMenu - + Load to Carregar para - + Deck Leitor - + Sampler Sampler - + Add to Playlist Adicionar à Playlist - + Crates Caixas - + Metadata Metadados - + Update external collections - + Cover Art Capa do Disco - + Adjust BPM - + Ajustar BPM - + Select Color - - + + Analyze Analisar - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Adicionar à Fila Auto DJ (baixo) - + Add to Auto DJ Queue (top) Adicionar à Fila Auto DJ (cima) - + Add to Auto DJ Queue (replace) Adicionar à Fila Auto DJ (Substituir) - + Preview Deck Leitor de Antevisão - + Remove Remover - + Remove from Playlist Remover da Playlist - + Remove from Crate Remover da Caixa - + Hide from Library Ocultar da Biblioteca - + Unhide from Library Mostrar da Bilioteca - + Purge from Library Remover da Biblioteca - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Propriedades - + Open in File Browser Abrir no Explorador de Ficheiros - + Select in Library - + Import From File Tags Importar Das Tags Ficheiros - + Import From MusicBrainz Importar De MusicBrainz - + Export To File Tags Exportar Para Tags Ficheiros - + BPM and Beatgrid BPM e Grelha de Batidas - + Play Count Contador de Leitura - + Rating Classificação - + Cue Point Ponto de Marcação - - + + Hotcues Hot Cues - + Intro - + Outro - + Key Tom - + ReplayGain ReplayGain - + Waveform Forma de Onda - + Comment Comentário - + All Todas - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Bloquear BPM - + Unlock BPM Desbloquear BPM - + Double BPM Duplicar BPM - + Halve BPM Reduzir a Metade BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Leitor %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Criar uma Playlist Nova - + Enter name for new playlist: Introduzir um nome para a nova playlist: - + New Playlist Playlist Nova - - - + + + Playlist Creation Failed Criação da Playlist Falhou - + A playlist by that name already exists. Já existe uma playlist com esse nome. - + A playlist cannot have a blank name. Uma playlist não pode ter um nome em branco. - + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a playlist: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) Locking BPM of %n track(s)Locking BPM of %n track(s)Bloqueando o BPM de %n faixa(s) - + Unlocking BPM of %n track(s) Unlocking BPM of %n track(s)Unlocking BPM of %n track(s)Desbloqueando o BPM de %n faixa(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) Setting color of %n track(s)Setting color of %n track(s)Mudando a cor de %n faixa(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Cancelar - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Fechar - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16763,37 +16899,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16801,37 +16937,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16839,12 +16975,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Mostra ou oculta colunas. - + Shuffle Tracks @@ -16852,52 +16988,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Escolher a pasta biblioteca musical - + controllers - + Cannot open database Não pode abrir a base de dados. - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16911,68 +17047,78 @@ Clique OK para sair. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - - Browse + + Playlists + + + + + Selected crates/playlists - + + Browse + Navegar + + + Export directory - + Database version - + Export Exportar - + Cancel - + Cancelar - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16993,7 +17139,7 @@ Clique OK para sair. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17003,23 +17149,23 @@ Clique OK para sair. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... @@ -17036,7 +17182,7 @@ Clique OK para sair. No network access - + Sem acesso a rede diff --git a/res/translations/mixxx_ro.qm b/res/translations/mixxx_ro.qm index 3a66a052e63a059beecd80a1b60dac48c5062eca..b64883bf962c385486b44660c83fc61372c0038e 100644 GIT binary patch delta 527 zcmW-dPe_w-9LC?@)Be;3As%*S?)fa-=WL*^UHX5I-%{^hRSAt1HJ&l%@IMpFXuuar0a zLE;eQ&Et?g^w}(0qJ5g%r&a{yjGFmkS-|NHa#{Kivr^V_jP6-}AQz+=>lDHd$Ym=a zq~nveS%#ECE_*Lh(-gNWNOO8(A23KA+JzG(^-P_b_E!iMd2O!>7&=PLRu747D)Std z+x9SI&QsP=Kyr=N9kYmsDeDw5RN|A)B6BEy{YLq&z{+)ft@=n{!`Jn%f4>#j{SmUY ze?e43&GrGLk5j)p2PwrX?i&p87Jj(HuG(lNxl?U-(M;zS!d-OP<45uWRXp2>F4CQS z%TRt&+*?5GJ*{}%7<|Y-cva=f6MNn7(_O{3&pK5R6kZSn>r zR;lQevAK;M=IcjAm}MX$Dp%AW!5`{Gu@=FxvQ7I-w*AP!9~uNjyuNHj*oAw~xt!-Y z&vQ8U&X_KrGkw>}9$m4`Gwf&dhS@RrBiV3`LQ{AXBLh5E zbC==3I5`Xf42+X%$V=hFfLmmGW|+l5FI|N)#v>T) zqe^2M2Y%uq>v4wBDpi)Q#o;b;G(|8Lq=_c4$vlP&w4Rb3 zRSdf+w&EIYKS5SU8YBB?!ePg)9zNv|3)$Yzlg=dtbu4NdU<&LgFwk&fgBsTN1e)ok#0RDA)#32_Q?*0{(E{eIfpmIgKco4e}&AE=w zx!CnN7gj&hCQG=YU3Oq_RnEx`ZoxZQuqK@{om2 z=mP~3um=h-re~=|AdVz%omF->BDQsXHk^oqp>n<4eDh%TT#D&bP&N1nYIRW4|MmC#;e1+TV5 iX04Jzx2qGihb1g(t1qxl?YSUmUwq5#*W>$er12fZI~wBv diff --git a/res/translations/mixxx_ro.ts b/res/translations/mixxx_ro.ts index d00e953e3f30..f548cfe75a49 100644 --- a/res/translations/mixxx_ro.ts +++ b/res/translations/mixxx_ro.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Elimină colecția ca sursă pistă - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Adaugă colecția ca sursă pistă @@ -148,7 +148,7 @@ BasePlaylistFeature - + New Playlist Listă de redare nouă @@ -159,7 +159,7 @@ - + Create New Playlist Crează listă de redare nouă @@ -189,113 +189,120 @@ Duplică - - + + Import Playlist Importare listă de redare - + Export Track Files - + Analyze entire Playlist Analizează întreaga listă de redare - + Enter new name for playlist: Introduceți noul nume pentru lista de redare: - + Duplicate Playlist Duplicare listă de redare - - + + Enter name for new playlist: Introduceți numele pentru noua listă de redare: - - + + Export Playlist Exportare listă de redare - + Add to Auto DJ Queue (replace) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Redenumește lista de redare - - + + Renaming Playlist Failed Redenumirea listei de redare a eşuat - - - + + + A playlist by that name already exists. Există deja o listă de redare cu acelaşi nume. - - - + + + A playlist cannot have a blank name. O listă de redare nu poate fi nedenumită. - + _copy //: Appendix to default name when duplicating a playlist _copiere - - - - - - + + + + + + Playlist Creation Failed Crearea listei de redare a eşuat - - + + An unknown error occurred while creating playlist: O eroare necunoscută a apărut în timpul creării listei de redare: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) Listă de redare M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Text lizibil (*.txt) @@ -303,12 +310,12 @@ BaseSqlTableModel - + # # - + Timestamp Marcaj temporal @@ -316,7 +323,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nu se poate încărca pista. @@ -324,137 +331,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Album artist - + Artist Artist - + Bitrate Rată de biți - + BPM BPM - + Channels Canale - + Color - + Comment Comentariu - + Composer Compozitor - + Cover Art Copertă - + Date Added Data adăugării - + Last Played - + Duration Durată - + Type Tip - + Genre Gen - + Grouping Grupare - + Key Tastă - + Location Locație - + + Overview + + + + Preview Previzualizare - + Rating Apreciere - + ReplayGain Înlocuire câștig - + Samplerate - + Played Redat - + Title Titlu - + Track # Pista # - + Year An - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -542,67 +554,77 @@ BrowseFeature - + Add to Quick Links Adaugă la link-uri rapide - + Remove from Quick Links Elimină din link-uri rapide - + Add to Library Adaugă la bibliotecă - + Refresh directory tree - + Quick Links Link-uri rapide - - + + Devices Dispozitive - + Removable Devices Medii amovibile - - + + Computer - + Music Directory Added Directorul Muzică s-a adăugat - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Ați adăugat unul sau mai multe directoare. Pistele din aceste directoare nu vor fi disponibile până ce nu veți rescana biblioteca. Doriți să fie rescanată acum? - + Scan Scanare - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1045,13 +1067,13 @@ trace - Above + Profiling messages - + Set to full volume Configurează la volum maxim - + Set to zero volume Configurează la volum 0 @@ -1076,13 +1098,13 @@ trace - Above + Profiling messages - + Headphone listen button Buton ascultare în căști - + Mute button Buton amuțire @@ -1093,25 +1115,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Orientare mixer (ex.-stânga,-dreapta,-centru) - + Set mix orientation to left Configurează orientarea mixerului la stânga - + Set mix orientation to center Configurează orientarea mixerului la centru - + Set mix orientation to right Configurează orientarea mixerului la dreapta @@ -1152,22 +1174,22 @@ trace - Above + Profiling messages - + Toggle quantize mode Comută mod cuantificare - + One-time beat sync (tempo only) Sincronizare bătaie o singură dată (numai tempo) - + One-time beat sync (phase only) Sincronizare bătaie o singură dată (numai fază) - + Toggle keylock mode Comută mod keylock @@ -1177,193 +1199,193 @@ trace - Above + Profiling messages Egalizatoare - + Vinyl Control Control disc vinil - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Comută mod control disc vinil (ABS/REL/CONST) - + Pass through external audio into the internal mixer Trece audio extern în mixerul intern - + Cues Cue - + Cue button Buton cue - + Set cue point Configurare punct cue - + Go to cue point Mergi la punct cue - + Go to cue point and play Mergi la punct cue și redă - + Go to cue point and stop Mergi la punct cue și oprește - + Preview from cue point Previzualizare de la punct cue - + Cue button (CDJ mode) Buton cue (mod CDJ) - + Stutter cue - + Hotcues Hotcue - + Set, preview from or jump to hotcue %1 Configurează, previzualizează de la sau sari la hotcue %1 - + Clear hotcue %1 Curăță hotcue %1 - + Set hotcue %1 Configurează hotcue %1 - + Jump to hotcue %1 Sări la hotcue %1 - + Jump to hotcue %1 and stop Sări la hotcue %1 și oprește - + Jump to hotcue %1 and play Sări la hotcue %1 și redă - + Preview from hotcue %1 Previzualizează hotcue %1 - - + + Hotcue %1 Hotcue %1 - + Looping Repetă în buclă - + Loop In button Buton începere buclă - + Loop Out button Buton terminare buclă - + Loop Exit button Buton ieșire buclă - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Mută bucla înainte cu %1 bătăi - + Move loop backward by %1 beats Mută bucla înapoi cu %1 bătăi - + Create %1-beat loop Creează buclă de %1 bătăi - + Create temporary %1-beat loop roll Creează o buclă temporară de %1 bătăi @@ -1479,20 +1501,20 @@ trace - Above + Profiling messages - - + + Volume Fader Fader Volume - + Full Volume Volum total - + Zero Volume Volum zero @@ -1508,7 +1530,7 @@ trace - Above + Profiling messages - + Mute Amuțire @@ -1519,7 +1541,7 @@ trace - Above + Profiling messages - + Headphone Listen Ascultare în căști @@ -1540,25 +1562,25 @@ trace - Above + Profiling messages - + Orientation Orientare - + Orient Left Orientare stânga - + Orient Center Orientare centru - + Orient Right Orientare dreapta @@ -1628,82 +1650,82 @@ trace - Above + Profiling messages Ajustează la dreapta grila bătaie - + Adjust Beatgrid Ajustare grilă bătaie - + Align beatgrid to current position Aliniază grila bătaie la poziția curentă - + Adjust Beatgrid - Match Alignment Ajustează grila bătaie - Potrivește aliniament - + Adjust beatgrid to match another playing deck. Ajustează grila bătaie să se potrivească cu alt deck care redă. - + Quantize Mode Mod cuantificare - + Sync Sincronizare - + Beat Sync One-Shot Sincronizează bătaia o singură dată - + Sync Tempo One-Shot Sincronizează tempo o singură dată - + Sync Phase One-Shot Sincronizează faza o singură dată - + Pitch control (does not affect tempo), center is original pitch Control pitch (nu afectează tempo), la centru este pitch original - + Pitch Adjust Ajustare pitch - + Adjust pitch from speed slider pitch - + Match musical key Potrivește cheia muzicală - + Match Key Potrivește cheia - + Reset Key Resetează cheia - + Resets key to original Resetează cheia la original @@ -1744,451 +1766,451 @@ trace - Above + Profiling messages Egalizator joase - + Toggle Vinyl Control Comută controlul disc vinil - + Toggle Vinyl Control (ON/OFF) Comută control disc vinil (Pornit/Oprit) - + Vinyl Control Mode Mod control disc vinil - + Vinyl Control Cueing Mode Control vinil mod cue - + Vinyl Control Passthrough - + Vinyl Control Next Deck Control disc vinil deck-ul următor - + Single deck mode - Switch vinyl control to next deck Mod deck unic - Comută controlul discului vinil la următorul deck - + Cue Cue - + Set Cue Configurare cue - + Go-To Cue Mergi la cue - + Go-To Cue And Play Mergi la cue și redă - + Go-To Cue And Stop Mergi la cue și oprește - + Preview Cue Previzualizare cue - + Cue (CDJ Mode) Cue (mod CDJ) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 Curăță hotcue %1 - + Set Hotcue %1 Configurează hotcue %1 - + Jump To Hotcue %1 Sări la hotcue %1 - + Jump To Hotcue %1 And Stop Sări la hotcue %1 și oprește - + Jump To Hotcue %1 And Play Sări la hotcue %1 și redă - + Preview Hotcue %1 Previzualizare hotcue %1 - + Loop In Intrare buclă - + Loop Out Ieșire buclă - + Loop Exit Ieșire buclă - + Reloop/Exit Loop Reluare/ieșire buclă - + Loop Halve Înjumătățește bucla - + Loop Double Buclă dublă - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Mută bucla cu +%1 bătăi - + Move Loop -%1 Beats Mută bucla cu -%1 bătăi - + Loop %1 Beats Buclă %1 bătăi - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Adăugaţi în selecţia Auto DJ (jos) - + Append the selected track to the Auto DJ Queue Adaugă pistele selectate la Coada Auto DJ - + Add to Auto DJ Queue (top) Adăugaţi în selecţia Auto DJ (sus) - + Prepend selected track to the Auto DJ Queue - + Load Track Încarcă pista - + Load selected track Încarcă pista selectată - + Load selected track and play Încarcă pista selectată și redă - - + + Record Mix Mixer înregistrare - + Toggle mix recording Comută mixer înregistrare - + Effects Efecte - + Quick Effects Efecte rapide - + Deck %1 Quick Effect Super Knob Super buton efect rapid Deck %1 - + Quick Effect Super Knob (control linked effect parameters) Super buton efect rapid (control parametrii efecte legate) - - + + Quick Effect Efect rapid - + Clear Unit Curăță unitatea - + Clear effect unit Curăță unitatea efectelor - + Toggle Unit Comută unitatea - + Dry/Wet Uscat/umed - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob Super buton - + Next Chain Lanțul următor - + Assign Atribuie - + Clear Curăță - + Clear the current effect Curăță efectul curent - + Toggle Comutare - + Toggle the current effect Comută efectul curent - + Next Următor - + Switch to next effect Comută la efectul următor - + Previous Anterior - + Switch to the previous effect Comută la efectul anterior - + Next or Previous Următor sau anterior - + Switch to either next or previous effect Comută fie la următorul sau anteriorul efect - - + + Parameter Value Valoare parametru - - + + Microphone Ducking Strength Intensitate atenuare microfon - + Microphone Ducking Mode Mod atenuare microfon - + Gain Câștig - + Gain knob Buton câștig - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Comutare DJ automat - + Toggle Auto DJ On/Off Comută Auto DJ Pornit/Oprit - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Arată sau ascunde mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Bibliotecă mărește/restaurează - + Maximize the track library to take up all the available screen space. Mărește spațiul bibliotecii pentru a acoperii tot spațiul disponibil al ecranului. - + Effect Rack Show/Hide Arată/ascunde rack efect - + Show/hide the effect rack Arată/ascunde rack-ul efectului - + Waveform Zoom Out Redu zoom formă de undă @@ -2203,102 +2225,102 @@ trace - Above + Profiling messages Câștig căști - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Viteză redare - + Playback speed control (Vinyl "Pitch" slider) Control viteză redare (Vinyl "Pitch" cursor) - + Pitch (Musical key) Pitch (Cheie muzicală) - + Increase Speed Mărește viteza - + Adjust speed faster (coarse) Ajustează viteza repede (brut) - + Increase Speed (Fine) Mărește viteza (Fin) - + Adjust speed faster (fine) Ajustează viteza rapid (fin) - + Decrease Speed Scade viteza - + Adjust speed slower (coarse) Ajustează viteza lent (brut) - + Adjust speed slower (fine) Ajustează viteza lent (fin) - + Temporarily Increase Speed Mărește viteza temporar - + Temporarily increase speed (coarse) Mărește viteza temporar (brut) - + Temporarily Increase Speed (Fine) Mărește viteza temporar (Fin) - + Temporarily increase speed (fine) Mărește viteza temporar (fin) - + Temporarily Decrease Speed Scade viteza temporar - + Temporarily decrease speed (coarse) Scade vitea temporar (brut) - + Temporarily Decrease Speed (Fine) Scade viteza temporar (Fin) - + Temporarily decrease speed (fine) Scade viteza temporar (fin) @@ -2450,1053 +2472,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length Înjumătățește lungimea buclei - + Double the loop length Dublează lungimea buclei - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navigare - + Move up Mută în sus - + Equivalent to pressing the UP key on the keyboard Echivalent cu apăsarea tastei UP pe tastatură - + Move down Mută în jos - + Equivalent to pressing the DOWN key on the keyboard Echivalent cu apăsarea tastei DOWN pe tastatură - + Move up/down Mută în sus/jos - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up Derulează în sus - + Equivalent to pressing the PAGE UP key on the keyboard Echivalent cu apăsarea tastei PAGE UP pe tastatură - + Scroll Down Derulează în jos - + Equivalent to pressing the PAGE DOWN key on the keyboard Echivalent cu apăsarea tastei PAGE DOWN pe tastatură - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing Activează sau dezactivează procesarea efectului - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset Preconfigurare lanț următor - + Previous Chain Lanț anterior - + Previous chain preset Anterioara preconfigurare lanț - + Next/Previous Chain Următorul/Anteriorul lanț - + Next or previous chain preset Preconfigurare lanț următoare sau anterioară - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary Microfon / Auxiliar - + Microphone On/Off Microfon pornit/oprit - + Microphone on/off Microfon pornit/oprit - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Comută mod atenuare microfon (OPRIT, AUTO, MANUAL) - + Auxiliary On/Off Auxiliar pornit/oprit - + Auxiliary on/off Auxiliar pornit/oprit - + Auto DJ Auto DJ - + Auto DJ Shuffle Amestecă Auto DJ - + Auto DJ Skip Next Auto DJ omite următoarea - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Estompare DJ automat la următoarea - + Trigger the transition to the next track Comută tranziția următoarei piste - + User Interface Interfaţă utilizator - + Samplers Show/Hide Arată/ascunde samplere - + Show/hide the sampler section Arată/ascunde secțiunea sampler - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Arată/ascunde controlul disc vinil - + Show/hide the vinyl control section Arată/ascunde secțiunea control disc vinil - + Preview Deck Show/Hide Arată/ascunde previzualizare deck - + Show/hide the preview deck Arată/ascunde previzualizarea deck-ului - + Toggle 4 Decks Comută 4 Decuri - + Switches between showing 2 decks and 4 decks. Comută între 2 decuri sau 4 decuri. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Arată/ascunde rotire disk vinil - + Show/hide spinning vinyl widget Arată/ascunde control rotire disc vinil - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Zoom formă de undă - + Waveform Zoom Zoom formă de undă - + Zoom waveform in Mărește zoom formă de undă - + Waveform Zoom In Mărește zoom formă de undă - + Zoom waveform out Redu zoom formă de undă - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3611,32 +3643,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Încercați recuperarea resetând controlerul. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. Codul scriptului trebuie să fie reparat. @@ -3744,7 +3776,7 @@ trace - Above + Profiling messages Importă colecție - + Export Crate Exportă colecție @@ -3754,7 +3786,7 @@ trace - Above + Profiling messages Deblochează - + An unknown error occurred while creating crate: A apărut o eroare la crearea colecției: @@ -3763,12 +3795,6 @@ trace - Above + Profiling messages Rename Crate Redenumește colecția - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3786,17 +3812,17 @@ trace - Above + Profiling messages Redenumirea colecției a eșuat - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Text lizibil (*.txt) - + M3U Playlist (*.m3u) Listă de redare M3U (*.m3u) @@ -3805,6 +3831,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Colecțiile sunt un mare mod de a ajuta organizarea muzicii dorite cu DJ. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3916,12 +3948,12 @@ trace - Above + Profiling messages Foști contribuitori - + Official Website - + Donate @@ -4433,37 +4465,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Dacă maparea nu funcționează încercați activarea opțiunilor avansate de mai jos iar apoi încercați controlul din nou. Sau apăsați Reâncearcă pentru a detecta din nou controlul midi. - + Didn't get any midi messages. Please try again. Nu s-a primit nici un mesaj midi. Reâncercați. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Nu se poate detecta o mapare -- încercați din nou. Asigurați-vă că atingeți un singur control odată. - + Successfully mapped control: Control mapat cu succes: - + <i>Ready to learn %1</i> <i>Gata de învățat %1</i> - + Learning: %1. Now move a control on your controller. Se învață: %1. Acum deplasați un control pe controler. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4502,17 +4534,17 @@ You tried to learn: %1,%2 - + Log Jurnal - + Search Căutare - + Stats Stări @@ -5165,114 +5197,114 @@ associated with each key. DlgPrefController - + Apply device settings? Se aplică configurările dispozitivului? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Configurările trebuie aplicate înaintea pornirii asistentului de învățare. Se aplică configurările și se continuă? - + None Niciuna - + %1 by %2 %1 cu %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Depanarea - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Curăță mapările de intrare - + Are you sure you want to clear all input mappings? Sigur doriți să curățați toate mapările de intrare? - + Clear Output Mappings Curăță mapări de ieșire - + Are you sure you want to clear all output mappings? Sigur doriți să curățați toate mapările de ieșire? @@ -5290,100 +5322,100 @@ Se aplică configurările și se continuă? Activat - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Descriere: - + Support: Asistență: - + Screens preview - + Input Mappings Mapări de intrare - - + + Search Căutare - - + + Add Adaugă - - + + Remove Elimină @@ -5403,17 +5435,17 @@ Se aplică configurările și se continuă? - + Mapping Info - + Author: Autor: - + Name: Nume: @@ -5423,28 +5455,28 @@ Se aplică configurările și se continuă? Asistent învățare (numai MIDI) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Curăță tot - + Output Mappings Mapări de ieșire @@ -5603,6 +5635,16 @@ Se aplică configurările și se continuă? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6194,62 +6236,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Dimensiunea minimă a aspectului aplicației este mai mare decât rezoluția ecranului. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Acest aspect aplicație nu suportă scheme de culoare - + Information Informație - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7417,173 +7459,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Implicit (întârziere lungă) - + Experimental (no delay) Experimental (fără întârziere) - + Disabled (short delay) Dezactivat (întârziere scurtă) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled Dezactivat - + Enabled Activat - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Eroare de configurație @@ -7601,131 +7642,131 @@ The loudness target is approximate and assumes track pregain and main output lev API sunet - + Sample Rate Rată eșanționare - + Audio Buffer Buffer audio - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization Sincronizare plăci de sunet - + Output Ieșire - + Input Intrare - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Sfaturi și diagnosticuri - + Downsize your audio buffer to improve Mixxx's responsiveness. Scădeți dimensiunea tamponului audio pentru a îmbunătății reacția de răspuns Mixxx. - + Query Devices Interogare dispozitive @@ -8171,47 +8212,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Placă de sunet - + Controllers Controlere - + Library Bibliotecă - + Interface Interfață - + Waveforms Forme de undă - + Mixer Mixer - + Auto DJ Auto DJ - + Decks - + Colors @@ -8246,47 +8287,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efecte - + Recording Înregistrare - + Beat Detection Detectare bătaie - + Key Detection Detecție cheie - + Normalization Normalizare - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Control disc vinil - + Live Broadcasting Transmisie live - + Modplug Decoder Decodor Modplug @@ -8642,284 +8683,284 @@ This can not be undone! Rezumat - + Filetype: Tip fișier: - + BPM: BPM: - + Location: Locație: - + Bitrate: Rata de biți: - + Comments Comentarii - + BPM BPM - + Sets the BPM to 75% of the current value. Configurează BPM la 75% din valoarea actuală. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Configurează BPM la 50% din valoarea actuală. - + Displays the BPM of the selected track. Arată BPM pentru pista selectată. - + Track # Pista # - + Album Artist Album artist - + Composer Compozitor - + Title Titlu - + Grouping Grupare - + Key Tastă - + Year An - + Artist Artist - + Album Album - + Genre Gen - + ReplayGain: - + Sets the BPM to 200% of the current value. Configurează BPM la 200% față de valoarea actuală. - + Double BPM Dublează BPM - + Halve BPM Înjumătățește BPM - + Clear BPM and Beatgrid Curăță BPM și grila bătaie - + Move to the previous item. "Previous" button Mută la elementul anterior. - + &Previous &Anterior - + Move to the next item. "Next" button Mută la elementul următor. - + &Next &Următor - + Duration: Durată: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Deschide în navigatorul de fișiere - + Samplerate: - + Track BPM: BPM pistă: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. Configurează BPM la 66% din valoarea actuală. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. Sfat: Utilizați vizualizare Analiză bibliotecă pentru a rula detecția BPM. - + Save changes and close the window. "OK" button Salvează modificările și închide fereastra. - + &OK &OK - + Discard changes and close the window. "Cancel" button Descarcă modificările și închide fereastra. - + Save changes and keep the window open. "Apply" button Salvează modificările și păstrează fereastra deschisă. - + &Apply &Aplică - + &Cancel &Anulare - + (no color) @@ -9076,7 +9117,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9278,27 +9319,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (rapid) - + Rubberband (better) Rubberband (optim) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9513,15 +9554,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Este activat modul sigur - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9533,57 +9574,57 @@ Shown when VuMeter can not be displayed. Please keep OpenGL. - + activate activează - + toggle comută - + right dreapta - + left stânga - + right small dreapta mic - + left small stânga mic - + up sus - + down jos - + up small sus mic - + down small jos mic - + Shortcut Scurtătură @@ -9591,62 +9632,62 @@ OpenGL. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9656,22 +9697,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importă listă de redare - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Fişiere listă de redare (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9718,27 +9759,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found Controlul(e) Mixxx nu s-au găsit - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Unele LED-uri sau alte reacții-control este posibil să nu funcționeze corect. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Verificați să vedeți dacă denumirile controlului Mixxx sunt scrise corect în fișierul de mapare (.xml) @@ -9798,18 +9839,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Piste lipsă - + Hidden Tracks Piste ascunse - Export to Engine Prime + Export to Engine DJ @@ -9821,209 +9862,250 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Dispozitivul audio este ocupat - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Reâncearcă</b> după închiderea altei aplicații sau reconectarea unui dispozitiv de sunet - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurare</b> configurări dispozitivul de sunet al Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Primeşte <b>ajutor</b> de pe Wiki Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Ieşi</b> din Mixxx. - + Retry Reâncearcă - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigurează - + Help Ajutor - - + + Exit Ieși - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices Nu sunt dispozitive de ieșire - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx a fost configurat fără nici un dispozitiv de ieșire. Procesarea audio va fi dezactivată fără un dispozitiv de ieșire configurat. - + <b>Continue</b> without any outputs. <b>Contină</b> fără nici o ieșire. - + Continue Continuă - + Load track to Deck %1 Încarcă pista în Deck-ul %1 - + Deck %1 is currently playing a track. Deck-ul %1 redă actualmente o pistă. - + Are you sure you want to load a new track? Sigur doriți să încărcați o nouă pistă? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Nu este selectat nici un dispozitiv de intrare pentru acest control disc vinil. Selectați întâi un dispozitiv de intrare din preferințele plăcii de sunet. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Eroare în fișier aspect aplicație - + The selected skin cannot be loaded. Aspectul aplicației selectat nu poate fi încărcat. - + OpenGL Direct Rendering Randare directă OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmare ieșire - + A deck is currently playing. Exit Mixxx? Un deck actualmente redă. Se oprește Mixxx? - + A sampler is currently playing. Exit Mixxx? Un sampler redă curent. Iese Mixxx? - + The preferences window is still open. Fereastra preferințe este încă deschisă. - + Discard any changes and exit Mixxx? Se descarcă orice modificări și se închide Mixxx? @@ -10039,13 +10121,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Blochează - - + + Playlists Liste de redare @@ -10055,32 +10137,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Deblochează - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Unii DJ-ei construiesc liste de redare înainte de a se prezenta live, dar alții preferă să le construiască din zbor. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Când utilizați o listă de redare în timpul unei sesiuni DJ live, nu uitați ca întotdeauna să acordați o atenție deosebită cum reacționează ascultătorii la muzica pe care ați ales să o redați. - + Create New Playlist Crează listă de redare nouă @@ -11572,7 +11680,7 @@ Fully right: end of the effect period - + Deck %1 Deck %1 @@ -11705,7 +11813,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11736,7 +11844,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11869,12 +11977,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11909,42 +12017,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12002,54 +12110,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Liste de redare - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12608,7 +12716,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Învârtire disc vinil @@ -12790,7 +12898,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Copertă @@ -13026,197 +13134,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier Ajustează bătăile mai devreme - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later Ajustează bătăile mai târziu - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. Arată/ascunde secțiunea rotire disc vinil. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Redare - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13454,926 +13562,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Salvează bancă sampler - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Încarcă bancă sampler - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Super buton - + Next Chain Lanțul următor - + Previous Chain Lanț anterior - + Next/Previous Chain Următorul/Anteriorul lanț - + Clear Curăță - + Clear the current effect. Curăță efectul curent. - + Toggle Comutare - + Toggle the current effect. - + Next Următor - + Clear Unit Curăță unitatea - + Clear effect unit. Curăță unitatea efectelor - + Show/hide parameters for effects in this unit. - + Toggle Unit Comută unitatea - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Comută la efectul următor. - + Previous Anterior - + Switch to the previous effect. Comută la efectul anterior. - + Next or Previous Următor sau anterior - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Parametru efect - + Adjusts a parameter of the effect. Ajustează un parametru al efectului. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter Parametru egalizator - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Ajustare grilă bătaie - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. Ajustează grila bătaie să se potrivească cu alt deck care redă. - + If quantize is enabled, snaps to the nearest beat. Dacă cuantizarea este activată, fixează la cea mai apropiată bătaie. - + Quantize Cuantificare - + Toggles quantization. Comută cuantificare. - + Loops and cues snap to the nearest beat when quantization is enabled. Bucle și cue se fixează la cea mai apropiată bătaie când cuantizarea este activată. - + Reverse Invers - + Reverses track playback during regular playback. Inversează redarea pistei în timpul redării normale. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Redare/Pauză - + Jumps to the beginning of the track. Sări la începutul pistei. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. Crește pitch cu un semiton. - + Decreases the pitch by one semitone. Scade pitch cu un semiton. - + Enable Vinyl Control Activează control disc vinil - + When disabled, the track is controlled by Mixxx playback controls. Când este dezactivat, pista este controlată de controalele de redare Mixxx. - + When enabled, the track responds to external vinyl control. Când este activat, pista răspunde la controlul discului de vinil extern. - + Enable Passthrough Activează trecerea - + Indicates that the audio buffer is too small to do all audio processing. Indică faptul că buffer-ul audio este prea mic pentru a efectua toate procesările audio. - + Displays cover artwork of the loaded track. Arată coperta pistei încărcate. - + Displays options for editing cover artwork. Afișează opțiuni pentru editarea copertei. - + Star Rating Stea evaluare - + Assign ratings to individual tracks by clicking the stars. Atribuie evaluări pistelor individuale apăsând stelele. @@ -14508,33 +14622,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Pornește redarea de la începutul pistei. - + Jumps to the beginning of the track and stops. Sări la începutul pistei și oprește. - - + + Plays or pauses the track. Redă sau pauzează pista. - + (while playing) (în timp ce se redă) @@ -14554,215 +14668,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (în timp cât este oprit) - + Cue Cue - + Headphone Căști - + Mute Amuțire - + Old Synchronize Sincronizare veche - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Sincronizează la primul deck (în ordine numerică) care redă o pistă și are un BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Dacă nici un deck nu redă, sincronizează cu primul deck care are un BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Deck-urile nu pot sincroniza samplerele iar samplerele pot doar sincroniza deck-urile. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. Resetează cheia la cheia originală a pistei. - + Speed Control Control viteză - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust Ajustare pitch - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Mixer înregistrare - + Toggle mix recording. - + Enable Live Broadcasting Activare transmisie live - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. Redarea se va relua de unde ar fi trebuit să fie pista dacă nu a intrat în buclă. - + Loop Exit Ieșire buclă - + Turns the current loop off. Oprește bucla curentă. - + Slip Mode Mod adormire - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Cînd se activează, redarea continuă în fundal fără sunet în timpul unei bucle, inversări, zgârieturi etc. - + Once disabled, the audible playback will resume where the track would have been. Odată dezactivat, redarea auzibilă se va relua de unde pista ar fi fost. - + Track Key The musical key of a track Cheie pistă - + Displays the musical key of the loaded track. Afișează cheia muzicală a pistei încărcate. - + Clock Ceas - + Displays the current time. Afișează ora actuală. - + Audio Latency Usage Meter Contor utilizare latență audio - + Displays the fraction of latency used for audio processing. Afișează fracția latenței utilizată pentru procesare audio. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. Nu activați keylock, efecte sau deck-uri suplimentare în această situație. - + Audio Latency Overload Indicator Indicator suprasarcină latență audio @@ -14807,254 +14921,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Derulare rapidă înapoi - + Fast rewind through the track. Derulare rapidă înapoi prin pistă. - + Fast Forward Derulare rapidă înainte - + Fast forward through the track. Derulare rapidă înainte prin pistă. - + Jumps to the end of the track. Sări la sfârșitul pistei. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Control pitch - + Pitch Rate Rată pitch - + Displays the current playback rate of the track. Afișează ritmul de redare curentă a pistei. - + Repeat Repetă - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Scoate - + Ejects track from the player. Scoate pista din player. - + Hotcue Hotcue - + If hotcue is set, jumps to the hotcue. Dacă hotcue este configurat, sări la hotcue. - + If hotcue is not set, sets the hotcue to the current play position. Dacă hotcue nu este configurat, configurează hotcue la poziția curentă de redare. - + Vinyl Control Mode Mod control disc vinil - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status Stare disc vinil - + Provides visual feedback for vinyl control status: - + Green for control enabled. Verde pentru activare control. - + Blinking yellow for when the needle reaches the end of the record. Galben clipitor când acul atinge sfârșitul înregistrării. - + Loop-In Marker Marcaj intrare buclă - + Loop-Out Marker Marcaj ieșire buclă - + Loop Halve Înjumătățește bucla - + Halves the current loop's length by moving the end marker. Înjumătățește lungimea buclei curente prin mutarea marcajului de sfârșit. - + Deck immediately loops if past the new endpoint. - + Loop Double Buclă dublă - + Doubles the current loop's length by moving the end marker. Dublează lungimea buclei curente mutând marcajul de sfârșit. - + Beatloop - + Toggles the current loop on or off. Comută bucla actuală pornit sau oprit. - + Works only if Loop-In and Loop-Out marker are set. Funcționează numai dacă marcajele intrare buclă și ieșire buclă sunt configurate. - + Vinyl Cueing Mode Mod cue disc vinil - + Determines how cue points are treated in vinyl control Relative mode: Determină cum sunt tratate punctele cue în mod control disc vinil relativ: - + Off - Cue points ignored. Închis - Punctele cue ignorate. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time Timp pistă - + Track Duration Durată pistă - + Displays the duration of the loaded track. Afișează durata pistei încărcate. - + Information is loaded from the track's metadata tags. Informația este încărcată din metadata etichetelor pistei. - + Track Artist Artist piesă - + Displays the artist of the loaded track. Afișează artistul pistei încărcate. - + Track Title Titlu piesă - + Displays the title of the loaded track. Afișează titlul pistei încărcate. - + Track Album Album - + Displays the album name of the loaded track. Afișează numele albumului pistei încărcate. - + Track Artist/Title Artist/titlu pistă - + Displays the artist and title of the loaded track. Afișează artistul și titlul pistei încărcate. @@ -15062,12 +15176,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15282,47 +15396,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15447,323 +15561,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Crează Listă de redare &nouă - + Create a new playlist Creează o nouă listă de redare - + Ctrl+n Ctrl+n - + Create New &Crate Creează &Colecție nouă - + Create a new crate Creează o colecţie nouă - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Vizualizare - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Poate să nu fie suportat pe toate aspectele aplicației. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Arată secțiunea microfon - + Show the microphone section of the Mixxx interface. Arată secțiunea microfonului a interfeței Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Arată secțiunea control disc vinil - + Show the vinyl control section of the Mixxx interface. Arată secțiunea control disc vinil a interfeței Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Arată previzualizare Deck - + Show the preview deck in the Mixxx interface. Arată previzualizarea deck-ului în interfața Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Arată coperta - + Show cover art in the Mixxx interface. Arată coperta în interfața Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Mărește biblioteca - + Maximize the track library to take up all the available screen space. Mărește spațiul bibliotecii pentru a acoperii tot spațiul disponibil al ecranului. - + Space Menubar|View|Maximize Library Spațiu - + &Full Screen &Ecran complet - + Display Mixxx using the full screen Afișează Mixxx utilizând tot ecranul - + &Options &Opțiuni - + &Vinyl Control Control disc &vinil - + Use timecoded vinyls on external turntables to control Mixxx Utilizează codarea de timp discuri vinil pe platan extern pentru a controla Mixxx - + Enable Vinyl Control &%1 Activează controlul disc vinil &%1 - + &Record Mix &Înregistrare mixaj - + Record your mix to a file Înregistrează mixajul într-un fişier - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Activează &transmisia live - + Stream your mixes to a shoutcast or icecast server Difuzați mixajul dumneavoastră la un server shoutcast sau icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Activează &scurtăturile de tastatură - + Toggles keyboard shortcuts on or off Comută scurtăturile de tastatură pornit sau oprit - + Ctrl+` Ctrl+` - + &Preferences &Preferințe - + Change Mixxx settings (e.g. playback, MIDI, controls) Schimbă configurările Mixxx (ex. redare, MIDI, controale) - + &Developer &Dezvoltator - + &Reload Skin &Reâncarcă aspect aplicație - + Reload the skin Reâncarcă aspect aplicație - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools &Unelte dezvoltator - + Opens the developer tools dialog Deschide dialogul uneltelor dezvoltatorului - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Dep&anator activat - + Enables the debugger during skin parsing Activează depanatorul în timpul analizării aspectului aplicației - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Ajutor - + Show Keywheel menu title @@ -15780,74 +15924,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support Suport &comunitate - + Get help with Mixxx Obțineți ajutor cu Mixxx - + &User Manual Manual &utilizator - + Read the Mixxx user manual. Citiți manualul utilizatorului Mixxx. - + &Keyboard Shortcuts Scurtături &tastatură - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Tradu această aplicație - + Help translate this application into your language. Ajutați la traducerea acestei aplicații în limba dumneavoastră. - + &About &Despre - + About the application Despre aplicaţie @@ -15855,25 +15999,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15882,25 +16026,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Curăță intrarea - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Căutare - + Clear input Curăță intrarea @@ -15911,169 +16043,163 @@ This can not be undone! Caută... - + Clear the search bar input field - - Enter a string to search for - Introduceți un șir de căutat + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Scurtătură + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Focalizare + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Ieșire căutare + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Tastă - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Artist - + Album Artist Album artist - + Composer Compozitor - + Title Titlu - + Album Album - + Grouping Grupare - + Year An - + Genre Gen - + Directory - + &Search selected @@ -16081,620 +16207,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Deck - + Sampler Sampler - + Add to Playlist Adaugă la lista de redare - + Crates Colecții - + Metadata - + Update external collections - + Cover Art Copertă - + Adjust BPM - + Select Color - - + + Analyze Analizează - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Adăugaţi în selecţia Auto DJ (jos) - + Add to Auto DJ Queue (top) Adăugaţi în selecţia Auto DJ (sus) - + Add to Auto DJ Queue (replace) - + Preview Deck Previzualizare Deck - + Remove Elimină - + Remove from Playlist - + Remove from Crate - + Hide from Library Ascunde din bibliotecă - + Unhide from Library Anulează ascunderea din bibliotecă - + Purge from Library Rade din bibliotecă - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Proprietăţi - + Open in File Browser Deschide în navigatorul de fișiere - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Apreciere - + Cue Point - - + + Hotcues Hotcue - + Intro - + Outro - + Key Tastă - + ReplayGain Înlocuire câștig - + Waveform - + Comment Comentariu - + All Toate - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Blochează BPM - + Unlock BPM Deblochează BPM - + Double BPM Dublează BPM - + Halve BPM Înjumătățește BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Crează listă de redare nouă - + Enter name for new playlist: Introduceți numele pentru noua listă de redare: - + New Playlist Listă de redare nouă - - - + + + Playlist Creation Failed Crearea listei de redare a eşuat - + A playlist by that name already exists. Există deja o listă de redare cu acelaşi nume. - + A playlist cannot have a blank name. O listă de redare nu poate fi nedenumită. - + An unknown error occurred while creating playlist: O eroare necunoscută a apărut în timpul creării listei de redare: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Renunţă - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Închide - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16710,37 +16841,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16748,37 +16879,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16786,12 +16917,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Arată sau ascunde coloane. - + Shuffle Tracks @@ -16799,52 +16930,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Alege directorul bibliotecii de muzică - + controllers - + Cannot open database Baza de date nu poate fi deschisă - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16858,68 +16989,78 @@ Apăsați OK să ieșiți. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates - + + Playlists + + + + + Selected crates/playlists + + + + Browse Răsfoiește - + Export directory - + Database version - + Export Exportă - + Cancel Renunţă - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16940,7 +17081,7 @@ Apăsați OK să ieșiți. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16950,23 +17091,23 @@ Apăsați OK să ieșiți. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_ru.qm b/res/translations/mixxx_ru.qm index 812d8226537ffb2e0c0a8d55ba97aca2857094d7..804a8ca549cc6e9937e2901adfb00008d86c00d3 100644 GIT binary patch delta 16862 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%0Ds%d-UZtL*t*I-e4GZ{wkFxfL+yZ>IZ@X16U(qV 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 diff --git a/res/translations/mixxx_ru.ts b/res/translations/mixxx_ru.ts index 5822c60b98d6..280f436e0ab4 100644 --- a/res/translations/mixxx_ru.ts +++ b/res/translations/mixxx_ru.ts @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Новый список воспроизведения @@ -160,7 +160,7 @@ - + Create New Playlist Создать новый список воспроизведения @@ -190,113 +190,120 @@ Дублировать - - + + Import Playlist Импортировать список воспроизведения - + Export Track Files Экспорт файлов треков - + Analyze entire Playlist Анализировать весь список воспроизведения - + Enter new name for playlist: Введите новое имя для списка воспроизведения: - + Duplicate Playlist Дублировать список воспроизведения - - + + Enter name for new playlist: Введите имя для нового списка воспроизведения: - - + + Export Playlist Экспорт списка воспроизведения - + Add to Auto DJ Queue (replace) Добавить в очередь Auto DJ (заменить) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Переименовать список воспроизведения - - + + Renaming Playlist Failed Не удалось переименовать список воспроизведения - - - + + + A playlist by that name already exists. Список воспроизведения с таким именем уже существует. - - - + + + A playlist cannot have a blank name. Имя списка воспроизведения не может быть пустым. - + _copy //: Appendix to default name when duplicating a playlist _копия - - - - - - + + + + + + Playlist Creation Failed Не удалось создать список воспроизведения - - + + An unknown error occurred while creating playlist: Произошла неизвестная ошибка при создании списка воспроизведения: - + Confirm Deletion Подтвердить удаление - + Do you really want to delete playlist <b>%1</b>? Удалить список воспроизведения <b>%1</b>? - + M3U Playlist (*.m3u) Список воспроизведения M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Список воспроизведения M3U (*.m3u); Список воспроизведения M3u8 (*.m3u8); Список воспроизведения PLS (*.pls); Текст CSV (*.csv); Читаемый текст (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Дата создания @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Не удалось загрузить трек. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Альбом - + Album Artist Исполнитель альбома - + Artist Исполнитель - + Bitrate Битрейт - + BPM Кол-во ударов в минуту - + Channels Каналы - + Color Цвет - + Comment Комментарий - + Composer Композитор - + Cover Art Обложка - + Date Added Дата добавления - + Last Played Последнее воспроизведение - + Duration Продолжительность - + Type Тип - + Genre Жанр - + Grouping Группа - + Key Тональность - + Location Местоположение - + Overview - + Preview Предварительный просмотр - + Rating Рейтинг - + ReplayGain Выравнивание громкости - + Samplerate Частота дискретизации - + Played Воспроизведено - + Title Название - + Track # Номер трека - + Year Год - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Получение изображения @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. «Обзор» позволяет перемещаться, просматривать и загружать треки из папок на жёстком диске и внешних устройствах. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3632,32 +3649,32 @@ trace — То, что выше + сообщения профилировани ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Функционал, предоставляемый этой привязкой контроллера, будет отключён до тех пор, пока проблема не будет решена. - + You can ignore this error for this session but you may experience erratic behavior. В этом сеансе можно игнорировать эту ошибку, но можно столкнуться с некорректным поведением. - + Try to recover by resetting your controller. Попробуйте восстановить путем сброса контроллера. - + Controller Mapping Error Ошибка привязки контроллера - + The mapping for your controller "%1" is not working properly. Привязка контроллера «%1» работает некорректно. - + The script code needs to be fixed. Код сценария должна быть исправлена. @@ -3765,7 +3782,7 @@ trace — То, что выше + сообщения профилировани Импорт контейнера - + Export Crate Экспорт контейнера @@ -3775,7 +3792,7 @@ trace — То, что выше + сообщения профилировани Разблокировать - + An unknown error occurred while creating crate: Произошла неизвестная ошибка при создании контейнера: @@ -3801,17 +3818,17 @@ trace — То, что выше + сообщения профилировани Не удалось переименовать контейнер - + Crate Creation Failed Ошибка создания контейнера - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Список воспроизведения M3U (*.m3u); Список воспроизведения M3u8 (*.m3u8); Список воспроизведения PLS (*.pls); Текст CSV (*.csv); Читаемый текст (*.txt) - + M3U Playlist (*.m3u) Список воспроизведения M3U (*.m3u) @@ -3937,12 +3954,12 @@ trace — То, что выше + сообщения профилировани Прошлые участники - + Official Website Официальный сайт - + Donate Сделать пожертвование @@ -3998,7 +4015,7 @@ trace — То, что выше + сообщения профилировани - + Analyze Анализировать @@ -4043,17 +4060,17 @@ trace — То, что выше + сообщения профилировани Запускает обнаружение битовой сетки, тона и нормализации на выбранных треках. Не генерирует осциллограммы выбранных треков для экономии дискового пространства. - + Stop Analysis Остановить анализ - + Analyzing %1% %2/%3 Производится анализ %1% %2/%3 - + Analyzing %1/%2 Производится анализ %1/%2 @@ -4470,37 +4487,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Если привязка не работает, попробуйте включить расширенную опцию ниже, а затем повторите попытку взаимодействия с контроллером. Или нажмите кнопку «Повторить попытку», чтобы повторно определить midi-элемент управления. - + Didn't get any midi messages. Please try again. Не получено ни одного midi-сообщения. Попробуйте ещё раз. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Не удалось определить сопоставление — попробуйте снова. Взаимодействуйте с одним контроллером за раз. - + Successfully mapped control: Привязка элемента управления успешно выполнена: - + <i>Ready to learn %1</i> <i>Готово к обучению %1</i> - + Learning: %1. Now move a control on your controller. Обучение: %1. Теперь переместите элемент управления на контроллере. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5206,114 +5223,114 @@ associated with each key. DlgPrefController - + Apply device settings? Применить параметры устройства? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Указанные параметры должны быть применены перед запуском мастера обучения. Применить параметры и продолжить? - + None Нет - + %1 by %2 %1 в %2 - + Mapping has been edited Привязка была изменена - + Always overwrite during this session Всегда перезаписывать во время этого сеанса - + Save As Сохранить как - + Overwrite Перезаписать - + Save user mapping Сохранить пользовательскую привязку - + Enter the name for saving the mapping to the user folder. Введите имя для сохранения привязки в пользовательской папке. - + Saving mapping failed Не удалось сохранить привязку - + A mapping cannot have a blank name and may not contain special characters. Имя привязки не может быть пустым и не должно содержать специальные символы. - + A mapping file with that name already exists. Файл привязки с таким именем уже существует. - + Do you want to save the changes? Сохранить изменения? - + Troubleshooting Устранение неполадок - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Если используется такая привязка, контроллер может работать неправильно. Выберите другую привязку или отключите контроллер.</b></font><br><br>Эта привязка была разработана для более нового движка контроллера Mixxx, и её нельзя использовать в вашей текущей установке Mixxx.<br>Текущая установка Mixxx имеет версию движка контроллера %1. Эта привязка требует версию движка контроллера >= %2.<br><br>Для получения более подробной информации посетите вики-страницу <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Версии движка контроллера</a>. - + Mapping already exists. Привязка уже существует. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> уже существует в папке пользовательских привязок.<br>Заменить или сохранить с новым именем? - + Clear Input Mappings Очистить входные привязки - + Are you sure you want to clear all input mappings? Очистить все входные привязки? - + Clear Output Mappings Очистить выходные привязки - + Are you sure you want to clear all output mappings? Удалить все выходные привязки? @@ -5644,6 +5661,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6258,62 +6285,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Минимальный размер выбранного скина больше, чем разрешение экрана. - + Allow screensaver to run Разрешить запуск хранителя экрана - + Prevent screensaver from running Запретить включение хранителя экрана - + Prevent screensaver while playing Запретить включение хранителя экрана при воспроизведении - + Disabled Отключено - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Этот скин не поддерживает цветовые схемы - + Information Информация - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7483,173 +7510,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Гц - + Default (long delay) По умолчанию (долгая задержка) - + Experimental (no delay) Экспериментально (без задержки) - + Disabled (short delay) Отключено (короткая задержка) - + Soundcard Clock Часы звуковой карты - + Network Clock Сетевые часы - + Direct monitor (recording and broadcasting only) Прямой мониторинг (только запись и трансляция) - + Disabled Отключено - + Enabled Включено - + Stereo Стерео - + Mono Моно - + To enable Realtime scheduling (currently disabled), see the %1. Чтобы включить планирование в реальном времени (в настоящее время отключено), обратитесь к %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. В %1 перечислены звуковые карты и контроллеры, которые можно использовать в Mixxx. - + Mixxx DJ Hardware Guide Руководство по оборудованию Mixxx DJ - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) автоматически (<= 1024 кадров/период) - + 2048 frames/period 2048 кадров/период - + 4096 frames/period 4096 кадров/период - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Микрофонные входы на записи и трансляции не соответствуют тому, что вы слышите. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Замерьте задержку приёма-передачи и укажите её значение выше для компенсации задержки микрофона, чтобы выровнять синхронизацию микрофона. - - + Refer to the Mixxx User Manual for details. Более подробная информация содержится в руководстве пользователя Mixxx. - + Configured latency has changed. Настроенная задержка изменилась. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Повторно замерьте задержку приёма-передачи и укажите её значение выше для компенсации задержки микрофона, чтобы выровнять синхронизацию микрофона. - + Realtime scheduling is enabled. Планирование в реальном времени включено. - + Main output only Только главный выход - + Main and booth outputs Главный выход и кабина - + %1 ms %1 мс - + Configuration error Ошибка конфигурации @@ -7667,131 +7693,131 @@ The loudness target is approximate and assumes track pregain and main output lev Звуковые API - + Sample Rate Частота дискретизации - + Audio Buffer Аудио буфер - + Engine Clock Часы движка - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Использовать часы звуковой карты для настройки живой аудитории и минимальной задержки.<br>Используйте сетевые часы для трансляции без живой аудитории. - + Main Mix Основной микс - + Main Output Mode Режим основного канала - + Microphone Monitor Mode Режим прослушивания микрофона - + Microphone Latency Compensation Компенсация задержки микрофона - - - - + + + + ms milliseconds MS - + 20 ms 20 мс - + Buffer Underflow Count Счётчик потерь буфера - + 0 0 - + Keylock/Pitch-Bending Engine Движок блокировки/изменения тональности - + Multi-Soundcard Synchronization Синхронизация нескольких звуковых карт - + Output Выход - + Input Вход - + System Reported Latency Система сообщила о задержке - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Увеличить аудиобуфер, если счётчик потерь увеличивается или слышны хлопки во время воспроизведения. - + Main Output Delay Задержка основного канала - + Headphone Output Delay Задержка выхода наушников - + Booth Output Delay Задержка вывода кабины - + Dual-threaded Stereo - + Hints and Diagnostics Подсказки и диагностика - + Downsize your audio buffer to improve Mixxx's responsiveness. Уменьшить размер аудиобуфера, чтобы улучшить отзывчивость Mixxx. - + Query Devices Запрос устройств @@ -8951,7 +8977,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Tap to Beat - + Нажмите чтобы выбрать ритм. @@ -9351,27 +9377,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (быстрее) - + Rubberband (better) Rubberband (лучше) - + Rubberband R3 (near-hi-fi quality) Rubberband R3 (качество, близкое к hi-fi) - + Unknown, using Rubberband (better) Неизвестный, с использованием Rubberband (лучше) - + Unknown, using Soundtouch @@ -9586,15 +9612,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Безопасный режим включён - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9605,57 +9631,57 @@ Shown when VuMeter can not be displayed. Please keep Отсутствует поддержка OpenGL. - + activate активировать - + toggle переключить - + right вправо - + left влево - + right small немного вправо - + left small немного влево - + up вверх - + down вниз - + up small немного вверх - + down small немного вниз - + Shortcut Комбинация клавиш @@ -9663,62 +9689,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9728,22 +9754,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Импортировать список воспроизведения - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Файлы списков воспроизведения (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Заменить файл? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9897,253 +9923,253 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Звуковое устройство занято - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Повторить попытку</b> после закрытия другого приложения или повторного подключения звукового устройства - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Перенастроить</b> параметры звукового устройства Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Получить <b>помощь</b> от Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Закрыть</b> Mixxx. - + Retry Повторить - + skin обложка - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Перенастроить - + Help Справка - - + + Exit Выход - - + + Mixxx was unable to open all the configured sound devices. Не удалось открыть все настроенные звуковые устройства. - + Sound Device Error Ошибка звукового устройства - + <b>Retry</b> after fixing an issue <b>Повторить попытку</b> после устранения проблемы - + No Output Devices Нет устройств вывода - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx был настроен без каких-либо звуковых устройств вывода. Обработка аудио будет отключена без настроенного устройства вывода. - + <b>Continue</b> without any outputs. <b>Продолжить</b> без каких-либо результатов. - + Continue Продолжить - + Load track to Deck %1 Загрузить трек в деку %1 - + Deck %1 is currently playing a track. Дека %1 в настоящее время воспроизводит трек. - + Are you sure you want to load a new track? Загрузить новый трек? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Для этой панели управления пластинкой не выбрано входное устройство. Сначала выберите входное устройство в параметрах звукового оборудования. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Для панели сквозного управления не выбрано входное устройство. Сначала выберите входное устройство в параметрах звукового оборудования. - + There is no input device selected for this microphone. Do you want to select an input device? Для этого микрофона не выбрано входное устройство. Хотите выбрать? - + There is no input device selected for this auxiliary. Do you want to select an input device? Для этого вспомогательного устройства не выбрано входное устройство. Хотите выбрать? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Ошибка в файле обложки - + The selected skin cannot be loaded. Не удаётся загрузить выбранную обложку. - + OpenGL Direct Rendering Прямая обработка OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Прямой рендеринг не включён на вашем компьютере.<br><br>Это означает, что отображение осциллограммы будет очень<br><b>медленным и может сильно нагрузить процессор</b>. Либо обновите<br>конфигурацию, чтобы включить прямой рендеринг, либо отключите<br>отображение осциллограммы в параметрах Mixxx, выбрав<br>«Пусто» для отображения осциллограммы в разделе «Интерфейс». - - - + + + Confirm Exit Подтвердить выход - + A deck is currently playing. Exit Mixxx? В настоящий момент играет дека. Выйти из Mixxx? - + A sampler is currently playing. Exit Mixxx? В настоящее время играет сэмплер. Выйти из Mixxx? - + The preferences window is still open. Окно параментров остаётся открытым. - + Discard any changes and exit Mixxx? Отменить все изменения и закрыть Mixxx? @@ -10159,13 +10185,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Заблокировать - - + + Playlists Списки воспроизведения @@ -10175,32 +10201,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Разблокировать - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Списки воспроизведения — это упорядоченные списки треков, позволяющие планировать диджейские выступления. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Возможно, иногда придётся пропустить некоторые треки в подготовленном списке воспроизведения или добавить несколько других треков, чтобы сохранить энергию аудитории. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Некоторые диджеи составляют списки воспроизведений перед выступлением, а некоторые предпочитают составлять их на лету. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. При проигрывании списка воспроизведения во время диджейского сета следите за реакцией публики на воспроизводимую музыку. - + Create New Playlist Создать новый список воспроизведения @@ -11860,7 +11912,7 @@ Hint: compensates "chipmunk" or "growling" voices Величина усиления, применяемая к аудиосигналу. На более высоких уровнях звук будет более искажённым. - + Passthrough Пересылка @@ -12024,12 +12076,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12157,54 +12209,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Списки воспроизведения - + Folders Папки - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Читает базы данных, экспортированные для CDJ-/XDJ-проигрывателей Pioneer с помощью режима Rekordbox Export.<br/>Rekordbox может экспортировать только на USB- или SD-устройства с файловой системой FAT или HFS.<br/>Mixxx может читать базы данных с любого устройства, которое содержит папки базы данных (<tt>PIONEER</tt> и <tt>Contents</tt>).<br/>Не поддерживаются базы данных Rekordbox, которые были перемещены на внешнее устройство через<br/><i>Параметры > Дополнительно > Управление базой данных</i>.<br/><br/>Читаются следующие данные: - + Hot cues Горячие метки - + Loops (only the first loop is currently usable in Mixxx) Циклы (на данный момент в Mixxx доступен для использования только первый цикл) - + Check for attached Rekordbox USB / SD devices (refresh) Проверить наличие прикреплённых USB-/SD-устройств Rekordbox (обновить) - + Beatgrids Битовые сетки - + Memory cues Метки памяти - + (loading) Rekordbox (загрузка) Rekordbox @@ -15448,47 +15500,47 @@ This can not be undone! WCueMenuPopup - + Cue number Номер метки - + Cue position Позиция метки - + Edit cue label Изменить ярлык метки - + Label... Ярлык... - + Delete this cue Удалить эту метку - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Горячая метка #%1 @@ -15613,323 +15665,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Создать &новый список воспроизведения - + Create a new playlist Создать новый список воспроизведения - + Ctrl+n Ctrl+n - + Create New &Crate Создать новый &контейнер - + Create a new crate Создать новый контейнер - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Вид - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Могут поддерживаться не все скины. - + Show Skin Settings Menu Показать меню параметров скина - + Show the Skin Settings Menu of the currently selected Skin Показать меню параметров текущего скина - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Показать панель микрофона - + Show the microphone section of the Mixxx interface. Показать панель микрофона в интерфейсе Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Показать панель управления пластинками - + Show the vinyl control section of the Mixxx interface. Показать панель управления пластинками в интерфейсе Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Показать предварительный просмотр деки - + Show the preview deck in the Mixxx interface. Показать предпросмотр деки в интерфейсе Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Показать обложку - + Show cover art in the Mixxx interface. Показать обложку в интерфейсе Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Развернуть медиатеку - + Maximize the track library to take up all the available screen space. Развернуть медиатеку, заполнив всё доступное пространство экрана. - + Space Menubar|View|Maximize Library Пространство - + &Full Screen &Полный экран - + Display Mixxx using the full screen Открыть Mixxx в полноэкранном режиме - + &Options &Действия - + &Vinyl Control Управление &пластинками - + Use timecoded vinyls on external turntables to control Mixxx Использовать пластинки с временными метками на внешних проигрывателях для работы с Mixxx - + Enable Vinyl Control &%1 Включить управление пластинкой &%1 - + &Record Mix &Записать микс - + Record your mix to a file Записать микс в файл - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Включить прямую &трансляцию - + Stream your mixes to a shoutcast or icecast server Прямая трансляция миксов на сервер shoutcast или icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Включить &комбинации клавиш - + Toggles keyboard shortcuts on or off Переключает комбинации клавиш - + Ctrl+` Ctrl+` - + &Preferences &Параметры - + Change Mixxx settings (e.g. playback, MIDI, controls) Изменить параметры Mixxx (например, элементы управления воспроизведением, MIDI) - + &Developer &Разработчик - + &Reload Skin &Перезагрузить скин - + Reload the skin Перезагрузить скин - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools &Инструменты разработчика - + Opens the developer tools dialog Открывает диалог инструментов разработчика - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Статистика: Сегмент &Experiment - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Включает экспериментальный режим. Собирает статистику в сегменте отслеживания EXPERIMENT. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Статистика: &Базовый сегмент - + Enables base mode. Collects stats in the BASE tracking bucket. Включает базовый режим. Собирает статистику в сегменте отслеживания BASE. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled От&ладчик включён - + Enables the debugger during skin parsing Включает отладчик при обработке скина - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Справка - + Show Keywheel menu title Колесо тональности @@ -15946,74 +16028,74 @@ This can not be undone! Экспорт медиатеки в формат Engine DJ - + Show keywheel tooltip text Показать колесо тональности - + F12 Menubar|View|Show Keywheel F12 - + &Community Support &Поддержка сообщества - + Get help with Mixxx Получить помощь с Mixxx - + &User Manual &Руководство пользователя - + Read the Mixxx user manual. Открыть руководство пользователя Mixxx. - + &Keyboard Shortcuts &Комбинации клавиш - + Speed up your workflow with keyboard shortcuts. Ускорьте свой рабочий процесс с помощью комбинаций клавиш. - + &Settings directory Каталог &параметров - + Open the Mixxx user settings directory. Открыть катало пользовательских параметров Mixxx. - + &Translate This Application &Перевести это приложение - + Help translate this application into your language. Помогите перевести это приложение на ваш язык. - + &About &О программе - + About the application О приложении @@ -16048,25 +16130,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Очистить ввод - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Поиск - + Clear input Очистить ввод @@ -16077,93 +16147,87 @@ This can not be undone! Поиск... - + Clear the search bar input field Очистить поле ввода для поиска - - Enter a string to search for - Введите строку для поиска + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Использовать операторы наподобие bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Более подробная информация: Руководство пользователя > Медиатека Mixxx + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Комбинация клавиш + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Фокус + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts - Комбинации клавиш + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Инициировать поиск до истечения времени ожидания поиска по мере ввода или перейти к просмотру треков после него + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl+Пробел - + Toggle search history Shows/hides the search history entries Включить/выключить историю поиска - + Delete or Backspace Delete или Backspace - - Delete query from history - Удалить запрос из истории - - - - Esc - ESC + + in search history + - - Exit search - Exit search bar and leave focus - Выйти из поиска + + Delete query from history + Удалить запрос из истории @@ -16919,37 +16983,37 @@ This can not be undone! WTrackTableView - + Confirm track hide Подтверждение скрытия трека - + Are you sure you want to hide the selected tracks? Скрыть выбранные треки? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Удалить выбранные треки из очереди AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Удалить выбранные треки из этого контейнера? - + Are you sure you want to remove the selected tracks from this playlist? Удалить выбранные треки из этого списка воспроизведения? - + Don't ask again during this session Больше не спрашивать в этом сеансе - + Confirm track removal Подтверждение удаления трека @@ -16970,52 +17034,52 @@ This can not be undone! mixxx::CoreServices - + fonts шрифты - + database база данных - + effects эффекты - + audio interface аудио интерфейс - + decks деки - + library библиотека - + Choose music library directory Выберите каталог библиотеки музыки - + controllers контроллеры - + Cannot open database Не удалось открыть базу данных - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17029,68 +17093,78 @@ Mixxx требует QT с поддержкой SQLite. Пожалуйста, п mixxx::DlgLibraryExport - + Entire music library Вся медиатека - - Selected crates - Выбранные контейнеры + + Crates + + + + + Playlists + + + + + Selected crates/playlists + - + Browse Обзор - + Export directory Каталог для экспорта - + Database version Версия базы данных - + Export Экспортировать - + Cancel Отмена - + Export Library to Engine DJ "Engine DJ" must not be translated Экспортировать медиатеку в Engine DJ - + Export Library To Экспорт медиатеки в - + No Export Directory Chosen Каталог для экспорта не выбран - + No export directory was chosen. Please choose a directory in order to export the music library. Каталог экспорта не был выбран. Выберите каталог, чтобы экспортировать медиатеку. - + A database already exists in the chosen directory. Exported tracks will be added into this database. База данных уже существует в выбранном каталоге. Экспортированные треки будут добавлены в эту базу данных. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. База данных уже существует в выбранном каталоге, но при её загрузке возникла проблема. Успех экспорта в этой ситуации не гарантирован. @@ -17111,7 +17185,7 @@ Mixxx требует QT с поддержкой SQLite. Пожалуйста, п mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17121,22 +17195,22 @@ Mixxx требует QT с поддержкой SQLite. Пожалуйста, п mixxx::LibraryExporter - + Export Completed Экспорт завершён - - Exported %1 track(s) and %2 crate(s). - Экспортировано треков: %1, контейнеров: %2. + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Ошибка экспорта - + Exporting to Engine DJ... Экспорт в Engine DJ... diff --git a/res/translations/mixxx_sl.qm b/res/translations/mixxx_sl.qm index eaa9dddfa5b2af8c922ef0d52fb52fefff35e963..4b08bf6b646d28a5122e6074ace0666623bd3773 100644 GIT binary patch delta 23770 zcmX7wbwCtP6vyB0%xv8q_Rq$|786?(TkJp-6cq&<6I)Kf4lGnGOe_=wI}lV<3@pUP z09#S)#NU_Yug~6bF+216z2ob_BJn$lEGcTAPDEvhifEt{NoT@L%2oTCWYi3-PVyTA ztU=^i-6V6I4%Q^6z zb`^`_6NsH(1Wv>A+reNgzyl1y_f!TK;qg{*J=ta7rnuOQm7N9mfN#MASRw9)p8^+v zSMf&N8Gi(RBT^X_=mW+P3m8aL9(OpYaSmTU0w?0}aH7f$iMgBuy@?f^hYfVV^J}qT zrLmLv+}dTaYR`ALaKarm0W08+i-NQ8crcMm_MI*TXOn!O19mw3bx(*If#sq=eDQ%D z*wJnz-OLTH$DL(@k4U=T3mc2~6g`x~YB+-I$HUv0WcB<&dk1V4jsSlUHy49ru!S~o zE6GZO98M`f)TRna!^W8u5Ant}*;_aT#25N?BWl}>#7TU3+w8}eiQMs}L6=PO$aO^R z@cIG$h&r?)_WmX~gQTZ{MD`B2vn;%@;{ZGX8R&u+{3-_~5;@+>VXYY^ncD@ELRy`} zTQ_p}3bN6)7D;!o@NP9ALkq#0;C|4Pq!S0hK_nl0VUlTD4*v+UQ@6RqM`G){eIb_h z2F$`^2uF8~*gp@GqVN~+0!hPzi9F7eTsnrR2V~?Q?i^%;aU?y@63?3sfjmWg6rK+m zNmA5OlIEll+ghHa{$xAJspCj`A&8ZOlz#Uo)~pp|q8A8h z_dHIl#V?ZghY@Ryv)+G}*qrP$pF}*+AXaZN@u;=L?sYXOo&|#tg(oDOB_%%*!;cw#CTaxTjocNtAqLn>O^5nY2A66mx zXbSOHGjVp`iNC8(Y|$a&AMRpHRg+Blki!qTiGSOQqpVB9IECHmMZyIVpZ|eL$;W1r zZ3s2V?cExasGEhYFHfRj5Vn34iB_F(mJLnHX+ub~ae+#$&SCchCRyJbCi%!)B-&$Z z9}P4qiX8%RT&X)uisJJ~^uUeDUve0GhD3in_pvew|5&n%I7VX7S(5H5B*s8TU#&7J z%1Ak2n`{5>qio+VGF86o0J1{9<$xyB-XVcUZ?APV^uV)sG}ce-is#?8K|A$3=6J%Bd!~({~baP_a_ibLi6Aq?F-o zlJ(O}@=-w~enTKjW8v9!nQW5Px|qXuLrse0Q>1L0MAD#&q-4v$@EfF7P9`>@38_Qv z(8ZOZq)tpGiijk2tq(~Hij#^vVC!Cy_SlhlEqAiC>kdOwDu>lvO|ptEIjlRuq_~ku zmgI57!^TpsQ7}SdhEndSH{m-5Ql58bh$Zf%yj!PXN9RxhwH_%2x6ps~kx+#SnN)BE zr1oqFD$){n)%O#XT<=S4YzK0(uOO+gt4T3r2bGKABt8B@6>38(?k7-%y3mIEU#UX- zU}F1gQ^n4uNow(zDoz4h9-&GQZn5hgRl4qkZMRURY~d~FVNyiRCVOQF3#%}nOuB$L zE3xtoRlatCMD$gvQmYrq)BLDPi|2577pQ7tO_H~qB(#02d`R`KR=Gek*)O)~6EckF=l+?BeA%!mCq;<7JD?m3P; zh6wy&5B0c=FZ>u!JzlLKuJ<8NBOH89o)>SEbn-zC<8xEbVx@@sHl?03Zxhe;k9wYp zg%g@YJuj~&X?F*ctoqa(F5OGL2Ep#GuR*<+~YbgoH*YktJN=u?tVE$#FYI$=KnN@gS(j& zaC+W;(M0Pr$lE?P72(+e@}2`PR%_!882NEr>PJZ4AB>5d6yB|y=6~0P-R|AN9)SyAtaJJve(@+SbQqfK${9;I{#Aw9Q zcoL`nP{6DRl3VwpfcVDnD8C!B_A)#2?e+Dk8A$Nz*SrA*r~PW@IiWG5IY8cL*a^^)Uqx zj3pNBOtT7ykbLPQ&6-#r+H#o|c*nq!ouUO3ix6-2off^d693tfLdQpw6x$|;@y#gg zK?d=dnY3ypEay^3lk%0-IecV)N^4qMV5wfy+A+6Cs_01Twp}8Y#3>>)jA;K6+R%DG zak&d^dY3^|E|9hqgcfKqwB?#Be7qZNJ!=r8AtK&6zzJ1h$%Uaq8?(W?W;FZbYe%6q8rg(-@(M&Hm7~w$A~VyrhUmc zvnWO}m$Kce8y(&oO?<;NIvQF8kBQ~` z63u-m9u7-7e3Z`BA4jZv2wm{3N9=b&x-g+0*`>7QbRh#mL$~STR0Iy;V=1va0?bo+ zC~*w*`r=1QTnVpOY#Uu!w1ngpX>?`VIbxob>BbBQcFZ6_rz!bRCW#H#=+5eU zBtI%mcT2~T0d?taA{J0NmhL9Oo5n4ohmMmF|8EGVN4XHe?k-GEM#KAk-$GBP zIurT+qclH9Vz<7~t3l_87yUr5COVPy$&=o8-AVLx9lf2LMIwG0y*-(a*!E@g&OEx~ zlo&Dk5DFAW8{mGK__#yEd z@e&({vu#&c5)~YX_C!nS9U|&9RnkV3BJO)%($_eWnD<4p9O6VT2TB$@E`(ExK0NmddUTBHl1wDt8>O-yuttK68>Q_Rpb9d#Q5#T@qJS$zIJf zo@jhMsoDfEu(niPOCs6(s8r+iI1)i8q*`yG6_=|>b?(k2srhHAZq0E-AH7Y=J5EV; zy)MC@|BxD0g_=&SAT`=ijYN2EsnL;&Bu|Z%8a+%U`SJ*<(K8%n;h$3DX3oUllGONg z7)dYp*`?-lA?4fNN-Z7X{f6|AS~bSmzS$wQdV(b5`YWl`Gw_Co)M+$?E%}qwZQo52 zjRK^eQIkkzMEW06ib!*`6iK4xU|&&u{UDO z4w7%RP~xA!&`Tr@vAatH&U7O=&Rg<9h*`)5*W8pwUy_KuX(5gK<3sXG zH)(uRFOtSON|P!gWIwW6nl#IYn0-cVY0AdeNTn?~v|Y_%?~W$L{npada@`RbPn3fE z{*YAtu4Mm>{P4l^awboTfd|k&aouFyDH75X)#j05po zeWW9mHImwX1%u%2Jf$Phb2enR6x%R@q_ZWZ*wzrLz&=vKImC=Rg>*5`Wl{=UkPDo4XJ(67ArE785 zNt)*=U3Wq5emvTwkgiJC8# zg&i6BTS^`fP4dsnQt}TU;&(qtDU}Wq^Ujh|4#2RLzAoJxvYh0a)1`aJGsyp;bl)CP zfaF$(q=)24Y-2&`VMQ2@jZLIS4Ujng9w4PUZy~nrzLa_Z&ZN*oDLp^7&bT4HN-2Pa zUzT2vgI0JQ&Edf3(#PsZ*(=YNKCX=*vEYyNDIGhOuc`FI4^p2zQ2Mz8>UXT4^t*a8 zoLPco|8uw?iP@Sghhj@_RFLIoH?RYLWz`Ew=lf!^x^^S+d`)GWH{RHVWQViINk0Cc zoaxUZ&w994AxR5m1TXyQ@Mzm|1Ty8Jau%afHJBG(m?c~ZGx{|bTyGgl! zF}de4xXG?aG^AtIWw(yl(({ev=8r>QdP#1XXA834 ziE^vz_`(Wn}N?m3g#x?1iKdW$G_y4<-Eyyv1bCRu}G za_4zE$?^ZmUFIz(YTzk%T?xx-ADkt73}qy*Rpp-HNyPH(mwT@52BG>O_w9@~T#uCd zZh`RBzAyK02gC8^mOOB0GRfsT%LD(#5}(sa_Pc_uF8@Ow>=jE=r|t6KOvHk1nLK3i z9Af;IJTx5{b%{7Ii}=p6^00!Cv4H&YDBoL%|38h8C)ap~I^I%w+Tj$EJ{OklwH!z) z@zbOjQC*(VNnC3EOfT;8$DjupSkly_{bNaBaHyem7Gi|b&L zRp=o{-Gf&=5-0C*YDp~EQ{K;45UsVz2OiubDp0_r>jkLE`O0^64Yc z`vO`HV*};5KM_O?kI3;gp}!}a$?*q&l2k8FKJT;{CAl>Dd>j_++fqJ%3$oMHQ@$AK zO49oFa^kOUMA0YZOL2k3%N&!hIO6COyL_eHeB^}v{er=PluIsy0v;r`IC@{95aYF&=n<+sZm zi2qkxemBFBL`IDKK}V)D`slz(I%Ad&l>{IdltS^fz5=iEf16OBx=qEErs za4L8_A4j;mnEW#Vna$AI@~=r*Bs%)Yzc!~6`JIt}?I?^do*`#NdlD<@%&5amQe5m; z7&liqj*07mBySkZ)QA8Qwd_p2{*1)L70gIFL&Ex*8FwIb#y4hs&i;Uj%(@WCYQxXW zdI>Tz{sXfmMH3sgkU2yIk?^yyT$Dkq=0%pPXgvg@eOazYkdbi4@ zV6qeAScAX!q5nM+SmU7%B#!=MO`KqAtNmh4Qn3>yIx)A5BP7>8!J11x#Ex0OAY#Wy zvli_kw8MU}7V8g^q`9+}kNrr}r!#ki*z)=L%zf?#r0?IE`$7n({)xG#EF;OXk9Ewp z4}C7NPCb^BtiH`A^8fsWna7H@MCXsN9+eU6J$lJJ2mM3jQi1i%ZX`^u!@S4cLAYIt zdGCT0TX(ZQmeQ4z!k{vzojz&ve5|J73M#x zAkjHjHe{a+19yOpD88R0We^+D*p3UaiH$A4h3J!DV>=^X7tL58p@qUbu|SW3#Cug@ zf!Pa8m}64@sIrM6Ffd6TY~su^#GUW4sV7574tc|-^+Wt{q$iuUpfGW_+04E+J5+OH z_PAIQiw`mTOK3}m2b<0_N#0(GO}7`CgP`#Po1O(VbDqsY%sUQXGXs4{9A3j_y?_Z_ z6~<;CK~#IaADc6{ETq|uEu4!G%XuhU7>W?9YCjfw`vGFVc`R(*793%DlVV~6w&G-8 zl5SOJtA4^OPTs~=R}Ue2DA?+K5hUAQGW(h)=wLm_%ho)ZNUYRq7SZSx(YozyQ(F`i z%M@Udy#q+PUYTtxm_*Wp*=$?PYm!QjU^@!WL#~*_cAV))v_@ll#6S{fC$qiEeN@Y* zvVBK4L*Ku!gGC)k_IG55Qo=~)dDzhx&Ln3ZWG4`9^IQRTcKVPnamNNMp~(~C6J>Tm zzlsI;m}E`!nH0|}v5QDFsqZn9e98`%*sBGq+SAyjzfDo^b75BwV8}knh;+Iaa zXK8}uvSZov?JY>y{n)DsuqXY(+3ON`{_IHh`hzQpt`pgtKCl;dHh_H^j4f`Tp2Mzb z>{ANPcvNx?Veyh1fe|E*ed3nljCjE(+=^O~T@+fu^9^@IZnuc% zdyUv_+h|^}!XT2_R$gRN0`X=3yl9PXsAx3hMHeB2S`xt>*CEi@lFm!ifOc%_!b?1g zCed>ZFNI7;Y_G@5cy%Y5zlN7tdk*$tFE87=8Hr8jc)8lBhPNod%T2}3TpPyAozJq9 zXjqR|?B_rt_yVsqq%E;4XL+SyD&NrCTl<1ndzM7P=K!xcEP|N) znAfk5om*FmH=G1h+j$Ug+&zi-Ac~`H9OPkA z+;ry)_xh5YFoB24XVJLu;Y(JYK%l~S7(y`FaUoyPyfsR<2l&c$kP-jGd{vL<#Fhr| z@U|xrs95dh1shY$qxXb#qo6~px0OW^K~Z! zv4uBGih4cyhP)0W$vWRO5o%R!C*Kr@>e$AjeCwo6=nwSZk@HrNT&)X_+&zb+C)4@1 zI?GXQw|C|{=EERJhfPX76HW3C4^4`voA{0|Sy*{lzN;F9tz93!>&paWMAvy#=tE+6 z82FUL0S!dFaG)WW1_prX;3n_|m<*yK8l&>4#pvAMsR7Ec4>1jJfl%q>KrlCnL!CiH zDt9)3j(8jb!VcWI3YNm-!(drF{td!e-K_{Bq`K?Lqt@3T`FkRW7R`@bAmWH09$;;7 zEsxp*HQpY>cUOrdxl1759n~kh|38@TS@MNs_hcUJgP#B8oBY72{zUT@@EEt-DAc%^ z6d@TrCax#C+!OfWHj!wj9pi`3Wsp21fgiOFBDUl^KfWiG=weNiBK8bFVH`w|I+CAS zjS8!r#!tmmz)`&5aUmUvS6ji)c}770E#>&RNlqk%wBZRGV^NB^#4pNtWBH!^Vu5ZX zr4;6gL-G)-w3a8XLsyZO!K zV~F=0#c%iSNUT+Ue!GtkQZ^r+G96WRtp{kwMVGxiWzjg2Rs`{s<*0H!InVE6)`Pu% z0wTnElb1i3_MGH8)A^$qtbE2I{`7G=(a@?q4UGx*-p12%^;pwxhlhk8<4hJ^l zFF!$c{Fd{#J7-~Pqf8F{=j3qESN_hP9ESLP34gy0A=G~p`NxfLk9St^OuJ9EaPZ8_ zcZj9l<(bbyiD?t~rU8`z)Lywua?6>tN9OjQ@-*PxBvD)o3y%xXZ4tcP-+~{+7FXEVUr+hJ`zz!1$9Xy z>Ak<;<`$n9VkazPpOZpd!NPZrH_3k3gm^5F^6E#179FmeN&- zf9@zO?IBa14TOzwBiC(qk$2K(q+F*>vguY)aMf9oa!oZUJOV{g)PTr!gD75n3<>dE zlx%s7#Lqb4)Os3G&kZJ7oslNRoqfXTH!`R%r$xCSI431URB(o+i;NdluC+m}xS^=t z4hhM&VWQ?fl=%bgT-4f{A7OKtaB+N1)Oo0I33tNEM+ukxrBDG`BI<-~Lh!iMq`d8& zN#W2=)bqxfXLS?x2jTsz>WPL;%M`u3sJb6Xc7f|)*6YXBAKW}A-6F}GHt)mdla?`DbCl~xmVaTjfOzaic+ zw`g~(DY0=KM7t;W{Bku!`z|if{}O8i3e+TjD=oTCjwSjz)TF5QN_Zq;2ZD=;9?Pc^ zXRAdoA9%gDTZLCUc(=^v!Yc}frbtQAdnpoJ^(Pg0`} zCRy?OCV7oHCPm0f(Jv;*PSVoeqTieQFev`Q-}Fi?g?}UrOzZnOY?n{?|AieWyHgAe zbRf=iiDB7c^xiBn+!67@{+nXBb2gWW;ek(KqT|HyCEaoM-NbN2&GM)EB48fugg#r0 zYKj$g~oqkVp1rI$3jd_L}kM*pGh&> zS4_=*-0XpvHV~0bnc^bkN&tzl_tmOINO3O)Rum$4JbI5n^GTei#UOFBUePO*E{ZSlB9os8Ab|Qvcf~ zWlQHAuGnr;eA_7&X3vHcnr%|@wVITBl@bew!H~@!Zc@~#AQqm)4PD0t`%!wCdQ~jfppOHi#PSXhrUHY+@~vM;T&^#|rko}D^BA$B4L+b%EwN%4qFDtXRm2q$S)mC@-hp=u4{!!UinExg+Z!o>=)75&1a|oM0AUT#Fw5D2g5Ir+n* zV2eF2PMj{Efd<2K5mzS&7H*J;>rs|yMQxM(<{S~9fqwn54&vMgXvOJOA_0R3(g4{c z+dS4J?><(X{}fAne!RF;wJ7mb3&oY}Mn-`LBFU>Zv3mbZiqxXwT9JxGnZ?ER3)%Vq zp@HJ2rji&sOWf)nMADy2;#SIX3?Q8qDfK!M;Rv!R?oJmejgY@LwTpYZU64Eu%HgvQ z;@%CNXkuq^Ke;r#;WY8k&6UK|f#Q*GG>JV0#FOA##JlelPv+%AUtzR(a(D<)e>d^W zza#YDsYmt&iIMX~nu_SR^k`AqW6{)&7VvEGR13fqkAcg|>q?Suua z;H`*rSZMS_MMdX>S6Hp6FXtggtgYxN=mm#Kimf=brOFk))JK#||8ysFXFm;eC^=PNYe3CtWGK4B0RLt(1+x4V^AvQdr9?PDNr+ zmfNe?oi=_T7ByEXm;C{~3YcVd9+(t&3n>-CB9T-cP%33xwleRO%HvZ>^q#0VS4u<7 z7ok)yWe{sTNvYu#O6=@FrCxF9b*{BaBTq-f_fbmY-sLez_*Zca-;6@%Y^6!LTqJp0 zl;-jIh}GY0S6bG>8Be;SvZ2|@m0u-+oa5C?UDc({6VzcKc-pim3#}+8PUoOQCj8=Rm zL!D~WReTP-MIrKo(swU}t;Go51 zhRy1R$%w(q@EV8*28AobDCH%b$dcG}{)y5=vv(idL_S`_1oyvyVGl|YLS2lPd2!X78!9Wk*^sVs)x0yDBcn z#8N3G>L9#f$PQ(9VkGf^d&-_7$kkeWRrX*9#O@o)z5$M;ROzW4aB(KlDOHJ4J0g#G ztHiu~PSO>-a%?zcXyyy$L>_!ju&kVDi)8cnEF~^Cv?9Eg5|`%?(c7`gS-VxBO;$uX zyWSNIfh$TvLK4yRtIBy>5Lz%+<@|h9xvcM$i=(jvk5(#|muC>Y{;phU<_gRAT)C36 z1zqoRN>X-)3ZgkJlvIRJ^zDk0<~ovC-M>oOY6Kh) zrz>e|!29c!=cgwVo04C7u{Vgs`M=65pBu!zVwG1}Z84(3l-HOIVTB4RuicRkB zzg_tq1fIRB{M{E#!n33D4^3=pW4Eg8&PGUexGDm%qVfw=WeJ3DT2ED9lZC?KWYs{7 zN8z$+bwl*~@tkT!Vj;)RP;K>a#|7T04z4#z+BH;lIOssq!$dXrhsP+*6j1ZZKE&qu zsD+2&2wR4z#a7@q0eRP&6zN^mVk_a4>|t%yVz-fMZJD7Kcm0K0PC?aiU@R%s2dgEs zVu^D1F)8)5n&h2))zTr;Nv=9eE&B#vaBY-oWn8Mn=TWuVEkB|>873v~{c5$(ekd}vQ0o|oa;s=+ z-L^i+1)Hn&)?({yjn#(Ldc#RMsEvX#hTXKK+L&XuS1YSFp8SdUh$OYy>RwP+o7!B4 z_bWbBZT=s;W|0JwibI;($tw=Utkc;<|9@$HwX>p;@?VhJwK(p)&Lp)f(sJp}aJBoe zNhJU7r*^-EJ6-9fdR$0ApTHf&oh1}eJ^zF0e%4g&xh09DtDn_gKhjAazgzV|X;lnY z)PBp+JKEY-?eBsk9hXb(KP3i3%MH~2KasqaIi>pEv=1ZUT1XvG8Mb=aOm#qZ#jhFJmnD0x~|7jwL9>vws**%;6H`OU2Es4e?s?!GJ`EPFOv=g;a*K42#<-#30kUG8C z7x@1Wb^3OcSS?QK4CkA~C#mX;FHS_OyQ*`pz|Du>Qx_B~LDJvb>H_ z5rSP)7kqOj5&279*e^Q|NLCkKXoNA`@#?~Bt8kVza#*{Cy2$GX(aV$SqV!l2&GxH{ z$JZzMK(e~{JJhwXi@GfSCmIv=)v&Zmn6U6sv%_?$rKcKR7U_4bi)#4NbC`tuquRrF zcO)TISJym*bVoH**H>x_sr;jEbnZ`b(gJnUVJv7#fVwF@ny5@qb#vAG2t+ohTOp*Z z)Gsyi8WvFbth#OMIbt43>h`@bFgG8lJK~_mt(vMkC&JyneWUK~jZp7xXEmB;f!o!+ z|6wGf-AB8+cM5tvD+1Mh_SYo8Ij&}h)hwW*didm5jAG?B$?vpNkIjUAIFqCvuburx z71R@tVDa+zR!_}>Gx@VYJsmI>N$deN?rJTP_s&tz&Vi5Eb5K2(kW5stqe+p`TfHE! zBHq=iURV(UnX=zi6X(N1P57f;dWhUlELN`^*@Xh4zj|#zEt1m9s@K=|Cn+jZy(vT5 zM`xZ`fSh_7>1 zUoEIfeEkCT)m=2J9MaWS4Q-A#Jh`iu}`YZ22k_UHHe?`wmQM#C#9n?y# z3akIBmnD{2SN-Sdix5m`g!w=DLxM&lXCeNtxJ{FeL%mKn(^y|l+=$Y|o-IVlcFh<$ zndIp|HCqD+XZ2T_!x)58t2StPPJbfN{iasHrz=S*owWihqe&F$qy1MSgQN|$wSq|H z#3l!=Pzp*p=h|vTOZFrA+G?%jj+dw%71B!Xhs;GgXinRD<^rD_0dl zQ+kP3ZXW9MLe|Q?g>y>$sg-wykhR~cRR}CXlK%v)${l#eWk^6+=E#2 znOe0CMM-KLrB#p0o&|T(s(<8Y!8X)tbb~3cS4gY*%!BBXyXJDP406tLS{=i_m88nG zw0dq?Bq~K{^%vnzegA0nS9K?z=djjL#sFb0SFNEl&QSiVxv~Oi9@W*{%Hzla*P7%J zbF@|u9f&XLuC=bnU~1=UZQNidh)hbu)|(WMx@m2E@GF{{f3-G~4w3jgLu+f#(}MW2 zJX+g}a1#E1w023bWT*VKjt`N!?3t!@?vI6)+oyHjA5FX-)4FUM0I5H$bxDpO(cf3| z>X4tLhD9{*8_~p^g0xiuK9fPASrQ!)_3R`lG^vz22_fG`hL|0zMoDkqlD(y z{UcF8sAeCOy(LMTv>^>E5__j;Bl^NEo=Mk6M8Vx|kJSRIz9yx3cWqQ-+*!q++St<> zBtQPFjYE4)eqLLfAl-tLyJ?d)p@cKkRhxPS2FSmsHZ?ulyD8fAKhE&`@3a}gup
  • rD(goUr7zlrrRmn9O^k@DqZ9G5BI|u6oT!Db=G| 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 - - : - - - - The size of the file which has been stored during the current recording in megabytes (MB) - - - - - AnalysisFeature - - - Analyze - Analyse - - - - AutoDJFeature - - - Crates - Caisses - - - - Remove Crate as Track Source - Remove Crate as Track Source - - - - Auto DJ - Auto DJ - - - - Add Crate as Track Source - Add Crate as Track Source - - - - BansheeFeature - - - - Banshee - Banshee - - - - - Error loading Banshee database - Erreur lors du chargement de la base de données de Banshee - - - - Banshee database file not found at - - La base de données banshee n'est pas trouvée à - - - - There was an error loading your Banshee database at - - Une erreur s'est produite lors du chargement de votre base de données Banshee à partir de - - - - - BaseExternalLibraryFeature - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Import as Playlist - - - - - Import as Crate - Importer comme bac - - - - Crate Creation Failed - Crate Creation Failed - - - - Could not create crate, it most likely already exists: - Création de bac impossible, il existe probablement déjà : - - - - Playlist Creation Failed - La création de la liste de lecture a échoué - - - - An unknown error occurred while creating playlist: - Une erreur inconnue s'est produite lors de la création de la playlist: - - - - BasePlaylistFeature - - - New Playlist - Nouvelle playlist - - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - - Create New Playlist - Créer une nouvelle playlist - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Remove - Supprimer - - - - Rename - Renommer - - - - Lock - Verrouiller - - - - Duplicate - Dupliquer - - - - - Import Playlist - Importer une liste de lecture - - - - Export Track Files - Exporter les fichiers des pistes - - - - Analyze entire Playlist - Analyser l'entièreté de la playlist - - - - Enter new name for playlist: - Entrer le nouveau nom de la liste de lecture : - - - - Duplicate Playlist - Dupliquer la liste de lecture - - - - - Enter name for new playlist: - Entrez un nom pour la nouvelle playlist - - - - - Export Playlist - Exporter la liste de lecture - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Rename Playlist - Renommer la liste de lecture - - - - - Renaming Playlist Failed - Echec pour renommer la playlist - - - - - - A playlist by that name already exists. - Une liste de lecture du même nom exise déjà - - - - - - A playlist cannot have a blank name. - Une liste de lecture ne peut pas être sans nom. - - - - _copy - //: - Appendix to default name when duplicating a playlist - _copie - - - - - - - - - Playlist Creation Failed - La création de la liste de lecture a échoué - - - - - An unknown error occurred while creating playlist: - Une erreur inconnue s'est produite lors de la création de la playlist: - - - - Confirm Deletion - Confirmer la suppression - - - - Do you really want to delete playlist <b>%1</b>? - Voulez-vous vraiment supprimer la liste de lecture %1? - - - - M3U Playlist (*.m3u) - M3U Playlist (*.m3u) - - - - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Texte CSV (*.csv);;Texte lisible (*.txt) - - - - BaseSqlTableModel - - - # - # - - - - Timestamp - Horodatage - - - - BaseTrackPlayerImpl - - - Couldn't load track. - Impossible de charger la piste. - - - - BaseTrackTableModel - - - Album - Album - - - - Album Artist - Artiste de l'album - - - - Artist - Artiste - - - - Bitrate - Débit - - - - BPM - BPM - - - - Channels - Channels - - - - Color - Color - - - - Comment - Commentaire - - - - Composer - Compositeur - - - - Cover Art - Couverture - - - - Date Added - Ajouté au : - - - - Last Played - Last Played - - - - Duration - Durée - - - - Type - Type - - - - Genre - Genre - - - - Grouping - Regroupement - - - - Key - Clé - - - - Location - Emplacement - - - - Preview - Aperçu - - - - Rating - Note - - - - ReplayGain - ReplayGain - - - - Samplerate - Samplerate - - - - Played - Joué - - - - Title - Titre - - - - Track # - Piste n° - - - - Year - Année - - - - Fetching image ... - Tooltip text on the cover art column shown when the cover is read from disk - - - - - BroadcastManager - - - Action failed - Échec de l'action - - - - Please enable at least one connection to use Live Broadcasting. - Veuillez activer au moins une connexion pour utiliser la diffusion en direct. - - - - BroadcastProfile - - - Can't use secure password storage: keychain access failed. - Impossible d'utiliser le stockage de mot de passe sécurisé: échec d'accès au trousseau. - - - - Secure password retrieval unsuccessful: keychain access failed. - La récupération de mot de passe sécurisé a échoué: échec d'accès au trousseau. - - - - Settings error - Erreur de paramétrage - - - - <b>Error with settings for '%1':</b><br> - <b>Erreur avec les paramètres de'%1':</b><br> - - - - BroadcastSettingsModel - - - Enabled - Activé - - - - Name - Nom - - - - Status - État - - - - Disconnected - Déconnecté - - - - Connecting... - Connction... - - - - Connected - Connecté - - - - Failed - Echec - - - - Unknown - Inconnu(e) - - - - BrowseFeature - - - Add to Quick Links - Ajouter aux Raccourcis Rapides - - - - Remove from Quick Links - Enlever des liens rapides - - - - Add to Library - Ajouter à la bibliothèque - - - - Quick Links - Quick Links - - - - - Devices - Devices - - - - Removable Devices - Removable Devices - - - - - Computer - Computer - - - - Music Directory Added - Music Directory Added - - - - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - - - - Scan - Scan - - - - "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. - "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. - - - - BrowseTableModel - - - Preview - Aperçu - - - - Filename - Filename - - - - Artist - Artiste - - - - Title - Titre - - - - Album - Album - - - - Track # - Piste n° - - - - Year - Année - - - - Genre - Genre - - - - Composer - Compositeur - - - - Comment - Commentaire - - - - Duration - Durée - - - - BPM - BPM - - - - Key - Clé - - - - Type - Type - - - - Bitrate - Débit - - - - ReplayGain - ReplayGain - - - - Location - Emplacement - - - - Album Artist - Artiste de l'album - - - - Grouping - Regroupement - - - - File Modified - File Modified - - - - File Created - File Created - - - - Mixxx Library - Mixxx Library - - - - Could not load the following file because it is in use by Mixxx or another application. - Could not load the following file because it is in use by Mixxx or another application. - - - - BulkController - - - USB Controller - USB Controller - - - - CachingReaderWorker - - - The file '%1' could not be found. - The file '%1' could not be found. - - - - The file '%1' could not be loaded. - The file '%1' could not be loaded. - - - - The file '%1' is empty and could not be loaded. - The file '%1' is empty and could not be loaded. - - - - CmdlineArgs - - - Mixxx is an open source DJ software. For more information, see: - Mixxx is an open source DJ software. For more information, see: - - - - Starts Mixxx in full-screen mode - Starts Mixxx in full-screen mode - - - - Use a custom locale for loading translations. (e.g 'fr') - Use a custom locale for loading translations. (e.g 'fr') - - - - Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - - - - Path the debug statistics time line is written to - Path the debug statistics time line is written to - - - - Causes Mixxx to display/log all of the controller data it receives and script functions it loads - Causes Mixxx to display/log all of the controller data it receives and script functions it loads - - - - The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - Le mappage du contrôleur émettra des avertissements et des erreurs plus agressifs lors de la détection d'une utilisation abusive des API du contrôleur. Les nouveaux mappages de contrôleur devraient être développés avec cette option activée ! - - - - Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - - - - Top-level directory where Mixxx should look for settings. Default is: - Répertoire racine où Mixxx doit chercher les paramètres. -La valeur par défaut est: - - - - Use legacy vu meter - Utiliser le vu-mètre historique - - - - Use legacy spinny - - - - - Loads experimental QML GUI instead of legacy QWidget skin - Loads experimental QML GUI instead of legacy QWidget skin - - - - Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - - - - [auto|always|never] Use colors on the console output. - [auto|always|never] Use colors on the console output. - - - - Sets the verbosity of command line logging. -critical - Critical/Fatal only -warning - Above + Warnings -info - Above + Informational messages -debug - Above + Debug/Developer messages -trace - Above + Profiling messages - Sets the verbosity of command line logging. -critical - Critical/Fatal only -warning - Above + Warnings -info - Above + Informational messages -debug - Above + Debug/Developer messages -trace - Above + Profiling messages - - - - Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - - - - Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - - - - Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - - - - ColorPaletteEditor - - - Remove Color - Remove Color - - - - Add Color - Add Color - - - - Name - Nom - - - - - Remove Palette - Remove Palette - - - - Color - Color - - - - Assign to Hotcue Number - Assign to Hotcue Number - - - - Edited - Edited - - - - Do you really want to remove the palette permanently? - Do you really want to remove the palette permanently? - - - - ControlDelegate - - - No control chosen. - No control chosen. - - - - ControlModel - - - Group - Group - - - - Item - Item - - - - Value - Value - - - - Parameter - Parameter - - - - Title - Titre - - - - Description - Description - - - - ControlPickerMenu - - - Headphone Output - Headphone Output - - - - - - Deck %1 - Deck %1 - - - - Sampler %1 - Sampler %1 - - - - Preview Deck %1 - Preview Deck %1 - - - - Microphone %1 - Microphone %1 - - - - Auxiliary %1 - Auxiliary %1 - - - - Reset to default - Reset to default - - - - Effect Rack %1 - Effect Rack %1 - - - - Parameter %1 - Parameter %1 - - - - Mixer - Mixer - - - - - Crossfader - Crossfader - - - - Headphone mix (pre/main) - Headphone mix (pre/main) - - - - Toggle headphone split cueing - Toggle headphone split cueing - - - - Headphone delay - Headphone delay - - - - Transport - Transport - - - - Strip-search through track - Strip-search through track - - - - Play button - Play button - - - - - Set to full volume - Set to full volume - - - - - Set to zero volume - Set to zero volume - - - - Stop button - Stop button - - - - Jump to start of track and play - Jump to start of track and play - - - - Jump to end of track - Jump to end of track - - - - Reverse roll (Censor) button - Reverse roll (Censor) button - - - - Headphone listen button - Headphone listen button - - - - - Mute button - Mute button - - - - Toggle repeat mode - Toggle repeat mode - - - - - Mix orientation (e.g. left, right, center) - Mix orientation (e.g. left, right, center) - - - - - Set mix orientation to left - Set mix orientation to left - - - - - Set mix orientation to center - Set mix orientation to center - - - - - Set mix orientation to right - Set mix orientation to right - - - - Toggle slip mode - Toggle slip mode - - - - BPM - BPM - - - - Increase BPM by 1 - Increase BPM by 1 - - - - Decrease BPM by 1 - Decrease BPM by 1 - - - - Increase BPM by 0.1 - Increase BPM by 0.1 - - - - Decrease BPM by 0.1 - Decrease BPM by 0.1 - - - - BPM tap button - BPM tap button - - - - Toggle quantize mode - Toggle quantize mode - - - - One-time beat sync (tempo only) - One-time beat sync (tempo only) - - - - One-time beat sync (phase only) - One-time beat sync (phase only) - - - - Toggle keylock mode - Toggle keylock mode - - - - Equalizers - Equalizers - - - - Vinyl Control - Vinyl Control - - - - Toggle vinyl-control cueing mode (OFF/ONE/HOT) - Toggle vinyl-control cueing mode (OFF/ONE/HOT) - - - - Toggle vinyl-control mode (ABS/REL/CONST) - Toggle vinyl-control mode (ABS/REL/CONST) - - - - Pass through external audio into the internal mixer - Pass through external audio into the internal mixer - - - - Cues - Cues - - - - Cue button - Cue button - - - - Set cue point - Set cue point - - - - Go to cue point - Go to cue point - - - - Go to cue point and play - Go to cue point and play - - - - Go to cue point and stop - Go to cue point and stop - - - - Preview from cue point - Preview from cue point - - - - Cue button (CDJ mode) - Cue button (CDJ mode) - - - - Stutter cue - Stutter cue - - - - Hotcues - Points de repère - - - - Set, preview from or jump to hotcue %1 - Set, preview from or jump to hotcue %1 - - - - Clear hotcue %1 - Clear hotcue %1 - - - - Set hotcue %1 - Set hotcue %1 - - - - Jump to hotcue %1 - Jump to hotcue %1 - - - - Jump to hotcue %1 and stop - Jump to hotcue %1 and stop - - - - Jump to hotcue %1 and play - Jump to hotcue %1 and play - - - - Preview from hotcue %1 - Preview from hotcue %1 - - - - - Hotcue %1 - Hotcue %1 - - - - Looping - Looping - - - - Loop In button - Loop In button - - - - Loop Out button - Loop Out button - - - - Loop Exit button - Loop Exit button - - - - 1/2 - 1/2 - - - - 1 - 1 - - - - 2 - 2 - - - - 4 - 4 - - - - 8 - 8 - - - - 16 - 16 - - - - 32 - 32 - - - - 64 - 64 - - - - Move loop forward by %1 beats - Move loop forward by %1 beats - - - - Move loop backward by %1 beats - Move loop backward by %1 beats - - - - Create %1-beat loop - Create %1-beat loop - - - - Create temporary %1-beat loop roll - Create temporary %1-beat loop roll - - - - Library - Library - - - - Slot %1 - Slot %1 - - - - Headphone Mix - Headphone Mix - - - - Headphone Split Cue - Headphone Split Cue - - - - Headphone Delay - Headphone Delay - - - - Play - Play - - - - Fast Rewind - Fast Rewind - - - - Fast Rewind button - Fast Rewind button - - - - Fast Forward - Fast Forward - - - - Fast Forward button - Fast Forward button - - - - Strip Search - Strip Search - - - - Play Reverse - Play Reverse - - - - Play Reverse button - Play Reverse button - - - - Reverse Roll (Censor) - Reverse Roll (Censor) - - - - Jump To Start - Jump To Start - - - - Jumps to start of track - Jumps to start of track - - - - Play From Start - Play From Start - - - - Stop - Stop - - - - Stop And Jump To Start - Stop And Jump To Start - - - - Stop playback and jump to start of track - Stop playback and jump to start of track - - - - Jump To End - Jump To End - - - - Volume - Volume - - - - - - Volume Fader - Volume Fader - - - - - Full Volume - Full Volume - - - - - Zero Volume - Zero Volume - - - - Track Gain - Track Gain - - - - Track Gain knob - Track Gain knob - - - - - Mute - Mute - - - - Eject - Eject - - - - - Headphone Listen - Headphone Listen - - - - Headphone listen (pfl) button - Headphone listen (pfl) button - - - - Repeat Mode - Repeat Mode - - - - Slip Mode - Slip Mode - - - - - Orientation - Orientation - - - - - Orient Left - Orient Left - - - - - Orient Center - Orient Center - - - - - Orient Right - Orient Right - - - - BPM +1 - BPM +1 - - - - BPM -1 - BPM -1 - - - - BPM +0.1 - BPM +0.1 - - - - BPM -0.1 - BPM -0.1 - - - - BPM Tap - BPM Tap - - - - Adjust Beatgrid Faster +.01 - Adjust Beatgrid Faster +.01 - - - - Increase track's average BPM by 0.01 - Increase track's average BPM by 0.01 - - - - Adjust Beatgrid Slower -.01 - Adjust Beatgrid Slower -.01 - - - - Decrease track's average BPM by 0.01 - Decrease track's average BPM by 0.01 - - - - Move Beatgrid Earlier - Move Beatgrid Earlier - - - - Adjust the beatgrid to the left - Adjust the beatgrid to the left - - - - Move Beatgrid Later - Move Beatgrid Later - - - - Adjust the beatgrid to the right - Adjust the beatgrid to the right - - - - Adjust Beatgrid - Adjust Beatgrid - - - - Align beatgrid to current position - Align beatgrid to current position - - - - Adjust Beatgrid - Match Alignment - Adjust Beatgrid - Match Alignment - - - - Adjust beatgrid to match another playing deck. - Adjust beatgrid to match another playing deck. - - - - Quantize Mode - Quantize Mode - - - - Sync - Sync - - - - Beat Sync One-Shot - Beat Sync One-Shot - - - - Sync Tempo One-Shot - Sync Tempo One-Shot - - - - Sync Phase One-Shot - Sync Phase One-Shot - - - - Pitch control (does not affect tempo), center is original pitch - Pitch control (does not affect tempo), center is original pitch - - - - Pitch Adjust - Pitch Adjust - - - - Adjust pitch from speed slider pitch - Adjust pitch from speed slider pitch - - - - Match musical key - Match musical key - - - - Match Key - Match Key - - - - Reset Key - Reset Key - - - - Resets key to original - Resets key to original - - - - High EQ - High EQ - - - - Mid EQ - Mid EQ - - - - - Main Output - Main Output - - - - Main Output Balance - Main Output Balance - - - - Main Output Delay - Main Output Delay - - - - Main Output Gain - Main Output Gain - - - - Low EQ - Low EQ - - - - Toggle Vinyl Control - Toggle Vinyl Control - - - - Toggle Vinyl Control (ON/OFF) - Toggle Vinyl Control (ON/OFF) - - - - Vinyl Control Mode - Vinyl Control Mode - - - - Vinyl Control Cueing Mode - Vinyl Control Cueing Mode - - - - Vinyl Control Passthrough - Vinyl Control Passthrough - - - - Vinyl Control Next Deck - Vinyl Control Next Deck - - - - Single deck mode - Switch vinyl control to next deck - Single deck mode - Switch vinyl control to next deck - - - - Cue - Cue - - - - Set Cue - Set Cue - - - - Go-To Cue - Go-To Cue - - - - Go-To Cue And Play - Go-To Cue And Play - - - - Go-To Cue And Stop - Go-To Cue And Stop - - - - Preview Cue - Preview Cue - - - - Cue (CDJ Mode) - Cue (CDJ Mode) - - - - Stutter Cue - Stutter Cue - - - - Go to cue point and play after release - Go to cue point and play after release - - - - Clear Hotcue %1 - Clear Hotcue %1 - - - - Set Hotcue %1 - Set Hotcue %1 - - - - Jump To Hotcue %1 - Jump To Hotcue %1 - - - - Jump To Hotcue %1 And Stop - Jump To Hotcue %1 And Stop - - - - Jump To Hotcue %1 And Play - Jump To Hotcue %1 And Play - - - - Preview Hotcue %1 - Preview Hotcue %1 - - - - Loop In - Loop In - - - - Loop Out - Loop Out - - - - Loop Exit - Loop Exit - - - - Reloop/Exit Loop - Reloop/Exit Loop - - - - Loop Halve - Loop Halve - - - - Loop Double - Loop Double - - - - 1/32 - 1/32 - - - - 1/16 - 1/16 - - - - 1/8 - 1/8 - - - - 1/4 - 1/4 - - - - Move Loop +%1 Beats - Move Loop +%1 Beats - - - - Move Loop -%1 Beats - Move Loop -%1 Beats - - - - Loop %1 Beats - Loop %1 Beats - - - - Loop Roll %1 Beats - Loop Roll %1 Beats - - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - Append the selected track to the Auto DJ Queue - Append the selected track to the Auto DJ Queue - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Prepend selected track to the Auto DJ Queue - Prepend selected track to the Auto DJ Queue - - - - Load Track - Load Track - - - - Load selected track - Load selected track - - - - Load selected track and play - Load selected track and play - - - - - Record Mix - Record Mix - - - - Toggle mix recording - Toggle mix recording - - - - Effects - Effets - - - - Quick Effects - Quick Effects - - - - Deck %1 Quick Effect Super Knob - Deck %1 Quick Effect Super Knob - - - - Quick Effect Super Knob (control linked effect parameters) - Quick Effect Super Knob (control linked effect parameters) - - - - - Quick Effect - Quick Effect - - - - Clear Unit - Clear Unit - - - - Clear effect unit - Clear effect unit - - - - Toggle Unit - Toggle Unit - - - - Dry/Wet - Dry/Wet - - - - Adjust the balance between the original (dry) and processed (wet) signal. - Adjust the balance between the original (dry) and processed (wet) signal. - - - - Super Knob - Super Knob - - - - Next Chain - Next Chain - - - - Assign - Assign - - - - Clear - Clear - - - - Clear the current effect - Clear the current effect - - - - Toggle - Toggle - - - - Toggle the current effect - Toggle the current effect - - - - Next - Next - - - - Switch to next effect - Switch to next effect - - - - Previous - Previous - - - - Switch to the previous effect - Switch to the previous effect - - - - Next or Previous - Next or Previous - - - - Switch to either next or previous effect - Switch to either next or previous effect - - - - - Parameter Value - Parameter Value - - - - - Microphone Ducking Strength - Microphone Ducking Strength - - - - Microphone Ducking Mode - Microphone Ducking Mode - - - - Gain - Gain - - - - Gain knob - Gain knob - - - - Shuffle the content of the Auto DJ queue - Shuffle the content of the Auto DJ queue - - - - Skip the next track in the Auto DJ queue - Skip the next track in the Auto DJ queue - - - - Auto DJ Toggle - Auto DJ Toggle - - - - Toggle Auto DJ On/Off - Toggle Auto DJ On/Off - - - - Microphone & Auxiliary Show/Hide - Microphone & Auxiliary Show/Hide - - - - Show/hide the microphone & auxiliary section - Show/hide the microphone & auxiliary section - - - - 4 Effect Units Show/Hide - 4 Effect Units Show/Hide - - - - Switches between showing 2 and 4 effect units - Switches between showing 2 and 4 effect units - - - - Mixer Show/Hide - Mixer Show/Hide - - - - Show or hide the mixer. - Show or hide the mixer. - - - - Cover Art Show/Hide (Library) - Cover Art Show/Hide (Library) - - - - Show/hide cover art in the library - Show/hide cover art in the library - - - - Library Maximize/Restore - Library Maximize/Restore - - - - Maximize the track library to take up all the available screen space. - Maximize the track library to take up all the available screen space. - - - - Effect Rack Show/Hide - Effect Rack Show/Hide - - - - Show/hide the effect rack - Show/hide the effect rack - - - - Waveform Zoom Out - Waveform Zoom Out - - - - Headphone Gain - Headphone Gain - - - - Headphone gain - Headphone gain - - - - Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - - - - One-time beat sync tempo (and phase with quantize enabled) - One-time beat sync tempo (and phase with quantize enabled) - - - - Playback Speed - Playback Speed - - - - Playback speed control (Vinyl "Pitch" slider) - Playback speed control (Vinyl "Pitch" slider) - - - - Pitch (Musical key) - Pitch (Musical key) - - - - Increase Speed - Increase Speed - - - - Adjust speed faster (coarse) - Adjust speed faster (coarse) - - - - Increase Speed (Fine) - Increase Speed (Fine) - - - - Adjust speed faster (fine) - Adjust speed faster (fine) - - - - Decrease Speed - Decrease Speed - - - - Adjust speed slower (coarse) - Adjust speed slower (coarse) - - - - Adjust speed slower (fine) - Adjust speed slower (fine) - - - - Temporarily Increase Speed - Temporarily Increase Speed - - - - Temporarily increase speed (coarse) - Temporarily increase speed (coarse) - - - - Temporarily Increase Speed (Fine) - Temporarily Increase Speed (Fine) - - - - Temporarily increase speed (fine) - Temporarily increase speed (fine) - - - - Temporarily Decrease Speed - Temporarily Decrease Speed - - - - Temporarily decrease speed (coarse) - Temporarily decrease speed (coarse) - - - - Temporarily Decrease Speed (Fine) - Temporarily Decrease Speed (Fine) - - - - Temporarily decrease speed (fine) - Temporarily decrease speed (fine) - - - - - Adjust %1 - Adjust %1 - - - - Effect Unit %1 - Effect Unit %1 - - - - Button Parameter %1 - Button Parameter %1 - - - - Skin - Skin - - - - Controller - Contrôleur - - - - Crossfader / Orientation - Crossfader / Orientation - - - - Main Output gain - Main Output gain - - - - Main Output balance - Main Output balance - - - - Main Output delay - Main Output delay - - - - Headphone - Headphone - - - - - Kill %1 - Kill %1 - - - - Eject or un-eject track, i.e. reload the last-ejected track (of any deck)<br>Double-press to reload the last replaced track. In empty decks it reloads the second-last ejected track. - - - - - BPM / Beatgrid - BPM / Beatgrid - - - - Move Beatgrid - - - - - Adjust the beatgrid to the left or right - - - - - Sync / Sync Lock - Sync / Sync Lock - - - - Internal Sync Leader - Internal Sync Leader - - - - Toggle Internal Sync Leader - Toggle Internal Sync Leader - - - - - Internal Leader BPM - Internal Leader BPM - - - - Internal Leader BPM +1 - Internal Leader BPM +1 - - - - Increase internal Leader BPM by 1 - Increase internal Leader BPM by 1 - - - - Internal Leader BPM -1 - Internal Leader BPM -1 - - - - Decrease internal Leader BPM by 1 - Decrease internal Leader BPM by 1 - - - - Internal Leader BPM +0.1 - Internal Leader BPM +0.1 - - - - Increase internal Leader BPM by 0.1 - Increase internal Leader BPM by 0.1 - - - - Internal Leader BPM -0.1 - Internal Leader BPM -0.1 - - - - Decrease internal Leader BPM by 0.1 - Decrease internal Leader BPM by 0.1 - - - - Sync Leader - Sync Leader - - - - Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - - - - Speed - Speed - - - - Decrease Speed (Fine) - Diminuer la vitesse (Fin) - - - - Pitch (Musical Key) - Pitch (Musical Key) - - - - Increase Pitch - Increase Pitch - - - - Increases the pitch by one semitone - Increases the pitch by one semitone - - - - Increase Pitch (Fine) - Increase Pitch (Fine) - - - - Increases the pitch by 10 cents - Increases the pitch by 10 cents - - - - Decrease Pitch - Decrease Pitch - - - - Decreases the pitch by one semitone - Decreases the pitch by one semitone - - - - Decrease Pitch (Fine) - Decrease Pitch (Fine) - - - - Decreases the pitch by 10 cents - Decreases the pitch by 10 cents - - - - Keylock - Keylock - - - - CUP (Cue + Play) - CUP (Cue + Play) - - - - Shift cue points earlier - Shift cue points earlier - - - - Shift cue points 10 milliseconds earlier - Shift cue points 10 milliseconds earlier - - - - Shift cue points earlier (fine) - Shift cue points earlier (fine) - - - - Shift cue points 1 millisecond earlier - Shift cue points 1 millisecond earlier - - - - Shift cue points later - Shift cue points later - - - - Shift cue points 10 milliseconds later - Shift cue points 10 milliseconds later - - - - Shift cue points later (fine) - Shift cue points later (fine) - - - - Shift cue points 1 millisecond later - Shift cue points 1 millisecond later - - - - Hotcues %1-%2 - Hotcues %1-%2 - - - - Intro / Outro Markers - Intro / Outro Markers - - - - Intro Start Marker - Intro Start Marker - - - - Intro End Marker - Intro End Marker - - - - Outro Start Marker - Outro Start Marker - - - - Outro End Marker - Outro End Marker - - - - intro start marker - intro start marker - - - - intro end marker - intro end marker - - - - outro start marker - outro start marker - - - - outro end marker - outro end marker - - - - Activate %1 - [intro/outro marker - Activate %1 - - - - Jump to or set the %1 - [intro/outro marker - Jump to or set the %1 - - - - Set %1 - [intro/outro marker - Set %1 - - - - Set or jump to the %1 - [intro/outro marker - Set or jump to the %1 - - - - Clear %1 - [intro/outro marker - Clear %1 - - - - Clear the %1 - [intro/outro marker - Clear the %1 - - - - Loop Selected Beats - Loop Selected Beats - - - - Create a beat loop of selected beat size - Create a beat loop of selected beat size - - - - Loop Roll Selected Beats - Loop Roll Selected Beats - - - - Create a rolling beat loop of selected beat size - Create a rolling beat loop of selected beat size - - - - Loop Beats - Loop Beats - - - - Loop Roll Beats - Loop Roll Beats - - - - Go To Loop In - Aller à l'Entrée de Boucle - - - - Go to Loop In button - Aller au bouton Entrée de Boucle - - - - Go To Loop Out - Aller à la Fin de Boucle - - - - Go to Loop Out button - Aller au bouton Fin de Boucle - - - - Toggle loop on/off and jump to Loop In point if loop is behind play position - Toggle loop on/off and jump to Loop In point if loop is behind play position - - - - Reloop And Stop - Reloop And Stop - - - - Enable loop, jump to Loop In point, and stop - Enable loop, jump to Loop In point, and stop - - - - Halve the loop length - Halve the loop length - - - - Double the loop length - Double the loop length - - - - Beat Jump / Loop Move - Beat Jump / Loop Move - - - - Jump / Move Loop Forward %1 Beats - Jump / Move Loop Forward %1 Beats - - - - Jump / Move Loop Backward %1 Beats - Jump / Move Loop Backward %1 Beats - - - - Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - - - - Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - - - - Beat Jump / Loop Move Forward Selected Beats - Beat Jump / Loop Move Forward Selected Beats - - - - Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - - - - Beat Jump / Loop Move Backward Selected Beats - Beat Jump / Loop Move Backward Selected Beats - - - - Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - - - - Beat Jump / Loop Move Forward - Beat Jump / Loop Move Forward - - - - Beat Jump / Loop Move Backward - Beat Jump / Loop Move Backward - - - - Loop Move Forward - Loop Move Forward - - - - Loop Move Backward - Loop Move Backward - - - - Remove Temporary Loop - - - - - Remove the temporary loop - - - - - Navigation - Navigation - - - - Move up - Move up - - - - Equivalent to pressing the UP key on the keyboard - Equivalent to pressing the UP key on the keyboard - - - - Move down - Move down - - - - Equivalent to pressing the DOWN key on the keyboard - Equivalent to pressing the DOWN key on the keyboard - - - - Move up/down - Move up/down - - - - Move vertically in either direction using a knob, as if pressing UP/DOWN keys - Move vertically in either direction using a knob, as if pressing UP/DOWN keys - - - - Scroll Up - Scroll Up - - - - Equivalent to pressing the PAGE UP key on the keyboard - Equivalent to pressing the PAGE UP key on the keyboard - - - - Scroll Down - Scroll Down - - - - Equivalent to pressing the PAGE DOWN key on the keyboard - Equivalent to pressing the PAGE DOWN key on the keyboard - - - - Scroll up/down - Scroll up/down - - - - Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - - - - Move left - Move left - - - - Equivalent to pressing the LEFT key on the keyboard - Equivalent to pressing the LEFT key on the keyboard - - - - Move right - Move right - - - - Equivalent to pressing the RIGHT key on the keyboard - Equivalent to pressing the RIGHT key on the keyboard - - - - Move left/right - Move left/right - - - - Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - - - - Move focus to right pane - Move focus to right pane - - - - Equivalent to pressing the TAB key on the keyboard - Equivalent to pressing the TAB key on the keyboard - - - - Move focus to left pane - Move focus to left pane - - - - Equivalent to pressing the SHIFT+TAB key on the keyboard - Equivalent to pressing the SHIFT+TAB key on the keyboard - - - - Move focus to right/left pane - Move focus to right/left pane - - - - Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - - - - Sort focused column - Trier la colonne sélectionnée - - - - Sort the column of the cell that is currently focused, equivalent to clicking on its header - Trier la colonne contenant la cellule sélectionnée, équivaut à cliquer sur l'en-tête - - - - Go to the currently selected item - Go to the currently selected item - - - - Choose the currently selected item and advance forward one pane if appropriate - Choose the currently selected item and advance forward one pane if appropriate - - - - Load Track and Play - Load Track and Play - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Replace Auto DJ Queue with selected tracks - Replace Auto DJ Queue with selected tracks - - - - Select next search history - Select next search history - - - - Selects the next search history entry - Selects the next search history entry - - - - Select previous search history - Select previous search history - - - - Selects the previous search history entry - Selects the previous search history entry - - - - Move selected search entry - Move selected search entry - - - - Moves the selected search history item into given direction and steps - Moves the selected search history item into given direction and steps - - - - Clear search - Clear search - - - - Clears the search query - Clears the search query - - - - Deck %1 Quick Effect Enable Button - Deck %1 Quick Effect Enable Button - - - - Quick Effect Enable Button - Quick Effect Enable Button - - - - Enable or disable effect processing - Enable or disable effect processing - - - - Super Knob (control effects' Meta Knobs) - Super Knob (control effects' Meta Knobs) - - - - Mix Mode Toggle - Mix Mode Toggle - - - - Toggle effect unit between D/W and D+W modes - Toggle effect unit between D/W and D+W modes - - - - Next chain preset - Next chain preset - - - - Previous Chain - Previous Chain - - - - Previous chain preset - Previous chain preset - - - - Next/Previous Chain - Next/Previous Chain - - - - Next or previous chain preset - Next or previous chain preset - - - - - Show Effect Parameters - Show Effect Parameters - - - - Effect Unit Assignment - Effect Unit Assignment - - - - Meta Knob - Meta Knob - - - - Effect Meta Knob (control linked effect parameters) - Effect Meta Knob (control linked effect parameters) - - - - Meta Knob Mode - Meta Knob Mode - - - - Set how linked effect parameters change when turning the Meta Knob. - Set how linked effect parameters change when turning the Meta Knob. - - - - Meta Knob Mode Invert - Meta Knob Mode Invert - - - - Invert how linked effect parameters change when turning the Meta Knob. - Invert how linked effect parameters change when turning the Meta Knob. - - - - - Button Parameter Value - Button Parameter Value - - - - Microphone / Auxiliary - Microphone / Auxiliary - - - - Microphone On/Off - Microphone On/Off - - - - Microphone on/off - Microphone on/off - - - - Toggle microphone ducking mode (OFF, AUTO, MANUAL) - Toggle microphone ducking mode (OFF, AUTO, MANUAL) - - - - Auxiliary On/Off - Auxiliary On/Off - - - - Auxiliary on/off - Auxiliary on/off - - - - Auto DJ - Auto DJ - - - - Auto DJ Shuffle - Auto DJ Shuffle - - - - Auto DJ Skip Next - Auto DJ Skip Next - - - - Auto DJ Add Random Track - Auto DJ Add Random Track - - - - Add a random track to the Auto DJ queue - Add a random track to the Auto DJ queue - - - - Auto DJ Fade To Next - Auto DJ Fade To Next - - - - Trigger the transition to the next track - Trigger the transition to the next track - - - - User Interface - User Interface - - - - Samplers Show/Hide - Samplers Show/Hide - - - - Show/hide the sampler section - Show/hide the sampler section - - - - Waveform Zoom Reset To Default - - - - - Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - - - - - Start/Stop Live Broadcasting - Start/Stop Live Broadcasting - - - - Stream your mix over the Internet. - Stream your mix over the Internet. - - - - Start/stop recording your mix. - Start/stop recording your mix. - - - - - Samplers - Samplers - - - - Vinyl Control Show/Hide - Vinyl Control Show/Hide - - - - Show/hide the vinyl control section - Show/hide the vinyl control section - - - - Preview Deck Show/Hide - Preview Deck Show/Hide - - - - Show/hide the preview deck - Show/hide the preview deck - - - - Toggle 4 Decks - Toggle 4 Decks - - - - Switches between showing 2 decks and 4 decks. - Switches between showing 2 decks and 4 decks. - - - - Cover Art Show/Hide (Decks) - Cover Art Show/Hide (Decks) - - - - Show/hide cover art in the main decks - Show/hide cover art in the main decks - - - - Vinyl Spinner Show/Hide - Vinyl Spinner Show/Hide - - - - Show/hide spinning vinyl widget - Show/hide spinning vinyl widget - - - - Vinyl Spinners Show/Hide (All Decks) - Vinyl Spinners Show/Hide (All Decks) - - - - Show/Hide all spinnies - Show/Hide all spinnies - - - - Toggle Waveforms - Toggle Waveforms - - - - Show/hide the scrolling waveforms. - Show/hide the scrolling waveforms. - - - - Waveform zoom - Waveform zoom - - - - Waveform Zoom - Waveform Zoom - - - - Zoom waveform in - Zoom waveform in - - - - Waveform Zoom In - Waveform Zoom In - - - - Zoom waveform out - Zoom waveform out - - - - Star Rating Up - Star Rating Up - - - - Increase the track rating by one star - Increase the track rating by one star - - - - Star Rating Down - Star Rating Down - - - - Decrease the track rating by one star - Decrease the track rating by one star - - - - ControllerInputMappingTableModel - - - Channel - Channel - - - - Opcode - Opcode - - - - Control - Control - - - - Options - Options - - - - Action - Action - - - - Comment - Commentaire - - - - ControllerOutputMappingTableModel - - - Channel - Channel - - - - Opcode - Opcode - - - - Control - Control - - - - On Value - On Value - - - - Off Value - Off Value - - - - Action - Action - - - - On Range Min - On Range Min - - - - On Range Max - On Range Max - - - - Comment - Commentaire - - - - ControllerScriptEngineBase - - - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - - - - You can ignore this error for this session but you may experience erratic behavior. - You can ignore this error for this session but you may experience erratic behavior. - - - - Try to recover by resetting your controller. - Try to recover by resetting your controller. - - - - Controller Mapping Error - Controller Mapping Error - - - - The mapping for your controller "%1" is not working properly. - The mapping for your controller "%1" is not working properly. - - - - The script code needs to be fixed. - The script code needs to be fixed. - - - - ControllerScriptEngineLegacy - - - Controller Mapping File Problem - Controller Mapping File Problem - - - - The mapping for controller "%1" cannot be opened. - The mapping for controller "%1" cannot be opened. - - - - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - - - - File: - File: - - - - Error: - Error: - - - - CoverArtCopyWorker - - - Error while copying the cover art to: %1 - Une erreur est survenue lors de la copie de la pochette d'album vers: %1 - - - - CrateFeature - - - Remove - Supprimer - - - - - Create New Crate - Create New Crate - - - - Rename - Renommer - - - - - Lock - Verrouiller - - - - Export Crate as Playlist - Export Crate as Playlist - - - - Export Track Files - Exporter les fichiers des pistes - - - - Duplicate - Dupliquer - - - - Analyze entire Crate - Analyze entire Crate - - - - Auto DJ Track Source - Auto DJ Track Source - - - - Enter new name for crate: - Enter new name for crate: - - - - - Crates - Caisses - - - - - Import Crate - Import Crate - - - - Export Crate - Export Crate - - - - Unlock - Unlock - - - - An unknown error occurred while creating crate: - An unknown error occurred while creating crate: - - - - Rename Crate - Rename Crate - - - - - Export to Engine Prime - Export to Engine Prime - - - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - - - - Confirm Deletion - Confirmer la suppression - - - - - Renaming Crate Failed - Renaming Crate Failed - - - - Crate Creation Failed - Crate Creation Failed - - - - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Texte CSV (*.csv);;Texte lisible (*.txt) - - - - M3U Playlist (*.m3u) - M3U Playlist (*.m3u) - - - - Crates are a great way to help organize the music you want to DJ with. - Crates are a great way to help organize the music you want to DJ with. - - - - Crates let you organize your music however you'd like! - Crates let you organize your music however you'd like! - - - - Do you really want to delete crate <b>%1</b>? - Voulez-vous vraiment supprimer le bac %1? - - - - A crate cannot have a blank name. - A crate cannot have a blank name. - - - - A crate by that name already exists. - A crate by that name already exists. - - - - CrateFeatureHelper - - - New Crate - New Crate - - - - Create New Crate - Create New Crate - - - - - Enter name for new crate: - Enter name for new crate: - - - - - - Creating Crate Failed - Creating Crate Failed - - - - - A crate cannot have a blank name. - A crate cannot have a blank name. - - - - - A crate by that name already exists. - A crate by that name already exists. - - - - - An unknown error occurred while creating crate: - An unknown error occurred while creating crate: - - - - copy - //: - copy - - - - Duplicate Crate - Duplicate Crate - - - - - - Duplicating Crate Failed - Duplicating Crate Failed - - - - DlgAbout - - - Mixxx %1.%2 Development Team - Mixxx %1.%2 Development Team - - - - With contributions from: - Avec des contributions de : - - - - And special thanks to: - Et remerciements particuliers à: - - - - Past Developers - Anciens développeurs - - - - Past Contributors - Anciens contributeurs - - - - Official Website - Official Website - - - - Donate - Donate - - - - DlgAboutDlg - - - About Mixxx - à propos de Mixxx - - - - - - - Unknown - Inconnu(e) - - - - Date: - Date: - - - - Git Version: - Git Version: - - - - Qt Version: - - - - - Platform: - Platform: - - - - Credits - Crédits - - - - License - License - - - - DlgAnalysis - - - - - Analyze - Analyse - - - - Shows tracks added to the library within the last 7 days. - Shows tracks added to the library within the last 7 days. - - - - New - New - - - - Shows all tracks in the library. - Shows all tracks in the library. - - - - All - All - - - - Progress - Progress - - - - Selects all tracks in the table below. - Selects all tracks in the table below. - - - - Select All - Select All - - - - Runs beatgrid, key, and ReplayGain detection on the selected tracks. Does not generate waveforms for the selected tracks to save disk space. - Runs beatgrid, key, and ReplayGain detection on the selected tracks. Does not generate waveforms for the selected tracks to save disk space. - - - - Stop Analysis - Stop Analysis - - - - Analyzing %1% %2/%3 - Analyzing %1% %2/%3 - - - - Analyzing %1/%2 - Analyzing %1/%2 - - - - DlgAutoDJ - - - Skip - Skip - - - - Random - Random - - - - Fade - Fade - - - - Enable Auto DJ - -Shortcut: Shift+F12 - Enable Auto DJ - -Shortcut: Shift+F12 - - - - Disable Auto DJ - -Shortcut: Shift+F12 - Disable Auto DJ - -Shortcut: Shift+F12 - - - - Trigger the transition to the next track - -Shortcut: Shift+F11 - Trigger the transition to the next track - -Shortcut: Shift+F11 - - - - Skip the next track in the Auto DJ queue - -Shortcut: Shift+F10 - Skip the next track in the Auto DJ queue - -Shortcut: Shift+F10 - - - - Shuffle the content of the Auto DJ queue - -Shortcut: Shift+F9 - Shuffle the content of the Auto DJ queue - -Shortcut: Shift+F9 - - - - Repeat the playlist - Repeat the playlist - - - - Determines the duration of the transition - Determines the duration of the transition - - - - Seconds - Seconds - - - - Full Intro + Outro - Full Intro + Outro - - - - Fade At Outro Start - Fade At Outro Start - - - - Full Track - Full Track - - - - Skip Silence - Skip Silence - - - - Auto DJ Fade Modes - -Full Intro + Outro: -Play the full intro and outro. Use the intro or outro length as the -crossfade time, whichever is shorter. If no intro or outro are marked, -use the selected crossfade time. - -Fade At Outro Start: -Start crossfading at the outro start. If the outro is longer than the -intro, cut off the end of the outro. Use the intro or outro length as -the crossfade time, whichever is shorter. If no intro or outro are -marked, use the selected crossfade time. - -Full Track: -Play the whole track. Begin crossfading from the selected number of -seconds before the end of the track. A negative crossfade time adds -silence between tracks. - -Skip Silence: -Play the whole track except for silence at the beginning and end. -Begin crossfading from the selected number of seconds before the -last sound. - Auto DJ Fade Modes - -Full Intro + Outro: -Play the full intro and outro. Use the intro or outro length as the -crossfade time, whichever is shorter. If no intro or outro are marked, -use the selected crossfade time. - -Fade At Outro Start: -Start crossfading at the outro start. If the outro is longer than the -intro, cut off the end of the outro. Use the intro or outro length as -the crossfade time, whichever is shorter. If no intro or outro are -marked, use the selected crossfade time. - -Full Track: -Play the whole track. Begin crossfading from the selected number of -seconds before the end of the track. A negative crossfade time adds -silence between tracks. - -Skip Silence: -Play the whole track except for silence at the beginning and end. -Begin crossfading from the selected number of seconds before the -last sound. - - - - Repeat - Repeat - - - - Auto DJ requires two decks assigned to opposite sides of the crossfader. - Auto DJ nécessite deux platines affectées aux côtés opposés du curseur de mixage. - - - - One deck must be stopped to enable Auto DJ mode. - One deck must be stopped to enable Auto DJ mode. - - - - Decks 3 and 4 must be stopped to enable Auto DJ mode. - Decks 3 and 4 must be stopped to enable Auto DJ mode. - - - - Enable - Enable - - - - Disable - Disable - - - - Displays the duration and number of selected tracks. - Displays the duration and number of selected tracks. - - - - - - - Auto DJ - Auto DJ - - - - Shuffle - Shuffle - - - - Adds a random track from track sources (crates) to the Auto DJ queue. -If no track sources are configured, the track is added from the library instead. - Adds a random track from track sources (crates) to the Auto DJ queue. -If no track sources are configured, the track is added from the library instead. - - - - sec. - sec. - - - - DlgBeatsDlg - - - Enable BPM and Beat Detection - Enable BPM and Beat Detection - - - - Choose between different algorithms to detect beats. - Choose between different algorithms to detect beats. - - - - Beat Detection Preferences - Beat Detection Preferences - - - - When beat detection is enabled, Mixxx detects the beats per minute and beats of your tracks, -automatically shows a beat-grid for them, and allows you to synchronize tracks using their beat information. - When beat detection is enabled, Mixxx detects the beats per minute and beats of your tracks, -automatically shows a beat-grid for them, and allows you to synchronize tracks using their beat information. - - - - Enable fast beat detection. -If activated Mixxx only analyzes the first minute of a track for beat information. -This can speed up beat detection on slower computers but may result in lower quality beatgrids. - Enable fast beat detection. -If activated Mixxx only analyzes the first minute of a track for beat information. -This can speed up beat detection on slower computers but may result in lower quality beatgrids. - - - - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - - - - Re-analyze beatgrids imported from other DJ software - Re-analyze beatgrids imported from other DJ software - - - - Choose Analyzer - Choose Analyzer - - - - Analyzer Settings - Analyzer Settings - - - - Enable Fast Analysis (For slow computers, may be less accurate) - Enable Fast Analysis (For slow computers, may be less accurate) - - - - Assume constant tempo (Recommended) - Assume constant tempo (Recommended) - - - - e.g. from 3rd-party programs or Mixxx versions before 1.11. -(Not checked: Analyze only, if no beats exist.) - e.g. from 3rd-party programs or Mixxx versions before 1.11. -(Not checked: Analyze only, if no beats exist.) - - - - Re-analyze beats when settings change or beat detection data is outdated - Re-analyze beats when settings change or beat detection data is outdated - - - - DlgControllerLearning - - - Controller Learning Wizard - Controller Learning Wizard - - - - Learn - Learn - - - - Close - Close - - - - Choose Control... - Choose Control... - - - - Hints: If you're mapping a button or switch, only press or flip it once. For knobs and sliders, move the control in both directions for best results. Make sure to touch one control at a time. - Hints: If you're mapping a button or switch, only press or flip it once. For knobs and sliders, move the control in both directions for best results. Make sure to touch one control at a time. - - - - Cancel - Cancel - - - - Advanced MIDI Options - Advanced MIDI Options - - - - Switch mode interprets all messages for the control as button presses. - Switch mode interprets all messages for the control as button presses. - - - - Switch Mode - Switch Mode - - - - Ignores slider or knob movements until they are close to the internal value. This helps prevent unwanted extreme changes while mixing but can accidentally ignore intentional rapid movements. - Ignores slider or knob movements until they are close to the internal value. This helps prevent unwanted extreme changes while mixing but can accidentally ignore intentional rapid movements. - - - - Soft Takeover - Soft Takeover - - - - Reverses the direction of the control. - Reverses the direction of the control. - - - - Invert - Invert - - - - For jog wheels or infinite-scroll knobs. Interprets incoming messages in two's complement. - For jog wheels or infinite-scroll knobs. Interprets incoming messages in two's complement. - - - - Jog Wheel / Select Knob - Jog Wheel / Select Knob - - - - Retry - Retry - - - - Learn Another - Learn Another - - - - Done - Done - - - - Click anywhere in Mixxx or choose a control to learn - Click anywhere in Mixxx or choose a control to learn - - - - You can click on any button, slider, or knob in Mixxx to teach it that control. You can also type in the box to search for a control by name, or click the Choose Control button to select from a list. - You can click on any button, slider, or knob in Mixxx to teach it that control. You can also type in the box to search for a control by name, or click the Choose Control button to select from a list. - - - - Now test it out! - Now test it out! - - - - If you manipulate the control, you should see the Mixxx user interface respond the way you expect. - If you manipulate the control, you should see the Mixxx user interface respond the way you expect. - - - - Not quite right? - Not quite right? - - - - If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - - - - Didn't get any midi messages. Please try again. - Didn't get any midi messages. Please try again. - - - - Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - - - - Successfully mapped control: - Successfully mapped control: - - - - <i>Ready to learn %1</i> - <i>Ready to learn %1</i> - - - - Learning: %1. Now move a control on your controller. - Learning: %1. Now move a control on your controller. - - - - The control you clicked in Mixxx is not learnable. -This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. - -You tried to learn: %1,%2 - The control you clicked in Mixxx is not learnable. -This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. - -You tried to learn: %1,%2 - - - - DlgCoverArtFullSize - - - Fetched Cover Art - Récupéré la pochette d'album - - - - DlgDeveloperTools - - - Developer Tools - Developer Tools - - - - Controls - Controls - - - - Dumps all ControlObject values to a csv-file saved in the settings path (e.g. ~/.mixxx) - Dumps all ControlObject values to a csv-file saved in the settings path (e.g. ~/.mixxx) - - - - Dump to csv - Dump to csv - - - - Log - Log - - - - Search - Search - - - - Stats - Stats - - - - DlgHidden - - - Hidden Tracks - Hidden Tracks - - - - Selects all tracks in the table below. - Selects all tracks in the table below. - - - - Select All - Select All - - - - Purge selected tracks from the library. - Purge selected tracks from the library. - - - - Purge - Purge - - - - Unhide selected tracks from the library. - Unhide selected tracks from the library. - - - - Unhide - Unhide - - - - Ctrl+S - Ctrl+S - - - - Purge selected tracks from the library and delete files from disk. - Purge selected tracks from the library and delete files from disk. - - - - Purge And Delete Files - Purge And Delete Files - - - - DlgKeywheel - - - Keywheel - Keywheel - - - - &Close - &Close - - - - DlgMissing - - - Missing Tracks - Missing Tracks - - - - Selects all tracks in the table below. - Selects all tracks in the table below. - - - - Select All - Select All - - - - Purge selected tracks from the library. - Purge selected tracks from the library. - - - - Purge - Purge - - - - DlgPrefAutoDJDlg - - - Duration after which a track is eligible for selection by Auto DJ again - Duration after which a track is eligible for selection by Auto DJ again - - - - hh:mm - hh:mm - - - - Minimum available tracks in Track Source - Minimum available tracks in Track Source - - - - Auto DJ Preferences - Auto DJ Preferences - - - - Re-queue Tracks - Re-queue Tracks - - - - This percentage of tracks are always available for selecting, regardless of when they were last played. - This percentage of tracks are always available for selecting, regardless of when they were last played. - - - - % - % - - - - - Uncheck, to ignore all played tracks. - Uncheck, to ignore all played tracks. - - - - Suspend track in Track Source from re-queue - Suspend track in Track Source from re-queue - - - - Suspension period for track selection - Suspension period for track selection - - - - Add Random Tracks - Add Random Tracks - - - - Enable random track addition to queue - Enable random track addition to queue - - - - Add random tracks from Track Source if the specified minimum tracks remain - Add random tracks from Track Source if the specified minimum tracks remain - - - - Minimum allowed tracks before addition - Minimum allowed tracks before addition - - - - Minimum number of tracks after which random tracks may be added - Minimum number of tracks after which random tracks may be added - - - - DlgPrefBroadcast - - - Icecast 2 - Icecast 2 - - - - Shoutcast 1 - Shoutcast 1 - - - - Icecast 1 - Icecast 1 - - - - MP3 - MP3 - - - - Ogg Vorbis - Ogg Vorbis - - - - Opus - Opus - - - - AAC - AAC - - - - HE-AAC - HE-AAC - - - - HE-AACv2 - HE-AACv2 - - - - Automatic - Automatic - - - - Mono - Mono - - - - Stereo - Stereo - - - - - - - Action failed - Échec de l'action - - - - You can't create more than %1 source connections. - You can't create more than %1 source connections. - - - - Source connection %1 - Source connection %1 - - - - At least one source connection is required. - At least one source connection is required. - - - - Are you sure you want to disconnect every active source connection? - Are you sure you want to disconnect every active source connection? - - - - - Confirmation required - Confirmation required - - - - '%1' has the same Icecast mountpoint as '%2'. -Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. - '%1' a le même point de montage Icecast que '%2'. -Deux de source de connexions vers le même serveur, ayant le même point de montage, ne peuvent pas être activé simultanément. - - - - Are you sure you want to delete '%1'? - Are you sure you want to delete '%1'? - - - - Renaming '%1' - Renaming '%1' - - - - New name for '%1': - New name for '%1': - - - - Can't rename '%1' to '%2': name already in use - Can't rename '%1' to '%2': name already in use - - - - DlgPrefBroadcastDlg - - - Live Broadcasting Preferences - Live Broadcasting Preferences - - - - Mixxx Icecast Testing - Mixxx Icecast Testing - - - - Public stream - Public stream - - - - http://www.mixxx.org - http://www.mixxx.org - - - - Stream name - Stream name - - - - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - - - - Live Broadcasting source connections - Live Broadcasting source connections - - - - Delete selected - Delete selected - - - - Create new connection - Create new connection - - - - Rename selected - Rename selected - - - - Disconnect all - Disconnect all - - - - Turn on Live Broadcasting when applying these settings - Turn on Live Broadcasting when applying these settings - - - - Settings for %1 - Settings for %1 - - - - Dynamically update Ogg Vorbis metadata. - Dynamically update Ogg Vorbis metadata. - - - - ICQ - ICQ - - - - AIM - AIM - - - - Website - Website - - - - Live mix - Live mix - - - - IRC - IRC - - - - Select a source connection above to edit its settings here - Select a source connection above to edit its settings here - - - - Password storage - Password storage - - - - Plain text - Plain text - - - - Secure storage (OS keychain) - Secure storage (OS keychain) - - - - Genre - Genre - - - - Use UTF-8 encoding for metadata. - Use UTF-8 encoding for metadata. - - - - Description - Description - - - - Encoding - Encoding - - - - Bitrate - Débit - - - - - Format - Format - - - - Channels - Channels - - - - Server connection - Server connection - - - - Type - Type - - - - Host - Host - - - - Login - Login - - - - Mount - Mount - - - - Port - Port - - - - Password - Password - - - - Stream info - Stream info - - - - Metadata - Metadata - - - - Use static artist and title. - Use static artist and title. - - - - Static title - Static title - - - - Static artist - Static artist - - - - Automatic reconnect - Automatic reconnect - - - - Time to wait before the first reconnection attempt is made. - Time to wait before the first reconnection attempt is made. - - - - - seconds - seconds - - - - Wait until first attempt - Wait until first attempt - - - - Reconnect period - Reconnect period - - - - Time to wait between two reconnection attempts. - Time to wait between two reconnection attempts. - - - - Limit number of reconnection attempts - Limit number of reconnection attempts - - - - Maximum retries - Maximum retries - - - - Reconnect if the connection to the streaming server is lost. - Reconnect if the connection to the streaming server is lost. - - - - Enable automatic reconnect - Enable automatic reconnect - - - - DlgPrefColors - - - - By hotcue number - By hotcue number - - - - Color - Color - - - - DlgPrefColorsDlg - - - Color Preferences - Color Preferences - - - - - Edit… - Edit… - - - - Track palette - Track palette - - - - Loop default color - Loop default color - - - - Hotcue palette - Hotcue palette - - - - Hotcue default color - Hotcue default color - - - - Replace… - Replace… - - - - DlgPrefController - - - Apply device settings? - Apply device settings? - - - - Your settings must be applied before starting the learning wizard. -Apply settings and continue? - Your settings must be applied before starting the learning wizard. -Apply settings and continue? - - - - None - None - - - - %1 by %2 - %1 by %2 - - - - No Name - No Name - - - - No Description - No Description - - - - No Author - No Author - - - - Mapping has been edited - Mapping has been edited - - - - Always overwrite during this session - Always overwrite during this session - - - - Save As - Save As - - - - Overwrite - Overwrite - - - - Save user mapping - Save user mapping - - - - Enter the name for saving the mapping to the user folder. - Enter the name for saving the mapping to the user folder. - - - - Saving mapping failed - Saving mapping failed - - - - A mapping cannot have a blank name and may not contain special characters. - A mapping cannot have a blank name and may not contain special characters. - - - - A mapping file with that name already exists. - A mapping file with that name already exists. - - - - missing - missing - - - - built-in - built-in - - - - Do you want to save the changes? - Do you want to save the changes? - - - - Troubleshooting - Troubleshooting - - - - <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - - - - Mapping already exists. - Mapping already exists. - - - - <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - - - - Clear Input Mappings - Clear Input Mappings - - - - Are you sure you want to clear all input mappings? - Are you sure you want to clear all input mappings? - - - - Clear Output Mappings - Clear Output Mappings - - - - Are you sure you want to clear all output mappings? - Are you sure you want to clear all output mappings? - - - - DlgPrefControllerDlg - - - (device category goes here) - (device category goes here) - - - - Controller Name - Controller Name - - - - Enabled - Activé - - - - Description: - Description: - - - - Support: - Support: - - - - Input Mappings - Input Mappings - - - - - Search - Search - - - - - Add - Add - - - - - Remove - Supprimer - - - - Click to start the Controller Learning wizard. - Click to start the Controller Learning wizard. - - - - Controller Preferences - Controller Preferences - - - - Controller Setup - Controller Setup - - - - Load Mapping: - Load Mapping: - - - - Mapping Info - Mapping Info - - - - Author: - Author: - - - - Name: - Name: - - - - Learning Wizard (MIDI Only) - Learning Wizard (MIDI Only) - - - - Mapping Files: - Mapping Files: - - - - - Clear All - Clear All - - - - Output Mappings - Output Mappings - - - - DlgPrefControllers - - - Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the %1. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx. - Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the %1. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx. - - - - Mixxx DJ Hardware Guide - Mixxx DJ Hardware Guide - - - - MIDI Mapping File Format - MIDI Mapping File Format - - - - MIDI Scripting with Javascript - MIDI Scripting with Javascript - - - - DlgPrefControllersDlg - - - Controller Preferences - Controller Preferences - - - - Controllers - Controllers - - - - Mixxx did not detect any controllers. If you connected the controller while Mixxx was running you must restart Mixxx first. - Mixxx did not detect any controllers. If you connected the controller while Mixxx was running you must restart Mixxx first. - - - - Mappings - Mappings - - - - Open User Mapping Folder - Open User Mapping Folder - - - - Resources - Resources - - - - Controllers are physical devices that send MIDI or HID signals to your computer over a USB connection. These allow you to control Mixxx in a more hands-on way than a keyboard and mouse. Attached controllers that Mixxx recognizes are shown in the "Controllers" section in the sidebar. - Controllers are physical devices that send MIDI or HID signals to your computer over a USB connection. These allow you to control Mixxx in a more hands-on way than a keyboard and mouse. Attached controllers that Mixxx recognizes are shown in the "Controllers" section in the sidebar. - - - - You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. - You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. - - - - DlgPrefControlsDlg - - - Skin - Skin - - - - Tool tips - Tool tips - - - - Select from different color schemes of a skin if available. - Select from different color schemes of a skin if available. - - - - Color scheme - Color scheme - - - - Locales determine country and language specific settings. - Locales determine country and language specific settings. - - - - Locale - Locale - - - - Interface Preferences - Interface Preferences - - - - Skin selector - - - - - Miscellaneous - Miscellaneous - - - - HiDPI / Retina scaling - HiDPI / Retina scaling - - - - Change the size of text, buttons, and other items. - Change the size of text, buttons, and other items. - - - - Screen saver - Screen saver - - - - Start in full-screen mode - Start in full-screen mode - - - - Full-screen mode - Full-screen mode - - - - Off - Off - - - - Library only - Library only - - - - Library and Skin - Library and Skin - - - - DlgPrefDeck - - - Mixxx mode - Mixxx mode - - - - Mixxx mode (no blinking) - Mixxx mode (no blinking) - - - - Pioneer mode - Pioneer mode - - - - Denon mode - Denon mode - - - - Numark mode - Numark mode - - - - CUP mode - CUP mode - - - - mm:ss%1zz - Traditional - mm:ss%1zz - Traditional - - - - mm:ss - Traditional (Coarse) - mm:ss - Traditional (Coarse) - - - - s%1zz - Seconds - s%1zz - Seconds - - - - sss%1zz - Seconds (Long) - sss%1zz - Seconds (Long) - - - - s%1sss%2zz - Kiloseconds - s%1sss%2zz - Kiloseconds - - - - Intro start - Intro start - - - - Main cue - Main cue - - - - First sound (skip silence) - First sound (skip silence) - - - - Beginning of track - Beginning of track - - - - Reject - Rejeter - - - - Allow, but stop deck - Autoriser, mais arrêter la platine - - - - Allow, play from load point - Autoriser, jouer depuis le point de chargement - - - - 4% - 4% - - - - 6% (semitone) - 6% (semitone) - - - - 8% (Technics SL-1210) - 8% (Technics SL-1210) - - - - 10% - 10% - - - - 16% - 16% - - - - 24% - 24% - - - - 50% - 50% - - - - 90% - 90% - - - - DlgPrefDeckDlg - - - Deck Preferences - Deck Preferences - - - - Deck options - Deck options - - - - Cue mode - Cue mode - - - - Mixxx mode: -- Cue button while pause at cue point = preview -- Cue button while pause not at cue point = set cue point -- Cue button while playing = pause at cue point -Mixxx mode (no blinking): -- Same as Mixxx mode but with no blinking indicators -Pioneer mode: -- Same as Mixxx mode with a flashing play button -Denon mode: -- Cue button at cue point = preview -- Cue button not at cue point = pause at cue point -- Play = set cue point -Numark mode: -- Same as Denon mode, but without a flashing play button -CUP mode: -- Cue button while pause at cue point = play after release -- Cue button while pause not at cue point = set cue point and play after release -- Cue button while playing = go to cue point and play after release - - Mixxx mode: -- Cue button while pause at cue point = preview -- Cue button while pause not at cue point = set cue point -- Cue button while playing = pause at cue point -Mixxx mode (no blinking): -- Same as Mixxx mode but with no blinking indicators -Pioneer mode: -- Same as Mixxx mode with a flashing play button -Denon mode: -- Cue button at cue point = preview -- Cue button not at cue point = pause at cue point -- Play = set cue point -Numark mode: -- Same as Denon mode, but without a flashing play button -CUP mode: -- Cue button while pause at cue point = play after release -- Cue button while pause not at cue point = set cue point and play after release -- Cue button while playing = go to cue point and play after release - - - - - Track time display - Track time display - - - - Elapsed - Elapsed - - - - Remaining - Remaining - - - - Elapsed and Remaining - Elapsed and Remaining - - - - Time Format - Time Format - - - - Intro start - Intro start - - - - When the analyzer places the intro start point automatically, -it will place it at the main cue point if the main cue point has been set previously. -This may be helpful for upgrading to Mixxx 2.3 from earlier versions. - -If this option is disabled, the intro start point is automatically placed at the first sound. - When the analyzer places the intro start point automatically, -it will place it at the main cue point if the main cue point has been set previously. -This may be helpful for upgrading to Mixxx 2.3 from earlier versions. - -If this option is disabled, the intro start point is automatically placed at the first sound. - - - - Set intro start to main cue when analyzing tracks - Set intro start to main cue when analyzing tracks - - - - Track load point - Track load point - - - - Clone deck - Clone deck - - - - Loading a track, when deck is playing - Charger une piste, lorsque une platine est en cours de lecture - - - - Create a playing clone of the first playing deck by double-tapping a Load button on a controller or keyboard. -You can always drag-and-drop tracks on screen to clone a deck. - Create a playing clone of the first playing deck by double-tapping a Load button on a controller or keyboard. -You can always drag-and-drop tracks on screen to clone a deck. - - - - Double-press Load button to clone playing track - Double-press Load button to clone playing track - - - - Speed (Tempo) and Key (Pitch) options - Speed (Tempo) and Key (Pitch) options - - - - Permanent rate change when left-clicking - Permanent rate change when left-clicking - - - - - - - % - % - - - - Permanent rate change when right-clicking - Permanent rate change when right-clicking - - - - Reset on track load - Reset on track load - - - - Current key - Current key - - - - Temporary rate change when right-clicking - Temporary rate change when right-clicking - - - - Permanent - Permanent - - - - Value in milliseconds - Value in milliseconds - - - - Temporary - Temporary - - - - Sync mode (Dynamic tempo tracks) - - - - - Keylock mode - Keylock mode - - - - Ramping sensitivity - Ramping sensitivity - - - - Pitch bend behavior - Pitch bend behavior - - - - Original key - Original key - - - - Temporary rate change when left-clicking - Temporary rate change when left-clicking - - - - Speed/Tempo - Speed/Tempo - - - - Key/Pitch - Key/Pitch - - - - Adjustment buttons: - Adjustment buttons: - - - - Apply tempo changes from a soft-leading track (usually the leaving track in a transition) to the follower tracks. After the transition, the follower track will continue with the previous leader's very last tempo. Changes from explicit selected leaders are always applied. - - - - - Follow soft leader's tempo - - - - - Coarse - Coarse - - - - Fine - Fine - - - - Make the speed sliders work like those on DJ turntables and CDJs where moving downward increases the speed - Make the speed sliders work like those on DJ turntables and CDJs where moving downward increases the speed - - - - Down increases speed - Down increases speed - - - - Slider range - Slider range - - - - Adjusts the range of the speed (Vinyl "Pitch") slider. - Adjusts the range of the speed (Vinyl "Pitch") slider. - - - - Abrupt jump - Abrupt jump - - - - Smoothly adjusts deck speed when temporary change buttons are held down - Smoothly adjusts deck speed when temporary change buttons are held down - - - - Smooth ramping - Smooth ramping - - - - Keyunlock mode - Keyunlock mode - - - - Reset key - Reset key - - - - Keep key - Keep key - - - - The tempo of a previous soft leader track at the beginning of the transition is kept steady. After the transition, the follower track will maintain this original tempo. This technique serves as a workaround to avoid dynamic tempo changes, as seen during the outro of rubato-style tracks. For instance, it prevents the follower track from continuing with a slowed-down tempo of the soft leader. This corresponds to the behavior before Mixxx 2.4. Changes from explicit selected leaders are always applied. - - - - - Use steady tempo - - - - - DlgPrefEffectsDlg - - - Effects Preferences - Effects Preferences - - - - - Effect Chain Presets - Effect Chain Presets - - - - Drag and drop to rearrange lists and copy chains between lists. Create and edit chain presets in the effect units in the main window. Please refer the manual for further details. - Drag and drop to rearrange lists and copy chains between lists. Create and edit chain presets in the effect units in the main window. Please refer the manual for further details. - - - - Chain presets from these lists will be selectable in the given order in the main window and from controllers (depending on the controller mapping). - Chain presets from these lists will be selectable in the given order in the main window and from controllers (depending on the controller mapping). - - - - Effects in this chain preset: - Effects in this chain preset: - - - - effect 1 name - effect 1 name - - - - effect 2 name - effect 2 name - - - - effect 3 name - effect 3 name - - - - Import - Import - - - - Rename - Renommer - - - - Export - Export - - - - Delete - Delete - - - - Quick Effect Chain Presets - Quick Effect Chain Presets - - - - - Visible Effects - Visible Effects - - - - Drag and drop to rearrange lists and show or hide effects. - Drag and drop to rearrange lists and show or hide effects. - - - - Hidden Effects - Hidden Effects - - - - Effect load behavior - Effect load behavior - - - - Keep metaknob position - Keep metaknob position - - - - Reset metaknob to effect default - Reset metaknob to effect default - - - - Effect Info - Effect Info - - - - Version: - Version: - - - - Description: - Description: - - - - Author: - Author: - - - - Name: - Name: - - - - Type: - Type: - - - - DlgPrefInterface - - - The minimum size of the selected skin is bigger than your screen resolution. - The minimum size of the selected skin is bigger than your screen resolution. - - - - Allow screensaver to run - Allow screensaver to run - - - - Prevent screensaver from running - Prevent screensaver from running - - - - Prevent screensaver while playing - Prevent screensaver while playing - - - - This skin does not support color schemes - This skin does not support color schemes - - - - Information - Information - - - - Mixxx must be restarted before the new locale or scaling settings will take effect. - Mixxx must be restarted before the new locale or scaling settings will take effect. - - - - DlgPrefKeyDlg - - - Key Notation Format Settings - Key Notation Format Settings - - - - When key detection is enabled, Mixxx detects the musical key of your tracks -and allows you to pitch adjust them for harmonic mixing. - When key detection is enabled, Mixxx detects the musical key of your tracks -and allows you to pitch adjust them for harmonic mixing. - - - - Enable Key Detection - Enable Key Detection - - - - Choose Analyzer - Choose Analyzer - - - - Choose between different algorithms to detect keys. - Choose between different algorithms to detect keys. - - - - Analyzer Settings - Analyzer Settings - - - - Enable Fast Analysis (For slow computers, may be less accurate) - Enable Fast Analysis (For slow computers, may be less accurate) - - - - Re-analyze keys when settings change or 3rd-party keys are present - Re-analyze keys when settings change or 3rd-party keys are present - - - - Key Notation - Key Notation - - - - Lancelot - Lancelot - - - - Lancelot/Traditional - Lancelot/Traditional - - - - OpenKey - OpenKey - - - - OpenKey/Traditional - OpenKey/Traditional - - - - Traditional - Traditional - - - - Custom - Custom - - - - A - A - - - - Bb - Bb - - - - B - B - - - - C - C - - - - Db - Db - - - - D - D - - - - Eb - Eb - - - - E - E - - - - F - F - - - - F# - F# - - - - G - G - - - - Ab - Ab - - - - Am - Am - - - - Bbm - Bbm - - - - Bm - Bm - - - - Cm - Cm - - - - C#m - C#m - - - - Dm - Dm - - - - Ebm - Ebm - - - - Em - Em - - - - Fm - Fm - - - - F#m - F#m - - - - Gm - Gm - - - - G#m - G#m - - - - DlgPrefLibrary - - - See the manual for details - See the manual for details - - - - Music Directory Added - Music Directory Added - - - - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - - - - Scan - Scan - - - - Choose a music directory - Choose a music directory - - - - Confirm Directory Removal - Confirm Directory Removal - - - - Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - - - - Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - - - - Hide Tracks - Hide Tracks - - - - Delete Track Metadata - Delete Track Metadata - - - - Leave Tracks Unchanged - Leave Tracks Unchanged - - - - Relink music directory to new location - Relink music directory to new location - - - - Select Library Font - Select Library Font - - - - DlgPrefLibraryDlg - - - If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - - - - Remove - Supprimer - - - - Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - - - - Music Directories - Répertoires de music - - - - Add - Add - - - - If an existing music directory is moved, Mixxx doesn't know where to find the audio files in it. Choose Relink to select the music directory in its new location. <br/> This will re-establish the links to the audio files in the Mixxx library. - If an existing music directory is moved, Mixxx doesn't know where to find the audio files in it. Choose Relink to select the music directory in its new location. <br/> This will re-establish the links to the audio files in the Mixxx library. - - - - Relink - This will re-establish the links to the audio files in the Mixxx database if you move an music directory to a new location. - Relink - - - - Rescan directories on start-up - Relire les répertoires au démarrage - - - - Audio File Formats - Audio File Formats - - - - Track Metadata Synchronization - Track Metadata Synchronization - - - - Track Table View - Track Table View - - - - Track Double-Click Action: - Track Double-Click Action: - - - - BPM display precision: - Précision de l'affichage BPM: - - - - Session History - Historique des sessions - - - - Track duplicate distance - Track duplicate distance - - - - When playing a track again log it to the session history only if more than N other tracks have been played in the meantime - When playing a track again log it to the session history only if more than N other tracks have been played in the meantime - - - - History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. - History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. - - - - Delete history playlist with less than N tracks - Delete history playlist with less than N tracks - - - - Miscellaneous - Miscellaneous - - - - Library Font: - Library Font: - - - - Enable search completions - Activer les complétions de recherche - - - - Enable search history keyboard shortcuts - Activer les raccourcis clavier pour l'historique de recherche - - - - Preferred Cover Art Fetcher Resolution - Résolution préférée du récupérateur de pochette d'album - - - - Fetch cover art from coverartarchive.com by using Import Metadata From Musicbrainz. - Récupérer les pochettes d'album depuis coverartarchive.com en utilisant l'importation de métadonnées depuis Musicbrainz. - - - - Note: ">1200 px" can fetch up to very large cover arts. - Note : ">1200 px" peut récupérer de très larges images de couverture - - - - >1200 px (if available) - >1200 px (si disponible) - - - - 1200 px (if available) - 1200 px (si disponible) - - - - 500 px - 500 px - - - - 250 px - 250 px - - - - Settings Directory - Répertoire des paramètres - - - - The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. - The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. - - - - Edit those files only if you know what you are doing and only while Mixxx is not running. - Edit those files only if you know what you are doing and only while Mixxx is not running. - - - - Open Mixxx Settings Folder - Open Mixxx Settings Folder - - - - Library Row Height: - Library Row Height: - - - - Use relative paths for playlist export if possible - Use relative paths for playlist export if possible - - - - ... - ... - - - - px - px - - - - Synchronize library track metadata from/to file tags - Synchronize library track metadata from/to file tags - - - - Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library - Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library - - - - Synchronize Serato track metadata from/to file tags (experimental) - Synchronize Serato track metadata from/to file tags (experimental) - - - - Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. - Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. - - - - Edit metadata after clicking selected track - Edit metadata after clicking selected track - - - - Search-as-you-type timeout: - Search-as-you-type timeout: - - - - ms - ms - - - - Load track to next available deck - Load track to next available deck - - - - External Libraries - External Libraries - - - - You will need to restart Mixxx for these settings to take effect. - You will need to restart Mixxx for these settings to take effect. - - - - Show Rhythmbox Library - Show Rhythmbox Library - - - - Add track to Auto DJ queue (bottom) - Add track to Auto DJ queue (bottom) - - - - Add track to Auto DJ queue (top) - Add track to Auto DJ queue (top) - - - - Ignore - Ignore - - - - Show Banshee Library - Show Banshee Library - - - - Show iTunes Library - Show iTunes Library - - - - Show Traktor Library - Show Traktor Library - - - - Show Rekordbox Library - Show Rekordbox Library - - - - Show Serato Library - Show Serato Library - - - - All external libraries shown are write protected. - All external libraries shown are write protected. - - - - DlgPrefMixerDlg - - - Crossfader Preferences - Crossfader Preferences - - - - Crossfader Curve - Crossfader Curve - - - - Slow fade/Fast cut (additive) - Slow fade/Fast cut (additive) - - - - Constant power - Constant power - - - - Mixing - Mixing - - - - Scratching - Scratching - - - - Linear - Linear - - - - Logarithmic - Logarithmic - - - - Reverse crossfader (Hamster Style) - Reverse crossfader (Hamster Style) - - - - Deck Equalizers - Deck Equalizers - - - - Only allow EQ knobs to control EQ-specific effects - Only allow EQ knobs to control EQ-specific effects - - - - Uncheck to allow any effect to be loaded into the EQ knobs. - Uncheck to allow any effect to be loaded into the EQ knobs. - - - - Use the same EQ filter for all decks - Use the same EQ filter for all decks - - - - Uncheck to allow different decks to use different EQ effects. - Uncheck to allow different decks to use different EQ effects. - - - - Equalizer Plugin - Equalizer Plugin - - - - Quick Effect - Quick Effect - - - - Bypass EQ effect processing - Bypass EQ effect processing - - - - When checked, EQs are not processed, improving performance on slower computers. - When checked, EQs are not processed, improving performance on slower computers. - - - - Resets the equalizers to their default values when loading a track. - Resets the equalizers to their default values when loading a track. - - - - Reset equalizers on track load - Reset equalizers on track load - - - - Resets the deck gain to unity when loading a track. - Resets the deck gain to unity when loading a track. - - - - Reset gain on track load - Reset gain on track load - - - - Equalizer frequency Shelves - Plages de fréquences de l'égaliseur - - - - High EQ - High EQ - - - - - 16 Hz - 16 Hz - - - - - 20.05 kHz - 20.05 kHz - - - - Low EQ - Low EQ - - - - Main EQ - Main EQ - - - - Reset Parameter - Reset Parameter - - - - DlgPrefModplug - - - Modplug Preferences - Modplug Preferences - - - - Maximum Number of Mixing Channels: - Maximum Number of Mixing Channels: - - - - Show Advanced Settings - Show Advanced Settings - - - - - - Low - Low - - - - Reverb Delay: - Reverb Delay: - - - - - - High - High - - - - None - None - - - - Bass Expansion - Bass Expansion - - - - Bass Range: - Bass Range: - - - - 16 - 16 - - - - Front/Rear Delay: - Front/Rear Delay: - - - - Pro-Logic Surround - Pro-Logic Surround - - - - Full - Full - - - - Reverb - Réverbération - - - - Stereo separation - Stereo separation - - - - 10Hz - 10Hz - - - - 10ms - 10ms - - - - 256 - 256 - - - - 5ms - 5ms - - - - 100Hz - 100Hz - - - - 250ms - 250ms - - - - 50ms - 50ms - - - - Noise reduction - Noise reduction - - - - Hints - Hints - - - - Module files are decoded at once and kept in RAM to allow for seeking and smooth operation in Mixxx. About 10MB of RAM are required for 1 minute of audio. - Module files are decoded at once and kept in RAM to allow for seeking and smooth operation in Mixxx. About 10MB of RAM are required for 1 minute of audio. - - - - Decoding options for libmodplug, a software library for loading and rendering module files (MOD music, tracker music). - Decoding options for libmodplug, a software library for loading and rendering module files (MOD music, tracker music). - - - - Decoding Options - Decoding Options - - - - Resampling mode (interpolation) - Resampling mode (interpolation) - - - - Enable oversampling - Enable oversampling - - - - Nearest (very fast, extremely bad quality) - Nearest (very fast, extremely bad quality) - - - - Linear (fast, good quality) - Linear (fast, good quality) - - - - Cubic Spline (high quality) - Cubic Spline (high quality) - - - - 8-tap FIR (extremely high quality) - 8-tap FIR (extremely high quality) - - - - Memory limit for single track (MB) - Memory limit for single track (MB) - - - - All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - - - - DlgPrefRecord - - - Choose recordings directory - Choose recordings directory - - - - - Recordings directory invalid - Recordings directory invalid - - - - Recordings directory must be set to an existing directory. - Recordings directory must be set to an existing directory. - - - - Recordings directory must be set to a directory. - Recordings directory must be set to a directory. - - - - Recordings directory not writable - Recordings directory not writable - - - - You do not have write access to %1. Choose a recordings directory you have write access to. - You do not have write access to %1. Choose a recordings directory you have write access to. - - - - DlgPrefRecordDlg - - - Recording Preferences - Recording Preferences - - - - Browse... - Browse... - - - - - Quality - Quality - - - - Tags - Tags - - - - Title - Titre - - - - Author - Author - - - - Album - Album - - - - Output File Format - Output File Format - - - - Compression - Compression - - - - Lossy - Lossy - - - - Recording Files - Recording Files - - - - Directory: - Directory: - - - - Compression Level - Compression Level - - - - Lossless - Lossless - - - - Create a CUE file - Create a CUE file - - - - Split recordings at - Split recordings at - - - - DlgPrefReplayGain - - - %1 LUFS (adjust by %2 dB) - %1 LUFS (adjust by %2 dB) - - - - DlgPrefReplayGainDlg - - - Normalization Preferences - Normalization Preferences - - - - ReplayGain Loudness Normalization - ReplayGain Loudness Normalization - - - - Apply loudness normalization to loaded tracks. - Apply loudness normalization to loaded tracks. - - - - Apply ReplayGain - Apply ReplayGain - - - - -30 LUFS - -30 LUFS - - - - -6 LUFS - -6 LUFS - - - - When ReplayGain is enabled, adjust tracks lacking ReplayGain information by this amount. - When ReplayGain is enabled, adjust tracks lacking ReplayGain information by this amount. - - - - Initial boost without ReplayGain data - Initial boost without ReplayGain data - - - - ReplayGain targets a reference loudness of -18 LUFS (Loudness Units relative to Full Scale). You may increase it if you find Mixxx is too quiet or reduce it if you find that your tracks are clipping. You may also want to decrease the volume of unanalyzed tracks if you find they are often louder than ReplayGained tracks. For podcasting a loudness of -16 LUFS is recommended. - -The loudness target is approximate and assumes track pregain and main output level are unchanged. - - - - - For tracks with ReplayGain, adjust the target loudness to this LUFS value (Loudness Units relative to Full Scale). - For tracks with ReplayGain, adjust the target loudness to this LUFS value (Loudness Units relative to Full Scale). - - - - Target loudness - Target loudness - - - - -12 dB - -12 dB - - - - Analysis - Analysis - - - - ReplayGain 2.0 (ITU-R BS.1770) - ReplayGain 2.0 (ITU-R BS.1770) - - - - ReplayGain 1.0 - ReplayGain 1.0 - - - - Disabled - Disabled - - - - Re-analyze and override an existing value - Re-analyze and override an existing value - - - - When an unanalyzed track is playing, Mixxx will avoid an abrupt volume change by not applying a newly calculated ReplayGain value. - When an unanalyzed track is playing, Mixxx will avoid an abrupt volume change by not applying a newly calculated ReplayGain value. - - - - +12 dB - +12 dB - - - - Hints - Hints - - - - DlgPrefSound - - - %1 Hz - %1 Hz - - - - Default (long delay) - Default (long delay) - - - - Experimental (no delay) - Experimental (no delay) - - - - Disabled (short delay) - Disabled (short delay) - - - - Soundcard Clock - Soundcard Clock - - - - Network Clock - Network Clock - - - - Direct monitor (recording and broadcasting only) - Direct monitor (recording and broadcasting only) - - - - Disabled - Disabled - - - - Enabled - Activé - - - - Stereo - Stereo - - - - Mono - Mono - - - - To enable Realtime scheduling (currently disabled), see the %1. - To enable Realtime scheduling (currently disabled), see the %1. - - - - The %1 lists sound cards and controllers you may want to consider for using Mixxx. - The %1 lists sound cards and controllers you may want to consider for using Mixxx. - - - - Mixxx DJ Hardware Guide - Mixxx DJ Hardware Guide - - - - auto (<= 1024 frames/period) - - - - - 2048 frames/period - - - - - 4096 frames/period - - - - - Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - - - - Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - - - - Refer to the Mixxx User Manual for details. - Refer to the Mixxx User Manual for details. - - - - Configured latency has changed. - Configured latency has changed. - - - - Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - - - Realtime scheduling is enabled. - Realtime scheduling is enabled. - - - - Main output only - Main output only - - - - Main and booth outputs - Main and booth outputs - - - - %1 ms - %1 ms - - - - Configuration error - Configuration error - - - - DlgPrefSoundDlg - - - Sound Hardware Preferences - Sound Hardware Preferences - - - - Sound API - Sound API - - - - Sample Rate - Sample Rate - - - - Audio Buffer - Audio Buffer - - - - Engine Clock - Engine Clock - - - - Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - - - - Main Mix - Main Mix - - - - Main Output Mode - Main Output Mode - - - - Microphone Monitor Mode - Microphone Monitor Mode - - - - Microphone Latency Compensation - Microphone Latency Compensation - - - - - - - ms - milliseconds - ms - - - - 20 ms - 20 ms - - - - Buffer Underflow Count - Buffer Underflow Count - - - - 0 - 0 - - - - Keylock/Pitch-Bending Engine - Keylock/Pitch-Bending Engine - - - - Multi-Soundcard Synchronization - Multi-Soundcard Synchronization - - - - Output - Output - - - - Input - Input - - - - System Reported Latency - System Reported Latency - - - - Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - - - - Main Output Delay - Main Output Delay - - - - Headphone Output Delay - Headphone Output Delay - - - - Booth Output Delay - Booth Output Delay - - - - Hints and Diagnostics - Hints and Diagnostics - - - - Downsize your audio buffer to improve Mixxx's responsiveness. - Downsize your audio buffer to improve Mixxx's responsiveness. - - - - Query Devices - Query Devices - - - - DlgPrefSoundItem - - - Channel %1 - Channel %1 - - - - Channels %1 - %2 - Channels %1 - %2 - - - - Sound Item Preferences - Constructs new sound items inside the Sound Hardware Preferences, representing an AudioPath and SoundDevice - Sound Item Preferences - - - - Type (#) - Type (#) - - - - DlgPrefVinylDlg - - - Input - Input - - - - Vinyl Configuration - Vinyl Configuration - - - - Show Signal Quality in Skin - Show Signal Quality in Skin - - - - Vinyl Control Preferences - Vinyl Control Preferences - - - - Turntable Input Signal Boost - Turntable Input Signal Boost - - - - 0 dB - 0 dB - - - - 44 dB - 44 dB - - - - Vinyl Type - Vinyl Type - - - - Lead-In - Lead-In - - - - Deck 1 - Deck 1 - - - - Deck 2 - Deck 2 - - - - Deck 3 - Deck 3 - - - - Deck 4 - Deck 4 - - - - Signal Quality - Signal Quality - - - - http://www.xwax.co.uk - http://www.xwax.co.uk - - - - Powered by xwax - Powered by xwax - - - - Hints - Hints - - - - Select sound devices for Vinyl Control in the Sound Hardware pane. - Select sound devices for Vinyl Control in the Sound Hardware pane. - - - - DlgPrefWaveform - - - Filtered - Filtered - - - - HSV - HSV - - - - RGB - RGB - - - - OpenGL not available - OpenGL not available - - - - dropped frames - dropped frames - - - - Cached waveforms occupy %1 MiB on disk. - Cached waveforms occupy %1 MiB on disk. - - - - DlgPrefWaveformDlg - - - Waveform Preferences - Waveform Preferences - - - - Frame rate - Frame rate - - - - Displays which OpenGL version is supported by the current platform. - Displays which OpenGL version is supported by the current platform. - - - - Normalize waveform overview - Normalize waveform overview - - - - Average frame rate - Average frame rate - - - - Visual gain - Visual gain - - - - Default zoom level - Waveform zoom - Default zoom level - - - - Displays the actual frame rate. - Displays the actual frame rate. - - - - Visual gain of the middle frequencies - Visual gain of the middle frequencies - - - - End of track warning - Avertissement de fin de piste - - - - OpenGL status - OpenGL status - - - - Highlight the waveforms when the last seconds of a track remains. - Highlight the waveforms when the last seconds of a track remains. - - - - seconds - seconds - - - - Low - Low - - - - Middle - Middle - - - - Global - Global - - - - Visual gain of the high frequencies - Visual gain of the high frequencies - - - - Visual gain of the low frequencies - Visual gain of the low frequencies - - - - High - High - - - - Waveform type - Waveform type - - - - Global visual gain - Global visual gain - - - - The waveform overview shows the waveform envelope of the entire track. -Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - The waveform overview shows the waveform envelope of the entire track. -Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - - - - The waveform shows the waveform envelope of the track near the current playback position. -Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - The waveform shows the waveform envelope of the track near the current playback position. -Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - - - Waveform overview type - Waveform overview type - - - - fps - fps - - - - Synchronize zoom level across all waveform displays. - Synchronize zoom level across all waveform displays. - - - - Synchronize zoom level across all waveforms - Synchronize zoom level across all waveforms - - - - Caching - Caching - - - - Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - - - - Enable waveform caching - Enable waveform caching - - - - Generate waveforms when analyzing library - Generate waveforms when analyzing library - - - - Beat grid opacity - Beat grid opacity - - - - Set amount of opacity on beat grid lines. - Set amount of opacity on beat grid lines. - - - - % - % - - - - Play marker position - Play marker position - - - - Moves the play marker position on the waveforms to the left, right or center (default). - Moves the play marker position on the waveforms to the left, right or center (default). - - - - Clear Cached Waveforms - Clear Cached Waveforms - - - - DlgPreferences - - - Sound Hardware - Sound Hardware - - - - Controllers - Controllers - - - - Library - Library - - - - Interface - Interface - - - - Waveforms - Waveforms - - - - Mixer - Mixer - - - - Auto DJ - Auto DJ - - - - Decks - Decks - - - - Colors - Colors - - - - &Help - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Help - - - - &Restore Defaults - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - - - - - &Apply - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Apply - - - - &Cancel - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Cancel - - - - &Ok - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Ok - - - - Effects - Effets - - - - Recording - Recording - - - - Beat Detection - Beat Detection - - - - Key Detection - Key Detection - - - - Normalization - Normalization - - - - <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - - - - Vinyl Control - Vinyl Control - - - - Live Broadcasting - Diffusion en direct - - - - Modplug Decoder - Modplug Decoder - - - - DlgPreferencesDlg - - - Preferences - Preferences - - - - 1 - 1 - - - - - TextLabel - TextLabel - - - - DlgRecording - - - Recordings - Recordings - - - - - Start Recording - Start Recording - - - - Recording to file: - Recording to file: - - - - Stop Recording - Stop Recording - - - - %1 MiB written in %2 - %1 MiB written in %2 - - - - DlgReplaceCueColor - - - Replace Hotcue Color - Replace Hotcue Color - - - - Replace cue color if … - Replace cue color if … - - - - Hotcue index - Hotcue index - - - - - is - is - - - - - is not - is not - - - - Current cue color - Current cue color - - - - If you don't specify any conditions, the colors of all cues in the library will be replaced. - If you don't specify any conditions, the colors of all cues in the library will be replaced. - - - - … by: - … by: - - - - New cue color - New cue color - - - - Selecting database rows... - Selecting database rows... - - - - No colors changed! - No colors changed! - - - - No cues matched the specified criteria. - No cues matched the specified criteria. - - - - Confirm Color Replacement - Confirm Color Replacement - - - - The colors of %1 cues in %2 tracks will be replaced. This change cannot be undone! Are you sure? - The colors of %1 cues in %2 tracks will be replaced. This change cannot be undone! Are you sure? - - - - DlgTagFetcher - - - MusicBrainz - MusicBrainz - - - - Select best possible match - Select best possible match - - - - - Track - Track - - - - - Year - Année - - - - Title - Titre - - - - - Artist - Artiste - - - - - Album - Album - - - - Album Artist - Artiste de l'album - - - - Fetching track data from the MusicBrainz database - Fetching track data from the MusicBrainz database - - - - Get API-Key - To be able to submit audio fingerprints to the MusicBrainz database, a free application programming interface key (API key) is required. - Get API-Key - - - - Submit - Submits audio fingerprints to the MusicBrainz database. - Submit - - - - New Column - New Column - - - - New Item - New Item - - - - Current Cover Art - Image de Couverture Courante - - - - Found Cover Art - Pochette d'Album Trouvée - - - - Apply Cover - Appliquer la Pochette - - - - The results are ready to be applied. - Les résultats sont prêts à être appliqués. - - - - Retry - Retry - - - - &Previous - &Previous - - - - &Next - &Next - - - - &Apply - &Apply - - - - &Close - &Close - - - - Original tags - Original tags - - - - %1 - %1 - - - - Could not find this track in the MusicBrainz database. - Impossible de trouver cette piste dans la base de données MusicBrainz. - - - - Suggested tags - Suggested tags - - - - The results are ready to be applied - Les résultats sont prêts à être appliqués - - - - Can't connect to %1: %2 - Impossible de se connecter à %1 : %2 - - - - Looking for cover art - Recherche de pochette d'album - - - - Cover art found, receiving image. - Pochette d'album trouvée, réception de l'image. - - - - Cover Art is not available for selected metadata - La pochette d'image n'est pas disponible pour les métadonnées sélectionnées - - - - Metadata & Cover Art applied - Métadonnées & Pochette d'Album appliquées - - - - Selected cover art applied - Pochette d'album sélectionnée appliquée - - - - Cover Art File Already Exists - La Pochette d'Album Existe Déjà - - - - File: %1 -Folder: %2 -Override existing file? -This can not be undone! - Fichier : %1 -Dossier : %2 -Écraser le fichier existant ? -Cette opération est irréversible ! - - - - DlgTrackExport - - - Export Tracks - Export Tracks - - - - Exporting Tracks - Exporting Tracks - - - - (status text) - (status text) - - - - &Cancel - &Cancel - - - - DlgTrackInfo - - - Track Editor - Track Editor - - - - Summary - Summary - - - - Filetype: - Filetype: - - - - BPM: - BPM: - - - - Location: - Location: - - - - Bitrate: - Bitrate: - - - - Comments - Comments - - - - BPM - BPM - - - - Sets the BPM to 75% of the current value. - Sets the BPM to 75% of the current value. - - - - 3/4 BPM - 3/4 BPM - - - - Sets the BPM to 50% of the current value. - Sets the BPM to 50% of the current value. - - - - Displays the BPM of the selected track. - Displays the BPM of the selected track. - - - - Track # - Piste n° - - - - Album Artist - Artiste de l'album - - - - Composer - Compositeur - - - - Title - Titre - - - - Grouping - Regroupement - - - - Key - Clé - - - - Year - Année - - - - Artist - Artiste - - - - Album - Album - - - - Genre - Genre - - - - ReplayGain: - ReplayGain: - - - - Sets the BPM to 200% of the current value. - Sets the BPM to 200% of the current value. - - - - Double BPM - Double BPM - - - - Halve BPM - Halve BPM - - - - Clear BPM and Beatgrid - Clear BPM and Beatgrid - - - - Move to the previous item. - "Previous" button - Move to the previous item. - - - - &Previous - &Previous - - - - Move to the next item. - "Next" button - Move to the next item. - - - - &Next - &Next - - - - Duration: - Duration: - - - - Import Metadata from MusicBrainz - Import Metadata from MusicBrainz - - - - Re-Import Metadata from file - Re-Import Metadata from file - - - - Color - Couleur - - - - Date added: - Date added: - - - - Open in File Browser - Open in File Browser - - - - Samplerate: - - - - - Track BPM: - Track BPM: - - - - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - - - - Assume constant tempo - Assume constant tempo - - - - Sets the BPM to 66% of the current value. - Sets the BPM to 66% of the current value. - - - - 2/3 BPM - 2/3 BPM - - - - Sets the BPM to 150% of the current value. - Sets the BPM to 150% of the current value. - - - - 3/2 BPM - 3/2 BPM - - - - Sets the BPM to 133% of the current value. - Sets the BPM to 133% of the current value. - - - - 4/3 BPM - 4/3 BPM - - - - Tap with the beat to set the BPM to the speed you are tapping. - Tap with the beat to set the BPM to the speed you are tapping. - - - - Tap to Beat - Tap to Beat - - - - Hint: Use the Library Analyze view to run BPM detection. - Hint: Use the Library Analyze view to run BPM detection. - - - - Save changes and close the window. - "OK" button - Save changes and close the window. - - - - &OK - &OK - - - - Discard changes and close the window. - "Cancel" button - Discard changes and close the window. - - - - Save changes and keep the window open. - "Apply" button - Save changes and keep the window open. - - - - &Apply - &Apply - - - - &Cancel - &Cancel - - - - (no color) - (pas de couleur) - - - - EffectChainPresetManager - - - Import effect chain preset - Import effect chain preset - - - - - Mixxx Effect Chain Presets - Mixxx Effect Chain Presets - - - - Error importing effect chain preset - Error importing effect chain preset - - - - Error importing effect chain preset "%1" - Error importing effect chain preset "%1" - - - - - imported - Importé - - - - duplicate - duplicate - - - - The effect chain imported from "%1" contains an effect that is not available: - The effect chain imported from "%1" contains an effect that is not available: - - - - If you load this chain preset, the unsupported effect will not be loaded with it. - If you load this chain preset, the unsupported effect will not be loaded with it. - - - - Export effect chain preset - Export effect chain preset - - - - Error exporting effect chain preset - Error exporting effect chain preset - - - - Could not save effect chain preset "%1" to file "%2". - Could not save effect chain preset "%1" to file "%2". - - - - Effect chain preset can not be renamed - La présélection de chaine d'effet ne peut pas être renommée - - - - Effect chain preset "%1" is read-only and can not be renamed. - Le préréglage de chaîne d'effet "%1" est en lecture seule et ne peut être renommé. - - - - Rename effect chain preset - Rename effect chain preset - - - - New name for effect chain preset - New name for effect chain preset - - - - - Effect chain preset name must not be empty. - Effect chain preset name must not be empty. - - - - - Invalid name "%1" - Nom "%1" invalide - - - - - An effect chain preset named "%1" already exists. - An effect chain preset named "%1" already exists. - - - - Error removing old effect chain preset - Error removing old effect chain preset - - - - Could not remove old effect chain preset "%1" - Could not remove old effect chain preset "%1" - - - - Effect chain preset can not be deleted - Le préréglage de chaîne d'effet ne peut être supprimé - - - - Effect chain preset "%1" is read-only and can not be deleted. - Le préréglage de chaîne d'effet "%1" est en lecture seule et ne peut être supprimé. - - - - Remove effect chain preset - Remove effect chain preset - - - - Are you sure you want to delete the effect chain preset "%1"? - Are you sure you want to delete the effect chain preset "%1"? - - - - Error deleting effect chain preset - Error deleting effect chain preset - - - - Could not delete effect chain preset "%1" - Could not delete effect chain preset "%1" - - - - Save preset for effect chain - Save preset for effect chain - - - - Name for new effect chain preset: - Name for new effect chain preset: - - - - Error saving effect chain preset - Error saving effect chain preset - - - - Could not save effect chain preset "%1" - Could not save effect chain preset "%1" - - - - EffectManifestTableModel - - - Type - Type - - - - Name - Nom - - - - EffectParameterSlotBase - - - No effect loaded. - No effect loaded. - - - - EffectsBackend - - - Built-In - Backend type for effects that are built into Mixxx. - Prédéfini - - - - Unknown - Backend type for effects were the backend is unknown. - Inconnu(e) - - - - EmptyWaveformWidget - - - Empty - Empty - - - - EngineBuffer - - - Soundtouch (faster) - Soundtouch (faster) - - - - Rubberband (better) - Rubberband (better) - - - - Rubberband R3 (near-hi-fi quality) - Rubberband R3 (qualité quasi-hi-fi) - - - - Unknown, using Rubberband (better) - Inconnu, utilisation de Rubberband (meilleure) - - - - ErrorDialogHandler - - - Fatal error - Fatal error - - - - Critical error - Critical error - - - - Warning - Warning - - - - Information - Information - - - - Question - Question - - - - FindOnWebMenuDiscogs - - - Artist - Artiste - - - - Artist + Title - Artiste + Titre - - - - Title - Titre - - - - Artist + Album - Artiste + Album - - - - Album - Album - - - - FindOnWebMenuLastfm - - - Artist - Artiste - - - - Artist + Title - Artiste + Titre - - - - Title - Titre - - - - Artist + Album - Artiste + Album - - - - Album - Album - - - - FindOnWebMenuSoundcloud - - - Artist - Artiste - - - - Artist + Title - Artiste + Titre - - - - Title - Titre - - - - Artist + Album - Artiste + Album - - - - Album - Album - - - - GLRGBWaveformWidget - - - RGB - RGB - - - - GLSLFilteredWaveformWidget - - - Filtered - Filtered - - - - GLSLRGBStackedWaveformWidget - - - RGB Stacked - RGB Stacked - - - - GLSLRGBWaveformWidget - - - RGB - RGB - - - - GLSimpleWaveformWidget - - - Simple - Simple - - - - GLVSyncTestWidget - - - VSyncTest - VSyncTest - - - - GLWaveformWidget - - - Filtered - Filtered - - - - HSVWaveformWidget - - - HSV - HSV - - - - ITunesFeature - - - - iTunes - iTunes - - - - Select your iTunes library - Select your iTunes library - - - - (loading) iTunes - (loading) iTunes - - - - Use Default Library - Use Default Library - - - - Choose Library... - Choose Library... - - - - Error Loading iTunes Library - Error Loading iTunes Library - - - - There was an error loading your iTunes library. Some of your iTunes tracks or playlists may not have loaded. - There was an error loading your iTunes library. Some of your iTunes tracks or playlists may not have loaded. - - - - LegacySkinParser - - - - Safe Mode Enabled - Shown when Mixxx is running in safe mode. - Safe Mode Enabled - - - - - No OpenGL -support. - Shown when Spinny can not be displayed. Please keep - unchanged ----------- -Shown when VuMeter can not be displayed. Please keep - unchanged - No OpenGL -support. - - - - activate - activate - - - - toggle - toggle - - - - right - right - - - - left - left - - - - right small - right small - - - - left small - left small - - - - up - up - - - - down - down - - - - up small - up small - - - - down small - down small - - - - Shortcut - Shortcut - - - - Library - - - Add Directory to Library - Add Directory to Library - - - - Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. - Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. - - - - LibraryFeature - - - Import Playlist - Importer une liste de lecture - - - - Playlist Files (*.m3u *.m3u8 *.pls *.csv) - Playlist Files (*.m3u *.m3u8 *.pls *.csv) - - - - Overwrite File? - Overwrite File? - - - - A playlist file with the name "%1" already exists. -The default "m3u" extension was added because none was specified. - -Do you really want to overwrite it? - A playlist file with the name "%1" already exists. -The default "m3u" extension was added because none was specified. - -Do you really want to overwrite it? - - - - LibraryScannerDlg - - - Library Scanner - Library Scanner - - - - It's taking Mixxx a minute to scan your music library, please wait... - It's taking Mixxx a minute to scan your music library, please wait... - - - - Cancel - Cancel - - - - Scanning: - Scanning: - - - - Scanning cover art (safe to cancel) - Scanning cover art (safe to cancel) - - - - LibraryTableModel - - - Sort items randomly - Sort items randomly - - - - MidiController - - - MIDI Controller - MIDI Controller - - - - MixxxControl(s) not found - MixxxControl(s) not found - - - - One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - - - - * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - - - - Some LEDs or other feedback may not work correctly. - Some LEDs or other feedback may not work correctly. - - - - * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) - - * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) - - - - - MixxxDb - - - Click OK to exit. - Click OK to exit. - - - - Cannot upgrade database schema - Cannot upgrade database schema - - - - Unable to upgrade your database schema to version %1 - Unable to upgrade your database schema to version %1 - - - - For help with database issues consult: - For help with database issues consult: - - - - Your mixxxdb.sqlite file may be corrupt. - Your mixxxdb.sqlite file may be corrupt. - - - - Try renaming it and restarting Mixxx. - Try renaming it and restarting Mixxx. - - - - Your mixxxdb.sqlite file was created by a newer version of Mixxx and is incompatible. - Your mixxxdb.sqlite file was created by a newer version of Mixxx and is incompatible. - - - - The database schema file is invalid. - The database schema file is invalid. - - - - MixxxLibraryFeature - - - Missing Tracks - Missing Tracks - - - - Hidden Tracks - Hidden Tracks - - - - Export to Engine Prime - Export to Engine Prime - - - - Tracks - Tracks - - - - MixxxMainWindow - - - Sound Device Busy - Sound Device Busy - - - - <b>Retry</b> after closing the other application or reconnecting a sound device - <b>Retry</b> after closing the other application or reconnecting a sound device - - - - - - <b>Reconfigure</b> Mixxx's sound device settings. - <b>Reconfigure</b> Mixxx's sound device settings. - - - - - Get <b>Help</b> from the Mixxx Wiki. - Get <b>Help</b> from the Mixxx Wiki. - - - - - - <b>Exit</b> Mixxx. - <b>Exit</b> Mixxx. - - - - Retry - Retry - - - - skin - skin - - - - - Reconfigure - Reconfigure - - - - Help - Help - - - - - Exit - Exit - - - - - Mixxx was unable to open all the configured sound devices. - Mixxx was unable to open all the configured sound devices. - - - - Sound Device Error - Sound Device Error - - - - <b>Retry</b> after fixing an issue - <b>Retry</b> after fixing an issue - - - - No Output Devices - No Output Devices - - - - Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - - - - <b>Continue</b> without any outputs. - <b>Continue</b> without any outputs. - - - - Continue - Continue - - - - Load track to Deck %1 - Load track to Deck %1 - - - - Deck %1 is currently playing a track. - Deck %1 is currently playing a track. - - - - Are you sure you want to load a new track? - Are you sure you want to load a new track? - - - - There is no input device selected for this vinyl control. -Please select an input device in the sound hardware preferences first. - There is no input device selected for this vinyl control. -Please select an input device in the sound hardware preferences first. - - - - There is no input device selected for this passthrough control. -Please select an input device in the sound hardware preferences first. - There is no input device selected for this passthrough control. -Please select an input device in the sound hardware preferences first. - - - - There is no input device selected for this microphone. -Do you want to select an input device? - There is no input device selected for this microphone. -Do you want to select an input device? - - - - There is no input device selected for this auxiliary. -Do you want to select an input device? - There is no input device selected for this auxiliary. -Do you want to select an input device? - - - - Error in skin file - Error in skin file - - - - The selected skin cannot be loaded. - The selected skin cannot be loaded. - - - - OpenGL Direct Rendering - OpenGL Direct Rendering - - - - Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - - - - Confirm Exit - Confirm Exit - - - - A deck is currently playing. Exit Mixxx? - A deck is currently playing. Exit Mixxx? - - - - A sampler is currently playing. Exit Mixxx? - A sampler is currently playing. Exit Mixxx? - - - - The preferences window is still open. - The preferences window is still open. - - - - Discard any changes and exit Mixxx? - Discard any changes and exit Mixxx? - - - - MockNetworkReply - - - Operation canceled - Opération annulée - - - - PlaylistFeature - - - Lock - Verrouiller - - - - - Playlists - Playlists - - - - Unlock - Unlock - - - - Playlists are ordered lists of tracks that allow you to plan your DJ sets. - Playlists are ordered lists of tracks that allow you to plan your DJ sets. - - - - It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - - - - Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - - - - When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - - - - Create New Playlist - Créer une nouvelle playlist - - - - QMessageBox - - - Upgrading Mixxx - Upgrading Mixxx - - - - Mixxx now supports displaying cover art. -Do you want to scan your library for cover files now? - Mixxx now supports displaying cover art. -Do you want to scan your library for cover files now? - - - - Scan - Scan - - - - Later - Later - - - - Upgrading Mixxx from v1.9.x/1.10.x. - Upgrading Mixxx from v1.9.x/1.10.x. - - - - Mixxx has a new and improved beat detector. - Mixxx has a new and improved beat detector. - - - - When you load tracks, Mixxx can re-analyze them and generate new, more accurate beatgrids. This will make automatic beatsync and looping more reliable. - When you load tracks, Mixxx can re-analyze them and generate new, more accurate beatgrids. This will make automatic beatsync and looping more reliable. - - - - This does not affect saved cues, hotcues, playlists, or crates. - This does not affect saved cues, hotcues, playlists, or crates. - - - - If you do not want Mixxx to re-analyze your tracks, choose "Keep Current Beatgrids". You can change this setting at any time from the "Beat Detection" section of the Preferences. - If you do not want Mixxx to re-analyze your tracks, choose "Keep Current Beatgrids". You can change this setting at any time from the "Beat Detection" section of the Preferences. - - - - Keep Current Beatgrids - Keep Current Beatgrids - - - - Generate New Beatgrids - Generate New Beatgrids - - - - QObject - - - Invalid - Invalid - - - - Note On - Note On - - - - Note Off - Note Off - - - - CC - CC - - - - Pitch Bend - Pitch Bend - - - - - Unknown (0x%1) - Unknown (0x%1) - - - - Normal - Normal - - - - Invert - Invert - - - - Rot64 - Rot64 - - - - Rot64Inv - Rot64Inv - - - - Rot64Fast - Rot64Fast - - - - Diff - Diff - - - - Button - Button - - - - Switch - Switch - - - - Spread64 - Spread64 - - - - HercJog - HercJog - - - - SelectKnob - SelectKnob - - - - SoftTakeover - SoftTakeover - - - - Script - Script - - - - 14-bit (LSB) - 14-bit (LSB) - - - - 14-bit (MSB) - 14-bit (MSB) - - - - Main - Main - - - - Booth - Booth - - - - Headphones - Headphones - - - - Left Bus - Left Bus - - - - Center Bus - Center Bus - - - - Right Bus - Right Bus - - - - Invalid Bus - Invalid Bus - - - - Deck - Deck - - - - Record/Broadcast - Record/Broadcast - - - - Vinyl Control - Vinyl Control - - - - Microphone - Microphone - - - - Auxiliary - Auxiliary - - - - - Unknown path type %1 - Unknown path type %1 - - - - Using Opus at samplerates other than 48 kHz is not supported by the Opus encoder. Please use 48000 Hz in "Sound Hardware" preferences or switch to a different encoding. - Using Opus at samplerates other than 48 kHz is not supported by the Opus encoder. Please use 48000 Hz in "Sound Hardware" preferences or switch to a different encoding. - - - - Encoder - Encoder - - - - Mixxx Needs Access to: %1 - Mixxx Needs Access to: %1 - - - - Your permission is required to access the following location: - -%1 - -After clicking OK, you will see a file picker. Please select '%2' to proceed or click Cancel if you don't want to grant Mixxx access and abort this action. - Your permission is required to access the following location: - -%1 - -After clicking OK, you will see a file picker. Please select '%2' to proceed or click Cancel if you don't want to grant Mixxx access and abort this action. - - - - You selected the wrong file. To grant Mixxx access, please select the file '%1'. If you do not want to continue, press Cancel. - You selected the wrong file. To grant Mixxx access, please select the file '%1'. If you do not want to continue, press Cancel. - - - - Upgrading old Mixxx settings - Upgrading old Mixxx settings - - - - Due to macOS sandboxing, Mixxx needs your permission to access your music library and settings from Mixxx versions before 2.3.0. After clicking OK, you will see a file selection dialog. - -To allow Mixxx to use your old library and settings, click the Open button in the file selection dialog. Mixxx will then move your old settings into the sandbox. This only needs to be done once. - -If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx will create a new music library and use default settings. - Due to macOS sandboxing, Mixxx needs your permission to access your music library and settings from Mixxx versions before 2.3.0. After clicking OK, you will see a file selection dialog. - -To allow Mixxx to use your old library and settings, click the Open button in the file selection dialog. Mixxx will then move your old settings into the sandbox. This only needs to be done once. - -If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx will create a new music library and use default settings. - - - - - Bit Depth - Bit Depth - - - - - Bitcrusher - Bitcrusher - - - - Adds noise by the reducing the bit depth and sample rate - Adds noise by the reducing the bit depth and sample rate - - - - The bit depth of the samples - The bit depth of the samples - - - - Downsampling - Downsampling - - - - Down - Down - - - - The sample rate to which the signal is downsampled - The sample rate to which the signal is downsampled - - - - - Echo - Echo - - - - - - - Time - Time - - - - - Ping Pong - Ping Pong - - - - - - - Send - Send - - - - How much of the signal to send into the delay buffer - How much of the signal to send into the delay buffer - - - - - - - Feedback - Feedback - - - - Stores the input signal in a temporary buffer and outputs it after a short time - Stores the input signal in a temporary buffer and outputs it after a short time - - - - - Delay time -1/8 - 2 beats if tempo is detected -1/8 - 2 seconds if no tempo is detected - Delay time -1/8 - 2 beats if tempo is detected -1/8 - 2 seconds if no tempo is detected - - - - Amount the echo fades each time it loops - Amount the echo fades each time it loops - - - - How much the echoed sound bounces between the left and right sides of the stereo field - How much the echoed sound bounces between the left and right sides of the stereo field - - - - - - - - - Quantize - Quantize - - - - Round the Time parameter to the nearest 1/4 beat. - Round the Time parameter to the nearest 1/4 beat. - - - - - - - - - - - - Triplets - Triplets - - - - When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - - - - - Filter - Filter - - - - Allows only high or low frequencies to play. - Allows only high or low frequencies to play. - - - - Low Pass Filter Cutoff - Low Pass Filter Cutoff - - - - - LPF - LPF - - - - - Corner frequency ratio of the low pass filter - Corner frequency ratio of the low pass filter - - - - Q - Q - - - - Resonance of the filters -Default: flat top - Resonance of the filters -Default: flat top - - - - High Pass Filter Cutoff - High Pass Filter Cutoff - - - - - HPF - HPF - - - - - Corner frequency ratio of the high pass filter - Corner frequency ratio of the high pass filter - - - - - - - Depth - Depth - - - - - Flanger - Flanger - - - - - Speed - Speed - - - - - Manual - Manuel - - - - Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - - - - Speed of the LFO (low frequency oscillator) -32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected -1/32 - 4 Hz if no tempo is detected - Speed of the LFO (low frequency oscillator) -32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected -1/32 - 4 Hz if no tempo is detected - - - - Delay amplitude of the LFO (low frequency oscillator) - Delay amplitude of the LFO (low frequency oscillator) - - - - Delay offset of the LFO (low frequency oscillator). -With width at zero, this allows for manually sweeping over the entire delay range. - Delay offset of the LFO (low frequency oscillator). -With width at zero, this allows for manually sweeping over the entire delay range. - - - - Regeneration - Regeneration - - - - Regen - Regen - - - - How much of the delay output is feed back into the input - How much of the delay output is feed back into the input - - - - - Intensity of the effect - Intensity of the effect - - - - - Divide rounded 1/2 beats of the Period parameter by 3. - Divide rounded 1/2 beats of the Period parameter by 3. - - - - - Mix - Mix - - - - - - - - - Width - Width - - - - Metronome - Metronome - - - - Adds a metronome click sound to the stream - Adds a metronome click sound to the stream - - - - BPM - BPM - - - - Set the beats per minute value of the click sound - Set the beats per minute value of the click sound - - - - Sync - Sync - - - - Synchronizes the BPM with the track if it can be retrieved - Synchronizes the BPM with the track if it can be retrieved - - - - - - - Period - Period - - - - - Autopan - Autopan - - - - Bounce the sound left and right across the stereo field - Bounce the sound left and right across the stereo field - - - - How fast the sound goes from one side to another -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - How fast the sound goes from one side to another -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - - - - Smoothing - Smoothing - - - - Smooth - Smooth - - - - How smoothly the signal goes from one side to the other - How smoothly the signal goes from one side to the other - - - - How far the signal goes to each side - How far the signal goes to each side - - - - Reverb - Réverbération - - - - Emulates the sound of the signal bouncing off the walls of a room - Emulates the sound of the signal bouncing off the walls of a room - - - - - Decay - Decay - - - - Lower decay values cause reverberations to fade out more quickly. - Lower decay values cause reverberations to fade out more quickly. - - - - Bandwidth of the low pass filter at the input. -Higher values result in less attenuation of high frequencies. - Bandwidth of the low pass filter at the input. -Higher values result in less attenuation of high frequencies. - - - - How much of the signal to send in to the effect - How much of the signal to send in to the effect - - - - Bandwidth - Bandwidth - - - - BW - BW - - - - - Damping - Damping - - - - Higher damping values cause high frequencies to decay more quickly than low frequencies. - Higher damping values cause high frequencies to decay more quickly than low frequencies. - - - - - - Low - Low - - - - - - Gain for Low Filter - Gain for Low Filter - - - - Kill Low - Kill Low - - - - Kill the Low Filter - Kill the Low Filter - - - - Mid - Mid - - - - Bessel4 LV-Mix Isolator - Bessel4 LV-Mix Isolator - - - - Bessel4 ISO - Bessel4 ISO - - - - A Bessel 4th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -24 dB/octave). - A Bessel 4th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -24 dB/octave). - - - - Gain for Mid Filter - Gain for Mid Filter - - - - Kill Mid - Kill Mid - - - - Kill the Mid Filter - Kill the Mid Filter - - - - High - High - - - - - Gain for High Filter - Gain for High Filter - - - - Kill High - Kill High - - - - Kill the High Filter - Kill the High Filter - - - - To adjust frequency shelves, go to Preferences -> Mixer. - - - - - Graphic Equalizer - Graphic Equalizer - - - - Graphic EQ - Graphic EQ - - - - An 8-band graphic equalizer based on biquad filters - An 8-band graphic equalizer based on biquad filters - - - - Gain for Band Filter %1 - Gain for Band Filter %1 - - - - Moog Ladder 4 Filter - Moog Ladder 4 Filter - - - - Moog Filter - Moog Filter - - - - A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation - A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation - - - - Res - Res - - - - - Resonance - Resonance - - - - Resonance of the filters. 4 = self oscillating - Resonance of the filters. 4 = self oscillating - - - - Gain for Low Filter (neutral at 1.0) - Gain for Low Filter (neutral at 1.0) - - - - Network stream - Network stream - - - - - Phaser - Phaser - - - - - Stereo - Stereo - - - - - Stages - Stages - - - - Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - - - - Period of the LFO (low frequency oscillator) -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - Period of the LFO (low frequency oscillator) -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - - - - Controls how much of the output signal is looped - Controls how much of the output signal is looped - - - - - - - Range - Range - - - - Controls the frequency range across which the notches sweep. - Controls the frequency range across which the notches sweep. - - - - Number of stages - Number of stages - - - - Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - - - - %1 minutes - %1 minutes - - - - %1:%2 - %1:%2 - - - - Ctrl+t - Ctrl+t - - - - Ctrl+y - Ctrl+y - - - - Ctrl+u - Ctrl+u - - - - Ctrl+i - Ctrl+i - - - - Ctrl+o - Ctrl+o - - - - Ctrl+Shift+O - Ctrl+Shift+O - - - - Ctrl+, - Ctrl+, - - - - Ctrl+P - Ctrl+P - - - - Bessel8 LV-Mix Isolator - Bessel8 LV-Mix Isolator - - - - Bessel8 ISO - Bessel8 ISO - - - - A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave). - A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave). - - - - LinkwitzRiley8 Isolator - LinkwitzRiley8 Isolator - - - - LR8 ISO - LR8 ISO - - - - A Linkwitz-Riley 8th-order filter isolator (optimized crossover, constant phase shift, roll-off -48 dB/octave). - A Linkwitz-Riley 8th-order filter isolator (optimized crossover, constant phase shift, roll-off -48 dB/octave). - - - - Biquad Equalizer - Biquad Equalizer - - - - BQ EQ - BQ EQ - - - - A 3-band Equalizer with two biquad bell filters, a shelving high pass and kill switches. - A 3-band Equalizer with two biquad bell filters, a shelving high pass and kill switches. - - - - Device not found - Device not found - - - - Biquad Full Kill Equalizer - Biquad Full Kill Equalizer - - - - BQ EQ/ISO - BQ EQ/ISO - - - - A 3-band Equalizer that combines an Equalizer and an Isolator circuit to offer gentle slopes and full kill. - A 3-band Equalizer that combines an Equalizer and an Isolator circuit to offer gentle slopes and full kill. - - - - Loudness Contour - Loudness Contour - - - - - - Loudness - Loudness - - - - Amplifies low and high frequencies at low volumes to compensate for reduced sensitivity of the human ear. - Amplifies low and high frequencies at low volumes to compensate for reduced sensitivity of the human ear. - - - - Set the gain of the applied loudness contour - Set the gain of the applied loudness contour - - - - - Use Gain - Use Gain - - - - Follow Gain Knob - Follow Gain Knob - - - - This stream is online for testing purposes! - This stream is online for testing purposes! - - - - Live Mix - Live Mix - - - - - 16 bits - 16 bits - - - - - 24 bits - 24 bits - - - - - Bit depth - Bit depth - - - - - Bitrate Mode - Bitrate Mode - - - - 32 bits float - 32 bits float - - - - - - Balance - Balance - - - - Adjust the left/right balance and stereo width - Adjust the left/right balance and stereo width - - - - Adjust balance between left and right channels - Adjust balance between left and right channels - - - - - Mid/Side - Mid/Side - - - - Bypass Fr. - Bypass Fr. - - - - Bypass Frequency - Bypass Frequency - - - - Stereo Balance - Stereo Balance - - - - Adjust stereo width by changing balance between middle and side of the signal. -Fully left: mono -Fully right: only side ambiance -Center: does not change the original signal. - Adjust stereo width by changing balance between middle and side of the signal. -Fully left: mono -Fully right: only side ambiance -Center: does not change the original signal. - - - - Frequencies below this cutoff are not adjusted in the stereo field - Frequencies below this cutoff are not adjusted in the stereo field - - - - Parametric Equalizer - Parametric Equalizer - - - - Param EQ - Param EQ - - - - An gentle 2-band parametric equalizer based on biquad filters. -It is designed as a complement to the steep mixing equalizers. - An gentle 2-band parametric equalizer based on biquad filters. -It is designed as a complement to the steep mixing equalizers. - - - - - Gain 1 - Gain 1 - - - - Gain for Filter 1 - Gain for Filter 1 - - - - - Q 1 - Q 1 - - - - Controls the bandwidth of Filter 1. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - Controls the bandwidth of Filter 1. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - - - - - Center 1 - Center 1 - - - - Center frequency for Filter 1, from 100 Hz to 14 kHz - Center frequency for Filter 1, from 100 Hz to 14 kHz - - - - - Gain 2 - Gain 2 - - - - Gain for Filter 2 - Gain for Filter 2 - - - - - Q 2 - Q 2 - - - - Controls the bandwidth of Filter 2. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - Controls the bandwidth of Filter 2. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - - - - - Center 2 - Center 2 - - - - Center frequency for Filter 2, from 100 Hz to 14 kHz - Center frequency for Filter 2, from 100 Hz to 14 kHz - - - - - Tremolo - Tremolo - - - - Cycles the volume up and down - Cycles the volume up and down - - - - How much the effect changes the volume - How much the effect changes the volume - - - - - Rate - Rate - - - - Rate of the volume changes -4 beats - 1/8 beat if tempo is detected -1/4 Hz - 8 Hz if no tempo is detected - Rate of the volume changes -4 beats - 1/8 beat if tempo is detected -1/4 Hz - 8 Hz if no tempo is detected - - - - Width of the volume peak -10% - 90% of the effect period - Width of the volume peak -10% - 90% of the effect period - - - - Shape of the volume modulation wave -Fully left: Square wave -Fully right: Sine wave - Shape of the volume modulation wave -Fully left: Square wave -Fully right: Sine wave - - - - When the Quantize parameter is enabled, divide the effect period by 3. - When the Quantize parameter is enabled, divide the effect period by 3. - - - - - Waveform - Waveform - - - - - Phase - Phase - - - - Shifts the position of the volume peak within the period -Fully left: beginning of the effect period -Fully right: end of the effect period - Shifts the position of the volume peak within the period -Fully left: beginning of the effect period -Fully right: end of the effect period - - - - Round the Rate parameter to the nearest whole division of a beat. - Round the Rate parameter to the nearest whole division of a beat. - - - - Triplet - Triplet - - - - - Queen Mary University London - Queen Mary University London - - - - Queen Mary Tempo and Beat Tracker - Queen Mary Tempo and Beat Tracker - - - - Queen Mary Key Detector - Queen Mary Key Detector - - - - SoundTouch BPM Detector (Legacy) - SoundTouch BPM Detector (Legacy) - - - - Constrained VBR - Constrained VBR - - - - CBR - CBR - - - - Full VBR (bitrate ignored) - Full VBR (bitrate ignored) - - - - White Noise - White Noise - - - - Mix white noise with the input signal - Mix white noise with the input signal - - - - Dry/Wet - Dry/Wet - - - - Crossfade the noise with the dry signal - Crossfade the noise with the dry signal - - - - <html>Mixxx cannot record or stream in AAC or HE-AAC without the FDK-AAC encoder. In order to record or stream in AAC or AAC+, you need to download <b>libfdk-aac</b> and install it on your system. - <html>Mixxx cannot record or stream in AAC or HE-AAC without the FDK-AAC encoder. In order to record or stream in AAC or AAC+, you need to download <b>libfdk-aac</b> and install it on your system. - - - - The installed AAC encoding library does not support HE-AAC, only plain AAC. Configure a different encoding format in the preferences. - The installed AAC encoding library does not support HE-AAC, only plain AAC. Configure a different encoding format in the preferences. - - - - MP3 encoding is not supported. Lame could not be initialized - MP3 encoding is not supported. Lame could not be initialized - - - - OGG recording is not supported. OGG/Vorbis library could not be initialized. - OGG recording is not supported. OGG/Vorbis library could not be initialized. - - - - - encoder failure - encoder failure - - - - - Failed to apply the selected settings. - Failed to apply the selected settings. - - - - Deck %1 - Deck %1 - - - - Location - Emplacement - - - - - - Playlist Export Failed - Échec de l'exportation de liste de lecture - - - - - - - Could not create file - Impossible de créer le fichier - - - - Readable text Export Failed - Readable text Export Failed - - - - Playlist Export Has Special Characters - Playlist Export Has Special Characters - - - - Some file paths in the playlist have special characters. These file paths will be encoded as absolute path URLs. Please select the m3u8 format for better and lossless exporting. - Some file paths in the playlist have special characters. These file paths will be encoded as absolute path URLs. Please select the m3u8 format for better and lossless exporting. - - - - - Pitch Shift - Pitch Shift - - - - Raises or lowers the original pitch of a sound. - Raises or lowers the original pitch of a sound. - - - - - Pitch - Pitch - - - - The pitch shift applied to the sound. - The pitch shift applied to the sound. - - - - The range of the Pitch knob (0 - 2 octaves). - - - - - - - Semitones - - - - - Change the pitch in semitone steps instead of continuously. - - - - - - Formant - - - - - Preserve the resonant frequencies (formants) of the human vocal tract and other instruments. -Hint: compensates "chipmunk" or "growling" voices - - - - - - Distortion - - - - - Hard Clip - - - - - Hard - - - - - Switches between soft saturation and hard clipping. - - - - - Soft Clipping - - - - - Hard Clipping - - - - - - Drive - - - - - The amount of amplification applied to the audio signal. At higher levels the audio will be more distored. - - - - - Passthrough - Passerelle - - - - - Glitch - Interférence - - - - Periodically samples and repeats a small portion of audio to create a glitchy metallic sound. - Échantillonne périodiquement et répète une petite portion de l'audio pour créer un son métallique défectueux. - - - - Round the Time parameter to the nearest 1/8 beat. - - - - - When the Quantize parameter is enabled, divide rounded 1/8 beats of Time parameter by 3. - - - - - (empty) - - - - - QtHSVWaveformWidget - - - HSV - HSV - - - - QtRGBWaveformWidget - - - RGB - RGB - - - - QtSimpleWaveformWidget - - - Simple - Simple - - - - QtVSyncTestWidget - - - VSyncTest - VSyncTest - - - - QtWaveformWidget - - - Filtered - Filtered - - - - RGBWaveformWidget - - - RGB - RGB - - - - RecordingFeature - - - Recordings - Recordings - - - - RecordingManager - - - Low Disk Space Warning - Low Disk Space Warning - - - - There is less than 1 GiB of usable space in the recording folder - Il reste moins d'un gigaoctet d'espace disponible dans le dossier d'enregistrement - - - - Recording - Recording - - - - Could not create audio file for recording! - Could not create audio file for recording! - - - - Ensure there is enough free disk space and you have write permission for the Recordings folder. - Ensure there is enough free disk space and you have write permission for the Recordings folder. - - - - You can change the location of the Recordings folder in Preferences -> Recording. - You can change the location of the Recordings folder in Preferences -> Recording. - - - - RecordingsView - - - - Message shown to user when recording an audio file. %1 is the file path and %2 is the current size of the recording in megabytes (MB) - - - - - RekordboxFeature - - - - - Rekordbox - Rekordbox - - - - Playlists - Playlists - - - - Folders - Folders - - - - Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - - - - Hot cues - Hot cues - - - - Loops (only the first loop is currently usable in Mixxx) - Loops (only the first loop is currently usable in Mixxx) - - - - Check for attached Rekordbox USB / SD devices (refresh) - Check for attached Rekordbox USB / SD devices (refresh) - - - - Beatgrids - Beatgrids - - - - Memory cues - Memory cues - - - - (loading) Rekordbox - (loading) Rekordbox - - - - RhythmboxFeature - - - - Rhythmbox - Rhythmbox - - - - SamplerBank - - - Mixxx Sampler Banks (*.xml) - Banques d'échantillon Mixxx (*.xml) - - - - Save Sampler Bank - Save Sampler Bank - - - - Error Saving Sampler Bank - Error Saving Sampler Bank - - - - Could not write the sampler bank to '%1'. - Could not write the sampler bank to '%1'. - - - - Load Sampler Bank - Load Sampler Bank - - - - Error Reading Sampler Bank - Error Reading Sampler Bank - - - - Could not open the sampler bank file '%1'. - Could not open the sampler bank file '%1'. - - - - SeratoFeature - - - - - Serato - Serato - - - - Reads the following from the Serato Music directory and removable devices: - Reads the following from the Serato Music directory and removable devices: - - - - Tracks - Tracks - - - - Crates - Caisses - - - - Check for Serato databases (refresh) - Check for Serato databases (refresh) - - - - (loading) Serato - (loading) Serato - - - - SetlogFeature - - - Join with previous (below) - Join with previous (below) - - - - Mark all tracks played) - - - - - Finish current and start new - Finish current and start new - - - - Lock all child playlists - - - - - Unlock all child playlists - - - - - Delete all unlocked child playlists - - - - - History - History - - - - Unlock - Unlock - - - - Lock - Verrouiller - - - - - Confirm Deletion - Confirmer la suppression - - - - Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> - %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - - - - - Deleting %1 playlists from <b>%2</b>.<br><br> - %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - - - - - ShoutConnection - - - - Mixxx encountered a problem - Mixxx encountered a problem - - - - Could not allocate shout_t - Could not allocate shout_t - - - - Could not allocate shout_metadata_t - Could not allocate shout_metadata_t - - - - Error setting non-blocking mode: - Error setting non-blocking mode: - - - - Error setting tls mode: - Error setting tls mode: - - - - Error setting hostname! - Error setting hostname! - - - - Error setting port! - Error setting port! - - - - Error setting password! - Error setting password! - - - - Error setting mount! - Error setting mount! - - - - Error setting username! - Error setting username! - - - - Error setting stream name! - Error setting stream name! - - - - Error setting stream description! - Error setting stream description! - - - - Error setting stream genre! - Error setting stream genre! - - - - Error setting stream url! - Error setting stream url! - - - - Error setting stream IRC! - Error setting stream IRC! - - - - Error setting stream AIM! - Error setting stream AIM! - - - - Error setting stream ICQ! - Error setting stream ICQ! - - - - Error setting stream public! - Error setting stream public! - - - - Unknown stream encoding format! - Unknown stream encoding format! - - - - Use a libshout version with %1 enabled - Use a libshout version with %1 enabled - - - - Error setting stream encoding format! - Error setting stream encoding format! - - - - Broadcasting at 96 kHz with Ogg Vorbis is not currently supported. Please try a different sample rate or switch to a different encoding. - Broadcasting at 96 kHz with Ogg Vorbis is not currently supported. Please try a different sample rate or switch to a different encoding. - - - - See https://github.com/mixxxdj/mixxx/issues/5701 for more information. - - - - - Unsupported sample rate - Unsupported sample rate - - - - Error setting bitrate - Error setting bitrate - - - - Error: unknown server protocol! - Error: unknown server protocol! - - - - Error: Shoutcast only supports MP3 and AAC encoders - Error: Shoutcast only supports MP3 and AAC encoders - - - - Error setting protocol! - Error setting protocol! - - - - Network cache overflow - Network cache overflow - - - - Connection error - Connection error - - - - One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - - - - Connection message - Connection message - - - - <b>Message from Live Broadcasting connection '%1':</b><br> - <b>Message from Live Broadcasting connection '%1':</b><br> - - - - Lost connection to streaming server and %1 attempts to reconnect have failed. - Lost connection to streaming server and %1 attempts to reconnect have failed. - - - - Lost connection to streaming server. - Lost connection to streaming server. - - - - Please check your connection to the Internet. - Please check your connection to the Internet. - - - - Can't connect to streaming server - Can't connect to streaming server - - - - Please check your connection to the Internet and verify that your username and password are correct. - Please check your connection to the Internet and verify that your username and password are correct. - - - - SoftwareWaveformWidget - - - Filtered - Filtered - - - - SoundManager - - - - a device - a device - - - - An unknown error occurred - An unknown error occurred - - - - Two outputs cannot share channels on "%1" - Two outputs cannot share channels on "%1" - - - - Error opening "%1" - Error opening "%1" - - - - StatModel - - - Name - Nom - - - - Count - Count - - - - Type - Type - - - - Units - Units - - - - Sum - Sum - - - - Min - Min - - - - Max - Max - - - - Mean - Mean - - - - Variance - Variance - - - - Standard Deviation - Standard Deviation - - - - TagFetcher - - - Fingerprinting track - Fingerprinting track - - - - Identifying track through Acoustid - Identifying track through Acoustid - - - - Retrieving metadata from MusicBrainz - Retrieving metadata from MusicBrainz - - - - Tooltips - - - Reset to default value. - Reset to default value. - - - - Left-click - Left-click - - - - Right-click - Right-click - - - - Double-click - Double-click - - - - Scroll-wheel - Scroll-wheel - - - - Shift-key - Shift-key - - - - loop active - loop active - - - - loop inactive - loop inactive - - - - Effects within the chain must be enabled to hear them. - Effects within the chain must be enabled to hear them. - - - - Waveform Overview - Waveform Overview - - - - Use the mouse to scratch, spin-back or throw tracks. - Use the mouse to scratch, spin-back or throw tracks. - - - - Waveform Display - Waveform Display - - - - Shows the loaded track's waveform near the playback position. - Shows the loaded track's waveform near the playback position. - - - - Drag with mouse to make temporary pitch adjustments. - Drag with mouse to make temporary pitch adjustments. - - - - Scroll to change the waveform zoom level. - Scroll to change the waveform zoom level. - - - - Waveform Zoom Out - Waveform Zoom Out - - - - Waveform Zoom In - Waveform Zoom In - - - - Waveform Zoom - Waveform Zoom - - - - - Spinning Vinyl - Spinning Vinyl - - - - Rotates during playback and shows the position of a track. - Rotates during playback and shows the position of a track. - - - - Right click to show cover art of loaded track. - Right click to show cover art of loaded track. - - - - Gain - Gain - - - - Adjusts the pre-fader gain of the track (to avoid clipping). - Adjusts the pre-fader gain of the track (to avoid clipping). - - - - (too loud for the hardware and is being distorted). - (too loud for the hardware and is being distorted). - - - - Indicates when the signal on the channel is clipping, - Indicates when the signal on the channel is clipping, - - - - Channel Volume Meter - Channel Volume Meter - - - - Shows the current channel volume. - Shows the current channel volume. - - - - Microphone Volume Meter - Microphone Volume Meter - - - - Shows the current microphone volume. - Shows the current microphone volume. - - - - Auxiliary Volume Meter - Auxiliary Volume Meter - - - - Shows the current auxiliary volume. - Shows the current auxiliary volume. - - - - Auxiliary Peak Indicator - Auxiliary Peak Indicator - - - - Indicates when the signal on the auxiliary is clipping, - Indicates when the signal on the auxiliary is clipping, - - - - Volume Control - Volume Control - - - - Adjusts the volume of the selected channel. - Adjusts the volume of the selected channel. - - - - Booth Gain - Booth Gain - - - - Adjusts the booth output gain. - Adjusts the booth output gain. - - - - Crossfader - Crossfader - - - - Balance - Balance - - - - Headphone Volume - Headphone Volume - - - - Adjusts the headphone output volume. - Adjusts the headphone output volume. - - - - Headphone Gain - Headphone Gain - - - - Adjusts the headphone output gain. - Adjusts the headphone output gain. - - - - Headphone Mix - Headphone Mix - - - - Headphone Split Cue - Headphone Split Cue - - - - Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - - - - Microphone - Microphone - - - - Show/hide the Microphone section. - Show/hide the Microphone section. - - - - Sampler - Sampler - - - - Show/hide the Sampler section. - Show/hide the Sampler section. - - - - Vinyl Control - Vinyl Control - - - - Show/hide the Vinyl Control section. - Show/hide the Vinyl Control section. - - - - Preview Deck - Platine de pré-écoute - - - - Show/hide the Preview deck. - Show/hide the Preview deck. - - - - - - Cover Art - Couverture - - - - Show/hide Cover Art. - Show/hide Cover Art. - - - - Toggle 4 Decks - Toggle 4 Decks - - - - Switches between showing 2 decks and 4 decks. - Switches between showing 2 decks and 4 decks. - - - - Show Library - Show Library - - - - Show or hide the track library. - Show or hide the track library. - - - - Show Effects - Show Effects - - - - Show or hide the effects. - Show or hide the effects. - - - - Toggle Mixer - Toggle Mixer - - - - Show or hide the mixer. - Show or hide the mixer. - - - - Show/hide volume meters for channels and main output. - - - - - Microphone Volume - Microphone Volume - - - - Adjusts the microphone volume. - Adjusts the microphone volume. - - - - Microphone Gain - Microphone Gain - - - - Adjusts the pre-fader microphone gain. - Adjusts the pre-fader microphone gain. - - - - Auxiliary Gain - Auxiliary Gain - - - - Adjusts the pre-fader auxiliary gain. - Adjusts the pre-fader auxiliary gain. - - - - Microphone Talk-Over - Microphone Talk-Over - - - - Hold-to-talk or short click for latching to - Hold-to-talk or short click for latching to - - - - Microphone Talkover Mode - Microphone Talkover Mode - - - - Off: Do not reduce music volume - Off: Do not reduce music volume - - - - Manual: Reduce music volume by a fixed amount set by the Strength knob. - Manual: Reduce music volume by a fixed amount set by the Strength knob. - - - - Behavior depends on Microphone Talkover Mode: - Behavior depends on Microphone Talkover Mode: - - - - Off: Does nothing - Off: Does nothing - - - - Change the step-size in the Preferences -> Decks menu. - - - - - Raise Pitch - Raise Pitch - - - - Sets the pitch higher. - Sets the pitch higher. - - - - Sets the pitch higher in small steps. - Sets the pitch higher in small steps. - - - - Lower Pitch - Lower Pitch - - - - Sets the pitch lower. - Sets the pitch lower. - - - - Sets the pitch lower in small steps. - Sets the pitch lower in small steps. - - - - Raise Pitch Temporary (Nudge) - Raise Pitch Temporary (Nudge) - - - - Holds the pitch higher while active. - Holds the pitch higher while active. - - - - Holds the pitch higher (small amount) while active. - Holds the pitch higher (small amount) while active. - - - - Lower Pitch Temporary (Nudge) - Lower Pitch Temporary (Nudge) - - - - Holds the pitch lower while active. - Holds the pitch lower while active. - - - - Holds the pitch lower (small amount) while active. - Holds the pitch lower (small amount) while active. - - - - Low EQ - Low EQ - - - - Adjusts the gain of the low EQ filter. - Adjusts the gain of the low EQ filter. - - - - Mid EQ - Mid EQ - - - - Adjusts the gain of the mid EQ filter. - Adjusts the gain of the mid EQ filter. - - - - High EQ - High EQ - - - - Adjusts the gain of the high EQ filter. - Adjusts the gain of the high EQ filter. - - - - Hold-to-kill or short click for latching. - Hold-to-kill or short click for latching. - - - - High EQ Kill - High EQ Kill - - - - Holds the gain of the high EQ to zero while active. - Holds the gain of the high EQ to zero while active. - - - - Mid EQ Kill - Mid EQ Kill - - - - Holds the gain of the mid EQ to zero while active. - Holds the gain of the mid EQ to zero while active. - - - - Low EQ Kill - Low EQ Kill - - - - Holds the gain of the low EQ to zero while active. - Holds the gain of the low EQ to zero while active. - - - - Displays the tempo of the loaded track in BPM (beats per minute). - Displays the tempo of the loaded track in BPM (beats per minute). - - - - Tempo - Tempo - - - - Key - The musical key of a track - Clé - - - - BPM Tap - BPM Tap - - - - - When tapped repeatedly, adjusts the BPM to match the tapped BPM. - When tapped repeatedly, adjusts the BPM to match the tapped BPM. - - - - Adjust BPM Down - Adjust BPM Down - - - - When tapped, adjusts the average BPM down by a small amount. - When tapped, adjusts the average BPM down by a small amount. - - - - Adjust BPM Up - Adjust BPM Up - - - - When tapped, adjusts the average BPM up by a small amount. - When tapped, adjusts the average BPM up by a small amount. - - - - Adjust Beats Earlier - Adjust Beats Earlier - - - - When tapped, moves the beatgrid left by a small amount. - When tapped, moves the beatgrid left by a small amount. - - - - Adjust Beats Later - Adjust Beats Later - - - - When tapped, moves the beatgrid right by a small amount. - When tapped, moves the beatgrid right by a small amount. - - - - Tempo and BPM Tap - Tempo and BPM Tap - - - - Show/hide the spinning vinyl section. - Show/hide the spinning vinyl section. - - - - Keylock - Keylock - - - - Toggling keylock during playback may result in a momentary audio glitch. - Toggling keylock during playback may result in a momentary audio glitch. - - - - Toggle visibility of Loop Controls - Toggle visibility of Loop Controls - - - - Toggle visibility of Beatjump Controls - Toggle visibility of Beatjump Controls - - - - Toggle visibility of Rate Control - Toggle visibility of Rate Control - - - - Toggle visibility of Key Controls - Toggle visibility of Key Controls - - - - (while previewing) - (while previewing) - - - - Places a cue point at the current position on the waveform. - Places a cue point at the current position on the waveform. - - - - Stops track at cue point, OR go to cue point and play after release (CUP mode). - Stops track at cue point, OR go to cue point and play after release (CUP mode). - - - - Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - - - - Is latching the playing state. - Is latching the playing state. - - - - Seeks the track to the cue point and stops. - Seeks the track to the cue point and stops. - - - - Play - Play - - - - Plays track from the cue point. - Plays track from the cue point. - - - - Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - - - - (This skin should be updated to use Sync Lock!) - (This skin should be updated to use Sync Lock!) - - - - Enable Sync Lock - Enable Sync Lock - - - - Tap to sync the tempo to other playing tracks or the sync leader. - Tap to sync the tempo to other playing tracks or the sync leader. - - - - Enable Sync Leader - Enable Sync Leader - - - - When enabled, this device will serve as the sync leader for all other decks. - When enabled, this device will serve as the sync leader for all other decks. - - - - This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - - - - - Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - - - - Tempo Range Display - Tempo Range Display - - - - Displays the current range of the tempo slider. - Displays the current range of the tempo slider. - - - - Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - - - - - Delete selected hotcue. - Delete selected hotcue. - - - - Track Comment - - - - - Displays the comment tag of the loaded track. - - - - - Opens separate artwork viewer. - Opens separate artwork viewer. - - - - Effect Chain Preset Settings - Effect Chain Preset Settings - - - - Show the effect chain settings menu for this unit. - Show the effect chain settings menu for this unit. - - - - Select and configure a hardware device for this input - Select and configure a hardware device for this input - - - - Recording Duration - Recording Duration - - - - Big Spinny/Cover Art - Big Spinny/Cover Art - - - - Show a big version of the Spinny or track cover art if enabled. - Show a big version of the Spinny or track cover art if enabled. - - - - Main Output Peak Indicator - Main Output Peak Indicator - - - - Indicates when the signal on the main output is clipping, - Indicates when the signal on the main output is clipping, - - - - Main Output L Peak Indicator - Main Output L Peak Indicator - - - - Indicates when the left signal on the main output is clipping, - Indicates when the left signal on the main output is clipping, - - - - Main Output R Peak Indicator - Main Output R Peak Indicator - - - - Indicates when the right signal on the main output is clipping, - Indicates when the right signal on the main output is clipping, - - - - Main Channel L Volume Meter - Main Channel L Volume Meter - - - - Shows the current volume for the left channel of the main output. - Shows the current volume for the left channel of the main output. - - - - Shows the current volume for the right channel of the main output. - Shows the current volume for the right channel of the main output. - - - - - Main Output Gain - Main Output Gain - - - - - Adjusts the main output gain. - Adjusts the main output gain. - - - - Determines the main output by fading between the left and right channels. - Determines the main output by fading between the left and right channels. - - - - Adjusts the left/right channel balance on the main output. - Adjusts the left/right channel balance on the main output. - - - - Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - - - - If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - - - - Show/hide Cover Art of the selected track in the library. - Show/hide Cover Art of the selected track in the library. - - - - Show/hide the scrolling waveforms - Show/hide the scrolling waveforms - - - - Show/hide the beatgrid controls section - Show/hide the beatgrid controls section - - - - Hide all skin sections except the decks to have more screen space for the track library. - Hide all skin sections except the decks to have more screen space for the track library. - - - - Volume Meters - Volume Meters - - - - mix microphone input into the main output. - mix microphone input into the main output. - - - - Auto: Automatically reduce music volume when microphone volume rises above threshold. - Auto: Automatically reduce music volume when microphone volume rises above threshold. - - - - - Adjust the amount the music volume is reduced with the Strength knob. - Adjust the amount the music volume is reduced with the Strength knob. - - - - Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - - - - Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - - - - Shift cues earlier - Shift cues earlier - - - - - Shift cues imported from Serato or Rekordbox if they are slightly off time. - Shift cues imported from Serato or Rekordbox if they are slightly off time. - - - - Left click: shift 10 milliseconds earlier - Left click: shift 10 milliseconds earlier - - - - Right click: shift 1 millisecond earlier - Right click: shift 1 millisecond earlier - - - - Shift cues later - Shift cues later - - - - Left click: shift 10 milliseconds later - Left click: shift 10 milliseconds later - - - - Right click: shift 1 millisecond later - Right click: shift 1 millisecond later - - - - Mutes the selected channel's audio in the main output. - Mutes the selected channel's audio in the main output. - - - - Main mix enable - Main mix enable - - - - Hold or short click for latching to mix this input into the main output. - Hold or short click for latching to mix this input into the main output. - - - - Displays the duration of the running recording. - Displays the duration of the running recording. - - - - Auto DJ is active - Auto DJ is active - - - - Hot Cue - Track will seek to nearest previous hotcue point. - Hot Cue - Track will seek to nearest previous hotcue point. - - - - Sets the track Loop-In Marker to the current play position. - Sets the track Loop-In Marker to the current play position. - - - - Press and hold to move Loop-In Marker. - Press and hold to move Loop-In Marker. - - - - Jump to Loop-In Marker. - Jump to Loop-In Marker. - - - - Sets the track Loop-Out Marker to the current play position. - Sets the track Loop-Out Marker to the current play position. - - - - Press and hold to move Loop-Out Marker. - Press and hold to move Loop-Out Marker. - - - - Jump to Loop-Out Marker. - Jump to Loop-Out Marker. - - - - Beatloop Size - Beatloop Size - - - - Select the size of the loop in beats to set with the Beatloop button. - Select the size of the loop in beats to set with the Beatloop button. - - - - Changing this resizes the loop if the loop already matches this size. - Changing this resizes the loop if the loop already matches this size. - - - - Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - - - - Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - - - - Start a loop over the set number of beats. - Start a loop over the set number of beats. - - - - Temporarily enable a rolling loop over the set number of beats. - Temporarily enable a rolling loop over the set number of beats. - - - - Beatjump/Loop Move Size - Beatjump/Loop Move Size - - - - Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - - - - Beatjump Forward - Beatjump Forward - - - - Jump forward by the set number of beats. - Jump forward by the set number of beats. - - - - Move the loop forward by the set number of beats. - Move the loop forward by the set number of beats. - - - - Jump forward by 1 beat. - Jump forward by 1 beat. - - - - Move the loop forward by 1 beat. - Move the loop forward by 1 beat. - - - - Beatjump Backward - Beatjump Backward - - - - Jump backward by the set number of beats. - Jump backward by the set number of beats. - - - - Move the loop backward by the set number of beats. - Move the loop backward by the set number of beats. - - - - Jump backward by 1 beat. - Jump backward by 1 beat. - - - - Move the loop backward by 1 beat. - Move the loop backward by 1 beat. - - - - Reloop - Reloop - - - - If the loop is ahead of the current position, looping will start when the loop is reached. - If the loop is ahead of the current position, looping will start when the loop is reached. - - - - Works only if Loop-In and Loop-Out Marker are set. - Works only if Loop-In and Loop-Out Marker are set. - - - - Enable loop, jump to Loop-In Marker, and stop playback. - Enable loop, jump to Loop-In Marker, and stop playback. - - - - Displays the elapsed and/or remaining time of the track loaded. - Displays the elapsed and/or remaining time of the track loaded. - - - - Click to toggle between time elapsed/remaining time/both. - Click to toggle between time elapsed/remaining time/both. - - - - Hint: Change the time format in Preferences -> Decks. - Hint: Change the time format in Preferences -> Decks. - - - - Show/hide intro & outro markers and associated buttons. - Show/hide intro & outro markers and associated buttons. - - - - Intro Start Marker - Intro Start Marker - - - - - - - If marker is set, jumps to the marker. - If marker is set, jumps to the marker. - - - - - - - If marker is not set, sets the marker to the current play position. - If marker is not set, sets the marker to the current play position. - - - - - - - If marker is set, clears the marker. - If marker is set, clears the marker. - - - - Intro End Marker - Intro End Marker - - - - Outro Start Marker - Outro Start Marker - - - - Outro End Marker - Outro End Marker - - - - Mix - Mix - - - - Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - - - - D/W mode: Crossfade between dry and wet - D/W mode: Crossfade between dry and wet - - - - D+W mode: Add wet to dry - D+W mode: Add wet to dry - - - - Mix Mode - Mix Mode - - - - Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - - - - Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet -Use this to change the sound of the track with EQ and filter effects. - Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet -Use this to change the sound of the track with EQ and filter effects. - - - - Dry+Wet mode (flat dry line): Mix knob adds wet to dry -Use this to change only the effected (wet) signal with EQ and filter effects. - Dry+Wet mode (flat dry line): Mix knob adds wet to dry -Use this to change only the effected (wet) signal with EQ and filter effects. - - - - Route the main mix through this effect unit. - Route the main mix through this effect unit. - - - - Route the left crossfader bus through this effect unit. - Route the left crossfader bus through this effect unit. - - - - Route the right crossfader bus through this effect unit. - Route the right crossfader bus through this effect unit. - - - - Right side active: parameter moves with right half of Meta Knob turn - Right side active: parameter moves with right half of Meta Knob turn - - - - Skin Settings Menu - Skin Settings Menu - - - - Show/hide skin settings menu - Show/hide skin settings menu - - - - Save Sampler Bank - Save Sampler Bank - - - - Save the collection of samples loaded in the samplers. - Save the collection of samples loaded in the samplers. - - - - Load Sampler Bank - Load Sampler Bank - - - - Load a previously saved collection of samples into the samplers. - Load a previously saved collection of samples into the samplers. - - - - Show Effect Parameters - Show Effect Parameters - - - - Enable Effect - Enable Effect - - - - Meta Knob Link - Meta Knob Link - - - - Set how this parameter is linked to the effect's Meta Knob. - Set how this parameter is linked to the effect's Meta Knob. - - - - Meta Knob Link Inversion - Meta Knob Link Inversion - - - - Inverts the direction this parameter moves when turning the effect's Meta Knob. - Inverts the direction this parameter moves when turning the effect's Meta Knob. - - - - Super Knob - Super Knob - - - - Next Chain - Next Chain - - - - Previous Chain - Previous Chain - - - - Next/Previous Chain - Next/Previous Chain - - - - Clear - Clear - - - - Clear the current effect. - Clear the current effect. - - - - Toggle - Toggle - - - - Toggle the current effect. - Toggle the current effect. - - - - Next - Next - - - - Clear Unit - Clear Unit - - - - Clear effect unit. - Clear effect unit. - - - - Show/hide parameters for effects in this unit. - Show/hide parameters for effects in this unit. - - - - Toggle Unit - Toggle Unit - - - - Enable or disable this whole effect unit. - Enable or disable this whole effect unit. - - - - Controls the Meta Knob of all effects in this unit together. - Controls the Meta Knob of all effects in this unit together. - - - - Load next effect chain preset into this effect unit. - Load next effect chain preset into this effect unit. - - - - Load previous effect chain preset into this effect unit. - Load previous effect chain preset into this effect unit. - - - - Load next or previous effect chain preset into this effect unit. - Load next or previous effect chain preset into this effect unit. - - - - - - - - - - - - Assign Effect Unit - Assign Effect Unit - - - - Assign this effect unit to the channel output. - Assign this effect unit to the channel output. - - - - Route the headphone channel through this effect unit. - Route the headphone channel through this effect unit. - - - - Route this deck through the indicated effect unit. - Route this deck through the indicated effect unit. - - - - Route this sampler through the indicated effect unit. - Route this sampler through the indicated effect unit. - - - - Route this microphone through the indicated effect unit. - Route this microphone through the indicated effect unit. - - - - Route this auxiliary input through the indicated effect unit. - Route this auxiliary input through the indicated effect unit. - - - - The effect unit must also be assigned to a deck or other sound source to hear the effect. - The effect unit must also be assigned to a deck or other sound source to hear the effect. - - - - Switch to the next effect. - Switch to the next effect. - - - - Previous - Previous - - - - Switch to the previous effect. - Switch to the previous effect. - - - - Next or Previous - Next or Previous - - - - Switch to either the next or previous effect. - Switch to either the next or previous effect. - - - - Meta Knob - Meta Knob - - - - Controls linked parameters of this effect - Controls linked parameters of this effect - - - - Effect Focus Button - Effect Focus Button - - - - Focuses this effect. - Focuses this effect. - - - - Unfocuses this effect. - Unfocuses this effect. - - - - Refer to the web page on the Mixxx wiki for your controller for more information. - Refer to the web page on the Mixxx wiki for your controller for more information. - - - - Effect Parameter - Effect Parameter - - - - Adjusts a parameter of the effect. - Adjusts a parameter of the effect. - - - - Inactive: parameter not linked - Inactive: parameter not linked - - - - Active: parameter moves with Meta Knob - Active: parameter moves with Meta Knob - - - - Left side active: parameter moves with left half of Meta Knob turn - Left side active: parameter moves with left half of Meta Knob turn - - - - Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - - - - Equalizer Parameter Kill - Equalizer Parameter Kill - - - - - Holds the gain of the EQ to zero while active. - Holds the gain of the EQ to zero while active. - - - - Quick Effect Super Knob - Quick Effect Super Knob - - - - Quick Effect Super Knob (control linked effect parameters). - Quick Effect Super Knob (control linked effect parameters). - - - - Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - - - - Equalizer Parameter - Equalizer Parameter - - - - Adjusts the gain of the EQ filter. - Adjusts the gain of the EQ filter. - - - - Hint: Change the default EQ mode in Preferences -> Equalizers. - Hint: Change the default EQ mode in Preferences -> Equalizers. - - - - - Adjust Beatgrid - Adjust Beatgrid - - - - Adjust beatgrid so the closest beat is aligned with the current play position. - Adjust beatgrid so the closest beat is aligned with the current play position. - - - - - Adjust beatgrid to match another playing deck. - Adjust beatgrid to match another playing deck. - - - - If quantize is enabled, snaps to the nearest beat. - If quantize is enabled, snaps to the nearest beat. - - - - Quantize - Quantize - - - - Toggles quantization. - Toggles quantization. - - - - Loops and cues snap to the nearest beat when quantization is enabled. - Loops and cues snap to the nearest beat when quantization is enabled. - - - - Reverse - Reverse - - - - Reverses track playback during regular playback. - Reverses track playback during regular playback. - - - - Puts a track into reverse while being held (Censor). - Puts a track into reverse while being held (Censor). - - - - Playback continues where the track would have been if it had not been temporarily reversed. - Playback continues where the track would have been if it had not been temporarily reversed. - - - - - - Play/Pause - Play/Pause - - - - Jumps to the beginning of the track. - Jumps to the beginning of the track. - - - - Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - - - - Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - - - - Sync and Reset Key - Sync and Reset Key - - - - Increases the pitch by one semitone. - Increases the pitch by one semitone. - - - - Decreases the pitch by one semitone. - Decreases the pitch by one semitone. - - - - Enable Vinyl Control - Enable Vinyl Control - - - - When disabled, the track is controlled by Mixxx playback controls. - When disabled, the track is controlled by Mixxx playback controls. - - - - When enabled, the track responds to external vinyl control. - When enabled, the track responds to external vinyl control. - - - - Enable Passthrough - Enable Passthrough - - - - Indicates that the audio buffer is too small to do all audio processing. - Indicates that the audio buffer is too small to do all audio processing. - - - - Displays cover artwork of the loaded track. - Displays cover artwork of the loaded track. - - - - Displays options for editing cover artwork. - Displays options for editing cover artwork. - - - - Star Rating - Star Rating - - - - Assign ratings to individual tracks by clicking the stars. - Assign ratings to individual tracks by clicking the stars. - - - - Channel Peak Indicator - Channel Peak Indicator - - - - Drag this item to other decks/samplers, to crates and playlist or to external file manager. - Drag this item to other decks/samplers, to crates and playlist or to external file manager. - - - - Shows information about the track currently loaded in this deck. - Shows information about the track currently loaded in this deck. - - - - Left click to jump around in the track. - Left click to jump around in the track. - - - - Right click hotcues to edit their labels and colors. - Right click hotcues to edit their labels and colors. - - - - Right click anywhere else to show the time at that point. - Right click anywhere else to show the time at that point. - - - - Channel L Peak Indicator - Channel L Peak Indicator - - - - Indicates when the left signal on the channel is clipping, - Indicates when the left signal on the channel is clipping, - - - - Channel R Peak Indicator - Channel R Peak Indicator - - - - Indicates when the right signal on the channel is clipping, - Indicates when the right signal on the channel is clipping, - - - - Channel L Volume Meter - Channel L Volume Meter - - - - Shows the current channel volume for the left channel. - Shows the current channel volume for the left channel. - - - - Channel R Volume Meter - Channel R Volume Meter - - - - Shows the current channel volume for the right channel. - Shows the current channel volume for the right channel. - - - - Microphone Peak Indicator - Microphone Peak Indicator - - - - Indicates when the signal on the microphone is clipping, - Indicates when the signal on the microphone is clipping, - - - - Sampler Volume Meter - Sampler Volume Meter - - - - Shows the current sampler volume. - Shows the current sampler volume. - - - - Sampler Peak Indicator - Sampler Peak Indicator - - - - Indicates when the signal on the sampler is clipping, - Indicates when the signal on the sampler is clipping, - - - - Preview Deck Volume Meter - Preview Deck Volume Meter - - - - Shows the current Preview Deck volume. - Shows the current Preview Deck volume. - - - - Preview Deck Peak Indicator - Preview Deck Peak Indicator - - - - Indicates when the signal on the Preview Deck is clipping, - Indicates when the signal on the Preview Deck is clipping, - - - - Maximize Library - Maximize Library - - - - Microphone Talkover Ducking Strength - Microphone Talkover Ducking Strength - - - - Prevents the pitch from changing when the rate changes. - Prevents the pitch from changing when the rate changes. - - - - Changes the number of hotcue buttons displayed in the deck - Changes the number of hotcue buttons displayed in the deck - - - - Starts playing from the beginning of the track. - Starts playing from the beginning of the track. - - - - Jumps to the beginning of the track and stops. - Jumps to the beginning of the track and stops. - - - - - Plays or pauses the track. - Plays or pauses the track. - - - - (while playing) - (while playing) - - - - Opens the track properties editor - Opens the track properties editor - - - - Opens the track context menu. - Opens the track context menu. - - - - Main Channel R Volume Meter - - - - - (while stopped) - (while stopped) - - - - Cue - Cue - - - - Headphone - Headphone - - - - Mute - Mute - - - - Old Synchronize - Old Synchronize - - - - Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - - - - If no deck is playing, syncs to the first deck that has a BPM. - If no deck is playing, syncs to the first deck that has a BPM. - - - - Decks can't sync to samplers and samplers can only sync to decks. - Decks can't sync to samplers and samplers can only sync to decks. - - - - Hold for at least a second to enable sync lock for this deck. - Hold for at least a second to enable sync lock for this deck. - - - - Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - - - - Resets the key to the original track key. - Resets the key to the original track key. - - - - Speed Control - Speed Control - - - - - - Changes the track pitch independent of the tempo. - Changes the track pitch independent of the tempo. - - - - Increases the pitch by 10 cents. - Increases the pitch by 10 cents. - - - - Decreases the pitch by 10 cents. - Decreases the pitch by 10 cents. - - - - Pitch Adjust - Pitch Adjust - - - - Adjust the pitch in addition to the speed slider pitch. - Adjust the pitch in addition to the speed slider pitch. - - - - Opens a menu to clear hotcues or edit their labels and colors. - Opens a menu to clear hotcues or edit their labels and colors. - - - - Record Mix - Record Mix - - - - Toggle mix recording. - Toggle mix recording. - - - - Enable Live Broadcasting - Enable Live Broadcasting - - - - Stream your mix over the Internet. - Stream your mix over the Internet. - - - - Provides visual feedback for Live Broadcasting status: - Provides visual feedback for Live Broadcasting status: - - - - disabled, connecting, connected, failure. - disabled, connecting, connected, failure. - - - - When enabled, the deck directly plays the audio arriving on the vinyl input. - When enabled, the deck directly plays the audio arriving on the vinyl input. - - - - Blue for passthrough enabled. - Blue for passthrough enabled. - - - - Playback will resume where the track would have been if it had not entered the loop. - Playback will resume where the track would have been if it had not entered the loop. - - - - Loop Exit - Loop Exit - - - - Turns the current loop off. - Turns the current loop off. - - - - Slip Mode - Slip Mode - - - - When active, the playback continues muted in the background during a loop, reverse, scratch etc. - When active, the playback continues muted in the background during a loop, reverse, scratch etc. - - - - Once disabled, the audible playback will resume where the track would have been. - Once disabled, the audible playback will resume where the track would have been. - - - - Track Key - The musical key of a track - Track Key - - - - Displays the musical key of the loaded track. - Displays the musical key of the loaded track. - - - - Clock - Clock - - - - Displays the current time. - Displays the current time. - - - - Audio Latency Usage Meter - Audio Latency Usage Meter - - - - Displays the fraction of latency used for audio processing. - Displays the fraction of latency used for audio processing. - - - - A high value indicates that audible glitches are likely. - A high value indicates that audible glitches are likely. - - - - Do not enable keylock, effects or additional decks in this situation. - Do not enable keylock, effects or additional decks in this situation. - - - - Audio Latency Overload Indicator - Audio Latency Overload Indicator - - - - If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). - If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). - - - - Drop tracks from library, external file manager, or other decks/samplers here. - Drop tracks from library, external file manager, or other decks/samplers here. - - - - Change the crossfader curve in Preferences -> Crossfader - Change the crossfader curve in Preferences -> Crossfader - - - - Crossfader Orientation - Crossfader Orientation - - - - Set the channel's crossfader orientation. - Set the channel's crossfader orientation. - - - - Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - - - - Activate Vinyl Control from the Menu -> Options. - Activate Vinyl Control from the Menu -> Options. - - - - Displays the current musical key of the loaded track after pitch shifting. - Displays the current musical key of the loaded track after pitch shifting. - - - - Fast Rewind - Fast Rewind - - - - Fast rewind through the track. - Fast rewind through the track. - - - - Fast Forward - Fast Forward - - - - Fast forward through the track. - Fast forward through the track. - - - - Jumps to the end of the track. - Jumps to the end of the track. - - - - Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - - - - Pitch Control - Pitch Control - - - - Pitch Rate - Pitch Rate - - - - Displays the current playback rate of the track. - Displays the current playback rate of the track. - - - - Repeat - Repeat - - - - When active the track will repeat if you go past the end or reverse before the start. - When active the track will repeat if you go past the end or reverse before the start. - - - - Eject - Eject - - - - Ejects track from the player. - Ejects track from the player. - - - - Hotcue - Hotcue - - - - If hotcue is set, jumps to the hotcue. - If hotcue is set, jumps to the hotcue. - - - - If hotcue is not set, sets the hotcue to the current play position. - If hotcue is not set, sets the hotcue to the current play position. - - - - Vinyl Control Mode - Vinyl Control Mode - - - - Absolute mode - track position equals needle position and speed. - Absolute mode - track position equals needle position and speed. - - - - Relative mode - track speed equals needle speed regardless of needle position. - Relative mode - track speed equals needle speed regardless of needle position. - - - - Constant mode - track speed equals last known-steady speed regardless of needle input. - Constant mode - track speed equals last known-steady speed regardless of needle input. - - - - Vinyl Status - Vinyl Status - - - - Provides visual feedback for vinyl control status: - Provides visual feedback for vinyl control status: - - - - Green for control enabled. - Green for control enabled. - - - - Blinking yellow for when the needle reaches the end of the record. - Blinking yellow for when the needle reaches the end of the record. - - - - Loop-In Marker - Loop-In Marker - - - - Loop-Out Marker - Loop-Out Marker - - - - Loop Halve - Loop Halve - - - - Halves the current loop's length by moving the end marker. - Halves the current loop's length by moving the end marker. - - - - Deck immediately loops if past the new endpoint. - Deck immediately loops if past the new endpoint. - - - - Loop Double - Loop Double - - - - Doubles the current loop's length by moving the end marker. - Doubles the current loop's length by moving the end marker. - - - - Beatloop - Beatloop - - - - Toggles the current loop on or off. - Toggles the current loop on or off. - - - - Works only if Loop-In and Loop-Out marker are set. - Works only if Loop-In and Loop-Out marker are set. - - - - Hint: Change the default cue mode in Preferences -> Interface. - Hint: Change the default cue mode in Preferences -> Interface. - - - - Vinyl Cueing Mode - Vinyl Cueing Mode - - - - Determines how cue points are treated in vinyl control Relative mode: - Determines how cue points are treated in vinyl control Relative mode: - - - - Off - Cue points ignored. - Off - Cue points ignored. - - - - One Cue - If needle is dropped after the cue point, track will seek to that cue point. - One Cue - If needle is dropped after the cue point, track will seek to that cue point. - - - - Track Time - Track Time - - - - Track Duration - Track Duration - - - - Displays the duration of the loaded track. - Displays the duration of the loaded track. - - - - Information is loaded from the track's metadata tags. - Information is loaded from the track's metadata tags. - - - - Track Artist - Track Artist - - - - Displays the artist of the loaded track. - Displays the artist of the loaded track. - - - - Track Title - Track Title - - - - Displays the title of the loaded track. - Displays the title of the loaded track. - - - - Track Album - Track Album - - - - Displays the album name of the loaded track. - Displays the album name of the loaded track. - - - - Track Artist/Title - Track Artist/Title - - - - Displays the artist and title of the loaded track. - Displays the artist and title of the loaded track. - - - - TrackCollection - - - Hiding tracks - Hiding tracks - - - - The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? - The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? - - - - TrackExportDlg - - - Export finished - Export finished - - - - Exporting %1 - Exporting %1 - - - - Overwrite Existing File? - Overwrite Existing File? - - - - "%1" already exists, overwrite? - "%1" already exists, overwrite? - - - - &Overwrite - &Overwrite - - - - Over&write All - Over&write All - - - - &Skip - &Skip - - - - Skip &All - Skip &All - - - - Export Error - Export Error - - - - TrackExportWizard - - - Export Track Files To - Export Track Files To - - - - TrackExportWorker - - - - Export process was canceled - Export process was canceled - - - - Error removing file %1: %2. Stopping. - Error removing file %1: %2. Stopping. - - - - Error exporting track %1 to %2: %3. Stopping. - Error exporting track %1 to %2: %3. Stopping. - - - - Error exporting tracks - Error exporting tracks - - - - TraktorFeature - - - - Traktor - Traktor - - - - (loading) Traktor - (loading) Traktor - - - - Error Loading Traktor Library - Error Loading Traktor Library - - - - There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. - There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. - - - - VSyncThread - - - Timer (Fallback) - Timer (Fallback) - - - - MESA vblank_mode = 1 - MESA vblank_mode = 1 - - - - Wait for Video sync - Wait for Video sync - - - - Sync Control - Sync Control - - - - Free + 1 ms (for benchmark only) - Free + 1 ms (for benchmark only) - - - - WBattery - - - Time until charged: %1 - Time until charged: %1 - - - - Time left: %1 - Time left: %1 - - - - Battery fully charged. - Battery fully charged. - - - - WColorPicker - - - No color - No color - - - - Custom color - Custom color - - - - WCoverArtMenu - - - Choose new cover - change cover art location - Choose new cover - - - - Clear cover - clears the set cover art -- does not touch files on disk - Clear cover - - - - Reload from file/folder - reload cover art from file metadata or folder - Reload from file/folder - - - - Image Files - Image Files - - - - Change Cover Art - Change Cover Art - - - - Cover Art File Already Exists - La Pochette d'Album Existe Déjà - - - - File: %1 -Folder: %2 -Override existing file? -This can not be undone! - Fichier : %1 -Dossier : %2 -Écraser le fichier existant ? -Cette opération est irréversible ! - - - - WCueMenuPopup - - - Cue number - Cue number - - - - Cue position - Cue position - - - - Edit cue label - Edit cue label - - - - Label... - Label... - - - - Delete this cue - Delete this cue - - - - Hotcue #%1 - Hotcue #%1 - - - - WEffectChainPresetButton - - - Update Preset - Update Preset - - - - Rename Preset - - - - - Save As New Preset... - Save As New Preset... - - - - Save snapshot - Save snapshot - - - - WEffectName - - - %1: %2 - %1 = effect name; %2 = effect description - %1: %2 - - - - No effect loaded. - Aucun effet chargé. - - - - WEffectParameterNameBase - - - No effect loaded. - Aucun effet chargé. - - - - WEffectSelector - - - No effect loaded. - No effect loaded. - - - - WFindOnWebMenu - - - Find on Web - Find on Web - - - - WMainMenuBar - - - &File - &File - - - - Load Track to Deck &%1 - Load Track to Deck &%1 - - - - Loads a track in deck %1 - Loads a track in deck %1 - - - - Open - Open - - - - &Exit - &Exit - - - - Quits Mixxx - Quits Mixxx - - - - Ctrl+q - Ctrl+q - - - - &Library - &Library - - - - &Rescan Library - &Rescan Library - - - - Rescans library folders for changes to tracks. - Rescans library folders for changes to tracks. - - - - Ctrl+Shift+L - Ctrl+Shift+L - - - - E&xport Library to Engine Prime - E&xport Library to Engine Prime - - - - Export the library to the Engine Prime format - Export the library to the Engine Prime format - - - - Create &New Playlist - Create &New Playlist - - - - Create a new playlist - Create a new playlist - - - - Ctrl+n - Ctrl+n - - - - Create New &Crate - Create New &Crate - - - - Create a new crate - Create a new crate - - - - Ctrl+Shift+N - Ctrl+Shift+N - - - - - &View - &View - - - - May not be supported on all skins. - May not be supported on all skins. - - - - Show Skin Settings Menu - Show Skin Settings Menu - - - - Show the Skin Settings Menu of the currently selected Skin - Show the Skin Settings Menu of the currently selected Skin - - - - Ctrl+1 - Menubar|View|Show Skin Settings - Ctrl+1 - - - - Show Microphone Section - Show Microphone Section - - - - Show the microphone section of the Mixxx interface. - Show the microphone section of the Mixxx interface. - - - - Ctrl+2 - Menubar|View|Show Microphone Section - Ctrl+2 - - - - Show Vinyl Control Section - Show Vinyl Control Section - - - - Show the vinyl control section of the Mixxx interface. - Show the vinyl control section of the Mixxx interface. - - - - Ctrl+3 - Menubar|View|Show Vinyl Control Section - Ctrl+3 - - - - Show Preview Deck - Show Preview Deck - - - - Show the preview deck in the Mixxx interface. - Show the preview deck in the Mixxx interface. - - - - Ctrl+4 - Menubar|View|Show Preview Deck - Ctrl+4 - - - - Show Cover Art - Show Cover Art - - - - Show cover art in the Mixxx interface. - Show cover art in the Mixxx interface. - - - - Ctrl+6 - Menubar|View|Show Cover Art - Ctrl+6 - - - - Maximize Library - Maximize Library - - - - Maximize the track library to take up all the available screen space. - Maximize the track library to take up all the available screen space. - - - - Space - Menubar|View|Maximize Library - Space - - - - &Full Screen - &Full Screen - - - - Display Mixxx using the full screen - Display Mixxx using the full screen - - - - &Options - &Options - - - - &Vinyl Control - &Vinyl Control - - - - Use timecoded vinyls on external turntables to control Mixxx - Use timecoded vinyls on external turntables to control Mixxx - - - - Enable Vinyl Control &%1 - Enable Vinyl Control &%1 - - - - &Record Mix - &Record Mix - - - - Record your mix to a file - Record your mix to a file - - - - Ctrl+R - Ctrl+R - - - - Enable Live &Broadcasting - Enable Live &Broadcasting - - - - Stream your mixes to a shoutcast or icecast server - Stream your mixes to a shoutcast or icecast server - - - - Ctrl+L - Ctrl+L - - - - Enable &Keyboard Shortcuts - Enable &Keyboard Shortcuts - - - - Toggles keyboard shortcuts on or off - Toggles keyboard shortcuts on or off - - - - Ctrl+` - Ctrl+` - - - - &Preferences - &Preferences - - - - Change Mixxx settings (e.g. playback, MIDI, controls) - Change Mixxx settings (e.g. playback, MIDI, controls) - - - - &Developer - &Developer - - - - &Reload Skin - &Reload Skin - - - - Reload the skin - Reload the skin - - - - Ctrl+Shift+R - Ctrl+Shift+R - - - - Developer &Tools - Developer &Tools - - - - Opens the developer tools dialog - Opens the developer tools dialog - - - - Ctrl+Shift+T - Ctrl+Shift+T - - - - Stats: &Experiment Bucket - Stats: &Experiment Bucket - - - - Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - - - - Ctrl+Shift+E - Ctrl+Shift+E - - - - Stats: &Base Bucket - Stats: &Base Bucket - - - - Enables base mode. Collects stats in the BASE tracking bucket. - Enables base mode. Collects stats in the BASE tracking bucket. - - - - Ctrl+Shift+B - Ctrl+Shift+B - - - - Deb&ugger Enabled - Deb&ugger Enabled - - - - Enables the debugger during skin parsing - Enables the debugger during skin parsing - - - - Ctrl+Shift+D - Ctrl+Shift+D - - - - &Help - &Help - - - - Show Keywheel - menu title - Show Keywheel - - - - Show keywheel - tooltip text - Show keywheel - - - - F12 - Menubar|View|Show Keywheel - F12 - - - - &Community Support - &Community Support - - - - Get help with Mixxx - Get help with Mixxx - - - - &User Manual - &User Manual - - - - Read the Mixxx user manual. - Read the Mixxx user manual. - - - - &Keyboard Shortcuts - &Keyboard Shortcuts - - - - Speed up your workflow with keyboard shortcuts. - Speed up your workflow with keyboard shortcuts. - - - - &Settings directory - - - - - Open the Mixxx user settings directory. - - - - - &Translate This Application - &Translate This Application - - - - Help translate this application into your language. - Help translate this application into your language. - - - - &About - &About - - - - About the application - About the application - - - - WOverview - - - Passthrough - Passthrough - - - - Ready to play, analyzing... - Text on waveform overview when file is playable but no waveform is visible - Ready to play, analyzing... - - - - - Loading track... - Text on waveform overview when file is cached from source - Loading track... - - - - Finalizing... - Text on waveform overview during finalizing of waveform analysis - Finalizing... - - - - WSearchLineEdit - - - Clear input - Clear the search bar input field - Clear input - - - - Ctrl+F - Search|Focus - Ctrl+F - - - - Search - noun - Search - - - - Clear input - Clear input - - - - Search... - Shown in the library search bar when it is empty. - Search... - - - - Clear the search bar input field - Clear the search bar input field - - - - Enter a string to search for - Enter a string to search for - - - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Use operators like bpm:115-128, artist:BooFar, -year:1990 - - - - For more information see User Manual > Mixxx Library - For more information see User Manual > Mixxx Library - - - - Shortcut - Shortcut - - - - Ctrl+F - Ctrl+F - - - - Focus - Give search bar input focus - Focus - - - - - Ctrl+Backspace - Ctrl+Backspace - - - - Shortcuts - Shortcuts - - - - Return - Retour arrière - - - - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - - - - Ctrl+Space - Ctrl+Space - - - - Toggle search history - Shows/hides the search history entries - Toggle search history - - - - Delete or Backspace - Delete or Backspace - - - - Delete query from history - Delete query from history - - - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Exit search - - - - WSearchRelatedTracksMenu - - - Search related Tracks - Search related Tracks - - - - Key - Clé - - - - harmonic with %1 - harmonic with %1 - - - - BPM - BPM - - - - between %1 and %2 - between %1 and %2 - - - - Artist - Artiste - - - - Album Artist - Artiste de l'album - - - - Composer - Compositeur - - - - Title - Titre - - - - Album - Album - - - - Grouping - Regroupement - - - - Year - Année - - - - Genre - Genre - - - - Directory - Directory - - - - WTrackMenu - - - Load to - Load to - - - - Deck - Deck - - - - Sampler - Sampler - - - - Add to Playlist - Add to Playlist - - - - Crates - Caisses - - - - Metadata - Metadata - - - - Update external collections - Update external collections - - - - Cover Art - Couverture - - - - Adjust BPM - Adjust BPM - - - - Select Color - Select Color - - - - Reset - Reset metadata in right click track context menu in library - Reset - - - - - Analyze - Analyse - - - - - Delete Track Files - Delete Track Files - - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Preview Deck - Platine de pré-écoute - - - - Remove - Supprimer - - - - Remove from Playlist - Remove from Playlist - - - - Remove from Crate - Remove from Crate - - - - Hide from Library - Hide from Library - - - - Unhide from Library - Unhide from Library - - - - Purge from Library - Purge from Library - - - - Move Track File(s) to Trash - - - - - Delete Files from Disk - Delete Files from Disk - - - - Properties - Properties - - - - Open in File Browser - Open in File Browser - - - - Select in Library - Select in Library - - - - Import From File Tags - Import From File Tags - - - - Import From MusicBrainz - Import From MusicBrainz - - - - Export To File Tags - Export To File Tags - - - - BPM and Beatgrid - BPM and Beatgrid - - - - Play Count - Play Count - - - - Rating - Note - - - - Cue Point - Cue Point - - - - Hotcues - Points de repère - - - - Intro - Intro - - - - Outro - Outro - - - - Key - Clé - - - - ReplayGain - ReplayGain - - - - Waveform - Waveform - - - - Comment - Commentaire - - - - All - All - - - - Lock BPM - Lock BPM - - - - Unlock BPM - Unlock BPM - - - - Double BPM - Double BPM - - - - Halve BPM - Halve BPM - - - - 2/3 BPM - 2/3 BPM - - - - 3/4 BPM - 3/4 BPM - - - - 4/3 BPM - 4/3 BPM - - - - 3/2 BPM - 3/2 BPM - - - - Reset BPM - Reset BPM - - - - Reanalyze - Reanalyze - - - - Reanalyze (constant BPM) - Réanalyser (BPM constant) - - - - Reanalyze (variable BPM) - Réanalyser (BPM variable) - - - - Update ReplayGain from Deck Gain - Update ReplayGain from Deck Gain - - - - Deck %1 - Deck %1 - - - - Sampler %1 - Sampler %1 - - - - Importing metadata of %n track(s) from file tags - - - - - Marking metadata of %n track(s) to be exported into file tags - - - - - - Create New Playlist - Créer une nouvelle playlist - - - - Enter name for new playlist: - Entrez un nom pour la nouvelle playlist - - - - New Playlist - Nouvelle playlist - - - - - - Playlist Creation Failed - La création de la liste de lecture a échoué - - - - A playlist by that name already exists. - Une playlist utilise déjà ce nom - - - - A playlist cannot have a blank name. - Une liste de lecture ne peut pas être sans nom. - - - - An unknown error occurred while creating playlist: - Une erreur inconnue s'est produite à la création de la liste de lecture : - - - - Add to New Crate - Add to New Crate - - - - Scaling BPM of %n track(s) - - - - - Locking BPM of %n track(s) - - - - - Unlocking BPM of %n track(s) - - - - - Setting color of %n track(s) - - - - - Resetting play count of %n track(s) - - - - - Resetting beats of %n track(s) - - - - - Clearing rating of %n track(s) - - - - - Clearing comment of %n track(s) - - - - - Removing main cue from %n track(s) - - - - - Removing outro cue from %n track(s) - - - - - Removing intro cue from %n track(s) - - - - - Removing loop cues from %n track(s) - - - - - Removing hot cues from %n track(s) - - - - - Resetting keys of %n track(s) - - - - - Resetting replay gain of %n track(s) - - - - - Resetting waveform of %n track(s) - - - - - Resetting all performance metadata of %n track(s) - - - - - Permanently delete these files from disk? - Permanently delete these files from disk? - - - - - This can not be undone! - This can not be undone! - - - - Stop the deck and move this track file to the trash bin? - - - - - Stop the deck and permanently delete this track file from disk? - Stop the deck and permanently delete this track file from disk? - - - - Cancel - Annuler - - - - Delete Files - Delete Files - - - - Okay - - - - - Move Track File(s) to Trash? - - - - - Track Files Deleted - Track Files Deleted - - - - Track Files Moved To Trash - - - - - %1 track files were moved to trash and purged from the Mixxx database. - - - - - %1 track files were deleted from disk and purged from the Mixxx database. - %1 track files were deleted from disk and purged from the Mixxx database. - - - - Track File Deleted - Fichier de la piste supprimée - - - - Track file was deleted from disk and purged from the Mixxx database. - Track file was deleted from disk and purged from the Mixxx database. - - - - The following %1 file(s) could not be deleted from disk - The following %1 file(s) could not be deleted from disk - - - - This track file could not be deleted from disk - This track file could not be deleted from disk - - - - Remaining Track File(s) - Remaining Track File(s) - - - - Close - Fermer - - - - Loops - Boucles - - - - Removing %n track file(s) from disk... - - - - - Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - - - - - Track File Moved To Trash - - - - - Track file was moved to trash and purged from the Mixxx database. - - - - - The following %1 file(s) could not be moved to trash - - - - - This track file could not be moved to trash - - - - - Setting cover art of %n track(s) - - - - - Reloading cover art of %n track(s) - - - - - WTrackTableView - - - Confirm track hide - Confirm track hide - - - - Are you sure you want to hide the selected tracks? - Are you sure you want to hide the selected tracks? - - - - Are you sure you want to remove the selected tracks from AutoDJ queue? - Are you sure you want to remove the selected tracks from AutoDJ queue? - - - - Are you sure you want to remove the selected tracks from this crate? - Are you sure you want to remove the selected tracks from this crate? - - - - Are you sure you want to remove the selected tracks from this playlist? - Are you sure you want to remove the selected tracks from this playlist? - - - - Don't ask again during this session - - - - - Confirm track removal - Confirm track removal - - - - WTrackTableViewHeader - - - Show or hide columns. - Show or hide columns. - - - - WaveformWidgetFactory - - - legacy - - - - - allshader::FilteredWaveformWidget - - - Filtered - Filtered - - - - allshader::HSVWaveformWidget - - - HSV - HSV - - - - allshader::LRRGBWaveformWidget - - - RGB L/R - - - - - allshader::RGBWaveformWidget - - - RGB - RGB - - - - allshader::SimpleWaveformWidget - - - Simple - Simple - - - - mixxx::CoreServices - - - fonts - fonts - - - - database - database - - - - effects - effects - - - - audio interface - audio interface - - - - decks - decks - - - - library - library - - - - Choose music library directory - Choose music library directory - - - - controllers - controllers - - - - Cannot open database - Cannot open database - - - - Unable to establish a database connection. -Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. - -Click OK to exit. - Unable to establish a database connection. -Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. - -Click OK to exit. - - - - mixxx::DlgLibraryExport - - - Entire music library - Entire music library - - - - Selected crates - Selected crates - - - - Browse - Browse - - - - Export directory - Export directory - - - - Database version - Database version - - - - Export - Export - - - - Cancel - Cancel - - - - Export Library to Engine Prime - Export Library to Engine Prime - - - - Export Library To - Export Library To - - - - No Export Directory Chosen - No Export Directory Chosen - - - - No export directory was chosen. Please choose a directory in order to export the music library. - No export directory was chosen. Please choose a directory in order to export the music library. - - - - A database already exists in the chosen directory. Exported tracks will be added into this database. - A database already exists in the chosen directory. Exported tracks will be added into this database. - - - - A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - - - - mixxx::DlgTrackMetadataExport - - - Export Modified Track Metadata - Export Modified Track Metadata - - - - Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - - - - mixxx::LibraryExporter - - - Export Completed - Export Completed - - - - Exported %1 track(s) and %2 crate(s). - Exported %1 track(s) and %2 crate(s). - - - - Export Failed - Export Failed - - - - Export failed: %1 - Export failed: %1 - - - - Exporting to Engine Prime... - Exporting to Engine Prime... - - - - mixxx::TaskMonitor - - - Abort - Abort - - - - mixxx::hid::DeviceCategory - - - HID Interface %1: - HID Interface %1: - - - - Generic HID Pointer - Generic HID Pointer - - - - Generic HID Mouse - Generic HID Mouse - - - - Generic HID Joystick - Generic HID Joystick - - - - Generic HID Game Pad - Generic HID Game Pad - - - - Generic HID Keyboard - Generic HID Keyboard - - - - Generic HID Keypad - Generic HID Keypad - - - - Generic HID Multi-axis Controller - Generic HID Multi-axis Controller - - - - Unknown HID Desktop Device: - Unknown HID Desktop Device: - - - - Apple HID Infrared Control - Apple HID Infrared Control - - - - Unknown Apple HID Device: - Unknown Apple HID Device: - - - - Unknown HID Device: - Unknown HID Device: - - - - mixxx::network::WebTask - - - No network access - No network access - - - - The Network request has not been started - La demande de réseau n'a pas été lancée - - - - mixxx::qml::QmlVisibleEffectsModel - - - No effect loaded. - Aucun effet chargé. - - - \ No newline at end of file From 84191304175a8ed80d8efb0765143823fddda9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 31 Jul 2025 23:04:16 +0200 Subject: [PATCH 071/163] Identefy version as 2.7 alpha (not yet beta) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36d5fd482517..a68d4c5d3f54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -433,7 +433,7 @@ endif() project(mixxx VERSION 2.7.0 LANGUAGES C CXX) # Work around missing version suffixes support https://gitlab.kitware.com/cmake/cmake/-/issues/16716 -set(MIXXX_VERSION_PRERELEASE "beta") # set to "alpha" "beta" or "" +set(MIXXX_VERSION_PRERELEASE "alpha") # set to "alpha" "beta" or "" set(CMAKE_PROJECT_HOMEPAGE_URL "https://www.mixxx.org") set( From 3d542dcb1691501b34e90ad53d60b3aee12f88e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:13:46 +0100 Subject: [PATCH 072/163] xwax: Add custom u128 struct for the sake of portability Mark wishes to use a custom u128 type instead of C23 features like arbitrary-sized integers using _BitInt() for the sake of portability and performance. --- lib/xwax/types.h | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 lib/xwax/types.h diff --git a/lib/xwax/types.h b/lib/xwax/types.h new file mode 100644 index 000000000000..3fe87e1cd81b --- /dev/null +++ b/lib/xwax/types.h @@ -0,0 +1,148 @@ +#ifndef TYPES_H +#define TYPES_H + +#include +#include + +/* + * Define the u128 struct using two 64-bit unsigned integers, with high part first. + */ + +typedef struct { + uint64_t high; /* Most significant part */ + uint64_t low; /* Least significant part */ +} u128; + +/* + * Inline constructor for u128. + * Works in all compilers, including MSVC. + */ + +static inline u128 make_u128(uint64_t high, uint64_t low) +{ + u128 v; + + v.high = high; + v.low = low; + + return v; +} + +/* + * Macro to preserve U128() syntax, but call the portable constructor. + * + * Used to be only the macro before, but MSVC doesn't like C99 compound + * literals. + */ + +#define U128(high, low) make_u128((high), (low)) +#define U128_ZERO make_u128(0ULL, 0ULL) +#define U128_ONE make_u128(0ULL, 1ULL) + +static inline int u128_eq(u128 a, u128 b) +{ + return (a.high == b.high) && (a.low == b.low); +} + +/* + * Not-equal comparison. + */ + +static inline int u128_neq(u128 a, u128 b) +{ + return (a.high != b.high) || (a.low != b.low); +} + +/* + * Addition of two u128 values. + */ + +static inline u128 u128_add(u128 a, u128 b) +{ + uint64_t sum = a.low + b.low; + uint64_t carry = (sum < a.low) ? 1 : 0; + + return U128(a.high + b.high + carry, sum); +} + +/* + * Subtraction of two u128 values. + */ + +static inline u128 u128_sub(u128 a, u128 b) +{ + uint64_t diff = a.low - b.low; + uint64_t borrow = (a.low < b.low) ? 1 : 0; + + return U128(a.high - b.high - borrow, diff); +} + +/* + * Left shift by n bits. + */ + +static inline u128 u128_lshift(u128 a, uint32_t n) +{ + if (n >= 128) + return U128_ZERO; + else if (n >= 64) + return U128(a.low << (n - 64), 0ULL); + else + return U128((a.high << n) | (a.low >> (64 - n)), a.low << n); +} + +/* + * Right shift by n bits. + */ + +static inline u128 u128_rshift(u128 a, uint32_t n) +{ + if (n >= 128) + return U128_ZERO; + else if (n >= 64) + return U128(0ULL, a.high >> (n - 64)); + else + return U128(a.high >> n, (a.low >> n) | (a.high << (64 - n))); +} + +/* + * Bitwise AND of two u128 values. + */ + +static inline u128 u128_and(u128 a, u128 b) +{ + return U128(a.high & b.high, a.low & b.low); +} + +/* + * Bitwise OR of two u128 values. + */ + +static inline u128 u128_or(u128 a, u128 b) +{ + return U128(a.high | b.high, a.low | b.low); +} + +/* + * Logical NOT (negation) of a u128 value. + */ + +static inline u128 u128_not(u128 a) +{ + if (!a.low && !a.high) + return U128(0ULL, 1ULL); + else + return U128(0ULL, 0ULL); +} + +/* + * Print a u128 value in hexadecimal format (lowercase). + */ + +static inline void u128_print(u128 a) +{ + printf("%016llx%016llx\n", (unsigned long long)a.high, (unsigned long long)a.low); +} + +#endif /* end of include guard TYPES_H */ + From 72a711f009f5ab38a910bd850644511ef18b5605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:24:08 +0100 Subject: [PATCH 073/163] xwax: Consistently use bits_t and slot_no_t types in LUT --- lib/xwax/lut.c | 8 ++++---- lib/xwax/lut.h | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/xwax/lut.c b/lib/xwax/lut.c index d9d16585d240..f137a39f21ed 100644 --- a/lib/xwax/lut.c +++ b/lib/xwax/lut.c @@ -28,7 +28,7 @@ #define HASH_BITS 16 #define HASH(timecode) ((timecode) & ((1 << HASH_BITS) - 1)) -#define NO_SLOT ((unsigned)-1) +#define NO_SLOT ((slot_no_t)-1) /* Initialise an empty hash lookup table to store the given number @@ -74,7 +74,7 @@ void lut_clear(struct lut *lut) } -void lut_push(struct lut *lut, unsigned int timecode) +void lut_push(struct lut *lut, bits_t timecode) { unsigned int hash; slot_no_t slot_no; @@ -91,7 +91,7 @@ void lut_push(struct lut *lut, unsigned int timecode) } -unsigned int lut_lookup(struct lut *lut, unsigned int timecode) +slot_no_t lut_lookup(struct lut *lut, bits_t timecode) { unsigned int hash; slot_no_t slot_no; @@ -107,5 +107,5 @@ unsigned int lut_lookup(struct lut *lut, unsigned int timecode) slot_no = slot->next; } - return (unsigned)-1; + return (slot_no_t)-1; } diff --git a/lib/xwax/lut.h b/lib/xwax/lut.h index 9667705446ab..1cee138629f8 100644 --- a/lib/xwax/lut.h +++ b/lib/xwax/lut.h @@ -21,9 +21,10 @@ #define LUT_H typedef unsigned int slot_no_t; +typedef unsigned int bits_t; struct slot { - unsigned int timecode; + bits_t timecode; slot_no_t next; /* next slot with the same hash */ }; @@ -36,7 +37,7 @@ struct lut { int lut_init(struct lut *lut, int nslots); void lut_clear(struct lut *lut); -void lut_push(struct lut *lut, unsigned int timecode); -unsigned int lut_lookup(struct lut *lut, unsigned int timecode); +void lut_push(struct lut *lut, bits_t timecode); +unsigned int lut_lookup(struct lut *lut, bits_t timecode); #endif From 31c7174a7967d774d4db4bff38f22a14f324c9c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:21:48 +0100 Subject: [PATCH 074/163] xwax: Extend LUT with functions for the MK2 which can hold 110-bit LFSR states Since the Traktor MK2 timecode is comprised of an LFSR, which generator polynomial is of 110th order, a new type must be created to hold these values. This significantly increases the size of the LUT due to the type being used in struct slot. Therefore the functions for the MK2 are clearly separated to not make the current LUT gain in size by holding unnecessarily padded zeros. --- CMakeLists.txt | 3 +- lib/xwax/lut.h | 2 + lib/xwax/lut_mk2.c | 117 +++++++++++++++++++++++++++++++++++++++++++ lib/xwax/lut_mk2.h | 25 +++++++++ lib/xwax/timecoder.c | 12 +++-- lib/xwax/timecoder.h | 1 + 6 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 lib/xwax/lut_mk2.c create mode 100644 lib/xwax/lut_mk2.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a68d4c5d3f54..27c8fdea4a6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4890,7 +4890,8 @@ if(VINYLCONTROL) # Internal xwax library add_library(mixxx-xwax STATIC EXCLUDE_FROM_ALL) - target_sources(mixxx-xwax PRIVATE lib/xwax/timecoder.c lib/xwax/lut.c) + target_sources(mixxx-xwax PRIVATE lib/xwax/timecoder.c lib/xwax/lut.c + lib/xwax/lut_mk2.c) target_include_directories(mixxx-xwax SYSTEM PUBLIC lib/xwax) target_link_libraries(mixxx-lib PRIVATE mixxx-xwax) endif() diff --git a/lib/xwax/lut.h b/lib/xwax/lut.h index 1cee138629f8..da98f56b2754 100644 --- a/lib/xwax/lut.h +++ b/lib/xwax/lut.h @@ -20,6 +20,8 @@ #ifndef LUT_H #define LUT_H +#include "types.h" + typedef unsigned int slot_no_t; typedef unsigned int bits_t; diff --git a/lib/xwax/lut_mk2.c b/lib/xwax/lut_mk2.c new file mode 100644 index 000000000000..2b09a7b25979 --- /dev/null +++ b/lib/xwax/lut_mk2.c @@ -0,0 +1,117 @@ +#include +#include + +#include "lut_mk2.h" + +/* + * The number of bits to form the hash, which governs the overall size + * of the hash lookup table, and hence the amount of chaining + */ + +#define HASH_BITS 16 + +#define HASH(timecode) ((timecode) & ((1 << HASH_BITS) - 1)) +#define NO_SLOT ((slot_no_t)-1) + +/* + * Hash function that takes all 110-bits of the MK2s into account + */ + +unsigned short HASH110(mk2bits_t *value) { + + /* Simple hash mixing using bit shifts and XORs */ + unsigned short hash = (unsigned short)(value->low ^ (value->low >> 16) ^ (value->low >> 32) ^ + (value->low >> 48)); + hash ^= (unsigned short)(value->high ^ (value->high << 5) ^ (value->high >> 3)); + + /* Final scrambling to improve distribution */ + hash ^= (hash >> 7) ^ (hash << 9); + + return hash; +} + +/* + * Initialise an empty hash lookup table to store the given number * of timecode -> position + * lookups (Traktor MK2 version) + */ + +int lut_init_mk2(struct lut_mk2 *lut, int nslots) +{ + size_t bytes; + int n, hashes; + + hashes = 1 << HASH_BITS; + bytes = sizeof(struct slot_mk2) * nslots + sizeof(slot_no_t) * hashes; + + fprintf(stderr, "Lookup table has %d hashes to %d slots" + " (%d slots per hash, %zuKb)\n", + hashes, nslots, nslots / hashes, bytes / 1024); + + lut->slot = malloc(sizeof(struct slot_mk2) * nslots); + if (lut->slot == NULL) { + perror("malloc"); + return -1; + } + + lut->table = malloc(sizeof(slot_no_t) * hashes); + if (lut->table == NULL) { + perror("malloc"); + return -1; + } + + for (n = 0; n < hashes; n++) + lut->table[n] = NO_SLOT; + + lut->avail = 0; + + return 0; +} + +void lut_clear_mk2(struct lut_mk2 *lut) +{ + free(lut->table); + free(lut->slot); +} + +/* + * Traktor MK2 version holding 110-bit integers as timecode + */ + +void lut_push_mk2(struct lut_mk2 *lut, mk2bits_t *timecode) +{ + unsigned int hash; + slot_no_t slot_no; + struct slot_mk2 *slot; + + slot_no = lut->avail++; /* take the next available slot */ + + slot = &lut->slot[slot_no]; + slot->timecode = *timecode; + + hash = HASH110(timecode); + slot->next = lut->table[hash]; + lut->table[hash] = slot_no; +} + +/* + * Traktor MK2 version holding 110-bit integers as timecode + */ + +slot_no_t lut_lookup_mk2(struct lut_mk2 *lut, mk2bits_t *timecode) +{ + unsigned int hash; + slot_no_t slot_no; + struct slot_mk2 *slot; + + hash = HASH110(timecode); + slot_no = lut->table[hash]; + + while (slot_no != NO_SLOT) { + slot = &lut->slot[slot_no]; + if (u128_eq(slot->timecode, *timecode)) + return slot_no; + slot_no = slot->next; + } + + return (slot_no_t)-1; +} diff --git a/lib/xwax/lut_mk2.h b/lib/xwax/lut_mk2.h new file mode 100644 index 000000000000..8f0b4b16eec5 --- /dev/null +++ b/lib/xwax/lut_mk2.h @@ -0,0 +1,25 @@ +#ifndef LUT_MK2_H + +#define LUT_MK2_H + +#include "lut.h" + +typedef u128 mk2bits_t; + +struct slot_mk2 { + mk2bits_t timecode; + slot_no_t next; /* next slot with the same hash */ +}; + +struct lut_mk2 { + struct slot_mk2 *slot; + slot_no_t *table, /* hash -> slot lookup */ + avail; /* next available slot */ +}; + +int lut_init_mk2(struct lut_mk2 *lut, int nslots); +void lut_clear_mk2(struct lut_mk2 *lut); +void lut_push_mk2(struct lut_mk2 *lut, mk2bits_t *timecode); +slot_no_t lut_lookup_mk2(struct lut_mk2 *lut, mk2bits_t *timecode); + +#endif /* end of include guard LUT_MK2_H */ diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index 9a54e82e4150..93aea8f080d8 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -629,9 +629,15 @@ signed int timecoder_get_position(struct timecoder *tc, double *when) if (tc->valid_counter <= VALID_BITS) return -1; - r = lut_lookup(&tc->def->lut, tc->bitstream); - if (r == -1) - return -1; + if (tc->def->flags & TRAKTOR_MK2) { + r = lut_lookup_mk2(&tc->def->lut_mk2, &tc->mk2_bitstream); + if (r == -1) + return -1; + } else { + r = lut_lookup(&tc->def->lut, tc->bitstream); + if (r == -1) + return -1; + } if (r >= 0) { // normalize position to milliseconds, not timecode steps -- Owen diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index a2541dc86c71..63864f9d383d 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -23,6 +23,7 @@ #include #include "lut.h" +#include "lut_mk2.h" #include "pitch.h" #define TIMECODER_CHANNELS 2 From cb764b369658ea937cd4c57fba9fb4272da45a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:31:57 +0100 Subject: [PATCH 075/163] xwax: Add timecode definitions for Traktor MK2 Carefully worked out definitions for the Traktor MK2 timecodes. Due to the high frequency of the carrier wave, the number of slots is much higher. --- CMakeLists.txt | 4 +- lib/xwax/timecoder.c | 71 +++++++++++++++++++++-- lib/xwax/timecoder.h | 5 ++ lib/xwax/timecoder_mk2.c | 119 +++++++++++++++++++++++++++++++++++++++ lib/xwax/timecoder_mk2.h | 13 +++++ 5 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 lib/xwax/timecoder_mk2.c create mode 100644 lib/xwax/timecoder_mk2.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 27c8fdea4a6a..0a241d15410b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4890,8 +4890,8 @@ if(VINYLCONTROL) # Internal xwax library add_library(mixxx-xwax STATIC EXCLUDE_FROM_ALL) - target_sources(mixxx-xwax PRIVATE lib/xwax/timecoder.c lib/xwax/lut.c - lib/xwax/lut_mk2.c) + target_sources(mixxx-xwax PRIVATE lib/xwax/timecoder.c + lib/xwax/timecoder_mk2.c lib/xwax/lut.c lib/xwax/lut_mk2.c) target_include_directories(mixxx-xwax SYSTEM PUBLIC lib/xwax) target_link_libraries(mixxx-lib PRIVATE mixxx-xwax) endif() diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index 93aea8f080d8..9306f70cea56 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -28,6 +28,7 @@ #include "debug.h" #include "timecoder.h" +#include "timecoder_mk2.h" #define ZERO_THRESHOLD (128 << 16) @@ -51,6 +52,7 @@ #define SWITCH_PHASE 0x1 /* tone phase difference of 270 (not 90) degrees */ #define SWITCH_PRIMARY 0x2 /* use left channel (not right) as primary */ #define SWITCH_POLARITY 0x4 /* read bit values in negative (not positive) */ +#define TRAKTOR_MK2 0x8 /* use for Traktor MK2 timecode*/ static struct timecode_def timecodes[] = { { @@ -105,6 +107,57 @@ static struct timecode_def timecodes[] = { .length = 2110000, .safe = 907000, }, + { + .name = "traktor_mk2_a", + .desc = "Traktor Scratch MK2, side A", + .resolution = 2500, + .flags = TRAKTOR_MK2, + .bits = 110, + .seed_mk2 = { + .high = 0xc6007c63e, + .low = 0x3fc00c60f8c1f00 + }, + .taps_mk2 = { + .high = 0x400000000040, + .low = 0x0000010800000001 + }, + .length = 1820000, + .safe = 1800000, + }, + { + .name = "traktor_mk2_b", + .desc = "Traktor Scratch MK2, side B", + .resolution = 2500, + .flags = TRAKTOR_MK2, + .bits = 110, + .seed_mk2 = { + .high = 0x1ff9f00003, + .low = 0xe73ff00f9fe0c7c1 + }, + .taps_mk2 = { + .high = 0x400000000040, + .low = 0x0000010800000001 + }, + .length = 2570000, + .safe = 2550000, + }, + { + .name = "traktor_mk2_cd", + .desc = "Traktor Scratch MK2, CD", + .resolution = 3000, + .flags = TRAKTOR_MK2, + .bits = 110, + .seed_mk2 = { + .high = 0x7ce73, + .low = 0xe0e0fff1fc1cf8c1 + }, + .taps_mk2 = { + .high = 0x400000000000, + .low = 0x1000010800000001 + }, + .length = 4500000, + .safe = 4495000, + }, { .name = "mixvibes_v2", .desc = "MixVibes V2", @@ -257,8 +310,13 @@ struct timecode_def* timecoder_find_definition(const char *name) if (strcmp(def->name, name) != 0) continue; - if (build_lookup(def) == -1) - return NULL; /* error */ + if (def->flags & TRAKTOR_MK2) { + if (build_lookup_mk2(def) == -1) + return NULL; /* error */ + } else { + if (build_lookup(def) == -1) + return NULL; /* error */ + } return def; } @@ -276,8 +334,13 @@ void timecoder_free_lookup(void) { for (n = 0; n < ARRAY_SIZE(timecodes); n++) { struct timecode_def *def = &timecodes[n]; - if (def->lookup) - lut_clear(&def->lut); + if (def->flags & TRAKTOR_MK2) { + if (def->lookup) + lut_clear_mk2(&def->lut_mk2); + } else { + if (def->lookup) + lut_clear(&def->lut); + } } } diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index 63864f9d383d..c66cd75fdebb 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -41,10 +41,13 @@ struct timecode_def { flags; bits_t seed, /* LFSR value at timecode zero */ taps; /* central LFSR taps, excluding end taps */ + mk2bits_t seed_mk2, /* MK2 version */ + taps_mk2; /* MK2 version */ unsigned int length, /* in cycles */ safe; /* last 'safe' timecode number (for auto disconnect) */ bool lookup; /* true if lut has been generated */ struct lut lut; + struct lut_mk2 lut_mk2; /* MK2 version */ }; struct timecoder_channel { @@ -74,6 +77,8 @@ struct timecoder { signed int ref_level; bits_t bitstream, /* actual bits from the record */ timecode; /* corrected timecode */ + mk2bits_t mk2_bitstream, /* Traktor MK2 version */ + mk2_timecode; /* Traktor MK2 version */ unsigned int valid_counter, /* number of successful error checks */ timecode_ticker; /* samples since valid timecode was read */ diff --git a/lib/xwax/timecoder_mk2.c b/lib/xwax/timecoder_mk2.c new file mode 100644 index 000000000000..652c2a1b67e2 --- /dev/null +++ b/lib/xwax/timecoder_mk2.c @@ -0,0 +1,119 @@ +#include +#include +#include +#include + +#include "timecoder_mk2.h" + +#define REF_PEAKS_AVG 48 /* in wave cycles */ + +/* + * Compute the LFSR bit (Traktor MK2 version) + */ + +static inline mk2bits_t lfsr_mk2(mk2bits_t code, mk2bits_t taps) +{ + mk2bits_t taken; + mk2bits_t xrs; + + taken = u128_and(code, taps); + xrs = U128_ZERO; + + while (u128_neq(taken, U128_ZERO)) { + xrs = u128_add(xrs, u128_and(taken, U128_ONE)); + taken = u128_rshift(taken, 1); + } + + return u128_and(xrs, U128_ONE); +} + +/* + * Linear Feedback Shift Register in the forward direction. New values + * are generated at the least-significant bit. (Traktor MK2 version) + */ + +inline mk2bits_t fwd_mk2(mk2bits_t current, struct timecode_def *def) +{ + if (!def) { + errno = -EINVAL; + perror(__func__); + return U128_ZERO; + } + + mk2bits_t l; + + /* New bits are added at the MSB; shift right by one */ + l = lfsr_mk2(current, u128_or(def->taps_mk2, U128_ONE)); + return u128_or(u128_rshift(current, 1), u128_lshift(l, (def->bits - 1))); +} + +/* + * Linear Feedback Shift Register in the reverse direction + * (Traktor MK2 version) + */ + +inline mk2bits_t rev_mk2(mk2bits_t current, struct timecode_def *def) +{ + if (!def) { + errno = -EINVAL; + perror(__func__); + return U128_ZERO; + } + + mk2bits_t l, mask; + + /* New bits are added at the LSB; shift left one and mask */ + mask = u128_sub(u128_lshift(U128_ONE, def->bits), U128_ONE); + l = lfsr_mk2(current, + u128_or(u128_rshift(def->taps_mk2, 1), + u128_lshift(U128_ONE, (def->bits - 1)))); + + return u128_or(u128_and(u128_lshift(current, 1), mask), l); +} + +/* + * Where necessary, build the lookup table required for this timecode + * (Traktor MK2 version) + * + * Return: -1 if not enough memory could be allocated, otherwise 0 + */ + +int build_lookup_mk2(struct timecode_def *def) +{ + if (!def) { + errno = -EINVAL; + perror(__func__); + return -1; + } + + unsigned int n; + mk2bits_t current, next; + + if (def->lookup) + return 0; + + fprintf(stderr, "Building LUT for %d bit %dHz timecode (%s)\n", + def->bits, def->resolution, def->desc); + + if (lut_init_mk2(&def->lut_mk2, def->length) == -1) + return -1; + + current = def->seed_mk2; + + for (n = 0; n < def->length; n++) { + + /* timecode must not wrap */ + assert(lut_lookup_mk2(&def->lut_mk2, ¤t) == (unsigned)-1); + lut_push_mk2(&def->lut_mk2, ¤t); + + /* check symmetry of the lfsr functions */ + next = fwd_mk2(current, def); + assert(u128_eq(rev_mk2(next, def), current)); + + current = next; + } + + def->lookup = true; + + return 0; +} diff --git a/lib/xwax/timecoder_mk2.h b/lib/xwax/timecoder_mk2.h new file mode 100644 index 000000000000..f8ce65cc73f1 --- /dev/null +++ b/lib/xwax/timecoder_mk2.h @@ -0,0 +1,13 @@ +#ifndef TIMECODER_MK2_H + +#define TIMECODER_MK2_H + +#include "lut_mk2.h" +#include "timecoder.h" + +mk2bits_t fwd_mk2(mk2bits_t current, struct timecode_def *def); +mk2bits_t rev_mk2(mk2bits_t current, struct timecode_def *def); +int build_lookup_mk2(struct timecode_def *def); + + +#endif /* end of include guard TIMECODER_MK2_H */ From 60232138d2528958d1ace40e82a98ba05ed4300b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:37:33 +0100 Subject: [PATCH 076/163] xwax: Add needed filter structures A simple exponential moving average (lowpass) is needed for smoothing the signal before applying the derivative. The derivative is needed to obtain a signal to feed to the pitch detection. The RMS value is needed to obtain an appropriate scaling factor for the derivative. --- CMakeLists.txt | 3 +- lib/xwax/filters.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ lib/xwax/filters.h | 28 ++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 lib/xwax/filters.c create mode 100644 lib/xwax/filters.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a241d15410b..fb5f47bd5406 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4891,7 +4891,8 @@ if(VINYLCONTROL) # Internal xwax library add_library(mixxx-xwax STATIC EXCLUDE_FROM_ALL) target_sources(mixxx-xwax PRIVATE lib/xwax/timecoder.c - lib/xwax/timecoder_mk2.c lib/xwax/lut.c lib/xwax/lut_mk2.c) + lib/xwax/timecoder_mk2.c lib/xwax/lut.c lib/xwax/lut_mk2.c + lib/xwax/filters.c) target_include_directories(mixxx-xwax SYSTEM PUBLIC lib/xwax) target_link_libraries(mixxx-lib PRIVATE mixxx-xwax) endif() diff --git a/lib/xwax/filters.c b/lib/xwax/filters.c new file mode 100644 index 000000000000..d528a47aa3ee --- /dev/null +++ b/lib/xwax/filters.c @@ -0,0 +1,108 @@ + +#include +#include +#include +#include + +#include "filters.h" + +/* + * Initializes the exponential moving average filter. + */ + +void ema_init(struct ema_filter *filter, const double alpha) +{ + if (!filter) { + errno = EINVAL; + perror(__func__); + return; + } + + filter->alpha = alpha; + filter->y_old = 0; +} + +/* + * Computes an exponential moving average with the possibility to weight newly added + * values with a factor alpha. + */ + +int ema(struct ema_filter *filter, const int x) +{ + if (!filter) { + errno = EINVAL; + perror(__func__); + return -EINVAL; + } + + int y = filter->alpha * x + (1 - filter->alpha) * filter->y_old; + filter->y_old = y; + + return y; +} + +/* + * Initializes the derivative filter. + */ + +void derivative_init(struct differentiator *filter) +{ + if (!filter) { + errno = EINVAL; + perror(__func__); + return; + } + + filter->x_old = 0; +} + +/* + * Computes a simple derivative, i.e. the slope of the input signal without gain compensation. + */ + +int derivative(struct differentiator *filter, const int x) +{ + int y = x - filter->x_old; + filter->x_old = x; + + return y; +} + +/* + * Initializes the RMS filter + */ + +void rms_init(struct root_mean_square *filter, const float alpha) +{ + if (!filter) { + errno = EINVAL; + perror(__func__); + return; + } + + filter->squared_old = 0; + filter->alpha = alpha; +} + +/* + * Computes the RMS value over a running sum. + * The 1.0 > alpha > 0 determines the smoothness of the result: + */ + +int rms(struct root_mean_square *filter, const int x) +{ + if (!filter) { + errno = EINVAL; + perror(__func__); + return -EINVAL; + } + + /* Compute squared value */ + unsigned long long squared = (unsigned long long)x * (unsigned long long)x; + + /* Apply EMA filter to squared values */ + filter->squared_old = (1.0 - filter->alpha) * filter->squared_old + filter->alpha * squared; + + /* Take square root at the end */ + return (int)sqrt(filter->squared_old); +} diff --git a/lib/xwax/filters.h b/lib/xwax/filters.h new file mode 100644 index 000000000000..f3e79f541eff --- /dev/null +++ b/lib/xwax/filters.h @@ -0,0 +1,28 @@ +#ifndef FILTERS_H + +#define FILTERS_H + +struct ema_filter { + double alpha; + int y_old; +}; + +void ema_init(struct ema_filter *, const double alpha); +int ema(struct ema_filter *, const int x); + +struct differentiator { + int x_old; +}; + +void derivative_init(struct differentiator *filter); +int derivative(struct differentiator *, const int x); + +struct root_mean_square { + float alpha; + unsigned long long squared_old; +}; + +void rms_init(struct root_mean_square *filter, const float alpha); +int rms(struct root_mean_square *filter, const int x); + +#endif /* end of include guard FILTERS_H */ From 341ebeb90b56e84d54ea64cd640321fffbd9550e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:41:54 +0100 Subject: [PATCH 077/163] xwax: Implement a ring buffer as delayline The delayline is needed for computing the RMS value and for demodulation. Since the derivative and filter introduce a delay, this has to be taken into account when getting timecode readings. --- lib/xwax/delayline.c | 115 +++++++++++++++++++++++++++++++++++++++++++ lib/xwax/delayline.h | 21 ++++++++ 2 files changed, 136 insertions(+) create mode 100644 lib/xwax/delayline.c create mode 100644 lib/xwax/delayline.h diff --git a/lib/xwax/delayline.c b/lib/xwax/delayline.c new file mode 100644 index 000000000000..853abde3ee92 --- /dev/null +++ b/lib/xwax/delayline.c @@ -0,0 +1,115 @@ +#include +#include +#include + +#include "delayline.h" + +/* + * Gets the sample at index i in the delayline + */ + +int *delayline_at(struct delayline *delayline, ptrdiff_t i) +{ + if (!delayline) { + fprintf(stderr, "%s: Null pointer exception\n", __func__); + return NULL; + } + + if (delayline->current < 0) + delayline->current += delayline->size; + + ptrdiff_t index = delayline->current + i; + + if ((size_t)index >= delayline->size) + index -= delayline->size; + + return &delayline->array[index]; +} + +/* + * Initializes the delayline + */ + +void delayline_init(struct delayline *delayline) +{ + if (!delayline) { + fprintf(stderr, "%s: Null pointer exception\n", __func__); + return; + } + + delayline->size = DELAYLINE_SIZE; + delayline->current = delayline->size -1; + + for (int i = 0; i < DELAYLINE_SIZE; i++) + delayline->array[i] = 0; +} + +/* + * Decrements the delayline pointer + */ + +void delayline_decrement(struct delayline *delayline) +{ + if (!delayline) { + fprintf(stderr, "%s: Null pointer exception\n", __func__); + return; + } + + delayline->current--; + if (delayline->current < 0) + delayline->current += delayline->size; +} + +/* + * Pushes a new sample to the delayline + */ + +void delayline_push(struct delayline *delayline, int sample) +{ + if (!delayline) { + fprintf(stderr, "%s: Null pointer exception\n", __func__); + return; + } + + delayline_decrement(delayline); + delayline->array[delayline->current] = sample; +} + +/* + * Computes the average value of all samples in the delayline + */ + +int delayline_avg(struct delayline *delayline) +{ + if (!delayline) { + fprintf(stderr, "%s: Null pointer exception\n", __func__); + return -EINVAL; + } + + int sum = 0; + + for (int i = 0; i < delayline->size; i++) + sum += delayline->array[i]; + + return (sum / delayline->size); +} + +/* + * Prints the delayline starting at the current pointer + */ + +void delayline_print(struct delayline *delayline) +{ + if (!delayline) { + fprintf(stderr, "%s: Null pointer exception\n", __func__); + return; + } + + fprintf(stdout, "{"); + for (int i = 0; i < delayline->size; i++) { + fprintf(stdout, "%d", *delayline_at(delayline, i)); + if (i < delayline->size - 1) + fprintf(stdout, ", "); + } + fprintf(stdout, "}\n"); +} diff --git a/lib/xwax/delayline.h b/lib/xwax/delayline.h new file mode 100644 index 000000000000..c41fab96751b --- /dev/null +++ b/lib/xwax/delayline.h @@ -0,0 +1,21 @@ +#ifndef DELAYLINE_H + +#define DELAYLINE_H + +#include + +#define DELAYLINE_SIZE 5 + +struct delayline { + size_t size; + int array[DELAYLINE_SIZE]; + ptrdiff_t current; +}; + +void delayline_init(struct delayline *delayline); +int *delayline_at(struct delayline *delayline, ptrdiff_t i); +void delayline_push(struct delayline *delayline, int sample); +int delayline_avg(struct delayline *delayline); +void delayline_print(struct delayline *delayline); + +#endif /* end of include guard DELAYLINE_H */ From fe9753ae30d5e02584e678d80f0bf3668fb28ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:47:20 +0100 Subject: [PATCH 078/163] xwax: Push samples into the delayline --- CMakeLists.txt | 13 ++++++++++--- lib/xwax/timecoder.c | 12 ++++++++++-- lib/xwax/timecoder.h | 4 ++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb5f47bd5406..608b6d51d433 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4890,9 +4890,16 @@ if(VINYLCONTROL) # Internal xwax library add_library(mixxx-xwax STATIC EXCLUDE_FROM_ALL) - target_sources(mixxx-xwax PRIVATE lib/xwax/timecoder.c - lib/xwax/timecoder_mk2.c lib/xwax/lut.c lib/xwax/lut_mk2.c - lib/xwax/filters.c) + target_sources( + mixxx-xwax + PRIVATE + lib/xwax/timecoder.c + lib/xwax/timecoder_mk2.c + lib/xwax/lut.c + lib/xwax/lut_mk2.c + lib/xwax/filters.c + lib/xwax/delayline.c + ) target_include_directories(mixxx-xwax SYSTEM PUBLIC lib/xwax) target_link_libraries(mixxx-lib PRIVATE mixxx-xwax) endif() diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index 9306f70cea56..39626b7bcae0 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -352,6 +352,8 @@ static void init_channel(struct timecoder_channel *ch) { ch->positive = false; ch->zero = 0; + + delayline_init(&ch->delayline); } /* @@ -558,8 +560,14 @@ static void process_bitstream(struct timecoder *tc, signed int m) static void process_sample(struct timecoder *tc, signed int primary, signed int secondary) { - detect_zero_crossing(&tc->primary, primary, tc->zero_alpha, tc->threshold); - detect_zero_crossing(&tc->secondary, secondary, tc->zero_alpha, tc->threshold); + if (tc->def->flags & TRAKTOR_MK2) { + /* Push the samples into the ringbuffer */ + delayline_push(&tc->primary.delayline, primary); + delayline_push(&tc->secondary.delayline, secondary); + } else { + detect_zero_crossing(&tc->primary, primary, tc->zero_alpha, tc->threshold); + detect_zero_crossing(&tc->secondary, secondary, tc->zero_alpha, tc->threshold); + } /* If an axis has been crossed, use the direction of the crossing * to work out the direction of the vinyl */ diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index c66cd75fdebb..0333f07fbb73 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -25,6 +25,7 @@ #include "lut.h" #include "lut_mk2.h" #include "pitch.h" +#include "delayline.h" #define TIMECODER_CHANNELS 2 @@ -55,6 +56,9 @@ struct timecoder_channel { swapped; /* wave recently swapped polarity */ signed int zero; unsigned int crossing_ticker; /* samples since we last crossed zero */ + + struct delayline delayline; /* needed for the Traktor MK2 demodulation */ + }; struct timecoder { From 87fb16024cde48799cbf1431eb2a6098c14554a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 21:59:01 +0100 Subject: [PATCH 079/163] xwax: Compute the RMS value Computes a smoothed RMS value to properly track the current signal strength. --- lib/xwax/timecoder.c | 13 ++++++++++--- lib/xwax/timecoder.h | 12 ++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index 39626b7bcae0..da8832540033 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -27,6 +27,7 @@ #endif #include "debug.h" +#include "filters.h" #include "timecoder.h" #include "timecoder_mk2.h" @@ -353,7 +354,9 @@ static void init_channel(struct timecoder_channel *ch) ch->positive = false; ch->zero = 0; - delayline_init(&ch->delayline); + delayline_init(&ch->mk2.delayline); + + ch->mk2.rms = INT_MAX/2; } /* @@ -562,8 +565,12 @@ static void process_sample(struct timecoder *tc, { if (tc->def->flags & TRAKTOR_MK2) { /* Push the samples into the ringbuffer */ - delayline_push(&tc->primary.delayline, primary); - delayline_push(&tc->secondary.delayline, secondary); + delayline_push(&tc->primary.mk2.delayline, primary); + delayline_push(&tc->secondary.mk2.delayline, secondary); + + /* Compute the smoothed RMS value */ + tc->primary.mk2.rms = rms(&tc->primary.mk2.rms_filter, primary); + tc->secondary.mk2.rms = rms(&tc->secondary.mk2.rms_filter, secondary); } else { detect_zero_crossing(&tc->primary, primary, tc->zero_alpha, tc->threshold); detect_zero_crossing(&tc->secondary, secondary, tc->zero_alpha, tc->threshold); diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index 0333f07fbb73..3683bc06ffdc 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -22,6 +22,7 @@ #include +#include "filters.h" #include "lut.h" #include "lut_mk2.h" #include "pitch.h" @@ -51,14 +52,21 @@ struct timecode_def { struct lut_mk2 lut_mk2; /* MK2 version */ }; +struct timecoder_channel_mk2 { + int rms, rms_deriv; /* RMS values for the signal and its derivative */ + signed int deriv, deriv_scaled; /* Derivative and its scaled version */ + + struct delayline delayline; /* needed for the Traktor MK2 demodulation */ + struct root_mean_square rms_filter, rms_deriv_filter; +}; + struct timecoder_channel { bool positive, /* wave is in positive part of cycle */ swapped; /* wave recently swapped polarity */ signed int zero; unsigned int crossing_ticker; /* samples since we last crossed zero */ - struct delayline delayline; /* needed for the Traktor MK2 demodulation */ - + struct timecoder_channel_mk2 mk2; }; struct timecoder { From 229a5b48486c6d889db341a3b84cf6b6c846fce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 22:10:57 +0100 Subject: [PATCH 080/163] xwax: Implement pitch detection for Traktor MK2 The Traktor MK2 signal is offset-modulated and therefore not directly suited for pitch detection. A suitable signal is the derivative, which more or less evenly oscillates around zero. Since the derivative's amplitude is only a fraction of the amplitude of the original signal, it needs proper scaling. Scaling is achieved via computing the RMS value of the running sums of the signal and derivative. The resulting quotient of RMS_signal / RMS_derivative yields the needed scaling factor. --- lib/xwax/timecoder.c | 90 ++++++++++++++++++++++++++++++---------- lib/xwax/timecoder.h | 6 +++ lib/xwax/timecoder_mk2.c | 57 +++++++++++++++++++++++++ lib/xwax/timecoder_mk2.h | 1 + 4 files changed, 132 insertions(+), 22 deletions(-) diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index da8832540033..490f72466ffc 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -25,6 +25,8 @@ #ifndef _MSC_VER #include #endif +#define _USE_MATH_DEFINES +#include #include "debug.h" #include "filters.h" @@ -345,18 +347,37 @@ void timecoder_free_lookup(void) { } } + +/* + * Initialise filter values for the MK2 demodulation + */ + +static void init_mk2_channel(struct timecoder_channel *ch) +{ + ch->mk2.deriv_scaled = INT_MAX/2; + ch->mk2.rms = INT_MAX/2; + ch->mk2.rms_deriv = 0; + + delayline_init(&ch->mk2.delayline); + + ema_init(&ch->mk2.ema_filter, 3e-1); + derivative_init(&ch->mk2.differentiator); + rms_init(&ch->mk2.rms_filter, 1e-3); + rms_init(&ch->mk2.rms_deriv_filter, 1e-3); +} + + /* * Initialise filter values for one channel */ -static void init_channel(struct timecoder_channel *ch) +static void init_channel(struct timecode_def *def, struct timecoder_channel *ch) { ch->positive = false; ch->zero = 0; - delayline_init(&ch->mk2.delayline); - - ch->mk2.rms = INT_MAX/2; + if (def->flags & TRAKTOR_MK2) + init_mk2_channel(ch); } /* @@ -378,14 +399,15 @@ void timecoder_init(struct timecoder *tc, struct timecode_def *def, tc->speed = speed; tc->dt = 1.0 / sample_rate; + tc->sample_rate = sample_rate; tc->zero_alpha = tc->dt / (ZERO_RC + tc->dt); tc->threshold = ZERO_THRESHOLD; if (phono) tc->threshold >>= 5; /* approx -36dB */ tc->forwards = 1; - init_channel(&tc->primary); - init_channel(&tc->secondary); + init_channel(tc->def, &tc->primary); + init_channel(tc->def, &tc->secondary); pitch_init(&tc->pitch, tc->dt); tc->ref_level = INT_MAX; @@ -395,6 +417,9 @@ void timecoder_init(struct timecoder *tc, struct timecode_def *def, tc->timecode_ticker = 0; tc->mon = NULL; + + /* Compute the factor the scale up the derivative to the original level */ + tc->gain_compensation = 1.0 / (M_PI * tc->def->resolution / tc->sample_rate); } /* @@ -564,13 +589,13 @@ static void process_sample(struct timecoder *tc, signed int primary, signed int secondary) { if (tc->def->flags & TRAKTOR_MK2) { - /* Push the samples into the ringbuffer */ - delayline_push(&tc->primary.mk2.delayline, primary); - delayline_push(&tc->secondary.mk2.delayline, secondary); + mk2_process_carrier(tc, primary, secondary); + + detect_zero_crossing(&tc->primary, tc->primary.mk2.deriv_scaled, tc->zero_alpha, + tc->threshold); + detect_zero_crossing(&tc->secondary, tc->secondary.mk2.deriv_scaled, tc->zero_alpha, + tc->threshold); - /* Compute the smoothed RMS value */ - tc->primary.mk2.rms = rms(&tc->primary.mk2.rms_filter, primary); - tc->secondary.mk2.rms = rms(&tc->secondary.mk2.rms_filter, secondary); } else { detect_zero_crossing(&tc->primary, primary, tc->zero_alpha, tc->threshold); detect_zero_crossing(&tc->secondary, secondary, tc->zero_alpha, tc->threshold); @@ -614,14 +639,21 @@ static void process_sample(struct timecoder *tc, /* If we have crossed the primary channel in the right polarity, * it's time to read off a timecode 0 or 1 value */ - if (tc->secondary.swapped && - tc->primary.positive == ((tc->def->flags & SWITCH_POLARITY) == 0)) - { - signed int m; - - /* scale to avoid clipping */ - m = abs(primary / 2 - tc->primary.zero / 2); - process_bitstream(tc, m); + if (tc->def->flags & TRAKTOR_MK2) { + if (tc->secondary.swapped) + { + /* Process MK2 bitstream here */ + } + } else { + if (tc->secondary.swapped && + tc->primary.positive == ((tc->def->flags & SWITCH_POLARITY) == 0)) + { + signed int m; + + /* scale to avoid clipping */ + m = abs(primary / 2 - tc->primary.zero / 2); + process_bitstream(tc, m); + } } tc->timecode_ticker++; @@ -681,8 +713,22 @@ void timecoder_submit(struct timecoder *tc, signed short *pcm, size_t npcm) secondary = left; } - process_sample(tc, primary, secondary); - update_monitor(tc, left, right); + if (tc->def->flags & TRAKTOR_MK2) { + process_sample(tc, primary, secondary); + + /* + * Display the derivative in the monitor. Since the signal is not + * a perfect ring on the x-y-plane, but jumps up and down a bit, + * it looks to small in the scope. Therefore a multiplication by + * two is necessary. + */ + + update_monitor(tc, tc->primary.mk2.deriv_scaled * 2, + tc->secondary.mk2.deriv_scaled * 2); + } else { + process_sample(tc, primary, secondary); + update_monitor(tc, left, right); + } pcm += TIMECODER_CHANNELS; } diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index 3683bc06ffdc..d470be5e482d 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -57,6 +57,8 @@ struct timecoder_channel_mk2 { signed int deriv, deriv_scaled; /* Derivative and its scaled version */ struct delayline delayline; /* needed for the Traktor MK2 demodulation */ + struct ema_filter ema_filter; + struct differentiator differentiator; struct root_mean_square rms_filter, rms_deriv_filter; }; @@ -76,6 +78,7 @@ struct timecoder { /* Precomputed values */ double dt, zero_alpha; + int sample_rate; signed int threshold; /* Pitch information */ @@ -93,11 +96,14 @@ struct timecoder { mk2_timecode; /* Traktor MK2 version */ unsigned int valid_counter, /* number of successful error checks */ timecode_ticker; /* samples since valid timecode was read */ + double dB; /* Decibels to detect phono level */ /* Feedback */ unsigned char *mon; /* x-y array */ int mon_size, mon_counter; + + double gain_compensation; /* Scaling factor for the derivative */ }; struct timecode_def* timecoder_find_definition(const char *name); diff --git a/lib/xwax/timecoder_mk2.c b/lib/xwax/timecoder_mk2.c index 652c2a1b67e2..99cb12f8f4c6 100644 --- a/lib/xwax/timecoder_mk2.c +++ b/lib/xwax/timecoder_mk2.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "timecoder_mk2.h" @@ -117,3 +118,59 @@ int build_lookup_mk2(struct timecode_def *def) return 0; } + +/* + * Do Traktor-MK2-specific processing of the carrier wave + * + * Pushes samples into a delayline, computes the derivative, computes RMS + * values and scales the derivative back up to the original signal's level. + * Afterards the upscaled derivative can by processed by the pitch detection + * algorithm. + * + * NOTE: Ideally the gain compensation should be done in the derivative and lowpass + * filter structures by determining the amplitude response. I had this + * implemented previously, but chose gain compensation by using the RMS value, + * since it is easier to understand for developers not trained in signal + * processing. Additionally it's nice to have the dB level at hand. + * + */ + +void mk2_process_carrier(struct timecoder *tc, signed int primary, signed int secondary) +{ + if (!tc) { + errno = -EINVAL; + perror(__func__); + return; + } + + /* Push the samples into the ringbuffer */ + delayline_push(&tc->primary.mk2.delayline, primary); + delayline_push(&tc->secondary.mk2.delayline, secondary); + + /* Compute the discrete derivative */ + tc->primary.mk2.deriv = derivative(&tc->primary.mk2.differentiator, + ema(&tc->primary.mk2.ema_filter, primary)); + tc->secondary.mk2.deriv = derivative(&tc->secondary.mk2.differentiator, + ema(&tc->secondary.mk2.ema_filter, secondary)); + + /* Compute the smoothed RMS value */ + tc->primary.mk2.rms = rms(&tc->primary.mk2.rms_filter, primary); + tc->secondary.mk2.rms = rms(&tc->secondary.mk2.rms_filter, secondary); + + /* Compute the smoothed RMS value for the derivative */ + tc->primary.mk2.rms_deriv = rms(&tc->primary.mk2.rms_deriv_filter, tc->primary.mk2.deriv); + tc->secondary.mk2.rms_deriv = rms(&tc->secondary.mk2.rms_deriv_filter, tc->secondary.mk2.deriv); + + /* Compute the gain compensation for the derivative*/ + tc->gain_compensation = (double)tc->secondary.mk2.rms / tc->secondary.mk2.rms_deriv; + + /* Without this limit pitch becomes too sensitive */ + if (tc->gain_compensation > 30.0) + tc->gain_compensation = 30.0; + + tc->dB = 20 * log10((double)tc->secondary.mk2.rms / INT_MAX); + + /* Compute the scaled derivative */ + tc->primary.mk2.deriv_scaled = tc->primary.mk2.deriv * tc->gain_compensation; + tc->secondary.mk2.deriv_scaled = tc->secondary.mk2.deriv * tc->gain_compensation; +} diff --git a/lib/xwax/timecoder_mk2.h b/lib/xwax/timecoder_mk2.h index f8ce65cc73f1..8a0f68fd7231 100644 --- a/lib/xwax/timecoder_mk2.h +++ b/lib/xwax/timecoder_mk2.h @@ -9,5 +9,6 @@ mk2bits_t fwd_mk2(mk2bits_t current, struct timecode_def *def); mk2bits_t rev_mk2(mk2bits_t current, struct timecode_def *def); int build_lookup_mk2(struct timecode_def *def); +void mk2_process_carrier(struct timecoder *tc, signed int primary, signed int secondary); #endif /* end of include guard TIMECODER_MK2_H */ From 648c793d1702d71e362c90f7a75b077176baf9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Sat, 29 Mar 2025 22:17:44 +0100 Subject: [PATCH 081/163] xwax: Implement demodulation functions for Traktor MK2 --- lib/xwax/timecoder.c | 30 ++++++++- lib/xwax/timecoder.h | 16 +++++ lib/xwax/timecoder_mk2.c | 129 +++++++++++++++++++++++++++++++++++++++ lib/xwax/timecoder_mk2.h | 1 + 4 files changed, 175 insertions(+), 1 deletion(-) diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index 490f72466ffc..b9bd8404e334 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -347,6 +347,23 @@ void timecoder_free_lookup(void) { } } +/* + * Initialise a subcode decoder for the Traktor MK2 + */ + +void mk2_subcode_init(struct mk2_subcode *sc) +{ + sc->valid_counter = 0; + sc->avg_reading = INT_MAX/2; + sc->avg_slope = INT_MAX/2; + sc->bit = U128_ZERO; + + delayline_init(&sc->readings); + + /* Initialise smoothing filters */ + ema_init(&sc->ema_reading, 0.01); + ema_init(&sc->ema_slope, 0.01); +} /* * Initialise filter values for the MK2 demodulation @@ -420,6 +437,9 @@ void timecoder_init(struct timecoder *tc, struct timecode_def *def, /* Compute the factor the scale up the derivative to the original level */ tc->gain_compensation = 1.0 / (M_PI * tc->def->resolution / tc->sample_rate); + + mk2_subcode_init(&tc->upper_bitstream); + mk2_subcode_init(&tc->lower_bitstream); } /* @@ -429,6 +449,13 @@ void timecoder_init(struct timecoder *tc, struct timecode_def *def, void timecoder_clear(struct timecoder *tc) { assert(tc->mon == NULL); + + if (tc->def->flags & TRAKTOR_MK2) { + delayline_init(&tc->primary.mk2.delayline); + delayline_init(&tc->secondary.mk2.delayline); + delayline_init(&tc->upper_bitstream.readings); + delayline_init(&tc->lower_bitstream.readings); + } } /* @@ -642,7 +669,8 @@ static void process_sample(struct timecoder *tc, if (tc->def->flags & TRAKTOR_MK2) { if (tc->secondary.swapped) { - /* Process MK2 bitstream here */ + int reading = *delayline_at(&tc->secondary.mk2.delayline, 3); + mk2_process_timecode(tc, reading); } } else { if (tc->secondary.swapped && diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index d470be5e482d..b276890bba1b 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -71,6 +71,21 @@ struct timecoder_channel { struct timecoder_channel_mk2 mk2; }; +struct mk2_subcode { + mk2bits_t bitstream; + mk2bits_t timecode; + mk2bits_t bit; + + unsigned int valid_counter; + signed int avg_reading; + signed int avg_slope; + bool recent_bit_flip; + + struct delayline readings; + struct ema_filter ema_reading; + struct ema_filter ema_slope; +}; + struct timecoder { struct timecode_def *def; double speed; @@ -103,6 +118,7 @@ struct timecoder { unsigned char *mon; /* x-y array */ int mon_size, mon_counter; + struct mk2_subcode upper_bitstream, lower_bitstream; double gain_compensation; /* Scaling factor for the derivative */ }; diff --git a/lib/xwax/timecoder_mk2.c b/lib/xwax/timecoder_mk2.c index 99cb12f8f4c6..b5856022f288 100644 --- a/lib/xwax/timecoder_mk2.c +++ b/lib/xwax/timecoder_mk2.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "timecoder_mk2.h" @@ -174,3 +175,131 @@ void mk2_process_carrier(struct timecoder *tc, signed int primary, signed int se tc->primary.mk2.deriv_scaled = tc->primary.mk2.deriv * tc->gain_compensation; tc->secondary.mk2.deriv_scaled = tc->secondary.mk2.deriv * tc->gain_compensation; } + +/* + * Detect if the upward or downward slope hits a threshold. + * Upwards signifies a one and downwards a zero. + */ + +static inline void detect_bit_flip(const int slope[2], int rms, int reading, int avg_reading, + mk2bits_t *bit, bool *bit_flipped, bool forwards, mk2bits_t one) +{ + static const double reverse_factor = 1.75; + static const double forward_factor = 1.5; + double threshold; + + if (*bit_flipped == false) { + if (forwards) { + threshold = rms / forward_factor; + } else { + threshold = rms / reverse_factor; + one = u128_not(one); + } + + if (u128_eq(*bit, u128_not(one)) && slope[0] > threshold && slope[1] > threshold) { + *bit = one; + *bit_flipped = true; + } else if (u128_eq(*bit, one) && slope[0] < -threshold && slope[1] < -threshold) { + *bit = u128_not(one); + *bit_flipped = true; + } + } else { + *bit_flipped = false; + } +} + +/* + * Verify the new LFSR state in the forward or reverse direction. + */ + +static inline bool lfsr_verify(struct timecode_def *def, mk2bits_t *timecode, mk2bits_t *bitstream, + mk2bits_t bit, bool forwards) +{ + if (forwards) { + *timecode = fwd_mk2(*timecode, def); + *bitstream = u128_add(u128_rshift(*bitstream, 1), u128_lshift(bit, (def->bits - 1))); + } else { + mk2bits_t mask = u128_sub(u128_lshift(U128_ONE, def->bits), U128_ONE); + *timecode = rev_mk2(*timecode, def); + *bitstream = u128_add(u128_and(u128_lshift(*bitstream, 1), mask), bit); + } + + if (u128_eq(*timecode, *bitstream)) + return true; + else + return false; +} + +/* + * Process the upper or lower bitstream contained in the Traktor MK2 signal + */ + +inline static void mk2_process_bitstream(struct timecoder *tc, struct mk2_subcode *sc, + signed int reading) +{ + int current_slope[2]; + + delayline_push(&sc->readings, reading); + sc->avg_reading = ema(&sc->ema_reading, reading); + + /* Calculate absolute of average slope */ + sc->avg_slope = ema(&sc->ema_slope, abs(reading - *delayline_at(&sc->readings, 1))); + + /* Calculate current and last slope */ + current_slope[0] = (reading - *delayline_at(&sc->readings, 1)); + current_slope[1] = (reading - *delayline_at(&sc->readings, 2)); + + /* The bits only change when an offset jump occurs. Else the previous bit is taken */ + detect_bit_flip(current_slope, tc->secondary.mk2.rms, reading, sc->avg_reading, &sc->bit, + &sc->recent_bit_flip, tc->forwards, U128(0x0, !tc->secondary.positive)); + + if (lfsr_verify(tc->def, &sc->timecode, &sc->bitstream, sc->bit, tc->forwards)) { + (sc->valid_counter)++; + } else { + sc->timecode = sc->bitstream; + sc->valid_counter = 0; + } +} + +/* + * Process the upper or lower bitstream contained in the Traktor MK2 signal + */ + +void mk2_process_timecode(struct timecoder *tc, signed int reading) +{ + /* + * Detect if the offset jumps on upper and lower bitstream + */ + + if (tc->secondary.positive) + mk2_process_bitstream(tc, &tc->upper_bitstream, reading); + else if (!tc->secondary.positive) + mk2_process_bitstream(tc, &tc->lower_bitstream, reading); + + if (tc->lower_bitstream.valid_counter > tc->upper_bitstream.valid_counter) { + tc->mk2_bitstream = tc->lower_bitstream.bitstream; + tc->mk2_timecode = tc->lower_bitstream.timecode; + } else { + tc->mk2_bitstream = tc->upper_bitstream.bitstream; + tc->mk2_timecode = tc->upper_bitstream.timecode; + } + + if (u128_eq(tc->mk2_timecode, tc->mk2_bitstream)) { + tc->valid_counter++; + } else { + tc->timecode = tc->bitstream; + tc->valid_counter = 0; + } + /* Take note of the last time we read a valid timecode */ + + tc->timecode_ticker = 0; + + tc->ref_level -= tc->ref_level / REF_PEAKS_AVG; + tc->ref_level += abs((int)(tc->secondary.mk2.rms_deriv * tc->gain_compensation)) + / REF_PEAKS_AVG; + + debug("upper.valid_counter: %d, lower.valid_counter %d, forwards: %b\n", */ + tc->upper.valid_counter, + tc->lower.valid_counter, + tc->forwards); +} diff --git a/lib/xwax/timecoder_mk2.h b/lib/xwax/timecoder_mk2.h index 8a0f68fd7231..ed649a67906f 100644 --- a/lib/xwax/timecoder_mk2.h +++ b/lib/xwax/timecoder_mk2.h @@ -10,5 +10,6 @@ mk2bits_t rev_mk2(mk2bits_t current, struct timecode_def *def); int build_lookup_mk2(struct timecode_def *def); void mk2_process_carrier(struct timecoder *tc, signed int primary, signed int secondary); +void mk2_process_timecode(struct timecoder *tc, signed int reading); #endif /* end of include guard TIMECODER_MK2_H */ From a47b41f10af5ee328c141cd1e74aa61486edb7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Tue, 5 Aug 2025 12:27:30 +0200 Subject: [PATCH 082/163] xwax: Implement LUT loading/storing feature Since the current LUT implementation is designed for Serato-style timecodes with short LFSRs and not suitable for the Traktor MK2s with its 110-bit LFSR and up to four million states, the computation of the hash map is taking quite long (~10 seconds for the CD). This is a dirty workaround of improving the startup time by not having to wait for the LUT build every time. I am not happy with this solution, but it does make the feature usable for now. In the long run the we should look into pre-computing a Minimum Perfect Hash Table, which should reduce the size of the LUT drastically. --- lib/xwax/timecoder.c | 26 +++-- lib/xwax/timecoder.h | 2 +- lib/xwax/timecoder_mk2.c | 160 ++++++++++++++++++++++++++ lib/xwax/timecoder_mk2.h | 3 + src/vinylcontrol/vinylcontrolxwax.cpp | 26 ++++- src/vinylcontrol/vinylcontrolxwax.h | 1 + 6 files changed, 207 insertions(+), 11 deletions(-) diff --git a/lib/xwax/timecoder.c b/lib/xwax/timecoder.c index b9bd8404e334..5d2821e4d7fc 100755 --- a/lib/xwax/timecoder.c +++ b/lib/xwax/timecoder.c @@ -303,7 +303,7 @@ static int build_lookup(struct timecode_def *def) * Return: pointer to timecode definition, or NULL if not available */ -struct timecode_def* timecoder_find_definition(const char *name) +struct timecode_def* timecoder_find_definition(const char *name, const char *lut_dir_path) { unsigned int n; @@ -313,14 +313,24 @@ struct timecode_def* timecoder_find_definition(const char *name) if (strcmp(def->name, name) != 0) continue; - if (def->flags & TRAKTOR_MK2) { - if (build_lookup_mk2(def) == -1) - return NULL; /* error */ - } else { - if (build_lookup(def) == -1) - return NULL; /* error */ + if (!def->lookup) { + if (def->flags & TRAKTOR_MK2) { + if (!lut_load_mk2(def, lut_dir_path)) + return def; + + if (build_lookup_mk2(def) == -1) + return NULL; /* error */ + + if (lut_store_mk2(def, lut_dir_path)) { + timecoder_free_lookup(); + fprintf(stderr, "Couldn't store LUT on disk\n"); + return NULL; + } + } else { + if (build_lookup(def) == -1) + return NULL; /* error */ + } } - return def; } diff --git a/lib/xwax/timecoder.h b/lib/xwax/timecoder.h index b276890bba1b..98019933c0c7 100644 --- a/lib/xwax/timecoder.h +++ b/lib/xwax/timecoder.h @@ -122,7 +122,7 @@ struct timecoder { double gain_compensation; /* Scaling factor for the derivative */ }; -struct timecode_def* timecoder_find_definition(const char *name); +struct timecode_def* timecoder_find_definition(const char *name, const char *lut_dir_path); void timecoder_free_lookup(void); void timecoder_init(struct timecoder *tc, struct timecode_def *def, diff --git a/lib/xwax/timecoder_mk2.c b/lib/xwax/timecoder_mk2.c index b5856022f288..4aadc3a3e791 100644 --- a/lib/xwax/timecoder_mk2.c +++ b/lib/xwax/timecoder_mk2.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "timecoder_mk2.h" @@ -120,6 +121,165 @@ int build_lookup_mk2(struct timecode_def *def) return 0; } +/* + * Caches the generated LUT on the disk. + * + * This is only necessary for the Traktor MK2, since the size of its hash + * table is quite large. + */ + +int lut_store_mk2(struct timecode_def *def, const char *lut_dir_path) +{ + if (!def || !lut_dir_path) + return -1; + + struct slot_mk2 *slot; + slot_no_t *hash; + + int i, j, len, hashes; + char path[1024]; + FILE *fp = NULL; + int r = 0; + int size; + + sprintf(path, "%s/%s%s", lut_dir_path, def->name, ".lut"); + + fprintf(stdout, "Storing LUT at %s\n", path); + fp = fopen(path, "wb"); + if (!fp) { + perror("fopen"); + return -1; + } + + for (i = 0; i < def->length; i++) { + slot = &def->lut_mk2.slot[i]; + + if (!slot) { + printf("slot_no: %d doesn't exist'\n", i); + r = -1; + goto out; + } + size = fwrite(slot, sizeof(struct slot_mk2), 1, fp); + + if (!size) { + perror("fwrite"); + r = -1; + goto out; + } + } + + hashes = 1 << 16; + for (j = 0; j < hashes; j++) { + hash = &def->lut_mk2.table[j]; + + size = fwrite(hash, sizeof(slot_no_t), 1, fp); + if (!size) { + perror("fwrite"); + r = -1; + goto out; + } + } + + size = fwrite(&def->lut_mk2.avail, sizeof(slot_no_t), 1, fp); + if (!size) { + perror("fwrite"); + r = -1; + goto out; + } + +out: + fclose(fp); + + if (hashes != j || def->length != i) + fprintf(stderr, "Something went wrong: "); + + fprintf(stderr, "Wrote %d hashes and %d slots to disk\n", j, i); + + return r; +} + + +/* + * Loads the stored LUT from the disk. + * + * This is only necessary for the Traktor MK2, since the size of its hash + * table is quite large. + */ + +int lut_load_mk2(struct timecode_def *def, const char *lut_dir_path) +{ + if (!def || !lut_dir_path) + return -1; + + struct slot_mk2 *slot; + + char path[1024]; + int i, j, hashes; + int r = 0; + int size; + FILE *fp; + int len; + + sprintf(path, "%s/%s%s", lut_dir_path, def->name, ".lut"); + + fprintf(stdout, "Loading LUT from %s\n", path); + fp = fopen(path, "rb"); + if (!fp) { + fprintf(stderr, "LUT for %s not found on disk\n", def->desc); + return -1; + } + + r = lut_init_mk2(&def->lut_mk2, def->length); + if (r) { + fprintf(stderr, "Couldn't initialise LUT\n"); + goto out; + } + + fprintf(stdout, "Loading LUT from %s\n", path); + for (i = 0; i < def->length; i++) { + slot = &def->lut_mk2.slot[i]; + + size = fread(slot, sizeof(struct slot_mk2), 1, fp); + if (!size) { + perror("fread"); + r = -1; + goto out; + } + } + + hashes = 1 << 16; + for (j = 0; j < hashes; j++) { + + slot_no_t *hash = &def->lut_mk2.table[j]; + + size = fread(hash, sizeof(slot_no_t), 1, fp); + if (!size) { + perror("fread"); + r = -1; + goto out; + } + } + + size = fread(&def->lut_mk2.avail, sizeof(slot_no_t), 1, fp); + if (!size) { + perror("fwrite"); + r = -1; + } + + +out: + fclose(fp); + + if (hashes == j && def->length == i) + def->lookup = true; + else + fprintf(stderr, "Something went wrong: "); + + fprintf(stderr, "Loaded %d hashes and %d slots from disk\n", j, i); + + return r; +} + /* * Do Traktor-MK2-specific processing of the carrier wave * diff --git a/lib/xwax/timecoder_mk2.h b/lib/xwax/timecoder_mk2.h index ed649a67906f..8e5afa84b7cf 100644 --- a/lib/xwax/timecoder_mk2.h +++ b/lib/xwax/timecoder_mk2.h @@ -7,7 +7,10 @@ mk2bits_t fwd_mk2(mk2bits_t current, struct timecode_def *def); mk2bits_t rev_mk2(mk2bits_t current, struct timecode_def *def); + int build_lookup_mk2(struct timecode_def *def); +int lut_load_mk2(struct timecode_def *def, const char *lut_dir_path); +int lut_store_mk2(struct timecode_def *def, const char *lut_dir_path); void mk2_process_carrier(struct timecoder *tc, signed int primary, signed int secondary); void mk2_process_timecode(struct timecoder *tc, signed int reading); diff --git a/src/vinylcontrol/vinylcontrolxwax.cpp b/src/vinylcontrol/vinylcontrolxwax.cpp index 602f97f57afb..9ea2b116072f 100644 --- a/src/vinylcontrol/vinylcontrolxwax.cpp +++ b/src/vinylcontrol/vinylcontrolxwax.cpp @@ -117,12 +117,22 @@ VinylControlXwax::VinylControlXwax(UserSettingsPointer pConfig, const QString& g m_pSteadyGross = new SteadyPitch(0.5, false); } - timecode_def* tc_def = timecoder_find_definition(timecode); + // Determine the config folder path + std::string lut_dir_string; + const char* lut_dir_path = nullptr; + + if (!getLutDir().isEmpty()) { + lut_dir_string = getLutDir().toStdString(); + lut_dir_path = lut_dir_string.c_str(); + } + + // Pass the config folder path to the timecoder + timecode_def* tc_def = timecoder_find_definition(timecode, lut_dir_path); if (tc_def == nullptr) { qDebug() << "Error finding timecode definition for " << timecode << ", defaulting to" << MIXXX_VINYL_DEFAULT_XWAX_NAME; timecode = MIXXX_VINYL_DEFAULT_XWAX_NAME; - tc_def = timecoder_find_definition(timecode); + tc_def = timecoder_find_definition(timecode, lut_dir_path); } double speed = 1.0; @@ -192,6 +202,18 @@ void VinylControlXwax::freeLUTs() { s_xwaxLUTMutex.unlock(); } +QString VinylControlXwax::getLutDir() { + QDir lutPath(m_pConfig->getSettingsPath().append("/lut/")); + + if (!lutPath.exists()) { + if (!lutPath.mkpath(".")) { + qWarning() << "Failed to create LUT directory at" << lutPath; + return QString{}; + } + } + + return lutPath.absolutePath(); +} bool VinylControlXwax::writeQualityReport(VinylSignalQualityReport* pReport) { if (pReport) { diff --git a/src/vinylcontrol/vinylcontrolxwax.h b/src/vinylcontrol/vinylcontrolxwax.h index cc0167c5dae9..ed84ed446c76 100644 --- a/src/vinylcontrol/vinylcontrolxwax.h +++ b/src/vinylcontrol/vinylcontrolxwax.h @@ -29,6 +29,7 @@ class VinylControlXwax : public VinylControl { virtual ~VinylControlXwax(); static void freeLUTs(); + QString getLutDir(); void analyzeSamples(CSAMPLE* pSamples, size_t nFrames); virtual bool writeQualityReport(VinylSignalQualityReport* qualityReportFifo); From 064e808652699872ce4b6c3fc9009e7584fe6c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Wed, 5 Mar 2025 18:24:10 +0100 Subject: [PATCH 083/163] vinylcontrol: Add Traktor MK2s to timecode collection Adds Traktor MK2 Side, A/B and CD --- src/preferences/dialog/dlgprefvinyl.cpp | 9 +++++++++ src/vinylcontrol/defs_vinylcontrol.h | 9 +++++++++ src/vinylcontrol/vinylcontrolxwax.cpp | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/src/preferences/dialog/dlgprefvinyl.cpp b/src/preferences/dialog/dlgprefvinyl.cpp index 18d4aff5b61a..4baf7117c9f3 100644 --- a/src/preferences/dialog/dlgprefvinyl.cpp +++ b/src/preferences/dialog/dlgprefvinyl.cpp @@ -43,6 +43,9 @@ DlgPrefVinyl::DlgPrefVinyl( box->addItem(MIXXX_VINYL_SERATOCD); box->addItem(MIXXX_VINYL_TRAKTORSCRATCHSIDEA); box->addItem(MIXXX_VINYL_TRAKTORSCRATCHSIDEB); + box->addItem(MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA); + box->addItem(MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB); + box->addItem(MIXXX_VINYL_TRAKTORSCRATCHMK2CD); box->addItem(MIXXX_VINYL_MIXVIBESDVS); box->addItem(MIXXX_VINYL_MIXVIBES7INCH); box->addItem(MIXXX_VINYL_PIONEERA); @@ -229,6 +232,12 @@ int DlgPrefVinyl::getDefaultLeadIn(const QString& vinyl_type) const { return MIXXX_VINYL_TRAKTORSCRATCHSIDEA_LEADIN; } else if (vinyl_type == MIXXX_VINYL_TRAKTORSCRATCHSIDEB) { return MIXXX_VINYL_TRAKTORSCRATCHSIDEB_LEADIN; + } else if (vinyl_type == MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA) { + return MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA_LEADIN; + } else if (vinyl_type == MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB) { + return MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB_LEADIN; + } else if (vinyl_type == MIXXX_VINYL_TRAKTORSCRATCHMK2CD) { + return MIXXX_VINYL_TRAKTORSCRATCHMK2CD_LEADIN; } else if (vinyl_type == MIXXX_VINYL_MIXVIBESDVS) { return MIXXX_VINYL_MIXVIBESDVS_LEADIN; } else if (vinyl_type == MIXXX_VINYL_MIXVIBES7INCH) { diff --git a/src/vinylcontrol/defs_vinylcontrol.h b/src/vinylcontrol/defs_vinylcontrol.h index 4ce1694d3a5d..5f9ae339e612 100644 --- a/src/vinylcontrol/defs_vinylcontrol.h +++ b/src/vinylcontrol/defs_vinylcontrol.h @@ -13,6 +13,9 @@ constexpr int VINYL_STATUS_ERROR = 3; #define MIXXX_VINYL_SERATOCD "Serato CD" #define MIXXX_VINYL_TRAKTORSCRATCHSIDEA "Traktor Scratch MK1 Vinyl, Side A" #define MIXXX_VINYL_TRAKTORSCRATCHSIDEB "Traktor Scratch MK1 Vinyl, Side B" +#define MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA "Traktor Scratch MK2 Vinyl, Side A (beta)" +#define MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB "Traktor Scratch MK2 Vinyl, Side B (beta)" +#define MIXXX_VINYL_TRAKTORSCRATCHMK2CD "Traktor Scratch MK2 CD (beta)" #define MIXXX_VINYL_MIXVIBESDVS "MixVibes DVS V2 Vinyl" #define MIXXX_VINYL_MIXVIBES7INCH "MixVibes 7 inch" #define MIXXX_VINYL_PIONEERA "Pioneer RekordBox DVS Control Vinyl, Side A" @@ -23,6 +26,9 @@ constexpr int VINYL_STATUS_ERROR = 3; #define MIXXX_VINYL_SERATOCD_XWAX_NAME "serato_cd" #define MIXXX_VINYL_TRAKTORSCRATCHSIDEA_XWAX_NAME "traktor_a" #define MIXXX_VINYL_TRAKTORSCRATCHSIDEB_XWAX_NAME "traktor_b" +#define MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA_XWAX_NAME "traktor_mk2_a" +#define MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB_XWAX_NAME "traktor_mk2_b" +#define MIXXX_VINYL_TRAKTORSCRATCHMK2CD_XWAX_NAME "traktor_mk2_cd" #define MIXXX_VINYL_MIXVIBESDVS_XWAX_NAME "mixvibes_v2" #define MIXXX_VINYL_MIXVIBES7INCH_XWAX_NAME "mixvibes_7inch" #define MIXXX_VINYL_PIONEERA_XWAX_NAME "pioneer_a" @@ -36,6 +42,9 @@ constexpr int VINYL_STATUS_ERROR = 3; #define MIXXX_VINYL_SERATOCD_LEADIN 0 #define MIXXX_VINYL_TRAKTORSCRATCHSIDEA_LEADIN 10 #define MIXXX_VINYL_TRAKTORSCRATCHSIDEB_LEADIN 10 +#define MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA_LEADIN 10 +#define MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB_LEADIN 10 +#define MIXXX_VINYL_TRAKTORSCRATCHMK2CD_LEADIN 10 #define MIXXX_VINYL_MIXVIBESDVS_LEADIN 0 #define MIXXX_VINYL_MIXVIBES7INCH_LEADIN 0 #define MIXXX_VINYL_PIONEERA_LEADIN 10 diff --git a/src/vinylcontrol/vinylcontrolxwax.cpp b/src/vinylcontrol/vinylcontrolxwax.cpp index 9ea2b116072f..4eddf4b4222b 100644 --- a/src/vinylcontrol/vinylcontrolxwax.cpp +++ b/src/vinylcontrol/vinylcontrolxwax.cpp @@ -96,6 +96,12 @@ VinylControlXwax::VinylControlXwax(UserSettingsPointer pConfig, const QString& g timecode = MIXXX_VINYL_TRAKTORSCRATCHSIDEA_XWAX_NAME; } else if (strVinylType == MIXXX_VINYL_TRAKTORSCRATCHSIDEB) { timecode = MIXXX_VINYL_TRAKTORSCRATCHSIDEB_XWAX_NAME; + } else if (strVinylType == MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA) { + timecode = MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEA_XWAX_NAME; + } else if (strVinylType == MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB) { + timecode = MIXXX_VINYL_TRAKTORSCRATCHMK2SIDEB_XWAX_NAME; + } else if (strVinylType == MIXXX_VINYL_TRAKTORSCRATCHMK2CD) { + timecode = MIXXX_VINYL_TRAKTORSCRATCHMK2CD_XWAX_NAME; } else if (strVinylType == MIXXX_VINYL_MIXVIBESDVS) { timecode = MIXXX_VINYL_MIXVIBESDVS_XWAX_NAME; } else if (strVinylType == MIXXX_VINYL_MIXVIBES7INCH) { From 6c86414ebccc1d39f60449e7d480327f1e40cfe4 Mon Sep 17 00:00:00 2001 From: Sergey <5637569+fonsargo@users.noreply.github.com> Date: Mon, 11 Aug 2025 21:27:46 +0200 Subject: [PATCH 084/163] Add missing translation --- src/effects/backends/builtin/autogaincontroleffect.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index 01d3ef72f2c2..2ea42eef06dc 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -27,11 +27,11 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { pManifest->setId(getId()); pManifest->setName(QObject::tr("Auto Gain Control")); pManifest->setShortName(QObject::tr("AGC")); - pManifest->setAuthor("The Mixxx Team"); + pManifest->setAuthor(QObject::tr("The Mixxx Team")); pManifest->setVersion("1.0"); - pManifest->setDescription( + pManifest->setDescription(QObject::tr( "Auto Gain Control (AGC) automatically adjusts the gain of an " - "audio signal to maintain a consistent output level."); + "audio signal to maintain a consistent output level.")); pManifest->setEffectRampsFromDry(true); pManifest->setMetaknobDefault(0.0); From fc824c30cc30ecb34562136cb621cb57d34016fb Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 1 Oct 2024 00:51:18 +0200 Subject: [PATCH 085/163] Implemented HID report tabs, that show all controls and it's values(if accessible) defined in the HID Reports Descriptor - Implemented HID Report Descriptor Parser - Implemented `extractLogicallValue` for logical value extraction for both signed and unsigned controls. - Added HID report tab GUI layout in the controller dialog with "Read" and "Send" buttons based on report type. - Extended `HidIoThread` to emit `reportReceived` signal with report ID for improved tracking, and added logic for bytesRead in processInputReport --- CMakeLists.txt | 3 + .../controllerhidreporttabsmanager.cpp | 488 ++++++++++++++++ .../controllerhidreporttabsmanager.h | 52 ++ src/controllers/dlgprefcontroller.cpp | 13 +- src/controllers/dlgprefcontroller.h | 3 + src/controllers/hid/hidcontroller.cpp | 11 +- src/controllers/hid/hidcontroller.h | 16 +- src/controllers/hid/hiddevice.cpp | 23 +- src/controllers/hid/hiddevice.h | 8 + src/controllers/hid/hidiothread.cpp | 25 +- src/controllers/hid/hidiothread.h | 6 +- src/controllers/hid/hidreportdescriptor.cpp | 541 ++++++++++++++++++ src/controllers/hid/hidreportdescriptor.h | 258 +++++++++ .../controller_hid_reportdescriptor_test.cpp | 281 +++++++++ 14 files changed, 1717 insertions(+), 11 deletions(-) create mode 100644 src/controllers/controllerhidreporttabsmanager.cpp create mode 100644 src/controllers/controllerhidreporttabsmanager.h create mode 100644 src/controllers/hid/hidreportdescriptor.cpp create mode 100644 src/controllers/hid/hidreportdescriptor.h create mode 100644 src/test/controller_hid_reportdescriptor_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1064db8447eb..5e1d8dac807c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2595,6 +2595,7 @@ if(BUILD_TESTING) src/test/colormapperjsproxy_test.cpp src/test/colorpalette_test.cpp src/test/configobject_test.cpp + src/test/controller_hid_reportdescriptor_test.cpp src/test/controller_mapping_validation_test.cpp src/test/controller_mapping_settings_test.cpp src/test/controllers/controller_columnid_regression_test.cpp @@ -4825,12 +4826,14 @@ if(HID) target_sources( mixxx-lib PRIVATE + src/controllers/controllerhidreporttabsmanager.cpp src/controllers/hid/hidcontroller.cpp src/controllers/hid/hidiothread.cpp src/controllers/hid/hidioglobaloutputreportfifo.cpp src/controllers/hid/hidiooutputreport.cpp src/controllers/hid/hiddevice.cpp src/controllers/hid/hidenumerator.cpp + src/controllers/hid/hidreportdescriptor.cpp src/controllers/hid/hidusagetables.cpp src/controllers/hid/legacyhidcontrollermapping.cpp src/controllers/hid/legacyhidcontrollermappingfilehandler.cpp diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp new file mode 100644 index 000000000000..37a614b540b6 --- /dev/null +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -0,0 +1,488 @@ +#include "controllerhidreporttabsmanager.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "controllers/hid/hidusagetables.h" +#include "moc_controllerhidreporttabsmanager.cpp" + +ControllerHidReportTabsManager::ControllerHidReportTabsManager( + QTabWidget* parentTabWidget, HidController* hidController) + : m_pParentControllerTab(parentTabWidget), + m_pHidController(hidController) { +} + +void ControllerHidReportTabsManager::createReportTypeTabs() { + auto reportTypeTabs = std::make_unique(m_pParentControllerTab); + + QMetaEnum metaEnum = QMetaEnum::fromType(); + + for (int reportTypeIdx = 0; reportTypeIdx < metaEnum.keyCount(); ++reportTypeIdx) { + auto reportType = static_cast( + metaEnum.value(reportTypeIdx)); + auto reportTypeTab = std::make_unique(reportTypeTabs.get()); + createHidReportTab(reportTypeTab.get(), reportType); + if (reportTypeTab->count() > 0) { + QString tabName = QStringLiteral("%1 Reports") + .arg(metaEnum.valueToKey( + static_cast(reportType))); + m_pParentControllerTab->addTab(reportTypeTab.release(), tabName); + } + } +} + +void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* parentReportTypeTab, + hid::reportDescriptor::HidReportType reportType) { + const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); + if (!reportDescriptorTemp.has_value()) { + return; + } + const auto& reportDescriptor = *reportDescriptorTemp; + + QMetaEnum metaEnum = QMetaEnum::fromType(); + + for (const auto& reportInfo : reportDescriptor.getListOfReports()) { + auto [index, type, reportId] = reportInfo; + if (type == reportType) { + QString tabName = QStringLiteral("%1 Report 0x%2") + .arg(metaEnum.valueToKey(static_cast( + reportType)), + QString::number(reportId, 16) + .rightJustified(2, '0') + .toUpper()); + + auto* tabWidget = new QWidget(parentReportTypeTab); + auto* layout = new QVBoxLayout(tabWidget); + auto* topWidgetRow = new QHBoxLayout(); + + // Create buttons + auto* readButton = new QPushButton(QStringLiteral("Read"), tabWidget); + auto* sendButton = new QPushButton(QStringLiteral("Send"), tabWidget); + + // Adjust visibility/enable state based on the report type + if (reportType == hid::reportDescriptor::HidReportType::Input) { + sendButton->hide(); + readButton->hide(); + } else if (reportType == hid::reportDescriptor::HidReportType::Output) { + readButton->hide(); + } + + topWidgetRow->addWidget(readButton); + topWidgetRow->addWidget(sendButton); + layout->addLayout(topWidgetRow); + + auto* table = new QTableWidget(tabWidget); + layout->addWidget(table); + + auto report = reportDescriptor.getReport(reportType, reportId); + if (report) { + // Show payload size + auto* sizeLabel = new QLabel(tabWidget); + sizeLabel->setText( + QStringLiteral("Payload Size: %1 bytes") + .arg(report->getReportSize())); + topWidgetRow->insertWidget(0, sizeLabel); + + populateHidReportTable(table, *report, reportType); + } + + if (reportType != hid::reportDescriptor::HidReportType::Output) { + connect(readButton, + &QPushButton::clicked, + this, + [this, table, reportId, reportType]() { + slotReadReport(table, reportId, reportType); + }); + // Read once on tab creation + slotReadReport(table, reportId, reportType); + } + if (reportType != hid::reportDescriptor::HidReportType::Input) { + connect(sendButton, + &QPushButton::clicked, + this, + [this, table, reportId, reportType]() { + slotSendReport(table, reportId, reportType); + }); + } + + parentReportTypeTab->addTab(tabWidget, tabName); + + if (reportType == hid::reportDescriptor::HidReportType::Input) { + // Store the table pointer associated with the reportId + m_reportIdToTableMap[reportId] = table; + } + + // Connect the signal for the reportId + HidIoThread* hidIoThread = m_pHidController->getHidIoThread(); + connect(hidIoThread, + &HidIoThread::reportReceived, + this, + &ControllerHidReportTabsManager::slotProcessInputReport); + } + } +} + +void ControllerHidReportTabsManager::updateTableWithReportData( + QTableWidget* table, + const QByteArray& reportData) { + // Temporarily disable updates to speed up processing + table->setUpdatesEnabled(false); + + // Process the report data and update the table + for (int row = 0; row < table->rowCount(); ++row) { + auto* item = table->item(row, 5); // Value column is at index 5 + if (item) { + // Retrieve custom data from the first cell + QVariant customData = table->item(row, 0)->data(Qt::UserRole + 1); + if (customData.isValid()) { + auto control = + static_cast( + customData.value()); + // Use the custom data as needed + int64_t controlValue = + hid::reportDescriptor::extractLogicalValue( + reportData, *control); + item->setText(QString::number(controlValue)); + } + } + } + + table->setUpdatesEnabled(true); +} + +void ControllerHidReportTabsManager::slotProcessInputReport( + quint8 reportId, const QByteArray& data) { + // Find the table associated with the reportId + auto it = m_reportIdToTableMap.find(reportId); + if (it == m_reportIdToTableMap.end()) { + qWarning() << "No table found for reportId" << reportId; + return; + } + QTableWidget* table = it->second; + + const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + auto report = reportDescriptor.getReport(hid::reportDescriptor::HidReportType::Input, reportId); + if (report) { + updateTableWithReportData(table, data); + } +} + +void ControllerHidReportTabsManager::slotReadReport(QTableWidget* table, + quint8 reportId, + hid::reportDescriptor::HidReportType reportType) { + if (!m_pHidController->isOpen()) { + qWarning() << "HID controller is not open."; + return; + } + + HidControllerJSProxy* jsProxy = static_cast(m_pHidController->jsProxy()); + VERIFY_OR_DEBUG_ASSERT(jsProxy) { + return; + } + + const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + auto report = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(report) { + return; + } + + QByteArray reportData; + if (reportType == hid::reportDescriptor::HidReportType::Input) { + reportData = jsProxy->getInputReport(reportId); + } else if (reportType == hid::reportDescriptor::HidReportType::Feature) { + reportData = jsProxy->getFeatureReport(reportId); + } else { + return; + } + + if (reportData.size() < report->getReportSize()) { + qWarning() << "Failed to get report. Read only " << reportData.size() + << " instead of expected " << report->getReportSize() + << " bytes."; + return; + } + + updateTableWithReportData(table, reportData); +} + +void ControllerHidReportTabsManager::slotSendReport(QTableWidget* table, + quint8 reportId, + hid::reportDescriptor::HidReportType reportType) { + if (!m_pHidController->isOpen()) { + qWarning() << "HID controller is not open."; + return; + } + + HidControllerJSProxy* jsProxy = static_cast(m_pHidController->jsProxy()); + VERIFY_OR_DEBUG_ASSERT(jsProxy) { + return; + } + + const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + + auto report = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(report) { + return; + } + + // Create a QByteArray of the size of the report + QByteArray reportData(report->getReportSize(), 0); + + // Iterate through each row in the table + for (int row = 0; row < table->rowCount(); ++row) { + auto* item = table->item(row, 5); // Value column is at index 5 + if (item) { + // Retrieve custom data from the first cell + QVariant customData = table->item(row, 0)->data(Qt::UserRole + 1); + if (customData.isValid()) { + auto control = + reinterpret_cast( + customData.value()); + // Set the control value in the reportData + bool success = hid::reportDescriptor::applyLogicalValue( + reportData, *control, item->text().toLongLong()); + if (!success) { + qWarning() << "Failed to set control value for row" << row; + continue; + } + } + } + } + + // Send the reportData + if (reportType == hid::reportDescriptor::HidReportType::Feature) { + jsProxy->sendFeatureReport(reportId, reportData); + } else if (reportType == hid::reportDescriptor::HidReportType::Output) { + jsProxy->sendOutputReport(reportId, reportData); + } +} + +void ControllerHidReportTabsManager::populateHidReportTable( + QTableWidget* table, + const hid::reportDescriptor::Report& report, + hid::reportDescriptor::HidReportType reportType) { + // Temporarily disable updates to speed up populating + table->setUpdatesEnabled(false); + + // Reserve rows up-front + const auto& controls = report.getControls(); + table->setRowCount(static_cast(controls.size())); + + // Set the delegate once if needed + if (reportType != hid::reportDescriptor::HidReportType::Input) { + table->setItemDelegateForColumn(5, new ValueItemDelegate(table)); + } + + bool showVolatileColumn = (reportType == hid::reportDescriptor::HidReportType::Feature || + reportType == hid::reportDescriptor::HidReportType::Output); + + // Set headers + QStringList headers = {QStringLiteral("Byte Position"), + QStringLiteral("Bit Position"), + QStringLiteral("Bit Size"), + QStringLiteral("Logical Min"), + QStringLiteral("Logical Max"), + QStringLiteral("Value"), + QStringLiteral("Physical Min"), + QStringLiteral("Physical Max"), + QStringLiteral("Unit Scaling"), + QStringLiteral("Unit"), + QStringLiteral("Abs/Rel"), + QStringLiteral("Wrap"), + QStringLiteral("Linear"), + QStringLiteral("Preferred"), + QStringLiteral("Null")}; + if (showVolatileColumn) { + headers << QStringLiteral("Volatile"); + } + headers << QStringLiteral("Usage Page") << QStringLiteral("Usage"); + + table->setColumnCount(headers.size()); + table->setHorizontalHeaderLabels(headers); + table->verticalHeader()->setVisible(false); + + // Helpers + auto createReadOnlyItem = [](const QString& text, bool rightAlign = false) { + auto* item = new QTableWidgetItem(text); + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + if (rightAlign) { + item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); + } + return item; + }; + auto createValueItem = [reportType](int minVal, int maxVal) { + auto* item = new QTableWidgetItem; + QFont font = item->font(); + font.setBold(true); + item->setFont(font); + if (reportType == hid::reportDescriptor::HidReportType::Input) { + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + } else { + item->setFlags(item->flags() | Qt::ItemIsEditable); + item->setData(Qt::UserRole, QVariant::fromValue(QPair(minVal, maxVal))); + } + return item; + }; + + int row = 0; + for (const auto& control : controls) { + // Column 0 - Byte Position + auto* bytePositionItem = createReadOnlyItem(QStringLiteral("0x%1").arg(QString::number( + control.m_bytePosition, 16) + .rightJustified(2, '0') + .toUpper()), + true); + table->setItem(row, 0, bytePositionItem); + // Store custom data for the row in the first cell + bytePositionItem->setData(Qt::UserRole + 1, + QVariant::fromValue(reinterpret_cast( + const_cast( + &control)))); + + // Column 1 - Bit Position + table->setItem(row, 1, createReadOnlyItem(QString::number(control.m_bitPosition), true)); + // Column 2 - Bit Size + table->setItem(row, 2, createReadOnlyItem(QString::number(control.m_bitSize), true)); + // Column 3 - Logical Min + table->setItem(row, 3, createReadOnlyItem(QString::number(control.m_logicalMinimum), true)); + // Column 4 - Logical Max + table->setItem(row, 4, createReadOnlyItem(QString::number(control.m_logicalMaximum), true)); + // Column 5 - Value + table->setItem(row, 5, createValueItem(control.m_logicalMinimum, control.m_logicalMaximum)); + // Column 6 - Physical Min + table->setItem(row, + 6, + createReadOnlyItem( + QString::number(control.m_physicalMinimum), true)); + // Column 7 - Physical Max + table->setItem(row, + 7, + createReadOnlyItem( + QString::number(control.m_physicalMaximum), true)); + // Column 8 - Unit Scaling + table->setItem(row, + 8, + createReadOnlyItem(control.m_unitExponent != 0 + ? QStringLiteral("10^%1").arg( + control.m_unitExponent) + : QString(), + true)); + // Column 9 - Unit + table->setItem(row, + 9, + createReadOnlyItem(hid::reportDescriptor::getScaledUnitString( + control.m_unit))); + // Column 10 - Abs/Rel + table->setItem(row, + 10, + createReadOnlyItem(control.m_flags.absolute_relative + ? QStringLiteral("Relative") + : QStringLiteral("Absolute"))); + // Column 11 - Wrap + table->setItem(row, + 11, + createReadOnlyItem(control.m_flags.no_wrap_wrap + ? QStringLiteral("Wrap") + : QStringLiteral("No Wrap"))); + // Column 12 - Linear + table->setItem(row, + 12, + createReadOnlyItem(control.m_flags.linear_non_linear + ? QStringLiteral("Non Linear") + : QStringLiteral("Linear"))); + // Column 13 - Preferred + table->setItem(row, + 13, + createReadOnlyItem(control.m_flags.preferred_no_preferred + ? QStringLiteral("No Preferred") + : QStringLiteral("Preferred"))); + // Column 14 - Null + table->setItem(row, + 14, + createReadOnlyItem(control.m_flags.no_null_null + ? QStringLiteral("Null") + : QStringLiteral("No Null"))); + + // Volatile column (if present) + int volatileIndex = (showVolatileColumn ? 15 : -1); + if (volatileIndex != -1) { + table->setItem(row, + volatileIndex, + createReadOnlyItem(control.m_flags.non_volatile_volatile + ? QStringLiteral("Volatile") + : QStringLiteral("Non Volatile"))); + } + + // Usage Page / Usage + int usagePageIdx = showVolatileColumn ? 16 : 15; + int usageDescIdx = showVolatileColumn ? 17 : 16; + uint16_t usagePage = static_cast((control.m_usage & 0xFFFF0000) >> 16); + uint16_t usage = static_cast(control.m_usage & 0x0000FFFF); + + table->setItem(row, + usagePageIdx, + createReadOnlyItem( + mixxx::hid::HidUsageTables::getUsagePageDescription( + usagePage))); + table->setItem(row, + usageDescIdx, + createReadOnlyItem( + mixxx::hid::HidUsageTables::getUsageDescription( + usagePage, usage))); + + ++row; + } + + // Resize columns to contents once, store width and set column width fixed for performance + for (int colIdx = 0; colIdx < table->columnCount(); ++colIdx) { + table->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::ResizeToContents); + } + QVector columnWidths(table->columnCount()); + for (int colIdx = 0; colIdx < table->columnCount(); ++colIdx) { + columnWidths[colIdx] = table->columnWidth(colIdx); + } + // Set the width of the value column (5) to fit 11 digits (int32 minimum in decimal) + QFontMetrics metrics(table->font()); + int width = metrics.horizontalAdvance(QStringLiteral("0").repeated(11)); + columnWidths[5] = width; + for (int colIdx = 0; colIdx < table->columnCount(); ++colIdx) { + table->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::Fixed); + table->setColumnWidth(colIdx, columnWidths[colIdx]); + } + + table->setUpdatesEnabled(true); +} + +QWidget* ValueItemDelegate::createEditor(QWidget* parent, + const QStyleOptionViewItem&, + const QModelIndex& index) const { + // Create a line edit restricted by (logical min, logical max) + auto dataRange = index.data(Qt::UserRole).value>(); + auto* editor = new QLineEdit(parent); + editor->setValidator(new QIntValidator(dataRange.first, dataRange.second, editor)); + return editor; +} + +void ValueItemDelegate::setModelData(QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index) const { + auto* lineEdit = qobject_cast(editor); + if (!lineEdit) { + return; + } + + // Confirm the text is an integer within the expected range + bool ok = false; + const int value = lineEdit->text().toInt(&ok); + if (ok) { + auto dataRange = index.data(Qt::UserRole).value>(); + if (value >= dataRange.first && value <= dataRange.second) { + model->setData(index, value, Qt::EditRole); + } + } +} diff --git a/src/controllers/controllerhidreporttabsmanager.h b/src/controllers/controllerhidreporttabsmanager.h new file mode 100644 index 000000000000..638075a95ad0 --- /dev/null +++ b/src/controllers/controllerhidreporttabsmanager.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include +#include + +#include "controllers/hid/hidcontroller.h" +#include "controllers/hid/hidreportdescriptor.h" + +class ControllerHidReportTabsManager : public QObject { + Q_OBJECT + + public: + ControllerHidReportTabsManager(QTabWidget* parentTabWidget, HidController* hidController); + + void createReportTypeTabs(); + void createHidReportTab(QTabWidget* parentTab, hid::reportDescriptor::HidReportType reportType); + void slotSendReport(QTableWidget* table, + quint8 reportId, + hid::reportDescriptor::HidReportType reportType); + void populateHidReportTable(QTableWidget* table, + const hid::reportDescriptor::Report& report, + hid::reportDescriptor::HidReportType reportType); + + private slots: + void slotReadReport(QTableWidget* table, + quint8 reportId, + hid::reportDescriptor::HidReportType reportType); + + public slots: + void slotProcessInputReport(quint8 reportId, const QByteArray& reportData); + + private: + void updateTableWithReportData(QTableWidget* table, const QByteArray& reportData); + QTabWidget* m_pParentControllerTab; + HidController* m_pHidController; + std::unordered_map m_reportIdToTableMap; +}; + +class ValueItemDelegate : public QStyledItemDelegate { + public: + using QStyledItemDelegate::QStyledItemDelegate; + + QWidget* createEditor(QWidget* parent, + const QStyleOptionViewItem& option, + const QModelIndex& index) const override; + + void setModelData(QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index) const override; +}; diff --git a/src/controllers/dlgprefcontroller.cpp b/src/controllers/dlgprefcontroller.cpp index e17cb938c494..8be4deabce41 100644 --- a/src/controllers/dlgprefcontroller.cpp +++ b/src/controllers/dlgprefcontroller.cpp @@ -90,7 +90,8 @@ DlgPrefController::DlgPrefController( m_inputMappingsTabIndex(-1), m_outputMappingsTabIndex(-1), m_settingsTabIndex(-1), - m_screensTabIndex(-1) { + m_screensTabIndex(-1), + m_hidReportTabsManager(nullptr) { m_ui.setupUi(this); // Create text color for the file and wiki links createLinkColor(); @@ -194,6 +195,12 @@ DlgPrefController::DlgPrefController( m_ui.labelHidUsagePageValue->setVisible(true); m_ui.labelHidUsage->setVisible(true); m_ui.labelHidUsageValue->setVisible(true); + + // Create HID report tabs + m_hidReportTabsManager = + std::make_unique( + m_ui.controllerTabs, hidController); + m_hidReportTabsManager->createReportTypeTabs(); } else #endif { @@ -1161,7 +1168,7 @@ void DlgPrefController::showMapping(std::shared_ptr pMa } #endif - // Inputs tab + // MIDI Inputs tab ControllerInputMappingTableModel* pInputModel = new ControllerInputMappingTableModel(this, m_pControlPickerMenu, @@ -1189,7 +1196,7 @@ void DlgPrefController::showMapping(std::shared_ptr pMa // Trigger search when the model was recreated after hitting Apply slotInputControlSearch(); - // Outputs tab + // MIDI Outputs tab ControllerOutputMappingTableModel* pOutputModel = new ControllerOutputMappingTableModel(this, m_pControlPickerMenu, diff --git a/src/controllers/dlgprefcontroller.h b/src/controllers/dlgprefcontroller.h index 518c9ab6ad40..4383cf2042dc 100644 --- a/src/controllers/dlgprefcontroller.h +++ b/src/controllers/dlgprefcontroller.h @@ -2,6 +2,7 @@ #include +#include "controllers/controllerhidreporttabsmanager.h" #include "controllers/controllermappinginfo.h" #include "controllers/midi/midimessage.h" #include "controllers/ui_dlgprefcontrollerdlg.h" @@ -147,4 +148,6 @@ class DlgPrefController : public DlgPreferencePage { int m_settingsTabIndex; // Index of the settings tab int m_screensTabIndex; // Index of the screens tab QHash m_settingsCollapsedStates; + + std::unique_ptr m_hidReportTabsManager; }; diff --git a/src/controllers/hid/hidcontroller.cpp b/src/controllers/hid/hidcontroller.cpp index d699de35cff4..37e4489594d7 100644 --- a/src/controllers/hid/hidcontroller.cpp +++ b/src/controllers/hid/hidcontroller.cpp @@ -162,7 +162,16 @@ int HidController::open(const QString& resourcePath) { return -1; } - m_pHidIoThread = std::make_unique(pHidDevice, m_deviceInfo); + m_rawReportDescriptor = m_deviceInfo.fetchRawReportDescriptor(pHidDevice); + + if (m_rawReportDescriptor.has_value()) { + m_reportDescriptor = hid::reportDescriptor::HIDReportDescriptor( + m_rawReportDescriptor->data(), m_rawReportDescriptor->size()); + m_reportDescriptor->parse(); + m_deviceHasReportIds = m_reportDescriptor->isDeviceWithReportIds(); + } + + m_pHidIoThread = std::make_unique(pHidDevice, m_deviceInfo, m_deviceHasReportIds); m_pHidIoThread->setObjectName(QStringLiteral("HidIoThread ") + getName()); connect(m_pHidIoThread.get(), diff --git a/src/controllers/hid/hidcontroller.h b/src/controllers/hid/hidcontroller.h index e8a5f9b79f2d..383503eb9341 100644 --- a/src/controllers/hid/hidcontroller.h +++ b/src/controllers/hid/hidcontroller.h @@ -3,6 +3,7 @@ #include "controllers/controller.h" #include "controllers/hid/hiddevice.h" #include "controllers/hid/hidiothread.h" +#include "controllers/hid/hidreportdescriptor.h" #include "controllers/hid/legacyhidcontrollermapping.h" /// HID controller backend @@ -70,6 +71,15 @@ class HidController final : public Controller { QString getUsageDescription() const { return m_deviceInfo.getUsageDescription(); } + + const std::optional& getReportDescriptor() const { + return m_reportDescriptor; + } + + HidIoThread* getHidIoThread() const { + return m_pHidIoThread.get(); + } + bool isMappable() const override { if (!m_pMapping) { return false; @@ -87,7 +97,11 @@ class HidController final : public Controller { // 0x0. bool sendBytes(const QByteArray& data) override; - const mixxx::hid::DeviceInfo m_deviceInfo; + mixxx::hid::DeviceInfo m_deviceInfo; + // These optional members are not set before opening the device + std::optional> m_rawReportDescriptor; + std::optional m_reportDescriptor; + std::optional m_deviceHasReportIds; std::unique_ptr m_pHidIoThread; std::unique_ptr m_pMapping; diff --git a/src/controllers/hid/hiddevice.cpp b/src/controllers/hid/hiddevice.cpp index 82576f3aee56..31ea9a4d0b3b 100644 --- a/src/controllers/hid/hiddevice.cpp +++ b/src/controllers/hid/hiddevice.cpp @@ -1,7 +1,5 @@ #include "controllers/hid/hiddevice.h" -#include - #include #include "controllers/controllermappinginfo.h" @@ -54,6 +52,27 @@ DeviceInfo::DeviceInfo(const hid_device_info& device_info) m_serialNumberRaw.data(), m_serialNumberRaw.size())) { } +// We need an opened hid_device here, +// but the lifetime of the data is as long as DeviceInfo exists, +// means the reportDescriptor data remains valid after closing the hid_device +std::optional> DeviceInfo::fetchRawReportDescriptor(hid_device* pHidDevice) { + if (!m_reportDescriptor) { + if (!pHidDevice) { + return std::nullopt; + } + + uint8_t tempReportDescriptor[HID_API_MAX_REPORT_DESCRIPTOR_SIZE]; + int descriptorSize = hid_get_report_descriptor(pHidDevice, + tempReportDescriptor, + HID_API_MAX_REPORT_DESCRIPTOR_SIZE); + if (descriptorSize > 0) { + m_reportDescriptor = std::vector(tempReportDescriptor, + tempReportDescriptor + descriptorSize); + } + } + return m_reportDescriptor; +} + QString DeviceInfo::formatName() const { // We include the last 4 digits of the serial number and the // interface number to allow the user (and Mixxx!) to keep diff --git a/src/controllers/hid/hiddevice.h b/src/controllers/hid/hiddevice.h index a4a4d52c18d2..233c2d8dc2a9 100644 --- a/src/controllers/hid/hiddevice.h +++ b/src/controllers/hid/hiddevice.h @@ -1,8 +1,12 @@ #pragma once +#include + #include #include +#include #include +#include #include "controllers/controller.h" #include "controllers/hid/hidusagetables.h" @@ -101,6 +105,8 @@ class DeviceInfo final { return mixxx::hid::HidUsageTables::getUsageDescription(usage_page, usage); } + std::optional> fetchRawReportDescriptor(hid_device* pHidDevice); + bool isValid() const { return !getProductString().isNull() && !getSerialNumber().isNull(); } @@ -131,6 +137,8 @@ class DeviceInfo final { QString m_manufacturerString; QString m_productString; QString m_serialNumber; + + std::optional> m_reportDescriptor; }; } // namespace hid diff --git a/src/controllers/hid/hidiothread.cpp b/src/controllers/hid/hidiothread.cpp index 7b0aff2b3aba..989709a02e99 100644 --- a/src/controllers/hid/hidiothread.cpp +++ b/src/controllers/hid/hidiothread.cpp @@ -27,11 +27,13 @@ QString loggingCategoryPrefix(const QString& deviceName) { } } // namespace -HidIoThread::HidIoThread( - hid_device* pHidDevice, const mixxx::hid::DeviceInfo& deviceInfo) +HidIoThread::HidIoThread(hid_device* pHidDevice, + const mixxx::hid::DeviceInfo& deviceInfo, + std::optional deviceHasReportIds) : QThread(), m_deviceInfo(deviceInfo), - // Defining RuntimeLoggingCategories locally in this thread improves runtime performance significiantly + // Defining RuntimeLoggingCategories locally in this thread improves + // runtime performance significantly m_logBase(loggingCategoryPrefix(deviceInfo.formatName())), m_logInput(loggingCategoryPrefix(deviceInfo.formatName()) + QStringLiteral(".input")), @@ -41,6 +43,7 @@ HidIoThread::HidIoThread( m_lastPollSize(0), m_pollingBufferIndex(0), m_hidReadErrorLogged(false), + m_deviceHasReportIds(deviceHasReportIds), m_globalOutputReportFifo(), m_runLoopSemaphore(1) { // Initializing isn't strictly necessary but is good practice. @@ -151,6 +154,22 @@ void HidIoThread::processInputReport(int bytesRead) { emit receive(QByteArray(reinterpret_cast(pCurrentBuffer), bytesRead), mixxx::Time::elapsed()); + + if (m_deviceHasReportIds.has_value() && bytesRead > 0) { + if (m_deviceHasReportIds.value()) { + // Extract the ReportId from the buffer + quint8 reportId = pCurrentBuffer[0]; + emit reportReceived(reportId, + QByteArray( + reinterpret_cast(pCurrentBuffer + 1), + bytesRead - 1)); + } else { + quint8 reportId = 0; + emit reportReceived(reportId, + QByteArray(reinterpret_cast(pCurrentBuffer), + bytesRead)); + } + } } QByteArray HidIoThread::getInputReport(quint8 reportID) { diff --git a/src/controllers/hid/hidiothread.h b/src/controllers/hid/hidiothread.h index f0cece04a144..9819a661d6fa 100644 --- a/src/controllers/hid/hidiothread.h +++ b/src/controllers/hid/hidiothread.h @@ -24,7 +24,8 @@ class HidIoThread : public QThread { Q_OBJECT public: HidIoThread(hid_device* pDevice, - const mixxx::hid::DeviceInfo& deviceInfo); + const mixxx::hid::DeviceInfo& deviceInfo, + std::optional deviceHasReportIds); ~HidIoThread() override; void run() override; @@ -52,6 +53,7 @@ class HidIoThread : public QThread { signals: /// Signals that a HID InputReport received by Interrupt triggered from HID device void receive(const QByteArray& data, mixxx::Duration timestamp); + void reportReceived(quint8 reportId, const QByteArray& data); private: bool sendNextCachedOutputReport(); @@ -81,6 +83,8 @@ class HidIoThread : public QThread { int m_pollingBufferIndex; bool m_hidReadErrorLogged; + std::optional m_deviceHasReportIds; + /// Must be locked when a operation changes the size of the m_outputReports map, /// or when modify the m_outputReportIterator QMutex m_outputReportMapMutex; diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp new file mode 100644 index 000000000000..809a2b2d82b0 --- /dev/null +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -0,0 +1,541 @@ +#include "controllers/hid/hidreportdescriptor.h" + +#include +#include + +#include "moc_hidreportdescriptor.cpp" +#include "util/assert.h" + +namespace hid::reportDescriptor { + +/// Extracts the value of the specified control in logical scale, +/// from the given report data +int32_t extractLogicalValue(const QByteArray& reportData, const Control& control) { + VERIFY_OR_DEBUG_ASSERT(control.m_bitSize > 0 && control.m_bitSize <= 32) { + return control.m_logicalMinimum; // Safe value in allowed range + } + + uint8_t numberOfBytesToCopy = ((control.m_bitPosition + control.m_bitSize - 1) / 8) + 1; + + int64_t value = 0; + std::memcpy(&value, reportData.data() + control.m_bytePosition, numberOfBytesToCopy); + + value >>= control.m_bitPosition; + + bool isSigned = control.m_logicalMinimum < 0; + // Mask out the bits that are not part of the control + if (isSigned) { + bool isNegative = value & (1ULL << (control.m_bitSize - 1)); + value &= (1ULL << (control.m_bitSize - 1)) - 1; + if (isNegative) { + value = ((1ULL << (control.m_bitSize - 1)) - value) * -1; + } + } else { + value &= (1ULL << control.m_bitSize) - 1; + } + + return value; +} + +/// Sets the bits in the report data of the specified control, +/// to the given value in logical scale +bool applyLogicalValue(QByteArray& reportData, const Control& control, int32_t controlValue) { + VERIFY_OR_DEBUG_ASSERT(control.m_bitSize > 0 && control.m_bitSize <= 32) { + return false; + } + + if (control.m_flags.no_null_null) { + // Nullable controls allow any possible value in the bitrange + if (control.m_logicalMinimum < 0) { + if (controlValue < -std::pow(2, control.m_bitSize - 1) || + controlValue > std::pow(2, control.m_bitSize - 1) - 1) { + return false; + } + } else { + if (controlValue < 0 || controlValue > std::pow(2, control.m_bitSize)) { + return false; + } + } + } else { + // Non-Nullable controls only allow values in the logical range + if (controlValue < control.m_logicalMinimum || controlValue > control.m_logicalMaximum) { + return false; + } + } + + uint64_t mask = ((1ULL << control.m_bitSize) - 1) << control.m_bitPosition; + uint64_t value = (static_cast(controlValue) << control.m_bitPosition) & mask; + + // Check if the value fits into the data (position + bitSize) + uint8_t lastByteToCopy = control.m_bytePosition + + (control.m_bitPosition + control.m_bitSize - 1) / 8; + + if (lastByteToCopy >= reportData.size()) { + return false; + } + + for (uint8_t byteIdx = control.m_bytePosition; byteIdx <= lastByteToCopy; ++byteIdx) { + // Clear the bits that are part of the control + reportData[byteIdx] &= ~static_cast(mask & 0xFF); + // Set the new value + reportData[byteIdx] |= static_cast(value & 0xFF); + mask >>= 8; + value >>= 8; + } + + return true; +} + +QString getScaledUnitString(uint32_t unit) { + struct UnitInfo { + const char* physicalQuantity[5]; + }; + + const UnitInfo unitInfos[] = { + {"", "cm", "radian", "inch", "degree"}, + {"", "g", "g", "slug", "slug"}, // mass + {"", "s", "s", "s", "s"}, // time + {"", "K", "K", "°F", "°F"}, // temperature + {"", "A", "A", "A", "A"}, // current + {"", "cd", "cd", "cd", "cd"} // luminous intensity + }; + + int8_t exponents[] = {0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1}; + + QString unitString; + + auto appendQuantity = [&](int shift, const UnitInfo& unitInfo) { + int8_t value = (unit >> shift) & 0xF; + if (value != 0) { + if (!unitString.isEmpty()) { + unitString += "*"; + } + unitString += unitInfo.physicalQuantity[(unit & 0xF)]; + if (exponents[value] != 1) { + unitString += "^" + QString::number(exponents[value]); + } + } + }; + + for (int quantityIdx = 0; quantityIdx < 6; ++quantityIdx) { + appendQuantity(4 + quantityIdx * 4, unitInfos[quantityIdx]); + } + + return unitString; +} + +// Class for Controls + +Control::Control(const ControlFlags flags, + const uint32_t usage, + const int32_t logicalMinimum, + const int32_t logicalMaximum, + const int32_t physicalMinimum, + const int32_t physicalMaximum, + const int8_t unitExponent, + const uint32_t unit, + const uint16_t bytePosition, + const uint8_t bitPosition, + const uint8_t bitSize) + : m_flags(flags), + m_usage(usage), + m_logicalMinimum(logicalMinimum), + m_logicalMaximum(logicalMaximum), + m_physicalMinimum(physicalMinimum), + m_physicalMaximum(physicalMaximum), + m_unitExponent(unitExponent), + m_unit(unit), + m_bytePosition(bytePosition), + m_bitPosition(bitPosition), + m_bitSize(bitSize) { +} + +Report::Report(const HidReportType& reportType, const uint8_t& reportId) + : m_reportType(reportType), + m_reportId(reportId), + m_lastBytePosition(0), + m_lastBitPosition(0) { +} + +void Report::addControl(const Control& item) { + m_controls.push_back(item); +} + +void Report::increasePosition(unsigned int bitSize) { + // Calculate the new bit position + m_lastBitPosition += bitSize; + + // If the bit position exceeds 8 bits, adjust the byte position + m_lastBytePosition += m_lastBitPosition / 8; + m_lastBitPosition %= 8; +} + +// Class for Collections +void Collection::addReport(const Report& report) { + m_reports.push_back(report); +} +const Report* Collection::getReport( + const HidReportType& reportType, const uint8_t& reportId) const { + for (auto& report : m_reports) { + if (report.m_reportType == reportType && report.m_reportId == reportId) { + return &report; + } + } + return nullptr; +} + +// HID Report Descriptor Parser +HIDReportDescriptor::HIDReportDescriptor(const uint8_t* data, size_t length) + : m_data(data), + m_length(length), + m_pos(0), + m_deviceHasReportIds(kNotSet), + m_collectionLevel(0) { +} + +std::pair HIDReportDescriptor::readTag() { + uint8_t byte = m_data[m_pos++]; + + VERIFY_OR_DEBUG_ASSERT(byte != + static_cast(HidItemSize::LongItemKeyword)){ + // Long items are only reserved for future use, they can't be used + // according to HID class definition 1.11 + }; + + HidItemTag tag = static_cast( + byte & static_cast(HidItemTag::AllTagBitsMask)); + HidItemSize size = static_cast( + byte & static_cast(HidItemSize::AllSizeBitsMask)); + + return {tag, size}; +} + +uint32_t HIDReportDescriptor::readPayload(HidItemSize payloadSize) { + uint32_t payload; + + switch (payloadSize) { + case HidItemSize::ZeroBytePayload: + return 0; + case HidItemSize::OneBytePayload: + VERIFY_OR_DEBUG_ASSERT(m_pos + 1 <= m_length) { + return 0; + } + return m_data[m_pos++]; + case HidItemSize::TwoBytePayload: + VERIFY_OR_DEBUG_ASSERT(m_pos + 2 <= m_length) { + return 0; + } + payload = m_data[m_pos++]; + payload |= m_data[m_pos++] << 8; + return payload; + case HidItemSize::FourBytePayload: + VERIFY_OR_DEBUG_ASSERT(m_pos + 4 <= m_length) { + return 0; + } + payload = m_data[m_pos++]; + payload |= m_data[m_pos++] << 8; + payload |= m_data[m_pos++] << 16; + payload |= m_data[m_pos++] << 24; + return payload; + default: + DEBUG_ASSERT(true); + return 0; + } +} + +int32_t HIDReportDescriptor::getSignedValue(uint32_t payload, HidItemSize payloadSize) { + switch (payloadSize) { + case HidItemSize::ZeroBytePayload: + return 0; + case HidItemSize::OneBytePayload: + if (payload & 0x80) { // Check if the sign bit is set + return static_cast(payload | 0xFFFFFF00); // Sign extend to 32 bits + } + return static_cast(payload); + case HidItemSize::TwoBytePayload: + if (payload & 0x8000) { // Check if the sign bit is set + return static_cast(payload | 0xFFFF0000); // Sign extend to 32 bits + } + return static_cast(payload); + case HidItemSize::FourBytePayload: + return static_cast(payload); // Already 32 bits, no need to sign extend + default: + DEBUG_ASSERT(true); + return 0; + } +} + +uint32_t HIDReportDescriptor::getDecodedUsage( + uint16_t usagePage, uint32_t usage, HidItemSize usageSize) { + switch (usageSize) { + case HidItemSize::ZeroBytePayload: + return usagePage << 16; + case HidItemSize::OneBytePayload: + case HidItemSize::TwoBytePayload: + return (usagePage << 16) + usage; + case HidItemSize::FourBytePayload: + return usage; // Full 32bit usage superseds Usage Page + default: + DEBUG_ASSERT(true); + return usagePage << 16; + } +} + +HidReportType HIDReportDescriptor::getReportType(HidItemTag tag) { + switch (tag) { + case HidItemTag::Input: + return HidReportType::Input; + case HidItemTag::Output: + return HidReportType::Output; + break; + case HidItemTag::Feature: + return HidReportType::Feature; + default: + DEBUG_ASSERT(true); + return HidReportType::Input; // Dummy value for error case + } +} + +Collection HIDReportDescriptor::parse() { + Collection collection; // Top level collection + std::unique_ptr currentReport = nullptr; // Use a unique_ptr for currentReport + + // Global item values + GlobalItems globalItems; + + // Local item values + LocalItems localItems; + + while (m_pos < m_length) { + auto [tag, size] = readTag(); + auto payload = readPayload(size); + + switch (tag) { + // Global Items + case HidItemTag::UsagePage: + globalItems.usagePage = payload; + break; + case HidItemTag::LogicalMinimum: + globalItems.logicalMinimum = getSignedValue(payload, size); + break; + case HidItemTag::LogicalMaximum: + globalItems.logicalMaximum = getSignedValue(payload, size); + break; + case HidItemTag::PhysicalMinimum: + globalItems.physicalMinimum = getSignedValue(payload, size); + break; + case HidItemTag::PhysicalMaximum: + globalItems.physicalMaximum = getSignedValue(payload, size); + break; + case HidItemTag::UnitExponent: + // HID class definition restricts the unit exponent range to -8 to +7 + globalItems.unitExponent = static_cast(payload & 0x0F); + if (globalItems.unitExponent >= 8) { + globalItems.unitExponent -= 16; + } + break; + case HidItemTag::Unit: + globalItems.unit = payload; + break; + case HidItemTag::ReportSize: + globalItems.reportSize = payload; + break; + case HidItemTag::ReportId: + globalItems.reportId = static_cast(payload); + break; + case HidItemTag::ReportCount: + globalItems.reportCount = payload; + break; + case HidItemTag::Push: + // Places a copy of the global item state table on the stack + globalItemsStack.push_back(globalItems); + break; + case HidItemTag::Pop: + // Replaces the item state table with the top structure from the stack + VERIFY_OR_DEBUG_ASSERT(!globalItemsStack.empty()) { + globalItems = globalItemsStack.back(); + globalItemsStack.pop_back(); + } + break; + + // Local Items + case HidItemTag::Usage: + localItems.Usage.push_back(getDecodedUsage(globalItems.usagePage, payload, size)); + break; + case HidItemTag::UsageMinimum: + localItems.UsageMinimum = getDecodedUsage(globalItems.usagePage, payload, size); + break; + case HidItemTag::UsageMaximum: + localItems.UsageMaximum = getDecodedUsage(globalItems.usagePage, payload, size); + break; + case HidItemTag::DesignatorIndex: + localItems.DesignatorIndex = payload; + break; + case HidItemTag::DesignatorMinimum: + localItems.DesignatorMinimum = payload; + break; + case HidItemTag::DesignatorMaximum: + localItems.DesignatorMaximum = payload; + break; + case HidItemTag::StringIndex: + localItems.StringIndex = payload; + break; + case HidItemTag::StringMinimum: + localItems.StringMinimum = payload; + break; + case HidItemTag::StringMaximum: + localItems.StringMaximum = payload; + break; + case HidItemTag::Delimiter: + localItems.Delimiter = payload; + break; + + // Main Items + case HidItemTag::Input: + case HidItemTag::Output: + case HidItemTag::Feature: { + if (currentReport == nullptr) { + // First control of this device + if (globalItems.reportId == kNoReportId) { + m_deviceHasReportIds = false; + } else { + m_deviceHasReportIds = true; + } + currentReport = std::make_unique(getReportType(tag), globalItems.reportId); + } else if (currentReport->m_reportType != getReportType(tag) || + globalItems.reportId != currentReport->m_reportId) { + // First control of a new report + collection.addReport(*currentReport); + currentReport = std::make_unique(getReportType(tag), globalItems.reportId); + } + + int32_t physicalMinimum, physicalMaximum; + if (globalItems.physicalMinimum == 0 && globalItems.physicalMaximum == 0) { + // According remark in chapter 6.2.2.7 of HID class definition 1.11 + physicalMinimum = globalItems.logicalMinimum; + physicalMaximum = globalItems.logicalMaximum; + } else { + physicalMinimum = globalItems.physicalMinimum; + physicalMaximum = globalItems.physicalMaximum; + } + + ControlFlags flags; + flags.payload = payload; + + if (flags.data_constant == 1) { + // Constant value padding - Usually for byte alignment + currentReport->increasePosition(globalItems.reportSize * globalItems.reportCount); + } else if (flags.array_variable == 0) { + // Array (e.g. list of pressed keys of a computer keyboard) + // NOT IMPLEMENTED as not relevant for mapping wizard, + // but could be implemented by overloaded Control class + currentReport->increasePosition(globalItems.reportSize * globalItems.reportCount); + } else { + // Normal variable control + uint32_t usage = 0; + unsigned int numOfControls = + (localItems.UsageMinimum != kNotSet && + localItems.UsageMaximum != kNotSet) + ? localItems.UsageMaximum - localItems.UsageMinimum + 1 + : globalItems.reportCount; + for (unsigned int controlIdx = 0; + controlIdx < numOfControls; + controlIdx++) { + if (localItems.UsageMinimum != kNotSet && localItems.UsageMaximum != kNotSet) { + if (controlIdx == 0) { + usage = localItems.UsageMinimum; + } else if (usage < localItems.UsageMaximum) { + usage++; + } + } else if (!localItems.Usage.empty()) { + // If there are less usages than reportCount, + // the last usage value is valid for the remaining + usage = localItems.Usage.front(); + localItems.Usage.erase(localItems.Usage.begin()); + } + auto [lastBytePos, lastBitPos] = currentReport->getLastPosition(); + + Control control(flags, + usage, + globalItems.logicalMinimum, + globalItems.logicalMaximum, + physicalMinimum, + physicalMaximum, + globalItems.unitExponent, + globalItems.unit, + lastBytePos, + lastBitPos, + globalItems.reportSize); + currentReport->addControl(control); + currentReport->increasePosition(globalItems.reportSize); + } + currentReport->increasePosition( + (globalItems.reportCount - numOfControls) * + globalItems.reportSize); + } + + localItems = LocalItems(); + break; + } + + case HidItemTag::Collection: + m_collectionLevel++; + + // We only handle top-level-collections + // according to chapter 8.4 "Report Constraints" HID class definition 1.11 + if (m_collectionLevel == 1) { + DEBUG_ASSERT(payload == static_cast(CollectionType::Application)); + } + // Local items are only valid for the actual control definition, reset them + localItems = LocalItems(); + break; + case HidItemTag::EndCollection: + if (m_collectionLevel == 1) { + if (currentReport) { + collection.addReport(*currentReport); + currentReport.reset(); + } + m_topLevelCollections.push_back(collection); + collection = Collection(); + } + if (m_collectionLevel > 0) { + m_collectionLevel--; + } + break; + + default: + DEBUG_ASSERT(true); + break; + } + } + + if (currentReport) { + collection.addReport(*currentReport); + } + + return collection; +} + +const Report* HIDReportDescriptor::getReport( + const HidReportType& reportType, const uint8_t& reportId) const { + for (auto& collection : m_topLevelCollections) { + const Report* report = collection.getReport(reportType, reportId); + if (report != nullptr) { + return report; + } + } + return nullptr; +} + +const std::vector> +HIDReportDescriptor::getListOfReports() const { + std::vector> orderedList; + for (size_t i = 0; i < m_topLevelCollections.size(); ++i) { + for (const auto& report : m_topLevelCollections[i].getReports()) { + orderedList.emplace_back(i, report.m_reportType, report.m_reportId); + } + } + return orderedList; +} + +} // namespace hid::reportDescriptor diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h new file mode 100644 index 000000000000..eee36e8b17d3 --- /dev/null +++ b/src/controllers/hid/hidreportdescriptor.h @@ -0,0 +1,258 @@ +#pragma once + +#include + +#include +#include +#include +#include + +namespace hid::reportDescriptor { + +Q_NAMESPACE + +QString getScaledUnitString(uint32_t unit); + +constexpr int kNotSet = -1; +// Value used instead of the ReportID, if device don't have ReportIDs +constexpr int kNoReportId = 0x00; + +enum class HidReportType { + Input, + Output, + Feature +}; +Q_ENUM_NS(HidReportType) + +// clang-format off +// Enum class for HID Item Tags (incl. the two type bits) +enum class HidItemTag : uint8_t { + // "Main Items" according to chapter 6.2.2.4 of HID class definition 1.11 + Input = 0b1000'00'00, + Output = 0b1001'00'00, + Feature = 0b1011'00'00, + + Collection = 0b1010'00'00, + EndCollection = 0b1100'00'00, + + // "Global Items" according to chapter 6.2.2.7 of HID class definition 1.11 + UsagePage = 0b0000'01'00, + + LogicalMinimum = 0b0001'01'00, + LogicalMaximum = 0b0010'01'00, + PhysicalMinimum = 0b0011'01'00, + PhysicalMaximum = 0b0100'01'00, + + UnitExponent = 0b0101'01'00, + Unit = 0b0110'01'00, + + ReportSize = 0b0111'01'00, + ReportId = 0b1000'01'00, + ReportCount = 0b1001'01'00, + + Push = 0b1010'01'00, + Pop = 0b1011'01'00, + + // "Local Items" according to chapter 6.2.2.8 of HID class definition 1.11 + Usage = 0b0000'10'00, + UsageMinimum = 0b0001'10'00, + UsageMaximum = 0b0010'10'00, + + DesignatorIndex = 0b0011'10'00, + DesignatorMinimum = 0b0100'10'00, + DesignatorMaximum = 0b0101'10'00, + + StringIndex = 0b0111'10'00, + StringMinimum = 0b1000'10'00, + StringMaximum = 0b1001'10'00, + + Delimiter = 0b1010'10'00, + + + AllTagBitsMask = 0b1111'11'00 +}; + +// Enum class for HID Item Sizes +enum class HidItemSize : uint8_t { + // "Short Items" sizes according to chapter 6.2.2.2 of HID class definition 1.11 + ZeroBytePayload = 0b0000'00'00, + OneBytePayload = 0b0000'00'01, + TwoBytePayload = 0b0000'00'10, + FourBytePayload = 0b0000'00'11, + + + // Special value for "Long Items" according to chapter 6.2.2.3 of HID class definition 1.11 + LongItemKeyword = 0b1111'11'10, + + AllSizeBitsMask = 0b0000'00'11 +}; + +// Collection types according to chapter 6.2.2.6 of HID class definition 1.11 +enum class CollectionType : uint8_t { + Physical = 0x00, // e.g. group of axes + Application = 0x01, // e.g. mouse or keyboard + Logical = 0x02, // interrelated data + Report = 0x03, + NamedArray = 0x04, + UsageSwitch = 0x05, + UsageModifier = 0x06, + Reserved = 0x07, // range of 0x07-0x7F + VendorDefined = 0x80 // range of 0x80-0xFF +}; +// clang-format on + +union ControlFlags { + struct { + uint32_t data_constant : 1; // Data (0) | Constant (1) + uint32_t array_variable : 1; // Array (0) | Variable (1) + uint32_t absolute_relative : 1; // Absolute (0) | Relative (1) + uint32_t no_wrap_wrap : 1; // No Wrap (0) | Wrap (1) + uint32_t linear_non_linear : 1; // Linear (0) | Non Linear (1) + uint32_t preferred_no_preferred : 1; // Preferred State (0) | No Preferred (1) + uint32_t no_null_null : 1; // No Null position (0) | Null state(1) + uint32_t non_volatile_volatile : 1; // Non Volatile (0) | Volatile (1) + uint32_t bit_field_buffered : 1; // Bit Field (0) | Buffered Bytes (1) + uint32_t reserved : 23; + }; + uint32_t payload; +}; + +// Class representing a control described in the HID report descriptor +class Control { + public: + Control(const ControlFlags flags, + const uint32_t usage, + const int32_t logicalMinimum, + const int32_t logicalMaximum, + const int32_t physicalMinimum, + const int32_t physicalMaximum, + const int8_t unitExponent, + const uint32_t unit, + const uint16_t bytePosition, // Position of the first byte in the report + const uint8_t bitPosition, // Position of first bit in first byte + const uint8_t bitSize); + + const ControlFlags m_flags; + + const uint32_t m_usage; + const int32_t m_logicalMinimum; + const int32_t m_logicalMaximum; + const int32_t m_physicalMinimum; + const int32_t m_physicalMaximum; + const int8_t m_unitExponent; + const uint32_t m_unit; + const uint16_t m_bytePosition; // Position of the first byte in the report + const uint8_t m_bitPosition; // Position of first bit in first byte + const uint8_t m_bitSize; + + private: +}; + +int32_t extractLogicalValue(const QByteArray& data, const Control& control); +bool applyLogicalValue(QByteArray& data, const Control& control, int32_t controlValue); + +// Class representing a report in the HID report descriptor +class Report { + public: + Report(const HidReportType& reportType, const uint8_t& reportId); + + void addControl(const Control& item); + void increasePosition(unsigned int bitSize); + std::pair getLastPosition() const { + return {m_lastBytePosition, m_lastBitPosition}; + } + + const std::vector& getControls() const { + return m_controls; + } + + const HidReportType m_reportType; + const uint8_t m_reportId; + uint16_t getReportSize() const { + return m_lastBytePosition; + } + + private: + std::vector m_controls; + uint16_t m_lastBytePosition; + uint8_t m_lastBitPosition; // Last bit position inside last byte +}; + +// Class representing a collection of HID items +class Collection { + public: + Collection() = default; + void addReport(const Report& report); + const Report* getReport(const HidReportType& reportType, const uint8_t& reportId) const; + const std::vector& getReports() const { + return m_reports; + } + + private: + std::vector m_reports; +}; + +// Class for parsing HID report descriptors +class HIDReportDescriptor { + public: + HIDReportDescriptor(const uint8_t* data, size_t length); + + bool isDeviceWithReportIds() const { + return m_deviceHasReportIds; + } + + Collection parse(); + const Report* getReport(const HidReportType& reportType, const uint8_t& reportId) const; + const std::vector> getListOfReports() const; + + private: + // Define the struct for global items + struct GlobalItems { + uint16_t usagePage = 0; + int32_t logicalMinimum = 0; + int32_t logicalMaximum = 0; + int32_t physicalMinimum = 0; + int32_t physicalMaximum = 0; + int8_t unitExponent = 0; + uint32_t unit = 0; + uint32_t reportSize = 0; + uint8_t reportId = 0; + uint32_t reportCount = 0; + }; + + struct LocalItems { + std::vector Usage; + int64_t UsageMinimum = kNotSet; + int64_t UsageMaximum = kNotSet; + int64_t DesignatorIndex = kNotSet; + int64_t DesignatorMinimum = kNotSet; + int64_t DesignatorMaximum = kNotSet; + int64_t StringIndex = kNotSet; + int64_t StringMinimum = kNotSet; + int64_t StringMaximum = kNotSet; + int64_t Delimiter = kNotSet; + }; + + std::pair readTag(); + uint32_t readPayload(HidItemSize payloadSize); + + int32_t getSignedValue(uint32_t payload, HidItemSize payloadSize); + uint32_t getDecodedUsage(uint16_t usagePage, uint32_t usage, HidItemSize usageSize); + + HidReportType getReportType(HidItemTag tag); + + const uint8_t* m_data; + size_t m_length; + size_t m_pos; + + bool m_deviceHasReportIds; + + std::vector globalItemsStack; + + unsigned int m_collectionLevel; + std::vector m_topLevelCollections; +}; + +} // namespace hid::reportDescriptor + +Q_DECLARE_METATYPE(hid::reportDescriptor::Control); diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp new file mode 100644 index 000000000000..e83c8145f4fe --- /dev/null +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -0,0 +1,281 @@ +#include + +#include + +#include "controllers/hid/hidreportdescriptor.h" + +using namespace hid::reportDescriptor; + +// Example HID report descriptor data + +// clang-format off +uint8_t reportDescriptor[] = { + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (1) + 0x29, 0x03, // Usage Maximum (3) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x03, // Report Count (3) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data, Variable, Absolute) + 0x95, 0x01, // Report Count (1) + 0x75, 0x05, // Report Size (5) + 0x81, 0x01, // Input (Constant) + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x02, // Report Count (2) + 0x81, 0x06, // Input (Data, Variable, Relative) + 0xC0, // End Collection + 0xC0 // End Collection +}; +// clang-format on + +TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { + HIDReportDescriptor parser(reportDescriptor, sizeof(reportDescriptor)); + Collection collection = parser.parse(); + + // Use getListOfReports to get the list of reports + auto reportsList = parser.getListOfReports(); + ASSERT_EQ(reportsList.size(), 1); + + auto [collectionIdx, reportType, reportId] = reportsList[0]; + ASSERT_EQ(collectionIdx, 0); + + // Use getReport to get the report + const Report* report = parser.getReport(reportType, reportId); + ASSERT_NE(report, nullptr); + + // Validate Report fields + ASSERT_EQ(report->m_reportType, reportType); + ASSERT_EQ(report->m_reportId, reportId); + + // Validate all Control fields + const std::vector& controls = report->getControls(); + ASSERT_EQ(controls.size(), 5); + + // Mouse Button 1 + ASSERT_EQ(controls[0].m_usage, 0x0009'0001); + ASSERT_EQ(controls[0].m_logicalMinimum, 0); + ASSERT_EQ(controls[0].m_logicalMaximum, 1); + ASSERT_EQ(controls[0].m_physicalMinimum, 0); + ASSERT_EQ(controls[0].m_physicalMaximum, 1); + ASSERT_EQ(controls[0].m_unitExponent, 0); + ASSERT_EQ(controls[0].m_unit, 0); + ASSERT_EQ(controls[0].m_bytePosition, 0); + ASSERT_EQ(controls[0].m_bitPosition, 0); + ASSERT_EQ(controls[0].m_bitSize, 1); + + // Mouse Button 2 + ASSERT_EQ(controls[1].m_usage, 0x0009'0002); + ASSERT_EQ(controls[1].m_logicalMinimum, 0); + ASSERT_EQ(controls[1].m_logicalMaximum, 1); + ASSERT_EQ(controls[1].m_physicalMinimum, 0); + ASSERT_EQ(controls[1].m_physicalMaximum, 1); + ASSERT_EQ(controls[1].m_unitExponent, 0); + ASSERT_EQ(controls[1].m_unit, 0); + ASSERT_EQ(controls[1].m_bytePosition, 0); + ASSERT_EQ(controls[1].m_bitPosition, 1); + ASSERT_EQ(controls[1].m_bitSize, 1); + + // Mouse Button 3 + ASSERT_EQ(controls[2].m_usage, 0x0009'0003); + ASSERT_EQ(controls[2].m_logicalMinimum, 0); + ASSERT_EQ(controls[2].m_logicalMaximum, 1); + ASSERT_EQ(controls[2].m_physicalMinimum, 0); + ASSERT_EQ(controls[2].m_physicalMaximum, 1); + ASSERT_EQ(controls[2].m_unitExponent, 0); + ASSERT_EQ(controls[2].m_unit, 0); + ASSERT_EQ(controls[2].m_bytePosition, 0); + ASSERT_EQ(controls[2].m_bitPosition, 2); + ASSERT_EQ(controls[2].m_bitSize, 1); + + // Mouse Movement X + ASSERT_EQ(controls[3].m_usage, 0x0001'0030); + ASSERT_EQ(controls[3].m_logicalMinimum, -127); + ASSERT_EQ(controls[3].m_logicalMaximum, 127); + ASSERT_EQ(controls[3].m_physicalMinimum, -127); + ASSERT_EQ(controls[3].m_physicalMaximum, 127); + ASSERT_EQ(controls[3].m_unitExponent, 0); + ASSERT_EQ(controls[3].m_unit, 0); + ASSERT_EQ(controls[3].m_bitSize, 8); + ASSERT_EQ(controls[3].m_bytePosition, 1); + ASSERT_EQ(controls[3].m_bitPosition, 0); + + // Mouse Movement Y + ASSERT_EQ(controls[4].m_usage, 0x0001'0031); + ASSERT_EQ(controls[4].m_logicalMinimum, -127); + ASSERT_EQ(controls[4].m_logicalMaximum, 127); + ASSERT_EQ(controls[4].m_physicalMinimum, -127); + ASSERT_EQ(controls[4].m_physicalMaximum, 127); + ASSERT_EQ(controls[4].m_unitExponent, 0); + ASSERT_EQ(controls[4].m_unit, 0); + ASSERT_EQ(controls[4].m_bitSize, 8); + ASSERT_EQ(controls[4].m_bytePosition, 2); + ASSERT_EQ(controls[4].m_bitPosition, 0); +} + +TEST(HIDReportDescriptorTest, ControlValue_1Bit) { + auto reportData = QByteArray::fromHex("81'00'00'FF'01"); + Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 1, // LogicalMaximum + 0, // PhysicalMinimum + 1, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 3, // BytePosition + 0, // BitPosition + 1); // BitSize + + int32_t value = extractLogicalValue(reportData, control); + EXPECT_EQ(value, 0x1); + + bool result = applyLogicalValue(reportData, control, 0); + EXPECT_TRUE(result); + EXPECT_EQ(reportData, QByteArray::fromHex("81'00'00'FE'01")); + + int32_t value2 = extractLogicalValue(reportData, control); + EXPECT_EQ(value2, 0x0); +} + +TEST(HIDReportDescriptorTest, ControlValue_unsigned11Bits) { + auto reportData = QByteArray::fromHex("81'30'46'00'01"); + Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 2047, // LogicalMaximum + 0, // PhysicalMinimum + 2047, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 1, // BytePosition + 2, // BitPosition + 11); // BitSize + + int32_t value = extractLogicalValue(reportData, control); + EXPECT_EQ(value, 0b001'1000'1100); + + bool result = applyLogicalValue(reportData, control, 0b010'1010'1010); + EXPECT_TRUE(result); + EXPECT_EQ(reportData, QByteArray::fromHex("81'A8'4A'00'01")); + + int32_t value2 = extractLogicalValue(reportData, control); + EXPECT_EQ(value2, 0b010'1010'1010); +} + +TEST(HIDReportDescriptorTest, ControlValue_signed11Bits) { + auto reportData = QByteArray::fromHex("AA'BB'CC'DD'EE"); + Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags + 0x0009'0001, // UsagePage/Usage + -1000, // LogicalMinimum + 1000, // LogicalMaximum + -10, // PhysicalMinimum + 10, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 2, // BytePosition + 0, // BitPosition + 11); // BitSize + + int32_t value = extractLogicalValue(reportData, control); + EXPECT_EQ(value, -564); + + bool result = applyLogicalValue(reportData, control, +200); + EXPECT_TRUE(result); + EXPECT_EQ(reportData, QByteArray::fromHex("AA'BB'C8'D8'EE")); + + int32_t value2 = extractLogicalValue(reportData, control); + EXPECT_EQ(value2, +200); + + bool result2 = applyLogicalValue(reportData, control, -200); + EXPECT_TRUE(result2); + EXPECT_EQ(reportData, QByteArray::fromHex("AA'BB'38'DF'EE")); + + int32_t value3 = extractLogicalValue(reportData, control); + EXPECT_EQ(value3, -200); +} + +TEST(HIDReportDescriptorTest, ControlValue_unsigned32Bits) { + auto reportData = QByteArray::fromHex("0A'21'43'65'B7"); + Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 0x7FFFFFFF, // LogicalMaximum + 0, // PhysicalMinimum + 0x7FFFFFFF, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 0, // BytePosition + 4, // BitPosition + 32); // BitSize + + int32_t value = extractLogicalValue(reportData, control); + EXPECT_EQ(value, 0x76'54'32'10); + + bool result = applyLogicalValue(reportData, control, 0x01'23'45'67); + EXPECT_TRUE(result); + EXPECT_EQ(reportData, QByteArray::fromHex("7A'56'34'12'B0")); + + int32_t value2 = extractLogicalValue(reportData, control); + EXPECT_EQ(value2, 0x01'23'45'67); +} + +TEST(HIDReportDescriptorTest, ControlValue_signed32Bits) { + auto reportData = QByteArray::fromHex("0A'21'43'65'B7"); + Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags + 0x0009'0001, // UsagePage/Usage + std::numeric_limits::min(), // LogicalMinimum + std::numeric_limits::max(), // LogicalMaximum + 10, // PhysicalMinimum + 10, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 0, // BytePosition + 4, // BitPosition + 32); // BitSize + + int32_t value = extractLogicalValue(reportData, control); + EXPECT_EQ(value, 0x76'54'32'10); + + bool result = applyLogicalValue(reportData, control, std::numeric_limits::min()); + EXPECT_TRUE(result); + EXPECT_EQ(reportData, QByteArray::fromHex("0A'00'00'00'B8")); + + int32_t value2 = extractLogicalValue(reportData, control); + EXPECT_EQ(value2, std::numeric_limits::min()); + + bool result2 = applyLogicalValue(reportData, control, std::numeric_limits::max()); + EXPECT_TRUE(result2); + EXPECT_EQ(reportData, QByteArray::fromHex("FA'FF'FF'FF'B7")); + + int32_t value3 = extractLogicalValue(reportData, control); + EXPECT_EQ(value3, std::numeric_limits::max()); +} + +TEST(HIDReportDescriptorTest, SetControlValue_OutOfRange) { + auto reportData = QByteArray::fromHex("81'00'00'00'01"); + Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 2047, // LogicalMaximum + 0, // PhysicalMinimum + 2047, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 0, // BytePosition + 0, // BitPosition + 11); // BitSize + + bool result = applyLogicalValue(reportData, control, 3000); + EXPECT_FALSE(result); +} From ebb9ec4fcdef5ebf009162016e4b029a2a68c675 Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 13 May 2025 20:29:31 +0200 Subject: [PATCH 086/163] Prefix all pointers with p --- .../controllerhidreporttabsmanager.cpp | 276 +++++++++--------- .../controllerhidreporttabsmanager.h | 19 +- src/controllers/hid/hidreportdescriptor.cpp | 62 ++-- src/controllers/hid/hidreportdescriptor.h | 4 +- .../controller_hid_reportdescriptor_test.cpp | 10 +- 5 files changed, 192 insertions(+), 179 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 37a614b540b6..58dd561f7703 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -12,9 +12,9 @@ #include "moc_controllerhidreporttabsmanager.cpp" ControllerHidReportTabsManager::ControllerHidReportTabsManager( - QTabWidget* parentTabWidget, HidController* hidController) - : m_pParentControllerTab(parentTabWidget), - m_pHidController(hidController) { + QTabWidget* pParentTabWidget, HidController* pHidController) + : m_pParentControllerTab(pParentTabWidget), + m_pHidController(pHidController) { } void ControllerHidReportTabsManager::createReportTypeTabs() { @@ -36,7 +36,7 @@ void ControllerHidReportTabsManager::createReportTypeTabs() { } } -void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* parentReportTypeTab, +void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentReportTypeTab, hid::reportDescriptor::HidReportType reportType) { const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); if (!reportDescriptorTemp.has_value()) { @@ -56,65 +56,65 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* parentReport .rightJustified(2, '0') .toUpper()); - auto* tabWidget = new QWidget(parentReportTypeTab); - auto* layout = new QVBoxLayout(tabWidget); - auto* topWidgetRow = new QHBoxLayout(); + auto* pTabWidget = new QWidget(pParentReportTypeTab); + auto* pLayout = new QVBoxLayout(pTabWidget); + auto* pTopWidgetRow = new QHBoxLayout(); // Create buttons - auto* readButton = new QPushButton(QStringLiteral("Read"), tabWidget); - auto* sendButton = new QPushButton(QStringLiteral("Send"), tabWidget); + auto* pReadButton = new QPushButton(QStringLiteral("Read"), pTabWidget); + auto* pSendButton = new QPushButton(QStringLiteral("Send"), pTabWidget); // Adjust visibility/enable state based on the report type if (reportType == hid::reportDescriptor::HidReportType::Input) { - sendButton->hide(); - readButton->hide(); + pSendButton->hide(); + pReadButton->hide(); } else if (reportType == hid::reportDescriptor::HidReportType::Output) { - readButton->hide(); + pReadButton->hide(); } - topWidgetRow->addWidget(readButton); - topWidgetRow->addWidget(sendButton); - layout->addLayout(topWidgetRow); + pTopWidgetRow->addWidget(pReadButton); + pTopWidgetRow->addWidget(pSendButton); + pLayout->addLayout(pTopWidgetRow); - auto* table = new QTableWidget(tabWidget); - layout->addWidget(table); + auto* pTable = new QTableWidget(pTabWidget); + pLayout->addWidget(pTable); - auto report = reportDescriptor.getReport(reportType, reportId); - if (report) { + auto* pReport = reportDescriptor.getReport(reportType, reportId); + if (pReport) { // Show payload size - auto* sizeLabel = new QLabel(tabWidget); - sizeLabel->setText( + auto* pSizeLabel = new QLabel(pTabWidget); + pSizeLabel->setText( QStringLiteral("Payload Size: %1 bytes") - .arg(report->getReportSize())); - topWidgetRow->insertWidget(0, sizeLabel); + .arg(pReport->getReportSize())); + pTopWidgetRow->insertWidget(0, pSizeLabel); - populateHidReportTable(table, *report, reportType); + populateHidReportTable(pTable, *pReport, reportType); } if (reportType != hid::reportDescriptor::HidReportType::Output) { - connect(readButton, + connect(pReadButton, &QPushButton::clicked, this, - [this, table, reportId, reportType]() { - slotReadReport(table, reportId, reportType); + [this, pTable, reportId, reportType]() { + slotReadReport(pTable, reportId, reportType); }); // Read once on tab creation - slotReadReport(table, reportId, reportType); + slotReadReport(pTable, reportId, reportType); } if (reportType != hid::reportDescriptor::HidReportType::Input) { - connect(sendButton, + connect(pSendButton, &QPushButton::clicked, this, - [this, table, reportId, reportType]() { - slotSendReport(table, reportId, reportType); + [this, pTable, reportId, reportType]() { + slotSendReport(pTable, reportId, reportType); }); } - parentReportTypeTab->addTab(tabWidget, tabName); + pParentReportTypeTab->addTab(pTabWidget, tabName); if (reportType == hid::reportDescriptor::HidReportType::Input) { - // Store the table pointer associated with the reportId - m_reportIdToTableMap[reportId] = table; + // Store the pTable pointer associated with the reportId + m_reportIdToTableMap[reportId] = pTable; } // Connect the signal for the reportId @@ -128,31 +128,31 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* parentReport } void ControllerHidReportTabsManager::updateTableWithReportData( - QTableWidget* table, + QTableWidget* pTable, const QByteArray& reportData) { // Temporarily disable updates to speed up processing - table->setUpdatesEnabled(false); + pTable->setUpdatesEnabled(false); // Process the report data and update the table - for (int row = 0; row < table->rowCount(); ++row) { - auto* item = table->item(row, 5); // Value column is at index 5 + for (int row = 0; row < pTable->rowCount(); ++row) { + auto* item = pTable->item(row, 5); // Value column is at index 5 if (item) { // Retrieve custom data from the first cell - QVariant customData = table->item(row, 0)->data(Qt::UserRole + 1); + QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { - auto control = + auto pControl = static_cast( customData.value()); // Use the custom data as needed int64_t controlValue = hid::reportDescriptor::extractLogicalValue( - reportData, *control); + reportData, *pControl); item->setText(QString::number(controlValue)); } } } - table->setUpdatesEnabled(true); + pTable->setUpdatesEnabled(true); } void ControllerHidReportTabsManager::slotProcessInputReport( @@ -163,16 +163,17 @@ void ControllerHidReportTabsManager::slotProcessInputReport( qWarning() << "No table found for reportId" << reportId; return; } - QTableWidget* table = it->second; + QTableWidget* pTable = it->second; const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); - auto report = reportDescriptor.getReport(hid::reportDescriptor::HidReportType::Input, reportId); - if (report) { - updateTableWithReportData(table, data); + auto pReport = reportDescriptor.getReport( + hid::reportDescriptor::HidReportType::Input, reportId); + if (pReport) { + updateTableWithReportData(pTable, data); } } -void ControllerHidReportTabsManager::slotReadReport(QTableWidget* table, +void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, quint8 reportId, hid::reportDescriptor::HidReportType reportType) { if (!m_pHidController->isOpen()) { @@ -180,37 +181,38 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* table, return; } - HidControllerJSProxy* jsProxy = static_cast(m_pHidController->jsProxy()); - VERIFY_OR_DEBUG_ASSERT(jsProxy) { + HidControllerJSProxy* pJsProxy = + static_cast(m_pHidController->jsProxy()); + VERIFY_OR_DEBUG_ASSERT(pJsProxy) { return; } const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); - auto report = reportDescriptor.getReport(reportType, reportId); - VERIFY_OR_DEBUG_ASSERT(report) { + auto pReport = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(pReport) { return; } QByteArray reportData; if (reportType == hid::reportDescriptor::HidReportType::Input) { - reportData = jsProxy->getInputReport(reportId); + reportData = pJsProxy->getInputReport(reportId); } else if (reportType == hid::reportDescriptor::HidReportType::Feature) { - reportData = jsProxy->getFeatureReport(reportId); + reportData = pJsProxy->getFeatureReport(reportId); } else { return; } - if (reportData.size() < report->getReportSize()) { + if (reportData.size() < pReport->getReportSize()) { qWarning() << "Failed to get report. Read only " << reportData.size() - << " instead of expected " << report->getReportSize() + << " instead of expected " << pReport->getReportSize() << " bytes."; return; } - updateTableWithReportData(table, reportData); + updateTableWithReportData(pTable, reportData); } -void ControllerHidReportTabsManager::slotSendReport(QTableWidget* table, +void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, quint8 reportId, hid::reportDescriptor::HidReportType reportType) { if (!m_pHidController->isOpen()) { @@ -218,34 +220,35 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* table, return; } - HidControllerJSProxy* jsProxy = static_cast(m_pHidController->jsProxy()); - VERIFY_OR_DEBUG_ASSERT(jsProxy) { + HidControllerJSProxy* pJsProxy = + static_cast(m_pHidController->jsProxy()); + VERIFY_OR_DEBUG_ASSERT(pJsProxy) { return; } const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); - auto report = reportDescriptor.getReport(reportType, reportId); - VERIFY_OR_DEBUG_ASSERT(report) { + auto pReport = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(pReport) { return; } // Create a QByteArray of the size of the report - QByteArray reportData(report->getReportSize(), 0); + QByteArray reportData(pReport->getReportSize(), 0); // Iterate through each row in the table - for (int row = 0; row < table->rowCount(); ++row) { - auto* item = table->item(row, 5); // Value column is at index 5 + for (int row = 0; row < pTable->rowCount(); ++row) { + auto* item = pTable->item(row, 5); // Value column is at index 5 if (item) { // Retrieve custom data from the first cell - QVariant customData = table->item(row, 0)->data(Qt::UserRole + 1); + QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { - auto control = + auto pControl = reinterpret_cast( customData.value()); // Set the control value in the reportData bool success = hid::reportDescriptor::applyLogicalValue( - reportData, *control, item->text().toLongLong()); + reportData, *pControl, item->text().toLongLong()); if (!success) { qWarning() << "Failed to set control value for row" << row; continue; @@ -256,26 +259,26 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* table, // Send the reportData if (reportType == hid::reportDescriptor::HidReportType::Feature) { - jsProxy->sendFeatureReport(reportId, reportData); + pJsProxy->sendFeatureReport(reportId, reportData); } else if (reportType == hid::reportDescriptor::HidReportType::Output) { - jsProxy->sendOutputReport(reportId, reportData); + pJsProxy->sendOutputReport(reportId, reportData); } } void ControllerHidReportTabsManager::populateHidReportTable( - QTableWidget* table, - const hid::reportDescriptor::Report& report, + QTableWidget* pTable, + const hid::reportDescriptor::Report& pReport, hid::reportDescriptor::HidReportType reportType) { // Temporarily disable updates to speed up populating - table->setUpdatesEnabled(false); + pTable->setUpdatesEnabled(false); // Reserve rows up-front - const auto& controls = report.getControls(); - table->setRowCount(static_cast(controls.size())); + const auto& controls = pReport.getControls(); + pTable->setRowCount(static_cast(controls.size())); // Set the delegate once if needed if (reportType != hid::reportDescriptor::HidReportType::Input) { - table->setItemDelegateForColumn(5, new ValueItemDelegate(table)); + pTable->setItemDelegateForColumn(5, new ValueItemDelegate(pTable)); } bool showVolatileColumn = (reportType == hid::reportDescriptor::HidReportType::Feature || @@ -302,9 +305,9 @@ void ControllerHidReportTabsManager::populateHidReportTable( } headers << QStringLiteral("Usage Page") << QStringLiteral("Usage"); - table->setColumnCount(headers.size()); - table->setHorizontalHeaderLabels(headers); - table->verticalHeader()->setVisible(false); + pTable->setColumnCount(headers.size()); + pTable->setHorizontalHeaderLabels(headers); + pTable->verticalHeader()->setVisible(false); // Helpers auto createReadOnlyItem = [](const QString& text, bool rightAlign = false) { @@ -330,90 +333,99 @@ void ControllerHidReportTabsManager::populateHidReportTable( }; int row = 0; - for (const auto& control : controls) { + for (const auto& pControl : controls) { // Column 0 - Byte Position auto* bytePositionItem = createReadOnlyItem(QStringLiteral("0x%1").arg(QString::number( - control.m_bytePosition, 16) + pControl.m_bytePosition, 16) .rightJustified(2, '0') .toUpper()), true); - table->setItem(row, 0, bytePositionItem); + pTable->setItem(row, 0, bytePositionItem); // Store custom data for the row in the first cell bytePositionItem->setData(Qt::UserRole + 1, QVariant::fromValue(reinterpret_cast( const_cast( - &control)))); + &pControl)))); // Column 1 - Bit Position - table->setItem(row, 1, createReadOnlyItem(QString::number(control.m_bitPosition), true)); + pTable->setItem(row, 1, createReadOnlyItem(QString::number(pControl.m_bitPosition), true)); // Column 2 - Bit Size - table->setItem(row, 2, createReadOnlyItem(QString::number(control.m_bitSize), true)); + pTable->setItem(row, 2, createReadOnlyItem(QString::number(pControl.m_bitSize), true)); // Column 3 - Logical Min - table->setItem(row, 3, createReadOnlyItem(QString::number(control.m_logicalMinimum), true)); + pTable->setItem(row, + 3, + createReadOnlyItem( + QString::number(pControl.m_logicalMinimum), true)); // Column 4 - Logical Max - table->setItem(row, 4, createReadOnlyItem(QString::number(control.m_logicalMaximum), true)); + pTable->setItem(row, + 4, + createReadOnlyItem( + QString::number(pControl.m_logicalMaximum), true)); // Column 5 - Value - table->setItem(row, 5, createValueItem(control.m_logicalMinimum, control.m_logicalMaximum)); + pTable->setItem(row, + 5, + createValueItem( + pControl.m_logicalMinimum, pControl.m_logicalMaximum)); // Column 6 - Physical Min - table->setItem(row, + pTable->setItem(row, 6, createReadOnlyItem( - QString::number(control.m_physicalMinimum), true)); + QString::number(pControl.m_physicalMinimum), true)); // Column 7 - Physical Max - table->setItem(row, + pTable->setItem(row, 7, createReadOnlyItem( - QString::number(control.m_physicalMaximum), true)); + QString::number(pControl.m_physicalMaximum), true)); // Column 8 - Unit Scaling - table->setItem(row, + pTable->setItem(row, 8, - createReadOnlyItem(control.m_unitExponent != 0 + createReadOnlyItem(pControl.m_unitExponent != 0 ? QStringLiteral("10^%1").arg( - control.m_unitExponent) + pControl.m_unitExponent) : QString(), true)); // Column 9 - Unit - table->setItem(row, + pTable->setItem(row, 9, createReadOnlyItem(hid::reportDescriptor::getScaledUnitString( - control.m_unit))); + pControl.m_unit))); // Column 10 - Abs/Rel - table->setItem(row, + pTable->setItem(row, 10, - createReadOnlyItem(control.m_flags.absolute_relative + createReadOnlyItem(pControl.m_flags.absolute_relative ? QStringLiteral("Relative") : QStringLiteral("Absolute"))); // Column 11 - Wrap - table->setItem(row, + pTable->setItem(row, 11, - createReadOnlyItem(control.m_flags.no_wrap_wrap + createReadOnlyItem(pControl.m_flags.no_wrap_wrap ? QStringLiteral("Wrap") : QStringLiteral("No Wrap"))); // Column 12 - Linear - table->setItem(row, + pTable->setItem(row, 12, - createReadOnlyItem(control.m_flags.linear_non_linear + createReadOnlyItem(pControl.m_flags.linear_non_linear ? QStringLiteral("Non Linear") : QStringLiteral("Linear"))); // Column 13 - Preferred - table->setItem(row, + pTable->setItem(row, 13, - createReadOnlyItem(control.m_flags.preferred_no_preferred + createReadOnlyItem(pControl.m_flags.preferred_no_preferred ? QStringLiteral("No Preferred") : QStringLiteral("Preferred"))); // Column 14 - Null - table->setItem(row, + pTable->setItem(row, 14, - createReadOnlyItem(control.m_flags.no_null_null + createReadOnlyItem(pControl.m_flags.no_null_null ? QStringLiteral("Null") : QStringLiteral("No Null"))); // Volatile column (if present) int volatileIndex = (showVolatileColumn ? 15 : -1); if (volatileIndex != -1) { - table->setItem(row, + pTable->setItem(row, volatileIndex, - createReadOnlyItem(control.m_flags.non_volatile_volatile + createReadOnlyItem(pControl.m_flags.non_volatile_volatile ? QStringLiteral("Volatile") : QStringLiteral("Non Volatile"))); } @@ -421,15 +433,15 @@ void ControllerHidReportTabsManager::populateHidReportTable( // Usage Page / Usage int usagePageIdx = showVolatileColumn ? 16 : 15; int usageDescIdx = showVolatileColumn ? 17 : 16; - uint16_t usagePage = static_cast((control.m_usage & 0xFFFF0000) >> 16); - uint16_t usage = static_cast(control.m_usage & 0x0000FFFF); + uint16_t usagePage = static_cast((pControl.m_usage & 0xFFFF0000) >> 16); + uint16_t usage = static_cast(pControl.m_usage & 0x0000FFFF); - table->setItem(row, + pTable->setItem(row, usagePageIdx, createReadOnlyItem( mixxx::hid::HidUsageTables::getUsagePageDescription( usagePage))); - table->setItem(row, + pTable->setItem(row, usageDescIdx, createReadOnlyItem( mixxx::hid::HidUsageTables::getUsageDescription( @@ -439,50 +451,50 @@ void ControllerHidReportTabsManager::populateHidReportTable( } // Resize columns to contents once, store width and set column width fixed for performance - for (int colIdx = 0; colIdx < table->columnCount(); ++colIdx) { - table->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::ResizeToContents); + for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { + pTable->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::ResizeToContents); } - QVector columnWidths(table->columnCount()); - for (int colIdx = 0; colIdx < table->columnCount(); ++colIdx) { - columnWidths[colIdx] = table->columnWidth(colIdx); + QVector columnWidths(pTable->columnCount()); + for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { + columnWidths[colIdx] = pTable->columnWidth(colIdx); } // Set the width of the value column (5) to fit 11 digits (int32 minimum in decimal) - QFontMetrics metrics(table->font()); + QFontMetrics metrics(pTable->font()); int width = metrics.horizontalAdvance(QStringLiteral("0").repeated(11)); columnWidths[5] = width; - for (int colIdx = 0; colIdx < table->columnCount(); ++colIdx) { - table->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::Fixed); - table->setColumnWidth(colIdx, columnWidths[colIdx]); + for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { + pTable->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::Fixed); + pTable->setColumnWidth(colIdx, columnWidths[colIdx]); } - table->setUpdatesEnabled(true); + pTable->setUpdatesEnabled(true); } -QWidget* ValueItemDelegate::createEditor(QWidget* parent, +QWidget* ValueItemDelegate::createEditor(QWidget* pParent, const QStyleOptionViewItem&, const QModelIndex& index) const { // Create a line edit restricted by (logical min, logical max) auto dataRange = index.data(Qt::UserRole).value>(); - auto* editor = new QLineEdit(parent); - editor->setValidator(new QIntValidator(dataRange.first, dataRange.second, editor)); - return editor; + auto* pEditor = new QLineEdit(pParent); + pEditor->setValidator(new QIntValidator(dataRange.first, dataRange.second, pEditor)); + return pEditor; } -void ValueItemDelegate::setModelData(QWidget* editor, - QAbstractItemModel* model, +void ValueItemDelegate::setModelData(QWidget* pEditor, + QAbstractItemModel* pModel, const QModelIndex& index) const { - auto* lineEdit = qobject_cast(editor); - if (!lineEdit) { + auto* pLineEdit = qobject_cast(pEditor); + if (!pLineEdit) { return; } // Confirm the text is an integer within the expected range bool ok = false; - const int value = lineEdit->text().toInt(&ok); + const int value = pLineEdit->text().toInt(&ok); if (ok) { auto dataRange = index.data(Qt::UserRole).value>(); if (value >= dataRange.first && value <= dataRange.second) { - model->setData(index, value, Qt::EditRole); + pModel->setData(index, value, Qt::EditRole); } } } diff --git a/src/controllers/controllerhidreporttabsmanager.h b/src/controllers/controllerhidreporttabsmanager.h index 638075a95ad0..a8b23aa1dd4f 100644 --- a/src/controllers/controllerhidreporttabsmanager.h +++ b/src/controllers/controllerhidreporttabsmanager.h @@ -12,19 +12,20 @@ class ControllerHidReportTabsManager : public QObject { Q_OBJECT public: - ControllerHidReportTabsManager(QTabWidget* parentTabWidget, HidController* hidController); + ControllerHidReportTabsManager(QTabWidget* pParentTabWidget, HidController* pHidController); void createReportTypeTabs(); - void createHidReportTab(QTabWidget* parentTab, hid::reportDescriptor::HidReportType reportType); - void slotSendReport(QTableWidget* table, + void createHidReportTab(QTabWidget* pParentTab, + hid::reportDescriptor::HidReportType reportType); + void slotSendReport(QTableWidget* pTable, quint8 reportId, hid::reportDescriptor::HidReportType reportType); - void populateHidReportTable(QTableWidget* table, + void populateHidReportTable(QTableWidget* pTable, const hid::reportDescriptor::Report& report, hid::reportDescriptor::HidReportType reportType); private slots: - void slotReadReport(QTableWidget* table, + void slotReadReport(QTableWidget* pTable, quint8 reportId, hid::reportDescriptor::HidReportType reportType); @@ -32,7 +33,7 @@ class ControllerHidReportTabsManager : public QObject { void slotProcessInputReport(quint8 reportId, const QByteArray& reportData); private: - void updateTableWithReportData(QTableWidget* table, const QByteArray& reportData); + void updateTableWithReportData(QTableWidget* pTable, const QByteArray& reportData); QTabWidget* m_pParentControllerTab; HidController* m_pHidController; std::unordered_map m_reportIdToTableMap; @@ -42,11 +43,11 @@ class ValueItemDelegate : public QStyledItemDelegate { public: using QStyledItemDelegate::QStyledItemDelegate; - QWidget* createEditor(QWidget* parent, + QWidget* createEditor(QWidget* pParent, const QStyleOptionViewItem& option, const QModelIndex& index) const override; - void setModelData(QWidget* editor, - QAbstractItemModel* model, + void setModelData(QWidget* pEditor, + QAbstractItemModel* pModel, const QModelIndex& index) const override; }; diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 809a2b2d82b0..b7d748a35d63 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -88,7 +88,7 @@ bool applyLogicalValue(QByteArray& reportData, const Control& control, int32_t c QString getScaledUnitString(uint32_t unit) { struct UnitInfo { - const char* physicalQuantity[5]; + const char* pPhysicalQuantity[5]; }; const UnitInfo unitInfos[] = { @@ -110,7 +110,7 @@ QString getScaledUnitString(uint32_t unit) { if (!unitString.isEmpty()) { unitString += "*"; } - unitString += unitInfo.physicalQuantity[(unit & 0xF)]; + unitString += unitInfo.pPhysicalQuantity[(unit & 0xF)]; if (exponents[value] != 1) { unitString += "^" + QString::number(exponents[value]); } @@ -185,8 +185,8 @@ const Report* Collection::getReport( } // HID Report Descriptor Parser -HIDReportDescriptor::HIDReportDescriptor(const uint8_t* data, size_t length) - : m_data(data), +HIDReportDescriptor::HIDReportDescriptor(const uint8_t* pData, size_t length) + : m_pData(pData), m_length(length), m_pos(0), m_deviceHasReportIds(kNotSet), @@ -194,7 +194,7 @@ HIDReportDescriptor::HIDReportDescriptor(const uint8_t* data, size_t length) } std::pair HIDReportDescriptor::readTag() { - uint8_t byte = m_data[m_pos++]; + uint8_t byte = m_pData[m_pos++]; VERIFY_OR_DEBUG_ASSERT(byte != static_cast(HidItemSize::LongItemKeyword)){ @@ -220,22 +220,22 @@ uint32_t HIDReportDescriptor::readPayload(HidItemSize payloadSize) { VERIFY_OR_DEBUG_ASSERT(m_pos + 1 <= m_length) { return 0; } - return m_data[m_pos++]; + return m_pData[m_pos++]; case HidItemSize::TwoBytePayload: VERIFY_OR_DEBUG_ASSERT(m_pos + 2 <= m_length) { return 0; } - payload = m_data[m_pos++]; - payload |= m_data[m_pos++] << 8; + payload = m_pData[m_pos++]; + payload |= m_pData[m_pos++] << 8; return payload; case HidItemSize::FourBytePayload: VERIFY_OR_DEBUG_ASSERT(m_pos + 4 <= m_length) { return 0; } - payload = m_data[m_pos++]; - payload |= m_data[m_pos++] << 8; - payload |= m_data[m_pos++] << 16; - payload |= m_data[m_pos++] << 24; + payload = m_pData[m_pos++]; + payload |= m_pData[m_pos++] << 8; + payload |= m_pData[m_pos++] << 16; + payload |= m_pData[m_pos++] << 24; return payload; default: DEBUG_ASSERT(true); @@ -297,8 +297,8 @@ HidReportType HIDReportDescriptor::getReportType(HidItemTag tag) { } Collection HIDReportDescriptor::parse() { - Collection collection; // Top level collection - std::unique_ptr currentReport = nullptr; // Use a unique_ptr for currentReport + Collection collection; // Top level collection + std::unique_ptr pCurrentReport = nullptr; // Use a unique_ptr for pCurrentReport // Global item values GlobalItems globalItems; @@ -394,19 +394,19 @@ Collection HIDReportDescriptor::parse() { case HidItemTag::Input: case HidItemTag::Output: case HidItemTag::Feature: { - if (currentReport == nullptr) { + if (pCurrentReport == nullptr) { // First control of this device if (globalItems.reportId == kNoReportId) { m_deviceHasReportIds = false; } else { m_deviceHasReportIds = true; } - currentReport = std::make_unique(getReportType(tag), globalItems.reportId); - } else if (currentReport->m_reportType != getReportType(tag) || - globalItems.reportId != currentReport->m_reportId) { + pCurrentReport = std::make_unique(getReportType(tag), globalItems.reportId); + } else if (pCurrentReport->m_reportType != getReportType(tag) || + globalItems.reportId != pCurrentReport->m_reportId) { // First control of a new report - collection.addReport(*currentReport); - currentReport = std::make_unique(getReportType(tag), globalItems.reportId); + collection.addReport(*pCurrentReport); + pCurrentReport = std::make_unique(getReportType(tag), globalItems.reportId); } int32_t physicalMinimum, physicalMaximum; @@ -424,12 +424,12 @@ Collection HIDReportDescriptor::parse() { if (flags.data_constant == 1) { // Constant value padding - Usually for byte alignment - currentReport->increasePosition(globalItems.reportSize * globalItems.reportCount); + pCurrentReport->increasePosition(globalItems.reportSize * globalItems.reportCount); } else if (flags.array_variable == 0) { // Array (e.g. list of pressed keys of a computer keyboard) // NOT IMPLEMENTED as not relevant for mapping wizard, // but could be implemented by overloaded Control class - currentReport->increasePosition(globalItems.reportSize * globalItems.reportCount); + pCurrentReport->increasePosition(globalItems.reportSize * globalItems.reportCount); } else { // Normal variable control uint32_t usage = 0; @@ -453,7 +453,7 @@ Collection HIDReportDescriptor::parse() { usage = localItems.Usage.front(); localItems.Usage.erase(localItems.Usage.begin()); } - auto [lastBytePos, lastBitPos] = currentReport->getLastPosition(); + auto [lastBytePos, lastBitPos] = pCurrentReport->getLastPosition(); Control control(flags, usage, @@ -466,10 +466,10 @@ Collection HIDReportDescriptor::parse() { lastBytePos, lastBitPos, globalItems.reportSize); - currentReport->addControl(control); - currentReport->increasePosition(globalItems.reportSize); + pCurrentReport->addControl(control); + pCurrentReport->increasePosition(globalItems.reportSize); } - currentReport->increasePosition( + pCurrentReport->increasePosition( (globalItems.reportCount - numOfControls) * globalItems.reportSize); } @@ -491,9 +491,9 @@ Collection HIDReportDescriptor::parse() { break; case HidItemTag::EndCollection: if (m_collectionLevel == 1) { - if (currentReport) { - collection.addReport(*currentReport); - currentReport.reset(); + if (pCurrentReport) { + collection.addReport(*pCurrentReport); + pCurrentReport.reset(); } m_topLevelCollections.push_back(collection); collection = Collection(); @@ -509,8 +509,8 @@ Collection HIDReportDescriptor::parse() { } } - if (currentReport) { - collection.addReport(*currentReport); + if (pCurrentReport) { + collection.addReport(*pCurrentReport); } return collection; diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index eee36e8b17d3..5767a4fd7259 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -195,7 +195,7 @@ class Collection { // Class for parsing HID report descriptors class HIDReportDescriptor { public: - HIDReportDescriptor(const uint8_t* data, size_t length); + HIDReportDescriptor(const uint8_t* pData, size_t length); bool isDeviceWithReportIds() const { return m_deviceHasReportIds; @@ -241,7 +241,7 @@ class HIDReportDescriptor { HidReportType getReportType(HidItemTag tag); - const uint8_t* m_data; + const uint8_t* m_pData; size_t m_length; size_t m_pos; diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp index e83c8145f4fe..d1d40a49082b 100644 --- a/src/test/controller_hid_reportdescriptor_test.cpp +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -51,15 +51,15 @@ TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { ASSERT_EQ(collectionIdx, 0); // Use getReport to get the report - const Report* report = parser.getReport(reportType, reportId); - ASSERT_NE(report, nullptr); + const Report* pReport = parser.getReport(reportType, reportId); + ASSERT_NE(pReport, nullptr); // Validate Report fields - ASSERT_EQ(report->m_reportType, reportType); - ASSERT_EQ(report->m_reportId, reportId); + ASSERT_EQ(pReport->m_reportType, reportType); + ASSERT_EQ(pReport->m_reportId, reportId); // Validate all Control fields - const std::vector& controls = report->getControls(); + const std::vector& controls = pReport->getControls(); ASSERT_EQ(controls.size(), 5); // Mouse Button 1 From 1bb21b9899179a8489e5dfae9129b7eb69742a16 Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 13 May 2025 20:38:02 +0200 Subject: [PATCH 087/163] Adjusted the type of the pointer `pReport` from auto to `const auto*`. Moved line closer to usage --- src/controllers/controllerhidreporttabsmanager.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 58dd561f7703..61830d314076 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -79,7 +79,7 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor auto* pTable = new QTableWidget(pTabWidget); pLayout->addWidget(pTable); - auto* pReport = reportDescriptor.getReport(reportType, reportId); + const auto* pReport = reportDescriptor.getReport(reportType, reportId); if (pReport) { // Show payload size auto* pSizeLabel = new QLabel(pTabWidget); @@ -187,12 +187,6 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, return; } - const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); - auto pReport = reportDescriptor.getReport(reportType, reportId); - VERIFY_OR_DEBUG_ASSERT(pReport) { - return; - } - QByteArray reportData; if (reportType == hid::reportDescriptor::HidReportType::Input) { reportData = pJsProxy->getInputReport(reportId); @@ -202,6 +196,11 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, return; } + const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + const auto* pReport = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(pReport) { + return; + } if (reportData.size() < pReport->getReportSize()) { qWarning() << "Failed to get report. Read only " << reportData.size() << " instead of expected " << pReport->getReportSize() From e889a4fe4ea32f8a5056656e5f2d99dc77e01fdb Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 13 May 2025 21:45:52 +0200 Subject: [PATCH 088/163] Replace getLastPosition() with pair return type by seperated getLastBytePosition() and getLastBitPosition() --- src/controllers/hid/hidreportdescriptor.cpp | 5 ++--- src/controllers/hid/hidreportdescriptor.h | 7 +++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index b7d748a35d63..958952da9111 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -453,7 +453,6 @@ Collection HIDReportDescriptor::parse() { usage = localItems.Usage.front(); localItems.Usage.erase(localItems.Usage.begin()); } - auto [lastBytePos, lastBitPos] = pCurrentReport->getLastPosition(); Control control(flags, usage, @@ -463,8 +462,8 @@ Collection HIDReportDescriptor::parse() { physicalMaximum, globalItems.unitExponent, globalItems.unit, - lastBytePos, - lastBitPos, + pCurrentReport->getLastBytePosition(), + pCurrentReport->getLastBitPosition(), globalItems.reportSize); pCurrentReport->addControl(control); pCurrentReport->increasePosition(globalItems.reportSize); diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index 5767a4fd7259..87b0807bec43 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -158,8 +158,11 @@ class Report { void addControl(const Control& item); void increasePosition(unsigned int bitSize); - std::pair getLastPosition() const { - return {m_lastBytePosition, m_lastBitPosition}; + uint16_t getLastBytePosition() const { + return m_lastBytePosition; + } + uint8_t getLastBitPosition() const { + return m_lastBitPosition; } const std::vector& getControls() const { From 32f743c7558c6199e3705efe99b14d6af082a6bc Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 13 May 2025 21:55:18 +0200 Subject: [PATCH 089/163] Simplified metaEnum access --- src/controllers/controllerhidreporttabsmanager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 61830d314076..8b9e92efa52d 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -29,8 +29,7 @@ void ControllerHidReportTabsManager::createReportTypeTabs() { createHidReportTab(reportTypeTab.get(), reportType); if (reportTypeTab->count() > 0) { QString tabName = QStringLiteral("%1 Reports") - .arg(metaEnum.valueToKey( - static_cast(reportType))); + .arg(metaEnum.key(reportTypeIdx)); m_pParentControllerTab->addTab(reportTypeTab.release(), tabName); } } From 77bfdd3afa15377252ad861dd6637820080d0241 Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 13 May 2025 21:58:19 +0200 Subject: [PATCH 090/163] Make physicalMinimum an physicalMaximum definition easier to maintain --- src/controllers/hid/hidreportdescriptor.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 958952da9111..f64703f376dd 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -409,7 +409,8 @@ Collection HIDReportDescriptor::parse() { pCurrentReport = std::make_unique(getReportType(tag), globalItems.reportId); } - int32_t physicalMinimum, physicalMaximum; + int32_t physicalMinimum; + int32_t physicalMaximum; if (globalItems.physicalMinimum == 0 && globalItems.physicalMaximum == 0) { // According remark in chapter 6.2.2.7 of HID class definition 1.11 physicalMinimum = globalItems.logicalMinimum; From dadcedac7e462b23d4dae837a114b2ca6daa64d4 Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 13 May 2025 23:46:33 +0200 Subject: [PATCH 091/163] Replace redundant unique_ptr with parented pointer --- src/controllers/controllerhidreporttabsmanager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 8b9e92efa52d..873eb004cf61 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -18,19 +18,19 @@ ControllerHidReportTabsManager::ControllerHidReportTabsManager( } void ControllerHidReportTabsManager::createReportTypeTabs() { - auto reportTypeTabs = std::make_unique(m_pParentControllerTab); + auto reportTypeTabs = make_parented(m_pParentControllerTab); QMetaEnum metaEnum = QMetaEnum::fromType(); for (int reportTypeIdx = 0; reportTypeIdx < metaEnum.keyCount(); ++reportTypeIdx) { auto reportType = static_cast( metaEnum.value(reportTypeIdx)); - auto reportTypeTab = std::make_unique(reportTypeTabs.get()); + auto reportTypeTab = make_parented(reportTypeTabs.get()); createHidReportTab(reportTypeTab.get(), reportType); if (reportTypeTab->count() > 0) { QString tabName = QStringLiteral("%1 Reports") .arg(metaEnum.key(reportTypeIdx)); - m_pParentControllerTab->addTab(reportTypeTab.release(), tabName); + m_pParentControllerTab->addTab(std::move(reportTypeTab), tabName); } } } From b51509dd848f726aed5244c180cff18c9bd16e83 Mon Sep 17 00:00:00 2001 From: Joerg Date: Wed, 14 May 2025 00:44:13 +0200 Subject: [PATCH 092/163] Added reference to unit table Use only official physical unit symbols - which are not translateable --- src/controllers/hid/hidreportdescriptor.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index f64703f376dd..901941ca71ef 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -91,8 +91,11 @@ QString getScaledUnitString(uint32_t unit) { const char* pPhysicalQuantity[5]; }; + // This table of physical units is derived from the unit item table + // in chapter 6.2.2.7 of HID class definition 1.11 + // These official unit symbols are not translateable const UnitInfo unitInfos[] = { - {"", "cm", "radian", "inch", "degree"}, + {"", "cm", "rad", "″", "°"}, // length/angle {"", "g", "g", "slug", "slug"}, // mass {"", "s", "s", "s", "s"}, // time {"", "K", "K", "°F", "°F"}, // temperature From 629c83d13dc66b81a6475598ec205f8e65c89fd8 Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 15 May 2025 08:55:00 +0200 Subject: [PATCH 093/163] Replaced union by std::bit_cast --- src/controllers/hid/hidreportdescriptor.cpp | 3 +- src/controllers/hid/hidreportdescriptor.h | 25 ++-- .../controller_hid_reportdescriptor_test.cpp | 132 +++++++++--------- 3 files changed, 78 insertions(+), 82 deletions(-) diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 901941ca71ef..bb19b8732a1d 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -423,8 +423,7 @@ Collection HIDReportDescriptor::parse() { physicalMaximum = globalItems.physicalMaximum; } - ControlFlags flags; - flags.payload = payload; + auto flags = std::bit_cast(payload); if (flags.data_constant == 1) { // Constant value padding - Usually for byte alignment diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index 87b0807bec43..a13cd4bbd2b3 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -101,20 +101,17 @@ enum class CollectionType : uint8_t { }; // clang-format on -union ControlFlags { - struct { - uint32_t data_constant : 1; // Data (0) | Constant (1) - uint32_t array_variable : 1; // Array (0) | Variable (1) - uint32_t absolute_relative : 1; // Absolute (0) | Relative (1) - uint32_t no_wrap_wrap : 1; // No Wrap (0) | Wrap (1) - uint32_t linear_non_linear : 1; // Linear (0) | Non Linear (1) - uint32_t preferred_no_preferred : 1; // Preferred State (0) | No Preferred (1) - uint32_t no_null_null : 1; // No Null position (0) | Null state(1) - uint32_t non_volatile_volatile : 1; // Non Volatile (0) | Volatile (1) - uint32_t bit_field_buffered : 1; // Bit Field (0) | Buffered Bytes (1) - uint32_t reserved : 23; - }; - uint32_t payload; +struct ControlFlags { + uint32_t data_constant : 1; // Data (0) | Constant (1) + uint32_t array_variable : 1; // Array (0) | Variable (1) + uint32_t absolute_relative : 1; // Absolute (0) | Relative (1) + uint32_t no_wrap_wrap : 1; // No Wrap (0) | Wrap (1) + uint32_t linear_non_linear : 1; // Linear (0) | Non Linear (1) + uint32_t preferred_no_preferred : 1; // Preferred State (0) | No Preferred (1) + uint32_t no_null_null : 1; // No Null position (0) | Null state(1) + uint32_t non_volatile_volatile : 1; // Non Volatile (0) | Volatile (1) + uint32_t bit_field_buffered : 1; // Bit Field (0) | Buffered Bytes (1) + uint32_t reserved : 23; }; // Class representing a control described in the HID report descriptor diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp index d1d40a49082b..9c5ee6967168 100644 --- a/src/test/controller_hid_reportdescriptor_test.cpp +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -125,17 +125,17 @@ TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { TEST(HIDReportDescriptorTest, ControlValue_1Bit) { auto reportData = QByteArray::fromHex("81'00'00'FF'01"); - Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags - 0x0009'0001, // UsagePage/Usage - 0, // LogicalMinimum - 1, // LogicalMaximum - 0, // PhysicalMinimum - 1, // PhysicalMaximum - 0, // UnitExponent - 0, // Unit - 3, // BytePosition - 0, // BitPosition - 1); // BitSize + Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 1, // LogicalMaximum + 0, // PhysicalMinimum + 1, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 3, // BytePosition + 0, // BitPosition + 1); // BitSize int32_t value = extractLogicalValue(reportData, control); EXPECT_EQ(value, 0x1); @@ -150,17 +150,17 @@ TEST(HIDReportDescriptorTest, ControlValue_1Bit) { TEST(HIDReportDescriptorTest, ControlValue_unsigned11Bits) { auto reportData = QByteArray::fromHex("81'30'46'00'01"); - Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags - 0x0009'0001, // UsagePage/Usage - 0, // LogicalMinimum - 2047, // LogicalMaximum - 0, // PhysicalMinimum - 2047, // PhysicalMaximum - 0, // UnitExponent - 0, // Unit - 1, // BytePosition - 2, // BitPosition - 11); // BitSize + Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 2047, // LogicalMaximum + 0, // PhysicalMinimum + 2047, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 1, // BytePosition + 2, // BitPosition + 11); // BitSize int32_t value = extractLogicalValue(reportData, control); EXPECT_EQ(value, 0b001'1000'1100); @@ -175,17 +175,17 @@ TEST(HIDReportDescriptorTest, ControlValue_unsigned11Bits) { TEST(HIDReportDescriptorTest, ControlValue_signed11Bits) { auto reportData = QByteArray::fromHex("AA'BB'CC'DD'EE"); - Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags - 0x0009'0001, // UsagePage/Usage - -1000, // LogicalMinimum - 1000, // LogicalMaximum - -10, // PhysicalMinimum - 10, // PhysicalMaximum - 0, // UnitExponent - 0, // Unit - 2, // BytePosition - 0, // BitPosition - 11); // BitSize + Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags + 0x0009'0001, // UsagePage/Usage + -1000, // LogicalMinimum + 1000, // LogicalMaximum + -10, // PhysicalMinimum + 10, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 2, // BytePosition + 0, // BitPosition + 11); // BitSize int32_t value = extractLogicalValue(reportData, control); EXPECT_EQ(value, -564); @@ -207,17 +207,17 @@ TEST(HIDReportDescriptorTest, ControlValue_signed11Bits) { TEST(HIDReportDescriptorTest, ControlValue_unsigned32Bits) { auto reportData = QByteArray::fromHex("0A'21'43'65'B7"); - Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags - 0x0009'0001, // UsagePage/Usage - 0, // LogicalMinimum - 0x7FFFFFFF, // LogicalMaximum - 0, // PhysicalMinimum - 0x7FFFFFFF, // PhysicalMaximum - 0, // UnitExponent - 0, // Unit - 0, // BytePosition - 4, // BitPosition - 32); // BitSize + Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 0x7FFFFFFF, // LogicalMaximum + 0, // PhysicalMinimum + 0x7FFFFFFF, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 0, // BytePosition + 4, // BitPosition + 32); // BitSize int32_t value = extractLogicalValue(reportData, control); EXPECT_EQ(value, 0x76'54'32'10); @@ -232,17 +232,17 @@ TEST(HIDReportDescriptorTest, ControlValue_unsigned32Bits) { TEST(HIDReportDescriptorTest, ControlValue_signed32Bits) { auto reportData = QByteArray::fromHex("0A'21'43'65'B7"); - Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags - 0x0009'0001, // UsagePage/Usage - std::numeric_limits::min(), // LogicalMinimum - std::numeric_limits::max(), // LogicalMaximum - 10, // PhysicalMinimum - 10, // PhysicalMaximum - 0, // UnitExponent - 0, // Unit - 0, // BytePosition - 4, // BitPosition - 32); // BitSize + Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags + 0x0009'0001, // UsagePage/Usage + std::numeric_limits::min(), // LogicalMinimum + std::numeric_limits::max(), // LogicalMaximum + 10, // PhysicalMinimum + 10, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 0, // BytePosition + 4, // BitPosition + 32); // BitSize int32_t value = extractLogicalValue(reportData, control); EXPECT_EQ(value, 0x76'54'32'10); @@ -264,17 +264,17 @@ TEST(HIDReportDescriptorTest, ControlValue_signed32Bits) { TEST(HIDReportDescriptorTest, SetControlValue_OutOfRange) { auto reportData = QByteArray::fromHex("81'00'00'00'01"); - Control control({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, // Flags - 0x0009'0001, // UsagePage/Usage - 0, // LogicalMinimum - 2047, // LogicalMaximum - 0, // PhysicalMinimum - 2047, // PhysicalMaximum - 0, // UnitExponent - 0, // Unit - 0, // BytePosition - 0, // BitPosition - 11); // BitSize + Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags + 0x0009'0001, // UsagePage/Usage + 0, // LogicalMinimum + 2047, // LogicalMaximum + 0, // PhysicalMinimum + 2047, // PhysicalMaximum + 0, // UnitExponent + 0, // Unit + 0, // BytePosition + 0, // BitPosition + 11); // BitSize bool result = applyLogicalValue(reportData, control, 3000); EXPECT_FALSE(result); From ccc5b0d09eac956d70ea77f49609c3f9b8d81876 Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 15 May 2025 22:05:50 +0200 Subject: [PATCH 094/163] Fix clang-tidy warnings --- src/controllers/controllerhidreporttabsmanager.cpp | 12 ++++++------ src/controllers/hid/hidreportdescriptor.cpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 873eb004cf61..07b4dfd5dc26 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -139,7 +139,7 @@ void ControllerHidReportTabsManager::updateTableWithReportData( // Retrieve custom data from the first cell QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { - auto pControl = + const auto* pControl = static_cast( customData.value()); // Use the custom data as needed @@ -165,7 +165,7 @@ void ControllerHidReportTabsManager::slotProcessInputReport( QTableWidget* pTable = it->second; const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); - auto pReport = reportDescriptor.getReport( + const auto* pReport = reportDescriptor.getReport( hid::reportDescriptor::HidReportType::Input, reportId); if (pReport) { updateTableWithReportData(pTable, data); @@ -226,7 +226,7 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); - auto pReport = reportDescriptor.getReport(reportType, reportId); + const auto* pReport = reportDescriptor.getReport(reportType, reportId); VERIFY_OR_DEBUG_ASSERT(pReport) { return; } @@ -241,9 +241,9 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, // Retrieve custom data from the first cell QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { - auto pControl = - reinterpret_cast( - customData.value()); + const auto* pControl = + static_cast( + customData.value()); // Set the control value in the reportData bool success = hid::reportDescriptor::applyLogicalValue( reportData, *pControl, item->text().toLongLong()); diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index bb19b8732a1d..267b72357d36 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -179,7 +179,7 @@ void Collection::addReport(const Report& report) { } const Report* Collection::getReport( const HidReportType& reportType, const uint8_t& reportId) const { - for (auto& report : m_reports) { + for (const auto& report : m_reports) { if (report.m_reportType == reportType && report.m_reportId == reportId) { return &report; } @@ -520,7 +520,7 @@ Collection HIDReportDescriptor::parse() { const Report* HIDReportDescriptor::getReport( const HidReportType& reportType, const uint8_t& reportId) const { - for (auto& collection : m_topLevelCollections) { + for (const auto& collection : m_topLevelCollections) { const Report* report = collection.getReport(reportType, reportId); if (report != nullptr) { return report; From 9a5140e6e18b3654bdc87b7b2303ebc4f981c3a4 Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 15 May 2025 23:27:22 +0200 Subject: [PATCH 095/163] Updated custom data retrieval in ControllerHidReportTabsManager with Q_DECLARE_METATYPE. --- src/controllers/controllerhidreporttabsmanager.cpp | 12 +++--------- src/controllers/dlgprefcontroller.cpp | 2 ++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 07b4dfd5dc26..bfec6cd6527b 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -139,9 +139,7 @@ void ControllerHidReportTabsManager::updateTableWithReportData( // Retrieve custom data from the first cell QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { - const auto* pControl = - static_cast( - customData.value()); + const auto* pControl = customData.value(); // Use the custom data as needed int64_t controlValue = hid::reportDescriptor::extractLogicalValue( @@ -241,9 +239,7 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, // Retrieve custom data from the first cell QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { - const auto* pControl = - static_cast( - customData.value()); + const auto* pControl = customData.value(); // Set the control value in the reportData bool success = hid::reportDescriptor::applyLogicalValue( reportData, *pControl, item->text().toLongLong()); @@ -341,9 +337,7 @@ void ControllerHidReportTabsManager::populateHidReportTable( pTable->setItem(row, 0, bytePositionItem); // Store custom data for the row in the first cell bytePositionItem->setData(Qt::UserRole + 1, - QVariant::fromValue(reinterpret_cast( - const_cast( - &pControl)))); + QVariant::fromValue(&pControl)); // Column 1 - Bit Position pTable->setItem(row, 1, createReadOnlyItem(QString::number(pControl.m_bitPosition), true)); diff --git a/src/controllers/dlgprefcontroller.cpp b/src/controllers/dlgprefcontroller.cpp index 8be4deabce41..2e56b6a3f766 100644 --- a/src/controllers/dlgprefcontroller.cpp +++ b/src/controllers/dlgprefcontroller.cpp @@ -92,6 +92,8 @@ DlgPrefController::DlgPrefController( m_settingsTabIndex(-1), m_screensTabIndex(-1), m_hidReportTabsManager(nullptr) { + qRegisterMetaType(); + m_ui.setupUi(this); // Create text color for the file and wiki links createLinkColor(); From ce0d42f221c18b93cc3337dc71e6a63d8d9c239e Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 15 May 2025 23:43:04 +0200 Subject: [PATCH 096/163] Renamed some symbols for consistency --- .../controllerhidreporttabsmanager.cpp | 21 ++++++++++--------- src/controllers/hid/hidcontroller.cpp | 2 +- src/controllers/hid/hidcontroller.h | 4 ++-- src/controllers/hid/hidreportdescriptor.cpp | 18 ++++++++-------- src/controllers/hid/hidreportdescriptor.h | 4 ++-- .../controller_hid_reportdescriptor_test.cpp | 14 ++++++------- 6 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index bfec6cd6527b..8d7f1eeb46c8 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -134,8 +134,8 @@ void ControllerHidReportTabsManager::updateTableWithReportData( // Process the report data and update the table for (int row = 0; row < pTable->rowCount(); ++row) { - auto* item = pTable->item(row, 5); // Value column is at index 5 - if (item) { + auto* pItem = pTable->item(row, 5); // Value column is at index 5 + if (pItem) { // Retrieve custom data from the first cell QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { @@ -144,7 +144,7 @@ void ControllerHidReportTabsManager::updateTableWithReportData( int64_t controlValue = hid::reportDescriptor::extractLogicalValue( reportData, *pControl); - item->setText(QString::number(controlValue)); + pItem->setText(QString::number(controlValue)); } } } @@ -234,15 +234,15 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, // Iterate through each row in the table for (int row = 0; row < pTable->rowCount(); ++row) { - auto* item = pTable->item(row, 5); // Value column is at index 5 - if (item) { + auto* pItem = pTable->item(row, 5); // Value column is at index 5 + if (pItem) { // Retrieve custom data from the first cell QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { const auto* pControl = customData.value(); // Set the control value in the reportData bool success = hid::reportDescriptor::applyLogicalValue( - reportData, *pControl, item->text().toLongLong()); + reportData, *pControl, pItem->text().toLongLong()); if (!success) { qWarning() << "Failed to set control value for row" << row; continue; @@ -329,10 +329,11 @@ void ControllerHidReportTabsManager::populateHidReportTable( int row = 0; for (const auto& pControl : controls) { // Column 0 - Byte Position - auto* bytePositionItem = createReadOnlyItem(QStringLiteral("0x%1").arg(QString::number( - pControl.m_bytePosition, 16) - .rightJustified(2, '0') - .toUpper()), + QTableWidgetItem* bytePositionItem = createReadOnlyItem( + QStringLiteral("0x%1").arg( + QString::number(pControl.m_bytePosition, 16) + .rightJustified(2, '0') + .toUpper()), true); pTable->setItem(row, 0, bytePositionItem); // Store custom data for the row in the first cell diff --git a/src/controllers/hid/hidcontroller.cpp b/src/controllers/hid/hidcontroller.cpp index 37e4489594d7..8e74b93a3c1a 100644 --- a/src/controllers/hid/hidcontroller.cpp +++ b/src/controllers/hid/hidcontroller.cpp @@ -165,7 +165,7 @@ int HidController::open(const QString& resourcePath) { m_rawReportDescriptor = m_deviceInfo.fetchRawReportDescriptor(pHidDevice); if (m_rawReportDescriptor.has_value()) { - m_reportDescriptor = hid::reportDescriptor::HIDReportDescriptor( + m_reportDescriptor = hid::reportDescriptor::HidReportDescriptor( m_rawReportDescriptor->data(), m_rawReportDescriptor->size()); m_reportDescriptor->parse(); m_deviceHasReportIds = m_reportDescriptor->isDeviceWithReportIds(); diff --git a/src/controllers/hid/hidcontroller.h b/src/controllers/hid/hidcontroller.h index 383503eb9341..eb7b236d749c 100644 --- a/src/controllers/hid/hidcontroller.h +++ b/src/controllers/hid/hidcontroller.h @@ -72,7 +72,7 @@ class HidController final : public Controller { return m_deviceInfo.getUsageDescription(); } - const std::optional& getReportDescriptor() const { + const std::optional& getReportDescriptor() const { return m_reportDescriptor; } @@ -100,7 +100,7 @@ class HidController final : public Controller { mixxx::hid::DeviceInfo m_deviceInfo; // These optional members are not set before opening the device std::optional> m_rawReportDescriptor; - std::optional m_reportDescriptor; + std::optional m_reportDescriptor; std::optional m_deviceHasReportIds; std::unique_ptr m_pHidIoThread; diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 267b72357d36..4c0a3852783c 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -188,7 +188,7 @@ const Report* Collection::getReport( } // HID Report Descriptor Parser -HIDReportDescriptor::HIDReportDescriptor(const uint8_t* pData, size_t length) +HidReportDescriptor::HidReportDescriptor(const uint8_t* pData, size_t length) : m_pData(pData), m_length(length), m_pos(0), @@ -196,7 +196,7 @@ HIDReportDescriptor::HIDReportDescriptor(const uint8_t* pData, size_t length) m_collectionLevel(0) { } -std::pair HIDReportDescriptor::readTag() { +std::pair HidReportDescriptor::readTag() { uint8_t byte = m_pData[m_pos++]; VERIFY_OR_DEBUG_ASSERT(byte != @@ -213,7 +213,7 @@ std::pair HIDReportDescriptor::readTag() { return {tag, size}; } -uint32_t HIDReportDescriptor::readPayload(HidItemSize payloadSize) { +uint32_t HidReportDescriptor::readPayload(HidItemSize payloadSize) { uint32_t payload; switch (payloadSize) { @@ -246,7 +246,7 @@ uint32_t HIDReportDescriptor::readPayload(HidItemSize payloadSize) { } } -int32_t HIDReportDescriptor::getSignedValue(uint32_t payload, HidItemSize payloadSize) { +int32_t HidReportDescriptor::getSignedValue(uint32_t payload, HidItemSize payloadSize) { switch (payloadSize) { case HidItemSize::ZeroBytePayload: return 0; @@ -268,7 +268,7 @@ int32_t HIDReportDescriptor::getSignedValue(uint32_t payload, HidItemSize payloa } } -uint32_t HIDReportDescriptor::getDecodedUsage( +uint32_t HidReportDescriptor::getDecodedUsage( uint16_t usagePage, uint32_t usage, HidItemSize usageSize) { switch (usageSize) { case HidItemSize::ZeroBytePayload: @@ -284,7 +284,7 @@ uint32_t HIDReportDescriptor::getDecodedUsage( } } -HidReportType HIDReportDescriptor::getReportType(HidItemTag tag) { +HidReportType HidReportDescriptor::getReportType(HidItemTag tag) { switch (tag) { case HidItemTag::Input: return HidReportType::Input; @@ -299,7 +299,7 @@ HidReportType HIDReportDescriptor::getReportType(HidItemTag tag) { } } -Collection HIDReportDescriptor::parse() { +Collection HidReportDescriptor::parse() { Collection collection; // Top level collection std::unique_ptr pCurrentReport = nullptr; // Use a unique_ptr for pCurrentReport @@ -518,7 +518,7 @@ Collection HIDReportDescriptor::parse() { return collection; } -const Report* HIDReportDescriptor::getReport( +const Report* HidReportDescriptor::getReport( const HidReportType& reportType, const uint8_t& reportId) const { for (const auto& collection : m_topLevelCollections) { const Report* report = collection.getReport(reportType, reportId); @@ -530,7 +530,7 @@ const Report* HIDReportDescriptor::getReport( } const std::vector> -HIDReportDescriptor::getListOfReports() const { +HidReportDescriptor::getListOfReports() const { std::vector> orderedList; for (size_t i = 0; i < m_topLevelCollections.size(); ++i) { for (const auto& report : m_topLevelCollections[i].getReports()) { diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index a13cd4bbd2b3..c8a1db4ea364 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -193,9 +193,9 @@ class Collection { }; // Class for parsing HID report descriptors -class HIDReportDescriptor { +class HidReportDescriptor { public: - HIDReportDescriptor(const uint8_t* pData, size_t length); + HidReportDescriptor(const uint8_t* pData, size_t length); bool isDeviceWithReportIds() const { return m_deviceHasReportIds; diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp index 9c5ee6967168..2a9166686369 100644 --- a/src/test/controller_hid_reportdescriptor_test.cpp +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -40,7 +40,7 @@ uint8_t reportDescriptor[] = { // clang-format on TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { - HIDReportDescriptor parser(reportDescriptor, sizeof(reportDescriptor)); + HidReportDescriptor parser(reportDescriptor, sizeof(reportDescriptor)); Collection collection = parser.parse(); // Use getListOfReports to get the list of reports @@ -123,7 +123,7 @@ TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { ASSERT_EQ(controls[4].m_bitPosition, 0); } -TEST(HIDReportDescriptorTest, ControlValue_1Bit) { +TEST(HidReportDescriptorTest, ControlValue_1Bit) { auto reportData = QByteArray::fromHex("81'00'00'FF'01"); Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags 0x0009'0001, // UsagePage/Usage @@ -148,7 +148,7 @@ TEST(HIDReportDescriptorTest, ControlValue_1Bit) { EXPECT_EQ(value2, 0x0); } -TEST(HIDReportDescriptorTest, ControlValue_unsigned11Bits) { +TEST(HidReportDescriptorTest, ControlValue_unsigned11Bits) { auto reportData = QByteArray::fromHex("81'30'46'00'01"); Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags 0x0009'0001, // UsagePage/Usage @@ -173,7 +173,7 @@ TEST(HIDReportDescriptorTest, ControlValue_unsigned11Bits) { EXPECT_EQ(value2, 0b010'1010'1010); } -TEST(HIDReportDescriptorTest, ControlValue_signed11Bits) { +TEST(HidReportDescriptorTest, ControlValue_signed11Bits) { auto reportData = QByteArray::fromHex("AA'BB'CC'DD'EE"); Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags 0x0009'0001, // UsagePage/Usage @@ -205,7 +205,7 @@ TEST(HIDReportDescriptorTest, ControlValue_signed11Bits) { EXPECT_EQ(value3, -200); } -TEST(HIDReportDescriptorTest, ControlValue_unsigned32Bits) { +TEST(HidReportDescriptorTest, ControlValue_unsigned32Bits) { auto reportData = QByteArray::fromHex("0A'21'43'65'B7"); Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags 0x0009'0001, // UsagePage/Usage @@ -230,7 +230,7 @@ TEST(HIDReportDescriptorTest, ControlValue_unsigned32Bits) { EXPECT_EQ(value2, 0x01'23'45'67); } -TEST(HIDReportDescriptorTest, ControlValue_signed32Bits) { +TEST(HidReportDescriptorTest, ControlValue_signed32Bits) { auto reportData = QByteArray::fromHex("0A'21'43'65'B7"); Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags 0x0009'0001, // UsagePage/Usage @@ -262,7 +262,7 @@ TEST(HIDReportDescriptorTest, ControlValue_signed32Bits) { EXPECT_EQ(value3, std::numeric_limits::max()); } -TEST(HIDReportDescriptorTest, SetControlValue_OutOfRange) { +TEST(HidReportDescriptorTest, SetControlValue_OutOfRange) { auto reportData = QByteArray::fromHex("81'00'00'00'01"); Control control({0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Flags 0x0009'0001, // UsagePage/Usage From c501988b610cb1c17d0802b1f26ed2352e159f64 Mon Sep 17 00:00:00 2001 From: Joerg Date: Fri, 16 May 2025 22:04:46 +0200 Subject: [PATCH 097/163] Replace ASSERT_EQ with EXPECT_EQ in HID tests --- .../controller_hid_reportdescriptor_test.cpp | 100 +++++++++--------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp index 2a9166686369..5bfb8f88cb99 100644 --- a/src/test/controller_hid_reportdescriptor_test.cpp +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -63,64 +63,64 @@ TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { ASSERT_EQ(controls.size(), 5); // Mouse Button 1 - ASSERT_EQ(controls[0].m_usage, 0x0009'0001); - ASSERT_EQ(controls[0].m_logicalMinimum, 0); - ASSERT_EQ(controls[0].m_logicalMaximum, 1); - ASSERT_EQ(controls[0].m_physicalMinimum, 0); - ASSERT_EQ(controls[0].m_physicalMaximum, 1); - ASSERT_EQ(controls[0].m_unitExponent, 0); - ASSERT_EQ(controls[0].m_unit, 0); - ASSERT_EQ(controls[0].m_bytePosition, 0); - ASSERT_EQ(controls[0].m_bitPosition, 0); - ASSERT_EQ(controls[0].m_bitSize, 1); + EXPECT_EQ(controls[0].m_usage, 0x0009'0001); + EXPECT_EQ(controls[0].m_logicalMinimum, 0); + EXPECT_EQ(controls[0].m_logicalMaximum, 1); + EXPECT_EQ(controls[0].m_physicalMinimum, 0); + EXPECT_EQ(controls[0].m_physicalMaximum, 1); + EXPECT_EQ(controls[0].m_unitExponent, 0); + EXPECT_EQ(controls[0].m_unit, 0); + EXPECT_EQ(controls[0].m_bytePosition, 0); + EXPECT_EQ(controls[0].m_bitPosition, 0); + EXPECT_EQ(controls[0].m_bitSize, 1); // Mouse Button 2 - ASSERT_EQ(controls[1].m_usage, 0x0009'0002); - ASSERT_EQ(controls[1].m_logicalMinimum, 0); - ASSERT_EQ(controls[1].m_logicalMaximum, 1); - ASSERT_EQ(controls[1].m_physicalMinimum, 0); - ASSERT_EQ(controls[1].m_physicalMaximum, 1); - ASSERT_EQ(controls[1].m_unitExponent, 0); - ASSERT_EQ(controls[1].m_unit, 0); - ASSERT_EQ(controls[1].m_bytePosition, 0); - ASSERT_EQ(controls[1].m_bitPosition, 1); - ASSERT_EQ(controls[1].m_bitSize, 1); + EXPECT_EQ(controls[1].m_usage, 0x0009'0002); + EXPECT_EQ(controls[1].m_logicalMinimum, 0); + EXPECT_EQ(controls[1].m_logicalMaximum, 1); + EXPECT_EQ(controls[1].m_physicalMinimum, 0); + EXPECT_EQ(controls[1].m_physicalMaximum, 1); + EXPECT_EQ(controls[1].m_unitExponent, 0); + EXPECT_EQ(controls[1].m_unit, 0); + EXPECT_EQ(controls[1].m_bytePosition, 0); + EXPECT_EQ(controls[1].m_bitPosition, 1); + EXPECT_EQ(controls[1].m_bitSize, 1); // Mouse Button 3 - ASSERT_EQ(controls[2].m_usage, 0x0009'0003); - ASSERT_EQ(controls[2].m_logicalMinimum, 0); - ASSERT_EQ(controls[2].m_logicalMaximum, 1); - ASSERT_EQ(controls[2].m_physicalMinimum, 0); - ASSERT_EQ(controls[2].m_physicalMaximum, 1); - ASSERT_EQ(controls[2].m_unitExponent, 0); - ASSERT_EQ(controls[2].m_unit, 0); - ASSERT_EQ(controls[2].m_bytePosition, 0); - ASSERT_EQ(controls[2].m_bitPosition, 2); - ASSERT_EQ(controls[2].m_bitSize, 1); + EXPECT_EQ(controls[2].m_usage, 0x0009'0003); + EXPECT_EQ(controls[2].m_logicalMinimum, 0); + EXPECT_EQ(controls[2].m_logicalMaximum, 1); + EXPECT_EQ(controls[2].m_physicalMinimum, 0); + EXPECT_EQ(controls[2].m_physicalMaximum, 1); + EXPECT_EQ(controls[2].m_unitExponent, 0); + EXPECT_EQ(controls[2].m_unit, 0); + EXPECT_EQ(controls[2].m_bytePosition, 0); + EXPECT_EQ(controls[2].m_bitPosition, 2); + EXPECT_EQ(controls[2].m_bitSize, 1); // Mouse Movement X - ASSERT_EQ(controls[3].m_usage, 0x0001'0030); - ASSERT_EQ(controls[3].m_logicalMinimum, -127); - ASSERT_EQ(controls[3].m_logicalMaximum, 127); - ASSERT_EQ(controls[3].m_physicalMinimum, -127); - ASSERT_EQ(controls[3].m_physicalMaximum, 127); - ASSERT_EQ(controls[3].m_unitExponent, 0); - ASSERT_EQ(controls[3].m_unit, 0); - ASSERT_EQ(controls[3].m_bitSize, 8); - ASSERT_EQ(controls[3].m_bytePosition, 1); - ASSERT_EQ(controls[3].m_bitPosition, 0); + EXPECT_EQ(controls[3].m_usage, 0x0001'0030); + EXPECT_EQ(controls[3].m_logicalMinimum, -127); + EXPECT_EQ(controls[3].m_logicalMaximum, 127); + EXPECT_EQ(controls[3].m_physicalMinimum, -127); + EXPECT_EQ(controls[3].m_physicalMaximum, 127); + EXPECT_EQ(controls[3].m_unitExponent, 0); + EXPECT_EQ(controls[3].m_unit, 0); + EXPECT_EQ(controls[3].m_bitSize, 8); + EXPECT_EQ(controls[3].m_bytePosition, 1); + EXPECT_EQ(controls[3].m_bitPosition, 0); // Mouse Movement Y - ASSERT_EQ(controls[4].m_usage, 0x0001'0031); - ASSERT_EQ(controls[4].m_logicalMinimum, -127); - ASSERT_EQ(controls[4].m_logicalMaximum, 127); - ASSERT_EQ(controls[4].m_physicalMinimum, -127); - ASSERT_EQ(controls[4].m_physicalMaximum, 127); - ASSERT_EQ(controls[4].m_unitExponent, 0); - ASSERT_EQ(controls[4].m_unit, 0); - ASSERT_EQ(controls[4].m_bitSize, 8); - ASSERT_EQ(controls[4].m_bytePosition, 2); - ASSERT_EQ(controls[4].m_bitPosition, 0); + EXPECT_EQ(controls[4].m_usage, 0x0001'0031); + EXPECT_EQ(controls[4].m_logicalMinimum, -127); + EXPECT_EQ(controls[4].m_logicalMaximum, 127); + EXPECT_EQ(controls[4].m_physicalMinimum, -127); + EXPECT_EQ(controls[4].m_physicalMaximum, 127); + EXPECT_EQ(controls[4].m_unitExponent, 0); + EXPECT_EQ(controls[4].m_unit, 0); + EXPECT_EQ(controls[4].m_bitSize, 8); + EXPECT_EQ(controls[4].m_bytePosition, 2); + EXPECT_EQ(controls[4].m_bitPosition, 0); } TEST(HidReportDescriptorTest, ControlValue_1Bit) { From 42ec84bfef5e7b9272719b669aa27d5f88f56d03 Mon Sep 17 00:00:00 2001 From: Joerg Date: Fri, 16 May 2025 22:17:59 +0200 Subject: [PATCH 098/163] Reordered struct GlobalItems for memory efficiency --- src/controllers/hid/hidreportdescriptor.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index c8a1db4ea364..48c80c0e2d31 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -208,16 +208,16 @@ class HidReportDescriptor { private: // Define the struct for global items struct GlobalItems { - uint16_t usagePage = 0; int32_t logicalMinimum = 0; int32_t logicalMaximum = 0; int32_t physicalMinimum = 0; int32_t physicalMaximum = 0; - int8_t unitExponent = 0; - uint32_t unit = 0; uint32_t reportSize = 0; - uint8_t reportId = 0; uint32_t reportCount = 0; + uint32_t unit = 0; + int8_t unitExponent = 0; + uint8_t reportId = 0; + uint16_t usagePage = 0; }; struct LocalItems { From 2d1775a4071255c7bef21736fb4b7afe8a331bb6 Mon Sep 17 00:00:00 2001 From: Joerg Date: Fri, 16 May 2025 22:31:17 +0200 Subject: [PATCH 099/163] Use C++ integer types with std:: --- src/controllers/hid/hidreportdescriptor.h | 150 +++++++++++----------- 1 file changed, 77 insertions(+), 73 deletions(-) diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index 48c80c0e2d31..94003cffc7ba 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -11,7 +12,7 @@ namespace hid::reportDescriptor { Q_NAMESPACE -QString getScaledUnitString(uint32_t unit); +QString getScaledUnitString(std::uint32_t unit); constexpr int kNotSet = -1; // Value used instead of the ReportID, if device don't have ReportIDs @@ -26,7 +27,7 @@ Q_ENUM_NS(HidReportType) // clang-format off // Enum class for HID Item Tags (incl. the two type bits) -enum class HidItemTag : uint8_t { +enum class HidItemTag : std::uint8_t { // "Main Items" according to chapter 6.2.2.4 of HID class definition 1.11 Input = 0b1000'00'00, Output = 0b1001'00'00, @@ -73,7 +74,7 @@ enum class HidItemTag : uint8_t { }; // Enum class for HID Item Sizes -enum class HidItemSize : uint8_t { +enum class HidItemSize : std::uint8_t { // "Short Items" sizes according to chapter 6.2.2.2 of HID class definition 1.11 ZeroBytePayload = 0b0000'00'00, OneBytePayload = 0b0000'00'01, @@ -88,7 +89,7 @@ enum class HidItemSize : uint8_t { }; // Collection types according to chapter 6.2.2.6 of HID class definition 1.11 -enum class CollectionType : uint8_t { +enum class CollectionType : std::uint8_t { Physical = 0x00, // e.g. group of axes Application = 0x01, // e.g. mouse or keyboard Logical = 0x02, // interrelated data @@ -102,63 +103,63 @@ enum class CollectionType : uint8_t { // clang-format on struct ControlFlags { - uint32_t data_constant : 1; // Data (0) | Constant (1) - uint32_t array_variable : 1; // Array (0) | Variable (1) - uint32_t absolute_relative : 1; // Absolute (0) | Relative (1) - uint32_t no_wrap_wrap : 1; // No Wrap (0) | Wrap (1) - uint32_t linear_non_linear : 1; // Linear (0) | Non Linear (1) - uint32_t preferred_no_preferred : 1; // Preferred State (0) | No Preferred (1) - uint32_t no_null_null : 1; // No Null position (0) | Null state(1) - uint32_t non_volatile_volatile : 1; // Non Volatile (0) | Volatile (1) - uint32_t bit_field_buffered : 1; // Bit Field (0) | Buffered Bytes (1) - uint32_t reserved : 23; + std::uint32_t data_constant : 1; // Data (0) | Constant (1) + std::uint32_t array_variable : 1; // Array (0) | Variable (1) + std::uint32_t absolute_relative : 1; // Absolute (0) | Relative (1) + std::uint32_t no_wrap_wrap : 1; // No Wrap (0) | Wrap (1) + std::uint32_t linear_non_linear : 1; // Linear (0) | Non Linear (1) + std::uint32_t preferred_no_preferred : 1; // Preferred State (0) | No Preferred (1) + std::uint32_t no_null_null : 1; // No Null position (0) | Null state(1) + std::uint32_t non_volatile_volatile : 1; // Non Volatile (0) | Volatile (1) + std::uint32_t bit_field_buffered : 1; // Bit Field (0) | Buffered Bytes (1) + std::uint32_t reserved : 23; }; // Class representing a control described in the HID report descriptor class Control { public: Control(const ControlFlags flags, - const uint32_t usage, - const int32_t logicalMinimum, - const int32_t logicalMaximum, - const int32_t physicalMinimum, - const int32_t physicalMaximum, - const int8_t unitExponent, - const uint32_t unit, - const uint16_t bytePosition, // Position of the first byte in the report - const uint8_t bitPosition, // Position of first bit in first byte - const uint8_t bitSize); + const std::uint32_t usage, + const std::int32_t logicalMinimum, + const std::int32_t logicalMaximum, + const std::int32_t physicalMinimum, + const std::int32_t physicalMaximum, + const std::int8_t unitExponent, + const std::uint32_t unit, + const std::uint16_t bytePosition, // Position of the first byte in the report + const std::uint8_t bitPosition, // Position of first bit in first byte + const std::uint8_t bitSize); const ControlFlags m_flags; - const uint32_t m_usage; - const int32_t m_logicalMinimum; - const int32_t m_logicalMaximum; - const int32_t m_physicalMinimum; - const int32_t m_physicalMaximum; - const int8_t m_unitExponent; - const uint32_t m_unit; - const uint16_t m_bytePosition; // Position of the first byte in the report - const uint8_t m_bitPosition; // Position of first bit in first byte - const uint8_t m_bitSize; + const std::uint32_t m_usage; + const std::int32_t m_logicalMinimum; + const std::int32_t m_logicalMaximum; + const std::int32_t m_physicalMinimum; + const std::int32_t m_physicalMaximum; + const std::int8_t m_unitExponent; + const std::uint32_t m_unit; + const std::uint16_t m_bytePosition; // Position of the first byte in the report + const std::uint8_t m_bitPosition; // Position of first bit in first byte + const std::uint8_t m_bitSize; private: }; -int32_t extractLogicalValue(const QByteArray& data, const Control& control); -bool applyLogicalValue(QByteArray& data, const Control& control, int32_t controlValue); +std::int32_t extractLogicalValue(const QByteArray& data, const Control& control); +bool applyLogicalValue(QByteArray& data, const Control& control, std::int32_t controlValue); // Class representing a report in the HID report descriptor class Report { public: - Report(const HidReportType& reportType, const uint8_t& reportId); + Report(const HidReportType& reportType, const std::uint8_t& reportId); void addControl(const Control& item); void increasePosition(unsigned int bitSize); - uint16_t getLastBytePosition() const { + std::uint16_t getLastBytePosition() const { return m_lastBytePosition; } - uint8_t getLastBitPosition() const { + std::uint8_t getLastBitPosition() const { return m_lastBitPosition; } @@ -167,15 +168,15 @@ class Report { } const HidReportType m_reportType; - const uint8_t m_reportId; - uint16_t getReportSize() const { + const std::uint8_t m_reportId; + std::uint16_t getReportSize() const { return m_lastBytePosition; } private: std::vector m_controls; - uint16_t m_lastBytePosition; - uint8_t m_lastBitPosition; // Last bit position inside last byte + std::uint16_t m_lastBytePosition; + std::uint8_t m_lastBitPosition; // Last bit position inside last byte }; // Class representing a collection of HID items @@ -183,7 +184,7 @@ class Collection { public: Collection() = default; void addReport(const Report& report); - const Report* getReport(const HidReportType& reportType, const uint8_t& reportId) const; + const Report* getReport(const HidReportType& reportType, const std::uint8_t& reportId) const; const std::vector& getReports() const { return m_reports; } @@ -195,55 +196,58 @@ class Collection { // Class for parsing HID report descriptors class HidReportDescriptor { public: - HidReportDescriptor(const uint8_t* pData, size_t length); + HidReportDescriptor(const std::uint8_t* pData, std::size_t length); bool isDeviceWithReportIds() const { return m_deviceHasReportIds; } Collection parse(); - const Report* getReport(const HidReportType& reportType, const uint8_t& reportId) const; - const std::vector> getListOfReports() const; + const Report* getReport(const HidReportType& reportType, const std::uint8_t& reportId) const; + const std::vector> + getListOfReports() const; private: // Define the struct for global items struct GlobalItems { - int32_t logicalMinimum = 0; - int32_t logicalMaximum = 0; - int32_t physicalMinimum = 0; - int32_t physicalMaximum = 0; - uint32_t reportSize = 0; - uint32_t reportCount = 0; - uint32_t unit = 0; - int8_t unitExponent = 0; - uint8_t reportId = 0; - uint16_t usagePage = 0; + std::int32_t logicalMinimum = 0; + std::int32_t logicalMaximum = 0; + std::int32_t physicalMinimum = 0; + std::int32_t physicalMaximum = 0; + std::uint32_t reportSize = 0; + std::uint32_t reportCount = 0; + std::uint32_t unit = 0; + std::int8_t unitExponent = 0; + std::uint8_t reportId = 0; + std::uint16_t usagePage = 0; }; struct LocalItems { - std::vector Usage; - int64_t UsageMinimum = kNotSet; - int64_t UsageMaximum = kNotSet; - int64_t DesignatorIndex = kNotSet; - int64_t DesignatorMinimum = kNotSet; - int64_t DesignatorMaximum = kNotSet; - int64_t StringIndex = kNotSet; - int64_t StringMinimum = kNotSet; - int64_t StringMaximum = kNotSet; - int64_t Delimiter = kNotSet; + std::vector Usage; + std::int64_t UsageMinimum = kNotSet; + std::int64_t UsageMaximum = kNotSet; + std::int64_t DesignatorIndex = kNotSet; + std::int64_t DesignatorMinimum = kNotSet; + std::int64_t DesignatorMaximum = kNotSet; + std::int64_t StringIndex = kNotSet; + std::int64_t StringMinimum = kNotSet; + std::int64_t StringMaximum = kNotSet; + std::int64_t Delimiter = kNotSet; }; std::pair readTag(); - uint32_t readPayload(HidItemSize payloadSize); + std::uint32_t readPayload(HidItemSize payloadSize); - int32_t getSignedValue(uint32_t payload, HidItemSize payloadSize); - uint32_t getDecodedUsage(uint16_t usagePage, uint32_t usage, HidItemSize usageSize); + std::int32_t getSignedValue(std::uint32_t payload, HidItemSize payloadSize); + std::uint32_t getDecodedUsage(std::uint16_t usagePage, + std::uint32_t usage, + HidItemSize usageSize); HidReportType getReportType(HidItemTag tag); - const uint8_t* m_pData; - size_t m_length; - size_t m_pos; + const std::uint8_t* m_pData; + std::size_t m_length; + std::size_t m_pos; bool m_deviceHasReportIds; From 78c3a5276ce83e78da1ea06097113ed351a60085 Mon Sep 17 00:00:00 2001 From: Joerg Date: Sat, 17 May 2025 23:13:01 +0200 Subject: [PATCH 100/163] Use make_parented where possible --- .../controllerhidreporttabsmanager.cpp | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 8d7f1eeb46c8..69180a521c9b 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -10,6 +10,7 @@ #include "controllers/hid/hidusagetables.h" #include "moc_controllerhidreporttabsmanager.cpp" +#include "util/parented_ptr.h" ControllerHidReportTabsManager::ControllerHidReportTabsManager( QTabWidget* pParentTabWidget, HidController* pHidController) @@ -55,13 +56,13 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor .rightJustified(2, '0') .toUpper()); - auto* pTabWidget = new QWidget(pParentReportTypeTab); - auto* pLayout = new QVBoxLayout(pTabWidget); + auto pTabWidget = make_parented(pParentReportTypeTab); + auto pLayout = make_parented(pTabWidget); auto* pTopWidgetRow = new QHBoxLayout(); // Create buttons - auto* pReadButton = new QPushButton(QStringLiteral("Read"), pTabWidget); - auto* pSendButton = new QPushButton(QStringLiteral("Send"), pTabWidget); + auto pReadButton = make_parented(QStringLiteral("Read"), pTabWidget); + auto pSendButton = make_parented(QStringLiteral("Send"), pTabWidget); // Adjust visibility/enable state based on the report type if (reportType == hid::reportDescriptor::HidReportType::Input) { @@ -75,13 +76,13 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor pTopWidgetRow->addWidget(pSendButton); pLayout->addLayout(pTopWidgetRow); - auto* pTable = new QTableWidget(pTabWidget); + auto pTable = make_parented(pTabWidget); pLayout->addWidget(pTable); const auto* pReport = reportDescriptor.getReport(reportType, reportId); if (pReport) { // Show payload size - auto* pSizeLabel = new QLabel(pTabWidget); + auto pSizeLabel = make_parented(pTabWidget); pSizeLabel->setText( QStringLiteral("Payload Size: %1 bytes") .arg(pReport->getReportSize())); @@ -94,7 +95,7 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor connect(pReadButton, &QPushButton::clicked, this, - [this, pTable, reportId, reportType]() { + [this, pTable = pTable.get(), reportId, reportType]() { slotReadReport(pTable, reportId, reportType); }); // Read once on tab creation @@ -104,7 +105,7 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor connect(pSendButton, &QPushButton::clicked, this, - [this, pTable, reportId, reportType]() { + [this, pTable = pTable.get(), reportId, reportType]() { slotSendReport(pTable, reportId, reportType); }); } @@ -272,7 +273,7 @@ void ControllerHidReportTabsManager::populateHidReportTable( // Set the delegate once if needed if (reportType != hid::reportDescriptor::HidReportType::Input) { - pTable->setItemDelegateForColumn(5, new ValueItemDelegate(pTable)); + pTable->setItemDelegateForColumn(5, make_parented(pTable)); } bool showVolatileColumn = (reportType == hid::reportDescriptor::HidReportType::Feature || @@ -468,8 +469,8 @@ QWidget* ValueItemDelegate::createEditor(QWidget* pParent, const QModelIndex& index) const { // Create a line edit restricted by (logical min, logical max) auto dataRange = index.data(Qt::UserRole).value>(); - auto* pEditor = new QLineEdit(pParent); - pEditor->setValidator(new QIntValidator(dataRange.first, dataRange.second, pEditor)); + auto pEditor = make_parented(pParent); + pEditor->setValidator(make_parented(dataRange.first, dataRange.second, pEditor)); return pEditor; } From ee691331fa29f27f631cece889fd47fc1643c64c Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 00:25:28 +0200 Subject: [PATCH 101/163] Made user facing strings translateable --- .../controllerhidreporttabsmanager.cpp | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 69180a521c9b..8e7e7391aa3a 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -49,6 +49,7 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor for (const auto& reportInfo : reportDescriptor.getListOfReports()) { auto [index, type, reportId] = reportInfo; if (type == reportType) { + // Report is a fixed HID term and shouldn't be translated QString tabName = QStringLiteral("%1 Report 0x%2") .arg(metaEnum.valueToKey(static_cast( reportType)), @@ -61,8 +62,8 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor auto* pTopWidgetRow = new QHBoxLayout(); // Create buttons - auto pReadButton = make_parented(QStringLiteral("Read"), pTabWidget); - auto pSendButton = make_parented(QStringLiteral("Send"), pTabWidget); + auto pReadButton = make_parented(tr("Read"), pTabWidget); + auto pSendButton = make_parented(tr("Send"), pTabWidget); // Adjust visibility/enable state based on the report type if (reportType == hid::reportDescriptor::HidReportType::Input) { @@ -84,8 +85,10 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor // Show payload size auto pSizeLabel = make_parented(pTabWidget); pSizeLabel->setText( - QStringLiteral("Payload Size: %1 bytes") - .arg(pReport->getReportSize())); + QStringLiteral("%1: %2 %3") + .arg(tr("Payload Size")) + .arg(pReport->getReportSize()) + .arg(tr("bytes"))); pTopWidgetRow->insertWidget(0, pSizeLabel); populateHidReportTable(pTable, *pReport, reportType); @@ -280,25 +283,25 @@ void ControllerHidReportTabsManager::populateHidReportTable( reportType == hid::reportDescriptor::HidReportType::Output); // Set headers - QStringList headers = {QStringLiteral("Byte Position"), - QStringLiteral("Bit Position"), - QStringLiteral("Bit Size"), - QStringLiteral("Logical Min"), - QStringLiteral("Logical Max"), - QStringLiteral("Value"), - QStringLiteral("Physical Min"), - QStringLiteral("Physical Max"), - QStringLiteral("Unit Scaling"), - QStringLiteral("Unit"), - QStringLiteral("Abs/Rel"), - QStringLiteral("Wrap"), - QStringLiteral("Linear"), - QStringLiteral("Preferred"), - QStringLiteral("Null")}; + QStringList headers = {tr("Byte Position"), + tr("Bit Position"), + tr("Bit Size"), + tr("Logical Min"), + tr("Logical Max"), + tr("Value"), + tr("Physical Min"), + tr("Physical Max"), + tr("Unit Scaling"), + tr("Unit"), + tr("Abs/Rel"), + tr("Wrap"), + tr("Linear"), + tr("Preferred"), + tr("Null")}; if (showVolatileColumn) { - headers << QStringLiteral("Volatile"); + headers << tr("Volatile"); } - headers << QStringLiteral("Usage Page") << QStringLiteral("Usage"); + headers << tr("Usage Page") << tr("Usage"); pTable->setColumnCount(headers.size()); pTable->setHorizontalHeaderLabels(headers); @@ -387,32 +390,32 @@ void ControllerHidReportTabsManager::populateHidReportTable( pTable->setItem(row, 10, createReadOnlyItem(pControl.m_flags.absolute_relative - ? QStringLiteral("Relative") - : QStringLiteral("Absolute"))); + ? tr("Relative") + : tr("Absolute"))); // Column 11 - Wrap pTable->setItem(row, 11, createReadOnlyItem(pControl.m_flags.no_wrap_wrap - ? QStringLiteral("Wrap") - : QStringLiteral("No Wrap"))); + ? tr("Wrap") + : tr("No Wrap"))); // Column 12 - Linear pTable->setItem(row, 12, createReadOnlyItem(pControl.m_flags.linear_non_linear - ? QStringLiteral("Non Linear") - : QStringLiteral("Linear"))); + ? tr("Non Linear") + : tr("Linear"))); // Column 13 - Preferred pTable->setItem(row, 13, createReadOnlyItem(pControl.m_flags.preferred_no_preferred - ? QStringLiteral("No Preferred") - : QStringLiteral("Preferred"))); + ? tr("No Preferred") + : tr("Preferred"))); // Column 14 - Null pTable->setItem(row, 14, createReadOnlyItem(pControl.m_flags.no_null_null - ? QStringLiteral("Null") - : QStringLiteral("No Null"))); + ? tr("Null") + : tr("No Null"))); // Volatile column (if present) int volatileIndex = (showVolatileColumn ? 15 : -1); @@ -420,8 +423,8 @@ void ControllerHidReportTabsManager::populateHidReportTable( pTable->setItem(row, volatileIndex, createReadOnlyItem(pControl.m_flags.non_volatile_volatile - ? QStringLiteral("Volatile") - : QStringLiteral("Non Volatile"))); + ? tr("Volatile") + : tr("Non Volatile"))); } // Usage Page / Usage From ee2ce845cc3bbdbc7ce3e8ca5667c637a47538aa Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 00:45:22 +0200 Subject: [PATCH 102/163] Added missin NULL checks --- src/controllers/controllerhidreporttabsmanager.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 8e7e7391aa3a..29550ac68ccc 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -144,6 +144,9 @@ void ControllerHidReportTabsManager::updateTableWithReportData( QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { const auto* pControl = customData.value(); + VERIFY_OR_DEBUG_ASSERT(pControl) { + continue; + } // Use the custom data as needed int64_t controlValue = hid::reportDescriptor::extractLogicalValue( @@ -215,6 +218,9 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, quint8 reportId, hid::reportDescriptor::HidReportType reportType) { + VERIFY_OR_DEBUG_ASSERT(m_pHidController) { + return; + } if (!m_pHidController->isOpen()) { qWarning() << "HID controller is not open."; return; @@ -244,7 +250,9 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, QVariant customData = pTable->item(row, 0)->data(Qt::UserRole + 1); if (customData.isValid()) { const auto* pControl = customData.value(); - // Set the control value in the reportData + VERIFY_OR_DEBUG_ASSERT(pControl) { + continue; + } bool success = hid::reportDescriptor::applyLogicalValue( reportData, *pControl, pItem->text().toLongLong()); if (!success) { From 4691746780e3a8e962a2de68038c13bcd7ab815d Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 10:58:30 +0200 Subject: [PATCH 103/163] Fix build with HID disabled --- CMakeLists.txt | 8 +++++++- src/controllers/dlgprefcontroller.cpp | 7 ++++++- src/controllers/dlgprefcontroller.h | 4 ++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e1d8dac807c..466bec9885cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2595,7 +2595,6 @@ if(BUILD_TESTING) src/test/colormapperjsproxy_test.cpp src/test/colorpalette_test.cpp src/test/configobject_test.cpp - src/test/controller_hid_reportdescriptor_test.cpp src/test/controller_mapping_validation_test.cpp src/test/controller_mapping_settings_test.cpp src/test/controllers/controller_columnid_regression_test.cpp @@ -2706,6 +2705,13 @@ if(BUILD_TESTING) add_executable(mixxx-test ${src-mixxx-test}) + if(HID) + target_sources( + mixxx-test + PRIVATE src/test/controller_hid_reportdescriptor_test.cpp + ) + endif() + if(QML) target_sources( mixxx-test diff --git a/src/controllers/dlgprefcontroller.cpp b/src/controllers/dlgprefcontroller.cpp index 2e56b6a3f766..0c08c1a57fe6 100644 --- a/src/controllers/dlgprefcontroller.cpp +++ b/src/controllers/dlgprefcontroller.cpp @@ -90,9 +90,14 @@ DlgPrefController::DlgPrefController( m_inputMappingsTabIndex(-1), m_outputMappingsTabIndex(-1), m_settingsTabIndex(-1), - m_screensTabIndex(-1), + m_screensTabIndex(-1) +#ifdef __HID__ + , m_hidReportTabsManager(nullptr) { qRegisterMetaType(); +#else +{ +#endif m_ui.setupUi(this); // Create text color for the file and wiki links diff --git a/src/controllers/dlgprefcontroller.h b/src/controllers/dlgprefcontroller.h index 4383cf2042dc..546165356a30 100644 --- a/src/controllers/dlgprefcontroller.h +++ b/src/controllers/dlgprefcontroller.h @@ -2,7 +2,9 @@ #include +#ifdef __HID__ #include "controllers/controllerhidreporttabsmanager.h" +#endif #include "controllers/controllermappinginfo.h" #include "controllers/midi/midimessage.h" #include "controllers/ui_dlgprefcontrollerdlg.h" @@ -149,5 +151,7 @@ class DlgPrefController : public DlgPreferencePage { int m_screensTabIndex; // Index of the screens tab QHash m_settingsCollapsedStates; +#ifdef __HID__ std::unique_ptr m_hidReportTabsManager; +#endif }; From 8a29aa75b20de18dc1b9ef99ac7f166d0e5c719c Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 15:29:27 +0200 Subject: [PATCH 104/163] Don't return const for std::vector getListOfReports --- src/controllers/hid/hidreportdescriptor.cpp | 2 +- src/controllers/hid/hidreportdescriptor.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 4c0a3852783c..83b2e3d7d81d 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -529,7 +529,7 @@ const Report* HidReportDescriptor::getReport( return nullptr; } -const std::vector> +std::vector> HidReportDescriptor::getListOfReports() const { std::vector> orderedList; for (size_t i = 0; i < m_topLevelCollections.size(); ++i) { diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index 94003cffc7ba..270f918287d2 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -204,8 +204,7 @@ class HidReportDescriptor { Collection parse(); const Report* getReport(const HidReportType& reportType, const std::uint8_t& reportId) const; - const std::vector> - getListOfReports() const; + std::vector> getListOfReports() const; private: // Define the struct for global items From 0676100fb1108fe4d7b01469e1e540ba2292e98b Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 13:13:19 +0200 Subject: [PATCH 105/163] Moved comment about fetchRawReportDescriptor from .cpp to .h --- src/controllers/hid/hiddevice.cpp | 3 --- src/controllers/hid/hiddevice.h | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/hid/hiddevice.cpp b/src/controllers/hid/hiddevice.cpp index 31ea9a4d0b3b..f39ba50c9505 100644 --- a/src/controllers/hid/hiddevice.cpp +++ b/src/controllers/hid/hiddevice.cpp @@ -52,9 +52,6 @@ DeviceInfo::DeviceInfo(const hid_device_info& device_info) m_serialNumberRaw.data(), m_serialNumberRaw.size())) { } -// We need an opened hid_device here, -// but the lifetime of the data is as long as DeviceInfo exists, -// means the reportDescriptor data remains valid after closing the hid_device std::optional> DeviceInfo::fetchRawReportDescriptor(hid_device* pHidDevice) { if (!m_reportDescriptor) { if (!pHidDevice) { diff --git a/src/controllers/hid/hiddevice.h b/src/controllers/hid/hiddevice.h index 233c2d8dc2a9..f44174b6d9a2 100644 --- a/src/controllers/hid/hiddevice.h +++ b/src/controllers/hid/hiddevice.h @@ -105,6 +105,9 @@ class DeviceInfo final { return mixxx::hid::HidUsageTables::getUsageDescription(usage_page, usage); } + // We need an opened hid_device here, + // but the lifetime of the data is as long as DeviceInfo exists, + // means the reportDescriptor data remains valid after closing the hid_device std::optional> fetchRawReportDescriptor(hid_device* pHidDevice); bool isValid() const { From f440ee7add128d55d950236c885994b3a002a93b Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 14:25:54 +0200 Subject: [PATCH 106/163] Convert lambdas into functions in anonymous namespace --- .../controllerhidreporttabsmanager.cpp | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 29550ac68ccc..e81ed02e6955 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -12,6 +12,34 @@ #include "moc_controllerhidreporttabsmanager.cpp" #include "util/parented_ptr.h" +namespace { +QTableWidgetItem* createReadOnlyItem(const QString& text, bool rightAlign = false) { + auto* item = new QTableWidgetItem(text); + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + if (rightAlign) { + item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); + } + return item; +} + +QTableWidgetItem* createValueItem( + hid::reportDescriptor::HidReportType reportType, + int minVal, + int maxVal) { + auto* item = new QTableWidgetItem; + QFont font = item->font(); + font.setBold(true); + item->setFont(font); + if (reportType == hid::reportDescriptor::HidReportType::Input) { + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + } else { + item->setFlags(item->flags() | Qt::ItemIsEditable); + item->setData(Qt::UserRole, QVariant::fromValue(QPair(minVal, maxVal))); + } + return item; +} +} // anonymous namespace + ControllerHidReportTabsManager::ControllerHidReportTabsManager( QTabWidget* pParentTabWidget, HidController* pHidController) : m_pParentControllerTab(pParentTabWidget), @@ -315,29 +343,6 @@ void ControllerHidReportTabsManager::populateHidReportTable( pTable->setHorizontalHeaderLabels(headers); pTable->verticalHeader()->setVisible(false); - // Helpers - auto createReadOnlyItem = [](const QString& text, bool rightAlign = false) { - auto* item = new QTableWidgetItem(text); - item->setFlags(item->flags() & ~Qt::ItemIsEditable); - if (rightAlign) { - item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); - } - return item; - }; - auto createValueItem = [reportType](int minVal, int maxVal) { - auto* item = new QTableWidgetItem; - QFont font = item->font(); - font.setBold(true); - item->setFont(font); - if (reportType == hid::reportDescriptor::HidReportType::Input) { - item->setFlags(item->flags() & ~Qt::ItemIsEditable); - } else { - item->setFlags(item->flags() | Qt::ItemIsEditable); - item->setData(Qt::UserRole, QVariant::fromValue(QPair(minVal, maxVal))); - } - return item; - }; - int row = 0; for (const auto& pControl : controls) { // Column 0 - Byte Position @@ -369,8 +374,7 @@ void ControllerHidReportTabsManager::populateHidReportTable( // Column 5 - Value pTable->setItem(row, 5, - createValueItem( - pControl.m_logicalMinimum, pControl.m_logicalMaximum)); + createValueItem(reportType, pControl.m_logicalMinimum, pControl.m_logicalMaximum)); // Column 6 - Physical Min pTable->setItem(row, 6, From 63af74fa4b5d85e8f64b3d62aded4a8eff90b091 Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 15:38:47 +0200 Subject: [PATCH 107/163] Splitted report descriptor retrieval in multiple lines and added safety checks for `std::optional` --- .../controllerhidreporttabsmanager.cpp | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index e81ed02e6955..f073b92d216b 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -197,7 +197,12 @@ void ControllerHidReportTabsManager::slotProcessInputReport( } QTableWidget* pTable = it->second; - const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); + if (!reportDescriptorTemp.has_value()) { + return; + } + const auto& reportDescriptor = *reportDescriptorTemp; + const auto* pReport = reportDescriptor.getReport( hid::reportDescriptor::HidReportType::Input, reportId); if (pReport) { @@ -228,7 +233,12 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, return; } - const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); + if (!reportDescriptorTemp.has_value()) { + return; + } + const auto& reportDescriptor = *reportDescriptorTemp; + const auto* pReport = reportDescriptor.getReport(reportType, reportId); VERIFY_OR_DEBUG_ASSERT(pReport) { return; @@ -260,7 +270,11 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, return; } - const auto& reportDescriptor = *m_pHidController->getReportDescriptor(); + const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); + if (!reportDescriptorTemp.has_value()) { + return; + } + const auto& reportDescriptor = *reportDescriptorTemp; const auto* pReport = reportDescriptor.getReport(reportType, reportId); VERIFY_OR_DEBUG_ASSERT(pReport) { From efdba36290f32ab4bf6cc914704fdd9917b56f8f Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 18 May 2025 17:49:31 +0200 Subject: [PATCH 108/163] Change return type of getReport from pointer to reference --- .../controllerhidreporttabsmanager.cpp | 29 ++++++++++--------- src/controllers/hid/hidreportdescriptor.cpp | 18 +++++++----- src/controllers/hid/hidreportdescriptor.h | 10 +++++-- .../controller_hid_reportdescriptor_test.cpp | 12 ++++---- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index f073b92d216b..81749ba1d679 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -108,18 +108,19 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor auto pTable = make_parented(pTabWidget); pLayout->addWidget(pTable); - const auto* pReport = reportDescriptor.getReport(reportType, reportId); - if (pReport) { + auto reportOpt = reportDescriptor.getReport(reportType, reportId); + if (reportOpt) { + const auto& report = reportOpt->get(); // Show payload size auto pSizeLabel = make_parented(pTabWidget); pSizeLabel->setText( QStringLiteral("%1: %2 %3") .arg(tr("Payload Size")) - .arg(pReport->getReportSize()) + .arg(report.getReportSize()) .arg(tr("bytes"))); pTopWidgetRow->insertWidget(0, pSizeLabel); - populateHidReportTable(pTable, *pReport, reportType); + populateHidReportTable(pTable, report, reportType); } if (reportType != hid::reportDescriptor::HidReportType::Output) { @@ -203,9 +204,9 @@ void ControllerHidReportTabsManager::slotProcessInputReport( } const auto& reportDescriptor = *reportDescriptorTemp; - const auto* pReport = reportDescriptor.getReport( + auto reportOpt = reportDescriptor.getReport( hid::reportDescriptor::HidReportType::Input, reportId); - if (pReport) { + if (reportOpt) { updateTableWithReportData(pTable, data); } } @@ -239,13 +240,14 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, } const auto& reportDescriptor = *reportDescriptorTemp; - const auto* pReport = reportDescriptor.getReport(reportType, reportId); - VERIFY_OR_DEBUG_ASSERT(pReport) { + auto reportOpt = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(reportOpt) { return; } - if (reportData.size() < pReport->getReportSize()) { + const auto& report = reportOpt->get(); + if (reportData.size() < report.getReportSize()) { qWarning() << "Failed to get report. Read only " << reportData.size() - << " instead of expected " << pReport->getReportSize() + << " instead of expected " << report.getReportSize() << " bytes."; return; } @@ -276,13 +278,14 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, } const auto& reportDescriptor = *reportDescriptorTemp; - const auto* pReport = reportDescriptor.getReport(reportType, reportId); - VERIFY_OR_DEBUG_ASSERT(pReport) { + auto reportOpt = reportDescriptor.getReport(reportType, reportId); + VERIFY_OR_DEBUG_ASSERT(reportOpt) { return; } + const auto& report = reportOpt->get(); // Create a QByteArray of the size of the report - QByteArray reportData(pReport->getReportSize(), 0); + QByteArray reportData(report.getReportSize(), 0); // Iterate through each row in the table for (int row = 0; row < pTable->rowCount(); ++row) { diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 83b2e3d7d81d..548851e1419b 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "moc_hidreportdescriptor.cpp" #include "util/assert.h" @@ -177,14 +178,16 @@ void Report::increasePosition(unsigned int bitSize) { void Collection::addReport(const Report& report) { m_reports.push_back(report); } -const Report* Collection::getReport( + +std::optional> +Collection::getReport( const HidReportType& reportType, const uint8_t& reportId) const { for (const auto& report : m_reports) { if (report.m_reportType == reportType && report.m_reportId == reportId) { - return &report; + return report; } } - return nullptr; + return std::nullopt; } // HID Report Descriptor Parser @@ -518,15 +521,16 @@ Collection HidReportDescriptor::parse() { return collection; } -const Report* HidReportDescriptor::getReport( +std::optional> +HidReportDescriptor::getReport( const HidReportType& reportType, const uint8_t& reportId) const { for (const auto& collection : m_topLevelCollections) { - const Report* report = collection.getReport(reportType, reportId); - if (report != nullptr) { + auto report = collection.getReport(reportType, reportId); + if (report) { return report; } } - return nullptr; + return std::nullopt; } std::vector> diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index 270f918287d2..8b95e1f17374 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include namespace hid::reportDescriptor { @@ -184,7 +186,9 @@ class Collection { public: Collection() = default; void addReport(const Report& report); - const Report* getReport(const HidReportType& reportType, const std::uint8_t& reportId) const; + std::optional> getReport( + const HidReportType& reportType, + const std::uint8_t& reportId) const; const std::vector& getReports() const { return m_reports; } @@ -203,7 +207,9 @@ class HidReportDescriptor { } Collection parse(); - const Report* getReport(const HidReportType& reportType, const std::uint8_t& reportId) const; + std::optional> getReport( + const HidReportType& reportType, + const std::uint8_t& reportId) const; std::vector> getListOfReports() const; private: diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp index 5bfb8f88cb99..f5da9e57ba10 100644 --- a/src/test/controller_hid_reportdescriptor_test.cpp +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -51,15 +51,17 @@ TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { ASSERT_EQ(collectionIdx, 0); // Use getReport to get the report - const Report* pReport = parser.getReport(reportType, reportId); - ASSERT_NE(pReport, nullptr); + auto reportOpt = parser.getReport(reportType, reportId); + ASSERT_TRUE(reportOpt.has_value()); + + const auto& report = reportOpt->get(); // Validate Report fields - ASSERT_EQ(pReport->m_reportType, reportType); - ASSERT_EQ(pReport->m_reportId, reportId); + ASSERT_EQ(report.m_reportType, reportType); + ASSERT_EQ(report.m_reportId, reportId); // Validate all Control fields - const std::vector& controls = pReport->getControls(); + const std::vector& controls = report.getControls(); ASSERT_EQ(controls.size(), 5); // Mouse Button 1 From 306979eb75eff6a187e69a9712badf150c1408e7 Mon Sep 17 00:00:00 2001 From: Joerg Date: Mon, 19 May 2025 00:22:34 +0200 Subject: [PATCH 109/163] Refactor HID report descriptor passing using std::shared_ptr and references. Simplified logic, to make the data flow easier understandable --- .../controllerhidreporttabsmanager.cpp | 30 +++++++--------- src/controllers/hid/hidcontroller.cpp | 20 +++++++---- src/controllers/hid/hidcontroller.h | 9 ++--- src/controllers/hid/hiddevice.cpp | 32 ++++++++++------- src/controllers/hid/hiddevice.h | 4 +-- src/controllers/hid/hidiothread.cpp | 8 ++--- src/controllers/hid/hidiothread.h | 4 +-- src/controllers/hid/hidreportdescriptor.cpp | 35 +++++++++---------- src/controllers/hid/hidreportdescriptor.h | 9 +++-- .../controller_hid_reportdescriptor_test.cpp | 7 ++-- 10 files changed, 84 insertions(+), 74 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 81749ba1d679..04b2e46946c5 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -66,15 +66,14 @@ void ControllerHidReportTabsManager::createReportTypeTabs() { void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentReportTypeTab, hid::reportDescriptor::HidReportType reportType) { - const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); - if (!reportDescriptorTemp.has_value()) { + auto reportDescriptor = m_pHidController->getReportDescriptor(); + if (!reportDescriptor) { return; } - const auto& reportDescriptor = *reportDescriptorTemp; QMetaEnum metaEnum = QMetaEnum::fromType(); - for (const auto& reportInfo : reportDescriptor.getListOfReports()) { + for (const auto& reportInfo : reportDescriptor->getListOfReports()) { auto [index, type, reportId] = reportInfo; if (type == reportType) { // Report is a fixed HID term and shouldn't be translated @@ -108,7 +107,7 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor auto pTable = make_parented(pTabWidget); pLayout->addWidget(pTable); - auto reportOpt = reportDescriptor.getReport(reportType, reportId); + auto reportOpt = reportDescriptor->getReport(reportType, reportId); if (reportOpt) { const auto& report = reportOpt->get(); // Show payload size @@ -198,13 +197,12 @@ void ControllerHidReportTabsManager::slotProcessInputReport( } QTableWidget* pTable = it->second; - const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); - if (!reportDescriptorTemp.has_value()) { + auto reportDescriptor = m_pHidController->getReportDescriptor(); + if (!reportDescriptor) { return; } - const auto& reportDescriptor = *reportDescriptorTemp; - auto reportOpt = reportDescriptor.getReport( + auto reportOpt = reportDescriptor->getReport( hid::reportDescriptor::HidReportType::Input, reportId); if (reportOpt) { updateTableWithReportData(pTable, data); @@ -234,13 +232,12 @@ void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, return; } - const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); - if (!reportDescriptorTemp.has_value()) { + auto reportDescriptor = m_pHidController->getReportDescriptor(); + if (!reportDescriptor) { return; } - const auto& reportDescriptor = *reportDescriptorTemp; - auto reportOpt = reportDescriptor.getReport(reportType, reportId); + auto reportOpt = reportDescriptor->getReport(reportType, reportId); VERIFY_OR_DEBUG_ASSERT(reportOpt) { return; } @@ -272,13 +269,12 @@ void ControllerHidReportTabsManager::slotSendReport(QTableWidget* pTable, return; } - const auto& reportDescriptorTemp = m_pHidController->getReportDescriptor(); - if (!reportDescriptorTemp.has_value()) { + auto reportDescriptor = m_pHidController->getReportDescriptor(); + if (!reportDescriptor) { return; } - const auto& reportDescriptor = *reportDescriptorTemp; - auto reportOpt = reportDescriptor.getReport(reportType, reportId); + auto reportOpt = reportDescriptor->getReport(reportType, reportId); VERIFY_OR_DEBUG_ASSERT(reportOpt) { return; } diff --git a/src/controllers/hid/hidcontroller.cpp b/src/controllers/hid/hidcontroller.cpp index 8e74b93a3c1a..4807a9807297 100644 --- a/src/controllers/hid/hidcontroller.cpp +++ b/src/controllers/hid/hidcontroller.cpp @@ -162,16 +162,22 @@ int HidController::open(const QString& resourcePath) { return -1; } - m_rawReportDescriptor = m_deviceInfo.fetchRawReportDescriptor(pHidDevice); - - if (m_rawReportDescriptor.has_value()) { - m_reportDescriptor = hid::reportDescriptor::HidReportDescriptor( - m_rawReportDescriptor->data(), m_rawReportDescriptor->size()); + // When fetching the report descriptor, from m_deviceInfo or if not read yet from the device + const std::vector& rawReportDescriptor = + m_deviceInfo.fetchRawReportDescriptor(pHidDevice); + + if (!rawReportDescriptor.empty()) { + m_reportDescriptor = + std::make_shared( + rawReportDescriptor); m_reportDescriptor->parse(); - m_deviceHasReportIds = m_reportDescriptor->isDeviceWithReportIds(); + m_deviceUsesReportIds = m_reportDescriptor->isDeviceWithReportIds(); + } else { + m_reportDescriptor.reset(); + m_deviceUsesReportIds = std::nullopt; } - m_pHidIoThread = std::make_unique(pHidDevice, m_deviceInfo, m_deviceHasReportIds); + m_pHidIoThread = std::make_unique(pHidDevice, m_deviceInfo, m_deviceUsesReportIds); m_pHidIoThread->setObjectName(QStringLiteral("HidIoThread ") + getName()); connect(m_pHidIoThread.get(), diff --git a/src/controllers/hid/hidcontroller.h b/src/controllers/hid/hidcontroller.h index eb7b236d749c..b8805bf180ac 100644 --- a/src/controllers/hid/hidcontroller.h +++ b/src/controllers/hid/hidcontroller.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "controllers/controller.h" #include "controllers/hid/hiddevice.h" #include "controllers/hid/hidiothread.h" @@ -72,7 +74,7 @@ class HidController final : public Controller { return m_deviceInfo.getUsageDescription(); } - const std::optional& getReportDescriptor() const { + std::shared_ptr getReportDescriptor() const { return m_reportDescriptor; } @@ -99,9 +101,8 @@ class HidController final : public Controller { mixxx::hid::DeviceInfo m_deviceInfo; // These optional members are not set before opening the device - std::optional> m_rawReportDescriptor; - std::optional m_reportDescriptor; - std::optional m_deviceHasReportIds; + std::shared_ptr m_reportDescriptor; + std::optional m_deviceUsesReportIds; std::unique_ptr m_pHidIoThread; std::unique_ptr m_pMapping; diff --git a/src/controllers/hid/hiddevice.cpp b/src/controllers/hid/hiddevice.cpp index f39ba50c9505..276345c24295 100644 --- a/src/controllers/hid/hiddevice.cpp +++ b/src/controllers/hid/hiddevice.cpp @@ -52,21 +52,27 @@ DeviceInfo::DeviceInfo(const hid_device_info& device_info) m_serialNumberRaw.data(), m_serialNumberRaw.size())) { } -std::optional> DeviceInfo::fetchRawReportDescriptor(hid_device* pHidDevice) { - if (!m_reportDescriptor) { - if (!pHidDevice) { - return std::nullopt; - } +const std::vector& DeviceInfo::fetchRawReportDescriptor(hid_device* pHidDevice) { + if (!pHidDevice) { + static const std::vector emptyDescriptor; + return emptyDescriptor; + } + if (!m_reportDescriptor.empty()) { + // + return m_reportDescriptor; + } - uint8_t tempReportDescriptor[HID_API_MAX_REPORT_DESCRIPTOR_SIZE]; - int descriptorSize = hid_get_report_descriptor(pHidDevice, - tempReportDescriptor, - HID_API_MAX_REPORT_DESCRIPTOR_SIZE); - if (descriptorSize > 0) { - m_reportDescriptor = std::vector(tempReportDescriptor, - tempReportDescriptor + descriptorSize); - } + uint8_t tempReportDescriptor[HID_API_MAX_REPORT_DESCRIPTOR_SIZE]; + int descriptorSize = hid_get_report_descriptor(pHidDevice, + tempReportDescriptor, + HID_API_MAX_REPORT_DESCRIPTOR_SIZE); + if (descriptorSize <= 0) { + static const std::vector emptyDescriptor; + return emptyDescriptor; } + m_reportDescriptor = std::vector(tempReportDescriptor, + tempReportDescriptor + descriptorSize); + return m_reportDescriptor; } diff --git a/src/controllers/hid/hiddevice.h b/src/controllers/hid/hiddevice.h index f44174b6d9a2..194be47969bd 100644 --- a/src/controllers/hid/hiddevice.h +++ b/src/controllers/hid/hiddevice.h @@ -108,7 +108,7 @@ class DeviceInfo final { // We need an opened hid_device here, // but the lifetime of the data is as long as DeviceInfo exists, // means the reportDescriptor data remains valid after closing the hid_device - std::optional> fetchRawReportDescriptor(hid_device* pHidDevice); + const std::vector& fetchRawReportDescriptor(hid_device* pHidDevice); bool isValid() const { return !getProductString().isNull() && !getSerialNumber().isNull(); @@ -141,7 +141,7 @@ class DeviceInfo final { QString m_productString; QString m_serialNumber; - std::optional> m_reportDescriptor; + std::vector m_reportDescriptor; }; } // namespace hid diff --git a/src/controllers/hid/hidiothread.cpp b/src/controllers/hid/hidiothread.cpp index 989709a02e99..f4d05000c745 100644 --- a/src/controllers/hid/hidiothread.cpp +++ b/src/controllers/hid/hidiothread.cpp @@ -29,7 +29,7 @@ QString loggingCategoryPrefix(const QString& deviceName) { HidIoThread::HidIoThread(hid_device* pHidDevice, const mixxx::hid::DeviceInfo& deviceInfo, - std::optional deviceHasReportIds) + std::optional deviceUsesReportIds) : QThread(), m_deviceInfo(deviceInfo), // Defining RuntimeLoggingCategories locally in this thread improves @@ -43,7 +43,7 @@ HidIoThread::HidIoThread(hid_device* pHidDevice, m_lastPollSize(0), m_pollingBufferIndex(0), m_hidReadErrorLogged(false), - m_deviceHasReportIds(deviceHasReportIds), + m_deviceUsesReportIds(deviceUsesReportIds), m_globalOutputReportFifo(), m_runLoopSemaphore(1) { // Initializing isn't strictly necessary but is good practice. @@ -155,8 +155,8 @@ void HidIoThread::processInputReport(int bytesRead) { bytesRead), mixxx::Time::elapsed()); - if (m_deviceHasReportIds.has_value() && bytesRead > 0) { - if (m_deviceHasReportIds.value()) { + if (m_deviceUsesReportIds.has_value() && bytesRead > 0) { + if (m_deviceUsesReportIds.value()) { // Extract the ReportId from the buffer quint8 reportId = pCurrentBuffer[0]; emit reportReceived(reportId, diff --git a/src/controllers/hid/hidiothread.h b/src/controllers/hid/hidiothread.h index 9819a661d6fa..4520a9d26899 100644 --- a/src/controllers/hid/hidiothread.h +++ b/src/controllers/hid/hidiothread.h @@ -25,7 +25,7 @@ class HidIoThread : public QThread { public: HidIoThread(hid_device* pDevice, const mixxx::hid::DeviceInfo& deviceInfo, - std::optional deviceHasReportIds); + std::optional deviceUsesReportIds); ~HidIoThread() override; void run() override; @@ -83,7 +83,7 @@ class HidIoThread : public QThread { int m_pollingBufferIndex; bool m_hidReadErrorLogged; - std::optional m_deviceHasReportIds; + std::optional m_deviceUsesReportIds; /// Must be locked when a operation changes the size of the m_outputReports map, /// or when modify the m_outputReportIterator diff --git a/src/controllers/hid/hidreportdescriptor.cpp b/src/controllers/hid/hidreportdescriptor.cpp index 548851e1419b..ecd32f1c15e4 100644 --- a/src/controllers/hid/hidreportdescriptor.cpp +++ b/src/controllers/hid/hidreportdescriptor.cpp @@ -191,16 +191,15 @@ Collection::getReport( } // HID Report Descriptor Parser -HidReportDescriptor::HidReportDescriptor(const uint8_t* pData, size_t length) - : m_pData(pData), - m_length(length), +HidReportDescriptor::HidReportDescriptor(const std::vector& data) + : m_data(data), m_pos(0), - m_deviceHasReportIds(kNotSet), + m_deviceUsesReportIds(kNotSet), m_collectionLevel(0) { } std::pair HidReportDescriptor::readTag() { - uint8_t byte = m_pData[m_pos++]; + uint8_t byte = m_data[m_pos++]; VERIFY_OR_DEBUG_ASSERT(byte != static_cast(HidItemSize::LongItemKeyword)){ @@ -223,25 +222,25 @@ uint32_t HidReportDescriptor::readPayload(HidItemSize payloadSize) { case HidItemSize::ZeroBytePayload: return 0; case HidItemSize::OneBytePayload: - VERIFY_OR_DEBUG_ASSERT(m_pos + 1 <= m_length) { + VERIFY_OR_DEBUG_ASSERT(m_pos + 1 <= m_data.size()) { return 0; } - return m_pData[m_pos++]; + return m_data[m_pos++]; case HidItemSize::TwoBytePayload: - VERIFY_OR_DEBUG_ASSERT(m_pos + 2 <= m_length) { + VERIFY_OR_DEBUG_ASSERT(m_pos + 2 <= m_data.size()) { return 0; } - payload = m_pData[m_pos++]; - payload |= m_pData[m_pos++] << 8; + payload = m_data[m_pos++]; + payload |= m_data[m_pos++] << 8; return payload; case HidItemSize::FourBytePayload: - VERIFY_OR_DEBUG_ASSERT(m_pos + 4 <= m_length) { + VERIFY_OR_DEBUG_ASSERT(m_pos + 4 <= m_data.size()) { return 0; } - payload = m_pData[m_pos++]; - payload |= m_pData[m_pos++] << 8; - payload |= m_pData[m_pos++] << 16; - payload |= m_pData[m_pos++] << 24; + payload = m_data[m_pos++]; + payload |= m_data[m_pos++] << 8; + payload |= m_data[m_pos++] << 16; + payload |= m_data[m_pos++] << 24; return payload; default: DEBUG_ASSERT(true); @@ -312,7 +311,7 @@ Collection HidReportDescriptor::parse() { // Local item values LocalItems localItems; - while (m_pos < m_length) { + while (m_pos < m_data.size()) { auto [tag, size] = readTag(); auto payload = readPayload(size); @@ -403,9 +402,9 @@ Collection HidReportDescriptor::parse() { if (pCurrentReport == nullptr) { // First control of this device if (globalItems.reportId == kNoReportId) { - m_deviceHasReportIds = false; + m_deviceUsesReportIds = false; } else { - m_deviceHasReportIds = true; + m_deviceUsesReportIds = true; } pCurrentReport = std::make_unique(getReportType(tag), globalItems.reportId); } else if (pCurrentReport->m_reportType != getReportType(tag) || diff --git a/src/controllers/hid/hidreportdescriptor.h b/src/controllers/hid/hidreportdescriptor.h index 8b95e1f17374..cd51e33adf10 100644 --- a/src/controllers/hid/hidreportdescriptor.h +++ b/src/controllers/hid/hidreportdescriptor.h @@ -200,10 +200,10 @@ class Collection { // Class for parsing HID report descriptors class HidReportDescriptor { public: - HidReportDescriptor(const std::uint8_t* pData, std::size_t length); + explicit HidReportDescriptor(const std::vector& data); bool isDeviceWithReportIds() const { - return m_deviceHasReportIds; + return m_deviceUsesReportIds; } Collection parse(); @@ -250,11 +250,10 @@ class HidReportDescriptor { HidReportType getReportType(HidItemTag tag); - const std::uint8_t* m_pData; - std::size_t m_length; + const std::vector& m_data; std::size_t m_pos; - bool m_deviceHasReportIds; + bool m_deviceUsesReportIds; std::vector globalItemsStack; diff --git a/src/test/controller_hid_reportdescriptor_test.cpp b/src/test/controller_hid_reportdescriptor_test.cpp index f5da9e57ba10..e12a2f23d9db 100644 --- a/src/test/controller_hid_reportdescriptor_test.cpp +++ b/src/test/controller_hid_reportdescriptor_test.cpp @@ -1,6 +1,7 @@ #include #include +#include #include "controllers/hid/hidreportdescriptor.h" @@ -40,14 +41,16 @@ uint8_t reportDescriptor[] = { // clang-format on TEST(HidReportDescriptorParserTest, ParseReportDescriptor) { - HidReportDescriptor parser(reportDescriptor, sizeof(reportDescriptor)); + const std::vector reportDescriptorVector( + reportDescriptor, reportDescriptor + sizeof(reportDescriptor)); + HidReportDescriptor parser(reportDescriptorVector); Collection collection = parser.parse(); // Use getListOfReports to get the list of reports auto reportsList = parser.getListOfReports(); ASSERT_EQ(reportsList.size(), 1); - auto [collectionIdx, reportType, reportId] = reportsList[0]; + auto& [collectionIdx, reportType, reportId] = reportsList[0]; ASSERT_EQ(collectionIdx, 0); // Use getReport to get the report From 1866f526ff92043df45a037a5f97975b9a8eb9ef Mon Sep 17 00:00:00 2001 From: Joerg Date: Mon, 19 May 2025 19:06:11 +0200 Subject: [PATCH 110/163] Ensure memory lifetime of m_reportIdToTableMap --- src/controllers/controllerhidreporttabsmanager.cpp | 8 ++++++++ src/controllers/controllerhidreporttabsmanager.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 04b2e46946c5..f74dcd8b4363 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -146,6 +146,10 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor if (reportType == hid::reportDescriptor::HidReportType::Input) { // Store the pTable pointer associated with the reportId m_reportIdToTableMap[reportId] = pTable; + // Ensure that the table entry gets deleted when the table is destroyed + connect(pTable, &QObject::destroyed, this, [this, reportId]() { + m_reportIdToTableMap.erase(reportId); + }); } // Connect the signal for the reportId @@ -197,6 +201,10 @@ void ControllerHidReportTabsManager::slotProcessInputReport( } QTableWidget* pTable = it->second; + VERIFY_OR_DEBUG_ASSERT(pTable) { + return; + } + auto reportDescriptor = m_pHidController->getReportDescriptor(); if (!reportDescriptor) { return; diff --git a/src/controllers/controllerhidreporttabsmanager.h b/src/controllers/controllerhidreporttabsmanager.h index a8b23aa1dd4f..5e5a487f157d 100644 --- a/src/controllers/controllerhidreporttabsmanager.h +++ b/src/controllers/controllerhidreporttabsmanager.h @@ -36,7 +36,7 @@ class ControllerHidReportTabsManager : public QObject { void updateTableWithReportData(QTableWidget* pTable, const QByteArray& reportData); QTabWidget* m_pParentControllerTab; HidController* m_pHidController; - std::unordered_map m_reportIdToTableMap; + std::unordered_map> m_reportIdToTableMap; }; class ValueItemDelegate : public QStyledItemDelegate { From b33295b250273279858486a06fc02eafb63e9b72 Mon Sep 17 00:00:00 2001 From: Joerg Date: Tue, 20 May 2025 00:43:56 +0200 Subject: [PATCH 111/163] Use guarded pointers for m_pParentControllerTab; and m_pHidController --- .../controllerhidreporttabsmanager.cpp | 22 +++++++++++++++---- .../controllerhidreporttabsmanager.h | 5 +++-- src/controllers/dlgprefcontroller.cpp | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index f74dcd8b4363..1372014a5c4e 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -47,6 +47,9 @@ ControllerHidReportTabsManager::ControllerHidReportTabsManager( } void ControllerHidReportTabsManager::createReportTypeTabs() { + VERIFY_OR_DEBUG_ASSERT(m_pParentControllerTab) { + return; + } auto reportTypeTabs = make_parented(m_pParentControllerTab); QMetaEnum metaEnum = QMetaEnum::fromType(); @@ -66,6 +69,9 @@ void ControllerHidReportTabsManager::createReportTypeTabs() { void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentReportTypeTab, hid::reportDescriptor::HidReportType reportType) { + VERIFY_OR_DEBUG_ASSERT(m_pHidController) { + return; + } auto reportDescriptor = m_pHidController->getReportDescriptor(); if (!reportDescriptor) { return; @@ -154,10 +160,12 @@ void ControllerHidReportTabsManager::createHidReportTab(QTabWidget* pParentRepor // Connect the signal for the reportId HidIoThread* hidIoThread = m_pHidController->getHidIoThread(); - connect(hidIoThread, - &HidIoThread::reportReceived, - this, - &ControllerHidReportTabsManager::slotProcessInputReport); + if (hidIoThread) { + connect(hidIoThread, + &HidIoThread::reportReceived, + this, + &ControllerHidReportTabsManager::slotProcessInputReport); + } } } } @@ -193,6 +201,9 @@ void ControllerHidReportTabsManager::updateTableWithReportData( void ControllerHidReportTabsManager::slotProcessInputReport( quint8 reportId, const QByteArray& data) { + VERIFY_OR_DEBUG_ASSERT(m_pHidController) { + return; + } // Find the table associated with the reportId auto it = m_reportIdToTableMap.find(reportId); if (it == m_reportIdToTableMap.end()) { @@ -220,6 +231,9 @@ void ControllerHidReportTabsManager::slotProcessInputReport( void ControllerHidReportTabsManager::slotReadReport(QTableWidget* pTable, quint8 reportId, hid::reportDescriptor::HidReportType reportType) { + VERIFY_OR_DEBUG_ASSERT(m_pHidController) { + return; + } if (!m_pHidController->isOpen()) { qWarning() << "HID controller is not open."; return; diff --git a/src/controllers/controllerhidreporttabsmanager.h b/src/controllers/controllerhidreporttabsmanager.h index 5e5a487f157d..434276bb3a6e 100644 --- a/src/controllers/controllerhidreporttabsmanager.h +++ b/src/controllers/controllerhidreporttabsmanager.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -34,8 +35,8 @@ class ControllerHidReportTabsManager : public QObject { private: void updateTableWithReportData(QTableWidget* pTable, const QByteArray& reportData); - QTabWidget* m_pParentControllerTab; - HidController* m_pHidController; + QPointer m_pParentControllerTab; + QPointer m_pHidController; std::unordered_map> m_reportIdToTableMap; }; diff --git a/src/controllers/dlgprefcontroller.cpp b/src/controllers/dlgprefcontroller.cpp index 0c08c1a57fe6..1854faef4611 100644 --- a/src/controllers/dlgprefcontroller.cpp +++ b/src/controllers/dlgprefcontroller.cpp @@ -190,7 +190,7 @@ DlgPrefController::DlgPrefController( #ifdef __HID__ // Display HID UsagePage and Usage if the controller is an HidController - if (auto* hidController = dynamic_cast(m_pController)) { + if (auto* hidController = qobject_cast(m_pController)) { m_ui.labelHidUsagePageValue->setText(QStringLiteral("%1 (%2)") .arg(formatHex(hidController->getUsagePage()), hidController->getUsagePageDescription())); From 204ffce7a55d6bd93b9bcea93cab45655f7a55e1 Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 26 Jun 2025 18:53:48 +0200 Subject: [PATCH 112/163] Corrected use of pointer prefix p --- .../controllerhidreporttabsmanager.cpp | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 1372014a5c4e..98aa00e92a78 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -379,88 +379,88 @@ void ControllerHidReportTabsManager::populateHidReportTable( pTable->verticalHeader()->setVisible(false); int row = 0; - for (const auto& pControl : controls) { + for (const auto& control : controls) { // Column 0 - Byte Position - QTableWidgetItem* bytePositionItem = createReadOnlyItem( + QTableWidgetItem* pBytePositionItem = createReadOnlyItem( QStringLiteral("0x%1").arg( - QString::number(pControl.m_bytePosition, 16) + QString::number(control.m_bytePosition, 16) .rightJustified(2, '0') .toUpper()), true); - pTable->setItem(row, 0, bytePositionItem); + pTable->setItem(row, 0, pBytePositionItem); // Store custom data for the row in the first cell - bytePositionItem->setData(Qt::UserRole + 1, - QVariant::fromValue(&pControl)); + pBytePositionItem->setData(Qt::UserRole + 1, + QVariant::fromValue(&control)); // Column 1 - Bit Position - pTable->setItem(row, 1, createReadOnlyItem(QString::number(pControl.m_bitPosition), true)); + pTable->setItem(row, 1, createReadOnlyItem(QString::number(control.m_bitPosition), true)); // Column 2 - Bit Size - pTable->setItem(row, 2, createReadOnlyItem(QString::number(pControl.m_bitSize), true)); + pTable->setItem(row, 2, createReadOnlyItem(QString::number(control.m_bitSize), true)); // Column 3 - Logical Min pTable->setItem(row, 3, createReadOnlyItem( - QString::number(pControl.m_logicalMinimum), true)); + QString::number(control.m_logicalMinimum), true)); // Column 4 - Logical Max pTable->setItem(row, 4, createReadOnlyItem( - QString::number(pControl.m_logicalMaximum), true)); + QString::number(control.m_logicalMaximum), true)); // Column 5 - Value pTable->setItem(row, 5, - createValueItem(reportType, pControl.m_logicalMinimum, pControl.m_logicalMaximum)); + createValueItem(reportType, control.m_logicalMinimum, control.m_logicalMaximum)); // Column 6 - Physical Min pTable->setItem(row, 6, createReadOnlyItem( - QString::number(pControl.m_physicalMinimum), true)); + QString::number(control.m_physicalMinimum), true)); // Column 7 - Physical Max pTable->setItem(row, 7, createReadOnlyItem( - QString::number(pControl.m_physicalMaximum), true)); + QString::number(control.m_physicalMaximum), true)); // Column 8 - Unit Scaling pTable->setItem(row, 8, - createReadOnlyItem(pControl.m_unitExponent != 0 + createReadOnlyItem(control.m_unitExponent != 0 ? QStringLiteral("10^%1").arg( - pControl.m_unitExponent) + control.m_unitExponent) : QString(), true)); // Column 9 - Unit pTable->setItem(row, 9, createReadOnlyItem(hid::reportDescriptor::getScaledUnitString( - pControl.m_unit))); + control.m_unit))); // Column 10 - Abs/Rel pTable->setItem(row, 10, - createReadOnlyItem(pControl.m_flags.absolute_relative + createReadOnlyItem(control.m_flags.absolute_relative ? tr("Relative") : tr("Absolute"))); // Column 11 - Wrap pTable->setItem(row, 11, - createReadOnlyItem(pControl.m_flags.no_wrap_wrap + createReadOnlyItem(control.m_flags.no_wrap_wrap ? tr("Wrap") : tr("No Wrap"))); // Column 12 - Linear pTable->setItem(row, 12, - createReadOnlyItem(pControl.m_flags.linear_non_linear + createReadOnlyItem(control.m_flags.linear_non_linear ? tr("Non Linear") : tr("Linear"))); // Column 13 - Preferred pTable->setItem(row, 13, - createReadOnlyItem(pControl.m_flags.preferred_no_preferred + createReadOnlyItem(control.m_flags.preferred_no_preferred ? tr("No Preferred") : tr("Preferred"))); // Column 14 - Null pTable->setItem(row, 14, - createReadOnlyItem(pControl.m_flags.no_null_null + createReadOnlyItem(control.m_flags.no_null_null ? tr("Null") : tr("No Null"))); @@ -469,7 +469,7 @@ void ControllerHidReportTabsManager::populateHidReportTable( if (volatileIndex != -1) { pTable->setItem(row, volatileIndex, - createReadOnlyItem(pControl.m_flags.non_volatile_volatile + createReadOnlyItem(control.m_flags.non_volatile_volatile ? tr("Volatile") : tr("Non Volatile"))); } @@ -477,8 +477,8 @@ void ControllerHidReportTabsManager::populateHidReportTable( // Usage Page / Usage int usagePageIdx = showVolatileColumn ? 16 : 15; int usageDescIdx = showVolatileColumn ? 17 : 16; - uint16_t usagePage = static_cast((pControl.m_usage & 0xFFFF0000) >> 16); - uint16_t usage = static_cast(pControl.m_usage & 0x0000FFFF); + uint16_t usagePage = static_cast((control.m_usage & 0xFFFF0000) >> 16); + uint16_t usage = static_cast(control.m_usage & 0x0000FFFF); pTable->setItem(row, usagePageIdx, From 22aed6bf80f9a0f4e2d6de8221b147fd456d6b5e Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 26 Jun 2025 20:16:02 +0200 Subject: [PATCH 113/163] Clarified why the "Value" collumn of the table needs special handling --- src/controllers/controllerhidreporttabsmanager.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 98aa00e92a78..408f19408bb3 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -502,10 +502,12 @@ void ControllerHidReportTabsManager::populateHidReportTable( for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { columnWidths[colIdx] = pTable->columnWidth(colIdx); } - // Set the width of the value column (5) to fit 11 digits (int32 minimum in decimal) + // Set the width of the "Value" column (5) to fit 11 digits (int32 minimum in decimal) + // This is the only column in the table with dynamic content, therefore we need to + // set the width with enough reserved space. QFontMetrics metrics(pTable->font()); int width = metrics.horizontalAdvance(QStringLiteral("0").repeated(11)); - columnWidths[5] = width; + columnWidths[5] = width; // The column "Value" is at index 5 for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { pTable->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::Fixed); pTable->setColumnWidth(colIdx, columnWidths[colIdx]); From 15fa8f7c18372ac7162078b0f1761d71645926b6 Mon Sep 17 00:00:00 2001 From: Joerg Date: Thu, 26 Jun 2025 19:20:49 +0200 Subject: [PATCH 114/163] Use .reserve and .push_back for vector, instead of default initializer --- src/controllers/controllerhidreporttabsmanager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controllers/controllerhidreporttabsmanager.cpp b/src/controllers/controllerhidreporttabsmanager.cpp index 408f19408bb3..3194e5bd211b 100644 --- a/src/controllers/controllerhidreporttabsmanager.cpp +++ b/src/controllers/controllerhidreporttabsmanager.cpp @@ -498,9 +498,10 @@ void ControllerHidReportTabsManager::populateHidReportTable( for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { pTable->horizontalHeader()->setSectionResizeMode(colIdx, QHeaderView::ResizeToContents); } - QVector columnWidths(pTable->columnCount()); + QVector columnWidths; + columnWidths.reserve(pTable->columnCount()); for (int colIdx = 0; colIdx < pTable->columnCount(); ++colIdx) { - columnWidths[colIdx] = pTable->columnWidth(colIdx); + columnWidths.push_back(pTable->columnWidth(colIdx)); } // Set the width of the "Value" column (5) to fit 11 digits (int32 minimum in decimal) // This is the only column in the table with dynamic content, therefore we need to From 2fdebb1e2c21f6adf9a2ab9dbc17f7409111bedd Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 17 Aug 2025 17:23:39 +0000 Subject: [PATCH 115/163] fix: prevent memleak on WaveformMark::Graphics --- src/waveform/renderers/waveformmark.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/waveform/renderers/waveformmark.h b/src/waveform/renderers/waveformmark.h index 9dcd71d698a2..aabe11699d75 100644 --- a/src/waveform/renderers/waveformmark.h +++ b/src/waveform/renderers/waveformmark.h @@ -22,6 +22,14 @@ class WaveformMark { // To indicate that the image for the mark needs to be regenerated, // when the text, color, breadth or level are changed. bool m_obsolete{}; + Graphics() = default; + virtual ~Graphics() = default; + // non-copyable + Graphics(const Graphics&) = delete; + Graphics& operator=(const Graphics&) = delete; + // non-movable + Graphics(Graphics&&) = delete; + Graphics& operator=(Graphics&&) = delete; }; WaveformMark( From 7416c6a315db8886d4fef949065c65b38c00516c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Clau=C3=9Fen?= Date: Fri, 15 Aug 2025 12:03:46 +0200 Subject: [PATCH 116/163] xwax: Adjust gain compensation limit Since the signal loss of the derivative is compensated dynamically, the amplitude can be too high when the record is not spinning and you see a small signal. This doesn't fix this completely, but 25.0 is the sweet spot of reactiveness and sufficient amplification. --- lib/xwax/timecoder_mk2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/xwax/timecoder_mk2.c b/lib/xwax/timecoder_mk2.c index 4aadc3a3e791..125f683ef43a 100644 --- a/lib/xwax/timecoder_mk2.c +++ b/lib/xwax/timecoder_mk2.c @@ -326,8 +326,8 @@ void mk2_process_carrier(struct timecoder *tc, signed int primary, signed int se tc->gain_compensation = (double)tc->secondary.mk2.rms / tc->secondary.mk2.rms_deriv; /* Without this limit pitch becomes too sensitive */ - if (tc->gain_compensation > 30.0) - tc->gain_compensation = 30.0; + if (tc->gain_compensation > 25.0) + tc->gain_compensation = 25.0; tc->dB = 20 * log10((double)tc->secondary.mk2.rms / INT_MAX); From 69b1a1e608b376d35db1ca1039e4c5a4dad798d1 Mon Sep 17 00:00:00 2001 From: Antoine C Date: Sun, 15 Sep 2024 01:57:38 +0100 Subject: [PATCH 117/163] feat: add screen rendering for S4Mk3 --- .../Traktor Kontrol S4 MK3.bulk.xml | 945 ++++++++++++++++++ .../TraktorKontrolS4MK3Screens.qml | 217 ++++ .../AdvancedScreen/Overlays/TopControls.qml | 348 +++++++ .../Waveform/WaveformContainer.qml | 234 +++++ .../S4MK3/BPMIndicator.qml | 77 ++ .../S4MK3/HotcuePoint.qml | 199 ++++ .../S4MK3/KeyIndicator.qml | 127 +++ .../S4MK3/Keyboard.qml | 140 +++ .../S4MK3/LoopSizeIndicator.qml | 75 ++ .../S4MK3/OnAirTrack.qml | 81 ++ .../S4MK3/Progression.qml | 53 + .../S4MK3/SplashOff.qml | 15 + .../S4MK3/StockScreen.qml | 634 ++++++++++++ .../S4MK3/TimeAndBeatloopIndicator.qml | 107 ++ .../S4MK3/WaveformOverview.qml | 165 +++ .../TraktorKontrolS4MK3Screens/S4MK3/qmldir | 12 + src/controllers/bulk/bulksupported.h | 1 + tools/README | 8 + tools/clang_format.py | 2 +- tools/traktor_s4_mk3_screen_test.c | 110 ++ 20 files changed, 3549 insertions(+), 1 deletion(-) create mode 100644 res/controllers/Traktor Kontrol S4 MK3.bulk.xml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopControls.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/HotcuePoint.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir create mode 100644 tools/traktor_s4_mk3_screen_test.c diff --git a/res/controllers/Traktor Kontrol S4 MK3.bulk.xml b/res/controllers/Traktor Kontrol S4 MK3.bulk.xml new file mode 100644 index 000000000000..c7bc44712ea7 --- /dev/null +++ b/res/controllers/Traktor Kontrol S4 MK3.bulk.xml @@ -0,0 +1,945 @@ + + + + Traktor Kontrol S4 MK3 (Screens) + A. Colombier + Mapping for Traktor Kontrol S4 MK3 screens + native_instruments_traktor_kontrol_s4_mk3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/controllers/TraktorKontrolS4MK3Screens.qml b/res/controllers/TraktorKontrolS4MK3Screens.qml new file mode 100644 index 000000000000..fe5225032783 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens.qml @@ -0,0 +1,217 @@ +import QtQuick 2.15 +import QtQuick.Window 2.3 + +import QtQuick.Controls 2.15 +import QtQuick.Shapes 1.11 +import QtQuick.Layouts 1.3 +import QtQuick.Window 2.15 + +import Qt5Compat.GraphicalEffects + +import "." as Skin +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +import S4MK3 as S4MK3 + +Mixxx.ControllerScreen { + id: root + + required property string screenId + property color fontColor: Qt.rgba(242/255,242/255,242/255, 1) + property color smallBoxBorder: Qt.rgba(44/255,44/255,44/255, 1) + + property string group: screenId == "rightdeck" ? "[Channel2]" : "[Channel1]" + property string theme: engine.getSetting("theme") + + readonly property bool isStockTheme: theme == "stock" + + property var lastFrame: null + + init: function(_controllerName, isDebug) { + console.log(`Screen ${root.screenId} has started with theme ${root.theme}`) + root.state = "Live" + } + + shutdown: function() { + console.log(`Screen ${root.screenId} is stopping`) + root.state = "Stop" + } + + transformFrame: function(input, timestamp) { + let updated = new Uint8Array(320*240); + updated.fill(0) + + let updatedPixelCount = 0; + let updated_zones = []; + + if (!root.lastFrame) { + root.lastFrame = new ArrayBuffer(input.byteLength); + updatedPixelCount = input.byteLength / 2; + updated_zones.push({ + x: 0, + y: 0, + width: 320, + height: 240, + }) + } else { + const view_input = new Uint8Array(input); + const view_last = new Uint8Array(root.lastFrame); + + for (let i = 0; i < 320 * 240; i++) { + } + + let current_rect = null; + + for (let y = 0; y < 240; y++) { + let line_changed = false; + for (let x = 0; x < 320; x++) { + let i = y * 320 + x; + if (view_input[2 * i] != view_last[2 * i] || view_input[2 * i + 1] != view_last[2 * i + 1]) { + line_changed = true; + updatedPixelCount++; + break; + } + } + if (current_rect !== null && line_changed) { + current_rect.height++; + } else if (current_rect !== null) { + updated_zones.push(current_rect); + current_rect = null; + } else if (current_rect === null && line_changed) { + current_rect = { + x: 0, + y, + width: 320, + height: 1, + }; + } + } + if (current_rect !== null) { + updated_zones.push(current_rect); + } + } + new Uint8Array(root.lastFrame).set(new Uint8Array(input)); + + if (!updatedPixelCount) { + return new ArrayBuffer(0); + } else if (root.renderDebug) { + console.log(`Pixel updated: ${updatedPixelCount}, ${updated_zones.length} areas`); + } + + // No redraw needed, stop right there + + let totalPixelToDraw = 0; + for (const area of updated_zones) { + area.x -= Math.min(2, area.x); + area.y -= Math.min(2, area.y); + area.width += Math.min(4, 320 - area.x - area.width); + area.height += Math.min(4, 240 - area.y - area.height); + totalPixelToDraw += area.width*area.height; + } + + if (totalPixelToDraw != 320*240 && (totalPixelToDraw > 320 * 180 || updated_zones.length > 20)) { + if (root.renderDebug) { + console.log(`Full redraw instead of ${totalPixelToDraw} pixels/${updated_zones.length} areas`) + } + totalPixelToDraw = 320*240 + updated_zones = [{ + x: 0, + y: 0, + width: 320, + height: 240, + }] + } else if (root.renderDebug) { + console.log(`Redrawing ${totalPixelToDraw} pixels`) + } + + const screenIdx = screenId === "leftdeck" ? 0 : 1; + + const outputData = new ArrayBuffer(totalPixelToDraw*2 + 20*updated_zones.length); // Number of pixel + 20 (header/footer size) x the number of region + let offset = 0; + + for (const area of updated_zones) { + const header = new Uint8Array(outputData, offset, 16); + const payload = new Uint8Array(outputData, offset + 16, area.width*area.height*2); + const footer = new Uint8Array(outputData, offset + area.width*area.height*2 + 16, 4); + + header.fill(0) + footer.fill(0) + header[0] = 0x84; + header[2] = screenIdx; + header[3] = 0x21; + + header[8] = area.x >> 8; + header[9] = area.x & 0xff; + header[10] = area.y >> 8; + header[11] = area.y & 0xff; + + header[12] = area.width >> 8; + header[13] = area.width & 0xff; + header[14] = area.height >> 8; + header[15] = area.height & 0xff; + + if (area.x === 0 && area.width === 320) { + payload.set(new Uint8Array(input, area.y * 320 * 2, area.width*area.height*2)); + } else { + for (let y = 0; y < area.height; y++) { + payload.set( + new Uint8Array(input, ((area.y + y) * 320 + area.x) * 2, area.width * 2), + y * area.width * 2); + } + } + footer[0] = 0x40; + footer[2] = screenIdx; + offset += area.width*area.height*2 + 20 + } + if (root.renderDebug) { + console.log(`Generated ${offset} bytes to be sent`) + } + // return new ArrayBuffer(0); + return outputData; + } + + Component { + id: splashOff + S4MK3.SplashOff { + anchors.fill: parent + } + } + Component { + id: stockLive + S4MK3.StockScreen { + group: root.group + screenId: root.screenId + anchors.fill: parent + } + } + Component { + id: advancedLive + S4MK3.AdvancedScreen { + isLeftScreen: root.screenId == "leftdeck" + } + } + + Loader { + id: loader + anchors.fill: parent + sourceComponent: splashOff + } + + states: [ + State { + name: "Live" + PropertyChanges { + target: loader + sourceComponent: isStockTheme ? stockLive : advancedLive + } + }, + State { + name: "Stop" + PropertyChanges { + target: loader + sourceComponent: splashOff + } + } + ] +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopControls.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopControls.qml new file mode 100755 index 000000000000..3fb7fa1defa3 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopControls.qml @@ -0,0 +1,348 @@ +import QtQuick 2.15 + +import '../Defines' as Defines +import '../Widgets' as Widgets + +import Mixxx 1.0 as Mixxx + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: topLabels + + property int topMargin: 0 + + property string showHideState: "hide" + property int fxUnit: 0 + property int yPositionWhenHidden: 0 - topLabels.height - headerBlackLine.height - headerShadow.height // also hides black border & shadow + property int yPositionWhenShown: topMargin + + readonly property color barBgColor: "black" + + property var fxModel: Mixxx.EffectsManager.visibleEffectsModel + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + + height: 40 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: topInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: topLabels.height + color: colors.colorFxHeaderBg + // light grey background + Rectangle { + id:topInfoDetailsPanelLightBg + anchors { + top: parent.top + left: parent.left + } + height: topLabels.height + width: 80 + color: colors.colorFxHeaderLightBg + } + } + +// // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:40; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 160 + height: 40 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 240 + height: 40 + } + + // Info Details + Rectangle { + id: topInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + // AppProperty { id: fxDryWet; path: "app.traktor.fx." + (fxUnit + 1) + ".dry_wet" } + + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}]` + key: `mix` + id: fxDryWet + property string description: "" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + + // AppProperty { id: fxParam1; path: "app.traktor.fx." + (fxUnit + 1) + ".parameters.1" } + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect1]` + key: `meta` + id: fxParam1 + property string description: "" + property var valueRange: ({isDiscrete: false, steps: 0}) + } + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect1]` + key: `enabled` + id: fxEnabled1 + } + QtObject { + id: fxKnob1name + + property Mixxx.EffectSlotProxy slot: Mixxx.EffectsManager.getEffectSlot(1, 1) + property string description: "Description" + property var value: "---" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + Mixxx.ControlProxy { + id: fxSelect1 + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect1]` + key: `loaded_effect` + onValueChanged: { + fxKnob1name.value = topLabels.fxModel.get(value).display + } + } + + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect2]` + key: `meta` + id: fxParam2 + property string description: "" + property var valueRange: ({isDiscrete: false, steps: 0}) + } + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect2]` + key: `enabled` + id: fxEnabled2 + } + QtObject { + id: fxKnob2name + + property Mixxx.EffectSlotProxy slot: Mixxx.EffectsManager.getEffectSlot(1, 2) + property string description: "Description" + property var value: "---" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + Mixxx.ControlProxy { + id: fxSelect2 + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect2]` + key: `loaded_effect` + onValueChanged: { + fxKnob2name.value = topLabels.fxModel.get(value).display + } + } + + // AppProperty { id: fxParam3; path: "app.traktor.fx." + (fxUnit + 1) + ".parameters.3" } + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect3]` + key: `meta` + id: fxParam3 + property string description: "" + property var valueRange: ({isDiscrete: false, steps: 0}) + } + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect3]` + key: `enabled` + id: fxEnabled3 + } + QtObject { + id: fxKnob3name + + property Mixxx.EffectSlotProxy slot: Mixxx.EffectsManager.getEffectSlot(1, 3) + property string description: "Description" + property var value: "---" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + Mixxx.ControlProxy { + id: fxSelect3 + group: `[EffectRack1_EffectUnit${fxUnit + 1}_Effect3]` + key: `loaded_effect` + onValueChanged: { + fxKnob3name.value = topLabels.fxModel.get(value).display + } + } + + Mixxx.ControlProxy { + group: `[EffectRack1_EffectUnit${fxUnit + 1}]` + key: "enabled" + id: fxOn + property string description: "Description" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: fxButton1; path: "app.traktor.fx." + (fxUnit + 1) + ".buttons.1" } + QtObject { + id: fxButton1 + property string description: "Description" + property var value: fxEnabled1.value + property var valueRange: ({isDiscrete: true, steps: 1}) + } + + // AppProperty { id: fxButton1name; path: "app.traktor.fx." + (fxUnit + 1) + ".buttons.1.name" } + QtObject { + id: fxButton1name + property string description: "Description" + property var value: "ON" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: fxButton2; path: "app.traktor.fx." + (fxUnit + 1) + ".buttons.2" } + QtObject { + id: fxButton2 + property string description: "Description" + property var value: fxEnabled2.value + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: fxButton2name; path: "app.traktor.fx." + (fxUnit + 1) + ".buttons.2.name" } + QtObject { + id: fxButton2name + property string description: "Description" + property var value: "ON" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: fxButton3; path: "app.traktor.fx." + (fxUnit + 1) + ".buttons.3" } + QtObject { + id: fxButton3 + property string description: "Description" + property var value: fxEnabled3.value + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: fxButton3name; path: "app.traktor.fx." + (fxUnit + 1) + ".buttons.3.name" } + QtObject { + id: fxButton3name + property string description: "Description" + property var value: "ON" + property var valueRange: ({isDiscrete: true, steps: 1}) + } + + // AppProperty { id: fxType; path: "app.traktor.fx." + (fxUnit + 1) + ".type" } // singleMode -> fxSelect1.description else "DRY/WET" + QtObject { + id: fxType + property string description: "Description" + property var value: 0 + property var valueRange: ({isDiscrete: true, steps: 1}) + } + + Row { + id: controlRow + TopInfoDetails { + id: topInfoDetails1 + parameter: fxDryWet + isOn: fxOn.value + label: fxType.value == 1 ? ((fxSelect1.description == "Delay") ? "DELAY" : (fxSelect1.description == "Reverb") ? "REVRB" : (fxSelect1.description == "Flanger") ? "FLANG" : (fxSelect1.description == "Flanger Pulse") ? "FLN-P" : (fxSelect1.description == "Flanger Flux") ? "FLN-F" : (fxSelect1.description == "Gater") ? "GATER" : (fxSelect1.description == "Beatmasher 2") ? "BEATM" : (fxSelect1.description == "Delay T3") ? "T3DELAY" : (fxSelect1.description == "Filter LFO") ? "FLT-O" : (fxSelect1.description == "Filter Pulse") ? "FLT-P" : (fxSelect1.description == "Filter") ? "FILTR" : (fxSelect1.description == "Filter:92 Pulse") ? "F92-O" : (fxSelect1.description == "Filter:92 Pulse") ? "F92-P" : (fxSelect1.description == "Filter:92") ? "FLT92" : (fxSelect1.description == "Phaser") ? "PHFXASR" : (fxSelect1.description == "Phaser Pulse") ? "PHS-P" : (fxSelect1.description == "Phaser Flux") ? "PHS-F" : (fxSelect1.description == "Reverse Grain") ? "REVGR" : (fxSelect1.description == "Turntable FX") ? "TTFX" : (fxSelect1.description == "Iceverb") ? "ICEVB" : (fxSelect1.description == "Reverb T3") ? "T3REVRB" : (fxSelect1.description == "Ringmodulator") ? "RINGM" : (fxSelect1.description == "Digital LoFi") ? "LOFI" : (fxSelect1.description == "Mulholland Drive") ? "MHDRV" : (fxSelect1.description == "Transpose Stretch") ? "TRANS" : (fxSelect1.description == "BeatSlicer") ? "SLICER" : (fxSelect1.description == "Formant Filter") ? "FFTR" : (fxSelect1.description == "Peak Filter") ? "PFTR" : (fxSelect1.description == "Tape Delay") ? "TPDELAY" : (fxSelect1.description == "Ramp Delay") ? "RMPDLY" : (fxSelect1.description == "Auto Bouncer") ? "ABOUNCE" : (fxSelect1.description == "Bouncer") ? "BOUNCER" : (fxKnob3name.value == "LASLI") ? "LASLI" : (fxKnob3name.value == "GRANP") ? "GRANP" : (fxKnob3name.value == "B-O-M") ? "B-O-M" : (fxKnob3name.value == "POWIN") ? "POWIN" : (fxKnob3name.value == "EVNHR") ? "EVNHR" : (fxKnob3name.value == "ZZZRP") ? "ZZZRP" : (fxKnob3name.value == "STRRS") ? "STRRS" : (fxKnob3name.value == "STRRF") ? "STRRF" : (fxKnob3name.value == "DARKM") ? "DARKM" : (fxKnob3name.value == "FTEST") ? "FTEST" : fxSelect1.description) : "DRY/WET" + buttonLabel: fxType.value == 1 ? "ON" : "" + fxEnabled: (fxType.value != 1) || fxSelect1.value + barBgColor: topLabels.barBgColor + isPatternPlayer: (fxType.value == 2 ? true : false) + } + TopInfoDetails { + id: topInfoDetails2 + parameter: fxParam1 + isOn: fxButton1.value + label: fxKnob1name.value + buttonLabel: fxButton1name.value + fxEnabled: (fxSelect1.value || ((fxType.value == 1) && fxSelect1.value) ) + barBgColor: topLabels.barBgColor + isPatternPlayer: (fxType.value == 2 ? true : false) + } + + TopInfoDetails { + id: topInfoDetails3 + parameter: fxParam2 + isOn: fxButton2.value + label: fxKnob2name.value + buttonLabel: fxButton2name.value + fxEnabled: (fxSelect2.value || ((fxType.value == 1) && fxSelect1.value) ) + barBgColor: topLabels.barBgColor + isPatternPlayer: (fxType.value == 2 ? true : false) + } + + TopInfoDetails { + id: topInfoDetails4 + parameter: fxParam3 + isOn: fxButton3.value + label: fxKnob3name.value + buttonLabel: fxButton3name.value + fxEnabled: (fxSelect3.value || ((fxType.value == 1) && fxSelect1.value) ) + barBgColor: topLabels.barBgColor + isPatternPlayer: (fxType.value == 2 ? true : false) + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: topLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: topLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: topLabels; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml new file mode 100755 index 000000000000..92a9e7424451 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml @@ -0,0 +1,234 @@ +import QtQuick 2.15 + +import '../Defines' +import '../Widgets' as Widgets +import '../Overlays' as Overlays +import '../ViewModels' as ViewModels + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Item { + id: view + property int deckId: deckInfo.deckId + property string deckSizeState: "large" + property bool showLoopSize: false + property bool isInEditMode: false + property string propertiesPath: "" + property int zoomLevel: deckInfo.zoomLevel + readonly property int minSampleWidth: 2048 + property int sampleWidth: minSampleWidth << zoomLevel + property bool hideLoop: false + property bool hideBPM: false + property bool hideKey: false + + readonly property bool trackIsLoaded: deckInfo.isLoaded + + //-------------------------------------------------------------------------------------------------------------------- + + required property var deckInfo + + //-------------------------------------------------------------------------------------------------------------------- + // WAVEFORM Position + //------------------------------------------------------------------------------------------------------------------ + + Mixxx.ControlProxy { + id: scratchPositionEnableControl + + group: root.group + key: "scratch_position_enable" + } + + Mixxx.ControlProxy { + id: scratchPositionControl + + group: root.group + key: "scratch_position" + } + + Mixxx.ControlProxy { + id: wheelControl + + group: root.group + key: "wheel" + } + + Mixxx.ControlProxy { + id: rateRatioControl + + group: root.group + key: "rate_ratio" + } + + Mixxx.ControlProxy { + id: zoomControl + + group: root.group + key: "waveform_zoom" + } + + MixxxControls.WaveformDisplay { + id: singleWaveform + group: `[Channel${view.deckId}]` + x: 0 + width: 316 + // height: (settings.alwaysShowTempoInfo || deckInfo.adjustEnabled ? (settings.hideStripe ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38) : (!deckInfo.showBPMInfo ? (settings.hideStripe ? content.waveformHeight + display.secondRowHeight-13 : content.waveformHeight) : (settings.hideStripe ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38))) + (settings.hidePhase && settings.hidePhrase ? 16 : 0) + (!settings.hidePhase && !settings.hidePhrase ? -16 : 0) + height: view.height + + Behavior on height { PropertyAnimation { duration: 90} } + anchors.fill: parent + zoom: zoomControl.value + backgroundColor: "#36000000" + + Mixxx.WaveformRendererEndOfTrack { + color: 'blue' + } + + Mixxx.WaveformRendererPreroll { + color: '#998977' + } + + Mixxx.WaveformRendererMarkRange { + // + Mixxx.WaveformMarkRange { + startControl: "loop_start_position" + endControl: "loop_end_position" + enabledControl: "loop_enabled" + color: '#00b400' + opacity: 0.7 + disabledColor: '#FFFFFF' + disabledOpacity: 0.6 + } + // + Mixxx.WaveformMarkRange { + startControl: "intro_start_position" + endControl: "intro_end_position" + color: '#2c5c9a' + opacity: 0.6 + durationTextColor: '#ffffff' + durationTextLocation: 'after' + } + // + Mixxx.WaveformMarkRange { + startControl: "outro_start_position" + endControl: "outro_end_position" + color: '#2c5c9a' + opacity: 0.6 + durationTextColor: '#ffffff' + durationTextLocation: 'before' + } + } + + Mixxx.WaveformRendererRGB { + axesColor: '#00ffffff' + lowColor: 'red' + midColor: 'green' + highColor: 'blue' + } + + Mixxx.WaveformRendererStem { } + + Mixxx.WaveformRendererBeat { + color: '#cfcfcf' + } + + Mixxx.WaveformRendererMark { + playMarkerColor: 'cyan' + playMarkerBackground: 'transparent' + defaultMark: Mixxx.WaveformMark { + align: "bottom|right" + color: "#FF0000" + textColor: "#FFFFFF" + text: " %1 " + } + + untilMark.showTime: true + untilMark.showBeats: true + untilMark.align: Qt.AlignBottom + untilMark.textSize: 14 + + Mixxx.WaveformMark { + control: "cue_point" + text: 'C' + align: 'top|right' + color: 'red' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "loop_start_position" + text: '↻' + align: 'top|left' + color: 'green' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "loop_end_position" + align: 'bottom|right' + color: 'green' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "intro_start_position" + align: 'top|right' + color: 'blue' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "intro_end_position" + text: '◢' + align: 'top|left' + color: 'blue' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "outro_start_position" + text: '◣' + align: 'top|right' + color: 'blue' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "outro_end_position" + align: 'top|left' + color: 'blue' + textColor: '#FFFFFF' + } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + // Stem Color Indicators (Rectangles) + //-------------------------------------------------------------------------------------------------------------------- + + StemColorIndicators { + id: stemColorIndicators + deckId: view.deckId + deckInfo: view.deckInfo + anchors.fill: singleWaveform + anchors.rightMargin: 309 + visible: deckInfoModel.isStemDeck + indicatorHeight: !settings.hidePhase && !settings.hidePhrase ? (deckInfo.showBPMInfo ? [19 , 19 , 19 , 20] : [27 , 27 , 27 , 27]) : (deckInfo.showBPMInfo ? [23 , 23 , 23 , 23] : [31 , 31 , 31 , 31]) + } + + Widgets.LoopSize { + id: loopSize + anchors.topMargin: 1 + anchors.fill: parent + visible: (deckInfo.showLoopInfo || deckInfo.loopActive || settings.alwaysShowLoopSize) && !hideLoop + } + + Widgets.KeyDisplay { + id: keyDisplay + anchors.topMargin: 1 + anchors.fill: parent + visible: !hideKey + } + + Widgets.BpmDisplay { + id: bpmDisplay + anchors.bottomMargin: 1 + anchors.top: singleWaveform.bottom + anchors.fill: parent + visible: !hideBPM && (!deckInfo.showBPMInfo && !settings.alwaysShowTempoInfo && !deckInfo.adjustEnabled) || settings.hideWaveforms + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml new file mode 100755 index 000000000000..c49800618f21 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml @@ -0,0 +1,77 @@ +/* +This module is used to define the top right section, right under the label. +Currently this section is dedicated to BPM and tempo fader information. +*/ +import QtQuick 2.14 +import QtQuick.Controls 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Rectangle { + id: root + + required property string group + required property color borderColor + + property real value: 0 + + color: "transparent" + radius: 6 + border.color: smallBoxBorder + border.width: 2 + + signal updated + + Text { + id: indicator + text: "-" + font.pixelSize: 17 + color: fontColor + anchors.centerIn: parent + + Mixxx.ControlProxy { + group: root.group + key: "bpm" + onValueChanged: (value) => { + const newValue = value.toFixed(2); + if (newValue === indicator.text) return; + indicator.text = newValue; + root.updated() + } + } + } + + Text { + id: range + font.pixelSize: 9 + color: fontColor + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.rightMargin: 5 + anchors.topMargin: 2 + + horizontalAlignment: Text.AlignHCenter + + Mixxx.ControlProxy { + group: root.group + key: "rateRange" + onValueChanged: (value) => { + const newValue = `-/+ \n${(value * 100).toFixed()}%`; + if (range.text === newValue) return; + range.text = newValue; + root.updated(); + } + } + } + + states: State { + name: "compacted" + + PropertyChanges { + target: range + visible: false + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/HotcuePoint.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/HotcuePoint.qml new file mode 100644 index 000000000000..f39bdc1ca796 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/HotcuePoint.qml @@ -0,0 +1,199 @@ +/* +This module is used to define markers element as render over the the overview waveform. +When this is written, Mixxx QML doesn't have waveform overview marker ready to be used, so this +is an attempt to provide fully functional markers for the controller screen, while the Mixxx QML +interface is still being worked on. +Consider replacing this with native overview marker in the future. +*/ +import QtQuick 2.15 +import QtQuick.Shapes 1.4 +import QtQuick.Window 2.15 + +import QtQuick.Controls 2.15 + +import Mixxx 1.0 as Mixxx + +Item { + required property real position + required property int type + + property int number: 1 + property color color: 'blue' + + enum Type { + OneShot, + Loop, + IntroIn, + IntroOut, + OutroIn, + OutroOut, + LoopIn, + LoopOut + } + + property variant typeWithNumber: [ + HotcuePoint.Type.OneShot, + HotcuePoint.Type.Loop + ] + + x: position * (Window.width - 16) + width: 21 + + // One shot + Shape { + visible: type == HotcuePoint.Type.OneShot + anchors.fill: parent + antialiasing: true + + ShapePath { + strokeWidth: 1 + strokeColor: Qt.rgba(0, 0, 0, 0.5) + fillColor: color + strokeStyle: ShapePath.SolidLine + // dashPattern: [ 1, 4 ] + startX: 0; startY: 0 + + PathLine { x: 12; y: 0 } + PathLine { x: 18; y: 6 } + PathLine { x: 18; y: 7 } + PathLine { x: 12; y: 13 } + PathLine { x: 2; y: 13 } + PathLine { x: 2; y: 80 } + PathLine { x: 0; y: 80 } + PathLine { x: 0; y: 0 } + } + } + + // Intro/Outro entry marker + Shape { + visible: type == HotcuePoint.Type.IntroIn || type == HotcuePoint.Type.OutroIn + anchors.fill: parent + antialiasing: true + + ShapePath { + strokeWidth: 1 + strokeColor: Qt.rgba(0, 0, 0, 0.5) + fillColor: "#6e6e6e" + strokeStyle: ShapePath.SolidLine + // dashPattern: [ 1, 4 ] + startX: 0; startY: 0 + + PathLine { x: 11; y: 0 } + PathLine { x: 2; y: 13 } + PathLine { x: 2; y: 80 } + PathLine { x: 0; y: 80 } + PathLine { x: 0; y: 0 } + } + } + + // Intro/Outro exit marker + Shape { + visible: type == HotcuePoint.Type.IntroOut || type == HotcuePoint.Type.OutroOut + anchors.fill: parent + antialiasing: true + + ShapePath { + strokeWidth: 1 + strokeColor: Qt.rgba(0, 0, 0, 0.5) + fillColor: "#6e6e6e" + strokeStyle: ShapePath.SolidLine + // dashPattern: [ 1, 4 ] + startX: 2; startY: 0 + + PathLine { x: 0; y: 0 } + PathLine { x: 0; y: 67 } + PathLine { x: -9; y: 80 } + PathLine { x: 2; y: 80 } + PathLine { x: 2; y: 0 } + } + } + + // Loop + Shape { + visible: type == HotcuePoint.Type.Loop + anchors.fill: parent + antialiasing: true + + ShapePath { + strokeWidth: 1 + strokeColor: Qt.rgba(0, 0, 0, 0.5) + fillColor: "#6ef36e" + strokeStyle: ShapePath.SolidLine + // dashPattern: [ 1, 4 ] + startX: 13; startY: 0 + + PathArc { + x: 2; y: 13 + radiusX: 9; radiusY: 9 + direction: PathArc.Clockwise + } + PathLine { x: 2; y: 80 } + PathLine { x: 0; y: 80 } + PathLine { x: 0; y: 0 } + PathLine { x: 21; y: 0 } + } + } + + // Loop in + Shape { + visible: type == HotcuePoint.Type.LoopIn + anchors.fill: parent + antialiasing: true + + ShapePath { + strokeWidth: 1 + strokeColor: Qt.rgba(0, 0, 0, 0.5) + fillColor: "#6ef36e" + strokeStyle: ShapePath.SolidLine + // dashPattern: [ 1, 4 ] + startX: 0; startY: 0 + + PathLine { x: 8; y: 0 } + PathLine { x: 2; y: 10 } + PathLine { x: 2; y: 80 } + PathLine { x: 0; y: 80 } + PathLine { x: 0; y: 0 } + } + } + + // Loop out + Shape { + visible: type == HotcuePoint.Type.LoopOut + anchors.fill: parent + antialiasing: true + + ShapePath { + strokeWidth: 1 + strokeColor: Qt.rgba(0, 0, 0, 0.5) + fillColor: "#6ef36e" + strokeStyle: ShapePath.SolidLine + // dashPattern: [ 1, 4 ] + startX: 2; startY: 0 + + PathLine { x: -6; y: 0 } + PathLine { x: 0; y: 10 } + PathLine { x: 0; y: 80 } + PathLine { x: 2; y: 80 } + PathLine { x: 2; y: 0 } + } + } + + Shape { + visible: type in typeWithNumber + anchors.fill: parent + antialiasing: true + + ShapePath { + fillColor: "black" + strokeColor: "black" + PathText { + x: 4 + y: 3 + font.family: "Arial" + font.pixelSize: 11 + font.weight: Font.Medium + text: `${number}` + } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml new file mode 100755 index 000000000000..5d2c1b4c5829 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml @@ -0,0 +1,127 @@ +/* +This module is used to define the top left section, right under the label. +Currently this section is dedicated to key/pitch information. +*/ +import QtQuick 2.14 +import QtQuick.Controls 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Rectangle { + id: root + + required property string group + + enum Key { + NoKey, + OneD, + EightD, + ThreeD, + TenD, + FiveD, + TwelveD, + SevenD, + SecondD, + NineD, + FourD, + ElevenD, + SixD, + TenM, + FiveM, + TwelveM, + SevenM, + TwoM, + NineM, + FourM, + ElevenM, + SixM, + OneM, + EightM, + ThreeM + } + + property variant colorsMap: [ + "#b09840", // No key + "#b960a2",// 1d + "#9fc516", // 8d + "#527fc0", // 3d + "#f28b2e", // 10d + "#5bc1cf", // 5d + "#e84c4d", // 12d + "#73b629", // 7d + "#8269ab", // 2d + "#fdd615", // 9d + "#3cc0f0", // 4d + "#4cb686", // 11d + "#4cb686", // 6d + "#f5a158", // 10m + "#7bcdd9", // 5m + "#ed7171", // 12m + "#8fc555", // 7m + "#9b86be", // 2m + "#fcdf45", // 9m + "#63cdf4", // 4m + "#f1845f", // 11m + "#70c4a0", // 6m + "#c680b6", // 1m + "#b2d145", // 8m + "#7499cd" // 3m + ] + + property variant textMap: [ + "No key", + "1d", + "8d", + "3d", + "10d", + "5d", + "12d", + "7d", + "2d", + "9d", + "4d", + "11d", + "6d", + "10m", + "5m", + "12m", + "7m", + "2m", + "9m", + "4m", + "11m", + "6m", + "1m", + "8m", + "3m" + ] + + required property color borderColor + + property int key: KeyIndicator.Key.NoKey + + radius: 6 + border.color: colorsMap[key] + border.width: 2 + + color: colorsMap[key] + signal updated + + Mixxx.ControlProxy { + group: root.group + key: "key" + onValueChanged: (value) => { + if (value === root.key) return; + root.key = value; + root.updated() + } + } + + Text { + text: textMap[key] + font.pixelSize: 17 + color: fontColor + anchors.centerIn: parent + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml new file mode 100644 index 000000000000..2e3b87e453dd --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml @@ -0,0 +1,140 @@ +/* +This module is used render the keyboard scale, originating from C major (do). +*/ +import QtQuick 2.15 +import QtQuick.Shapes 1.4 +import QtQuick.Layouts 1.3 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +import "." as S4MK3 + +Item { + id: root + + required property string group + + property int key: -1 + + signal updated + + Mixxx.ControlProxy { + group: root.group + key: "key" + onValueChanged: (value) => { + if (value === root.key) return; + root.key = value; + root.updated() + } + } + + RowLayout { + anchors.fill: parent + spacing: 0 + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "transparent" } + } + Repeater { + id: whiteKeys + + model: 7 + + property variant keyMap: [ + S4MK3.KeyIndicator.Key.OneD, + S4MK3.KeyIndicator.Key.ThreeD, + S4MK3.KeyIndicator.Key.FiveD, + S4MK3.KeyIndicator.Key.TwelveD, + S4MK3.KeyIndicator.Key.SecondD, + S4MK3.KeyIndicator.Key.FourD, + S4MK3.KeyIndicator.Key.SixD, + S4MK3.KeyIndicator.Key.TenM, + S4MK3.KeyIndicator.Key.TwelveM, + S4MK3.KeyIndicator.Key.TwoM, + S4MK3.KeyIndicator.Key.NineM, + S4MK3.KeyIndicator.Key.ElevenM, + S4MK3.KeyIndicator.Key.OneM, + S4MK3.KeyIndicator.Key.ThreeM + ] + + Rectangle { + Layout.preferredWidth: 21 + Layout.fillHeight: true + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + radius: 2 + border.width: 1 + border.color: root.key == whiteKeys.keyMap[index] || root.key == whiteKeys.keyMap[index + 7] ? "red" : "black" + color: root.key == whiteKeys.keyMap[index] || root.key == whiteKeys.keyMap[index + 7] ? "#aaaaaa" : "white" + } + } + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "transparent" } + } + } + RowLayout { + anchors.fill: parent + spacing: 0 + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "transparent" } + } + Repeater { + id: blackKeys + + model: 5 + + property variant keyMap: [ + S4MK3.KeyIndicator.Key.EightD, + S4MK3.KeyIndicator.Key.TenD, + S4MK3.KeyIndicator.Key.SevenD, + S4MK3.KeyIndicator.Key.NineD, + S4MK3.KeyIndicator.Key.ElevenD, + S4MK3.KeyIndicator.Key.FiveM, + S4MK3.KeyIndicator.Key.SevenM, + S4MK3.KeyIndicator.Key.FourM, + S4MK3.KeyIndicator.Key.SixM, + S4MK3.KeyIndicator.Key.EightM, + ] + + Item { + Layout.fillHeight: true + Layout.preferredWidth: index == 1 ? 42 : index == 4 ? 12 : 21 + Rectangle { + anchors.top: parent.top + anchors.bottom: parent.bottom + width: 12 + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + color: "transparent" + ColumnLayout { + anchors.fill: parent + spacing: 0 + Rectangle { + Layout.fillHeight: true + Layout.fillWidth: true + radius: 2 + border.width: 1 + // border.color: root.key == blackKeys.keyMap[index] || root.key == blackKeys.keyMap[index + blackKeys.model] ? "red" : "black" + color: root.key == blackKeys.keyMap[index] || root.key == blackKeys.keyMap[index + blackKeys.model] ? "#aaaaaa" : "black" + } + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "transparent" } + } + } + } + } + } + Item { + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "transparent" } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml new file mode 100755 index 000000000000..7f0bdec7d01c --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml @@ -0,0 +1,75 @@ +/* +This module is used to define the center right section, above the waveform. +Currently this section is dedicated to display loop state information such as loop state, anchor mode or size. +*/ +import QtQuick 2.14 +import QtQuick.Controls 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Rectangle { + id: root + + required property string group + + property color loopReverseOffBoxColor: Qt.rgba(255/255,113/255,9/255, 1) + property color loopOffBoxColor: Qt.rgba(67/255,70/255,66/255, 1) + property color loopOffFontColor: "white" + property color loopOnBoxColor: Qt.rgba(125/255,246/255,64/255, 1) + property color loopOnFontColor: "black" + + property bool on: true + signal updated + + radius: 6 + border.width: 2 + border.color: (loopSizeIndicator.on ? loopOnBoxColor : (loop_anchor.value == 0 ? loopOffBoxColor : loopReverseOffBoxColor)) + color: (loopSizeIndicator.on ? loopOnBoxColor : (loop_anchor.value == 0 ? loopOffBoxColor : loopReverseOffBoxColor)) + + Text { + id: indicator + anchors.centerIn: parent + font.pixelSize: 46 + color: (loopSizeIndicator.on ? loopOnFontColor : loopOffFontColor) + + Mixxx.ControlProxy { + group: root.group + key: "beatloop_size" + onValueChanged: (value) => { + const newValue = (value < 1 ? `1/${1 / value}` : `${value}`); + if (newValue === indicator.text) return; + indicator.text = newValue; + root.updated() + } + } + } + + Mixxx.ControlProxy { + group: root.group + key: "loop_enabled" + onValueChanged: (value) => { + if (value === root.on) return; + root.on = value; + root.updated() + } + } + + Mixxx.ControlProxy { + group: root.group + key: "loop_anchor" + id: loop_anchor + onValueChanged: (value) => { + root.updated() + } + } + + states: State { + name: "compacted" + + PropertyChanges { + target: indicator + font.pixelSize: 17 + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml new file mode 100644 index 000000000000..0d034066a6e1 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml @@ -0,0 +1,81 @@ +/* +This module is used to define the top section o the screen. +Currently this section is dedicated to display title and artist of the track loaded on the deck. +*/ +import QtQuick 2.14 +import QtQuick.Controls 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Item { + id: root + + required property string group + property var deckPlayer: Mixxx.PlayerManager.getPlayer(root.group) + property bool scrolling: true + + property real speed: 1.7 + property real spacing: 30 + + Rectangle { + id: frame + anchors.top: root.top + anchors.bottom: root.bottom + width: parent.width + x: 6 + color: 'transparent' + + readonly property string fulltext: !trackLoadedControl.value || root.deckPlayer.title.trim().length + root.deckPlayer.artist.trim().length == 0 ? qsTr("No Track Loaded") : `${root.deckPlayer.title} - ${root.deckPlayer.artist}`.trim() + + Text { + id: text1 + text: frame.fulltext + font.pixelSize: 24 + font.family: "Noto Sans" + font.letterSpacing: -1 + color: fontColor + } + Text { + id: text2 + visible: root.width < text1.implicitWidth + anchors.left: text1.right + anchors.leftMargin: spacing + text: frame.fulltext + font.pixelSize: 24 + font.family: "Noto Sans" + font.letterSpacing: -1 + color: fontColor + } + } + + Mixxx.ControlProxy { + id: trackLoadedControl + + group: root.group + key: "track_loaded" + } + + Timer { + id: timer + + property int modifier: -root.speed + + repeat: true + interval: 15 + running: root.width < text1.implicitWidth && root.scrolling + + onTriggered: { + frame.x += modifier; + if (frame.x <= -text1.implicitWidth - spacing) { + frame.x = 0; + } + } + + onRunningChanged: { + if (!running) { + frame.x = 6; + } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml new file mode 100755 index 000000000000..82d8f8b3f892 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml @@ -0,0 +1,53 @@ +/* +This module is used to draw an overlay on the waveform overview in order to highlight better the playback progression. +As the native Mixxx QML component involves, this component might become redundant and should be replaces with native modules. +*/ +import QtQuick 2.15 +import QtQuick.Window 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Item { + id: root + + required property string group + + property real windowWidth: Window.width + + width: 0 + signal updated + + Mixxx.ControlProxy { + group: root.group + key: "track_loaded" + onValueChanged: (value) => { + if (value === root.visible) return; + root.visible = value + root.updated() + } + } + + Mixxx.ControlProxy { + group: root.group + key: "playposition" + onValueChanged: (value) => { + const newValue = Math.round(value * (320 - 12)); + if (newValue === root.width) return; + root.width = newValue; + root.updated() + } + } + + clip: true + + Rectangle { + anchors.fill: parent + anchors.leftMargin: -border.width + anchors.topMargin: -border.width + anchors.bottomMargin: -border.width + border.width: 2 + border.color:"black" + color: Qt.rgba(0.39, 0.80, 0.96, 0.3) + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml new file mode 100644 index 000000000000..a3937436c791 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml @@ -0,0 +1,15 @@ +import QtQuick 2.15 + +Rectangle { + id: root + anchors.fill: parent + color: "black" + + Image { + anchors.centerIn: parent + width: root.width*0.8 + height: root.height + fillMode: Image.PreserveAspectFit + source: engine.getSetting("idleBackground") == "mask" ? "./Screens/Images/logo.png" : "../../../images/templates/logo_mixxx.png" + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml new file mode 100644 index 000000000000..c93b813f3e6b --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml @@ -0,0 +1,634 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.3 + +import "../../../qml" as Skin +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +import S4MK3 as S4MK3 + +Rectangle { + id: root + + required property string group + required property string screenId + + readonly property bool useSharedApi: engine.getSetting("useSharedDataAPI") + + anchors.fill: parent + color: "black" + + function onSharedDataUpdate(data) { + if (!root) return; + + console.log(`Received data on screen#${root.screenId} while currently bind to ${root.group}: ${JSON.stringify(data)}`); + if (typeof data === "object" && typeof data.group[root.screenId] === "string" && root.group !== data.group[root.screenId]) { + root.group = data.group[root.screenId] + waveformOverview.player = Mixxx.PlayerManager.getPlayer(root.group) + artwork.player = Mixxx.PlayerManager.getPlayer(root.group) + console.log(`Changed group for screen ${root.screenId} to ${root.group}`); + } + var shouldBeCompacted = false; + if (typeof data.padsMode === "object") { + scrollingWaveform.visible = data.padsMode[root.group] === 4 + artworkSpacer.visible = data.padsMode[root.group] === 1 + shouldBeCompacted |= scrollingWaveform.visible || artworkSpacer.visible + } + if (typeof data.keyboardMode === "object") { + shouldBeCompacted |= data.keyboardMode[root.group] + keyboard.visible = !!data.keyboardMode[root.group] + } + deckInfo.state = shouldBeCompacted ? "compacted" : "" + if (typeof data.displayBeatloopSize === "object") { + timeIndicator.mode = data.displayBeatloopSize[root.group] ? S4MK3.TimeAndBeatloopIndicator.Mode.BeetjumpSize : S4MK3.TimeAndBeatloopIndicator.Mode.RemainingTime + timeIndicator.update() + } + } + + Mixxx.ControlProxy { + id: trackLoadedControl + + group: root.group + key: "track_loaded" + + onValueChanged: (value) => { + if (!value && deckInfo) { + deckInfo.state = "" + scrollingWaveform.visible = false + } + } + } + + Timer { + id: channelchange + + interval: 5000 + repeat: true + running: false + + onTriggered: { + root.onSharedDataUpdate({ + group: { + "leftdeck": screenId === "leftdeck" && trackLoadedControl.group === "[Channel1]" ? "[Channel3]" : "[Channel1]", + "rightdeck": screenId === "rightdeck" && trackLoadedControl.group === "[Channel2]" ? "[Channel4]" : "[Channel2]", + }, + scrollingWaveform: { + "[Channel1]": true, + "[Channel2]": true, + "[Channel3]": true, + "[Channel4]": true, + }, + keyboardMode: { + "[Channel1]": false, + "[Channel2]": false, + "[Channel3]": false, + "[Channel4]": false, + }, + displayBeatloopSize: { + "[Channel1]": false, + "[Channel2]": false, + "[Channel3]": false, + "[Channel4]": false, + }, + }); + } + } + + Component.onCompleted: { + if (!root.useSharedApi) { + return; + } + + engine.makeSharedDataConnection(root.onSharedDataUpdate) + + root.onSharedDataUpdate({ + group: { + "leftdeck": "[Channel1]", + "rightdeck": "[Channel2]", + }, + scrollingWaveform: { + "[Channel1]": false, + "[Channel2]": false, + "[Channel3]": false, + "[Channel4]": false, + }, + keyboardMode: { + "[Channel1]": false, + "[Channel2]": false, + "[Channel3]": false, + "[Channel4]": false, + }, + displayBeatloopSize: { + "[Channel1]": false, + "[Channel2]": false, + "[Channel3]": false, + "[Channel4]": false, + }, + }); + } + + Rectangle { + anchors.fill: parent + color: "transparent" + + Image { + id: artwork + anchors.fill: parent + + property var player: Mixxx.PlayerManager.getPlayer(root.group) + + source: player.coverArtUrl + height: 100 + width: 100 + fillMode: Image.PreserveAspectFit + + opacity: artworkSpacer.visible ? 1 : 0.2 + z: -1 + } + } + + ColumnLayout { + anchors.fill: parent + spacing: 6 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 36 + color: "transparent" + + RowLayout { + anchors.fill: parent + spacing: 1 + + S4MK3.OnAirTrack { + id: onAir + group: root.group + Layout.fillWidth: true + Layout.fillHeight: true + + scrolling: !scrollingWaveform.visible + } + } + } + + // Indicator + Rectangle { + id: deckInfo + + Layout.fillWidth: true + Layout.preferredHeight: 105 + Layout.leftMargin: 6 + Layout.rightMargin: 6 + color: "transparent" + + GridLayout { + id: gridLayout + anchors.fill: parent + columnSpacing: 6 + rowSpacing: 6 + columns: 2 + + // Section: Key + S4MK3.KeyIndicator { + id: keyIndicator + group: root.group + borderColor: smallBoxBorder + + Layout.fillWidth: true + Layout.fillHeight: true + } + + // Section: Bpm + S4MK3.BPMIndicator { + id: bpmIndicator + group: root.group + borderColor: smallBoxBorder + + Layout.fillWidth: true + Layout.fillHeight: true + } + + // Section: Key + S4MK3.TimeAndBeatloopIndicator { + id: timeIndicator + group: root.group + + Layout.fillWidth: true + Layout.preferredHeight: 72 + timeColor: smallBoxBorder + } + + // Section: Bpm + S4MK3.LoopSizeIndicator { + id: loopSizeIndicator + group: root.group + + Layout.fillWidth: true + Layout.preferredHeight: 72 + } + } + states: State { + name: "compacted" + + PropertyChanges { + target:deckInfo + Layout.preferredHeight: 28 + } + PropertyChanges { + target: gridLayout + columns: 4 + } + PropertyChanges { + target: bpmIndicator + state: "compacted" + } + PropertyChanges { + target: timeIndicator + Layout.preferredHeight: -1 + Layout.fillHeight: true + state: "compacted" + } + PropertyChanges { + target: loopSizeIndicator + Layout.preferredHeight: -1 + Layout.fillHeight: true + state: "compacted" + } + } + } + + Item { + id: scrollingWaveform + + Layout.fillWidth: true + Layout.minimumHeight: scrollingWaveform.visible ? 120 : 0 + Layout.leftMargin: 0 + Layout.rightMargin: 0 + + visible: false + + Mixxx.ControlProxy { + id: zoomControl + + group: root.group + key: "waveform_zoom" + } + + MixxxControls.WaveformDisplay { + id: singleWaveform + group: root.group + x: 0 + width: 320 + height: 100 + + Behavior on height { PropertyAnimation { duration: 90} } + anchors.fill: parent + zoom: zoomControl.value + backgroundColor: "#36000000" + + Mixxx.WaveformRendererEndOfTrack { + color: 'blue' + endOfTrackWarningTime: 30 + } + + Mixxx.WaveformRendererPreroll { + color: '#998977' + } + + Mixxx.WaveformRendererMarkRange { + // + Mixxx.WaveformMarkRange { + startControl: "loop_start_position" + endControl: "loop_end_position" + enabledControl: "loop_enabled" + color: '#00b400' + opacity: 0.7 + disabledColor: '#FFFFFF' + disabledOpacity: 0.6 + } + // + Mixxx.WaveformMarkRange { + startControl: "intro_start_position" + endControl: "intro_end_position" + color: '#2c5c9a' + opacity: 0.6 + durationTextColor: '#ffffff' + durationTextLocation: 'after' + } + // + Mixxx.WaveformMarkRange { + startControl: "outro_start_position" + endControl: "outro_end_position" + color: '#2c5c9a' + opacity: 0.6 + durationTextColor: '#ffffff' + durationTextLocation: 'before' + } + } + + Mixxx.WaveformRendererRGB { + axesColor: '#00ffffff' + lowColor: 'red' + midColor: 'green' + highColor: 'blue' + + gainAll: 1.0 + gainLow: 1.0 + gainMid: 1.0 + gainHigh: 1.0 + } + + Mixxx.WaveformRendererStem { + gainAll: 1.0 + } + + Mixxx.WaveformRendererBeat { + color: '#cfcfcf' + } + + Mixxx.WaveformRendererMark { + playMarkerColor: 'cyan' + playMarkerBackground: 'transparent' + defaultMark: Mixxx.WaveformMark { + align: "bottom|right" + color: "#FF0000" + textColor: "#FFFFFF" + text: " %1 " + } + + untilMark.showTime: true + untilMark.showBeats: true + untilMark.align: Qt.AlignCenter + untilMark.textSize: 14 + + Mixxx.WaveformMark { + control: "cue_point" + text: 'C' + align: 'top|right' + color: 'red' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "loop_start_position" + text: '↻' + align: 'top|left' + color: 'green' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "loop_end_position" + align: 'bottom|right' + color: 'green' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "intro_start_position" + align: 'top|right' + color: 'blue' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "intro_end_position" + text: '◢' + align: 'top|left' + color: 'blue' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "outro_start_position" + text: '◣' + align: 'top|right' + color: 'blue' + textColor: '#FFFFFF' + } + Mixxx.WaveformMark { + control: "outro_end_position" + align: 'top|left' + color: 'blue' + textColor: '#FFFFFF' + } + } + } + } + + Mixxx.ControlProxy { + id: deckScratching + + group: root.group + key: "scratch2_enable" + + onValueChanged: { + if (root.useSharedApi) { + return; + } + + if (value) { + waveformTimer.running = false; + scrollingWaveform.visible = true; + deckInfo.state = scrollingWaveform.visible ? "compacted" : "" + } else { + waveformTimer.running = true; + waveformTimer.restart() + } + } + } + + Timer { + id: waveformTimer + + interval: 4000 + repeat: false + running: false + + onTriggered: { + scrollingWaveform.visible = false; + deckInfo.state = scrollingWaveform.visible ? "compacted" : "" + } + } + + // Spacer + Item { + id: artworkSpacer + + Layout.fillWidth: true + Layout.minimumHeight: artworkSpacer.visible ? 120 : 0 + Layout.leftMargin: 6 + Layout.rightMargin: 6 + + visible: false + + Rectangle { + color: "transparent" + visible: parent.visible + anchors.top: parent.top + anchors.bottom: parent.bottom + x: 153 + width: 2 + } + } + + // Track progress + Item { + id: waveform + Layout.fillWidth: true + Layout.fillHeight: true + Layout.leftMargin: 6 + Layout.rightMargin: 6 + layer.enabled: true + + S4MK3.Progression { + id: progression + group: root.group + + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: parent.bottom + } + + Mixxx.WaveformOverview { + id: waveformOverview + anchors.fill: parent + player: Mixxx.PlayerManager.getPlayer(root.group) + } + + Mixxx.ControlProxy { + id: samplesControl + + group: root.group + key: "track_samples" + } + + // Hotcue + Repeater { + model: 16 + + S4MK3.HotcuePoint { + required property int index + + Mixxx.ControlProxy { + id: samplesControl + + group: root.group + key: "track_samples" + } + + Mixxx.ControlProxy { + id: hotcueEnabled + group: root.group + key: `hotcue_${index + 1}_status` + } + + Mixxx.ControlProxy { + id: hotcuePosition + group: root.group + key: `hotcue_${index + 1}_position` + } + + Mixxx.ControlProxy { + id: hotcueColor + group: root.group + key: `hotcue_${number}_color` + } + + anchors.top: parent.top + // anchors.left: parent.left + anchors.bottom: parent.bottom + visible: hotcueEnabled.value + + number: this.index + 1 + type: S4MK3.HotcuePoint.Type.OneShot + position: hotcuePosition.value / samplesControl.value + color: `#${(hotcueColor.value >> 16).toString(16).padStart(2, '0')}${((hotcueColor.value >> 8) & 255).toString(16).padStart(2, '0')}${(hotcueColor.value & 255).toString(16).padStart(2, '0')}` + } + } + + // Intro + S4MK3.HotcuePoint { + + Mixxx.ControlProxy { + id: introStartEnabled + group: root.group + key: `intro_start_enabled` + } + + Mixxx.ControlProxy { + id: introStartPosition + group: root.group + key: `intro_start_position` + } + + anchors.top: parent.top + anchors.bottom: parent.bottom + visible: introStartEnabled.value + + type: S4MK3.HotcuePoint.Type.IntroIn + position: introStartPosition.value / samplesControl.value + } + + // Extro + S4MK3.HotcuePoint { + + Mixxx.ControlProxy { + id: introEndEnabled + group: root.group + key: `intro_end_enabled` + } + + Mixxx.ControlProxy { + id: introEndPosition + group: root.group + key: `intro_end_position` + } + + anchors.top: parent.top + anchors.bottom: parent.bottom + visible: introEndEnabled.value + + type: S4MK3.HotcuePoint.Type.IntroOut + position: introEndPosition.value / samplesControl.value + } + + // Loop in + S4MK3.HotcuePoint { + Mixxx.ControlProxy { + id: loopStartPosition + group: root.group + key: `loop_start_position` + } + + anchors.top: parent.top + anchors.bottom: parent.bottom + visible: loopStartPosition.value > 0 + + type: S4MK3.HotcuePoint.Type.LoopIn + position: loopStartPosition.value / samplesControl.value + } + + // Loop out + S4MK3.HotcuePoint { + Mixxx.ControlProxy { + id: loopEndPosition + group: root.group + key: `loop_end_position` + } + + anchors.top: parent.top + anchors.bottom: parent.bottom + visible: loopEndPosition.value > 0 + + type: S4MK3.HotcuePoint.Type.LoopOut + position: loopEndPosition.value / samplesControl.value + } + } + + S4MK3.Keyboard { + id: keyboard + group: root.group + visible: false + Layout.fillWidth: true + Layout.fillHeight: true + Layout.leftMargin: 6 + Layout.rightMargin: 6 + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml new file mode 100755 index 000000000000..26302f4073cc --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml @@ -0,0 +1,107 @@ +/* +This module is used to define the center left section, above the waveform. +Currently this section is dedicated to show the remaining time as well as the beatloop when changing. +*/ +import QtQuick 2.14 +import QtQuick.Controls 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Rectangle { + id: root + + required property string group + + property color timeColor: Qt.rgba(67/255,70/255,66/255, 1) + property color beatjumpColor: 'yellow' + + enum Mode { + RemainingTime, + BeetjumpSize + } + + property int mode: TimeAndBeatloopIndicator.Mode.RemainingTime + + radius: 6 + border.color: timeColor + border.width: 2 + color: timeColor + signal updated + + function update() { + let newValue = ""; + if (root.mode === TimeAndBeatloopIndicator.Mode.RemainingTime) { + var seconds = ((1.0 - progression.value) * duration.value); + var mins = parseInt(seconds / 60).toString(); + seconds = parseInt(seconds % 60).toString(); + + newValue = `-${mins.padStart(2, '0')}:${seconds.padStart(2, '0')}`; + } else { + newValue = (beatjump.value < 1 ? `1/${1 / beatjump.value}` : `${beatjump.value}`); + } + if (newValue === indicator.text) return; + indicator.text = newValue; + root.updated() + } + + Text { + id: indicator + anchors.centerIn: parent + text: "0.00" + + font.pixelSize: 46 + color: fontColor + + Mixxx.ControlProxy { + id: progression + group: root.group + key: "playposition" + } + + Mixxx.ControlProxy { + id: duration + group: root.group + key: "duration" + } + + Mixxx.ControlProxy { + id: beatjump + group: root.group + key: "beatjump_size" + } + + Mixxx.ControlProxy { + id: endoftrack + group: root.group + key: "end_of_track" + onValueChanged: (value) => { + root.border.color = value ? 'red' : timeColor + root.color = value ? 'red' : timeColor + root.updated() + } + } + } + + Component.onCompleted: { + progression.onValueChanged.connect(update) + duration.onValueChanged.connect(update) + beatjump.onValueChanged.connect(update) + update() + } + + states: State { + name: "compacted" + + PropertyChanges { + target: indicator + font.pixelSize: 17 + } + } + + onModeChanged: () => { + border.color = root.mode == TimeAndBeatloopIndicator.Mode.BeetjumpSize ? beatjumpColor : timeColor + color = root.mode == TimeAndBeatloopIndicator.Mode.BeetjumpSize ? beatjumpColor : timeColor + indicator.color = root.mode == TimeAndBeatloopIndicator.Mode.BeetjumpSize ? 'black' : 'white' + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml new file mode 100755 index 000000000000..ade89743521d --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml @@ -0,0 +1,165 @@ +/* +This module is used to waveform overview, at the bottom of the screen. It is reusing component definition of `WaveformOverview.qml` but remove +the link to markers and provide hooks with screen update/redraw, needed for partial updates. +Currently this section is dedicated to BPM and tempo fader information. +*/ +import QtQuick 2.15 +import QtQuick.Window 2.15 + +import Mixxx 1.0 as Mixxx +import Mixxx.Controls 1.0 as MixxxControls + +Item { + id: root + + required property string group + property var deckPlayer: Mixxx.PlayerManager.getPlayer(root.group) + property real scale: 0.2 + + signal updated + + visible: false + antialiasing: true + anchors.fill: parent + + Connections { + onGroupChanged: { + deckPlayer = Mixxx.PlayerManager.getPlayer(root.group) + console.log("Group changed!!") + root.updated() + } + } + + Rectangle { + color: "white" + anchors.top: parent.top + anchors.bottom: parent.bottom + x: 153 + width: 2 + } + Item { + id: waveformContainer + + property real duration: samplesControl.value / sampleRateControl.value + + anchors.fill: parent + clip: true + + Mixxx.ControlProxy { + id: samplesControl + + group: root.group + key: "track_samples" + } + + Mixxx.ControlProxy { + id: sampleRateControl + + group: root.group + key: "track_samplerate" + } + + Mixxx.ControlProxy { + id: playPositionControl + + group: root.group + key: "playposition" + } + + Mixxx.ControlProxy { + id: rateRatioControl + + group: root.group + key: "rate_ratio" + } + + Mixxx.ControlProxy { + id: zoomControl + + group: root.group + key: "waveform_zoom" + } + + Item { + id: waveformBeat + + property real effectiveZoomFactor: (zoomControl.value * rateRatioControl.value / root.scale) * 6 + + width: waveformContainer.duration * effectiveZoomFactor + height: parent.height + x: 0.5 * waveformContainer.width - playPositionControl.value * width + visible: true + + Shape { + id: preroll + + property real triangleHeight: waveformBeat.height + property real triangleWidth: 0.25 * waveformBeat.effectiveZoomFactor + property int numTriangles: Math.ceil(width / triangleWidth) + + anchors.top: waveformBeat.top + anchors.right: waveformBeat.left + width: Math.max(0, waveformBeat.x) + height: waveformBeat.height + + ShapePath { + strokeColor: 'red' + strokeWidth: 1 + fillColor: "transparent" + + PathMultiline { + paths: { + let p = []; + for (let i = 0; i < preroll.numTriangles; i++) { + p.push([Qt.point(preroll.width - i * preroll.triangleWidth, preroll.triangleHeight / 2), Qt.point(preroll.width - (i + 1) * preroll.triangleWidth, 0), Qt.point(preroll.width - (i + 1) * preroll.triangleWidth, preroll.triangleHeight), Qt.point(preroll.width - i * preroll.triangleWidth, preroll.triangleHeight / 2)]); + } + return p; + } + } + } + } + + Shape { + id: postroll + + property real triangleHeight: waveformBeat.height + property real triangleWidth: 0.25 * waveformBeat.effectiveZoomFactor + property int numTriangles: Math.ceil(width / triangleWidth) + + anchors.top: waveformBeat.top + anchors.left: waveformBeat.right + width: waveformContainer.width / 2 + height: waveformBeat.height + + ShapePath { + strokeColor: 'red' + strokeWidth: 1 + fillColor: "transparent" + + PathMultiline { + paths: { + let p = []; + for (let i = 0; i < postroll.numTriangles; i++) { + p.push([Qt.point(i * postroll.triangleWidth, postroll.triangleHeight / 2), Qt.point((i + 1) * postroll.triangleWidth, 0), Qt.point((i + 1) * postroll.triangleWidth, postroll.triangleHeight), Qt.point(i * postroll.triangleWidth, postroll.triangleHeight / 2)]); + } + return p; + } + } + } + } + } + + MixxxControls.WaveformOverview { + id: waveformOverview + // property real duration: samplesControl.value / sampleRateControl.onValueChanged + + player: root.player + anchors.fill: parent + channels: Mixxx.WaveformOverview.Channels.BothChannels + renderer: Mixxx.WaveformOverview.Renderer.RGB + colorHigh: 'white' + colorMid: 'blue' + colorLow: 'green' + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir new file mode 100644 index 000000000000..6c76347ed734 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir @@ -0,0 +1,12 @@ +module S4MK3 +BPMIndicator 1.0 BPMIndicator.qml +HotcuePoint 1.0 HotcuePoint.qml +Keyboard 1.0 Keyboard.qml +KeyIndicator 1.0 KeyIndicator.qml +LoopSizeIndicator 1.0 LoopSizeIndicator.qml +OnAirTrack 1.0 OnAirTrack.qml +Progression 1.0 Progression.qml +TimeAndBeatloopIndicator 1.0 TimeAndBeatloopIndicator.qml +WaveformOverview 1.0 WaveformOverview.qml +SplashOff 1.0 SplashOff.qml +StockScreen 1.0 StockScreen.qml diff --git a/src/controllers/bulk/bulksupported.h b/src/controllers/bulk/bulksupported.h index a7bf6c916d60..f10673e87ba4 100644 --- a/src/controllers/bulk/bulksupported.h +++ b/src/controllers/bulk/bulksupported.h @@ -28,4 +28,5 @@ constexpr static bulk_support_lookup bulk_supported[] = { {{0x06f8, 0xb107}, {0x83, 0x03, std::nullopt}}, // Hercules Mk4 {{0x06f8, 0xb100}, {0x86, 0x06, std::nullopt}}, // Hercules Mk2 {{0x06f8, 0xb120}, {0x82, 0x03, std::nullopt}}, // Hercules MP3 LE / Glow + {{0x17cc, 0x1720}, {0x00, 0x03, 0x04}}, // Traktor NI S4 Mk3 }; diff --git a/tools/README b/tools/README index def2a3d4040b..3055fbed113c 100644 --- a/tools/README +++ b/tools/README @@ -20,3 +20,11 @@ cd build && gcc ../tools/dummy_hid_device.c -lhidapi-hidraw -o dummy_hid_device # Allow the created hidraw device to be accessed by the user. You may also set the write udev rules. Finally, you can also run Mixxx as root, but that's not recommended. sudo chown "$USER" "$(ls -1t /dev/hidraw* | head -n 1)" ``` + +## Traktor S4 Mk3 Screen drawing + +This small program can be used directly to draw arbitrary rectangles on the Traktor S4 Mk3 screens. It may also be useful for one to perform tests on top of the existing reversed engineered protocol. + +```sh +cd build && gcc ../tools/traktor_s4_mk3_screen_test.c `pkg-config --cflags --libs libusb-1.0` -o traktor_s4_mk3_screen_test && ./traktor_s4_mk3_screen_test +``` diff --git a/tools/clang_format.py b/tools/clang_format.py index 16076470c916..baeface76d29 100755 --- a/tools/clang_format.py +++ b/tools/clang_format.py @@ -49,7 +49,7 @@ def run_clang_format_on_lines(rootdir, file_to_format, stylepath=None): ", ".join("{}-{}".format(*x) for x in file_to_format.lines), ) - filename = os.path.join(rootdir, file_to_format.filename) + filename = os.path.join(rootdir, file_to_format.filename).strip() cmd = [ "clang-format", "--style=file", diff --git a/tools/traktor_s4_mk3_screen_test.c b/tools/traktor_s4_mk3_screen_test.c new file mode 100644 index 000000000000..cf14fd3833a2 --- /dev/null +++ b/tools/traktor_s4_mk3_screen_test.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define VENDOR_ID 0x17cc +#define PRODUCT_ID 0x1720 +#define IN_EPADDR 0x00 +#define OUT_EPADDR 0x03 + +static const uint8_t header_data[] = { + 0x84, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // Draw offset (y=0, x=0) + 0x1, + 0x40, + 0x0, + 0xf0, // Draw dimenssion (width=320, height=240) +}; +static const uint8_t footer_data[] = { + 0x40, 0x00, 0x00, 0x00}; + +int main(int argc, char** argv) { + libusb_context* context; + int transferred; + + if (argc != 7) { + fprintf(stderr, "Usage: %s \n", *argv); + return -1; + } + + libusb_init(&context); + + libusb_device_handle* handle = libusb_open_device_with_vid_pid( + context, VENDOR_ID, PRODUCT_ID); + + if (!handle) { + fprintf(stderr, "Unable to open USB Bulk device\n"); + return -1; + } + + uint8_t screen_idx = atoi(argv[1]); + + if (screen_idx != 0 && screen_idx != 1) { + fprintf(stderr, "Invalid screen ID %d\n", screen_idx); + return -1; + } + + uint16_t x = atoi(argv[2]); + uint16_t y = atoi(argv[3]); + uint16_t width = atoi(argv[4]); + uint16_t height = atoi(argv[5]); + uint16_t color = strtol(argv[6], NULL, 2); + + uint8_t* data = malloc(width * height * sizeof(uint16_t) + + sizeof(header_data) + sizeof(footer_data)); + uint8_t* header = data; + + memcpy(header, header_data, sizeof(header_data)); + + header[2] = screen_idx; + + header[8] = x >> 8; + header[9] = x & 0xff; + header[10] = y >> 8; + header[11] = y & 0xff; + + header[12] = width >> 8; + header[13] = width & 0xff; + header[14] = height >> 8; + header[15] = height & 0xff; + + printf("draw x=%d,y=%d,width=%d,height=%d with color %x\n", x, y, width, height, color); + + size_t payload_size = width * height * sizeof(uint16_t) + + sizeof(header_data) + sizeof(footer_data); + uint8_t* payload = data + sizeof(header_data); + uint8_t* footer = payload + width * height * sizeof(uint16_t); + + for (int px = 0; px < width * height; px++) { + payload[px * sizeof(uint16_t)] = color >> 8; + payload[px * sizeof(uint16_t) + 1] = color & 0xff; + } + + memcpy(footer, footer_data, sizeof(footer_data)); + + footer[2] = screen_idx; + + clock_t start, end; + double cpu_time_used; + + start = clock(); + int ret = libusb_bulk_transfer(handle, OUT_EPADDR, data, payload_size, &transferred, 0); + end = clock(); + cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; + + if (ret < 0) { + fprintf(stderr, "Unable to send to USB Bulk device\n"); + + } else { + fprintf(stderr, "Sent %d bytes in %f ms\n", transferred, cpu_time_used); + } + + libusb_close(handle); + libusb_exit(context); + + return 0; +} From d0e103d23cdf2ed4f8b51c28fdac583990433076 Mon Sep 17 00:00:00 2001 From: Antoine C Date: Thu, 19 Sep 2024 10:16:29 +0100 Subject: [PATCH 118/163] feat: add Joe Easton's inspired theme for S4Mk3 screens --- .../Traktor Kontrol S4 MK3.bulk.xml | 1091 +++++------- .../TraktorKontrolS4MK3Screens.qml | 2 +- .../S4MK3/AdvancedScreen.qml | 63 + .../AdvancedScreen/Browser/BrowserFooter.qml | 340 ++++ .../AdvancedScreen/Browser/BrowserHeader.qml | 223 +++ .../AdvancedScreen/Browser/ListDelegate.qml | 262 +++ .../AdvancedScreen/Browser/ListHighlight.qml | 19 + .../AdvancedScreen/Browser/TrackFooter.qml | 353 ++++ .../AdvancedScreen/Browser/TrackView.qml | 202 +++ .../S4MK3/AdvancedScreen/Browser/Triangle.qml | 29 + .../S4MK3/AdvancedScreen/DeckScreen.qml | 184 ++ .../S4MK3/AdvancedScreen/Defines/Colors.qml | 549 ++++++ .../AdvancedScreen/Defines/Durations.qml | 8 + .../S4MK3/AdvancedScreen/Defines/Font.qml | 17 + .../S4MK3/AdvancedScreen/Defines/Margins.qml | 7 + .../S4MK3/AdvancedScreen/Defines/Settings.qml | 296 ++++ .../S4MK3/AdvancedScreen/Defines/Utils.qml | 126 ++ .../AdvancedScreen/Overlays/BankInfo.qml | 193 ++ .../Overlays/BankInfoDetails.qml | 77 + .../S4MK3/AdvancedScreen/Overlays/CueInfo.qml | 152 ++ .../Overlays/CueInfoDetails.qml | 73 + .../AdvancedScreen/Overlays/FXInfoDetails.qml | 66 + .../AdvancedScreen/Overlays/GridControls.qml | 209 +++ .../Overlays/GridInfoDetails.qml | 160 ++ .../AdvancedScreen/Overlays/JumpControls.qml | 239 +++ .../Overlays/JumpInfoDetails.qml | 45 + .../AdvancedScreen/Overlays/LoopControls.qml | 230 +++ .../Overlays/LoopInfoDetails.qml | 57 + .../Overlays/QuickFXSelector.qml | 151 ++ .../AdvancedScreen/Overlays/RollControls.qml | 230 +++ .../AdvancedScreen/Overlays/ToneControls.qml | 247 +++ .../Overlays/ToneInfoDetails.qml | 44 + .../Overlays/TopInfoDetails.qml | 152 ++ .../S4MK3/AdvancedScreen/ViewModels/Cell.qml | 54 + .../AdvancedScreen/ViewModels/DeckInfo.qml | 1564 +++++++++++++++++ .../AdvancedScreen/ViewModels/HotCue.qml | 42 + .../AdvancedScreen/ViewModels/HotCues.qml | 65 + .../AdvancedScreen/Views/BrowserView.qml | 322 ++++ .../S4MK3/AdvancedScreen/Views/Dimensions.qml | 15 + .../S4MK3/AdvancedScreen/Views/EmptyDeck.qml | 47 + .../S4MK3/AdvancedScreen/Views/StemDeck.qml | 28 + .../S4MK3/AdvancedScreen/Views/TrackDeck.qml | 222 +++ .../Waveform/StemColorIndicators.qml | 82 + .../AdvancedScreen/Waveform/StemWaveforms.qml | 59 + .../Waveform/WaveformContainer.qml | 23 +- .../Waveform/WaveformOverview.qml | 228 +++ .../AdvancedScreen/Widgets/BpmDisplay.qml | 27 + .../AdvancedScreen/Widgets/DeckHeader.qml | 90 + .../AdvancedScreen/Widgets/KeyDisplay.qml | 46 + .../S4MK3/AdvancedScreen/Widgets/LoopSize.qml | 87 + .../AdvancedScreen/Widgets/PhaseMeter.qml | 94 + .../AdvancedScreen/Widgets/ProgressBar.qml | 60 + .../S4MK3/AdvancedScreen/Widgets/Slider.qml | 111 ++ .../S4MK3/AdvancedScreen/Widgets/StateBar.qml | 34 + .../AdvancedScreen/Widgets/StemOverlay.qml | 257 +++ .../AdvancedScreen/Widgets/TempoAdjust.qml | 184 ++ .../AdvancedScreen/Widgets/TrackRating.qml | 42 + .../S4MK3/BPMIndicator.qml | 39 +- .../S4MK3/KeyIndicator.qml | 19 +- .../S4MK3/Keyboard.qml | 13 +- .../S4MK3/LoopSizeIndicator.qml | 54 +- .../S4MK3/OnAirTrack.qml | 3 +- .../S4MK3/Progression.qml | 18 +- .../S4MK3/SplashOff.qml | 2 +- .../S4MK3/StockScreen.qml | 8 +- .../S4MK3/TimeAndBeatloopIndicator.qml | 32 +- .../S4MK3/WaveformOverview.qml | 3 - .../TraktorKontrolS4MK3Screens/S4MK3/qmldir | 1 + 68 files changed, 9243 insertions(+), 828 deletions(-) create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserFooter.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserHeader.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListDelegate.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListHighlight.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackFooter.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackView.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/Triangle.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/DeckScreen.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Colors.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Durations.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Font.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Margins.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Settings.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Utils.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfo.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfo.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/FXInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridControls.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpControls.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopControls.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/QuickFXSelector.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/RollControls.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneControls.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopInfoDetails.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/Cell.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/DeckInfo.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCue.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCues.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/BrowserView.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/Dimensions.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/EmptyDeck.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/StemDeck.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/TrackDeck.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/StemColorIndicators.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/StemWaveforms.qml create mode 100644 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformOverview.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/BpmDisplay.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/DeckHeader.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/KeyDisplay.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/LoopSize.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/PhaseMeter.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/ProgressBar.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/Slider.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StateBar.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StemOverlay.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TempoAdjust.qml create mode 100755 res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TrackRating.qml diff --git a/res/controllers/Traktor Kontrol S4 MK3.bulk.xml b/res/controllers/Traktor Kontrol S4 MK3.bulk.xml index c7bc44712ea7..94ce7ad8b36c 100644 --- a/res/controllers/Traktor Kontrol S4 MK3.bulk.xml +++ b/res/controllers/Traktor Kontrol S4 MK3.bulk.xml @@ -25,217 +25,67 @@ Use the shared data API to enable communication between the screens and the buttons. Requires a custom Mixxx build using the feature in PR#12199 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - + + + + + + + + + + + + + + + - - - - - + + + - - - - - + + - - - + - + variable="cueCueColor" + type="enum" + default="10" + label="CueCueColor"> + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + + + - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + label="Alternative color when track end warning"/> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + label="Disable the hotcue overlay"/> - - - + default="2" + type="real" + min="0.1" + max="15" + step="0.1" + precision="2" + label="FxOverlayTimer"/> @@ -880,17 +596,12 @@ variable="hideEffectsOverlay1" type="boolean" default="false" - label="hideEffectsOverlay1"> - - - - + label="Disable the effects overlay on the left deck"/> + label="Disable the effects overlay on the right deck"/> @@ -898,36 +609,24 @@ variable="hideToneOverlay" type="boolean" default="false" - label="hideToneOverlay"> - - - - + label="Disable the tone overlay"/> - - - + label="Disable the loop overlay"/> - - - + label="Disable the roll overlay"/> + label="Disable the tone pads overlay appearing"/> + diff --git a/res/controllers/TraktorKontrolS4MK3Screens.qml b/res/controllers/TraktorKontrolS4MK3Screens.qml index fe5225032783..10a2df52539c 100644 --- a/res/controllers/TraktorKontrolS4MK3Screens.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens.qml @@ -22,7 +22,7 @@ Mixxx.ControllerScreen { property color smallBoxBorder: Qt.rgba(44/255,44/255,44/255, 1) property string group: screenId == "rightdeck" ? "[Channel2]" : "[Channel1]" - property string theme: engine.getSetting("theme") + property string theme: engine.getSetting("theme") || "stock" readonly property bool isStockTheme: theme == "stock" diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen.qml new file mode 100755 index 000000000000..b8d6daa2dff9 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen.qml @@ -0,0 +1,63 @@ +import QtQuick 2.15 + +import './AdvancedScreen/Defines' as Defines +import './AdvancedScreen/Views' as Views +import './AdvancedScreen' as S4MK3 + +//---------------------------------------------------------------------------------------------------------------------- +// S4MK3 Screen - manage top/bottom deck of one screen +//---------------------------------------------------------------------------------------------------------------------- + +Item { + id: screen + + required property bool isLeftScreen + + //-------------------------------------------------------------------------------------------------------------------- + + readonly property int topDeckId: isLeftScreen ? 1 : 2 + readonly property int bottomDeckId: isLeftScreen ? 3 : 4 + property bool propTopDeckFocus: true + + Defines.Font {id: fonts} + Defines.Utils {id: utils} + Defines.Settings {id: settings} + Defines.Durations {id: durations} + Defines.Colors {id: colors} + + Component.onCompleted: { + if (engine.getSetting("useSharedDataAPI")) { + engine.makeSharedDataConnection(screen.onSharedDataUpdate) + } + } + + function onSharedDataUpdate(data) { + if (typeof data === "object" && typeof data.group === "object") { + propTopDeckFocus = data.group[isLeftScreen ? 'leftdeck' : 'rightdeck'] === `[Channel${screen.topDeckId}]` + } + } + + width: 320 + height: 240 + clip: true + + /* + A screen is visible if - + The deck is in focus and the linked deck is not selecting a sample slot + OR + The deck is not in focus but a sample slot is selected + */ + S4MK3.DeckScreen { + id: topDeckScreen + deckId: topDeckId + visible: propTopDeckFocus + anchors.fill: parent + } + + S4MK3.DeckScreen { + id: bottomDeckScreen + deckId: bottomDeckId + visible: !propTopDeckFocus + anchors.fill: parent + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserFooter.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserFooter.qml new file mode 100755 index 000000000000..edd2dea43929 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserFooter.qml @@ -0,0 +1,340 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Defines' as Defines +import '../Defines' as Defines +import '../ViewModels' as ViewModels + +//------------------------------------------------------------------------------------------------------------------ +// LIST ITEM - DEFINES THE INFORMATION CONTAINED IN ONE LIST ITEM +//------------------------------------------------------------------------------------------------------------------ +Rectangle { + id: footer + + Defines.Colors { id: colors } + + required property var deckInfo + + property string propertiesPath: "" + property real sortingKnobValue: 0.0 + property bool isContentList: qmlBrowser.isContentList + property int maxCount: 0 + property int count: 0 + + // the given numbers are determined by the EContentListColumns in Traktor + readonly property variant sortIds: [0 ,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + readonly property variant sortNames: ["Sort By #", "Sort By #", "Title", "Artist", "Time", "BPM", "Track #", "Release", "Label", "Genre", "Key Text", "Comment", "Lyrics", "Comment 2", "Path", "Analysed", "Remixer", "Producer", "Mix", "CAT #", "Rel. Date", "Bitrate", "Rating", "Count", "Sort By #", "Cover Art", "Last Played", "Import Date", "Key", "Color", "File Name"] + readonly property int selectedFooterId: (selectedFooterItem.value === undefined) ? 0 : ( ( selectedFooterItem.value % 2 === 1 ) ? 1 : 4 ) // selectedFooterItem.value takes values from 1 to 4. + + property real preSortingKnobValue: 0.0 + + //-------------------------------------------------------------------------------------------------------------------- + + // AppProperty { id: previewIsLoaded; path : "app.traktor.browser.preview_player.is_loaded" } + QtObject { + id: previewIsLoaded + property string description: "Description" + property var value: 0 + } + // AppProperty { id: previewTrackLenght; path : "app.traktor.browser.preview_content.track_length" } + QtObject { + id: previewTrackLenght + property string description: "Description" + property var value: 0 + } + // AppProperty { id: previewTrackElapsed; path : "app.traktor.browser.preview_player.elapsed_time" } + QtObject { + id: previewTrackElapsed + property string description: "Description" + property var value: 0 + } + + // MappingProperty { id: overlayState; path: propertiesPath + ".overlay" } + QtObject { + id: overlayState + property string description: "Description" + property var value: 0 + } + // MappingProperty { id: isContentListProp; path: propertiesPath + ".browser.is_content_list" } + QtObject { + id: isContentListProp + property string description: "Description" + property var value: 0 + } + // MappingProperty { id: selectedFooterItem; path: propertiesPath + ".selected_footer_item" } + QtObject { + id: selectedFooterItem + property string description: "Description" + property var value: 0 + } + + //-------------------------------------------------------------------------------------------------------------------- + // Behavior on Sorting Changes (show/hide sorting widget, select next allowed sorting) + //-------------------------------------------------------------------------------------------------------------------- + + onIsContentListChanged: { + // We need this to be able do disable mappings (e.g. sorting ascend/descend) + isContentListProp.value = isContentList; + } + + onSortingKnobValueChanged: { + if (!footer.isContentList) + return; + + overlayState.value = Overlay.sorting; + sortingOverlayTimer.restart(); + + var val = clamp(footer.sortingKnobValue - footer.preSortingKnobValue, -1, 1); + val = parseInt(val); + if (val != 0) { + qmlBrowser.sortingId = getSortingIdWithDelta( val ); + footer.preSortingKnobValue = footer.sortingKnobValue; + } + } + + Timer { + id: sortingOverlayTimer + interval: 800 // duration of the scrollbar opacity + repeat: false + + onTriggered: overlayState.value = Overlay.none; + } + + //-------------------------------------------------------------------------------------------------------------------- + // View + //-------------------------------------------------------------------------------------------------------------------- + + clip: true + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 21 + (settings.raiseBrowserFooter ? 4 : 0) // set in state + color: "transparent" + + // background color + Rectangle { + id: browserFooterBg + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 15 + (settings.raiseBrowserFooter ? 4 : 0) + color: colors.colorBrowserHeader // footer background color + } + + Row { + id: sortingRow + anchors.left: browserFooterBg.left + anchors.leftMargin: 1 + anchors.top: browserFooterBg.top + + Item { + width: 100 + height: 15 + (settings.raiseBrowserFooter ? 4 : 0) + + Text { + font.pixelSize: fonts.scale(12) + anchors.left: parent.left + anchors.leftMargin: 3 + font.capitalization: Font.AllUppercase + color: selectedFooterId == 1 ? "white" : colors.colorFontBrowserHeader + text: getSortingNameForSortId(qmlBrowser.sortingId) + visible: qmlBrowser.isContentList + } + // Arrow (Sorting Direction Indicator) + Triangle { + id: sortDirArrow + width: 10 + height: 10 + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 2 + anchors.rightMargin: 6 + antialiasing: false + visible: qmlBrowser.sortingId > 0 + color: colors.colorGrey80 + rotation: ((qmlBrowser.sortingDirection == 1) ? 0 : 180) + } + Rectangle { + id: divider + height: 15 + width: 1 + color: colors.colorGrey40 // footer divider color + anchors.right: parent.right + } + } + + // Preview Player footer + Item { + width: 120 + height: 15 + + Text { + font.pixelSize: fonts.scale(12) + anchors.left: parent.left + anchors.leftMargin: 5 + font.capitalization: Font.AllUppercase + visible: !previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : "green" + text: deckInfo.masterDeckLetter + } + + Text { + font.pixelSize: fonts.scale(12) + anchors.left: parent.left + anchors.leftMargin: 20 + font.capitalization: Font.AllUppercase + visible: !previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : colors.colorFontBrowserHeader + text: deckInfo.masterBPMFooter + } + + Text { + font.pixelSize: fonts.scale(12) + anchors.right: parent.right + anchors.rightMargin: 5 + font.capitalization: Font.AllUppercase + visible: !previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : colors.musicalKeyColorsDark[deckInfo.masterKeyIndex] + text: settings.camelotKey ? utils.camelotConvert(deckInfo.masterKey) : deckInfo.masterKey + } + + Text { + font.pixelSize: fonts.scale(12) + anchors.left: parent.left + anchors.leftMargin: 5 + font.capitalization: Font.AllUppercase + visible: previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : colors.colorFontBrowserHeader + text: "Preview" + } + + // Image { + // anchors.top: parent.top + // anchors.right: parent.right + // anchors.topMargin: 2 + // anchors.rightMargin: 45 + // visible: previewIsLoaded.value + // antialiasing: false + // source: "../Images/PreviewIcon_Small.png" + // fillMode: Image.Pad + // clip: true + // cache: false + // sourceSize.width: width + // sourceSize.height: height + // } + Text { + width: 40 + clip: true + horizontalAlignment: Text.AlignRight + visible: previewIsLoaded.value + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 2 + anchors.rightMargin: 7 + font.pixelSize: fonts.scale(12) + font.capitalization: Font.AllUppercase + font.family: "Pragmatica" + color: colors.browser.prelisten + text: utils.convertToTimeString(previewTrackElapsed.value) + } + Rectangle { + id: divider2 + height: 15 + width: 1 + color: colors.colorGrey40 // footer divider color + anchors.right: parent.right + } + } + + Item { + width: 80 + height: 15 + + Text { + Text { + font.pixelSize: fonts.scale(12) + anchors.left: parent.left + anchors.leftMargin: 5 + font.capitalization: Font.AllUppercase + visible: true + color: colors.colorFontBrowserHeader + text: count+"/"+maxCount + } + } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + // black border & shadow + //-------------------------------------------------------------------------------------------------------------------- + + Rectangle { + id: browserHeaderBottomGradient + height: 3 + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: browserHeaderBlackBottomLine.top + gradient: Gradient { + GradientStop { position: 0.0; color: colors.colorBlack0 } + GradientStop { position: 1.0; color: colors.colorBlack38 } + } + } + + Rectangle { + id: browserHeaderBlackBottomLine + height: 2 + color: colors.colorBlack + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: browserFooterBg.top + } + + //------------------------------------------------------------------------------------------------------------------ + + state: "show" + states: [ + State { + name: "show" + PropertyChanges { target: footer; height: 21 + (settings.raiseBrowserFooter ? 4 : 0) } + }, + State { + name: "hide" + PropertyChanges { target: footer; height: 0 } + } + ] + + //-------------------------------------------------------------------------------------------------------------------- + // Necessary Functions + //-------------------------------------------------------------------------------------------------------------------- + + function getSortingIdWithDelta( delta ) { + var curPos = getPosForSortId( qmlBrowser.sortingId ); + var pos = curPos + delta; + var count = sortIds.length; + + pos = (pos < 0) ? count-1 : pos; + pos = (pos >= count) ? 0 : pos; + + return sortIds[pos]; + } + + function getPosForSortId(id) { + if (id == -1) return 0; // -1 is a special case which should be interpreted as "0" + for (var i=0; i= 0 && pos < sortNames.length) + return sortNames[pos]; + return "SORTED"; + } + + function clamp(val, min, max) { + return Math.max( Math.min(val, max) , min ); + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserHeader.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserHeader.qml new file mode 100755 index 000000000000..5e258cd4995b --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/BrowserHeader.qml @@ -0,0 +1,223 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Defines' as Defines +import '../ViewModels' as ViewModels + +//------------------------------------------------------------------------------------------------------------------ +// BROWSER HEADER - SHOWS THE CURRENT BROWSER PATH +//------------------------------------------------------------------------------------------------------------------ +Item { + id: header + + Defines.Colors { id: colors } + + property int currentDeck: 0 + property int nodeIconId: 0 + + readonly property color itemColor: colors.colorWhite19 + property int highlightIndex: 0 + + readonly property var letters: ["","A", "B", "C", "D"] + + property string pathStrings: "" // the complete path in one string given by QBrowser with separator " | " + property var stringList: [""] // list of separated path elements (calculated in "updateStringList") + property int stringListModelSize: 0 // nr of entries which can be displayed in the header ( calc in updateStringList) + readonly property int maxTextWidth: 150 // if a single text path block is bigger than this: ElideMiddle + readonly property int arrowContainerWidth: 18 // width of the graphical separator arrow. includes left / right spacing + readonly property int fontSize: 13 + + clip: true + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + height: 17 // set in state + + onPathStringsChanged: { updateStringList(textLengthDummy) } + + //-------------------------------------------------------------------------------------------------------------------- + // NOTE: text item used within the 'updateStringList' function to determine how many of the stringList items can be fit + // in the header! + // IMPORTANT EXTRA NOTE: all texts in the header should have the same Capitalization and font size settings as the "dummy" + // as the dummy is used to calculate the number of text blocks fitting into the header. + //-------------------------------------------------------------------------------------------------------------------- + Text { + id: textLengthDummy + visible: false + font.capitalization: Font.AllUppercase + font.pixelSize: header.fontSize + } + + // calculates the number of entries to be displayed in the header + function updateStringList(dummy) { + var sum = 0 + var count = 0 + + stringList = pathStrings.split(" | ") + + for (var i = 0; i < stringList.length; ++i) { + dummy.text = header.stringList[stringList.length - i - 1] + + sum += (dummy.width) > maxTextWidth ? header.maxTextWidth : dummy.width + sum += arrowContainerWidth + + if (sum > (textContainter.width - header.arrowContainerWidth)) { + header.stringListModelSize = count + return + } + count++ + } + header.stringListModelSize = stringList.length; + } + + //-------------------------------------------------------------------------------------------------------------------- + // background color + Rectangle { + id: browserHeaderBg + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + height: 17 + color: colors.colorBrowserHeader //colors.colorGrey24 + } + + //-------------------------------------------------------------------------------------------------------------------- + + Item { + id: textContainter + readonly property int spaceToDeckLetter: 20 + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: deckLetter.left + anchors.leftMargin: 3 + anchors.rightMargin: spaceToDeckLetter + clip: true + + // dots appear at the left side of the browser in case the full path does not fit into the header anymore. + Item { + id: dots + anchors.left: parent.left + anchors.top: parent.top + anchors.leftMargin: (stringListModelSize < stringList.length) ? 0 : -width + visible: (stringListModelSize < stringList.length) + width: 30 + + Text { + anchors.left: parent.left + anchors.top: parent.top + text: "..." + font.capitalization: Font.AllUppercase + font.pixelSize: header.fontSize + color: colors.colorFontBrowserHeader + } + } + + // the text flow + Flow { + id: textFlow + layoutDirection: Qt.RightToLeft + + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: dots.right + + Repeater { + model: stringListModelSize + Item { + id: textContainer + property string displayTxt: (stringList[stringList.length - index - 1] == undefined) ? "" : stringList[stringList.length - index - 1] + + width: headerPath.width + arrowContainerWidth + height: 20 + + // arrows + // the graphical separator between texts anchors on the left side of each text block. The space of "arrowContainerWidth" is reserved for that + // Widgets.TextSeparatorArrow { + // color: colors.colorGrey80 + // visible: true + // anchors.top: parent.top + // anchors.right: headerPath.left + // anchors.topMargin: 4 + // anchors.rightMargin: 6 // left margin is set via "arrowContainerWidth" + // } + + Text { + id: dummy + // NOTE: dummyTextPath is only used to get the displayWidth of the strings. (otherwise dynamic text sizes are hard/impossible) + text: displayTxt + visible: false + font.capitalization: Font.AllUppercase + font.pixelSize: header.fontSize + } + + Text { + id: headerPath + // dummy.width is determined by the string contained in it and ceil to whole pixels (ceil instead of round to avoid unwanted elides) + width: (dummy.width > maxTextWidth) ? maxTextWidth : Math.ceil(dummy.width ) + elide: Text.ElideMiddle + text: displayTxt + visible: true + color: (index == 0) ? colors.colorDeckBlueBright : colors.colorGrey88 + font.capitalization: Font.AllUppercase + font.pixelSize: header.fontSize + } + } + } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + + Text { + id: deckLetter + anchors.right: parent.right + anchors.top: parent.top + height: parent.height + width: parent.height + + text: header.letters[header.currentDeck] + font.capitalization: Font.AllUppercase + font.pixelSize: header.fontSize + color: colors.colorDeckBlueBright + } + + //-------------------------------------------------------------------------------------------------------------------- + // black border & shadow + + Rectangle { + id: browserHeaderBlackBottomLine + anchors.left: parent.left + anchors.right: parent.right + anchors.top: browserHeaderBg.bottom + height: 2 + color: colors.colorBlack + } + + Rectangle { + id: browserHeaderBottomGradient + anchors.left: parent.left + anchors.right: parent.right + anchors.top: browserHeaderBlackBottomLine.bottom + height: 3 + gradient: Gradient { + GradientStop { position: 0.0; color: colors.colorBlack38 } + GradientStop { position: 1.0; color: colors.colorBlack0 } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + + state: "show" + states: [ + State { + name: "show" + PropertyChanges {target: header; height: 15} + }, + State { + name: "hide" + PropertyChanges {target: header; height: 0} + } + ] +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListDelegate.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListDelegate.qml new file mode 100755 index 000000000000..54e8525fa5e6 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListDelegate.qml @@ -0,0 +1,262 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +//------------------------------------------------------------------------------------------------------------------ +// LIST ITEM - DEFINES THE INFORMATION CONTAINED IN ONE LIST ITEM +//------------------------------------------------------------------------------------------------------------------ + +// the model contains the following roles: +// dataType, nodeIconId, nodeName, nrOfSubnodes, coverUrl, artistName, trackName, bpm, key, keyIndex, rating, loadedInDeck, prevPlayed, prelisten + +Item { + id: contactDelegate + + Defines.Settings {id: settings} + + property string masterBPM: "" + property string masterKey: "" + property int keyIndex: 0 + property bool isPlaying: false + property bool adjacentKeys: false + property string newIndex: keyIndex || "" + property string masterKeyIndex: keyIndex + property color deckColor: qmlBrowser.focusColor + property color textColor: !ListView.isCurrentItem ? "White" : deckColor + property bool isCurrentItem: ListView.isCurrentItem + readonly property int textTopMargin: 5 // centers text vertically + // readonly property bool isLoaded: (dataType == "Track") ? model.loadedInDeck.length > 0 : false + readonly property bool isLoaded: false + // visible: !ListView.isCurrentItem + readonly property string dataType: "Track" + readonly property string artistName: model.artist + readonly property string trackName: model.title + readonly property string key: "" + readonly property string bpmText: "---" + readonly property real bpm: 0 + + readonly property string bpmMatch: tempoNeeded(masterBPM, bpm).toFixed(2).toString() + + property bool deck1: deckInfo.is1Playing + property bool deck2: deckInfo.is2Playing + property bool deck3: deckInfo.is3Playing + property bool deck4: deckInfo.is4Playing + + readonly property bool deckPlaying: deck1 || deck2 || deck3 || deck4 + + function tempoNeeded(master, current) { + if (master > current) { + return (1-(current/master))*100; + } + + return ((master/current)-1)*100; + } + + readonly property int key1m: 21 + readonly property int key2m: 16 + readonly property int key3m: 23 + readonly property int key4m: 18 + readonly property int key5m: 13 + readonly property int key6m: 20 + readonly property int key7m: 15 + readonly property int key8m: 22 + readonly property int key9m: 17 + readonly property int key10m: 12 + readonly property int key11m: 19 + readonly property int key12m: 14 + readonly property int key1d: 0 + readonly property int key2d: 7 + readonly property int key3d: 2 + readonly property int key4d: 9 + readonly property int key5d: 4 + readonly property int key6d: 11 + readonly property int key7d: 6 + readonly property int key8d: 1 + readonly property int key9d: 8 + readonly property int key10d: 3 + readonly property int key11d: 10 + readonly property int key12d: 5 + + function colorKey(newKey,masterKey) { + if (!contactDelegate.adjacentKeys) {return true} + else if ((newKey == masterKey)) {return true} + else if (masterKey == "") {return false} + else if (masterKey == "21" && (newKey == "14" || newKey == "16" || newKey == "0")) {return true} + else if (masterKey == "16" && (newKey == "21" || newKey == "23" || newKey == "7")) {return true} + else if (masterKey == "23" && (newKey == "16" || newKey == "18" || newKey == "2")) {return true} + else if (masterKey == "18" && (newKey == "23" || newKey == "13" || newKey == "9")) {return true} + else if (masterKey == "13" && (newKey == "18" || newKey == "20" || newKey == "4")) {return true} + else if (masterKey == "20" && (newKey == "13" || newKey == "15" || newKey == "11")) {return true} + else if (masterKey == "15" && (newKey == "20" || newKey == "22" || newKey == "6")) {return true} + else if (masterKey == "22" && (newKey == "15" || newKey == "17" || newKey == "1")) {return true} + else if (masterKey == "17" && (newKey == "22" || newKey == "12" || newKey == "8")) {return true} + else if (masterKey == "12" && (newKey == "17" || newKey == "19" || newKey == "3")) {return true} + else if (masterKey == "19" && (newKey == "12" || newKey == "14" || newKey == "10")) {return true} + else if (masterKey == "14" && (newKey == "19" || newKey == "21" || newKey == "5")) {return true} + else if (masterKey == "0" && (newKey == "5" || newKey == "7" || newKey == "21")) {return true} + else if (masterKey == "7" && (newKey == "0" || newKey == "2" || newKey == "16")) {return true} + else if (masterKey == "2" && (newKey == "7" || newKey == "9" || newKey == "23")) {return true} + else if (masterKey == "9" && (newKey == "2" || newKey == "4" || newKey == "18")) {return true} + else if (masterKey == "4" && (newKey == "9" || newKey == "11" || newKey == "13")) {return true} + else if (masterKey == "11" && (newKey == "4" || newKey == "6" || newKey == "20")) {return true} + else if (masterKey == "6" && (newKey == "11" || newKey == "1" || newKey == "15")) {return true} + else if (masterKey == "1" && (newKey == "6" || newKey == "8" || newKey == "22")) {return true} + else if (masterKey == "8" && (newKey == "1" || newKey == "3" || newKey == "17")) {return true} + else if (masterKey == "3" && (newKey == "8" || newKey == "10" || newKey == "12")) {return true} + else if (masterKey == "10" && (newKey == "3" || newKey == "5" || newKey == "19")) {return true} + else if (masterKey == "5" && (newKey == "10" || newKey == "0" || newKey == "14")) {return true} + else {return false}; + } + + // MappingProperty { id: propShift1; path: "mapping.state.left.shift" } + QtObject { + id: propShift1 + property string description: "Description" + property var value: 0 + } + // MappingProperty { id: propShift2; path: "mapping.state.right.shift" } + QtObject { + id: propShift2 + property string description: "Description" + property var value: 0 + } + readonly property bool isShift: propShift1.value || propShift2.value + readonly property bool isShiftleft: propShift1.value + readonly property bool isShiftRight: propShift2.value + + height: settings.browserFontSize*2 + anchors.left: parent.left + anchors.right: parent.right + + // container for zebra & track infos + Rectangle { + // when changing colors here please remember to change it in the GridView in Templates/Browser.qml + color: (index%2 == 0) ? colors.colorGrey32 : "Black" + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: settings.showTrackTitleColumn ? 3 : 0 + anchors.rightMargin: 3 + height: parent.height + + // folder name + Text { + id: firstFieldFolder + anchors.left: parent.left + anchors.top: parent.top + anchors.topMargin: contactDelegate.textTopMargin + anchors.leftMargin: 37 + color: textColor + clip: true + text: (dataType == "Folder") ? model.nodeName : "" + font.pixelSize: settings.browserFontSize + elide: Text.ElideRight + visible: (dataType != "Track") + width: 190 + } + + // Image { + // id: prepListIcon + // visible: (dataType == "Track") ? model.prepared : false + // source: "../Images/PrepListIcon" + (!contactDelegate.isCurrentItem ? "White" : "Blue") + ".png" + // width: 10 + // height: 17 + // // anchors.left: firstFieldText.right + // anchors.top: parent.top + // anchors.topMargin: 6 + // anchors.leftMargin: 5 + // } + + // track name + Text { + id: firstFieldTrack + width: settings.swapArtistTitleColumns ? (settings.showArtistColumn ? (settings.hideBPM ? 110 : 77) + (settings.hideKey ? 30 : 0) : 0) + (!settings.showTrackTitleColumn ? 150 : 0) : !settings.showTrackTitleColumn ? 0 : (!settings.showArtistColumn && settings.hideBPM ? 280 : (settings.showArtistColumn ? 150 : 230)) + (!settings.showArtistColumn && settings.hideKey ? 30 : 0) + visible: (dataType == "Track") + anchors.top: parent.top + anchors.topMargin: contactDelegate.textTopMargin + anchors.left: parent.left + anchors.leftMargin: model.prepared ? 10 : 0 + elide: Text.ElideRight + text: settings.swapArtistTitleColumns ? ((dataType == "Track") ? artistName : "") : (settings.showArtistColumn && settings.showTrackTitleColumn ? ((dataType == "Track") ? trackName : "") : (!isShift && !settings.showArtistColumn && settings.showTrackTitleColumn ? ((dataType == "Track") ? trackName : "") : ((dataType == "Track") ? artistName : ""))) + font.pixelSize: settings.browserFontSize + color: isLoaded ? "lime" : ((model.prevPlayed && !model.prelisten) ? "yellow" : (!bpm ? "red" : textColor)) + } + + // artist name + Text { + id: trackTitleField + anchors.leftMargin: settings.showArtistColumn && settings.showTrackTitleColumn ? 4 : 0 + anchors.left: (dataType == "Track") ? firstFieldTrack.right : firstFieldFolder.right + anchors.top: parent.top + anchors.topMargin: contactDelegate.textTopMargin + width: settings.swapArtistTitleColumns ? !settings.showTrackTitleColumn ? 0 : (!settings.showArtistColumn && settings.hideBPM ? 280 : (settings.showArtistColumn ? 150 : 230)) + (!settings.showArtistColumn && settings.hideKey ? 30 : 0) : (settings.showArtistColumn ? (settings.hideBPM ? 110 : 77) + (settings.hideKey ? 30 : 0) : 0) + (!settings.showTrackTitleColumn ? 150 : 0) + color: isLoaded ? "lime" : ((model.prevPlayed && !model.prelisten) ? "yellow" : (!bpm ? "red" : textColor)) + clip: true + text: settings.swapArtistTitleColumns ? (dataType == "Track") ? trackName : "" : (settings.showArtistColumn && settings.showTrackTitleColumn ? ((dataType == "Track") ? artistName : "") : (!isShift && settings.showArtistColumn && !settings.showTrackTitleColumn ? ((dataType == "Track") ? artistName : "") : (dataType == "Track") ? trackName : "")) + font.pixelSize: settings.browserFontSize + elide: Text.ElideRight + } + + // bpm + Text { + id: bpmField + anchors.right: keyField.left + anchors.top: parent.top + anchors.topMargin: contactDelegate.textTopMargin + horizontalAlignment: Text.AlignLeft + width: settings.hideBPM ? 0 :53 + color: settings.bpmBrowserTextColor ? (bpm == "0.00") ? "red" : (bpmMatch <= settings.browserBpmGreen) && (bpmMatch >= -(settings.browserBpmGreen)) ? "lime" : (!((bpmMatch >= settings.browserBpmRed) || (bpmMatch <= -(settings.browserBpmRed)) && (masterBPM != "0.00")) ? textColor : settings.accentColor) : textColor + clip: true + text: (dataType == "Track") ? bpmText : "" + font.pixelSize: settings.browserFontSize + } + + function colorForKey(keyIndex) { + return colors.musicalKeyColors[keyIndex] + } + + // key + Text { + id: keyField + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: contactDelegate.textTopMargin + anchors.leftMargin: 5 + + color: (dataType == "Track") ? (((key == "none") || (key == "None")) ? "White" : ((colorKey(contactDelegate.newIndex, contactDelegate.masterKeyIndex) && contactDelegate.deckPlaying) ? parent.colorForKey(keyIndex) : "White")) : "White" + width: settings.hideKey ? 0 : 30 + clip: true + text: (dataType == "Track") ? (((key == "none") || (key == "None")) ? "n.a." : (settings.camelotKey ? utils.camelotConvert(key) : key)) : "" + font.pixelSize: settings.browserFontSize + } + + ListHighlight { + anchors.fill: parent + visible: contactDelegate.isCurrentItem + anchors.leftMargin: 0 + anchors.rightMargin: 0 + } + + // folder icon + Image { + id: folderIcon + source: (dataType == "Folder") ? ("image://icons/" + model.nodeIconId ) : "" + width: 33 + height: 33 + fillMode: Image.PreserveAspectFit + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 3 + clip: true + cache: false + visible: (dataType == "Folder") + } + + // ColorOverlay { + // id: folderIconColorOverlay + // color: isCurrentItem == false ? colors.colorFontsListBrowser : contactDelegate.deckColor // unselected vs. selected + // anchors.fill: folderIcon + // source: folderIcon + // } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListHighlight.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListHighlight.qml new file mode 100755 index 000000000000..28dadb00bdb5 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/ListHighlight.qml @@ -0,0 +1,19 @@ +import QtQuick 2.15 + +Item { + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "blue" + } + + Rectangle { + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "blue" + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackFooter.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackFooter.qml new file mode 100755 index 000000000000..f6c0213cb83b --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackFooter.qml @@ -0,0 +1,353 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Defines' as Defines +import '../Defines' as Defines +import '../ViewModels' as ViewModels + +//------------------------------------------------------------------------------------------------------------------ +// LIST ITEM - DEFINES THE INFORMATION CONTAINED IN ONE LIST ITEM +//------------------------------------------------------------------------------------------------------------------ +Rectangle { + id: footer + + Defines.Colors { id: colors } + + required property var deckInfo + + property string propertiesPath: "" + property real sortingKnobValue: 0.0 + property bool isContentList: qmlBrowser.isContentList + property int maxCount: 0 + property int count: 0 + + // the given numbers are determined by the EContentListColumns in Traktor + readonly property variant sortIds: [0 ,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + readonly property variant sortNames: ["Sort By #", "Sort By #", "Title", "Artist", "Time", "BPM", "Track #", "Label", "Release", "Label", "Key Text", "Comment", "Lyrics", "Comment 2", "Path", "Analysed", "Remixer", "Producer", "Mix", "CAT #", "Rel. Date", "Bitrate", "Rating", "Count", "Sort By #", "Cover Art", "Last Played", "Import Date", "Key", "Color", "File Name"] + readonly property int selectedFooterId: (selectedFooterItem.value === undefined) ? 0 : ( ( selectedFooterItem.value % 2 === 1 ) ? 1 : 4 ) // selectedFooterItem.value takes values from 1 to 4. + + property real preSortingKnobValue: 0.0 + + //-------------------------------------------------------------------------------------------------------------------- + + // AppProperty { id: previewIsLoaded; path : "app.traktor.browser.preview_player.is_loaded" } + QtObject { + id: previewIsLoaded + property string description: "Description" + property var value: 0 + } + // AppProperty { id: previewTrackLenght; path : "app.traktor.browser.preview_content.track_length" } + QtObject { + id: previewTrackLenght + property string description: "Description" + property var value: 0 + } + // AppProperty { id: previewTrackElapsed; path : "app.traktor.browser.preview_player.elapsed_time" } + QtObject { + id: previewTrackElapsed + property string description: "Description" + property var value: 0 + } + + // MappingProperty { id: overlayState; path: propertiesPath + ".overlay" } + QtObject { + id: overlayState + property string description: "Description" + property var value: 0 + } + // MappingProperty { id: isContentListProp; path: propertiesPath + ".browser.is_content_list" } + QtObject { + id: isContentListProp + property string description: "Description" + property var value: 0 + } + // MappingProperty { id: selectedFooterItem; path: propertiesPath + ".selected_footer_item" } + QtObject { + id: selectedFooterItem + property string description: "Description" + property var value: 0 + } + + //-------------------------------------------------------------------------------------------------------------------- + // Behavior on Sorting Changes (show/hide sorting widget, select next allowed sorting) + //-------------------------------------------------------------------------------------------------------------------- + + onIsContentListChanged: { + // We need this to be able do disable mappings (e.g. sorting ascend/descend) + isContentListProp.value = isContentList; + } + + onSortingKnobValueChanged: { + if (!footer.isContentList) + return; + + overlayState.value = Overlay.sorting; + sortingOverlayTimer.restart(); + + var val = clamp(footer.sortingKnobValue - footer.preSortingKnobValue, -1, 1); + val = parseInt(val); + if (val != 0) { + qmlBrowser.sortingId = getSortingIdWithDelta( val ); + footer.preSortingKnobValue = footer.sortingKnobValue; + } + } + + Timer { + id: sortingOverlayTimer + interval: 800 // duration of the scrollbar opacity + repeat: false + + onTriggered: overlayState.value = Overlay.none; + } + + //-------------------------------------------------------------------------------------------------------------------- + // View + //-------------------------------------------------------------------------------------------------------------------- + + clip: false + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 36 + (settings.raiseBrowserFooter ? 4 : 0) // set in state + color: "transparent" + + // background color + Rectangle { + id: browserFooterBg + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: 30 + (settings.raiseBrowserFooter ? 4 : 0) + color: colors.colorBrowserHeader // footer background color + } + + Row { + id: sortingRow + anchors.left: browserFooterBg.left + anchors.leftMargin: 1 + anchors.top: browserFooterBg.top + + Item { + width: 100 + height: 30 + (settings.raiseBrowserFooter ? 4 : 0) + + Text { + font.pixelSize: fonts.scale(15) + anchors.left: parent.left + anchors.leftMargin: 3 + anchors.top: parent.top + anchors.topMargin: 3 + font.capitalization: Font.AllUppercase + color: selectedFooterId == 1 ? "white" : colors.colorFontBrowserHeader + text: getSortingNameForSortId(qmlBrowser.sortingId) + visible: qmlBrowser.isContentList + } + // Arrow (Sorting Direction Indicator) + Triangle { + id: sortDirArrow + width: 15 + height: 15 + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 4 + anchors.rightMargin: 6 + antialiasing: false + visible: qmlBrowser.sortingId > 0 + color: colors.colorGrey80 + rotation: ((qmlBrowser.sortingDirection == 1) ? 0 : 180) + } + Rectangle { + id: divider + height: 30 + width: 1 + color: colors.colorGrey40 // footer divider color + anchors.right: parent.right + } + } + + // Preview Player footer + Item { + width: 150 + height: 30 + + Text { + font.pixelSize: fonts.scale(18) + anchors.left: parent.left + anchors.leftMargin: 1 + anchors.top: parent.top + anchors.topMargin: 3 + font.capitalization: Font.AllUppercase + visible: !previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : "green" + text: deckInfo.masterDeckLetter + } + + Text { + font.pixelSize: fonts.scale(18) + anchors.left: parent.left + anchors.leftMargin: 15 + anchors.top: parent.top + anchors.topMargin: 3 + font.capitalization: Font.AllUppercase + visible: !previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : colors.colorFontBrowserHeader + text: deckInfo.masterBPMFooter2 + } + + Text { + font.pixelSize: fonts.scale(18) + anchors.right: parent.right + anchors.rightMargin: 2 + anchors.top: parent.top + anchors.topMargin: 3 + font.capitalization: Font.AllUppercase + visible: !previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : colors.musicalKeyColorsDark[deckInfo.masterKeyIndex] + text: settings.camelotKey ? utils.camelotConvert(deckInfo.masterKey) : deckInfo.masterKey + } + + Text { + font.pixelSize: fonts.scale(16) + anchors.left: parent.left + anchors.leftMargin: 5 + anchors.top: parent.top + anchors.topMargin: 3 + font.capitalization: Font.AllUppercase + visible: previewIsLoaded.value + color: selectedFooterId == 4 ? "white" : colors.colorFontBrowserHeader + text: "Preview" + } + + // Image { + // anchors.top: parent.top + // anchors.right: parent.right + // anchors.topMargin: 3 + // anchors.rightMargin: 49 + // visible: previewIsLoaded.value + // antialiasing: false + // source: "../Images/PreviewIcon_Small.png" + // fillMode: Image.Pad + // clip: true + // cache: false + // width: 20 + // height: 20 + // } + Text { + width: 40 + clip: true + horizontalAlignment: Text.AlignRight + visible: previewIsLoaded.value + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 2 + anchors.rightMargin: 7 + font.pixelSize: fonts.scale(18) + font.capitalization: Font.AllUppercase + font.family: "Pragmatica" + color: colors.browser.prelisten + text: utils.convertToTimeString(previewTrackElapsed.value) + } + Rectangle { + id: divider2 + height: 30 + width: 1 + color: colors.colorGrey40 // footer divider color + anchors.right: parent.right + } + } + + Item { + + width: 150 + height: 30 + + Text { + Text { + font.pixelSize: fonts.scale(20) + anchors.left: parent.right + anchors.leftMargin: 3 + anchors.top: parent.top + anchors.topMargin: 3 + font.capitalization: Font.AllUppercase + visible: true + color: colors.colorFontBrowserHeader + text: count + } + } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + // black border & shadow + //-------------------------------------------------------------------------------------------------------------------- + + Rectangle { + id: browserHeaderBottomGradient + height: 3 + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: browserHeaderBlackBottomLine.top + gradient: Gradient { + GradientStop { position: 0.0; color: colors.colorBlack0 } + GradientStop { position: 1.0; color: colors.colorBlack38 } + } + } + + Rectangle { + id: browserHeaderBlackBottomLine + height: 2 + color: colors.colorBlack + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: browserFooterBg.top + } + + //------------------------------------------------------------------------------------------------------------------ + + state: "show" + states: [ + State { + name: "show" + PropertyChanges { target: footer; height: 36 + (settings.raiseBrowserFooter ? 4 : 0) } + }, + State { + name: "hide" + PropertyChanges { target: footer; height: 0 } + } + ] + + //-------------------------------------------------------------------------------------------------------------------- + // Necessary Functions + //-------------------------------------------------------------------------------------------------------------------- + + function getSortingIdWithDelta( delta ) { + var curPos = getPosForSortId( qmlBrowser.sortingId ); + var pos = curPos + delta; + var count = sortIds.length; + + pos = (pos < 0) ? count-1 : pos; + pos = (pos >= count) ? 0 : pos; + + return sortIds[pos]; + } + + function getPosForSortId(id) { + if (id == -1) return 0; // -1 is a special case which should be interpreted as "0" + for (var i=0; i= 0 && pos < sortNames.length) + return sortNames[pos]; + return "SORTED"; + } + + function clamp(val, min, max) { + return Math.max( Math.min(val, max) , min ); + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackView.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackView.qml new file mode 100755 index 000000000000..7ec1eb1a2f64 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/TrackView.qml @@ -0,0 +1,202 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +//------------------------------------------------------------------------------------------------------------------ +// LIST ITEM - DEFINES THE INFORMATION CONTAINED IN ONE LIST ITEM +//------------------------------------------------------------------------------------------------------------------ + +// the model contains the following roles: +// dataType, nodeIconId, nodeName, nrOfSubnodes, coverUrl, artistName, trackName, bpm, key, keyIndex, rating, loadedInDeck, prevPlayed, prelisten + +Item { + id: contactDelegate + + Defines.Settings {id: settings} + + property string masterBPM: "" + property color deckColor: qmlBrowser.focusColor + property color textColor: !ListView.isCurrentItem ? "White" : deckColor + property bool isCurrentItem: ListView.isCurrentItem + readonly property int textTopMargin: 5 // centers text vertically + readonly property bool isLoaded: (model.dataType == "Track") ? model.loadedInDeck.length > 0 : false + readonly property int rating: (model.dataType == "Track") ? ((model.rating == "") ? 0 : model.rating ) : 0 + // visible: !ListView.isCurrentItem + readonly property string bpm: (model.bpm || 0).toFixed(2).toString() + + readonly property string bpmMatch: tempoNeeded(masterBPM, bpm).toFixed(2).toString() + + function tempoNeeded(master, current) { + if (master > current) { + + return (1-(current/master))*100; + + } else if (master < current) { + + return ((master/current)-1)*100; + } + } + + // MappingProperty { id: propShift1; path: "mapping.state.left.shift" } + QtObject { + id: propShift1 + property string description: "Description" + property var value: 0 + } + // MappingProperty { id: propShift2; path: "mapping.state.right.shift" } + QtObject { + id: propShift2 + property string description: "Description" + property var value: 0 + } + readonly property bool isShift: propShift1.value || propShift2.value + readonly property bool isShiftleft: propShift1.value + readonly property bool isShiftRight: propShift2.value + + height: 240 + anchors.left: parent.left + anchors.right: parent.right + + // container for zebra & track infos + Rectangle { + // when changing colors here please remember to change it in the GridView in Templates/Browser.qml + color: (index%2 == 0) ? colors.colorGrey32 : "Black" + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: settings.showTrackTitleColumn ? 3 : 0 + anchors.rightMargin: 3 + height: parent.height + + // track name + Text { + id: firstFieldTrack + width: 300 + clip: true + anchors.top: trackImage.bottom + anchors.topMargin: contactDelegate.textTopMargin + anchors.left: parent.left + anchors.leftMargin: 5 + text: (model.dataType == "Track") ? model.trackName : "" + font.pixelSize: 20 + color: isLoaded ? "lime" : ((model.prevPlayed && !model.prelisten) ? "yellow" : (((model.bpm || 0).toFixed(4) == "0.0000" ) ? "red" : textColor)) + } + + // artist name + Text { + id: trackTitleField + anchors.top: firstFieldTrack.bottom + anchors.topMargin: contactDelegate.textTopMargin + anchors.left: parent.left + anchors.leftMargin: 5 + width: 300 + color: isLoaded ? "lime" : ((model.prevPlayed && !model.prelisten) ? "yellow" : (((model.bpm || 0).toFixed(4) == "0.0000" ) ? "red" : textColor)) + clip: true + text: (model.dataType == "Track") ? model.artistName : "" + font.pixelSize: 20 + } + + //bpm text + Text { + id: bpmFieldText + anchors.top: parent.top + anchors.left: trackImage.right + anchors.leftMargin: 5 + anchors.topMargin: 5 + horizontalAlignment: Text.AlignLeft + + color: "white" + text: "BPM:" + font.pixelSize: 28 + } + + //bpm + Text { + id: bpmField + anchors.top: parent.top + anchors.rightMargin: 0 + anchors.right: parent.right + anchors.topMargin: 5 + horizontalAlignment: Text.AlignRight + + color: settings.bpmBrowserTextColor ? (bpm == "0.00") ? "red" : (bpmMatch <= settings.browserBpmGreen) && (bpmMatch >= -(settings.browserBpmGreen)) ? "lime" : (!((bpmMatch >= settings.browserBpmRed) || (bpmMatch <= -(settings.browserBpmRed)) && (masterBPM != "0.00")) ? textColor : settings.accentColor) : textColor + clip: true + text: (model.dataType == "Track") ? bpm : "" + font.pixelSize: 30 + } + + function colorForKey(keyIndex) { + return colors.musicalKeyColors[keyIndex] + } + + // key text + Text { + id: keyFieldText + anchors.top: bpmField.bottom + anchors.left: trackImage.right + anchors.topMargin: 8 + anchors.leftMargin: 5 + + color: "white" + clip: true + text: "Key:" + font.pixelSize: 30 + } + + // key + Text { + id: keyField + anchors.top: bpmField.bottom + anchors.right: parent.right + anchors.topMargin: 8 + anchors.rightMargin: 0 + + color: (model.dataType == "Track") ? (((model.key == "none") || (model.key == "None")) ? textColor : parent.colorForKey(model.keyIndex)) : textColor + clip: true + text: (model.dataType == "Track") ? (((model.key == "none") || (model.key == "None")) ? "n.a." : (settings.camelotKey ? utils.camelotConvert(model.key) : model.key)) : "" + font.pixelSize: 30 + } + + Widgets.TrackRating { + id: trackRating + + anchors.top: keyFieldText.bottom + anchors.left: trackImage.right + anchors.topMargin: 8 + anchors.leftMargin: 5 + rating: (model.dataType == "Track") ? ((model.rating == "") ? 0 : model.rating ) : 0 + } + + ListHighlight { + anchors.fill: parent + visible: contactDelegate.isCurrentItem + anchors.leftMargin: 0 + anchors.rightMargin: 0 + } + + Rectangle { + id: trackImage + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 5 + anchors.topMargin: 10 + width: 125 + height: 125 + color: (model.coverUrl != "") ? "transparent" : ((contactDelegate.screenFocus < 2) ? colors.colorDeckBlueBright50Full : colors.colorGrey128 ) + visible: (model.dataType == "Track") && !settings.hideAlbumArt + + Image { + id: cover + anchors.fill: parent + source: (model.dataType == "Track") ? ("image://covers/" + model.coverUrl ) : "" + fillMode: Image.PreserveAspectFit + clip: true + cache: false + sourceSize.width: width + sourceSize.height: height + // the image either provides the cover of the track, or if not available the traktor logo on colored background ( opacity == 0.3) + opacity: (model.coverUrl != "") ? 1.0 : 0.3 + } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/Triangle.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/Triangle.qml new file mode 100755 index 000000000000..97cbe25ab4da --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Browser/Triangle.qml @@ -0,0 +1,29 @@ +import QtQuick 2.15 +import QtQuick.Shapes 1.7 + +Item { + id: root + + property int borderWidth: 0 + property color color: "black" + property color borderColor: "transparent" + + property alias antialiasing: triangle.antialiasing + + clip: false + + Shape { + id: triangle + anchors.centerIn: parent + + ShapePath { + strokeWidth: root.borderWidth + strokeColor: root.borderColor + fillColor: root.color + startX: 0; startY: 0 + PathLine { x: root.width; y: 0 } + PathLine { x: 0.5* root.width; y: root.height } + PathLine { x: 0; y: 0 } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/DeckScreen.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/DeckScreen.qml new file mode 100755 index 000000000000..de1bf4b4739f --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/DeckScreen.qml @@ -0,0 +1,184 @@ +import QtQuick 2.15 +import './Defines' as Dfeines +import './Views' as Views +import './ViewModels' as ViewModels +import './Overlays' as Overlays + +Item { + id: deckscreen + + property int deckId: 1 + + property bool active: true + + //-------------------------------------------------------------------------------------------------------------------- + // Deck Screen: show information for track, stem, remix decks + //-------------------------------------------------------------------------------------------------------------------- + QtObject { + id: deckType + property string description: deckInfoModel.isStemsActive ? "Stem Deck" : "Track Deck" + property var value: 1 + } + + QtObject { + id: propShift1 + property var value: false + } + QtObject { + id: propShift2 + property var value: false + } + readonly property bool isShift: propShift1.value || propShift2.value + + property bool browser: settings.showBrowserOnFavorites ? ((deckInfoModel.viewButton) || (deckInfoModel.favorites)) : (deckInfoModel.viewButton) + + Component.onCompleted: { + if (engine.getSetting("useSharedDataAPI")) { + engine.makeSharedDataConnection(deckscreen.onSharedDataUpdate) + } + } + + function isLeftScreen(deckId) { + return deckId == 1 || deckId == 3; + } + + function onSharedDataUpdate(data) { + if (typeof data === "object" && typeof data.shift === "object") { + propShift1.value = !!data.shift["leftdeck"] + propShift2.value = !!data.shift["rightdeck"] + } + } + + ViewModels.DeckInfo { + id: deckInfoModel + deckId: deckscreen.deckId + } + + Component { + id: emptyDeckComponent; + + Views.EmptyDeck { + anchors.fill: parent + deckInfo: deckInfoModel + } + } + + Component { + id: trackDeckComponent; + Views.TrackDeck { + id: trackDeck + deckInfo: deckInfoModel + deckId: deckscreen.deckId + anchors.fill: parent + } + } + + Component { + id: browserComponent; + Views.BrowserView { + id: browserView + deckInfo: deckInfoModel + anchors.fill: parent + isActive: (loader.sourceComponent == browserComponent) && deckscreen.active + } + } + + Component { + id: stemDeckComponent; + + Views.StemDeck { + deckInfo: deckInfoModel + anchors.fill: parent + } + } + + Loader { + id: loader + active: true + visible: true + anchors.fill: parent + sourceComponent: trackDeckComponent + } + + Item { + id: content + state: "Empty Deck" + + Component.onCompleted: { + content.state = Qt.binding(function() { + return (browser && settings.enableBrowserMode) ? "Browser" : deckType.description }); + } + + states: [ + State { + name: "Empty Deck" + PropertyChanges { target: loader; sourceComponent: emptyDeckComponent } + }, + State { + name: "Track Deck" + PropertyChanges { target: loader; sourceComponent: trackDeckComponent } + }, + State { + name: "Browser" + PropertyChanges { target: loader; sourceComponent: browserComponent } + }, + State { + name: "Stem Deck" + PropertyChanges { target: loader; sourceComponent: stemDeckComponent } + } + ] + } + + Overlays.GridControls { + id: grid + deckId: deckInfoModel.deckId + showHideState: !settings.hideGridOverlay && deckInfoModel.adjustEnabled && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.BankInfo { + id: bank1; + bank: 1 + showHideState: deckInfoModel.padsModeBank1 && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.BankInfo { + id: bank2; + bank: 2 + showHideState: deckInfoModel.padsModeBank2 && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.CueInfo { + id: cue + hotcue: deckInfoModel.hotcueId + type: deckInfoModel.hotcueType + name: deckInfoModel.hotcueName + showHideState: !settings.hideHotcueOverlay && deckInfoModel.hotcueDisplay && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.JumpControls { + id: jump; + deckInfo: deckInfoModel + showHideState: !settings.hideJumpOverlay && deckInfoModel.padsModeJump && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.LoopControls { + id: loop; + deckInfo: deckInfoModel + deckId: deckInfoModel.deckId + showHideState: !settings.hideLoopOverlay && deckInfoModel.padsModeLoop && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.RollControls { + id: roll; + deckInfo: deckInfoModel + deckId: deckInfoModel.deckId + showHideState: !settings.hideRollOverlay && deckInfoModel.padsModeRoll && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } + + Overlays.ToneControls { + id: tone; + deckId: deckInfoModel.deckId + adjustVal: deckInfoModel.keyAdjustVal + showHideState: !settings.hideToneOverlay && deckInfoModel.padsModeTone && !(loader.sourceComponent == browserComponent) ? "show" : "hide" + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Colors.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Colors.qml new file mode 100755 index 000000000000..ab2c0ceb77da --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Colors.qml @@ -0,0 +1,549 @@ +import QtQuick 2.15 + +QtObject { + + function rgba(r,g,b,a) { return Qt.rgba( neutralizer(r)/255. , neutralizer(g)/255. , neutralizer(b)/255. , neutralizer(a)/255. ) } + + // this categorizes any rgb value to multiples of 8 for each channel to avoid unbalanced colors on the display (r5-g6-b5 bit) + // function neutralizer(value) { if(value%8 > 4) { return value - value%8 + 8} else { return value - value%8 }} + function neutralizer(value) { return value} + + property variant colorBlack: rgba (0, 0, 0, 255) + property variant colorBlack94: rgba (0, 0, 0, 240) + property variant colorBlack88: rgba (0, 0, 0, 224) + property variant colorBlack85: rgba (0, 0, 0, 217) + property variant colorBlack81: rgba (0, 0, 0, 207) + property variant colorBlack78: rgba (0, 0, 0, 199) + property variant colorBlack75: rgba (0, 0, 0, 191) + property variant colorBlack69: rgba (0, 0, 0, 176) + property variant colorBlack66: rgba (0, 0, 0, 168) + property variant colorBlack63: rgba (0, 0, 0, 161) + property variant colorBlack60: rgba (0, 0, 0, 153) // from 59 - 61% + property variant colorBlack56: rgba (0, 0, 0, 143) // + property variant colorBlack53: rgba (0, 0, 0, 135) // from 49 - 51% + property variant colorBlack50: rgba (0, 0, 0, 128) // from 49 - 51% + property variant colorBlack47: rgba (0, 0, 0, 120) // from 46 - 48% + property variant colorBlack44: rgba (0, 0, 0, 112) // from 43 - 45% + property variant colorBlack41: rgba (0, 0, 0, 105) // from 40 - 42% + property variant colorBlack38: rgba (0, 0, 0, 97) // from 37 - 39% + property variant colorBlack35: rgba (0, 0, 0, 89) // from 33 - 36% + property variant colorBlack31: rgba (0, 0, 0, 79) // from 30 - 32% + property variant colorBlack28: rgba (0, 0, 0, 71) // from 27 - 29% + property variant colorBlack25: rgba (0, 0, 0, 64) // from 24 - 26% + property variant colorBlack22: rgba (0, 0, 0, 56) // from 21 - 23% + property variant colorBlack19: rgba (0, 0, 0, 51) // from 18 - 20% + property variant colorBlack16: rgba (0, 0, 0, 41) // from 15 - 17% + property variant colorBlack12: rgba (0, 0, 0, 31) // from 11 - 13% + property variant colorBlack09: rgba (0, 0, 0, 23) // from 8 - 10% + property variant colorBlack0: rgba (0, 0, 0, 0) + + property variant colorWhite: rgba (255, 255, 255, 255) + + property variant colorWhite75: rgba (255, 255, 255, 191) + property variant colorWhite85: rgba (255, 255, 255, 217) + + // property variant colorWhite60: rgba (255, 255, 255, 153) // from 59 - 61% + property variant colorWhite50: rgba (255, 255, 255, 128) // from 49 - 51% + // property variant colorWhite47: rgba (255, 255, 255, 120) // from 46 - 48% + // property variant colorWhite44: rgba (255, 255, 255, 112) // from 43 - 45% + property variant colorWhite41: rgba (255, 255, 255, 105) // from 40 - 42% + // property variant colorWhite38: rgba (255, 255, 255, 97) // from 37 - 39% + property variant colorWhite35: rgba (255, 255, 255, 89) // from 33 - 36% + // property variant colorWhite31: rgba (255, 255, 255, 79) // from 30 - 32% + property variant colorWhite28: rgba (255, 255, 255, 71) // from 27 - 29% + property variant colorWhite25: rgba (255, 255, 255, 64) // from 24 - 26% + property variant colorWhite22: rgba (255, 255, 255, 56) // from 21 - 23% + property variant colorWhite19: rgba (255, 255, 255, 51) // from 18 - 20% + property variant colorWhite16: rgba (255, 255, 255, 41) // from 15 - 17% + property variant colorWhite12: rgba (255, 255, 255, 31) // from 11 - 13% + property variant colorWhite09: rgba (255, 255, 255, 23) // from 8 - 10% + // property variant colorWhite06: rgba (255, 255, 255, 15) // from 5 - 7% + // property variant colorWhite03: rgba (255, 255, 255, 8) // from 2 - 4% + + property variant colorGrey232: rgba (232, 232, 232, 255) + property variant colorGrey216: rgba (216, 216, 216, 255) + property variant colorGrey208: rgba (208, 208, 208, 255) + property variant colorGrey200: rgba (200, 200, 200, 255) + property variant colorGrey192: rgba (192, 192, 192, 255) + property variant colorGrey152: rgba (152, 152, 152, 255) + property variant colorGrey128: rgba (128, 128, 128, 255) + property variant colorGrey120: rgba (120, 120, 120, 255) + property variant colorGrey112: rgba (112, 112, 112, 255) + property variant colorGrey104: rgba (104, 104, 104, 255) + property variant colorGrey96: rgba (96, 96, 96, 255) + property variant colorGrey88: rgba (88, 88, 88, 255) + property variant colorGrey80: rgba (80, 80, 80, 255) + property variant colorGrey72: rgba (72, 72, 72, 255) + property variant colorGrey64: rgba (64, 64, 64, 255) + property variant colorGrey56: rgba (56, 56, 56, 255) + property variant colorGrey48: rgba (48, 48, 48, 255) + property variant colorGrey40: rgba (40, 40, 40, 255) + property variant colorGrey32: rgba (32, 32, 32, 255) + property variant colorGrey24: rgba (24, 24, 24, 255) + property variant colorGrey16: rgba (16, 16, 16, 255) + property variant colorGrey08: rgba (08, 08, 08, 255) + + property variant cueColors: [ + red, + darkOrange, + lightOrange, + colorWhite, + yellow, + lime, + green, + mint, + cyan, + turquoise, + blue, + plum, + violet, + purple, + magenta, + fuchsia, + warmYellow + ] + + property variant cueColorsDark: [ + Qt.darker(red, 0.15), + Qt.darker(darkOrange, 0.15), + Qt.darker(lightOrange, 0.15), + Qt.darker(colorWhite, 0.15), + Qt.darker(yellow, 0.15), + Qt.darker(lime, 0.15), + Qt.darker(green, 0.15), + Qt.darker(mint, 0.15), + Qt.darker(cyan, 0.15), + Qt.darker(turquoise, 0.15), + Qt.darker(blue, 0.15), + Qt.darker(plum, 0.15), + Qt.darker(violet, 0.15), + Qt.darker(purple, 0.15), + Qt.darker(magenta, 0.15), + Qt.darker(fuchsia, 0.15), + Qt.darker(warmYellow, 0.15) + ] + + property variant colorOrange: rgba(208, 104, 0, 255) // FX Selection; FX Faders etc + property variant colorOrangeDimmed: rgba(96, 48, 0, 255) + + property variant colorRed: rgba(255, 0, 0, 255) + property variant colorRed70: rgba(185, 6, 6, 255) + + // Playmarker + property variant colorRedPlaymarker: rgba(255, 0, 0, 255) + property variant colorRedPlaymarker75: rgba(255, 56, 26, 191) + property variant colorRedPlaymarker06: rgba(255, 56, 26, 31) + + // Playmarker + property variant colorBluePlaymarker: rgba(96, 184, 192, 255) //rgba(136, 224, 232, 255) + + property variant colorGreen: rgba(0, 255, 0, 255) + property variant colorGreen50: rgba(0, 255, 0, 128) + property variant colorGreen12: rgba(0, 255, 0, 31) // used for loop bg (in WaveformCues.qml) + property variant colorGreenLoopOverlay: rgba(96, 192, 128, 16) + property variant colorGreenMint: rgba(0, 219, 138, 255) + + property variant colorGreen08: rgba(0, 255, 0, 20) + property variant colorGreen50Full: rgba(0, 51, 0, 255) + + property variant colorGreenGreyMix: rgba(139, 240, 139, 82) + + // font colors + property variant colorFontsListBrowser: colorGrey72 + property variant colorFontsListFx: colorGrey56 + property variant colorFontBrowserHeader: colorGrey88 + property variant colorFontFxHeader: colorGrey80 // also for FX header, FX select buttons + + // headers & footers backgrounds + property variant colorBgEmpty: colorGrey16 // also for empty decks & Footer Small (used to be colorGrey08) + property variant colorBrowserHeader: colorGrey24 + property variant colorFxHeaderBg: colorGrey16 // also for large footer; fx overlay tabs + property variant colorFxHeaderLightBg: colorGrey24 + + property variant colorProgressBg: colorGrey32 + property variant colorProgressBgLight: colorGrey48 + property variant colorDivider: colorGrey40 + + property variant colorIndicatorBg: rgba(20, 20, 20, 255) + property variant colorIndicatorBg2: rgba(31, 31, 31, 255) + + property variant colorIndicatorLevelGrey: rgba(51, 51, 51, 255) + property variant colorIndicatorLevelOrange: rgba(247, 143, 30, 255) + + property variant colorCenterOverlayHeadline: colorGrey88 + +// blue + property variant colorDeckBlueBright: rgba(0, 136, 184, 255) + property variant colorDeckBlueDark: rgba(0, 64, 88, 255) + property variant colorDeckBlueBright20: rgba(0, 174, 239, 51) + property variant colorDeckBlueBright50Full: rgba(0, 87, 120, 255) + property variant colorDeckBlueBright12Full: rgba(0, 8, 10, 255) //rgba(0, 23, 31, 255) + property variant colorBrowserBlueBright: rgba(0, 187, 255, 255) + property variant colorBrowserBlueBright56Full:rgba(0, 114, 143, 255) + + property color footerBackgroundBlue: "#011f26" + + // fx Select overlay colors + property variant fxSelectHeaderTextRGB: rgba( 96, 96, 96, 255) + property variant fxSelectHeaderNormalRGB: rgba( 32, 32, 32, 255) + property variant fxSelectHeaderNormalBorderRGB: rgba( 32, 32, 32, 255) + property variant fxSelectHeaderHighlightRGB: rgba( 64, 64, 48, 255) + property variant fxSelectHeaderHighlightBorderRGB: rgba(128, 128, 48, 255) + + // 16 Colors Palette (Bright) + property variant color01Bright: rgba (255, 0, 0, 255) + property variant color02Bright: rgba (255, 16, 16, 255) + property variant color03Bright: rgba (255, 120, 0, 255) + property variant color04Bright: rgba (255, 184, 0, 255) + property variant color05Bright: rgba (255, 255, 0, 255) + property variant color06Bright: rgba (144, 255, 0, 255) + property variant color07Bright: rgba ( 40, 255, 40, 255) + property variant color08Bright: rgba ( 0, 208, 128, 255) + property variant color09Bright: rgba ( 0, 184, 232, 255) + property variant color10Bright: rgba ( 0, 120, 255, 255) + property variant color11Bright: rgba ( 0, 72, 255, 255) + property variant color12Bright: rgba (128, 0, 255, 255) + property variant color13Bright: rgba (160, 0, 200, 255) + property variant color14Bright: rgba (240, 0, 200, 255) + property variant color15Bright: rgba (255, 0, 120, 255) + property variant color16Bright: rgba (248, 8, 64, 255) + + // 16 Colors Palette (Mid) + property variant color01Mid: rgba (112, 8, 8, 255) + property variant color02Mid: rgba (112, 24, 8, 255) + property variant color03Mid: rgba (112, 56, 0, 255) + property variant color04Mid: rgba (112, 80, 0, 255) + property variant color05Mid: rgba (96, 96, 0, 255) + property variant color06Mid: rgba (56, 96, 0, 255) + property variant color07Mid: rgba (8, 96, 8, 255) + property variant color08Mid: rgba (0, 90, 60, 255) + property variant color09Mid: rgba (0, 77, 77, 255) + property variant color10Mid: rgba (0, 84, 108, 255) + property variant color11Mid: rgba (32, 56, 112, 255) + property variant color12Mid: rgba (72, 32, 120, 255) + property variant color13Mid: rgba (80, 24, 96, 255) + property variant color14Mid: rgba (111, 12, 149, 255) + property variant color15Mid: rgba (122, 0, 122, 255) + property variant color16Mid: rgba (130, 1, 43, 255) + + // 16 Colors Palette (Dark) + property variant color01Dark: rgba (16, 0, 0, 255) + property variant color02Dark: rgba (16, 8, 0, 255) + property variant color03Dark: rgba (16, 8, 0, 255) + property variant color04Dark: rgba (16, 16, 0, 255) + property variant color05Dark: rgba (16, 16, 0, 255) + property variant color06Dark: rgba (8, 16, 0, 255) + property variant color07Dark: rgba (8, 16, 8, 255) + property variant color08Dark: rgba (0, 16, 8, 255) + property variant color09Dark: rgba (0, 8, 16, 255) + property variant color10Dark: rgba (0, 8, 16, 255) + property variant color11Dark: rgba (0, 0, 16, 255) + property variant color12Dark: rgba (8, 0, 16, 255) + property variant color13Dark: rgba (8, 0, 16, 255) + property variant color14Dark: rgba (16, 0, 16, 255) + property variant color15Dark: rgba (16, 0, 8, 255) + property variant color16Dark: rgba (16, 0, 8, 255) + + //-------------------------------------------------------------------------------------------------------------------- + + // Browser + + //-------------------------------------------------------------------------------------------------------------------- + + property variant browser: + QtObject { + property color prelisten: rgba(223, 178, 30, 255) + property color prevPlayed: rgba(32, 32, 32, 255) + } + + //-------------------------------------------------------------------------------------------------------------------- + + // Hotcues + + //-------------------------------------------------------------------------------------------------------------------- + + property variant hotcue: + QtObject { + property color grid: colorWhite + property color hotcue: colorDeckBlueBright + property color fade: color03Bright + property color load: color05Bright + property color loop: color07Bright + property color temp: "grey" + } + + //-------------------------------------------------------------------------------------------------------------------- + + // Freeze & Slicer + + //-------------------------------------------------------------------------------------------------------------------- + + property variant freeze: + QtObject { + property color box_inactive: "#199be7ef" + property color box_active: "#ff9be7ef" + property color marker: "#4DFFFFFF" + property color slice_overlay: "white" // flashing rectangle + } + + property variant slicer: + QtObject { + property color box_active: rgba(20,195,13,255) + property color box_inrange: rgba(20,195,13,90) + property color box_inactive: rgba(20,195,13,25) + property color marker_default: rgba(20,195,13,77) + property color marker_beat: rgba(20,195,13,150) + property color marker_edge: box_active + } + + //-------------------------------------------------------------------------------------------------------------------- + + // Musical Key coloring for the browser + + //-------------------------------------------------------------------------------------------------------------------- + property variant color01MusicalKey: rgba (255, 0, 0, 255) // not yet in use + property variant color02MusicalKey: rgba (255, 64, 0, 255) + property variant color03MusicalKey: rgba (255, 120, 0, 255) // not yet in use + property variant color04MusicalKey: rgba (255, 200, 0, 255) + property variant color05MusicalKey: rgba (255, 255, 0, 255) + property variant color06MusicalKey: rgba (210, 255, 0, 255) // not yet in use + property variant color07MusicalKey: rgba ( 0, 255, 0, 255) + property variant color08MusicalKey: rgba ( 0, 255, 128, 255) + //property variant color09MusicalKey: rgba ( 0, 200, 232, 255) + property variant color09MusicalKey: colorDeckBlueBright // use the same color as for the browser selection + property variant color10MusicalKey: rgba ( 0, 100, 255, 255) + property variant color11MusicalKey: rgba ( 0, 40, 255, 255) + property variant color12MusicalKey: rgba (128, 0, 255, 255) + property variant color13MusicalKey: rgba (160, 0, 200, 255) // not yet in use + property variant color14MusicalKey: rgba (240, 0, 200, 255) + property variant color15MusicalKey: rgba (255, 0, 120, 255) // not yet in use + property variant color16MusicalKey: rgba (248, 8, 64, 255) + + property variant color01MusicalKey2: rgba (255, 0, 0, 120) // not yet in use + property variant color02MusicalKey2: rgba (255, 64, 0, 120) + property variant color03MusicalKey2: rgba (255, 120, 0, 120) // not yet in use + property variant color04MusicalKey2: rgba (255, 200, 0, 120) + property variant color05MusicalKey2: rgba (255, 255, 0, 120) + property variant color06MusicalKey2: rgba (210, 255, 0, 120) // not yet in use + property variant color07MusicalKey2: rgba ( 0, 255, 0, 120) + property variant color08MusicalKey2: rgba ( 0, 255, 128, 120) + //property variant color09MusicalKey2: rgba ( 0, 200, 232, 120) + property variant color09MusicalKey2: colorDeckBlueBright // use the same color as for the browser selection + property variant color10MusicalKey2: rgba ( 0, 100, 255, 120) + property variant color11MusicalKey2: rgba ( 0, 40, 255, 120) + property variant color12MusicalKey2: rgba (128, 0, 255, 120) + property variant color13MusicalKey2: rgba (160, 0, 200, 120) // not yet in use + property variant color14MusicalKey2: rgba (240, 0, 200, 120) + property variant color15MusicalKey2: rgba (255, 0, 120, 120) // not yet in use + property variant color16MusicalKey2: rgba (248, 8, 64, 120) + + // 16 Colors Palette (Bright) + property variant color01Bright2: rgba (255, 0, 0, 120) + property variant color02Bright2: rgba (255, 16, 16, 120) + property variant color03Bright2: rgba (255, 120, 0, 120) + property variant color04Bright2: rgba (255, 184, 0, 120) + property variant color05Bright2: rgba (255, 255, 0, 120) + property variant color06Bright2: rgba (144, 255, 0, 120) + property variant color07Bright2: rgba ( 40, 255, 40, 120) + property variant color08Bright2: rgba ( 0, 208, 128, 120) + property variant color09Bright2: rgba ( 0, 184, 232, 120) + property variant color10Bright2: rgba ( 0, 120, 255, 120) + property variant color11Bright2: rgba ( 0, 72, 255, 120) + property variant color12Bright2: rgba (128, 0, 255, 120) + property variant color13Bright2: rgba (160, 0, 200, 120) + property variant color14Bright2: rgba (240, 0, 200, 120) + property variant color15Bright2: rgba (255, 0, 120, 120) + property variant color16Bright2: rgba (248, 8, 64, 120) + + property variant musicalKeyColors: [ + 'grey', //0 No key + color15Bright, //1 -11 c + color06Bright, //2 -4 c#, db + color11MusicalKey, //3 -13 d + color03Bright, //4 -6 d#, eb + color09MusicalKey, //5 -16 e + color01Bright, //6 -9 f + color07MusicalKey, //7 -2 f#, gb + color13Bright, //8 -12 g + color04MusicalKey, //9 -5 g#, ab + color10MusicalKey, //10 -15 a + color02MusicalKey, //11 -7 a#, bb + color08MusicalKey, //12 -1 b + color03Bright, //13 -6 cm + color09MusicalKey, //14 -16 c#m, dbm + color01Bright, //15 -9 dm + color07MusicalKey, //16 -2 d#m, ebm + color13Bright, //17 -12 em + color04MusicalKey, //18 -5 fm + color10MusicalKey, //19 -15 f#m, gbm + color02MusicalKey, //20 -7 gm + color08MusicalKey, //21 -1 g#m, abm + color15Bright, //22 -11 am + color06Bright, //23 -4 a#m, bbm + color11MusicalKey //24 -13 bm + ] + + property variant musicalKeyColorsDark: [ + 'grey', //0 No key + Qt.darker(color15Bright, 5), //1 -11 c + Qt.darker(color06Bright, 5), //2 -4 c#, db + Qt.darker(color11MusicalKey, 5), //3 -13 d + Qt.darker(color03Bright, 5), //4 -6 d#, eb + Qt.darker(color09MusicalKey, 5), //5 -16 e + Qt.darker(color01Bright, 5), //6 -9 f + Qt.darker(color07MusicalKey, 5), //7 -2 f#, gb + Qt.darker(color13Bright, 5), //8 -12 g + Qt.darker(color04MusicalKey, 5), //9 -5 g#, ab + Qt.darker(color10MusicalKey, 5), //10 -15 a + Qt.darker(color02MusicalKey, 5), //11 -7 a#, bb + Qt.darker(color08MusicalKey, 5), //12 -1 b + Qt.darker(color03Bright, 5), //13 -6 cm + Qt.darker(color09MusicalKey, 5), //14 -16 c#m, dbm + Qt.darker(color01Bright, 5), //15 -9 dm + Qt.darker(color07MusicalKey, 5), //16 -2 d#m, ebm + Qt.darker(color13Bright, 5), //17 -12 em + Qt.darker(color04MusicalKey, 5), //18 -5 fm + Qt.darker(color10MusicalKey, 5), //19 -15 f#m, gbm + Qt.darker(color02MusicalKey, 5), //20 -7 gm + Qt.darker(color08MusicalKey, 5), //21 -1 g#m, abm + Qt.darker(color15Bright, 5), //22 -11 am + Qt.darker(color06Bright, 5), //23 -4 a#m, bbm + Qt.darker(color11MusicalKey, 5) //24 -13 bm + ] + + //-------------------------------------------------------------------------------------------------------------------- + + // Waveform coloring + + //-------------------------------------------------------------------------------------------------------------------- + + property color defaultBackground: "black" + property color defaultTextColor: "white" + property color loopActiveColor: rgba(0,255,70,255) + property color loopFlashColor: rgba ( 20, 235, 165, 120) + + property color loopActiveDimmedColor: rgba(0,255,70,190) + property color grayBackground: "#ff333333" + + property variant colorDeckBrightGrey: rgba (85, 85, 85, 255) + property variant colorDeckGrey: rgba (70, 70, 70, 255) + property variant colorDeckDarkGrey: rgba (40, 40, 40, 255) + + property variant colorDeckOrangeBright: rgba (253, 186, 16, 255) + + property variant colorQuantizeOn: rgba ( 20, 255, 255, 170) + property variant colorQuantizeOff: Qt.darker(colorQuantizeOn, 0.7) + + property color red: "#ff0000" + property color darkOrange: "#ff8c00" + property color lightOrange: "#fccf3e" + property color warmYellow: "#f9d71c" + property color yellow: "#ffff00" + property color lime: "#effd5f" + property color green: "#00FF00" + property color mint: "#98ff98" + property color cyan: "#00FFFF" + property color turquoise: "#40e0d0" + property color blue: "#0080FF" + property color plum: "#ff7eff" + property color violet: "#ee82ee" + property color purple: "#9f00c5" + property color magenta: "#ff6fff" + property color fuchsia: "#ff0080" + property color white: "#ff0080" + property color phaseColor: "#90550C" + + //-------------------------------------------------------------------------------------------------------------------- + + // Waveform coloring + + //-------------------------------------------------------------------------------------------------------------------- + + property variant low1: settings.low1 + property variant low2: settings.low2 + property variant mid1: settings.mid1 + property variant mid2: settings.mid2 + property variant high1: settings.high1 + property variant high2: settings.high2 + + function getWaveformColors(colorId) { + if (colorId <= 17) { + return waveformColorsMap[colorId]; + } + + return waveformColorsMap[0]; + } + + function palette(brightness, colorId) { + if ( brightness >= 0.666 && brightness <= 1.0 ) { // bright color + switch(colorId) { + case 0: return defaultBackground // default color for this palette! + case 1: return color01Bright + case 2: return color02Bright + case 3: return color03Bright + case 4: return color04Bright + case 5: return color05Bright + case 6: return color06Bright + case 7: return color07Bright + case 8: return color08Bright + case 9: return color09Bright + case 10: return color10Bright + case 11: return color11Bright + case 12: return color12Bright + case 13: return color13Bright + case 14: return color14Bright + case 15: return color15Bright + case 16: return color16Bright + case 17: return "grey" + case 18: return colorGrey232 + } + } else if ( brightness >= 0.333 && brightness < 0.666 ) { // mid color + switch(colorId) { + case 0: return defaultBackground // default color for this palette! + case 1: return color01Mid + case 2: return color02Mid + case 3: return color03Mid + case 4: return color04Mid + case 5: return color05Mid + case 6: return color06Mid + case 7: return color07Mid + case 8: return color08Mid + case 9: return color09Mid + case 10: return color10Mid + case 11: return color11Mid + case 12: return color12Mid + case 13: return color13Mid + case 14: return color14Mid + case 15: return color15Mid + case 16: return color16Mid + case 17: return "grey" + case 18: return colorGrey232 + } + } else if ( brightness >= 0 && brightness < 0.333 ) { // dimmed color + switch(colorId) { + case 0: return defaultBackground // default color for this palette! + case 1: return color01Dark + case 2: return color02Dark + case 3: return color03Dark + case 4: return color04Dark + case 5: return color05Dark + case 6: return color06Dark + case 7: return color07Dark + case 8: return color08Dark + case 9: return color09Dark + case 10: return color10Dark + case 11: return color11Dark + case 12: return color12Dark + case 13: return color13Dark + case 14: return color14Dark + case 15: return color15Dark + case 16: return color16Dark + case 17: return "grey" + case 18: return colorGrey232 + } + } else if ( brightness < 0) { // color Off + return defaultBackground; + } + return defaultBackground; // default color if no palette is set + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Durations.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Durations.qml new file mode 100755 index 000000000000..d91643a23e39 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Durations.qml @@ -0,0 +1,8 @@ +import QtQuick 2.15 + +QtObject { + readonly property int mainTransitionSpeed: 100 + readonly property int overlayTransition: 100 + readonly property int bottomInfoColor: 75 + readonly property int deckTransition: 90 +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Font.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Font.qml new file mode 100755 index 000000000000..833870d29e21 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Font.qml @@ -0,0 +1,17 @@ +import QtQuick 2.15 + +QtObject { + +// currently mapped to unity but you can use to bulk scale fonsize if needed + function scale(fontSize) { return fontSize; } + +// Font Size Variables + readonly property int miniFontSize: scale(10) + readonly property int smallFontSize: scale(12) + readonly property int middleFontSize: scale(15) + readonly property int largeFontSize: scale(18) + readonly property int largeValueFontSize: scale(21) + readonly property int moreLargeValueFontSize: scale(33) + readonly property int extraLargeValueFontSize: scale(45) + readonly property int superLargeValueFontSize: scale(55) +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Margins.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Margins.qml new file mode 100755 index 000000000000..6bedda675a5c --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Margins.qml @@ -0,0 +1,7 @@ +import QtQuick 2.15 + +QtObject { + +// Margin Variables + readonly property int topMarginCenterOverlayHeadline: 11 // 17 +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Settings.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Settings.qml new file mode 100755 index 000000000000..bd2dbc8e712f --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Settings.qml @@ -0,0 +1,296 @@ +import QtQuick 2.5 + +QtObject { + + // = comments + + ////////////////// + //EXTRA SETTINGS// + ////////////////// + + //show only decks A&B or C&D - SELECT ONLY ONE + readonly property color accentColor: engine.getSetting('accentColor') || 'green' + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////// + //PAD TYPE SELECTION SETTINGS// + /////////////////////////////// + + //Please only use the values in the line below. Using other values could have unexpected effects. + //0 = disabled, 4 = freeze, 5 = loop, 7 = roll, 8 = jump/move, 9 = fx1, 10 = fx2, 11 = tone + readonly property int recordButton: 8 + readonly property int samplesButton: 4 + readonly property int muteButton: 7 + readonly property int stemsButton: 5 + readonly property int cueButton: 11 + readonly property int fxLeftButton: 9 + readonly property int fxRightButton: 10 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////// + //BPM/TEMPO DISPLAY SETTINGS// + ////////////////////////////// + + //Change to true to always show tempo/bpm info + readonly property bool alwaysShowTempoInfo: engine.getSetting('alwaysShowTempoInfo') || false + + //amount of time the bpm overlay will stay on the screen in ms. 1000 = 1 second. + readonly property int bpmOverlayTimer: (engine.getSetting('bpmOverlayTimer') || 5.0) * 1000 + + //0 = Hidden, 1 = Master BPM, 2 = BPM, 3 = Tempo, 4 = BPM Offset, 5 = Tempo Offset, 6 = Master Deck Letter, 7 = Tempo Range, 8 = Key, 9 = Original BPM + readonly property int tempoDisplayLeft: parseInt(engine.getSetting('tempoDisplayLeft')) || 2 + readonly property int tempoDisplayCenter: parseInt(engine.getSetting('tempoDisplayCenter')) || 1 + readonly property int tempoDisplayRight: parseInt(engine.getSetting('tempoDisplayRight')) || 3 + readonly property int tempoDisplayLeftShift: parseInt(engine.getSetting('tempoDisplayLeftShift')) || 4 + readonly property int tempoDisplayCenterShift: parseInt(engine.getSetting('tempoDisplayCenterShift')) || 6 + readonly property int tempoDisplayRightShift: parseInt(engine.getSetting('tempoDisplayRightShift')) || 5 + + //set to true to enable the text Color to aid with your mixing. + readonly property bool enableBpmTextColor: engine.getSetting('enableBpmTextColor') || false + readonly property bool enableMasterBpmTextColor: engine.getSetting('enableMasterBpmTextColor') || false + readonly property bool enableTempoTextColor: engine.getSetting('enableTempoTextColor') || false + readonly property bool enableBpmOffsetTextColor: engine.getSetting('enableBpmOffsetTextColor') || false + readonly property bool enableTempoOffsetTextColor: engine.getSetting('enableTempoOffsetTextColor') || false + readonly property bool enableMasterDeckTextColor: engine.getSetting('enableMasterDeckTextColor') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////// + //WAVEFORM SETTINGS// + ///////////////////// + + //change to true to disable the moving waveforms + readonly property bool hideWaveforms: engine.getSetting('hideWaveforms') || false + + //Change to false to hide loop size indicator (after 10 seconds of loop inactivity) + readonly property bool alwaysShowLoopSize: engine.getSetting('alwaysShowLoopSize') || false + + //amount of time the loop overlay will stay on the screen in ms. 1000 = 1 second. + readonly property int loopOverlayTimer: (engine.getSetting('loopOverlayTimer') || 10) * 1000 + + //set to true to hide the beatgrid + readonly property bool hideBeatgrid: engine.getSetting('hideBeatgrid') || false + + //this value is the visibility of the beatgrid lines in %. Values are 0 to 100 + readonly property real beatgridVisibility: engine.getSetting('beatgridVisibility') || 0.75 + + //set to true to show time to next cue on waveform + readonly property bool showTimeToCue: engine.getSetting('showTimeToCue') || false + + //set to true to show beats to next cue on waveform + readonly property bool showBeatToCue: engine.getSetting('showBeatToCue') || false + + //set to true to show beats to next cue on waveform + readonly property int distanceToCueFontSize: engine.getSetting('distanceToCueFontSize') || 12 + + //set to true to show beats to next cue on waveform + readonly property string distanceToCueAlignment: engine.getSetting('distanceToCueAlignment') || "bottom" + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + //////////////////// + //BROWSER SETTINGS// + //////////////////// + + // NOTE the following setting are currently unused due to the lack of QML support for Mixxx library + + // //set to false to disable browser view and pads + // readonly property bool enableBrowserMode: engine.getSetting('enableBrowserMode') || true + + // //set to false to disable the adjacent key Coloring and return to all keys Colored + // readonly property bool adjacentKeys: engine.getSetting('adjacentKeys') || true + + // //change to true to enable camelot key + // readonly property bool camelotKey: engine.getSetting('camelotKey') || false + + // //set to true to disable the preview player toggle button and change it back to hold + // readonly property bool disablePreviewPlayerToggle: engine.getSetting('disablePreviewPlayerToggle') || false + + // //Set to false to disable browser on screen when pressing favorites button + // readonly property bool showBrowserOnFavourites: engine.getSetting('showBrowserOnFavourites') || true + + // //set to true to swap the functions of the view and add to prep buttons + // readonly property bool swapViewButtons: engine.getSetting('swapViewButtons') || false + + // //Set to false to disable browser on screen when open in full screen mode. + // //This will also revert the view and prep button functions back to default except opening the browser on the S4 instead of the laptop. + // readonly property bool showBrowserOnFullScreen: engine.getSetting('showBrowserOnFullScreen') || true + + // //set to true to disable the led output on the browser sort buttons + // readonly property bool disableSortButtonOutput: engine.getSetting('disableSortButtonOutput') || false + + // // 1 = "Sort By #", 2 = "Title", 3 = "Artist", 4 = "Time", 5 = "BPM", 6 = "Track #", 7 = "Release", 8 = "Label", 9 = "Genre", 10 = "Key Text", 11 = "Comment", 12 = "Lyrics", 13 = "Comment 2", 14 = "Path", 15 = "Analysed" + // // 16 = "Remixer", 17 = "Producer", 18 = "Mix", 19 = "CAT #", 20 = "Release Date", 21 = "Bitrate", 22 = "Rating", 23 = "Count", 24 = "Sort By #", 25 = "Cover Art", 26 = "Last Played", 27 = "Import Date", 28 = "Key", 29 = "Color" + // readonly property int hotcueButtonSort: parseInt(engine.getSetting('hotcueButtonSort')) || 2 + // readonly property int recordButtonSort: parseInt(engine.getSetting('recordButtonSort')) || 3 + // readonly property int samplesButtonSort: parseInt(engine.getSetting('samplesButtonSort')) || 5 + // readonly property int muteButtonSort: parseInt(engine.getSetting('muteButtonSort')) || 28 + // readonly property int stemsButtonSort: parseInt(engine.getSetting('stemsButtonSort')) || 22 + + // //Change this setting to true to change the browser encoder to a list scroll when holding shift. + // readonly property bool browserEncoderShiftScroll: engine.getSetting('browserEncoderShiftScroll') || false + + // //This is the size of the page scroll. + // readonly property int scrollPageSize: parseInt(engine.getSetting('scrollPageSize')) || 6 + + // //change to false to disable the browser view displaying artist data whilst holding shift + // readonly property bool browserShift: engine.getSetting('browserShift') || true + + // //only enable when both artist and title columns are shown + // readonly property bool swapArtistTitleColumns: engine.getSetting('swapArtistTitleColumns') || false + + // readonly property bool hideBPM: engine.getSetting('hideBPM') || false + // readonly property bool hideKey: engine.getSetting('hideKey') || false + // readonly property bool hideAlbumArt: engine.getSetting('hideAlbumArt') || false + // readonly property bool showArtistColumn: engine.getSetting('showArtistColumn') || false + // readonly property bool showTrackTitleColumn: engine.getSetting('showTrackTitleColumn') || true + // readonly property int browserFontSize: parseInt(engine.getSetting('browserFontSize')) || 15 + // readonly property bool raiseBrowserFooter: engine.getSetting('raiseBrowserFooter') || false + + // //change the values below to determine the bpm text Color in the browser + // //the number values represent the percentage difference of the master tempo and the selected song + // readonly property bool bpmBrowserTextColor: engine.getSetting('bpmBrowserTextColor') || true + // readonly property int browserBpmGreen: 3 + // readonly property int browserBpmRed: 12 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////// + //WAVEFORM OVERVIEW SETTINGS// + ////////////////////////////// + + //change to true to hide stripe + readonly property bool hideWaveformOverview: engine.getSetting('hideWaveformOverview') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////// + //TIME/BEATS BOX SETTINGS// + /////////////////////////// + + // 0 = Remaining Time, 1 = Elapsed Time, 2 = Time To Cue, 3 = Beats (0.0.0), 4 = Beats Alt (0.0), 5 = Beats To Cue (0.0.0), 6 = Beats To Cue Alt (0.0) + readonly property int timeBox: parseInt(engine.getSetting('timeBox')) || 0 + readonly property int timeBoxShift: parseInt(engine.getSetting('timeBoxShift')) || 1 + + //set to true to have the time text change to black when the box is red. + readonly property bool timeTextColorChange: engine.getSetting('timeTextColorChange') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////// + //PHASE & PHRASE METER SETTINGS// + ///////////////////////////////// + + //0 = Red, 1 = Dark Orange, 2 = Light Orange, 3 = Default, 4 = Yellow, 5 = Lime, 6 = Green, 7 = Mint, 8 = Cyan, 9 = Turquoise, 10 = Blue, 11 = Plum, 12 = Violet, 13 = Purple, 14 = Magenta, 15 = Fuchsia, 16 = White, 17 = Warm Yellow + readonly property int phaseAColor: parseInt(engine.getSetting('phaseAColor')) || 3 + readonly property int phaseBColor: parseInt(engine.getSetting('phaseBColor')) || 3 + readonly property int phaseCColor: parseInt(engine.getSetting('phaseCColor')) || 3 + readonly property int phaseDColor: parseInt(engine.getSetting('phaseDColor')) || 3 + + //change to true to hide the phase meter + readonly property bool hidePhase: engine.getSetting('hidePhase') || false + + //change to true to hide the phrase meter + readonly property bool hidePhrase: engine.getSetting('hidePhrase') || true + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////// + //GRID EDIT SETTINGS// + ////////////////////// + + //change to false to hide the bpm overlay when in grid adjust mode. + readonly property bool showBPMGridAdjust: engine.getSetting('showBPMGridAdjust') || true + readonly property int rateAdjustTimer: (engine.getSetting('rateAdjustTimer') || 2) * 1000 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////// + //HOTCUE SETTINGS// + /////////////////// + + //set to true to disable the hotcue overlay appearing + readonly property bool hideHotcueOverlay: engine.getSetting('hideHotcueOverlay') || false + + //0 = Red, 1 = Dark Orange, 2 = Light Orange, 3 = White, 4 = Yellow, 5 = Lime, 6 = Green, 7 = Mint, 8 = Cyan, 9 = Turquoise, 10 = Blue, 11 = Plum, 12 = Violet, 13 = Purple, 14 = Magenta, 15 = Fuchsia, 16 = Warm Yellow + //change these values to change default cue type Colors. + //This will change the cue markers and also the loop indicator. + readonly property int cueCueColor: parseInt(engine.getSetting('cueCueColor')) || 10 + readonly property int cueLoopColor: parseInt(engine.getSetting('cueLoopColor')) || 6 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + //////////////////// + //EFFECTS SETTINGS// + //////////////////// + + //change to false to disable FX overlays + readonly property bool fxOverlays: (engine.getSetting('fxOverlays') || 'both') !== 'off' + + //amount of time the fx overlay will stay on the screen in ms. 1000 = 1 second. + readonly property int fxOverlayTimer: (engine.getSetting('fxOverlayTimer') || 2) * 1000 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////// + //EFFECTS PAD 1 SETTINGS// + ////////////////////////// + + //set to true to disable the effects pads 1 overlay appearing + readonly property bool hideEffectsOverlay1: (engine.getSetting('fxOverlays') || 'both') === 'right' + + //The fx unit used by fx pads 1 + readonly property int fx1unit: 1 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////// + //EFFECTS PAD 2 SETTINGS// + ////////////////////////// + + //set to true to disable the effects pads 2 overlay appearing + readonly property bool hideEffectsOverlay2: (engine.getSetting('fxOverlays') || 'both') === 'left' + + //The fx unit used by fx pads 2 + readonly property int fx2unit: 2 + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////// + //TONE PAD SETTINGS// + ///////////////////// + + //set to true to disable the tone pads overlay appearing + readonly property bool hideToneOverlay: engine.getSetting('hideToneOverlay') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////// + //JUMP PAD SETTINGS// + ///////////////////// + + //set to true to disable the tone pads overlay appearing + readonly property bool hideJumpOverlay: engine.getSetting('hideJumpOverlay') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////// + //LOOP PAD SETTINGS// + ///////////////////// + + //set to true to disable the loop pads overlay appearing + readonly property bool hideLoopOverlay: engine.getSetting('hideLoopOverlay') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////// + //ROLL PAD SETTINGS// + ///////////////////// + + //set to true to disable the tone pads overlay appearing + readonly property bool hideRollOverlay: engine.getSetting('hideRollOverlay') || false + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Utils.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Utils.qml new file mode 100755 index 000000000000..b5f59ac7649a --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Defines/Utils.qml @@ -0,0 +1,126 @@ +import QtQuick 2.15 + +QtObject { + + function convertToTimeString(inSeconds) { + var neg = (inSeconds < 0); + var roundedSec = Math.floor(inSeconds); + + if (neg) { + roundedSec = -roundedSec; + } + + var sec = roundedSec % 60; + var min = (roundedSec - sec) / 60; + + var secStr = sec.toString(); + if (sec < 10) secStr = "0" + secStr; + + var minStr = min.toString(); + if (min < 10) minStr = "0" + minStr; + + return (neg ? "-" : "") + minStr + ":" + secStr; + } + + function computeRemainingTimeString(length, elapsed) { + return ((elapsed > length) ? convertToTimeString(0) : convertToTimeString( Math.floor(elapsed) - Math.floor(length))); + } + + function camelotConvert(keyToConvert) { + if (keyToConvert == "") return "-"; + + switch(keyToConvert) { + case "1d": return "8B"; + case "2d": return "9B"; + case "3d": return "10B"; + case "4d": return "11B"; + case "5d": return "12B"; + case "6d": return "1B"; + case "7d": return "2B"; + case "8d": return "3B"; + case "9d": return "4B"; + case "10d": return "5B"; + case "11d": return "6B"; + case "12d": return "7B"; + + case "1m": return "8A"; + case "2m": return "9A"; + case "3m": return "10A"; + case "4m": return "11A"; + case "5m": return "12A"; + case "6m": return "1A"; + case "7m": return "2A"; + case "8m": return "3A"; + case "9m": return "4A"; + case "10m": return "5A"; + case "11m": return "6A"; + case "12m": return "7A"; + + case "1D": return "8B"; + case "2D": return "9B"; + case "3D": return "10B"; + case "4D": return "11B"; + case "5D": return "12B"; + case "6D": return "1B"; + case "7D": return "2B"; + case "8D": return "3B"; + case "9D": return "4B"; + case "10D": return "5B"; + case "11D": return "6B"; + case "12D": return "7B"; + + case "1M": return "8A"; + case "2M": return "9A"; + case "3M": return "10A"; + case "4M": return "11A"; + case "5M": return "12A"; + case "6M": return "1A"; + case "7M": return "2A"; + case "8M": return "3A"; + case "9M": return "4A"; + case "10M": return "5A"; + case "11M": return "6A"; + case "12M": return "7A"; + + case "B": return "1B"; + case "F#": return "2B"; + case "C#": return "3B"; + case "G#": return "4B"; + case "D#": return "5B"; + case "A#": return "6B"; + case "F": return "7B"; + case "C": return "8B"; + case "G": return "9B"; + case "D": return "10B"; + case "A": return "11B"; + case "E": return "12B"; + + case "G#m": return "1A"; + case "D#m": return "2A"; + case "A#m": return "3A"; + case "Fm": return "4A"; + case "Cm": return "5A"; + case "Gm": return "6A"; + case "Dm": return "7A"; + case "Am": return "8A"; + case "Em": return "9A"; + case "Bm": return "10A"; + case "F#m": return "11A"; + case "C#m": return "12A"; + + case "G#M": return "1A"; + case "D#M": return "2A"; + case "A#M": return "3A"; + case "FM": return "4A"; + case "CM": return "5A"; + case "GM": return "6A"; + case "DM": return "7A"; + case "AM": return "8A"; + case "EM": return "9A"; + case "BM": return "10A"; + case "F#M": return "11A"; + case "C#M": return "12A"; + } + return "ERR"; + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfo.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfo.qml new file mode 100755 index 000000000000..0104aca56629 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfo.qml @@ -0,0 +1,193 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: bottomLabels + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (240 - height) + property int deckId: 1 + property int hotcue: 0 + property int type: 0 + property string name: "" + readonly property color barBgColor: "black" + property int bank: 1 + + // AppProperty { id: type; path: "app.traktor.fx." + bank + ".type"} + QtObject { + id: type2 + property string description: "Description" + property var value: 0 + } + + // AppProperty { id: routing; path: "app.traktor.fx." + bank + ".routing"} + QtObject { + id: routing + property string description: "Description" + property var value: 0 + } + property string routingText: routing.value == 0 ? "Send" : routing.value == 1 ? "Insert" : routing.value == 2 ? "Post" : "ERROR" + + // AppProperty { id: fxSelect1; path: "app.traktor.fx." + bank + ".select.1"} + QtObject { + id: fxSelect1 + property string description: "Description" + property var value: 0 + } + // AppProperty { id: fxSelect2; path: "app.traktor.fx." + bank + ".select.2"} + QtObject { + id: fxSelect2 + property string description: "Description" + property var value: 0 + } + // AppProperty { id: fxSelect3; path: "app.traktor.fx." + bank + ".select.3"} + QtObject { + id: fxSelect3 + property string description: "Description" + property var value: 0 + } + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + + height: type2.value == 2 ? 25 : 50 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: bottomLabels.height + color: colors.colorFxHeaderBg + } + + // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:63; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 25 + anchors.left: parent.left + anchors.leftMargin: 320/3 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 25 + anchors.left: parent.left + anchors.leftMargin: (320/3) * 2 + height: 63 + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Row { + BankInfoDetails { + id: bottomInfoDetails1 + finalLabel: (type2.value == 2 ? "Pattern Player " : "FX Bank ") + bank + " - " + routingText + hideValue: true + hideTitle: false + width: 240 + } + } + + Row { + BankInfoDetails { + id: bottomInfoDetails2 + finalValue: fxSelect1.description + hideValue: (type2.value == 2 ? true : false) + hideTitle: true + width: 320/3 + } + + BankInfoDetails { + id: bottomInfoDetails3 + finalValue: fxSelect2.description + hideValue: (type2.value != 0) ? true : false + hideTitle: true + width: 320/3 + } + + BankInfoDetails { + id: bottomInfoDetails4 + finalValue: fxSelect3.description + hideValue: (type2.value != 0) ? true : false + hideTitle: true + width: 320/3 + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: bottomLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: bottomLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: bottomLabels; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfoDetails.qml new file mode 100755 index 000000000000..026bca41f4f3 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/BankInfoDetails.qml @@ -0,0 +1,77 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + Defines.Settings {id: settings} + + property var parameter: ({description:"Description",value: 0, valueRange: {isDiscrete: true, steps: 1}}) // set from outside + property bool isOn: false + property string label: "DRUMLOOP" + property string buttonLabel: "HP ON" + + property bool hideValue: false + property bool hideTitle: false + property bool fxEnabled: false + + property bool indicatorEnabled: fxEnabled && label.length > 0 + property string finalValue: "" + property string finalLabel: "" + + function toInt_round(val) { return parseInt(val+0.5); } + + property alias textColor: colors.colorFontFxHeader + + readonly property int macroEffectChar: 0x00B6 + readonly property bool isMacroFx: (finalLabel.charCodeAt(0) == macroEffectChar) + + width: 0 + height: 25 + + Defines.Colors { id: colors } + + // Level indicator for knobs + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 25 + width: parent.width + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: finalLabel + visible: !hideTitle + color: settings.accentColor + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + + // value + Text { + id: fxInfoValueLarge + width: 320/3 + text: finalValue + font.family: "Pragmatica" // is monospaced + color: colors.colorWhite + visible: !hideValue + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 4 + font.pixelSize: 15 + anchors.topMargin: 25 + elide: Text.ElideRight + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfo.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfo.qml new file mode 100755 index 000000000000..dbc47d841456 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfo.qml @@ -0,0 +1,152 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: bottomLabels + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (195 - bottomMargin) + property int hotcue: 0 + property int type: 0 + property string name: "" + readonly property color barBgColor: "black" + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + + height: 40 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: bottomLabels.height + color: colors.colorFxHeaderBg + // light grey background + Rectangle { + id:bottomInfoDetailsPanelLightBg + anchors { + top: parent.top + left: parent.left + } + height: bottomLabels.height + width: 18 + color: colors.colorFxHeaderLightBg + } + } + +// // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:63; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 18 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 240 + height: 63 + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Row { + CueInfoDetails { + id: bottomInfoDetails1 + finalValue: hotcue + finalLabel: "#" + width: 18 + } + + CueInfoDetails { + id: bottomInfoDetails2 + finalValue: name + finalLabel: "NAME" + width: 222 + } + + CueInfoDetails { + id: bottomInfoDetails3 + finalValue: (type == 0 ? "Cue" : type == 1 ? "Fade-In" : type == 2 ? "Fade-Out" : type == 3 ? "Load" : type == 4 ? "Grid" : type == 5 ? "Loop" : "-") + finalLabel: "TYPE" + width: 50 + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: bottomLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: bottomLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: bottomLabels; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfoDetails.qml new file mode 100755 index 000000000000..5f0d2b102835 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/CueInfoDetails.qml @@ -0,0 +1,73 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + Defines.Settings {id: settings} + + property var parameter: ({description:"Description",value: 0, valueRange: {isDiscrete: true, steps: 1}}) // set from outside + property bool isOn: false + property string label: "DRUMLOOP" + property string buttonLabel: "HP ON" + + property bool hideValue: true + property bool fxEnabled: false + + property bool indicatorEnabled: fxEnabled && label.length > 0 + property string finalValue: "" + property string finalLabel: "" + + function toInt_round(val) { return parseInt(val+0.5); } + + property alias textColor: colors.colorFontFxHeader + + readonly property int macroEffectChar: 0x00B6 + readonly property bool isMacroFx: (finalLabel.charCodeAt(0) == macroEffectChar) + + width: 0 + height: 45 + + Defines.Colors { id: colors } + + // Level indicator for knobs + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 45 + width: parent.width + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: finalLabel + color: settings.accentColor + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + + // value + Text { + id: fxInfoValueLarge + text: finalValue + font.family: "Pragmatica" // is monospaced + color: colors.colorWhite + visible: true + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 4 + font.pixelSize: 15 + anchors.topMargin: 22 + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/FXInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/FXInfoDetails.qml new file mode 100755 index 000000000000..70b52426b30d --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/FXInfoDetails.qml @@ -0,0 +1,66 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + property var parameter: ({description:"Description",value: 0, valueRange: {isDiscrete: true, steps: 1}}) // set from outside + property string label: "DRUMLOOP" + + property alias textColor: colors.colorFontFxHeader + property bool header: false + property int effectID: 0 + property int fxUnit: 1 + + // AppProperty {id: slot1; path: "app.traktor.fx." + fxUnit + ".select.1"} + QtObject { + id: slot1 + property string description: "Description" + property var value: 0 + } + // AppProperty {id: slot2; path: "app.traktor.fx." + fxUnit + ".select.2"} + QtObject { + id: slot2 + property string description: "Description" + property var value: 0 + } + // AppProperty {id: slot3; path: "app.traktor.fx." + fxUnit + ".select.3"} + QtObject { + id: slot3 + property string description: "Description" + property var value: 0 + } + + width: 0 + height: 20 + + Defines.Colors { id: colors } + Defines.Settings {id: settings} + + // Level indicator for knobs + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 20 + width: parent.width + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: label + color: header ? settings.accentColor : (slot1.value == effectID || slot2.value == effectID || slot3.value == effectID ? "lime" : "white") + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridControls.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridControls.qml new file mode 100755 index 000000000000..0da2209b2edf --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridControls.qml @@ -0,0 +1,209 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +import Mixxx 1.0 as Mixxx + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: bottomLabels + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (180 - bottomMargin) + property int deckId: 1 + + // AppProperty { id: waveZoomProp; path: "app.traktor.decks." + deckId + ".track.waveform_zoom" } + Mixxx.ControlProxy { + group: `[Channel${deckId}]` + key: "waveform_zoom" + id: waveZoomProp + } + // AppProperty { id: tick; path: "app.traktor.decks." + deckId + ".track.grid.enable_tick" } + QtObject { + id: tick + property string description: "Description" + property var value: 0 + } + Mixxx.ControlProxy { + group: `[Channel${deckId}]` + id: range + key: "rateRange" + property string description: "Description" + property var valueRange: ({isDiscrete: false, steps: 1}) + } + + readonly property color barBgColor: "black" + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + + height: 60 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: bottomLabels.height + color: colors.colorFxHeaderBg + // light grey background + Rectangle { + id:bottomInfoDetailsPanelLightBg + anchors { + top: parent.top + left: parent.left + } + height: bottomLabels.height + width: 80 + color: colors.colorFxHeaderLightBg + } + } + +// // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:63; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 160 + height: 63 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 240 + height: 63 + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Row { + GridInfoDetails { + id: bottomInfoDetails1 + parameter: waveZoomProp + label: "ZOOM" + fxEnabled: true + barBgColor: bottomLabels.barBgColor + hideButton: true + zoom: true + hideValue: false + } + + GridInfoDetails { + id: bottomInfoDetails2 + parameter: tick + label: "TICK" + fxEnabled: false + isOn: tick.value + barBgColor: bottomLabels.barBgColor + hideButton: true + zoom: true + hideValue: true + } + + GridInfoDetails { + id: bottomInfoDetails3 + parameter: tick + label: "TICK" + fxEnabled: false + isOn: tick.value + barBgColor: bottomLabels.barBgColor + hideButton: true + zoom: true + hideValue: true + } + + GridInfoDetails { + id: bottomInfoDetails4 + parameter: range + label: "RANGE" + fxEnabled: true + barBgColor: bottomLabels.barBgColor + hideButton: true + zoom: false + hideValue: false + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: bottomLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: bottomLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: bottomLabels; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridInfoDetails.qml new file mode 100755 index 000000000000..4d54ee03c285 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/GridInfoDetails.qml @@ -0,0 +1,160 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + Defines.Settings {id: settings} + + property var parameter: ({description:"Description",value: 0}) // set from outside + property bool isOn: false + property string label: "DRUMLOOP" + property string sizeState: "small" + property string buttonLabel: "HP ON" + property bool fxEnabled: false + property bool zoom: true + property bool hideButton: true + property bool hideValue: true + + property bool indicatorEnabled: fxEnabled && label.length > 0 + property string finalValue: zoom ? (((10 - parameter.value) / 9)*100).toFixed(2)+"%" : toInt_round(parameter.value*100).toString() + "%" + property string finalLabel: fxEnabled ? label : "" + property string finalButtonLabel: "ON" + property color barBgColor // set from outside + + function toInt_round(val) { return parseInt(val+0.5); } + + property alias textColor: colors.colorFontFxHeader + + readonly property int macroEffectChar: 0x00B6 + readonly property bool isMacroFx: (finalLabel.charCodeAt(0) == macroEffectChar) + + readonly property var valueRange: parameter.valueRange || {} + + width: 80 + height: 45 + + Defines.Colors { id: colors } + + // Level indicator for knobs + Widgets.ProgressBar { + id: slider + progressBarHeight: (sizeState == "small") ? 6 : 9 + progressBarWidth: 76 + anchors.left: parent.left + anchors.top: parent.top + anchors.topMargin: 3 + anchors.leftMargin: 2 + + value: label == "ZOOM" ? (10 - parameter.value) / 9 : parameter.value + visible: !(valueRange.isDiscrete && fxEnabled) + + drawAsEnabled: indicatorEnabled + + progressBarBackgroundColor: parent.barBgColor + } + + // stepped progress bar + Widgets.StateBar { + id: slider2 + height: (sizeState == "small") ? 6 : 9 + width: 76 + anchors.left: parent.left + anchors.top: parent.top + anchors.leftMargin: 2 + anchors.topMargin: 3 + + stateCount: valueRange.steps || 0 + currentState: (valueRange.steps - 1.0 + 0.2) * parameter.value // +.2 to make sure we round in the right direction + visible: !slider.visible + barBgColor: parent.barBgColor + } + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 100 + width: parent.width + + Rectangle { + id: macroIconDetails + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 4 + anchors.topMargin: 50 + + width: 12 + height: 11 + radius: 1 + visible: isMacroFx + color: colors.colorGrey216 + + Text { + anchors.fill: parent + anchors.topMargin: -1 + anchors.leftMargin: 1 + text: "M" + font.pixelSize: fonts.miniFontSize + color: colors.colorBlack + } + } + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: finalLabel + color: settings.accentColor + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 40 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: isMacroFx ? 26 : 4 + anchors.rightMargin: 12 + elide: Text.ElideRight + } + + // value + Text { + id: fxInfoValueLarge + text: finalValue + font.family: "Pragmatica" // is monospaced + color: colors.colorWhite + visible: (label.length > 0) && !hideValue + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 4 + font.pixelSize: 15 + anchors.topMargin: 22 + } + + // button + Rectangle { + id: fxInfoFilterButton + width: 30 + + color: ( fxEnabled ? (isOn ? colors.colorIndicatorLevelOrange : colors.colorBlack) : "transparent" ) + visible: (buttonLabel.length > 0) && !hideButton + radius: 1 + anchors.right: parent.right + anchors.rightMargin: 2 + anchors.top: parent.top + height: 15 + anchors.topMargin: 24 + + Text { + id: fxInfoFilterButtonText + font.capitalization: Font.AllUppercase + text: finalButtonLabel + color: ( fxEnabled ? (isOn ? colors.colorBlack : colors.colorGrey128) : colors.colorGrey128 ) + font.pixelSize: fonts.miniFontSize + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpControls.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpControls.qml new file mode 100755 index 000000000000..57c4e97d8adb --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpControls.qml @@ -0,0 +1,239 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Widgets' as Widgets +import '../Defines' as Defines + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: fxLabels + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (240 - height) + property string name: "" + readonly property color barBgColor: "black" + + required property var deckInfo + readonly property bool shift: deckInfo.shift + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + Defines.Settings { id: settings } + + height: 65 + anchors.left: parent.left + anchors.right: parent.right + + Mixxx.ControlProxy { + id: beatjump + group: deckInfo.group + key: "beatjump_size" + } + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: fxLabels.height + color: colors.colorFxHeaderBg + } + + // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:80; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 160 + height: 80 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 240 + height: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider3 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + } + + // dividers + Rectangle { + id: fxInfoDivider4 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 40 + anchors.left: parent.left + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Column { + Row { + JumpInfoDetails { + id: header + label: "MOVE/BEATJUMP" + width: 200 + header: true + } + } + + Row { + JumpInfoDetails { + id: bottomInfoDetails1 + label: deckInfo.jumpSizePad1 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad1, shift) + back: shift + width: 80 + } + JumpInfoDetails { + id: bottomInfoDetails2 + label: deckInfo.jumpSizePad2 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad2, shift) + back: shift + width: 80 + } + JumpInfoDetails { + id: bottomInfoDetails3 + label: deckInfo.jumpSizePad3 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad3, shift) + back: shift + width: 80 + } + JumpInfoDetails { + id: bottomInfoDetails4 + label: deckInfo.jumpSizePad4 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad4, shift) + back: shift + width: 80 + } + } + + Row { + JumpInfoDetails { + id: bottomInfoDetails5 + label: deckInfo.jumpSizePad5 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad5, shift) + back: shift + width: 80 + } + JumpInfoDetails { + id: bottomInfoDetails6 + label: deckInfo.jumpSizePad6 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad6, shift) + back: shift + width: 80 + } + JumpInfoDetails { + id: bottomInfoDetails7 + label: deckInfo.jumpSizePad7 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad7, shift) + back: shift + width: 80 + } + JumpInfoDetails { + id: bottomInfoDetails8 + label: deckInfo.jumpSizePad8 === "??" ? (shift ? "- " : " ") + (beatjump.value < 1 ? `1 / ${1/beatjump.value}` : `${beatjump.value}`) : getValue(deckInfo.jumpSizePad8, shift) + back: shift + width: 80 + } + } + } + } + + function getValue(size, shift) { + if (parseFloat(size)) { + return (shift ? "- " : " ") + (size < 1 ? `1 / ${1/size}` : `${size}`) + } else if (size === "??") { + return null; + } else { + return size + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: fxLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: fxLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: fxLabels; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpInfoDetails.qml new file mode 100755 index 000000000000..6b220097ade5 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/JumpInfoDetails.qml @@ -0,0 +1,45 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + Defines.Settings {id: settings} + + property string label: "DRUMLOOP" + property bool back: false + property bool header: false + + width: 0 + height: 20 + + Defines.Colors { id: colors } + + // Level indicator for knobs + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 20 + width: parent.width + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: label + color: header ? settings.accentColor : (label == "n/a" || label == "" ? "white" : back == true ? "red" : "lime") + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 0 + font.pixelSize: fonts.scale(18) + anchors.leftMargin: 4 + elide: Text.ElideRight + horizontalAlignment: header ? Text.AlignLeft : Text.AlignHCenter + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopControls.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopControls.qml new file mode 100755 index 000000000000..ea9f5c29fe72 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopControls.qml @@ -0,0 +1,230 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines +import '../ViewModels' as ViewModels + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: view + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (240 - height) + property string name: "" + readonly property color barBgColor: "black" + property int deckId: 1 + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + Defines.Settings { id: settings } + + required property var deckInfo + + height: 65 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: view.height + color: colors.colorFxHeaderBg + } + + // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:80; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 160 + height: 80 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 240 + height: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider3 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + } + + // dividers + Rectangle { + id: fxInfoDivider4 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 40 + anchors.left: parent.left + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Column { + Row { + LoopInfoDetails { + id: header + label: "LOOP" + width: 200 + header: true + } + } + + Row { + LoopInfoDetails { + id: bottomInfoDetails1 + label: deckInfo.loopSizePad1 + label2: deckInfo.loopSizePad1 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails2 + label: deckInfo.loopSizePad2 + label2: deckInfo.loopSizePad2 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails3 + label: deckInfo.loopSizePad3 + label2: deckInfo.loopSizePad3 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails4 + label: deckInfo.loopSizePad4 + label2: deckInfo.loopSizePad4 + deckId: deckId + width: 80 + } + } + + Row { + LoopInfoDetails { + id: bottomInfoDetails5 + label: deckInfo.loopSizePad5 + label2: deckInfo.loopSizePad5 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails6 + label: deckInfo.loopSizePad6 + label2: deckInfo.loopSizePad6 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails7 + label: deckInfo.loopSizePad7 + label2: deckInfo.loopSizePad7 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails8 + label: deckInfo.loopSizePad8 + label2: deckInfo.loopSizePad8 + deckId: deckId + width: 80 + } + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: view.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: view; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: view; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopInfoDetails.qml new file mode 100755 index 000000000000..12ab2ff7c036 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/LoopInfoDetails.qml @@ -0,0 +1,57 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + property string label: "" + property string label2: "" + property bool header: false + property int deckId: 1 + + // AppProperty { id: enabled; path: "app.traktor.decks." + deckId + ".loop.is_in_active_loop" } + QtObject { + id: enabled + property string description: "Description" + property var value: 0 + } + // AppProperty { id: size; path: "app.traktor.decks." + deckId + ".loop.size" } + QtObject { + id: size + property string description: "Description" + property var value: 0 + } + + width: 0 + height: 20 + + Defines.Colors { id: colors } + + // Level indicator for knobs + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 20 + width: parent.width + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: header ? label : label2 + color: header ? settings.accentColor : (enabled.value && (size.value == label) ? "lime" : "white") + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 0 + font.pixelSize: fonts.scale(18) + anchors.leftMargin: 4 + elide: Text.ElideRight + horizontalAlignment: header ? Text.AlignLeft : Text.AlignHCenter + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/QuickFXSelector.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/QuickFXSelector.qml new file mode 100755 index 000000000000..930ce608e7ce --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/QuickFXSelector.qml @@ -0,0 +1,151 @@ +import QtQuick 2.15 + +import '../Defines' as Defines +import '../Widgets' as Widgets + +import Mixxx 1.0 as Mixxx + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: topLabels + + required property var deckInfo + + property int topMargin: 0 + + property int yPositionWhenHidden: -25 + property int yPositionWhenShown: topMargin + + readonly property color barBgColor: "black" + + property var fxModel: Mixxx.EffectsManager.quickChainPresetModel + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + Defines.Settings {id: settings} + + height: 25 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: topInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: topLabels.height + color: colors.colorFxHeaderBg + // light grey background + // Rectangle { + // id:topInfoDetailsPanelLightBg + // anchors { + // top: parent.top + // left: parent.left + // } + // height: topLabels.height + // width: 240 + // color: colors.colorFxHeaderLightBg + // } + } + + // Info Details + Rectangle { + id: topInfoDetailsPanel + + height: parent.height + // clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + // Row { + // id: controlRow + + // Item { + // id: quickFxDetailsPanel + + // height: display.height + // width: 260 + + // name + Text { + id: stemInfoName + font.capitalization: Font.AllUppercase + text: "SELECTED QUICK FX" + color: settings.accentColor + + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 10 + + font.pixelSize: fonts.scale(13.5) + elide: Text.ElideRight + } + + // value + Text { + id: nameValue + font.capitalization: Font.AllUppercase + text: fxModel.get(deckInfo.quickFXSelected).display || "---" + color: colors.colorWhite + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 10 + + font.pixelSize: fonts.scale(13.5) + elide: Text.ElideRight + } + // } + // } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: topLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + state: deckInfo.quickFXSelected != null ? "show" : "hide" + states: [ + State { + name: "show"; + PropertyChanges { target: topLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: topLabels; y: -height} + } + ] +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/RollControls.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/RollControls.qml new file mode 100755 index 000000000000..0b85f5b4e983 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/RollControls.qml @@ -0,0 +1,230 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines +import '../ViewModels' as ViewModels + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: view + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (240 - height) + property string name: "" + readonly property color barBgColor: "black" + property int deckId: 1 + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + Defines.Settings { id: settings } + + required property var deckInfo + + height: 65 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: view.height + color: colors.colorFxHeaderBg + } + + // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:80; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 160 + height: 80 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 240 + height: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider3 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + } + + // dividers + Rectangle { + id: fxInfoDivider4 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 40 + anchors.left: parent.left + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Column { + Row { + LoopInfoDetails { + id: header + label: "ROLL" + width: 200 + header: true + } + } + + Row { + LoopInfoDetails { + id: bottomInfoDetails1 + label: deckInfo.rollSizePad1 + label2: deckInfo.rollSizePad1 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails2 + label: deckInfo.rollSizePad2 + label2: deckInfo.rollSizePad2 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails3 + label: deckInfo.rollSizePad3 + label2: deckInfo.rollSizePad3 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails4 + label: deckInfo.rollSizePad4 + label2: deckInfo.rollSizePad4 + deckId: deckId + width: 80 + } + } + + Row { + LoopInfoDetails { + id: bottomInfoDetails5 + label: deckInfo.rollSizePad5 + label2: deckInfo.rollSizePad5 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails6 + label: deckInfo.rollSizePad6 + label2: deckInfo.rollSizePad6 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails7 + label: deckInfo.rollSizePad7 + label2: deckInfo.rollSizePad7 + deckId: deckId + width: 80 + } + LoopInfoDetails { + id: bottomInfoDetails8 + label: deckInfo.rollSizePad8 + label2: deckInfo.rollSizePad8 + deckId: deckId + width: 80 + } + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: view.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: view; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: view; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneControls.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneControls.qml new file mode 100755 index 000000000000..0ecebfade340 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneControls.qml @@ -0,0 +1,247 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +//-------------------------------------------------------------------------------------------------------------------- +// FX CONTROLS +//-------------------------------------------------------------------------------------------------------------------- + +// The FxControls are located on the top of the screen and blend in if one of the top knobs is touched/changed + +Item { + id: fxLabels + + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (240 - height) + property string name: "" + readonly property color barBgColor: "black" + property int deckId: 1 + property real adjustVal: 0.00 + property string adjust: adjustVal.toFixed(0) + + Timer { + id: toneTimer + property bool blink: false + + interval: 250 + repeat: true + running: adjust != 0 + + onTriggered: { + blink = !blink; + } + + onRunningChanged: { + blink = running; + } + } + + Defines.Colors { id: colors } + Defines.Durations { id: durations } + Defines.Settings { id: settings } + + // MappingProperty { id: forward; path: "mapping.state." + deckId + ".forward"} + QtObject { + id: forward + property string description: "Description" + property var value: 0 + } + + property bool forwardVal: forward.value + + height: 65 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: fxLabels.height + color: colors.colorFxHeaderBg + } + + // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:80; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider1 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 160 + height: 80 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + anchors.leftMargin: 240 + height: 80 + } + + // dividers + Rectangle { + id: fxInfoDivider3 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 20 + anchors.left: parent.left + } + + // dividers + Rectangle { + id: fxInfoDivider4 + width:360; + height:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.topMargin: 40 + anchors.left: parent.left + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Column { + Row { + ToneInfoDetails { + id: header + label: "TONE" + width: 200 + header: true + } + } + + Row { + ToneInfoDetails { + id: bottomInfoDetails1 + label: "0" + color: adjust != 0 ? "grey" : "white" + width: 80 + } + ToneInfoDetails { + id: bottomInfoDetails2 + label: forwardVal ? "+1" : "-1" + color: forwardVal ? ((adjust == 1) && toneTimer.blink ? "white" : "lime") : ((adjust == -1) && toneTimer.blink ? "white" : "red") + width: 80 + } + ToneInfoDetails { + id: bottomInfoDetails3 + label: forwardVal ? "+2" : "-2" + color: forwardVal ? ((adjust == 2) && toneTimer.blink ? "white" : "lime") : ((adjust == -2) && toneTimer.blink ? "white" : "red") + width: 80 + } + ToneInfoDetails { + id: bottomInfoDetails4 + label: forwardVal ? "+3" : "-3" + color: forwardVal ? ((adjust == 3) && toneTimer.blink ? "white" : "lime") : ((adjust == -3) && toneTimer.blink ? "white" : "red") + width: 80 + } + } + + Row { + ToneInfoDetails { + id: bottomInfoDetails5 + label: forwardVal ? "+4" : "-4" + color: forwardVal ? ((adjust == 4) && toneTimer.blink ? "white" : "lime") : ((adjust == -4) && toneTimer.blink ? "white" : "red") + width: 80 + } + ToneInfoDetails { + id: bottomInfoDetails6 + label: forwardVal ? "+5" : "-5" + color: forwardVal ? ((adjust == 5) && toneTimer.blink ? "white" : "lime") : ((adjust == -5) && toneTimer.blink ? "white" : "red") + width: 80 + } + ToneInfoDetails { + id: bottomInfoDetails7 + label: forwardVal ? "+6" : "-6" + color: forwardVal ? ((adjust == 6) && toneTimer.blink ? "white" : "lime") : ((adjust == -6) && toneTimer.blink ? "white" : "red") + width: 80 + } + ToneInfoDetails { + id: bottomInfoDetails8 + label: forwardVal ? "+7" : "-7" + color: forwardVal ? ((adjust == 7) && toneTimer.blink ? "white" : "lime") : ((adjust == -7) && toneTimer.blink ? "white" : "red") + width: 80 + } + } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: fxLabels.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.overlayTransition; easing.type: Easing.InOutQuad } } + + Item { + id: showHide + state: showHideState + states: [ + State { + name: "show"; + PropertyChanges { target: fxLabels; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: fxLabels; y: yPositionWhenHidden} + } + ] + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneInfoDetails.qml new file mode 100755 index 000000000000..0e39735a4f92 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/ToneInfoDetails.qml @@ -0,0 +1,44 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + property string label: "" + property bool header: false + property string color: "white" + + width: 0 + height: 20 + + Defines.Colors { id: colors } + Defines.Settings {id: settings} + + // Level indicator for knobs + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 20 + width: parent.width + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: label + color: header ? settings.accentColor : fxInfoDetails.color + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 0 + font.pixelSize: fonts.scale(18) + anchors.leftMargin: 4 + elide: Text.ElideRight + horizontalAlignment: header ? Text.AlignLeft : Text.AlignHCenter + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopInfoDetails.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopInfoDetails.qml new file mode 100755 index 000000000000..92ea2991b01a --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Overlays/TopInfoDetails.qml @@ -0,0 +1,152 @@ +import QtQuick 2.15 + +import '../Widgets' as Widgets +import '../Defines' as Defines + +Item { + id: fxInfoDetails + + property var parameter: ({}) // set from outside + property bool isOn: false + property string label: "DRUMLOOP" + property string sizeState: "small" + property string buttonLabel: "HP ON" + property bool fxEnabled: false + property bool indicatorEnabled: fxEnabled && label.length > 0 + property string finalValue: fxEnabled ? parameter.description : "" + property string finalLabel: fxEnabled ? label : "" + property string finalButtonLabel: fxEnabled ? buttonLabel : "" + property color barBgColor // set from outside + property bool isPatternPlayer: false + + property alias textColor: colors.colorFontFxHeader + + readonly property int macroEffectChar: 0x00B6 + readonly property bool isMacroFx: (finalLabel.charCodeAt(0) == macroEffectChar) + + width: 80 + height: 45 + + Defines.Colors { id: colors } + Defines.Settings {id: settings} + + // Level indicator for knobs + Widgets.ProgressBar { + id: slider + progressBarHeight: (sizeState == "small") ? 6 : 9 + progressBarWidth: 76 + anchors.left: parent.left + anchors.top: parent.top + anchors.topMargin: 3 + anchors.leftMargin: 2 + + value: parameter.value + visible: fxEnabled + + drawAsEnabled: indicatorEnabled + + progressBarBackgroundColor: parent.barBgColor + } + + // stepped progress bar + Widgets.StateBar { + id: slider2 + height: (sizeState == "small") ? 6 : 9 + width: 76 + anchors.left: parent.left + anchors.top: parent.top + anchors.leftMargin: 2 + anchors.topMargin: 3 + + stateCount: parameter.valueRange.steps + currentState: (slider2.stateCount - 1.0 + 0.2) * parameter.value // +.2 to make sure we round in the right direction + visible: parameter.valueRange != undefined && parameter.valueRange.steps > 1 && fxEnabled && label.length > 0 + barBgColor: parent.barBgColor + } + + // Diverse Elements + Item { + id: fxInfoDetailsPanel + + height: 100 + width: parent.width + + Rectangle { + id: macroIconDetails + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 4 + anchors.topMargin: 15 + + width: 12 + height: 11 + radius: 1 + visible: isMacroFx + color: colors.colorGrey216 + + Text { + anchors.fill: parent + anchors.topMargin: -1 + anchors.leftMargin: 1 + text: "M" + font.pixelSize: fonts.miniFontSize + color: colors.colorBlack + } + } + + // fx name + Text { + id: fxInfoSampleName + font.capitalization: Font.AllUppercase + text: finalLabel + color: isPatternPlayer ? colors.colorGreenMint : settings.accentColor + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 8 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: isMacroFx ? 26 : 4 + anchors.rightMargin: 12 + elide: Text.ElideRight + } + + // value + Text { + id: fxInfoValueLarge + text: finalValue + font.family: "Pragmatica" // is monospaced + color: colors.colorWhite + visible: label.length > 0 + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 4 + font.pixelSize: 15 + anchors.topMargin: 24 + } + + // button + Rectangle { + id: fxInfoFilterButton + width: 30 + + color: ( fxEnabled ? (isOn ? (isPatternPlayer ? colors.colorGreenMint : colors.colorIndicatorLevelOrange) : colors.colorBlack) : "transparent" ) + visible: buttonLabel.length > 0 + radius: 1 + anchors.right: parent.right + anchors.rightMargin: 2 + anchors.top: parent.top + height: 15 + anchors.topMargin: 26 + + Text { + id: fxInfoFilterButtonText + font.capitalization: Font.AllUppercase + text: finalButtonLabel + color: ( fxEnabled ? (isOn ? colors.colorBlack : colors.colorGrey128) : colors.colorGrey128 ) + font.pixelSize: fonts.miniFontSize + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/Cell.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/Cell.qml new file mode 100755 index 000000000000..7df5c69b37ea --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/Cell.qml @@ -0,0 +1,54 @@ +import QtQuick 2.5 + +Item { + id: cell + property int slotId:0 + property int deckId: 0 + property int cellId: 0 + + readonly property bool isEmpty: propState.description == "Empty" + readonly property color color: isEmpty ? colors.colorDeckBrightGrey : colors.palette(computeBrightness(propState.description, propDisplayState.description), propColorId.value) + readonly property color brightColor: isEmpty ? colors.colorDeckBrightGrey : colors.palette(1., propColorId.value) + readonly property color midColor: isEmpty ? colors.colorDeckGrey : colors.palette(0.5, propColorId.value) + readonly property color dimmedColor: isEmpty ? colors.colorDeckDarkGrey : colors.palette(0., propColorId.value) + + readonly property string name: propName.value + readonly property bool isLooped: propPlayMode.description == "Looped" + + // AppProperty { id: propColorId; path: "app.traktor.decks." + deckId + ".remix.cell.columns." + slotId + ".rows." + cellId + ".color_id" } + QtObject { + id: propColorId + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propName; path: "app.traktor.decks." + deckId + ".remix.cell.columns." + slotId + ".rows." + cellId + ".name" } + QtObject { + id: propName + property string description: "Description" + property var value: 0 + } + //PlayMode can be "Looped" or "OneShot" + // AppProperty { id: propPlayMode; path: "app.traktor.decks." + deckId + ".remix.cell.columns." + slotId + ".rows." + cellId + ".play_mode" } + QtObject { + id: propPlayMode + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propState; path: "app.traktor.decks." + deckId + ".remix.cell.columns." + slotId + ".rows." + cellId + ".state" } + QtObject { + id: propState + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propDisplayState; path: "app.traktor.decks." + deckId + ".remix.cell.columns." + slotId + ".rows." + cellId + ".animation.display_state"} + QtObject { + id: propDisplayState + property string description: "Description" + property var value: 0 + } + + function computeBrightness(state, displayState) { + if (state == "Playing" && displayState == "BrightColor" ) {return 1.;} + return 0.5; + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/DeckInfo.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/DeckInfo.qml new file mode 100755 index 000000000000..ea0682cc0acb --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/DeckInfo.qml @@ -0,0 +1,1564 @@ +import QtQuick 2.5 +import '../Defines' as Defines + +import Mixxx 1.0 as Mixxx + +//---------------------------------------------------------------------------------------------------------------------- +// Track Deck Model - provide data for the track deck view +//---------------------------------------------------------------------------------------------------------------------- + +Item { + id: viewModel + + property string group: `[Channel${viewModel.deckId}]` + readonly property var deckPlayer: Mixxx.PlayerManager.getPlayer(viewModel.group) + readonly property var currentPlayer: viewModel.deckPlayer?.currentTrack + readonly property string screenName: isLeftScreen(viewModel.deckId) ? "leftdeck" : "rightdeck" + + function onSharedDataUpdate(data) { + if (typeof data === "object" && typeof data.group[screenName] === "string") { + viewModel.group = data.group[screenName] + console.log(`Changed group for screen ${screenName} to ${viewModel.group}`); + } + if (typeof data === "object" && typeof data.shift === "object") { + propShift.value = !!data.shift[screenName] + } + if (typeof data.padsMode === "object") { + propPadsMode.value = data.padsMode[viewModel.group] + console.log(`Changed padsMode for screen ${screenName} to ${propPadsMode.value}`); + } + if (typeof data.selectedQuickFX !== "undefined") { + propSelectedQuickFX.value = data.selectedQuickFX + console.log(`Changed selectedQuickFX to ${propSelectedQuickFX.value}`); + } + if (typeof data.selectedStems === "object") { + let firstSelected = data.selectedStems[viewModel.group].findIndex(x => !!x); + propStemSelected.active = firstSelected >= 0; + if (propStemSelected.active) { + propStemSelected.idx = firstSelected; + } + console.log(`Changed selectedStems for screen ${screenName} to ${propStemSelected.idx}`); + } + if (typeof data.selectedHotcue === "object") { + let hotcue = data.selectedHotcue[viewModel.group]; + + if (hotcue) { + let model = viewModel.currentPlayer?.hotcuesModel?.get(hotcue - 1); + viewModel.hotcueId = hotcue; + viewModel.hotcuePressed = true; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } else { + viewModel.hotcuePressed = false; + } + + console.log(`Changed selectedHotcue for screen ${screenName} to ${hotcue}`); + } + if (typeof data.deckColor === "object") { + propDeckColors.a = data.deckColor["[Channel1]"] + propDeckColors.b = data.deckColor["[Channel2]"] + propDeckColors.c = data.deckColor["[Channel3]"] + propDeckColors.d = data.deckColor["[Channel4]"] + } + if (typeof data.rollpadSize === "object") { + for (let i = 0; i < 8; i++) { + switch (`${data.rollpadSize[i]}`.toLowerCase()) { + case "double": + propRollSizePad[`pad${i+1}`] = "x2" + break; + case "half": + propRollSizePad[`pad${i+1}`] = "/2" + break; + default: + propRollSizePad[`pad${i+1}`] = parseFloat(data.rollpadSize[i]) < 1 ? `1/${1/parseFloat(data.rollpadSize[i])}` : data.rollpadSize[i] + } + } + } + if (typeof data.beatjumpSize === "object") { + for (let i = 0; i < 8; i++) { + switch (`${data.beatjumpSize[i]}`.toLowerCase()) { + case "double": + propJumpSizePad[`pad${i+1}`] = "x2" + break; + case "half": + propJumpSizePad[`pad${i+1}`] = "/2" + break; + case "beatjump": + propJumpSizePad[`pad${i+1}`] = "??" + break; + default: + propJumpSizePad[`pad${i+1}`] = parseFloat(data.beatjumpSize[i]) < 1 ? `1/${1/parseFloat(data.beatjumpSize[i])}` : data.beatjumpSize[i] + } + } + } + } + Component.onCompleted: { + if (engine.getSetting("useSharedDataAPI")) { + engine.makeSharedDataConnection(viewModel.onSharedDataUpdate) + } + } + + function isLeftScreen(deckId) { + return deckId == 1 || deckId == 3; + } + + function deckLetter(deckId) { + switch (deckId) { + case 1: return "A"; + case 2: return "B"; + case 3: return "C"; + default: + console.error(`Unknown deck ${deckId}. Defaulting to D`); + case 4: + return "D"; + } + } + + function tempoNeeded(master, current) { + if (master > current) { + return (1-(current/master))*100; + } + return (master/current)*100; + } + + function toInt_round(val) { return parseInt(val+0.5); } + + function computeBeatCounterStringFromPosition(beat) { + var phraseLen = 4; + var curBeat = parseInt(beat); + + if (beat < 0.0) + curBeat = curBeat*-1; + + var value1 = parseInt(((curBeat/4)/phraseLen)+1); + var value2 = parseInt(((curBeat/4)%phraseLen)+1); + var value3 = parseInt( (curBeat%4)+1); + + if (beat < 0.0) + return "-" + value1.toString() + "." + value2.toString() + "." + value3.toString(); + + return value1.toString() + "." + value2.toString() + "." + value3.toString(); + } + + function computeBeatCounterStringFromPositionSingle(beat) { + var phraseLen = 4; + var curBeat = parseInt(beat); + + if (beat < 0.0) + curBeat = curBeat*-1; + + var value3 = parseInt( (curBeat%4)+1); + + return value3.toString(); + } + + function computeBeatCounterStringFromPositionAlt(beat) { + var phraseLen = 4; + var curBeat = parseInt(beat); + + if (beat < 0.0) + curBeat = curBeat*-1; + + var value1 = parseInt(((curBeat)/phraseLen)+1); + var value2 = parseInt( (curBeat%4)+1); + + if (beat < 0.0) + return "-" + value1.toString() + "." + value2.toString(); + + return value1.toString() + "." + value2.toString(); + } + + //////////////////////////////////// + ////// Global info properties ////// + //////////////////////////////////// + QtObject { + id: propDeckColors + property int a: 10 + property int b: 10 + property int c: 2 + property int d: 2 + } + QtObject { + id: propRollSizePad + property var pad1: 1/32 + property var pad2: 1/16 + property var pad3: 1/8 + property var pad4: 1/4 + property var pad5: 1/2 + property var pad6: 1 + property var pad7: 2 + property var pad8: 4 + } + QtObject { + id: propJumpSizePad + property var pad1: 0.5 + property var pad2: 1 + property var pad3: 2 + property var pad4: 4 + property var pad5: 8 + property var pad6: 16 + property var pad7: 32 + property var pad8: 64 + } + + readonly property int deckAColor: propDeckColors.a + readonly property int deckBColor: propDeckColors.b + readonly property int deckCColor: propDeckColors.c + readonly property int deckDColor: propDeckColors.d + + //////////////////////////////////// + /////// Track info properties ////// + //////////////////////////////////// + + property int deckId: 1 + readonly property bool trackEndWarning: propTrackEndWarning.value + readonly property bool shift: propShift.value + readonly property string artistString: isLoaded ? propArtist.value : "Mixxx" + readonly property string bpmString: isLoaded ? propBPM.value.toFixed(2).toString() : "0.00" + readonly property string beats: computeBeatCounterStringFromPosition(((propElapsedTime.value*1000-propGridOffset.value)*propMixerBpm.value)/60000.0) + readonly property string beatSingle: computeBeatCounterStringFromPositionSingle(((propElapsedTime.value*1000-propGridOffset.value)*propMixerBpm.value)/60000.0) + readonly property string beatsAlt: computeBeatCounterStringFromPositionAlt(((propElapsedTime.value*1000-propGridOffset.value)*propMixerBpm.value)/60000.0) + readonly property string masterDeckLetter: leaderGroup.replace('[Channel', '').substr(0, 1) + readonly property string masterBPM: isLoaded ? propMasterBPM.value : 0.00 + readonly property string masterBPMShort: isLoaded ? propMasterBPM.value.toFixed(2).toString() : 0.00 + readonly property string masterBPMFooter: isLoaded ? propMasterBPM.value.toFixed(2).toString() + " BPM" : "" + readonly property string masterBPMFooter2: isLoaded ? propMasterBPM.value.toFixed(2).toString() + "BPM" : "" + readonly property string bpmOffset: isLoaded ? (bpmString - masterBPM).toFixed(2).toString() : "0.00" + readonly property string tempoString: isLoaded ? (propTempo.value).toFixed(2).toString() : "0.00" + readonly property string tempoRange: toInt_round(propTempoRange.value*100).toString() + "%" + readonly property string tempoStringPer: tempoString+'%' + readonly property string tempoNeededVal: tempoNeeded(masterBPMShort, bpmString).toFixed(2).toString() + readonly property string tempoNeededString: isLoaded ? (tempoNeededVal == 0) ? "0.00" : (tempoNeededVal < 0) ? tempoNeededVal + "%" : "+" + tempoNeededVal + "%" : "0.00" + readonly property string songBPM: propSongBPM.value.toFixed(2).toString() + readonly property bool hightlightLoop: !shift + readonly property bool hightlightKey: shift + readonly property int isLoaded: (propTrackLength.value > 0) + readonly property bool showLogo: propTrackLength.value == 0 ? true : false + readonly property string keyString: propKeyForDisplay.value + readonly property string masterKey: propMasterKey.value + readonly property int keyIndex: propFinalKeyId.value + readonly property int masterKeyIndex: propMasterKeyId.value + readonly property bool hasKey: isLoaded && keyIndex >= 0 + readonly property bool hasTempo: isLoaded && !!propTempo.value + readonly property bool isKeyLockOn: propKeyLockOn.value + readonly property bool isSyncOn: propIsInSync.value + readonly property bool isStemDeck: (propIsStemDeck.value >= 2) ? true : false + readonly property bool loopActive: propLoopActive.value + readonly property string loopSizeString: propLoopSize.value < 1 ? `1/${1 / propLoopSize.value}` : `${propLoopSize.value}` + readonly property string loopSizeInt: propLoopSize.value + readonly property string remainingTimeString: (!isLoaded) ? "00:00" : utils.computeRemainingTimeString(propTrackLength.value, propElapsedTime.value) + readonly property string elapsedTimeString: (!isLoaded) ? "00:00" : utils.convertToTimeString(Math.floor(propElapsedTime.value)) + readonly property string titleString: isLoaded ? propTitle.value : "Load a Track to Deck " + deckLetter(deckId) + readonly property real phase: isPlaying && leaderGroup != group ? propPhase.value : 0 + readonly property bool touchKey: false // TODO map shift encoder touch event + readonly property bool touchTime: false // TODO map shift encoder touch event + readonly property bool touchLoop: false // TODO map shift encoder touch event + readonly property int deckType: propDeckType.value + readonly property string keyAdjustString: (keyAdjustVal < 0 ? "" : "+") + (keyAdjustVal).toFixed(0).toString() + readonly property real keyAdjustVal: propKeyAdjust.value*12 + readonly property variant loopSizeText: ["1/32", "1/16", "1/8", "1/4", "1/2", "1", "2", "4", "8", "16", "32"] + readonly property bool slicerEnabled: propEnabled.value + readonly property int slicerNo: propSlicerNo.value + readonly property int slicerSize: propSlicerSize.value + + readonly property bool headerEnabled: propHeaderEnabled.value + readonly property string headerText: propHeaderText.value + readonly property string headerTextLong: propHeaderTextLong.value + readonly property int sampleRate: propSampleRate.value + + readonly property bool isPlaying: propIsPlaying.value + + readonly property bool is1Playing: propIs1Playing.value + readonly property bool is2Playing: propIs2Playing.value + readonly property bool is3Playing: propIs3Playing.value + readonly property bool is4Playing: propIs4Playing.value + + Mixxx.ControlProxy { + group: viewModel.group + key: "track_samplerate" + id: propSampleRate + } + Mixxx.ControlProxy { + group: viewModel.leaderGroup + key: "track_samplerate" + id: propLeaderSampleRate + } + Mixxx.ControlProxy { + group: viewModel.group + id: propTempoRange + key: "rateRange" + } + QtObject { + id: propEnabled + property var value: 0 + } + QtObject { + id: propSlicerNo + property var value: 0 + } + QtObject { + id: propSlicerSize + property var value: 0 + } + QtObject { + id: propDeckType + property var value: 0 + } + Mixxx.ControlProxy { + group: viewModel.group + key: "play" + id: propIsPlaying + } + + Mixxx.ControlProxy { + group: "[Channel1]" + id: propIs1Leader + key: "sync_mode" + } + + Mixxx.ControlProxy { + group: "[Channel2]" + id: propIs2Leader + key: "sync_mode" + } + + Mixxx.ControlProxy { + group: "[Channel3]" + id: propIs3Leader + key: "sync_mode" + } + + Mixxx.ControlProxy { + group: "[Channel4]" + id: propIs4Leader + key: "sync_mode" + } + + readonly property string leaderGroup: propIs1Leader.value >= 2 ? `[Channel1]` : propIs2Leader.value >= 2 ? `[Channel2]` : propIs3Leader.value >= 2 ? `[Channel3]` : propIs4Leader.value >= 2 ? `[Channel4]` : viewModel.group + + Mixxx.ControlProxy { + group: "[Channel1]" + key: "play" + id: propIs1Playing + } + Mixxx.ControlProxy { + group: "[Channel2]" + key: "play" + id: propIs2Playing + } + Mixxx.ControlProxy { + group: "[Channel3]" + key: "play" + id: propIs3Playing + } + Mixxx.ControlProxy { + group: "[Channel4]" + key: "play" + id: propIs4Playing + } + + QtObject { + id: propTitle + property var value: viewModel.currentPlayer?.title || "Unknown" + } + QtObject { + id: propArtist + property var value: viewModel.currentPlayer?.artist || "Unknown" + } + Mixxx.ControlProxy { + group: viewModel.group + id: propSongBPM + key: "file_bpm" + } + + Mixxx.ControlProxy { + group: viewModel.group + id: propKey + key: "key" + } + QtObject { + id: propKeyForDisplay + property var value: [ + "No key", + "1d", + "8d", + "3d", + "10d", + "5d", + "12d", + "7d", + "2d", + "9d", + "4d", + "11d", + "6d", + "10m", + "5m", + "12m", + "7m", + "2m", + "9m", + "4m", + "11m", + "6m", + "1m", + "8m", + "3m" + ][propKey.value] + } + QtObject { + id: propMasterKey + property var value: 0 + } + QtObject { + id: propMixerBpm + property var value: 0 + } + QtObject { + id: propMixerBpmMaster + property var value: 160 + } + QtObject { + id: propFinalKeyId + property var value: propKey.value + } + Mixxx.ControlProxy { + group: viewModel.leaderGroup + id: propMasterKeyId + key: "key" + } + QtObject { + id: propKeyAdjust + property var value: 0 + } + QtObject { + id: propGridOffset + property var value: 0 + } + QtObject { + id: propGridOffsetMaster + property var value: 10000 + } + + Mixxx.ControlProxy { + group: viewModel.group + id: propKeyLockOn + key: "keylock" + } + Mixxx.ControlProxy { + group: viewModel.group + key: "bpm" + id: propBPM + } + Mixxx.ControlProxy { + group: '[InternalClock]' + key: "bpm" + id: propMasterBPM + } + Mixxx.ControlProxy { + group: viewModel.group + key: "visual_bpm" + id: propTempo + } + QtObject { + id: propTempoAbsolute + property var value: 0 + } + + Mixxx.ControlProxy { + group: viewModel.group + key: "beat_closest" + id: propBeatClosest + } + Mixxx.ControlProxy { + group: viewModel.group + key: "track_samples" + id: propSample + } + QtObject { + id: propBeatSample + property var value: (propSampleRate.value * 60) / propBPM.value + } + QtObject { + id: propBeatSampleOffset + property var value: propBeatClosest.value % propBeatSample.value + } + QtObject { + id: propBeat + property var value: (propTrackPosition.value * propSample.value / 2) / propBeatSample.value + } + Mixxx.ControlProxy { + group: viewModel.leaderGroup + key: "beat_closest" + id: propLeaderBeatClosest + } + Mixxx.ControlProxy { + group: viewModel.leaderGroup + key: "track_samples" + id: propLeaderSample + } + QtObject { + id: propLeaderBeatSample + property var value: (propLeaderSampleRate.value * 60) / propMasterBPM.value + } + QtObject { + id: propLeaderBeatSampleOffset + property var value: propLeaderBeatClosest.value % propLeaderBeatSample.value + } + QtObject { + id: propLeaderBeat + property var value: (propLeaderTrackPosition.value * propLeaderSample.value / 2) / propLeaderBeatSample.value + } + QtObject { + id: propPhase + property var value: (propLeaderBeat.value-propBeat.value - 0.5) % 1 - 0.5 + } + Mixxx.ControlProxy { + group: viewModel.group + key: "beatloop_size" + id: propLoopSize + } + Mixxx.ControlProxy { + id: propLoopActive + group: viewModel.group + key: "loop_enabled" + } + QtObject { + id: proploopActive + property var value: 0 + } + Mixxx.ControlProxy { + id: propTrackLength + group: viewModel.group + key: "duration" + } + Mixxx.ControlProxy { + id: propTrackPosition + group: viewModel.group + key: "playposition" + } + Mixxx.ControlProxy { + id: propLeaderTrackPosition + group: viewModel.leaderGroup + key: "playposition" + } + QtObject { + id: propElapsedTime + property var value: parseInt(propTrackPosition.value * propTrackLength.value) + } + Mixxx.ControlProxy { + group: viewModel.group + key: `end_of_track` + id: propTrackEndWarning + } + + QtObject { + id: propHeaderEnabled + property var value: false + } + QtObject { + id: propHeaderText + property var value: "HeaderText" + } + QtObject { + id: propHeaderTextLong + property var value: "HeaderTextLong" + } + + Mixxx.ControlProxy { + group: viewModel.group + key: "stem_count" + id: propIsStemDeck + } + + Timer { + id: loopAdjust + property bool show: false + + triggeredOnStart: true + interval: settings.loopOverlayTimer + repeat: false + running: false + + onTriggered: { + show = !show + } + } + + Mixxx.ControlProxy { + group: viewModel.group + key: "beats_translate_curpos" + id: propBeatsTranslateCurpos + onValueChanged: { + loopAdjust.running = true + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: "beats_adjust_faster" + id: propBeatsAdjustFaster + onValueChanged: { + loopAdjust.running = true + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: "beats_adjust_slower" + id: propBeatsAdjustSlower + onValueChanged: { + loopAdjust.running = true + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: "beats_translate_later" + id: propBeatsTranslateLater + onValueChanged: { + loopAdjust.running = true + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: "beats_translate_earlier" + id: propBeatsTranslateEarlier + onValueChanged: { + loopAdjust.running = true + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: "rateRange" + id: propRateRange + onValueChanged: { + loopAdjust.running = true + } + } + + readonly property bool adjustEnabled: settings.showBPMGridAdjust ? loopAdjust.show : false + + QtObject { + id: propPadsMode + property var value: 0 + } + QtObject { + id: propSelectedQuickFX + property var value: null + } + readonly property var quickFXSelected: propSelectedQuickFX.value + property bool padsModeJump: propPadsMode.value == 1 + property bool padsModeLoop: propPadsMode.value == 5 + property bool padsModeRoll: propPadsMode.value == 3 + property bool padsModeTone: propPadsMode.value == 11 + property bool padsModeBank1: propPadsMode.value == 12 + property bool padsModeBank2: propPadsMode.value == 13 + + Mixxx.ControlProxy { + id: propIsInSync + group: root.group + key: "sync_enabled" + } + + Mixxx.ControlProxy { + id: propBrowser + group: "[Skin]" + key: "show_maximized_library" + } + readonly property bool isInBrowserMode: propBrowser.value + + QtObject { + id: propShift + property bool value: false + } + + Mixxx.ControlProxy { + id: propZoom + + group: root.group + key: "waveform_zoom" + onValueChanged: { + loopAdjust.running = true + } + } + + readonly property int zoomLevel: propZoom.value + + //fx and overlays + property var fxModel: Mixxx.EffectsManager.visibleEffectsModel + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: "mix_mode" + id: propFx1Type + } + readonly property int fx1Type: propFx1Type.value + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: "mix_mode" + id: propFx2Type + } + readonly property int fx2Type: propFx2Type.value + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: "mix_mode" + id: propFx3Type + } + readonly property int fx3Type: propFx3Type.value + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: "mix_mode" + id: propFx4Type + } + readonly property int fx4Type: propFx4Type.value + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: "mix" + id: propFx1DryWet + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: "mix" + id: propFx2DryWet + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect1]" + key: `meta` + id: propFx1Knob1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect2]" + key: `meta` + id: propFx1Knob2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect3]" + key: `meta` + id: propFx1Knob3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2_Effect1]" + key: `meta` + id: propFx2Knob1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2_Effect2]" + key: `meta` + id: propFx2Knob2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2_Effect3]" + key: `meta` + id: propFx2Knob3 + } + + Mixxx.ControlProxy { + id: propFx1Knob1Name + group: "[EffectRack1_EffectUnit1_Effect1]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect2]" + key: "loaded_effect" + id: propFx1Knob2Name + } + Mixxx.ControlProxy { + id: propFx1Knob3Name + group: "[EffectRack1_EffectUnit1_Effect3]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx2Knob1Name + group: "[EffectRack1_EffectUnit2_Effect1]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx2Knob2Name + group: "[EffectRack1_EffectUnit2_Effect2]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx2Knob3Name + group: "[EffectRack1_EffectUnit2_Effect3]" + key: "loaded_effect" + } + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: "enabled" + id: propFx1Enabled + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: `enabled` + id: propFx2Enabled + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect1]" + key: `enabled` + id: propFx1Button1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect2]" + key: `enabled` + id: propFx1Button2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1_Effect3]" + key: `enabled` + id: propFx1Button3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2_Effect1]" + key: `enabled` + id: propFx2Button1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2_Effect2]" + key: `enabled` + id: propFx2Button2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2_Effect3]" + key: `enabled` + id: propFx2Button3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: `group_[Channel1]_enable` + id: propFx1Ch1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: `group_[Channel2]_enable` + id: propFx1Ch2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: `group_[Channel3]_enable` + id: propFx1Ch3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: `group_[Channel4]_enable` + id: propFx1Ch4 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: `group_[Channel1]_enable` + id: propFx2Ch1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: `group_[Channel2]_enable` + id: propFx2Ch2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: `group_[Channel3]_enable` + id: propFx2Ch3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: `group_[Channel4]_enable` + id: propFx2Ch4 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: `group_[Channel1]_enable` + id: propFx3Ch1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: `group_[Channel2]_enable` + id: propFx3Ch2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: `group_[Channel3]_enable` + id: propFx3Ch3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: `group_[Channel4]_enable` + id: propFx3Ch4 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: `group_[Channel1]_enable` + id: propFx4Ch1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: `group_[Channel2]_enable` + id: propFx4Ch2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: `group_[Channel3]_enable` + id: propFx4Ch3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: `group_[Channel4]_enable` + id: propFx4Ch4 + } + + readonly property real fx1DryWet: propFx1DryWet.value + readonly property real fx2DryWet: propFx2DryWet.value + readonly property real fx1Knob1: propFx1Knob1.value + readonly property real fx1Knob2: propFx1Knob2.value + readonly property real fx1Knob3: propFx1Knob3.value + readonly property real fx2Knob1: propFx2Knob1.value + readonly property real fx2Knob2: propFx2Knob2.value + readonly property real fx2Knob3: propFx2Knob3.value + + readonly property string fx1Knob1Name: viewModel.fxModel.get(propFx1Knob1Name.value).display + readonly property string fx1Knob2Name: viewModel.fxModel.get(propFx1Knob2Name.value).display + readonly property string fx1Knob3Name: viewModel.fxModel.get(propFx1Knob3Name.value).display + readonly property string fx2Knob1Name: viewModel.fxModel.get(propFx2Knob1Name.value).display + readonly property string fx2Knob2Name: viewModel.fxModel.get(propFx2Knob2Name.value).display + readonly property string fx2Knob3Name: viewModel.fxModel.get(propFx2Knob3Name.value).display + + readonly property bool fx1Enabled: propFx1Enabled.value + readonly property bool fx2Enabled: propFx2Enabled.value + readonly property bool fx1Button1: propFx1Button1.value + readonly property bool fx1Button2: propFx1Button2.value + readonly property bool fx1Button3: propFx1Button3.value + readonly property bool fx2Button1: propFx2Button1.value + readonly property bool fx2Button2: propFx2Button2.value + readonly property bool fx2Button3: propFx2Button3.value + + readonly property bool fx1Ch1: propFx1Ch1.value + readonly property bool fx1Ch2: propFx1Ch2.value + readonly property bool fx1Ch3: propFx1Ch3.value + readonly property bool fx1Ch4: propFx1Ch4.value + readonly property bool fx2Ch1: propFx2Ch1.value + readonly property bool fx2Ch2: propFx2Ch2.value + readonly property bool fx2Ch3: propFx2Ch3.value + readonly property bool fx2Ch4: propFx2Ch4.value + + onFx1DryWetChanged: {fx1Timer.running = true} + onFx2DryWetChanged: {fx2Timer.running = true} + onFx1Knob1Changed: {fx1Timer.running = true} + onFx1Knob2Changed: {fx1Timer.running = true} + onFx1Knob3Changed: {fx1Timer.running = true} + onFx2Knob1Changed: {fx2Timer.running = true} + onFx2Knob2Changed: {fx2Timer.running = true} + onFx2Knob3Changed: {fx2Timer.running = true} + onFx1EnabledChanged: {fx1Timer.running = true} + onFx2EnabledChanged: {fx2Timer.running = true} + onFx1Button1Changed: {fx1Timer.running = true} + onFx1Button2Changed: {fx1Timer.running = true} + onFx1Button3Changed: {fx1Timer.running = true} + onFx2Button1Changed: {fx2Timer.running = true} + onFx2Button2Changed: {fx2Timer.running = true} + onFx2Button3Changed: {fx2Timer.running = true} + onFx1Ch1Changed: {fx1Timer.running = true} + onFx1Ch2Changed: {fx1Timer.running = true} + onFx1Ch3Changed: {fx1Timer.running = true} + onFx1Ch4Changed: {fx1Timer.running = true} + onFx2Ch1Changed: {fx2Timer.running = true} + onFx2Ch2Changed: {fx2Timer.running = true} + onFx2Ch3Changed: {fx2Timer.running = true} + onFx2Ch4Changed: {fx2Timer.running = true} + onFx1Knob1NameChanged: {fx1Timer.running = true} + onFx1Knob2NameChanged: {fx1Timer.running = true} + onFx1Knob3NameChanged: {fx1Timer.running = true} + onFx2Knob1NameChanged: {fx2Timer.running = true} + onFx2Knob2NameChanged: {fx2Timer.running = true} + onFx2Knob3NameChanged: {fx2Timer.running = true} + + onLoopSizeStringChanged: {loopTimer.running = true} + onLoopActiveChanged: {loopTimer.running = true} + + Timer { + id: loopTimer + property bool showLoop: false + + triggeredOnStart: true + interval: settings.loopOverlayTimer + repeat: false + running: false + + onTriggered: { + showLoop = !showLoop + } + } + + property bool showLoopInfo: loopTimer.showLoop + + onBpmStringChanged: {bpmTimer.running = true} + + Timer { + id: bpmTimer + property bool showBPM: false + + triggeredOnStart: true + interval: settings.bpmOverlayTimer + repeat: false + running: false + + onTriggered: { + showBPM = !showBPM + } + } + + property bool showBPMInfo: bpmTimer.showBPM && bpmTimer.running + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: "mix" + id: propFx3DryWet + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: "mix" + id: propFx4DryWet + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3_Effect1]" + key: `meta` + id: propFx3Knob1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3_Effect2]" + key: `meta` + id: propFx3Knob2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3_Effect3]" + key: `meta` + id: propFx3Knob3 + } + Mixxx.ControlProxy { + id: propFx4Knob1 + group: "[EffectRack1_EffectUnit4_Effect1]" + key: `meta` + } + Mixxx.ControlProxy { + id: propFx4Knob2 + group: "[EffectRack1_EffectUnit4_Effect2]" + key: `meta` + } + Mixxx.ControlProxy { + id: propFx4Knob3 + group: "[EffectRack1_EffectUnit4_Effect3]" + key: `meta` + } + + Mixxx.ControlProxy { + id: propFx3Knob1Name + group: "[EffectRack1_EffectUnit3_Effect1]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx3Knob2Name + group: "[EffectRack1_EffectUnit3_Effect2]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx3Knob3Name + group: "[EffectRack1_EffectUnit3_Effect3]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx4Knob1Name + group: "[EffectRack1_EffectUnit4_Effect1]" + key: `loaded_effect` + } + Mixxx.ControlProxy { + id: propFx4Knob2Name + group: "[EffectRack1_EffectUnit4_Effect2]" + key: "loaded_effect" + } + Mixxx.ControlProxy { + id: propFx4Knob3Name + group: "[EffectRack1_EffectUnit4_Effect3]" + key: `loaded_effect` + } + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: "enabled" + id: propFx3Enabled + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: "enabled" + id: propFx4Enabled + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3_Effect1]" + key: `enabled` + id: propFx3Button1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3_Effect2]" + key: `enabled` + id: propFx3Button2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3_Effect3]" + key: `enabled` + id: propFx3Button3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4_Effect1]" + key: `enabled` + id: propFx4Button1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4_Effect2]" + key: `enabled` + id: propFx4Button2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4_Effect3]" + key: `enabled` + id: propFx4Button3 + } + + readonly property real fx3DryWet: propFx3DryWet.value + readonly property real fx4DryWet: propFx3DryWet.value + readonly property real fx3Knob1: propFx3Knob1.value + readonly property real fx3Knob2: propFx3Knob2.value + readonly property real fx3Knob3: propFx3Knob3.value + readonly property real fx4Knob1: propFx4Knob1.value + readonly property real fx4Knob2: propFx4Knob2.value + readonly property real fx4Knob3: propFx4Knob3.value + + readonly property string fx3Knob1Name: viewModel.fxModel.get(propFx3Knob1Name.value).display + readonly property string fx3Knob2Name: viewModel.fxModel.get(propFx3Knob2Name.value).display + readonly property string fx3Knob3Name: viewModel.fxModel.get(propFx3Knob3Name.value).display + readonly property string fx4Knob1Name: viewModel.fxModel.get(propFx4Knob1Name.value).display + readonly property string fx4Knob2Name: viewModel.fxModel.get(propFx4Knob2Name.value).display + readonly property string fx4Knob3Name: viewModel.fxModel.get(propFx4Knob3Name.value).display + + readonly property bool fx3Enabled: propFx3Enabled.value + readonly property bool fx4Enabled: propFx4Enabled.value + readonly property bool fx3Button1: propFx3Button1.value + readonly property bool fx3Button2: propFx3Button2.value + readonly property bool fx3Button3: propFx3Button3.value + readonly property bool fx4Button1: propFx4Button1.value + readonly property bool fx4Button2: propFx4Button2.value + readonly property bool fx4Button3: propFx4Button3.value + + readonly property bool fx3Ch1: propFx3Ch1.value + readonly property bool fx3Ch2: propFx3Ch2.value + readonly property bool fx3Ch3: propFx3Ch3.value + readonly property bool fx3Ch4: propFx3Ch4.value + readonly property bool fx4Ch1: propFx4Ch1.value + readonly property bool fx4Ch2: propFx4Ch2.value + readonly property bool fx4Ch3: propFx4Ch3.value + readonly property bool fx4Ch4: propFx4Ch4.value + + onFx3DryWetChanged: {fx3Timer.running = true} + onFx4DryWetChanged: {fx4Timer.running = true} + onFx3Knob1Changed: {fx3Timer.running = true} + onFx3Knob2Changed: {fx3Timer.running = true} + onFx3Knob3Changed: {fx3Timer.running = true} + onFx4Knob1Changed: {fx4Timer.running = true} + onFx4Knob2Changed: {fx4Timer.running = true} + onFx4Knob3Changed: {fx4Timer.running = true} + onFx3EnabledChanged: {fx3Timer.running = true} + onFx4EnabledChanged: {fx4Timer.running = true} + onFx3Button1Changed: {fx3Timer.running = true} + onFx3Button2Changed: {fx3Timer.running = true} + onFx3Button3Changed: {fx3Timer.running = true} + onFx4Button1Changed: {fx4Timer.running = true} + onFx4Button2Changed: {fx4Timer.running = true} + onFx4Button3Changed: {fx4Timer.running = true} + onFx3Ch1Changed: {fx3Timer.running = true} + onFx3Ch2Changed: {fx3Timer.running = true} + onFx3Ch3Changed: {fx3Timer.running = true} + onFx3Ch4Changed: {fx3Timer.running = true} + onFx4Ch1Changed: {fx4Timer.running = true} + onFx4Ch2Changed: {fx4Timer.running = true} + onFx4Ch3Changed: {fx4Timer.running = true} + onFx4Ch4Changed: {fx4Timer.running = true} + onFx3Knob1NameChanged: {fx3Timer.running = true} + onFx3Knob2NameChanged: {fx3Timer.running = true} + onFx3Knob3NameChanged: {fx3Timer.running = true} + onFx4Knob1NameChanged: {fx4Timer.running = true} + onFx4Knob2NameChanged: {fx4Timer.running = true} + onFx4Knob3NameChanged: {fx4Timer.running = true} + + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit1]" + key: `group_${viewModel.group}_enable` + id: propfx1 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit2]" + key: `group_${viewModel.group}_enable` + id: propfx2 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit3]" + key: `group_${viewModel.group}_enable` + id: propfx3 + } + Mixxx.ControlProxy { + group: "[EffectRack1_EffectUnit4]" + key: `group_${viewModel.group}_enable` + id: propfx4 + } + + readonly property bool fx1On: propfx1.value + readonly property bool fx2On: propfx2.value + readonly property bool fx3On: propfx3.value + readonly property bool fx4On: propfx4.value + + Timer { + id: fx1Timer + property bool blink: false + + triggeredOnStart: true + interval: settings.fxOverlayTimer + repeat: false + running: fx1On + + onTriggered: { + blink = !blink + } + } + + Timer { + id: fx2Timer + property bool blink: false + + triggeredOnStart: true + interval: settings.fxOverlayTimer + repeat: false + running: fx2On + + onTriggered: { + blink = !blink + } + } + + Timer { + id: fx3Timer + property bool blink: false + + triggeredOnStart: true + interval: settings.fxOverlayTimer + repeat: false + running: fx3On + + onTriggered: { + blink = !blink + } + } + + Timer { + id: fx4Timer + property bool blink: false + + triggeredOnStart: true + interval: settings.fxOverlayTimer + repeat: false + running: fx4On + + onTriggered: { + blink = !blink + } + } + + readonly property bool showFx1: fx1On && fx1Timer.blink + readonly property bool showFx2: fx2On && fx2Timer.blink + readonly property bool showFx3: fx3On && fx3Timer.blink + readonly property bool showFx4: fx4On && fx4Timer.blink + + Mixxx.ControlProxy { + id: propView + group: "[Skin]" + key: "show_maximized_library" + } + + readonly property bool viewButton: propView.value && false + + property int hotcueId: 0 + readonly property bool hotcueDisplay: hotcuePressed || cueTimer.running + property string hotcueName: "" + property int hotcueType: 0 + + property bool hotcuePressed: false + onHotcuePressedChanged: {hotcuePressed == false ? cueTimer.restart() : hotcuePressed = hotcuePressed } + + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_1_activate` + id: propHotcue1Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(0); + viewModel.hotcueId = 1; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_2_activate` + id: propHotcue2Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(1); + viewModel.hotcueId = 2; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_3_activate` + id: propHotcue3Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(2); + viewModel.hotcueId = 3; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_4_activate` + id: propHotcue4Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(3); + viewModel.hotcueId = 4; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_5_activate` + id: propHotcue5Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(4); + viewModel.hotcueId = 5; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_6_activate` + id: propHotcue6Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(5); + viewModel.hotcueId = 6; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_7_activate` + id: propHotcue7Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(6); + viewModel.hotcueId = 7; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + Mixxx.ControlProxy { + group: viewModel.group + key: `hotcue_8_activate` + id: propHotcue8Activated + onValueChanged: { + let model = viewModel.currentPlayer?.hotcuesModel?.get(7); + viewModel.hotcueId = 8; + viewModel.hotcuePressed = value; + viewModel.hotcueName = model?.label || "Unnamed cue"; + viewModel.hotcueType = model?.isLoop ? 5 : 0; + } + } + + Timer { + id: cueTimer + property bool blink: false + + triggeredOnStart: true + interval: 1000 + repeat: false + running: false + } + + /////////////////////////////////////////////////// + /////// Stem Deck properties ////////////////////// + /////////////////////////////////////////////////// + + Mixxx.ControlProxy { + group: viewModel.group + key: `stem_count` + id: propStemCount + } + + readonly property bool isStemsActive: propStemCount.value > 0 + readonly property int stemCount: propStemCount.value + + QtObject { + id: propStemSelected + property var idx: 0 + property bool active: false + } + readonly property bool stemSelected: propStemSelected.active + readonly property var stemSelectedIdx: propStemSelected.idx + + readonly property string stemSelectedName: viewModel.currentPlayer?.stemsModel.get(viewModel.stemSelectedIdx).label || "Unknown" + readonly property real stemSelectedVolume: isStemsActive ? [propStem1Volume,propStem2Volume,propStem3Volume,propStem4Volume][viewModel.stemSelectedIdx].value : 0.0 + readonly property bool stemSelectedMuted: isStemsActive ? [propStem1Muted,propStem2Muted,propStem3Muted,propStem4Muted][viewModel.stemSelectedIdx].value : false + readonly property int stemSelectedQuickFXId: isStemsActive ? [propStem1FX,propStem2FX,propStem3FX,propStem4FX][viewModel.stemSelectedIdx].value : 0 + readonly property real stemSelectedQuickFXValue: isStemsActive ? [propStem1FXValue,propStem2FXValue,propStem3FXValue,propStem4FXValue][viewModel.stemSelectedIdx].value : 0.0 + readonly property bool stemSelectedQuickFXOn: isStemsActive ? [propStem1FXOn,propStem2FXOn,propStem3FXOn,propStem4FXOn][viewModel.stemSelectedIdx].value : false + readonly property string stemSelectedQuickFXName: Mixxx.EffectsManager.quickChainPresetModel.get(viewModel.stemSelectedQuickFXId).display || "---" + readonly property color stemSelectedBrightColor: viewModel.currentPlayer?.stemsModel.get(viewModel.stemSelectedIdx).color ?? "grey" + readonly property color stemSelectedMidColor: isStemsActive ? stemSelectedBrightColor : "black" + + Mixxx.ControlProxy { + id: propStem1Volume + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem1]` + key: `volume` + } + Mixxx.ControlProxy { + id: propStem1Muted + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem1]` + key: `mute` + } + Mixxx.ControlProxy { + id: propStem1FX + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem1]]` + key: `loaded_chain_preset` + } + Mixxx.ControlProxy { + id: propStem1FXOn + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem1]]` + key: `enabled` + } + Mixxx.ControlProxy { + id: propStem1FXValue + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem1]]` + key: `super1` + } + Mixxx.ControlProxy { + id: propStem2Volume + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem2]` + key: `volume` + } + Mixxx.ControlProxy { + id: propStem2Muted + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem2]` + key: `mute` + } + Mixxx.ControlProxy { + id: propStem2FX + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem2]]` + key: `loaded_chain_preset` + } + Mixxx.ControlProxy { + id: propStem2FXOn + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem2]]` + key: `enabled` + } + Mixxx.ControlProxy { + id: propStem2FXValue + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem2]]` + key: `super1` + } + Mixxx.ControlProxy { + id: propStem3Volume + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem3]` + key: `volume` + } + Mixxx.ControlProxy { + id: propStem3Muted + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem3]` + key: `mute` + } + Mixxx.ControlProxy { + id: propStem3FX + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem3]]` + key: `loaded_chain_preset` + } + Mixxx.ControlProxy { + id: propStem3FXOn + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem3]]` + key: `enabled` + } + Mixxx.ControlProxy { + id: propStem3FXValue + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem3]]` + key: `super1` + } + Mixxx.ControlProxy { + id: propStem4Volume + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem4]` + key: `volume` + } + Mixxx.ControlProxy { + id: propStem4Muted + group: `${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem4]` + key: `mute` + } + Mixxx.ControlProxy { + id: propStem4FX + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem4]]` + key: `loaded_chain_preset` + } + Mixxx.ControlProxy { + id: propStem4FXOn + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem4]]` + key: `enabled` + } + Mixxx.ControlProxy { + id: propStem4FXValue + group: `[QuickEffectRack1_${viewModel.group.substr(0, viewModel.group.length - 1)}_Stem4]]` + key: `super1` + } + + /////////////////////////////////////////////////// + /////// Stripe properties ///////////////////////// + /////////////////////////////////////////////////// + + readonly property var hotcues: viewModel.currentPlayer?.hotcuesModel + + /// Loop size + readonly property var loopSizePad1: "1/4" + readonly property var loopSizePad2: "1/2" + readonly property var loopSizePad3: "1" + readonly property var loopSizePad4: "2" + readonly property var loopSizePad5: "4" + readonly property var loopSizePad6: "8" + readonly property var loopSizePad7: "16" + readonly property var loopSizePad8: "32" + + readonly property var jumpSizePad1: propJumpSizePad.pad1 + readonly property var jumpSizePad2: propJumpSizePad.pad2 + readonly property var jumpSizePad3: propJumpSizePad.pad3 + readonly property var jumpSizePad4: propJumpSizePad.pad4 + readonly property var jumpSizePad5: propJumpSizePad.pad5 + readonly property var jumpSizePad6: propJumpSizePad.pad6 + readonly property var jumpSizePad7: propJumpSizePad.pad7 + readonly property var jumpSizePad8: propJumpSizePad.pad8 + + readonly property var rollSizePad1: propRollSizePad.pad1 + readonly property var rollSizePad2: propRollSizePad.pad2 + readonly property var rollSizePad3: propRollSizePad.pad3 + readonly property var rollSizePad4: propRollSizePad.pad4 + readonly property var rollSizePad5: propRollSizePad.pad5 + readonly property var rollSizePad6: propRollSizePad.pad6 + readonly property var rollSizePad7: propRollSizePad.pad7 + readonly property var rollSizePad8: propRollSizePad.pad8 + } diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCue.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCue.qml new file mode 100755 index 000000000000..005df81c6fe9 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCue.qml @@ -0,0 +1,42 @@ +import QtQuick 2.5 + +Item { + id: hotcue + readonly property real position: propPosition.value + readonly property real length: propLength.value + readonly property string type: propType.value + readonly property string name: propName.value + readonly property bool exists: propExists.value + property int index: 0 + + // AppProperty { id: propPosition; path: "app.traktor.decks." + deckId + ".track.cue.hotcues." + (index + 1) + ".start_pos" } + QtObject { + id: propPosition + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propLength; path: "app.traktor.decks." + deckId + ".track.cue.hotcues." + (index + 1) + ".length" } + QtObject { + id: propLength + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propType; path: "app.traktor.decks." + deckId + ".track.cue.hotcues." + (index + 1) + ".type" } + QtObject { + id: propType + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propName; path: "app.traktor.decks." + deckId + ".track.cue.hotcues." + (index + 1) + ".name" } + QtObject { + id: propName + property string description: "Description" + property var value: 0 + } + // AppProperty { id: propExists; path: "app.traktor.decks." + deckId + ".track.cue.hotcues." + (index + 1) + ".exists" } + QtObject { + id: propExists + property string description: "Description" + property var value: 0 + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCues.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCues.qml new file mode 100755 index 000000000000..3961fc236235 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/ViewModels/HotCues.qml @@ -0,0 +1,65 @@ +import QtQuick 2.5 + +Item { + id: hotcuesModel + property int deckId: 0 + + readonly property alias activeHotcue: activeHotcueModel + readonly property var array: + [ + hotcueModel1, + hotcueModel2, + hotcueModel3, + hotcueModel4, + hotcueModel5, + hotcueModel6, + hotcueModel7, + hotcueModel8 + ] + + Item { + id: activeHotcueModel + readonly property real position: activePos.value + readonly property real length: activeLength.value + readonly property string type: activeType.value + readonly property string name: activeName.value + + // AppProperty { id: activePos; path: "app.traktor.decks." + deckId + ".track.cue.active.start_pos" } + QtObject { + id: activePos + property string description: "Description" + property var value: 0 + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: activeLength; path: "app.traktor.decks." + deckId + ".track.cue.active.length" } + QtObject { + id: activeLength + property string description: "Description" + property var value: 0 + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: activeType; path: "app.traktor.decks." + deckId + ".track.cue.active.type" } + QtObject { + id: activeType + property string description: "Description" + property var value: 0 + property var valueRange: ({isDiscrete: true, steps: 1}) + } + // AppProperty { id: activeName; path: "app.traktor.decks." + deckId + ".track.cue.active.name" } + QtObject { + id: activeName + property string description: "Description" + property var value: 0 + property var valueRange: ({isDiscrete: true, steps: 1}) + } + } + + HotCue { id: hotcueModel1; index: 0 } + HotCue { id: hotcueModel2; index: 1 } + HotCue { id: hotcueModel3; index: 2 } + HotCue { id: hotcueModel4; index: 3 } + HotCue { id: hotcueModel5; index: 4 } + HotCue { id: hotcueModel6; index: 5 } + HotCue { id: hotcueModel7; index: 6 } + HotCue { id: hotcueModel8; index: 7 } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/BrowserView.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/BrowserView.qml new file mode 100755 index 000000000000..6436f4153330 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/BrowserView.qml @@ -0,0 +1,322 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Browser' as BrowserView +import '../Widgets' as Widgets + +//---------------------------------------------------------------------------------------------------------------------- +// BROWSER VIEW +// +// The Browser View is connected to traktors QBrowser from which it receives its data model. The navigation through the +// data is done by calling funcrtions invoked from QBrowser. +//---------------------------------------------------------------------------------------------------------------------- + +Item { + id: qmlBrowser + required property var deckInfo + property string propertiesPath: "" + property bool isActive: false + property bool enterNode: false + property bool exitNode: false + property int increment: 0 + property color focusColor: colors.colorDeckBlueBright + property int speed: 150 + property real sortingKnobValue: 0 + property int pageSize: 10 + property int fastScrollCenter: 3 + property bool leftScreen: deckInfo.isLeftScreen(deckInfo.deckId) + + readonly property int maxItemsOnScreen: 8 + + // This is used by the footer to change/display the sorting! + property alias sortingId: browser.sorting + property alias sortingDirection: browser.sortingDirection + property alias isContentList: browser.isContentList + + anchors.fill: parent + + enum WidgetKind { + None, + Searchbar, + Sidebar, + LibraryView + } + + Mixxx.ControlProxy { + id: focusWidget + + group: "[Library]" + key: "focused_widget" + } + + Mixxx.ControlProxy { + group: "[Playlist]" + key: "SelectTrackKnob" + onValueChanged: (value) => { + console.log("SelectTrackKnob", value) + if (value != 0) { + focusWidget.value = BrowserView.WidgetKind.LibraryView; + moveSelectionVertical(value); + } + } + } + + Mixxx.ControlProxy { + group: "[Playlist]" + key: "SelectPrevTrack" + onValueChanged: (value) => { + console.log("SelectPrevTrack", value) + if (value != 0) { + focusWidget.value = BrowserView.WidgetKind.LibraryView; + moveSelectionVertical(-1); + } + } + } + + Mixxx.ControlProxy { + group: "[Playlist]" + key: "SelectNextTrack" + onValueChanged: (value) => { + console.log("SelectNextTrack", value) + if (value != 0) { + focusWidget.value = BrowserView.WidgetKind.LibraryView; + moveSelectionVertical(1); + } + } + } + + Mixxx.ControlProxy { + group: "[Library]" + key: "MoveVertical" + onValueChanged: (value) => { + console.log("MoveVertical", value, focusWidget.value == BrowserView.WidgetKind.LibraryView) + // if (value != 0 && focusWidget.value == BrowserView.WidgetKind.LibraryView) + moveSelectionVertical(value); + } + } + + Mixxx.ControlProxy { + group: "[Library]" + key: "MoveUp" + onValueChanged: (value) => { + console.log("MoveUp", value) + if (value != 0 && focusWidget.value == BrowserView.WidgetKind.LibraryView) + moveSelectionVertical(-1); + } + } + + Mixxx.ControlProxy { + group: "[Library]" + key: "MoveDown" + onValueChanged: (value) => { + console.log("MoveDown", value) + if (value != 0 && focusWidget.value == BrowserView.WidgetKind.LibraryView) + moveSelectionVertical(1); + } + } + + function moveSelectionVertical(value) { + if (value == 0) + return ; + + const rowCount = browser.dataSet.rowCount(); + if (rowCount == 0) + return ; + + browser.currentIndex = Mixxx.MathUtils.positiveModulo(browser.currentIndex + value, rowCount); + } + + //-------------------------------------------------------------------------------------------------------------------- + + onIncrementChanged: { + if (qmlBrowser.increment != 0) { + var newValue = clamp(browser.currentIndex + qmlBrowser.increment, 0, contentList.count - 1); + + // center selection if user is _fast scrolling_ but we're at the _beginning_ or _end_ of the list + if (qmlBrowser.increment >= pageSize) { + var centerTop = fastScrollCenter; + + if (browser.currentIndex < centerTop) { + newValue = centerTop; + } + } + if (qmlBrowser.increment <= (-pageSize)) { + var centerBottom = contentList.count - 1 - fastScrollCenter; + + if (browser.currentIndex > centerBottom) { + newValue = centerBottom; + } + } + + browser.changeCurrentIndex(newValue); + qmlBrowser.increment = 0; + } + } + + onExitNodeChanged: { + if (qmlBrowser.exitNode) { + browser.exitNode() + } + + qmlBrowser.exitNode = false; + } + + //-------------------------------------------------------------------------------------------------------------------- + + onEnterNodeChanged: { + if (qmlBrowser.enterNode) { + var movedDown = browser.enterNode(screen.focusDeckId, contentList.currentIndex); + if (movedDown) { + browser.relocateCurrentIndex() + } + } + + qmlBrowser.enterNode = false; + } + + function clamp(val, min, max) { + return Math.max(min, Math.min(val, max)); + } + + // Traktor.Browser + // { + // id: browser; + // isActive: qmlBrowser.isActive + // } + Item { + id: browser; + property bool changeCurrentIndex: false + property int currentIndex: 0 + property bool currentPath: false + property var dataSet: Mixxx.Library.model + property bool enterNode: false + property bool exitNode: false + property bool iconId: false + property bool isContentList: false + property bool relocateCurrentIndex: false + property bool sorting: false + property bool sortingDirection: false + } + + Rectangle { + id: background + anchors.fill: parent + color: "black" + } + + //-------------------------------------------------------------------------------------------------------------------- + // LIST VIEW -- NEEDS A MODEL CONTAINING THE LIST OF ITEMS TO SHOW AND A DELEGATE TO DEFINE HOW ONE ITEM LOOKS LIKE + //------------------------------------------------------------------------------------------------------------------- + + // zebra filling up the rest of the list if smaller than maxItemsOnScreen (= 8 entries) + Grid { + anchors.top: contentList.top + anchors.topMargin: contentList.topMargin + contentList.contentHeight + 1 // +1 = for spacing + anchors.right: parent.right + anchors.left: parent.left + anchors.leftMargin: 3 + columns: 1 + spacing: 1 + + Repeater { + model: (contentList.count < qmlBrowser.maxItemsOnScreen) ? (qmlBrowser.maxItemsOnScreen - contentList.count) : 0 + Rectangle { + color: ( (contentList.count + index)%2 == 0) ? colors.colorGrey32 : "Black" + width: qmlBrowser.width; + height: settings.browserFontSize*2 } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + + ListView { + id: contentList + anchors.fill: parent + verticalLayoutDirection: ListView.TopToBottom + // the top/bottom margins are applied only at the beginning/end of the list in order to show half entries while scrolling + // and keep the list delegates in the same position always. + + // the commented out margins caused browser anchor problems leading to a disappearing browser! check later !? + anchors.topMargin: 17 // ( (contentList.count < qmlBrowser.maxItemsOnScreen ) || (currentIndex < 4 )) ? 17 : 0 + anchors.bottomMargin: 18 // ( (contentList.count >= qmlBrowser.maxItemsOnScreen) && (currentIndex >= contentList.count - 4)) ? 18 : 0 + clip: false + spacing: 1 + preferredHighlightBegin: 119 - 17 // -17 because of the reduced height due to the topMargin + preferredHighlightEnd: 152 - 17 // -17 because of the reduced height due to the topMargin + highlightRangeMode: ListView.ApplyRange + highlightMoveDuration: 0 + delegate: BrowserView.ListDelegate {id: listDelegate; masterBPM: deckInfo.masterBPM; masterKey: deckInfo.masterKey; keyIndex: deckInfo.keyIndex; isPlaying: deckInfo.isPlaying; adjacentKeys: settings.adjacentKeys;} + model: browser.dataSet + currentIndex: browser.currentIndex + focus: true + cacheBuffer: 10 + visible: settings.showBrowserOnFullScreen ? ((deckInfo.isInBrowserMode && leftScreen) || (deckInfo.viewButton && !deckInfo.isInBrowserMode) || deckInfo.favorites) : true + } + + ListView { + id: contentListRight + anchors.fill: parent + verticalLayoutDirection: ListView.TopToBottom + // the top/bottom margins are applied only at the beginning/end of the list in order to show half entries while scrolling + // and keep the list delegates in the same position always. + + // the commented out margins caused browser anchor problems leading to a disappearing browser! check later !? + anchors.topMargin: 0 // ( (contentList.count < qmlBrowser.maxItemsOnScreen ) || (currentIndex < 4 )) ? 17 : 0 + anchors.bottomMargin: 0 // ( (contentList.count >= qmlBrowser.maxItemsOnScreen) && (currentIndex >= contentList.count - 4)) ? 18 : 0 + clip: false + spacing: 0 + preferredHighlightBegin: 0 // -17 because of the reduced height due to the topMargin + preferredHighlightEnd: 240 // -17 because of the reduced height due to the topMargin + highlightRangeMode: ListView.ApplyRange + highlightMoveDuration: 0 + delegate: BrowserView.TrackView {id: trackView; masterBPM: deckInfo.masterBPM;} + model: browser.dataSet + currentIndex: browser.currentIndex + focus: true + cacheBuffer: 10 + visible: settings.showBrowserOnFullScreen ? (deckInfo.isInBrowserMode && !leftScreen) : false + } + + BrowserView.BrowserHeader { + id: browserHeader + nodeIconId: browser.iconId + currentDeck: deckInfo.deckId + state: "show" + pathStrings: browser.currentPath + + Behavior on height { NumberAnimation { duration: speed; } } + + visible: settings.showBrowserOnFullScreen ? !(deckInfo.isInBrowserMode && !leftScreen) : true + } + + //-------------------------------------------------------------------------------------------------------------------- + + BrowserView.BrowserFooter { + id: browserFooter + state: "show" + propertiesPath: qmlBrowser.propertiesPath + sortingKnobValue: qmlBrowser.sortingKnobValue + maxCount: contentList.count + count: browser.currentIndex + 1 + deckInfo: qmlBrowser.deckInfo + + Behavior on height { NumberAnimation { duration: speed; } } + + visible: settings.showBrowserOnFullScreen ? !(deckInfo.isInBrowserMode && !leftScreen) : true + } + + BrowserView.TrackFooter { + id: trackFooter + state: "show" + propertiesPath: qmlBrowser.propertiesPath + sortingKnobValue: qmlBrowser.sortingKnobValue + maxCount: contentList.count + count: browser.currentIndex + 1 + deckInfo: qmlBrowser.deckInfo + + Behavior on height { NumberAnimation { duration: speed; } } + + visible: settings.showBrowserOnFullScreen ? (deckInfo.isInBrowserMode && !leftScreen) : false + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/Dimensions.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/Dimensions.qml new file mode 100755 index 000000000000..bedc4e594519 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/Dimensions.qml @@ -0,0 +1,15 @@ +import QtQuick 2.15 + +QtObject { + + readonly property real infoBoxesWidth: 150 + readonly property real firstRowHeight: 33 + readonly property real secondRowHeight: 72 + readonly property real thirdRowHeight: 72 + readonly property real spacing: 6 + readonly property real largeBoxWidth: 2*infoBoxesWidth + spacing + readonly property real cornerRadius: 5 + readonly property real screenTopMargin: 3 // might need to be adapted based on the tolerances of hardware manufacturing + readonly property real screenLeftMargin: spacing // might need to be adapted based on the tolerances of hardware manufacturing + readonly property real titleTextMargin: spacing +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/EmptyDeck.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/EmptyDeck.qml new file mode 100755 index 000000000000..5ceca5ff3d5e --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/EmptyDeck.qml @@ -0,0 +1,47 @@ +import QtQuick 2.15 +import '../Overlays' as Overlays +import '../Defines' as Defines +import '../Widgets' as Widgets + +Item { + id: display + anchors.fill: parent + property color deckColor: "black" + property var deckInfo: ({}) + Dimensions {id: dimensions} + + property real infoBoxesWidth: dimensions.infoBoxesWidth + property real firstRowHeight: dimensions.firstRowHeight + + Rectangle { + id: background + color: colors.defaultBackground + anchors.fill: parent + } + + Image { + id: logoImage + anchors.fill: parent + + source: engine.getSetting("idleBackground") || "../../../../../images/templates/logo_mixxx.png" + fillMode: Image.PreserveAspectFit + } + + // DECK HEADER // + // Widgets.DeckHeader + // { + // id: deckHeader + + // title: deckInfo.headerEnabled ? deckInfo.headerText : "Live Input" + // artist: deckInfo.headerEnabled ? deckInfo.headerTextLong : "Live Input" + + // height: display.firstRowHeight-6 + // width: 4*(display.infoBoxesWidth/2+1)+10 + + // anchors.left: parent.left + // anchors.top: parent.top + // anchors.topMargin: 3 + // anchors.leftMargin: 4 + + // } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/StemDeck.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/StemDeck.qml new file mode 100755 index 000000000000..e0a260721422 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/StemDeck.qml @@ -0,0 +1,28 @@ +import QtQuick 2.5 +import '../Widgets' as Widgets +import '../Overlays' as Overlays + +//---------------------------------------------------------------------------------------------------------------------- +// Stem Screen View - UI of the screen for stems +//---------------------------------------------------------------------------------------------------------------------- + +Item { + id: display + + // MODEL PROPERTIES // + required property var deckInfo + + width: 320 + height: 240 + + TrackDeck { + id: trackScreen + deckInfo: display.deckInfo + anchors.fill: parent + } + + // STEM OVERLAY // + Widgets.StemOverlay { + deckInfo: display.deckInfo + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/TrackDeck.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/TrackDeck.qml new file mode 100755 index 000000000000..2fc98a5117a9 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Views/TrackDeck.qml @@ -0,0 +1,222 @@ +import QtQuick 2.5 +import QtQuick.Layouts 1.1 +import '../Waveform' as WF +import '../Overlays' as Overlays + +import '../Widgets' as Widgets + +//---------------------------------------------------------------------------------------------------------------------- +// Track Screen View - UI of the screen for track +//---------------------------------------------------------------------------------------------------------------------- + +Item { + id: display + Dimensions {id: dimensions} + + // MODEL PROPERTIES // + required property var deckInfo + property int deckId: 1 + property real boxesRadius: dimensions.cornerRadius + property real infoBoxesWidth: dimensions.infoBoxesWidth +4 + property real firstRowHeight: dimensions.firstRowHeight + property real secondRowHeight: dimensions.secondRowHeight + property real spacing: dimensions.spacing-3 + property real screenTopMargin: dimensions.screenTopMargin + property real screenLeftMargin: dimensions.screenLeftMargin-2 + + width: 320 + height: 240 + + Rectangle { + id: displayBackground + anchors.fill: parent + color: colors.defaultBackground + } + + Image { + id: emptyTrackDeckImage + anchors.fill: parent + visible: deckInfo.showLogo + + source: engine.getSetting("idleBackground") || "../../../../../images/templates/logo_mixxx.png" + fillMode: Image.PreserveAspectFit + } + + ColumnLayout { + id: content + spacing: display.spacing + + anchors.left: parent.left + anchors.top: parent.top + anchors.topMargin: display.screenTopMargin + anchors.leftMargin: display.screenLeftMargin + + // FIRST ROW // + RowLayout { + id: firstRow + + spacing: 1 + + // DECK HEADER // + Widgets.DeckHeader { + id: deckHeader + + deckInfo: display.deckInfo + + title: deckInfo.headerEnabled ? deckInfo.headerTextShort : deckInfo.titleString + artist: deckInfo.headerEnabled ? deckInfo.headerTextLong : deckInfo.artistString + + height: display.firstRowHeight-6 + width: deckInfo.headerEnabled ? 4*(display.infoBoxesWidth/2+1)+1 : 3*(display.infoBoxesWidth/2+1)+3 + } + + // TIME DISPLAY // + Item { + id: timeBox2 + width: (display.infoBoxesWidth/2+1) + height: display.firstRowHeight-6 + + Rectangle { + anchors.fill: parent + color: trackEndBlinkTimer2.blink ? colors.colorRed : colors.colorDeckGrey + radius: display.boxesRadius + visible: !deckInfo.headerEnabled + } + + Text { + text: settings.timeBox == 0 ? deckInfo.remainingTimeString : settings.timeBox == 1 ? deckInfo.elapsedTimeString : settings.timeBox == 2 ? deckInfo.timeToCue : settings.timeBox == 3 ? deckInfo.beats : settings.timeBox == 4 ? deckInfo.beatsAlt : settings.timeBox == 5 ? deckInfo.beatsToCue : settings.timeBox == 6 ? deckInfo.beatsToCueAlt : deckInfo.remainingTimeString + font.pixelSize: 22 + font.family: "Roboto" + font.weight: Font.Medium + color: settings.timeTextColorChange && trackEndBlinkTimer2.blink ? "black" : "white" + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + visible: !deckInfo.shift && !deckInfo.headerEnabled + } + + Text { + text: settings.timeBoxShift == 0 ? deckInfo.remainingTimeString : settings.timeBoxShift == 1 ? deckInfo.elapsedTimeString : settings.timeBoxShift == 2 ? deckInfo.timeToCue : settings.timeBoxShift == 3 ? deckInfo.beats : settings.timeBoxShift == 4 ? deckInfo.beatsAlt : settings.timeBoxShift == 5 ? deckInfo.beatsToCue : settings.timeBoxShift == 6 ? deckInfo.beatsToCueAlt : deckInfo.remainingTimeString + font.pixelSize: 22 + font.family: "Roboto" + font.weight: Font.Medium + color: settings.timeTextColorChange && trackEndBlinkTimer2.blink ? "black" : "white" + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + visible: deckInfo.shift && !deckInfo.headerEnabled + } + + Timer { + id: trackEndBlinkTimer2 + property bool blink: false + + interval: 500 + repeat: true + running: deckInfo.trackEndWarning + + onTriggered: { + blink = !blink; + } + + onRunningChanged: { + blink = running; + } + } + } + } + + // PHASE METER // + Widgets.PhaseMeter { + id: phase + height: settings.hidePhase ? 0 : 16 + width: 317 + visible: deckInfo.isLoaded + + phase: deckInfo.phase + } + + //WAVEFORM + + property string deckSizeState: "large" + readonly property int waveformHeight: 129 + property bool isInEditMode: false + property bool showLoopSize: true + property string propertiesPath: "" + + WF.WaveformContainer { + id: waveformContainer + + deckInfo: display.deckInfo + + deckId: deckInfo.deckId + deckSizeState: content.deckSizeState + propertiesPath: content.propertiesPath + + // anchors.left: parent.left + width: 316 + // anchors.top: phase.bottom + showLoopSize: content.showLoopSize + isInEditMode: content.isInEditMode + + // the height of the waveform is defined as the remaining space of deckHeight - stripe.height - spacerWaveStripe.height + height: (settings.alwaysShowTempoInfo || deckInfo.adjustEnabled ? (settings.hideWaveformOverview ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38) : (!deckInfo.showBPMInfo ? (settings.hideWaveformOverview ? content.waveformHeight + display.secondRowHeight-13 : content.waveformHeight) : (settings.hideWaveformOverview ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38))) + (settings.hidePhase && settings.hidePhrase ? 16 : 0) + (!settings.hidePhase && !settings.hidePhrase ? -16 : 0) + visible: deckInfo.isLoaded && !settings.hideWaveforms + + Behavior on height { PropertyAnimation { duration: 90} } + } + } + + WF.WaveformOverview { + height: settings.hideWaveformOverview ? 0 : settings.hideWaveforms ? 150 : display.secondRowHeight-13 + width: 314 + anchors.left: parent.left + anchors.leftMargin: 6 + anchors.top: display.top + anchors.topMargin: settings.hideWaveforms ? 90 : 178 + } + + Overlays.TopControls { + id: fx1 + fxUnit: 0 + showHideState: (deckInfo.showFx1 && settings.fxOverlays && !settings.hideEffectsOverlay1) || (deckInfo.padsModeFx1 && (settings.fx1unit == 1)) || (deckInfo.padsModeFx2 && (settings.fx2unit == 1)) ? "show" : "hide" + } + + Overlays.TopControls { + id: fx2 + fxUnit: 1 + showHideState: deckInfo.showFx2 && settings.fxOverlays && !settings.hideEffectsOverlay1 || (deckInfo.padsModeFx1 && (settings.fx1unit == 2)) || (deckInfo.padsModeFx2 && (settings.fx2unit == 2)) ? "show" : "hide" + } + + Overlays.TopControls { + id: fx3 + fxUnit: 2 + showHideState: deckInfo.showFx3 && settings.fxOverlays && !settings.hideEffectsOverlay2 || (deckInfo.padsModeFx1 && (settings.fx1unit == 3)) || (deckInfo.padsModeFx2 && (settings.fx2unit == 3)) ? "show" : "hide" + } + + Overlays.QuickFXSelector { + deckInfo: display.deckInfo + } + + Overlays.TopControls { + id: fx4 + fxUnit: 3 + showHideState: (deckInfo.showFx4 && settings.fxOverlays && !settings.hideEffectsOverlay2 || (deckInfo.padsModeFx1 && (!settings.fx1unit == 4)) ||(deckInfo.padsModeFx2 && (settings.fx2unit == 4))) ? "show" : "hide" + } + + Widgets.TempoAdjust { + id: tempoInfo + deckId: deckInfo.deckId + height: 38 + y: settings.hideWaveformOverview ? 197 : 140 + visible: (deckInfo.isLoaded ? (settings.alwaysShowTempoInfo || deckInfo.adjustEnabled ? true : deckInfo.showBPMInfo) : false) && !settings.hideWaveforms + } + + Widgets.TempoAdjust { + id: tempoInfo2 + deckId: deckInfo.deckId + height: 38 + y: 50 + visible: settings.hideWaveforms + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/StemColorIndicators.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/StemColorIndicators.qml new file mode 100755 index 000000000000..2da71cca02d2 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/StemColorIndicators.qml @@ -0,0 +1,82 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Defines' as Defines +import '../Defines' as Defines +import '../ViewModels' as ViewModels + +Item { + id: view + + property int deckId: 1 + + Defines.Colors {id: colors} + Defines.Settings {id: settings} + + required property var deckInfo + + readonly property int stemCount: deckInfo.stemCount + readonly property var stemColors: ["green", "blue", "red", settings.accentColor] + + property var indicatorHeight: [31 , 31 , 31 , 31] + + //-------------------------------------------------------------------------------------------------------------------- + // There is one pixel space between the color-indicator-rectangles. In this space, you can see the beatgrid/cuePoints, + // which is not what we want. Therefore I added this Rectalgles in the same color as the background. This rectangles hide + // the beatgrid/cuePoints. + Rectangle { x: 0; y: 0; width: 5; height: view.height; color: colors.colorBlack75 } + Rectangle { x: view.width - width; y: 0; width: 5; height: view.height; color: colors.colorBlack75 } + + //-------------------------------------------------------------------------------------------------------------------- + + readonly property var deckPlayer: Mixxx.PlayerManager.getPlayer(`[Channel${deckId}]`) + readonly property var currentPlayer: deckPlayer.currentPlayer + + function indicatorY(index) { + var y = 0; + for (var i=0; i 1 ? 2 : 1) + // width: view.width + // height: 31 + // clip: true + + // deckId: view.deckId + // streamId: index + 1 + // sampleWidth: view.sampleWidth + // waveformPosition: view.waveformPosition + // waveformColors: colors.getWaveformColors(colorIds[index]) + // } + // } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml index 92a9e7424451..a08c7c66b81d 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformContainer.qml @@ -72,8 +72,7 @@ Item { group: `[Channel${view.deckId}]` x: 0 width: 316 - // height: (settings.alwaysShowTempoInfo || deckInfo.adjustEnabled ? (settings.hideStripe ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38) : (!deckInfo.showBPMInfo ? (settings.hideStripe ? content.waveformHeight + display.secondRowHeight-13 : content.waveformHeight) : (settings.hideStripe ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38))) + (settings.hidePhase && settings.hidePhrase ? 16 : 0) + (!settings.hidePhase && !settings.hidePhrase ? -16 : 0) - height: view.height + height: (settings.alwaysShowTempoInfo || deckInfo.adjustEnabled ? (settings.hideWaveformOverview ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38) : (!deckInfo.showBPMInfo ? (settings.hideWaveformOverview ? content.waveformHeight + display.secondRowHeight-13 : content.waveformHeight) : (settings.hideWaveformOverview ? content.waveformHeight + display.secondRowHeight-51 : content.waveformHeight-38))) + (settings.hidePhase && settings.hidePhrase ? 16 : 0) + (!settings.hidePhase && !settings.hidePhrase ? -16 : 0) Behavior on height { PropertyAnimation { duration: 90} } anchors.fill: parent @@ -82,6 +81,7 @@ Item { Mixxx.WaveformRendererEndOfTrack { color: 'blue' + endOfTrackWarningTime: 30 } Mixxx.WaveformRendererPreroll { @@ -124,12 +124,19 @@ Item { lowColor: 'red' midColor: 'green' highColor: 'blue' + + gainAll: 1.5 + gainLow: 1.0 + gainMid: 1.0 + gainHigh: 1.0 } - Mixxx.WaveformRendererStem { } + Mixxx.WaveformRendererStem { + gainAll: 1.5 + } Mixxx.WaveformRendererBeat { - color: '#cfcfcf' + color: settings.hideBeatgrid ? 'transparent' : Qt.rgba(0.81, 0.81, 0.81, settings.beatgridVisibility) } Mixxx.WaveformRendererMark { @@ -142,10 +149,10 @@ Item { text: " %1 " } - untilMark.showTime: true - untilMark.showBeats: true - untilMark.align: Qt.AlignBottom - untilMark.textSize: 14 + untilMark.showTime: settings.showTimeToCue + untilMark.showBeats: settings.showBeatToCue + untilMark.align: settings.distanceToCueAlignment == "bottom" ? Qt.AlignBottom : settings.distanceToCueAlignment == "top" ? Qt.AlignTop : Qt.AlignCenter + untilMark.textSize: settings.distanceToCueFontSize Mixxx.WaveformMark { control: "cue_point" diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformOverview.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformOverview.qml new file mode 100644 index 000000000000..7f48abeafb98 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Waveform/WaveformOverview.qml @@ -0,0 +1,228 @@ +import QtQuick 2.15 +import QtQuick.Window 2.15 + +import "." as Skin +import Mixxx 1.0 as Mixxx + +Item { + id: waveform + + property int deckId: deckInfo.deckId + + readonly property string group: `[Channel${deckId}]` + + layer.enabled: true + + Item { + id: progression + + property real windowWidth: Window.width + Mixxx.ControlProxy { + id: propPosition + group: waveform.group + key: "playposition" + } + + Mixxx.ControlProxy { + id: propVisible + group: waveform.group + key: "track_loaded" + } + + width: propPosition.value * (320 - 12) + visible: propVisible.value + + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: parent.bottom + + clip: true + + Rectangle { + anchors.fill: parent + anchors.leftMargin: -border.width + anchors.topMargin: -border.width + anchors.bottomMargin: -border.width + border.width: 2 + border.color:"black" + color: Qt.rgba(0.39, 0.80, 0.96, 0.3) + } + } + + Mixxx.WaveformOverview { + readonly property var player: Mixxx.PlayerManager.getPlayer(waveform.group) + id: waveformOverview + anchors.fill: parent + anchors.topMargin: 6 + + track: player.currentTrack + } + + Mixxx.ControlProxy { + id: samplesControl + + group: waveform.group + key: "track_samples" + } + + // // Hotcue + // Repeater { + // model: 16 + + // S4MK3.HotcuePoint { + // required property int index + + // Mixxx.ControlProxy { + // id: samplesControl + + // group: waveform.group + // key: "track_samples" + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // Mixxx.ControlProxy { + // id: hotcueEnabled + // group: waveform.group + // key: `hotcue_${index + 1}_status` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // Mixxx.ControlProxy { + // id: hotcuePosition + // group: waveform.group + // key: `hotcue_${index + 1}_position` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // Mixxx.ControlProxy { + // id: hotcueColor + // group: waveform.group + // key: `hotcue_${number}_color` + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // anchors.top: parent.top + // // anchors.left: parent.left + // anchors.bottom: parent.bottom + // visible: hotcueEnabled.value + + // number: this.index + 1 + // type: S4MK3.HotcuePoint.Type.OneShot + // position: hotcuePosition.value / samplesControl.value + // color: `#${(hotcueColor.value >> 16).toString(16).padStart(2, '0')}${((hotcueColor.value >> 8) & 255).toString(16).padStart(2, '0')}${(hotcueColor.value & 255).toString(16).padStart(2, '0')}` + // } + // } + + // // Intro + // S4MK3.HotcuePoint { + + // Mixxx.ControlProxy { + // id: introStartEnabled + // group: waveform.group + // key: `intro_start_enabled` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // Mixxx.ControlProxy { + // id: introStartPosition + // group: waveform.group + // key: `intro_start_position` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // anchors.top: parent.top + // anchors.bottom: parent.bottom + // visible: introStartEnabled.value + + // type: S4MK3.HotcuePoint.Type.IntroIn + // position: introStartPosition.value / samplesControl.value + // } + + // // Extro + // S4MK3.HotcuePoint { + + // Mixxx.ControlProxy { + // id: introEndEnabled + // group: waveform.group + // key: `intro_end_enabled` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // Mixxx.ControlProxy { + // id: introEndPosition + // group: waveform.group + // key: `intro_end_position` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // anchors.top: parent.top + // anchors.bottom: parent.bottom + // visible: introEndEnabled.value + + // type: S4MK3.HotcuePoint.Type.IntroOut + // position: introEndPosition.value / samplesControl.value + // } + + // // Loop in + // S4MK3.HotcuePoint { + // Mixxx.ControlProxy { + // id: loopStartPosition + // group: waveform.group + // key: `loop_start_position` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // anchors.top: parent.top + // anchors.bottom: parent.bottom + // visible: loopStartPosition.value > 0 + + // type: S4MK3.HotcuePoint.Type.LoopIn + // position: loopStartPosition.value / samplesControl.value + // } + + // // Loop out + // S4MK3.HotcuePoint { + // Mixxx.ControlProxy { + // id: loopEndPosition + // group: waveform.group + // key: `loop_end_position` + + // onValueChanged: (value) => { + // redraw(waveform) + // } + // } + + // anchors.top: parent.top + // anchors.bottom: parent.bottom + // visible: loopEndPosition.value > 0 + + // type: S4MK3.HotcuePoint.Type.LoopOut + // position: loopEndPosition.value / samplesControl.value + // } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/BpmDisplay.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/BpmDisplay.qml new file mode 100755 index 000000000000..8ab0a41e58bb --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/BpmDisplay.qml @@ -0,0 +1,27 @@ +import QtQuick 2.15 + +Item { + anchors.fill: parent + property int deckId: 0 + + Rectangle { + id: bpmBackground + width: 60 + height: 20 + color: colors.grayBackground + anchors.right: parent.right + anchors.bottom: parent.bottom + } + + Text { + text: deckInfo.bpmString + color: "white" + font.pixelSize: 17 + font.family: "Pragmatica" + anchors.fill: bpmBackground + anchors.rightMargin: 2 + anchors.topMargin: 1 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/DeckHeader.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/DeckHeader.qml new file mode 100755 index 000000000000..34c61544f924 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/DeckHeader.qml @@ -0,0 +1,90 @@ +import QtQuick 2.5 +import '../Defines' as Defines +import '../Defines' as Defines + +//here we assume that `colors` and `dimensions` already exists in the object hierarchy +Item { + id: widget + + property string title: '' + property string artist: '' + property color backgroundColor: colors.defaultBackground + height: dimensions.firstRowHeight + property int radius: dimensions.cornerRadius + + Defines.Settings {id: settings} + Defines.Colors {id: colors} + + required property var deckInfo + + property int deckA: deckInfo.deckAColor + property int deckB: deckInfo.deckBColor + property int deckC: deckInfo.deckCColor + property int deckD: deckInfo.deckDColor + + function colorForDeck(deckId,deckA,deckB,deckC,deckD) { + switch (deckId) { + case 1: return colorForDeckSingle(deckA); + case 2: return colorForDeckSingle(deckB); + case 3: return colorForDeckSingle(deckC); + default: return colorForDeckSingle(deckD); + } + } + + function colorForDeckSingle(deck) { + switch (deck) { + case 0: return colors.red; + case 1: return colors.darkOrange; + case 2: return colors.lightOrange; + case 3: return colors.warmYellow; + case 4: return colors.yellow; + case 5: return colors.lime; + case 6: return colors.green; + case 7: return colors.mint; + case 8: return colors.cyan; + case 9: return colors.turquoise; + case 10: return colors.blue; + case 11: return colors.plum; + case 12: return colors.violet; + case 13: return colors.purple; + case 14: return colors.magenta; + case 15: return colors.fuchsia; + default: return colors.white; + } + } + + Rectangle { + id: headerBg + color: colorForDeck(deckInfo.deckId,deckA,deckB,deckC,deckD) + anchors.fill: parent + radius: widget.radius + + Text { + anchors.fill: parent + anchors.leftMargin: 4 + anchors.rightMargin: 2 + anchors.topMargin: 2 + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 20 + color: "black" + text: widget.title + elide: Text.ElideRight + visible: deckInfo.shift ? false : true + } + + Text { + anchors.fill: parent + anchors.leftMargin: 4 + anchors.rightMargin: 2 + anchors.topMargin: 2 + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 20 + color: "black" + text: widget.artist + elide: Text.ElideRight + visible: deckInfo.shift ? true : false + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/KeyDisplay.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/KeyDisplay.qml new file mode 100755 index 000000000000..fd3f3ac53fd0 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/KeyDisplay.qml @@ -0,0 +1,46 @@ +import '../Defines' as Defines + +import QtQuick 2.15 + +Item { + anchors.fill: parent + + Defines.Colors { + id: colors + } + + property int deckId: 0 + + Rectangle { + id: keyBackground + width: 60 + height: 20 + color: deckInfo.isKeyLockOn ? colors.musicalKeyColors[deckInfo.keyIndex] : colors.musicalKeyColorsDark[deckInfo.keyIndex] + anchors.right: parent.right + anchors.top: parent.top + Rectangle { + id: keyBorder + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + width: keyBackground.width -2 + height: keyBackground.height -2 + color: "transparent" + border.color: colors.defaultBackground + border.width: 2 + } + } + + Text { + text: deckInfo.hasKey && (deckInfo.keyAdjustString != "-0") && (deckInfo.keyAdjustString != "+0") ? (settings.camelotKey ? utils.camelotConvert(deckInfo.keyString) : deckInfo.keyString) + deckInfo.keyAdjustString + : deckInfo.hasKey ? (settings.camelotKey ? utils.camelotConvert(deckInfo.keyString) : deckInfo.keyString) + : "No key" + color: deckInfo.isKeyLockOn ? "black" : "white" + font.pixelSize: 15 + font.family: "Pragmatica" + anchors.fill: keyBackground + anchors.rightMargin: 2 + anchors.topMargin: 1 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/LoopSize.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/LoopSize.qml new file mode 100755 index 000000000000..454fc3d3c5d8 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/LoopSize.qml @@ -0,0 +1,87 @@ +import QtQuick 2.15 + +import Mixxx 1.0 as Mixxx + +import '../Defines' as Defines + +Item { + anchors.fill: parent + + Defines.Colors {id: colors} + Defines.Durations { id: durations } + + Mixxx.ControlProxy { + group: `[Channel${parent.deckId}]` + key: "beatloop_size" + id: loopSize + property string description: "Description" + } + + property int deckId: 0 + + property color loopActiveColor: colors.cueColors[settings.cueLoopColor] + property color loopDimmedColor: colors.cueColorsDark[settings.cueLoopColor] + + Rectangle { + id: loopSizeBackground + width: 40 + height: width + radius: width * 0.5 + opacity: loopActiveBlinkTimer.blink ? 0.25 : 1 + color: deckInfo.loopActive ? (loopActiveBlinkTimer.blink ? loopActiveColor : (settings.loopActiveRedFlash ? colors.colorRed : loopDimmedColor)) + : deckInfo.loopActive ? (deckInfo.shift ? loopDimmedColor : loopActiveColor) + : deckInfo.shift ? colors.colorDeckDarkGrey : colors.colorDeckGrey + Behavior on opacity { NumberAnimation { duration: durations.mainTransitionSpeed; easing.type: Easing.Linear} } + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + Rectangle { + id: loopLengthBorder + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + width: loopSizeBackground.width -2 + height: width + radius: width * 0.5 + color: "transparent" + border.color: loopActiveColor + border.width: 2 + } + } + + Text { + text: loopSize.value < 1/8 ? `/${1 / loopSize.value}` : loopSize.value < 1 ? `1/${1 / loopSize.value}` : `${loopSize.value}` + color: deckInfo.loopActive ? "black" : ( deckInfo.shift ? colors.colorDeckGrey : colors.defaultTextColor ) + font.pixelSize: fonts.extraLargeValueFontSize + font.family: "Pragmatica" + anchors.fill: loopSizeBackground + anchors.rightMargin: 2 + anchors.topMargin: 1 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + onTextChanged: { + if (loopSize.value < 1) { + font.pixelSize = 18 + } else if ( loopSize.value > 8 ) { + font.pixelSize = 24 + } else { + font.pixelSize = 25 + } + } + } + + Timer { + id: loopActiveBlinkTimer + property bool blink: false + + interval: 333 + repeat: true + running: deckInfo.loopActive + + onTriggered: { + blink = !blink; + } + + onRunningChanged: { + blink = running; + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/PhaseMeter.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/PhaseMeter.qml new file mode 100755 index 000000000000..236d691fdab0 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/PhaseMeter.qml @@ -0,0 +1,94 @@ +import QtQuick 2.5 +import '../Defines' as Defines + +Item { + id: widget + + height: 16 + + function colorForPhase(phase) { + switch (phase) { + case 0: return colors.red; + case 1: return colors.darkOrange; + case 2: return colors.lightOrange; + case 3: return colors.phaseColor; + case 4: return colors.yellow; + case 5: return colors.lime; + case 6: return colors.green; + case 7: return colors.mint; + case 8: return colors.cyan; + case 9: return colors.turquoise; + case 10: return colors.blue; + case 11: return colors.plum; + case 12: return colors.violet; + case 13: return colors.purple; + case 14: return colors.magenta; + case 15: return colors.fuchsia; + case 16: return colors.colorWhite; + } + return colors.lightOrange; + } + + property real phase: 0.0 + + Defines.Settings {id: settings} + property int phaseAColor: settings.phaseAColor + property int phaseBColor: settings.phaseBColor + property int phaseCColor: settings.phaseCColor + property int phaseDColor: settings.phaseDColor + property int deckId: deckInfo.deckId + + property color phaseColor: colorForPhase(deckId == 1 ? phaseAColor : deckId == 2 ? phaseBColor : deckId == 3 ? phaseCColor : phaseDColor) + property color phaseHeadColor: "#FCB262" + property color separatorColor: "#88ffffff" + property color backgroundColor: colors.grayBackground + property real phasePosition: parent.width * (0.5 + widget.phase) + property real phaseBarWidth: parent.width * Math.abs(widget.phase) + + // Background + Rectangle { + anchors.fill: parent + color: widget.backgroundColor + } + + // Phase Bar + Rectangle { + color: widget.phaseColor + height: parent.height + width: phaseBarWidth + x: widget.phase < 0 ? widget.phasePosition : (parent.width/2) + } + + // Phase Head + Rectangle { + color: widget.phaseHeadColor + height: parent.height + width: 1 + x: widget.phase < 0 ? widget.phasePosition : (widget.phasePosition - width) + visible: Math.round(phaseBarWidth) !== 0 // hide phase head when phase is 0 + } + + // Separator at 0.25 + Rectangle { + color: widget.separatorColor + height: parent.height + width: 1 + x: parent.width * 0.25 - 1 + } + + // center Separator + Rectangle { + color: widget.separatorColor + height: parent.height + width: 1 + x: parent.width * 0.50 - 1 + } + + // Separator at 0.75 + Rectangle { + color: widget.separatorColor + height: parent.height + width: 1 + x: parent.width * 0.75 - 1 + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/ProgressBar.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/ProgressBar.qml new file mode 100755 index 000000000000..6c8c25dcd4cd --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/ProgressBar.qml @@ -0,0 +1,60 @@ +import QtQuick 2.15 + +import '../Defines' as Defines + +Item { + + id: progressBarContainer + + Defines.Colors { id: colors} + Defines.Settings { id: settings} + + property color progressBarColorIndicatorLevel: settings.accentColor // set from outside + property real value: 0.0 + property bool drawAsEnabled: true + + property alias progressBarWidth: progressBar.width + property alias progressBarHeight: progressBarContainer.height + property alias progressBarBackgroundColor: progressBar.color // set from outside + + onValueChanged: { + var val = Math.max( Math.min(value, 1.0), 0.0) + valueIndicator.width = val * (progressBar.width - 3) + } + + height: 6 + width: 80 + + // Progress Background + Rectangle { + id: progressBar + + anchors.left: parent.left + anchors.top: parent.top + height: parent.height + width: 102 // default value - set from outside + + color: colors.colorWhite09 // set in BottomInfoDetails + + // Progress Level + Rectangle { + id: valueIndicator + width: 0 // set in parent + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + color: progressBarContainer.progressBarColorIndicatorLevel + visible: drawAsEnabled ? true : false + } + // Progress Indicator Thumb + Rectangle { + id: indicatorThumb + color: colors.colorWhite + width: 2 + height: parent.height + anchors.verticalCenter: parent.verticalCenter + anchors.left: valueIndicator.right + visible: drawAsEnabled ? true : false + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/Slider.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/Slider.qml new file mode 100755 index 000000000000..23206eeb43cd --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/Slider.qml @@ -0,0 +1,111 @@ +import QtQuick 2.5 + +Item { + id: item + property color backgroundColor: "grey" + property color sliderColor: "red" + property color cursorColor: "white" + property color centerColor: "black" + + property real min: 0 + property real max: 1 + property real value: 0.5 + property real radius: 0 + property real cursorWidth: 5 + property bool centered: false + + Item { + id: toBeMasked_noCenter + anchors.fill: parent + + property real cursorPosition: (parent.width - item.cursorWidth) * ( item.value / (item.max-item.min) ) + + //background + Rectangle { + anchors.fill: parent + color: item.backgroundColor + } + + //colored part of the slider + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + width: toBeMasked_noCenter.cursorPosition + height: parent.height + + color: item.sliderColor + } + + //cursor + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: toBeMasked_noCenter.cursorPosition + width: item.cursorWidth + height: parent.height + color: item.cursorColor + } + + visible: false + } + + Item { + id: toBeMasked_centered + anchors.fill: parent + property real x0: (parent.width - item.cursorWidth)/2 + property real cursorPosition_left: Math.min( toBeMasked_noCenter.cursorPosition, x0) + property real cursorPosition_right: Math.max( toBeMasked_noCenter.cursorPosition, x0) + + //cursor background + Rectangle { + id: background + anchors.fill: parent + color: item.backgroundColor + } + + //filled slider + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: toBeMasked_centered.cursorPosition_left + width: toBeMasked_centered.cursorPosition_right - toBeMasked_centered.cursorPosition_left + height: parent.height + color: item.sliderColor + } + + //center + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: toBeMasked_centered.x0 + width: item.cursorWidth + height: parent.height + color: item.centerColor + } + + //cursor + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: toBeMasked_noCenter.cursorPosition + width: item.cursorWidth + height: parent.height + color: item.cursorColor + } + + visible: false + } + + Rectangle { + id: mask_noCenter + anchors.fill: parent + radius: item.radius + visible: false + } + + // OpacityMask { + // anchors.fill: parent + // maskSource: mask_noCenter + // source: item.centered ? toBeMasked_centered : toBeMasked_noCenter + // } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StateBar.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StateBar.qml new file mode 100755 index 000000000000..226c7cf1036f --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StateBar.qml @@ -0,0 +1,34 @@ +import QtQuick 2.15 + +import '../Defines' as Defines + +// StateBar fits 'state count' elements into a bar of a given width and spacing. Take care that 'width > stateCount*spacing' +Item { + id: stateBarContainer + + property int spacing: 2 // default value. set from outside + property int stateCount: 5 // default value. set from outside + property int currentState: 2 // default value. set from outside + property color barColor: colors.colorIndicatorLevelOrange // default value. set from outside + property color barBgColor: colors.colorGrey24 // default value. set from outside + + property alias stateBarHeight: stateBarContainer.height + readonly property real stateBarWidth: width/stateCount - spacing + + Defines.Colors { id: colors} + + Row { + id: boxRow + anchors.fill: parent + anchors.leftMargin: 0.5*stateBarContainer.spacing + spacing: stateBarContainer.spacing + Repeater { + model: stateCount + Rectangle { + width: stateBarWidth + height: stateBarHeight + color: (index == currentState) ? barColor : barBgColor + } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StemOverlay.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StemOverlay.qml new file mode 100755 index 000000000000..37c8497e06e1 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/StemOverlay.qml @@ -0,0 +1,257 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.1 +import '../Views' + +import '../Defines' as Defines + +//---------------------------------------------------------------------------------------------------------------------- +// Remix Deck Overlay - for sample volume and filter value editing +//---------------------------------------------------------------------------------------------------------------------- + +Item { + id: display + + required property var deckInfo + + Dimensions {id: dimensions} + Defines.Colors { id: colors } + Defines.Durations { id: durations } + Defines.Settings {id: settings} + + // MODEL PROPERTIES // + property string showHideState: "hide" + property int bottomMargin: 0 + property int yPositionWhenHidden: 240 + property int yPositionWhenShown: (195 - bottomMargin) + + readonly property string name: display.deckInfo.stemSelectedName + + state: display.deckInfo.stemSelected ? "show" : "hide" + height: 40 + anchors.left: parent.left + anchors.right: parent.right + + // dark grey background + Rectangle { + id: bottomInfoDetailsPanelDarkBg + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: display.height + color: colors.colorFxHeaderBg + // light grey background + Rectangle { + id:bottomInfoDetailsPanelLightBg + anchors { + top: parent.top + left: parent.left + } + height: display.height + width: 105 + color: colors.colorFxHeaderLightBg + } + } + +// // dividers + Rectangle { + id: fxInfoDivider0 + width:1; + height:63; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 105 + } + + Rectangle { + id: fxInfoDivider2 + width:1; + color: colors.colorDivider + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 195 + height: display.height + } + + // Info Details + Rectangle { + id: bottomInfoDetailsPanel + + height: parent.height + clip: true + width: parent.width + color: "transparent" + + anchors.left: parent.left + anchors.leftMargin: 1 + + Row { + Item { + id: stemInfoDetailsPanel + + height: display.height + width: 110 + + // name + Text { + id: stemInfoName + font.capitalization: Font.AllUppercase + text: "NAME" + color: settings.accentColor + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + + // value + Text { + id: nameValue + font.capitalization: Font.AllUppercase + text: name + color: display.deckInfo.stemSelectedMidColor + anchors.bottom: parent.bottom + anchors.bottomMargin: 1 + anchors.left: parent.left + anchors.right: parent.right + font.pixelSize: fonts.scale(18) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + } + + Item { + id: volumeInfoDetailsPanel + + height: display.height + width: 85 + + // volume + Text { + id: volumeInfoName + font.capitalization: Font.AllUppercase + text: "VOLUME" + color: !display.deckInfo.stemSelectedMuted ? settings.accentColor : "grey" + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + + // value + ProgressBar { + id: volume + progressBarHeight: 9 + progressBarWidth: 76 + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.bottomMargin: 3 + + anchors.leftMargin: 5 + anchors.rightMargin: 20 + + value: display.deckInfo.stemSelectedVolume + + drawAsEnabled: true + progressBarColorIndicatorLevel: display.deckInfo.stemSelectedMuted ? "grey" : settings.accentColor + progressBarBackgroundColor: "black" + } + } + + Item { + id: fxInfoDetailsPanel + + height: display.height + width: 125 + + // fx name + Text { + id: fxInfoSampleName + + font.capitalization: Font.AllUppercase + text: display.deckInfo.stemSelectedQuickFXName + color: display.deckInfo.stemSelectedQuickFXOn ? settings.accentColor : "grey" + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + font.pixelSize: fonts.scale(13.5) + anchors.leftMargin: 4 + elide: Text.ElideRight + } + + // value + ProgressBar { + id: quickfx + progressBarHeight: 9 + progressBarWidth: 115 + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.rightMargin: 20 + anchors.bottomMargin: 3 + anchors.leftMargin: 5 + + value: display.deckInfo.stemSelectedQuickFXValue + visible: fxInfoSampleName.text !== "---" + + drawAsEnabled: true + progressBarColorIndicatorLevel: display.deckInfo.stemSelectedQuickFXOn ? settings.accentColor : "grey" + progressBarBackgroundColor: "black" + } + } + + // StemInfoDetails { + // id: bottomInfoDetails3 + // finalValue: (type == 0 ? "Cue" : type == 1 ? "Fade-In" : type == 2 ? "Fade-Out" : type == 3 ? "Load" : type == 4 ? "Grid" : type == 5 ? "Loop" : "-") + // finalLabel: "TYPE" + // width: 50 + // } + } + } + + // black border & shadow + Rectangle { + id: headerBlackLine + anchors.top: display.bottom + width: parent.width + color: colors.colorBlack + height: 2 + } + Rectangle { + id: headerShadow + anchors.left: parent.left + anchors.right: parent.right + anchors.top: headerBlackLine.bottom + height: 6 + gradient: Gradient { + GradientStop { position: 1.0; color: colors.colorBlack0 } + GradientStop { position: 0.0; color: colors.colorBlack63 } + } + visible: false + } + + //------------------------------------------------------------------------------------------------------------------ + // STATES + //------------------------------------------------------------------------------------------------------------------ + + Behavior on y { PropertyAnimation { duration: durations.mainTransitionSpeed; easing.type: Easing.InOutQuad } } + + states: [ + State { + name: "show"; + PropertyChanges { target: display; y: yPositionWhenShown} + }, + State { + name: "hide"; + PropertyChanges { target: display; y: yPositionWhenHidden} + } + ] +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TempoAdjust.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TempoAdjust.qml new file mode 100755 index 000000000000..2fd23c0b29cf --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TempoAdjust.qml @@ -0,0 +1,184 @@ +import QtQuick 2.15 + +import '../Defines' as Defines + +Item { + id: tempoAdjust + Defines.Margins {id: customMargins } + Defines.Settings {id: settings} + + readonly property bool shift: deckInfo.shift + + property int deckId: 0 + + function getHeader(headerID) { + switch(headerID) { + case 0: + return ""; + case 1: + return "Master BPM"; + case 2: + return "BPM"; + case 3: + return "Tempo"; + case 4: + return "BPM Offset"; + case 5: + return "Tempo Offset"; + case 6: + return "Master Deck"; + case 7: + return "Tempo Range"; + case 8: + return "Key"; + case 9: + return "Original BPM"; + } + } + + function getValue(valueID) { + switch(valueID) { + case 0: + return ""; + case 1: + return deckInfo.masterBPMShort; + case 2: + return deckInfo.bpmString; + case 3: + return deckInfo.tempoStringPer; + case 4: + return (deckInfo.masterDeck == tempoAdjust.deckId) ? "0.00" : deckInfo.bpmOffset; + case 5: + return (deckInfo.masterDeck == tempoAdjust.deckId) ? "0.00%" : deckInfo.tempoNeededString; + case 6: + return deckInfo.masterDeckLetter + case 7: + return deckInfo.tempoRange + case 8: + return deckInfo.hasKey && (deckInfo.keyAdjustString != "-0") && (deckInfo.keyAdjustString != "+0") ? (settings.camelotKey ? utils.camelotConvert(deckInfo.keyString) : deckInfo.keyString) + deckInfo.keyAdjustString : deckInfo.hasKey ? (settings.camelotKey ? utils.camelotConvert(deckInfo.keyString) : deckInfo.keyString) : "No key"; + case 9: + return deckInfo.songBPM + } + } + + function getColor(valueID) { + switch(valueID) { + case 0: + return "white"; + case 1: + return settings.enableMasterBpmTextColor ? ((deckInfo.masterDeck == deckInfo.deckId) ? colors.loopActiveColor : colors.lightOrange) : "white"; + case 2: + return settings.enableBpmTextColor ? ((deckInfo.masterDeck == tempoAdjust.deckId) || ((deckInfo.bpmOffset <= 0.05) && (deckInfo.bpmOffset >= - 0.05)) ? colors.loopActiveColor : colors.lightOrange) : "white"; + case 3: + return settings.enableTempoTextColor ? ((deckInfo.tempoString <= 0.05) && (deckInfo.tempoString >= - 0.05) ? colors.loopActiveColor : colors.lightOrange) : "white"; + case 4: + return settings.enableBpmOffsetTextColor ? ((deckInfo.masterDeck == tempoAdjust.deckId) || ((deckInfo.bpmOffset <= 0.05) && (deckInfo.bpmOffset >= - 0.05)) ? colors.loopActiveColor : colors.lightOrange) : "white"; + case 5: + return settings.enableTempoOffsetTextColor ? ((deckInfo.masterDeck == tempoAdjust.deckId) || ((deckInfo.tempoNeededVal <= 0.05) && (deckInfo.tempoNeededVal >= - 0.05)) ? colors.loopActiveColor : colors.lightOrange) : "white"; + case 6: + return settings.enableMasterDeckTextColor ? ((deckInfo.masterDeck == deckInfo.deckId) ? colors.loopActiveColor : colors.lightOrange) : "white"; + case 7: + return "white" + case 8: + return deckInfo.isKeyLockOn ? colors.musicalKeyColors[deckInfo.keyIndex] : "white" + case 9: + return "white" + } + } + + Rectangle { + id: tempoBackground + width: 320 + height: 38 + + color: colors.grayBackground + // headline + Text { + anchors.top: tempoBackground.top + anchors.topMargin: 0 + anchors.left: tempoBackground.left + anchors.leftMargin: 3 + font.pixelSize: 15 + color: settings.accentColor + text: shift ? getHeader(settings.tempoDisplayLeftShift) : getHeader(settings.tempoDisplayLeft) + } + + // value + Text { + anchors.bottom: tempoBackground.bottom + anchors.bottomMargin: 0 + anchors.left: tempoBackground.left + anchors.leftMargin: 3 + font.pixelSize: 20 + font.family: "Pragmatica" + color: shift ? getColor(settings.tempoDisplayLeftShift) : getColor(settings.tempoDisplayLeft) + text: shift ? getValue(settings.tempoDisplayLeftShift) : getValue(settings.tempoDisplayLeft) + } + + // headline + Text { + anchors.top: tempoBackground.top + anchors.topMargin: 0 + anchors.left: tempoBackground.left + anchors.leftMargin: 100 + font.pixelSize: 15 + color: settings.accentColor + text: shift ? getHeader(settings.tempoDisplayCenterShift) : getHeader(settings.tempoDisplayCenter) + } + + // value + Text { + + anchors.bottom: tempoBackground.bottom + anchors.bottomMargin: 0 + anchors.left: tempoBackground.left + anchors.leftMargin: 100 + font.pixelSize: 20 + font.family: "Pragmatica" + color: shift ? getColor(settings.tempoDisplayCenterShift) : getColor(settings.tempoDisplayCenter) + text: shift ? getValue(settings.tempoDisplayCenterShift) : getValue(settings.tempoDisplayCenter) + } + + // headline + Text { + anchors.top: tempoBackground.top + anchors.topMargin: 0 + anchors.left: tempoBackground.left + anchors.leftMargin: 216 + font.pixelSize: 15 + color: settings.accentColor + text: shift ? getHeader(settings.tempoDisplayRightShift) : getHeader(settings.tempoDisplayRight) + } + + // value + Text { + + anchors.bottom: tempoBackground.bottom + anchors.bottomMargin: 0 + anchors.left: tempoBackground.left + anchors.leftMargin: 216 + font.pixelSize: 20 + font.family: "Pragmatica" + color: shift ? getColor(settings.tempoDisplayRightShift) : getColor(settings.tempoDisplayRight) + text: shift ? getValue(settings.tempoDisplayRightShift) : getValue(settings.tempoDisplayRight) + } + } + + Rectangle { + width: 1 + height: 38 + color: "#88ffffff" + anchors.top: tempoBackground.top + anchors.left: tempoBackground.left + anchors.leftMargin: 97 + } + + Rectangle { + width: 1 + height: 38 + color: "#88ffffff" + anchors.top: tempoBackground.top + anchors.left: tempoBackground.left + anchors.leftMargin: 213 + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TrackRating.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TrackRating.qml new file mode 100755 index 000000000000..b3857271a216 --- /dev/null +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/AdvancedScreen/Widgets/TrackRating.qml @@ -0,0 +1,42 @@ +import QtQuick 2.15 + +Item { + id: trackRating + + property int rating: 0 + readonly property variant ratingMap: { '-1': 0, '0': 0, '51': 1, '1': 1, '64': 2, '102': 2, '153': 3, '196': 4, '204': 4, '252': 5, '255': 5 } + readonly property int nrRatings: 5 + + width: 20 + height: 133 + + //-------------------------------------------------------------------------------------------------------------------- + + Rectangle { + id: ratingStars + anchors.left: parent.left + height: 40 + width: 170 + color: "transparent" + visible: ratingMap[trackRating.rating] <= nrRatings + + Row { + id: rowSmall + anchors.left: parent.left + anchors.top: parent.top + height: parent.height + spacing: 2 + // Repeater { + // model: (5 -(nrRatings - ratingMap[trackRating.rating])) + // Image { + // id: star + // source: "../Images/star.png" + // clip: true + // cache: true + // height: 34 + // width: 34 + // } + // } + } + } +} diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml index c49800618f21..43260bfda898 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/BPMIndicator.qml @@ -21,31 +21,33 @@ Rectangle { border.color: smallBoxBorder border.width: 2 - signal updated + Mixxx.ControlProxy { + id: bpm + group: root.group + key: "bpm" + } + + Mixxx.ControlProxy { + id: rateRange + group: root.group + key: "rateRange" + } Text { id: indicator - text: "-" + text: bpm.value > 0 ? bpm.value.toFixed(2) : "-" font.pixelSize: 17 color: fontColor anchors.centerIn: parent - - Mixxx.ControlProxy { - group: root.group - key: "bpm" - onValueChanged: (value) => { - const newValue = value.toFixed(2); - if (newValue === indicator.text) return; - indicator.text = newValue; - root.updated() - } - } } Text { id: range + + text: rateRange.value > 0 ? `-/+ \n${(rateRange.value * 100).toFixed()}%` : '' font.pixelSize: 9 color: fontColor + anchors.top: parent.top anchors.bottom: parent.bottom anchors.right: parent.right @@ -53,17 +55,6 @@ Rectangle { anchors.topMargin: 2 horizontalAlignment: Text.AlignHCenter - - Mixxx.ControlProxy { - group: root.group - key: "rateRange" - onValueChanged: (value) => { - const newValue = `-/+ \n${(value * 100).toFixed()}%`; - if (range.text === newValue) return; - range.text = newValue; - root.updated(); - } - } } states: State { diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml index 5d2c1b4c5829..06006eb8abeb 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/KeyIndicator.qml @@ -97,26 +97,21 @@ Rectangle { "3m" ] + Mixxx.ControlProxy { + id: keyProxy + group: root.group + key: "key" + } + required property color borderColor - property int key: KeyIndicator.Key.NoKey + readonly property int key: keyProxy.value > 0 ? keyProxy.value : KeyIndicator.Key.NoKey radius: 6 border.color: colorsMap[key] border.width: 2 color: colorsMap[key] - signal updated - - Mixxx.ControlProxy { - group: root.group - key: "key" - onValueChanged: (value) => { - if (value === root.key) return; - root.key = value; - root.updated() - } - } Text { text: textMap[key] diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml index 2e3b87e453dd..cf5fa1d203c1 100644 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Keyboard.qml @@ -15,20 +15,14 @@ Item { required property string group - property int key: -1 - - signal updated - Mixxx.ControlProxy { + id: keyProxy group: root.group key: "key" - onValueChanged: (value) => { - if (value === root.key) return; - root.key = value; - root.updated() - } } + readonly property int key: keyProxy.value + RowLayout { anchors.fill: parent spacing: 0 @@ -119,7 +113,6 @@ Item { Layout.fillWidth: true radius: 2 border.width: 1 - // border.color: root.key == blackKeys.keyMap[index] || root.key == blackKeys.keyMap[index + blackKeys.model] ? "red" : "black" color: root.key == blackKeys.keyMap[index] || root.key == blackKeys.keyMap[index + blackKeys.model] ? "#aaaaaa" : "black" } Item { diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml index 7f0bdec7d01c..bd5938268693 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/LoopSizeIndicator.qml @@ -19,49 +19,37 @@ Rectangle { property color loopOnBoxColor: Qt.rgba(125/255,246/255,64/255, 1) property color loopOnFontColor: "black" - property bool on: true - signal updated - - radius: 6 - border.width: 2 - border.color: (loopSizeIndicator.on ? loopOnBoxColor : (loop_anchor.value == 0 ? loopOffBoxColor : loopReverseOffBoxColor)) - color: (loopSizeIndicator.on ? loopOnBoxColor : (loop_anchor.value == 0 ? loopOffBoxColor : loopReverseOffBoxColor)) - - Text { - id: indicator - anchors.centerIn: parent - font.pixelSize: 46 - color: (loopSizeIndicator.on ? loopOnFontColor : loopOffFontColor) - - Mixxx.ControlProxy { - group: root.group - key: "beatloop_size" - onValueChanged: (value) => { - const newValue = (value < 1 ? `1/${1 / value}` : `${value}`); - if (newValue === indicator.text) return; - indicator.text = newValue; - root.updated() - } - } + Mixxx.ControlProxy { + id: beatloopSize + group: root.group + key: "beatloop_size" } Mixxx.ControlProxy { + id: loopEnabled group: root.group key: "loop_enabled" - onValueChanged: (value) => { - if (value === root.on) return; - root.on = value; - root.updated() - } } Mixxx.ControlProxy { + id: loopAnchor group: root.group key: "loop_anchor" - id: loop_anchor - onValueChanged: (value) => { - root.updated() - } + } + + readonly property bool on: loopEnabled.value + + radius: 6 + border.width: 2 + border.color: (loopSizeIndicator.on ? loopOnBoxColor : (loopAnchor.value == 0 ? loopOffBoxColor : loopReverseOffBoxColor)) + color: (loopSizeIndicator.on ? loopOnBoxColor : (loopAnchor.value == 0 ? loopOffBoxColor : loopReverseOffBoxColor)) + + Text { + id: indicator + text: (beatloopSize.value < 1 ? `1/${1 / beatloopSize.value}` : `${beatloopSize.value}`); + anchors.centerIn: parent + font.pixelSize: 46 + color: (loopSizeIndicator.on ? loopOnFontColor : loopOffFontColor) } states: State { diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml index 0d034066a6e1..8d4097ccad63 100644 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/OnAirTrack.qml @@ -13,6 +13,7 @@ Item { required property string group property var deckPlayer: Mixxx.PlayerManager.getPlayer(root.group) + readonly property var currentTrack: deckPlayer.currentTrack property bool scrolling: true property real speed: 1.7 @@ -26,7 +27,7 @@ Item { x: 6 color: 'transparent' - readonly property string fulltext: !trackLoadedControl.value || root.deckPlayer.title.trim().length + root.deckPlayer.artist.trim().length == 0 ? qsTr("No Track Loaded") : `${root.deckPlayer.title} - ${root.deckPlayer.artist}`.trim() + readonly property string fulltext: !trackLoadedControl.value || root.currentTrack?.title.trim().length + root.currentTrack?.artist.trim().length == 0 ? qsTr("No Track Loaded") : `${root.currentTrack?.title} - ${root.currentTrack?.artist}`.trim() Text { id: text1 diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml index 82d8f8b3f892..93bc6f2eb401 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/Progression.qml @@ -15,30 +15,20 @@ Item { property real windowWidth: Window.width - width: 0 - signal updated - Mixxx.ControlProxy { + id: trackLoaded group: root.group key: "track_loaded" - onValueChanged: (value) => { - if (value === root.visible) return; - root.visible = value - root.updated() - } } Mixxx.ControlProxy { + id: playposition group: root.group key: "playposition" - onValueChanged: (value) => { - const newValue = Math.round(value * (320 - 12)); - if (newValue === root.width) return; - root.width = newValue; - root.updated() - } } + width: Math.round(playposition.value * (320 - 12)) + visible: trackLoaded.value clip: true Rectangle { diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml index a3937436c791..2954d704c83c 100644 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/SplashOff.qml @@ -10,6 +10,6 @@ Rectangle { width: root.width*0.8 height: root.height fillMode: Image.PreserveAspectFit - source: engine.getSetting("idleBackground") == "mask" ? "./Screens/Images/logo.png" : "../../../images/templates/logo_mixxx.png" + source: engine.getSetting("idleBackground") || "../../../images/templates/logo_mixxx.png" } } diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml index c93b813f3e6b..4d209b7291f7 100644 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml @@ -13,7 +13,7 @@ Rectangle { required property string group required property string screenId - readonly property bool useSharedApi: engine.getSetting("useSharedDataAPI") + readonly property bool useSharedApi: engine.getSetting("useSharedDataAPI") || false anchors.fill: parent color: "black" @@ -137,7 +137,7 @@ Rectangle { property var player: Mixxx.PlayerManager.getPlayer(root.group) - source: player.coverArtUrl + source: player.currentTrack?.coverArtUrl height: 100 width: 100 fillMode: Image.PreserveAspectFit @@ -486,9 +486,11 @@ Rectangle { } Mixxx.WaveformOverview { + readonly property var player: Mixxx.PlayerManager.getPlayer(root.group) id: waveformOverview anchors.fill: parent - player: Mixxx.PlayerManager.getPlayer(root.group) + + track: player.currentTrack } Mixxx.ControlProxy { diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml index 26302f4073cc..be5d8cdf9a6d 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/TimeAndBeatloopIndicator.qml @@ -27,23 +27,6 @@ Rectangle { border.color: timeColor border.width: 2 color: timeColor - signal updated - - function update() { - let newValue = ""; - if (root.mode === TimeAndBeatloopIndicator.Mode.RemainingTime) { - var seconds = ((1.0 - progression.value) * duration.value); - var mins = parseInt(seconds / 60).toString(); - seconds = parseInt(seconds % 60).toString(); - - newValue = `-${mins.padStart(2, '0')}:${seconds.padStart(2, '0')}`; - } else { - newValue = (beatjump.value < 1 ? `1/${1 / beatjump.value}` : `${beatjump.value}`); - } - if (newValue === indicator.text) return; - indicator.text = newValue; - root.updated() - } Text { id: indicator @@ -78,16 +61,21 @@ Rectangle { onValueChanged: (value) => { root.border.color = value ? 'red' : timeColor root.color = value ? 'red' : timeColor - root.updated() } } } Component.onCompleted: { - progression.onValueChanged.connect(update) - duration.onValueChanged.connect(update) - beatjump.onValueChanged.connect(update) - update() + indicator.text = Qt.binding(function() { + let newValue = ""; + if (root.mode === TimeAndBeatloopIndicator.Mode.RemainingTime) { + var seconds = ((1.0 - progression.value) * duration.value); + newValue = `-${parseInt(seconds / 60).toString().padStart(2, '0')}:${parseInt(seconds % 60).toString().padStart(2, '0')}`; + } else { + newValue = (beatjump.value < 1 ? `1/${1 / beatjump.value}` : `${beatjump.value}`); + } + return newValue + }); } states: State { diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml index ade89743521d..b77b3bc1cb67 100755 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/WaveformOverview.qml @@ -16,8 +16,6 @@ Item { property var deckPlayer: Mixxx.PlayerManager.getPlayer(root.group) property real scale: 0.2 - signal updated - visible: false antialiasing: true anchors.fill: parent @@ -26,7 +24,6 @@ Item { onGroupChanged: { deckPlayer = Mixxx.PlayerManager.getPlayer(root.group) console.log("Group changed!!") - root.updated() } } diff --git a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir index 6c76347ed734..a330672059a4 100644 --- a/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir +++ b/res/controllers/TraktorKontrolS4MK3Screens/S4MK3/qmldir @@ -10,3 +10,4 @@ TimeAndBeatloopIndicator 1.0 TimeAndBeatloopIndicator.qml WaveformOverview 1.0 WaveformOverview.qml SplashOff 1.0 SplashOff.qml StockScreen 1.0 StockScreen.qml +AdvancedScreen 1.0 AdvancedScreen.qml From 1685a04015853d3a85306fc85ce50eda13141551 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 2 Feb 2025 23:50:03 +0000 Subject: [PATCH 119/163] fix: support visual gain in stem waveform --- src/waveform/renderers/allshader/waveformrendererstem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/waveform/renderers/allshader/waveformrendererstem.cpp b/src/waveform/renderers/allshader/waveformrendererstem.cpp index 73ed176ed88d..93b056c12f55 100644 --- a/src/waveform/renderers/allshader/waveformrendererstem.cpp +++ b/src/waveform/renderers/allshader/waveformrendererstem.cpp @@ -225,7 +225,7 @@ bool WaveformRendererStem::preprocessInner() { } // Cast to float - float max = static_cast(u8max); + float max = static_cast(u8max) * allGain; // Apply the gains if (layerIdx) { From 1ce9127187780639cc63929b54bca97fef70b95d Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sat, 8 Mar 2025 14:01:56 +0000 Subject: [PATCH 120/163] chore: remove noisy warning log --- .../scripting/legacy/controllerscriptenginelegacy.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controllers/scripting/legacy/controllerscriptenginelegacy.cpp b/src/controllers/scripting/legacy/controllerscriptenginelegacy.cpp index f36405696830..93f1a1d92879 100644 --- a/src/controllers/scripting/legacy/controllerscriptenginelegacy.cpp +++ b/src/controllers/scripting/legacy/controllerscriptenginelegacy.cpp @@ -1,5 +1,8 @@ #include "controllers/scripting/legacy/controllerscriptenginelegacy.h" +#include + +#include #include #ifdef MIXXX_USE_QML @@ -11,12 +14,9 @@ #include #endif -#include "control/controlobject.h" #include "controllers/controller.h" -#include "controllers/scripting/colormapperjsproxy.h" #include "controllers/scripting/legacy/controllerscriptinterfacelegacy.h" #include "errordialoghandler.h" -#include "mixer/playermanager.h" #include "moc_controllerscriptenginelegacy.cpp" #ifdef MIXXX_USE_QML #include "qml/qmlmixxxcontrollerscreen.h" @@ -358,7 +358,7 @@ bool ControllerScriptEngineLegacy::initialize() { watchFilePath(path); auto pQmlEngine = std::dynamic_pointer_cast(m_pJSEngine); pQmlEngine->addImportPath(path); - qCWarning(m_logger) << pQmlEngine->importPathList(); + qCDebug(m_logger) << "The QML import path is" << pQmlEngine->importPathList(); } } else if (!m_modules.isEmpty()) { qCWarning(m_logger) << "Controller mapping has QML library definitions but no " From fcddbbfe77f142d3b3d38834cb7e1b639e0be2a3 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sat, 8 Mar 2025 14:03:08 +0000 Subject: [PATCH 121/163] fix: disable msaa on Wayland QPA offscreen --- .../rendering/controllerrenderingengine.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/controllers/rendering/controllerrenderingengine.cpp b/src/controllers/rendering/controllerrenderingengine.cpp index 2f162bdcd92b..c1a2767d5f77 100644 --- a/src/controllers/rendering/controllerrenderingengine.cpp +++ b/src/controllers/rendering/controllerrenderingengine.cpp @@ -1,5 +1,6 @@ #include "controllers/rendering/controllerrenderingengine.h" +#include #include #include #include @@ -10,17 +11,15 @@ #include #include #include +#include #include "controllers/controller.h" #include "controllers/controllerenginethreadcontrol.h" #include "controllers/scripting/legacy/controllerscriptenginelegacy.h" -#include "controllers/scripting/legacy/controllerscriptinterfacelegacy.h" #include "moc_controllerrenderingengine.cpp" -#include "qml/qmlwaveformoverview.h" #include "util/cmdlineargs.h" #include "util/logger.h" #include "util/thread_affinity.h" -#include "util/time.h" #include "util/timer.h" // Used in the renderFrame method to properly abort the rendering and terminate the engine. @@ -179,7 +178,15 @@ void ControllerRenderingEngine::setup(std::shared_ptr qmlEngine) { return; } QSurfaceFormat format; - format.setSamples(m_screenInfo.msaa); + // FIXME multi sampling appears to be unsupported when using offscreen + // rendering on Wayland QPA: + // warning [CtrlScreen_rightdeck] QWaylandGLContext::makeCurrent: + // eglError: 0x3009, this: 0x7ffd9c001770 warning [CtrlScreen_rightdeck] + // QRhiGles2: Failed to make context current. Expect bad things to happen. + // warning [CtrlScreen_rightdeck] Failed to create RHI (backend 2) + if (QGuiApplication::platformName() != QStringLiteral("wayland")) { + format.setSamples(m_screenInfo.msaa); + } format.setDepthBufferSize(16); format.setStencilBufferSize(8); From 3782534beb70524c2351693e9dca06be72735473 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sat, 8 Mar 2025 17:46:49 +0000 Subject: [PATCH 122/163] fix: add support for alpha on EOT SG renderer --- .../renderers/allshader/waveformrenderbeat.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/waveform/renderers/allshader/waveformrenderbeat.cpp b/src/waveform/renderers/allshader/waveformrenderbeat.cpp index 3056321e7a68..5d2340da4599 100644 --- a/src/waveform/renderers/allshader/waveformrenderbeat.cpp +++ b/src/waveform/renderers/allshader/waveformrenderbeat.cpp @@ -56,14 +56,20 @@ bool WaveformRenderBeat::preprocessInner() { return false; } +#ifndef __SCENEGRAPH__ int alpha = m_waveformRenderer->getBeatGridAlpha(); if (alpha == 0) { return false; } + m_color.setAlphaF(alpha / 100.0f); +#endif - const float devicePixelRatio = m_waveformRenderer->getDevicePixelRatio(); + if (!m_color.alpha()) { + // Don't render the beatgrid lines is there are fully transparent + return true; + } - m_color.setAlphaF(alpha / 100.0f); + const float devicePixelRatio = m_waveformRenderer->getDevicePixelRatio(); const double trackSamples = m_waveformRenderer->getTrackSamples(); if (trackSamples <= 0.0) { From c2c7272424c0d4a6da4a453df4e9c8bba6cb7524 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 9 Mar 2025 18:47:08 +0000 Subject: [PATCH 123/163] feat: auto detect the ShareDataAPI --- res/controllers/Traktor Kontrol S4 MK3.bulk.xml | 8 -------- .../S4MK3/AdvancedScreen.qml | 3 ++- .../S4MK3/AdvancedScreen/DeckScreen.qml | 3 ++- .../S4MK3/AdvancedScreen/ViewModels/DeckInfo.qml | 12 ++++++++---- .../TraktorKontrolS4MK3Screens/S4MK3/StockScreen.qml | 8 +++----- 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/res/controllers/Traktor Kontrol S4 MK3.bulk.xml b/res/controllers/Traktor Kontrol S4 MK3.bulk.xml index 94ce7ad8b36c..9ff549336099 100644 --- a/res/controllers/Traktor Kontrol S4 MK3.bulk.xml +++ b/res/controllers/Traktor Kontrol S4 MK3.bulk.xml @@ -17,14 +17,6 @@ - - + Qt::Vertical @@ -153,6 +164,7 @@ associated with each key. comboBoxHotcueColors pushButtonEditHotcuePalette comboBoxHotcueDefaultColor + comboBoxJumpDefaultColor pushButtonReplaceCueColor checkboxKeyColorsEnabled diff --git a/src/qml/qmlwaveformrenderer.cpp b/src/qml/qmlwaveformrenderer.cpp index 487aadcd5faf..77017e9683e8 100644 --- a/src/qml/qmlwaveformrenderer.cpp +++ b/src/qml/qmlwaveformrenderer.cpp @@ -1,5 +1,10 @@ #include "qml/qmlwaveformrenderer.h" +#include +#include +#include +#include + #include #include "moc_qmlwaveformrenderer.cpp" @@ -313,14 +318,43 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererMark::create( pMark->textColor(), pMark->align(), pMark->text(), - pMark->pixmap(), - pMark->icon(), + pMark->pixmap().toLocalFile(), + pMark->icon().toLocalFile(), pMark->color(), - priority))); + priority, + Cue::kNoHotCue, + {}, + pMark->endPixmap().toLocalFile(), + pMark->endIcon().toLocalFile(), + pMark->disabledOpacity(), + pMark->enabledOpacity()))); priority--; } const auto* pMark = defaultMark(); if (pMark != nullptr) { + const QString pixmap = pMark->pixmap().toLocalFile(); + const QString endPixmap = pMark->endPixmap().toLocalFile(); + const QString icon = pMark->icon().toLocalFile(); + const QString endIcon = pMark->endIcon().toLocalFile(); + // FIXME: the following checks should be done on the WaveformMarker + // setter (depends of #14515) + if (!QFileInfo::exists(pixmap)) { + qmlEngine(this)->throwError(tr("Cannot find the marker pixmap") + " \"" + pixmap + '"'); + } + + if (!endPixmap.isEmpty() && !QFileInfo::exists(endPixmap)) { + qmlEngine(this)->throwError(tr("Cannot find the marker endPixmap") + + " \"" + endPixmap + '"'); + } + + if (!icon.isEmpty() && !QFileInfo::exists(icon)) { + qmlEngine(this)->throwError(tr("Cannot find the marker icon") + " \"" + icon + '"'); + } + + if (!endIcon.isEmpty() && !QFileInfo::exists(endIcon)) { + qmlEngine(this)->throwError(tr("Cannot find the marker endIcon") + + " \"" + endIcon + '"'); + } pRenderer->setDefaultMark( waveformWidget->getGroup(), WaveformMarkSet::DefaultMarkerStyle{ @@ -329,9 +363,13 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererMark::create( pMark->textColor(), pMark->align(), pMark->text(), - pMark->pixmap(), - pMark->icon(), + pixmap, + endPixmap, + icon, + endIcon, pMark->color(), + pMark->enabledOpacity(), + pMark->disabledOpacity(), }); } return QmlWaveformRendererFactory::Renderer{pRenderer.get(), std::move(pRenderer)}; diff --git a/src/qml/qmlwaveformrenderer.h b/src/qml/qmlwaveformrenderer.h index 3c1d10aae693..44e1ef7049dd 100644 --- a/src/qml/qmlwaveformrenderer.h +++ b/src/qml/qmlwaveformrenderer.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -347,8 +349,10 @@ class QmlWaveformMark : public QObject { Q_PROPERTY(QString textColor MEMBER m_textColor NOTIFY textColorChanged) Q_PROPERTY(QString align MEMBER m_align NOTIFY alignChanged) Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged) - Q_PROPERTY(QString pixmap MEMBER m_pixmap NOTIFY pixmapChanged) - Q_PROPERTY(QString icon MEMBER m_icon NOTIFY iconChanged) + Q_PROPERTY(QUrl pixmap MEMBER m_pixmap NOTIFY pixmapChanged) + Q_PROPERTY(QUrl icon MEMBER m_icon NOTIFY iconChanged) + Q_PROPERTY(QUrl endPixmap MEMBER m_endPixmap NOTIFY endPixmapChanged) + Q_PROPERTY(QUrl endIcon MEMBER m_endIcon NOTIFY endIconChanged) QML_NAMED_ELEMENT(WaveformMark) public: QString control() const { @@ -369,12 +373,24 @@ class QmlWaveformMark : public QObject { QString text() const { return m_text; } - QString pixmap() const { + QUrl pixmap() const { return m_pixmap; } - QString icon() const { + QUrl icon() const { return m_icon; } + QUrl endPixmap() const { + return m_endPixmap; + } + QUrl endIcon() const { + return m_endIcon; + } + float disabledOpacity() const { + return m_disabledOpacity; + } + float enabledOpacity() const { + return m_enabledOpacity; + } signals: void controlChanged(QString control); @@ -383,8 +399,12 @@ class QmlWaveformMark : public QObject { void textColorChanged(QString textColor); void alignChanged(QString align); void textChanged(QString text); - void pixmapChanged(QString pixmap); - void iconChanged(QString icon); + void pixmapChanged(QUrl pixmap); + void iconChanged(QUrl icon); + void endPixmapChanged(QUrl pixmap); + void endIconChanged(QUrl icon); + void disabledOpacityChanged(float opacity); + void enabledOpacityChanged(float opacity); private: QString m_control; @@ -393,8 +413,12 @@ class QmlWaveformMark : public QObject { QString m_textColor; QString m_align; QString m_text; - QString m_pixmap; - QString m_icon; + QUrl m_pixmap; + QUrl m_icon; + QUrl m_endPixmap; + QUrl m_endIcon; + float m_disabledOpacity; + float m_enabledOpacity; }; class QmlWaveformUntilMark : public QObject { diff --git a/src/rendergraph/common/rendergraph/material/texturematerial.cpp b/src/rendergraph/common/rendergraph/material/texturematerial.cpp index b3f61767626c..2b5b3cdcf73b 100644 --- a/src/rendergraph/common/rendergraph/material/texturematerial.cpp +++ b/src/rendergraph/common/rendergraph/material/texturematerial.cpp @@ -18,7 +18,7 @@ TextureMaterial::TextureMaterial() } /* static */ const UniformSet& TextureMaterial::uniforms() { - static UniformSet set = makeUniformSet({"ubuf.matrix"}); + static UniformSet set = makeUniformSet({"ubuf.matrix", "ubuf.alpha"}); return set; } diff --git a/src/rendergraph/shaders/texture.frag b/src/rendergraph/shaders/texture.frag index bbe37bccd69c..3eb4ce3d0aff 100644 --- a/src/rendergraph/shaders/texture.frag +++ b/src/rendergraph/shaders/texture.frag @@ -1,9 +1,18 @@ #version 440 +layout(std140, binding = 0) uniform buf { + mat4 matrix; + float alpha; +} +ubuf; + layout(binding = 1) uniform sampler2D texture1; layout(location = 0) in vec2 vTexcoord; layout(location = 0) out vec4 fragColor; void main() { fragColor = texture(texture1, vTexcoord); + if (ubuf.alpha > 0.0) { + fragColor *= ubuf.alpha; + } } diff --git a/src/rendergraph/shaders/texture.frag.gl b/src/rendergraph/shaders/texture.frag.gl index b2d03f1352c6..71ab6a34dd65 100644 --- a/src/rendergraph/shaders/texture.frag.gl +++ b/src/rendergraph/shaders/texture.frag.gl @@ -1,6 +1,14 @@ #version 120 //// GENERATED - EDITS WILL BE OVERWRITTEN +struct buf +{ + mat4 matrix; + float alpha; +}; + +uniform buf ubuf; + uniform sampler2D texture1; varying vec2 vTexcoord; @@ -8,4 +16,8 @@ varying vec2 vTexcoord; void main() { gl_FragData[0] = texture2D(texture1, vTexcoord); + if (ubuf.alpha > 0.0) + { + gl_FragData[0] *= ubuf.alpha; + } } diff --git a/src/rendergraph/shaders/texture.vert b/src/rendergraph/shaders/texture.vert index 07b3d7f1f3ba..3cf7f4cd8240 100644 --- a/src/rendergraph/shaders/texture.vert +++ b/src/rendergraph/shaders/texture.vert @@ -2,6 +2,7 @@ layout(std140, binding = 0) uniform buf { mat4 matrix; + float alpha; } ubuf; diff --git a/src/rendergraph/shaders/texture.vert.gl b/src/rendergraph/shaders/texture.vert.gl index a3d58014be32..b048df2a4893 100644 --- a/src/rendergraph/shaders/texture.vert.gl +++ b/src/rendergraph/shaders/texture.vert.gl @@ -4,6 +4,7 @@ struct buf { mat4 matrix; + float alpha; }; uniform buf ubuf; diff --git a/src/shaders/textureshader.cpp b/src/shaders/textureshader.cpp index f5363d771694..c9399795b9a8 100644 --- a/src/shaders/textureshader.cpp +++ b/src/shaders/textureshader.cpp @@ -16,11 +16,13 @@ void main() )--"); QString fragmentShaderCode = QStringLiteral(R"--( +#version 120 uniform sampler2D texture; varying highp vec2 vTexcoord; +uniform float alpha; void main() { - gl_FragColor = texture2D(texture, vTexcoord); + gl_FragColor = texture2D(texture, vTexcoord) * vec4(1.0, 1.0, 1.0, alpha > .0 ? alpha : 1.0); } )--"); diff --git a/src/test/readaheadmanager_test.cpp b/src/test/readaheadmanager_test.cpp index 3680a7d08d70..ece027526603 100644 --- a/src/test/readaheadmanager_test.cpp +++ b/src/test/readaheadmanager_test.cpp @@ -1,12 +1,14 @@ +#include "engine/readaheadmanager.h" + #include -#include #include +#include -#include "engine/cachingreader/cachingreader.h" #include "control/controlobject.h" +#include "engine/cachingreader/cachingreader.h" +#include "engine/controls/cuecontrol.h" #include "engine/controls/loopingcontrol.h" -#include "engine/readaheadmanager.h" #include "test/mixxxtest.h" #include "util/assert.h" #include "util/defs.h" @@ -41,14 +43,11 @@ class StubLoopControl : public LoopingControl { : LoopingControl(kGroup, UserSettingsPointer()) { } - void pushTriggerReturnValue(double value) { + void pushValues(double trigger, double target) { m_triggerReturnValues.push_back( - mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(value)); - } - - void pushTargetReturnValue(double value) { + mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(trigger)); m_targetReturnValues.push_back( - mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(value)); + mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(target)); } mixxx::audio::FramePos nextTrigger(bool reverse, @@ -68,6 +67,35 @@ class StubLoopControl : public LoopingControl { QList m_targetReturnValues; }; +class StubCueControl : public CueControl { + public: + StubCueControl() + : CueControl(kGroup, UserSettingsPointer()) { + } + + void pushValues(double trigger, double target) { + m_triggerReturnValues.push_back( + mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(trigger)); + + m_targetReturnValues.push_back( + mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(target)); + } + + mixxx::audio::FramePos nextTrigger(bool, + mixxx::audio::FramePos, + mixxx::audio::FramePos* pTargetPosition, + mixxx::audio::FrameDiff_t) override { + RELEASE_ASSERT(!m_targetReturnValues.isEmpty()); + *pTargetPosition = m_targetReturnValues.takeFirst(); + RELEASE_ASSERT(!m_triggerReturnValues.isEmpty()); + return m_triggerReturnValues.takeFirst(); + } + + protected: + QList m_triggerReturnValues; + QList m_targetReturnValues; +}; + class ReadAheadManagerTest : public MixxxTest { public: ReadAheadManagerTest() @@ -75,6 +103,12 @@ class ReadAheadManagerTest : public MixxxTest { m_beatNextCO(ConfigKey(kGroup, "beat_next")), m_beatPrevCO(ConfigKey(kGroup, "beat_prev")), m_playCO(ConfigKey(kGroup, "play")), + m_stopCO(ConfigKey(kGroup, "stop")), + m_vinylControlCO(ConfigKey(kGroup, "vinylcontrol_enabled")), + m_vinylControlModeCO(ConfigKey(kGroup, "vinylcontrol_mode")), + m_passthroughCO(ConfigKey(kGroup, "passthrough")), + m_indicator250msCO(ConfigKey("[App]", "indicator_250ms")), + m_indicator500msCO(ConfigKey("[App]", "indicator_500ms")), m_quantizeCO(ConfigKey(kGroup, "quantize")), m_repeatCO(ConfigKey(kGroup, "repeat")), m_slipEnabledCO(ConfigKey(kGroup, "slip_enabled")), @@ -87,14 +121,22 @@ class ReadAheadManagerTest : public MixxxTest { SampleUtil::clear(m_pBuffer, MAX_BUFFER_LEN); m_pReader.reset(new StubReader()); m_pLoopControl.reset(new StubLoopControl()); + m_pCueControl.reset(new StubCueControl()); m_pReadAheadManager.reset(new ReadAheadManager(m_pReader.data(), - m_pLoopControl.data())); + m_pLoopControl.data(), + m_pCueControl.data())); } ControlObject m_beatClosestCO; ControlObject m_beatNextCO; ControlObject m_beatPrevCO; ControlObject m_playCO; + ControlObject m_stopCO; + ControlObject m_vinylControlCO; + ControlObject m_vinylControlModeCO; + ControlObject m_passthroughCO; + ControlObject m_indicator250msCO; + ControlObject m_indicator500msCO; ControlObject m_quantizeCO; ControlObject m_repeatCO; ControlObject m_slipEnabledCO; @@ -102,27 +144,72 @@ class ReadAheadManagerTest : public MixxxTest { CSAMPLE* m_pBuffer; QScopedPointer m_pReader; QScopedPointer m_pLoopControl; + QScopedPointer m_pCueControl; QScopedPointer m_pReadAheadManager; }; +TEST_F(ReadAheadManagerTest, SavedJump) { + m_pReadAheadManager->notifySeek(0.5); + + for (int i = 0; i < 2; i++) { + m_pLoopControl->pushValues(kNoTrigger, kNoTrigger); + } + + m_pCueControl->pushValues(20, 6); + m_pCueControl->pushValues(kNoTrigger, kNoTrigger); + + EXPECT_EQ(20, + m_pReadAheadManager->getNextSamples( + 1.0, m_pBuffer, 30, mixxx::audio::ChannelCount::stereo())); + EXPECT_NEAR(6.5, m_pReadAheadManager->getPlaypos(), 1); + EXPECT_EQ(80, + m_pReadAheadManager->getNextSamples( + 1.0, m_pBuffer, 80, mixxx::audio::ChannelCount::stereo())); + + EXPECT_NEAR(86.5, m_pReadAheadManager->getPlaypos(), 1); +} + +TEST_F(ReadAheadManagerTest, TriggerOnJumpOrLoop) { + m_pReadAheadManager->notifySeek(0); + + // The jump trigger is located before the loop end + m_pLoopControl->pushValues(50, 10); + m_pCueControl->pushValues(40, 20); + + EXPECT_EQ(40, + m_pReadAheadManager->getNextSamples( + 1.0, m_pBuffer, 100, mixxx::audio::ChannelCount::stereo())); + EXPECT_NEAR(20, m_pReadAheadManager->getPlaypos(), 1); + + m_pReadAheadManager->notifySeek(0); + + // The jump trigger is located after the loop end + m_pLoopControl->pushValues(50, 40); + m_pCueControl->pushValues(60, 30); + + EXPECT_EQ(50, + m_pReadAheadManager->getNextSamples( + 1.0, m_pBuffer, 100, mixxx::audio::ChannelCount::stereo())); + EXPECT_NEAR(40, m_pReadAheadManager->getPlaypos(), 1); +} + TEST_F(ReadAheadManagerTest, FractionalFrameLoop) { // If we are in reverse, a loop is enabled, and the current playposition // is before of the loop, we should seek to the out point of the loop. m_pReadAheadManager->notifySeek(0.5); - // Trigger value means, the sample that triggers the loop (loop in) - m_pLoopControl->pushTriggerReturnValue(20.2); - m_pLoopControl->pushTriggerReturnValue(20.2); - m_pLoopControl->pushTriggerReturnValue(20.2); - m_pLoopControl->pushTriggerReturnValue(20.2); - m_pLoopControl->pushTriggerReturnValue(20.2); - m_pLoopControl->pushTriggerReturnValue(20.2); - // Process value is the sample we should seek to. - m_pLoopControl->pushTargetReturnValue(3.3); - m_pLoopControl->pushTargetReturnValue(3.3); - m_pLoopControl->pushTargetReturnValue(3.3); - m_pLoopControl->pushTargetReturnValue(3.3); - m_pLoopControl->pushTargetReturnValue(3.3); - m_pLoopControl->pushTargetReturnValue(kNoTrigger); + // Trigger value means, the sample that triggers the loop (loop in) and the + // sample we should seek to. + m_pLoopControl->pushValues(20.2, 3.3); + m_pLoopControl->pushValues(20.2, 3.3); + m_pLoopControl->pushValues(20.2, 3.3); + m_pLoopControl->pushValues(20.2, 3.3); + m_pLoopControl->pushValues(20.2, 3.3); + m_pLoopControl->pushValues(20.2, kNoTrigger); + + for (int i = 0; i < 6; i++) { + m_pCueControl->pushValues(kNoTrigger, kNoTrigger); + } + // read from start to loop trigger, overshoot 0.3 EXPECT_EQ(20, m_pReadAheadManager->getNextSamples( diff --git a/src/waveform/renderers/allshader/waveformrendermark.cpp b/src/waveform/renderers/allshader/waveformrendermark.cpp index 110649024dff..3ef2175efe42 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.cpp +++ b/src/waveform/renderers/allshader/waveformrendermark.cpp @@ -12,6 +12,7 @@ #include "rendergraph/vertexupdaters/rgbavertexupdater.h" #include "rendergraph/vertexupdaters/texturedvertexupdater.h" #include "track/track.h" +#include "util/assert.h" #include "util/colorcomponents.h" #include "util/roundtopixel.h" #include "waveform/renderers/allshader/digitsrenderer.h" @@ -34,9 +35,14 @@ namespace { class WaveformMarkNode : public rendergraph::GeometryNode { public: WaveformMark* m_pOwner{}; + bool m_isEndMark{false}; - WaveformMarkNode(WaveformMark* pOwner, rendergraph::Context* pContext, const QImage& image) - : m_pOwner(pOwner) { + WaveformMarkNode(WaveformMark* pOwner, + bool isEndMark, + rendergraph::Context* pContext, + const QImage& image) + : m_pOwner(pOwner), + m_isEndMark(isEndMark) { initForRectangles(1); updateTexture(pContext, image); } @@ -68,6 +74,10 @@ class WaveformMarkNode : public rendergraph::GeometryNode { return m_textureHeight; } + void setAlpha(float alpha) { + material().setUniform(1, alpha); + } + public: float m_textureWidth{}; float m_textureHeight{}; @@ -76,10 +86,11 @@ class WaveformMarkNode : public rendergraph::GeometryNode { class WaveformMarkNodeGraphics : public WaveformMark::Graphics { public: WaveformMarkNodeGraphics(WaveformMark* pOwner, + bool isEndMark, rendergraph::Context* pContext, const QImage& image) : m_pNode(std::make_unique( - pOwner, pContext, image)) { + pOwner, isEndMark, pContext, image)) { } void updateTexture(rendergraph::Context* pContext, const QImage& image) { waveformMarkNode()->updateTexture(pContext, image); @@ -93,6 +104,9 @@ class WaveformMarkNodeGraphics : public WaveformMark::Graphics { float textureHeight() const { return waveformMarkNode()->textureHeight(); } + void setAlpha(float alpha) { + waveformMarkNode()->setAlpha(alpha); + } void attachNode(std::unique_ptr pNode) { DEBUG_ASSERT(!m_pNode); m_pNode = std::move(pNode); @@ -282,8 +296,10 @@ void allshader::WaveformRenderMark::update() { WaveformMarkNode* pWaveformMarkNode = static_cast(pNode.get()); // Determine its WaveformMark auto* pMark = pWaveformMarkNode->m_pOwner; - auto* pGraphics = static_cast(pMark->m_pGraphics.get()); - // Store the node with the WaveformMark + auto* pGraphics = static_cast( + pWaveformMarkNode->m_isEndMark ? pMark->m_pEndGraphics.get() + : pMark->m_pGraphics.get()); + // Store the nodes with the WaveformMark pGraphics->attachNode(std::move(pNode)); } @@ -326,13 +342,19 @@ void allshader::WaveformRenderMark::update() { auto* pMarkGraphics = pMark->m_pGraphics.get(); auto* pMarkNodeGraphics = static_cast(pMarkGraphics); - if (!pMarkGraphics) { // is this even possible? + if (!pMarkNodeGraphics) { // is this even possible? continue; } const float currentMarkPos = static_cast( m_waveformRenderer->transformSamplePositionInRendererWorld( samplePosition, positionType)); + auto* pMarkEndGraphics = pMark->m_pEndGraphics.get(); + auto* pMarkEndNodeGraphics = static_cast(pMarkEndGraphics); + VERIFY_OR_DEBUG_ASSERT(pMarkEndNodeGraphics) { + continue; + } + if (pMark->isShowUntilNext() && samplePosition >= playPosition + 1.0 && samplePosition < nextMarkPosition) { @@ -362,30 +384,47 @@ void allshader::WaveformRenderMark::update() { // Check if the range needs to be displayed. if (samplePosition != sampleEndPosition && sampleEndPosition != Cue::kNoPosition) { - DEBUG_ASSERT(samplePosition < sampleEndPosition); const float currentMarkEndPos = static_cast( m_waveformRenderer->transformSamplePositionInRendererWorld( sampleEndPosition, positionType)); + if (visible || currentMarkEndPos > 0.f) { - QColor color = pMark->fillColor(); - color.setAlphaF(0.4f); - - // Reuse, or create new when needed - if (!pRangeChild) { - auto pNode = std::make_unique(); - pNode->initForRectangles(2); - pRangeChild = pNode.get(); - m_pRangeNodesParent->appendChildNode(std::move(pNode)); + if (pMark->isLoop()) { + // Reuse, or create new when needed + if (!pRangeChild) { + auto pNode = std::make_unique(); + pNode->initForRectangles(2); + pRangeChild = pNode.get(); + m_pRangeNodesParent->appendChildNode(std::move(pNode)); + } + + QColor color = pMark->fillColor(); + color.setAlphaF(0.4f); + updateRangeNode(pRangeChild, + QRectF(QPointF(roundToPixel(currentMarkPos), + !m_isSlipRenderer && slipActive + ? roundToPixel( + m_waveformRenderer + ->getBreadth() / + 2) + : 0.f), + QPointF(roundToPixel(currentMarkEndPos), + roundToPixel(m_waveformRenderer + ->getBreadth()))), + color); + pRangeChild = static_cast(pRangeChild->nextSibling()); + } else { + pMarkEndNodeGraphics->update( + roundToPixel(currentMarkEndPos - markWidth / 2.f), + !m_isSlipRenderer && slipActive + ? roundToPixel(m_waveformRenderer->getBreadth() / 2) + : 0, + devicePixelRatio); + pMarkEndNodeGraphics->setAlpha(static_cast(pMark->opacity())); + // transfer back to m_pMarkNodesParent children, for rendering + m_pMarkNodesParent->appendChildNode(pMarkEndNodeGraphics->detachNode()); } - - updateRangeNode(pRangeChild, - QRectF(QPointF(roundToPixel(currentMarkPos), 0.f), - QPointF(roundToPixel(currentMarkEndPos), - roundToPixel(m_waveformRenderer->getBreadth()))), - color); - visible = true; - pRangeChild = static_cast(pRangeChild->nextSibling()); } } @@ -564,6 +603,7 @@ void allshader::WaveformRenderMark::updateMarkImage(WaveformMarkPointer pMark) { if (!pMark->m_pGraphics) { pMark->m_pGraphics = std::make_unique(pMark.get(), + false, m_waveformRenderer->getContext(), pMark->generateImage( m_waveformRenderer->getDevicePixelRatio())); @@ -574,6 +614,21 @@ void allshader::WaveformRenderMark::updateMarkImage(WaveformMarkPointer pMark) { m_waveformRenderer->getDevicePixelRatio())); } } +void allshader::WaveformRenderMark::updateEndMarkImage(WaveformMarkPointer pMark) { + if (!pMark->m_pEndGraphics) { + pMark->m_pEndGraphics = + std::make_unique(pMark.get(), + true, + m_waveformRenderer->getContext(), + pMark->generateEndImage( + m_waveformRenderer->getDevicePixelRatio())); + } else { + auto* pGraphics = static_cast(pMark->m_pEndGraphics.get()); + pGraphics->updateTexture(m_waveformRenderer->getContext(), + pMark->generateEndImage( + m_waveformRenderer->getDevicePixelRatio())); + } +} void allshader::WaveformRenderMark::updateUntilMark( double playPosition, double nextMarkPosition) { diff --git a/src/waveform/renderers/allshader/waveformrendermark.h b/src/waveform/renderers/allshader/waveformrendermark.h index ab583f9d76be..cf9d41c22bc2 100644 --- a/src/waveform/renderers/allshader/waveformrendermark.h +++ b/src/waveform/renderers/allshader/waveformrendermark.h @@ -62,6 +62,7 @@ class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase, private: void updateMarkImage(WaveformMarkPointer pMark) override; + void updateEndMarkImage(WaveformMarkPointer pMark) override; void updatePlayPosMarkTexture(rendergraph::Context* pContext); diff --git a/src/waveform/renderers/waveformmark.cpp b/src/waveform/renderers/waveformmark.cpp index 55997d03929a..c114f4d74390 100644 --- a/src/waveform/renderers/waveformmark.cpp +++ b/src/waveform/renderers/waveformmark.cpp @@ -2,6 +2,8 @@ #include #include +#include +#include #include #include "skin/legacy/skincontext.h" @@ -93,7 +95,8 @@ bool isShowUntilNextPositionControl(const QString& positionControl) { } // anonymous namespace -WaveformMark::WaveformMark(const QString& group, +WaveformMark::WaveformMark( + const QString& group, QString positionControl, const QString& visibilityControl, const QString& textColor, @@ -104,22 +107,34 @@ WaveformMark::WaveformMark(const QString& group, QColor color, int priority, int hotCue, - const WaveformSignalColors& signalColors) + const WaveformSignalColors& signalColors, + const QString& endPixmapPath, + const QString& endIconPath, + float disabledOpacity, + float enabledOpacity) : m_textColor(textColor), m_pixmapPath(pixmapPath), + m_endPixmapPath(endPixmapPath), m_iconPath(iconPath), + m_endIconPath(endIconPath), + m_enabledOpacity(enabledOpacity), + m_disabledOpacity(disabledOpacity), m_linePosition{}, m_breadth{}, m_level{}, + m_typeCO{}, + m_statusCO{}, m_iPriority(priority), m_iHotCue(hotCue), m_showUntilNext{} { QString endPositionControl; QString typeControl; + QString statusControl; if (hotCue != Cue::kNoHotCue) { QString hotcueNumber = QString::number(hotCue + 1); positionControl = QStringLiteral("hotcue_%1_position").arg(hotcueNumber); endPositionControl = QStringLiteral("hotcue_%1_endposition").arg(hotcueNumber); + statusControl = QStringLiteral("hotcue_%1_status").arg(hotcueNumber); typeControl = QStringLiteral("hotcue_%1_type").arg(hotcueNumber); m_showUntilNext = true; } else { @@ -131,7 +146,8 @@ WaveformMark::WaveformMark(const QString& group, } if (!endPositionControl.isEmpty() && !group.isEmpty()) { m_pEndPositionCO = std::make_unique(group, endPositionControl); - m_pTypeCO = std::make_unique(group, typeControl); + m_statusCO = std::make_unique(group, statusControl); + m_typeCO = std::make_unique(group, typeControl); } if (!visibilityControl.isEmpty() && !group.isEmpty()) { @@ -179,10 +195,12 @@ WaveformMark::WaveformMark(const QString& group, QString positionControl; QString endPositionControl; QString typeControl; + QString statusControl; if (hotCue != Cue::kNoHotCue) { positionControl = "hotcue_" + QString::number(hotCue + 1) + "_position"; endPositionControl = "hotcue_" + QString::number(hotCue + 1) + "_endposition"; typeControl = "hotcue_" + QString::number(hotCue + 1) + "_type"; + statusControl = "hotcue_" + QString::number(hotCue + 1) + "_status"; m_showUntilNext = true; } else { positionControl = context.selectString(node, "Control"); @@ -194,7 +212,8 @@ WaveformMark::WaveformMark(const QString& group, } if (!endPositionControl.isEmpty()) { m_pEndPositionCO = std::make_unique(group, endPositionControl); - m_pTypeCO = std::make_unique(group, typeControl); + m_typeCO = std::make_unique(group, typeControl); + m_statusCO = std::make_unique(group, statusControl); } QString visibilityControl = context.selectString(node, "VisibilityControl"); @@ -234,10 +253,23 @@ WaveformMark::WaveformMark(const QString& group, m_pixmapPath = context.makeSkinPath(m_pixmapPath); } + m_endPixmapPath = context.selectString(node, "EndPixmap"); + if (!m_endPixmapPath.isEmpty()) { + m_endPixmapPath = context.makeSkinPath(m_endPixmapPath); + } + m_iconPath = context.selectString(node, "Icon"); if (!m_iconPath.isEmpty()) { m_iconPath = context.makeSkinPath(m_iconPath); } + + m_endIconPath = context.selectString(node, "EndIcon"); + if (!m_endIconPath.isEmpty()) { + m_endIconPath = context.makeSkinPath(m_endIconPath); + } + + m_enabledOpacity = context.selectDouble(node, "EnabledOpacity", 1); + m_disabledOpacity = context.selectDouble(node, "DisabledOpacity", 0.5); } WaveformMark::~WaveformMark() = default; @@ -406,9 +438,11 @@ class MarkerGeometry { QSizeF m_imageSize; }; -QImage WaveformMark::generateImage(float devicePixelRatio) { - DEBUG_ASSERT(needsImageUpdate()); - +QImage WaveformMark::performImageGeneration(float devicePixelRatio, + const QString& pixmapPath, + const QString& text, + WaveformMarkLabel* labelMark, + const QString& iconPath) { if (m_breadth == 0.0f) { return {}; } @@ -416,8 +450,8 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { // Load the pixmap from file. // If that succeeds loading the text and stroke is skipped. - if (!m_pixmapPath.isEmpty()) { - QString path = m_pixmapPath; + if (!pixmapPath.isEmpty()) { + QString path = pixmapPath; // Use devicePixelRatio to properly scale the image QImage image = *WImageStore::getImage(path, devicePixelRatio); // If loading the image didn't fail, then we're done. Otherwise fall @@ -448,24 +482,37 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { return image; } } + const bool useIcon = iconPath != ""; - QString label = m_text; - - // Determine mark text. - if (getHotCue() >= 0) { - if (!label.isEmpty()) { - label.prepend(": "); + // Determine drawing geometries + const MarkerGeometry markerGeometry{text, useIcon, m_align, m_breadth, m_level}; + + float linePos; + if (labelMark) { + labelMark->setAreaRect(markerGeometry.labelRect()); + + const Qt::Alignment alignH = m_align & Qt::AlignHorizontal_Mask; + const float imgw = static_cast(markerGeometry.imageSize().width()); + switch (alignH) { + case Qt::AlignHCenter: + m_linePosition = imgw / 2.f; + m_offset = -(imgw - 1.f) / 2.f; + break; + case Qt::AlignLeft: + m_linePosition = imgw - 1.5f; + m_offset = -imgw + 2.f; + break; + case Qt::AlignRight: + default: + m_linePosition = 1.5f; + m_offset = -1.f; + break; } - label.prepend(QString::number(getHotCue() + 1)); + linePos = m_linePosition; + } else { + linePos = static_cast(markerGeometry.imageSize().width()) / 2.f; } - const bool useIcon = m_iconPath != ""; - - // Determine drawing geometries - const MarkerGeometry markerGeometry{label, useIcon, m_align, m_breadth, m_level}; - - m_label.setAreaRect(markerGeometry.labelRect()); - const QSize size{markerGeometry.getImageSize(devicePixelRatio)}; if (size.width() <= 0 || size.height() <= 0) { @@ -489,26 +536,7 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { painter.setWorldMatrixEnabled(false); - const Qt::Alignment alignH = m_align & Qt::AlignHorizontal_Mask; - const float imgw = static_cast(markerGeometry.imageSize().width()); - switch (alignH) { - case Qt::AlignHCenter: - m_linePosition = imgw / 2.f; - m_offset = -(imgw - 1.f) / 2.f; - break; - case Qt::AlignLeft: - m_linePosition = imgw - 1.5f; - m_offset = -imgw + 2.f; - break; - case Qt::AlignRight: - default: - m_linePosition = 1.5f; - m_offset = -1.f; - break; - } - // Note: linePos has to be at integer + 0.5 to draw correctly - const float linePos = m_linePosition; [[maybe_unused]] const float epsilon = 1e-6f; DEBUG_ASSERT(std::abs(linePos - std::floor(linePos) - 0.5) < epsilon); @@ -526,7 +554,7 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { linePos + 1.f, markerGeometry.imageSize().height())); - if (useIcon || label.length() != 0) { + if (useIcon || text.length() != 0) { painter.setPen(borderColor()); // Draw the label rounded rect with border @@ -535,7 +563,7 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { painter.fillPath(path, fillColor()); painter.drawPath(path); - // Center m_contentRect.width() and m_contentRect.height() inside m_labelRect + // Center m_contentRect.width() and m_contentRect.height() inside labelRectMarl // and apply the offset x,y so the text ends up in the centered width,height. QPointF pos(markerGeometry.labelRect().x() + (markerGeometry.labelRect().width() - @@ -549,7 +577,7 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { markerGeometry.contentRect().y()); if (useIcon) { - QSvgRenderer svgRenderer(m_iconPath); + QSvgRenderer svgRenderer(iconPath); svgRenderer.render(&painter, QRectF(pos, markerGeometry.contentRect().size())); } else { // Draw the text @@ -557,7 +585,7 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { painter.setPen(labelColor()); painter.setFont(markerGeometry.font()); - painter.drawText(pos, label); + painter.drawText(pos, text); } } @@ -565,3 +593,34 @@ QImage WaveformMark::generateImage(float devicePixelRatio) { return image; } + +QImage WaveformMark::generateImage(float devicePixelRatio) { + DEBUG_ASSERT(needsImageUpdate()); + + QString label = m_text; + + // Determine mark text. + if (getHotCue() >= 0) { + if (!label.isEmpty()) { + label.prepend(": "); + } + label.prepend(QString::number(getHotCue() + 1)); + } + + return performImageGeneration(devicePixelRatio, m_pixmapPath, label, &m_label, m_iconPath); +} + +QImage WaveformMark::generateEndImage(float devicePixelRatio) { + assert(needsEndImageUpdate()); + + QString direction = QStringLiteral("forward"); + + if (isJump() && getSampleEndPosition() > getSamplePosition()) { + direction = QStringLiteral("backward"); + } + return performImageGeneration(devicePixelRatio, + m_endPixmapPath, + "", + nullptr, + m_endIconPath.contains("%1") ? m_endIconPath.arg(direction) : m_endIconPath); +} diff --git a/src/waveform/renderers/waveformmark.h b/src/waveform/renderers/waveformmark.h index aabe11699d75..ac2ddcfa1c4a 100644 --- a/src/waveform/renderers/waveformmark.h +++ b/src/waveform/renderers/waveformmark.h @@ -1,9 +1,12 @@ #pragma once #include +#include #include #include #include "control/controlproxy.h" +#include "control/pollingcontrolproxy.h" +#include "engine/controls/cuecontrol.h" #include "track/cue.h" #include "waveform/renderers/waveformsignalcolors.h" #include "waveform/waveformmarklabel.h" @@ -52,7 +55,11 @@ class WaveformMark { QColor color, int priority, int hotCue = Cue::kNoHotCue, - const WaveformSignalColors& signalColors = {}); + const WaveformSignalColors& signalColors = {}, + const QString& endPixmapPath = {}, + const QString& endIconPath = {}, + float disabledOpacity = 1.0f, + float enabledOpacity = 1.0f); ~WaveformMark(); // Disable copying @@ -69,6 +76,12 @@ class WaveformMark { int getPriority() const { return m_iPriority; }; + mixxx::CueType getType() const { + if (!m_typeCO) { + return mixxx::CueType::Invalid; + } + return static_cast(m_typeCO->get()); + } // The m_pPositionCO related function bool isValid() const { @@ -85,18 +98,44 @@ class WaveformMark { m_pEndPositionCO->connectValueChanged(receiver, slot, Qt::AutoConnection); } }; + template + void connectTypeChanged(Receiver receiver, Slot slot) const { + if (m_typeCO) { + m_typeCO->connectValueChanged(receiver, slot, Qt::AutoConnection); + } + }; + template + void connectStatusChanged(Receiver receiver, Slot slot) const { + if (m_statusCO) { + m_statusCO->connectValueChanged(receiver, slot, Qt::AutoConnection); + } + }; + double getSamplePosition() const { return m_pPositionCO->get(); } + bool isJump() const { + return m_typeCO && + static_cast(m_typeCO->get()) == + mixxx::CueType::Jump; + } + bool isLoop() const { + return m_typeCO && + static_cast(m_typeCO->get()) == + mixxx::CueType::Loop; + } + bool isStandard() const { + // A Waveform mark should always have either `isJump`, `isLoop` or + // `isNormal` returning true! + return !isLoop() && !isJump(); + } double getSampleEndPosition() const { if (!m_pEndPositionCO || // A hotcue may have an end position although it isn't a saved - // loop anymore. This happens when the user changes the cue + // loop or jump anymore. This happens when the user changes the cue // type. However, we persist the end position if the user wants // to restore the cue to a saved loop - (m_pTypeCO && - static_cast(m_pTypeCO->get()) != - mixxx::CueType::Loop)) { + isStandard()) { return Cue::kNoPosition; } return m_pEndPositionCO->get(); @@ -115,6 +154,13 @@ class WaveformMark { } return m_pVisibleCO->toBool(); } + // A cue is always considered active if it isn't a saved loop or a saved + // jump (a.k.a a "standard" cue) + bool isActive() const { + return !m_statusCO || + static_cast(m_statusCO->get()) == + HotcueControl::Status::Active; + } bool isShowUntilNext() const { return m_showUntilNext; } @@ -146,16 +192,27 @@ class WaveformMark { return m_labelColor; } + double opacity() const { + return isActive() ? m_enabledOpacity : m_disabledOpacity; + } + void setNeedsImageUpdate() { if (m_pGraphics) { m_pGraphics->m_obsolete = true; } + if (m_pEndGraphics) { + m_pEndGraphics->m_obsolete = true; + } } bool needsImageUpdate() const { return !m_pGraphics || m_pGraphics->m_obsolete; } + bool needsEndImageUpdate() const { + return !m_pEndGraphics || m_pEndGraphics->m_obsolete; + } + void setBreadth(float breadth) { if (m_breadth != breadth) { m_breadth = breadth; @@ -176,12 +233,18 @@ class WaveformMark { bool contains(QPoint point, Qt::Orientation orientation) const; QImage generateImage(float devicePixelRatio); + QImage generateEndImage(float devicePixelRatio); QColor m_textColor; QString m_text; Qt::Alignment m_align; QString m_pixmapPath; + QString m_endPixmapPath; QString m_iconPath; + QString m_endIconPath; + + double m_enabledOpacity; + double m_disabledOpacity; float m_linePosition; float m_offset; @@ -195,12 +258,20 @@ class WaveformMark { WaveformMarkLabel m_label; private: + QImage performImageGeneration(float devicePixelRatio, + const QString& pixmapPath, + const QString& text, + WaveformMarkLabel* labelMark, + const QString& iconPath); + std::unique_ptr m_pPositionCO; std::unique_ptr m_pEndPositionCO; - std::unique_ptr m_pTypeCO; std::unique_ptr m_pVisibleCO; + std::unique_ptr m_typeCO; + std::unique_ptr m_statusCO; std::unique_ptr m_pGraphics; + std::unique_ptr m_pEndGraphics; int m_iPriority; int m_iHotCue; diff --git a/src/waveform/renderers/waveformmarkset.cpp b/src/waveform/renderers/waveformmarkset.cpp index 8624680535f6..bfe7eb9f87f4 100644 --- a/src/waveform/renderers/waveformmarkset.cpp +++ b/src/waveform/renderers/waveformmarkset.cpp @@ -69,7 +69,6 @@ void WaveformMarkSet::setDefault(const QString& group, const DefaultMarkerStyle& model, const WaveformSignalColors& signalColors) { m_pDefaultMark = WaveformMarkPointer::create( - group, model.positionControl, model.visibilityControl, @@ -85,7 +84,6 @@ void WaveformMarkSet::setDefault(const QString& group, for (int i = 0; i < kMaxNumberOfHotcues; ++i) { if (m_hotCueMarks.value(i).isNull()) { auto pMark = WaveformMarkPointer::create( - group, model.positionControl, model.visibilityControl, @@ -97,7 +95,11 @@ void WaveformMarkSet::setDefault(const QString& group, model.color, i, i, - signalColors); + signalColors, + model.endPixmapPath, + model.endIconPath, + model.enabledOpacity, + model.disabledOpacity); m_marks.push_front(pMark); m_hotCueMarks.insert(pMark->getHotCue(), pMark); } diff --git a/src/waveform/renderers/waveformmarkset.h b/src/waveform/renderers/waveformmarkset.h index d0d4607219c6..8d07fd266f70 100644 --- a/src/waveform/renderers/waveformmarkset.h +++ b/src/waveform/renderers/waveformmarkset.h @@ -18,8 +18,12 @@ class WaveformMarkSet { QString markAlign; QString text; QString pixmapPath; + QString endPixmapPath; QString iconPath; + QString endIconPath; QColor color; + float enabledOpacity; + float disabledOpacity; }; WaveformMarkSet(); @@ -56,6 +60,24 @@ class WaveformMarkSet { } } + template + void connectTypeChanged(Receiver receiver, Slot slot) const { + for (const auto& pMark : std::as_const(m_marks)) { + if (pMark->isValid()) { + pMark->connectTypeChanged(receiver, slot); + } + } + } + + template + void connectStatusChanged(Receiver receiver, Slot slot) const { + for (const auto& pMark : std::as_const(m_marks)) { + if (pMark->isValid()) { + pMark->connectStatusChanged(receiver, slot); + } + } + } + inline QList::const_iterator begin() const { return m_marksToRender.begin(); } diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp index fb8688b9138b..3637af96f38c 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -140,3 +140,13 @@ void WaveformRenderMark::updateMarkImage(WaveformMarkPointer pMark) { .transformed(QTransform().rotate(90))); } } +void WaveformRenderMark::updateEndMarkImage(WaveformMarkPointer pMark) { + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { + pMark->m_pEndGraphics = std::make_unique( + pMark->generateEndImage(m_waveformRenderer->getDevicePixelRatio())); + } else { + pMark->m_pEndGraphics = std::make_unique( + pMark->generateEndImage(m_waveformRenderer->getDevicePixelRatio()) + .transformed(QTransform().rotate(90))); + } +} diff --git a/src/waveform/renderers/waveformrendermark.h b/src/waveform/renderers/waveformrendermark.h index 2bf284223f18..e5ef50bb87fc 100644 --- a/src/waveform/renderers/waveformrendermark.h +++ b/src/waveform/renderers/waveformrendermark.h @@ -10,6 +10,7 @@ class WaveformRenderMark : public WaveformRenderMarkBase { private: void updateMarkImage(WaveformMarkPointer pMark) override; + void updateEndMarkImage(WaveformMarkPointer pMark) override; DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark); }; diff --git a/src/waveform/renderers/waveformrendermarkbase.cpp b/src/waveform/renderers/waveformrendermarkbase.cpp index b2293d1448d4..3f04cf81cdd3 100644 --- a/src/waveform/renderers/waveformrendermarkbase.cpp +++ b/src/waveform/renderers/waveformrendermarkbase.cpp @@ -20,6 +20,8 @@ bool WaveformRenderMarkBase::init() { m_marks.connectSamplePositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); m_marks.connectSampleEndPositionChanged(this, &WaveformRenderMarkBase::onMarkChanged); m_marks.connectVisibleChanged(this, &WaveformRenderMarkBase::onMarkChanged); + m_marks.connectTypeChanged(this, &WaveformRenderMarkBase::onMarkChanged); + m_marks.connectStatusChanged(this, &WaveformRenderMarkBase::onMarkChanged); return true; } @@ -79,6 +81,9 @@ void WaveformRenderMarkBase::updateMarksFromCues() { QColor newColor = mixxx::RgbColor::toQColor(pCue->getColor()); pMark->setText(newLabel); pMark->setBaseColor(newColor, dimBrightThreshold); + if (pMark->isJump()) { + pMark->setNeedsImageUpdate(); + } } updateMarks(); @@ -96,5 +101,8 @@ void WaveformRenderMarkBase::updateMarkImages() { if (pMark->needsImageUpdate()) { updateMarkImage(pMark); } + if (pMark->needsEndImageUpdate()) { + updateEndMarkImage(pMark); + } } } diff --git a/src/waveform/renderers/waveformrendermarkbase.h b/src/waveform/renderers/waveformrendermarkbase.h index 398a92f7aadc..ec3bae93e8ec 100644 --- a/src/waveform/renderers/waveformrendermarkbase.h +++ b/src/waveform/renderers/waveformrendermarkbase.h @@ -60,6 +60,7 @@ class WaveformRenderMarkBase : public QObject, public WaveformRendererAbstract { private: virtual void updateMarkImage(WaveformMarkPointer pMark) = 0; + virtual void updateEndMarkImage(WaveformMarkPointer pMark) = 0; DISALLOW_COPY_AND_ASSIGN(WaveformRenderMarkBase); }; diff --git a/src/widget/wcuemenupopup.cpp b/src/widget/wcuemenupopup.cpp index 6f8f1cab5ee3..74996b765836 100644 --- a/src/widget/wcuemenupopup.cpp +++ b/src/widget/wcuemenupopup.cpp @@ -2,12 +2,21 @@ #include #include +#include #include "control/controlobject.h" #include "moc_wcuemenupopup.cpp" #include "track/track.h" -void CueTypePushButton::mousePressEvent(QMouseEvent* e) { +namespace { +const ConfigKey kHotcueDefaultColorIndexConfigKey("[Controls]", "HotcueDefaultColorIndex"); +const ConfigKey kLoopDefaultColorIndexConfigKey("[Controls]", "LoopDefaultColorIndex"); +const ConfigKey kJumpDefaultColorIndexConfigKey("[Controls]", "jump_default_color_index"); + +constexpr mixxx::audio::FrameDiff_t kMinimumAudibleLoopSizeFrames = 150; +} // namespace + +void CueMenuPushButton::mousePressEvent(QMouseEvent* e) { if (e->type() == QEvent::MouseButtonPress && e->button() == Qt::RightButton) { emit rightClicked(); return; @@ -15,8 +24,50 @@ void CueTypePushButton::mousePressEvent(QMouseEvent* e) { QPushButton::mousePressEvent(e); } +void WCueMenuPopup::updateTypeAndColorIfDefault(mixxx::CueType newType) { + auto hotcueColorPalette = + m_colorPaletteSettings.getHotcueColorPalette(); + int colorIndex; + switch (m_pCue->getType()) { + default: + colorIndex = m_pConfig->getValue(kHotcueDefaultColorIndexConfigKey, -1); + break; + case mixxx::CueType::Loop: + colorIndex = m_pConfig->getValue(kLoopDefaultColorIndexConfigKey, -1); + break; + case mixxx::CueType::Jump: + colorIndex = m_pConfig->getValue(kJumpDefaultColorIndexConfigKey, -1); + break; + } + auto defaultColor = + (colorIndex < 0 || colorIndex >= hotcueColorPalette.size()) + ? hotcueColorPalette.defaultColor() + : hotcueColorPalette.at(colorIndex); + m_pCue->setType(newType); + if (m_pCue->getColor() != defaultColor) { + return; + } + switch (newType) { + default: + colorIndex = m_pConfig->getValue(kHotcueDefaultColorIndexConfigKey, -1); + break; + case mixxx::CueType::Loop: + colorIndex = m_pConfig->getValue(kLoopDefaultColorIndexConfigKey, -1); + break; + case mixxx::CueType::Jump: + colorIndex = m_pConfig->getValue(kJumpDefaultColorIndexConfigKey, -1); + break; + } + if (colorIndex < 0 || colorIndex >= hotcueColorPalette.size()) { + m_pCue->setColor(hotcueColorPalette.defaultColor()); + } else { + m_pCue->setColor(hotcueColorPalette.at(colorIndex)); + } +} + WCueMenuPopup::WCueMenuPopup(UserSettingsPointer pConfig, QWidget* parent) : QWidget(parent), + m_pConfig(pConfig), m_colorPaletteSettings(ColorPaletteSettings(pConfig)), m_pBeatLoopSize(ControlFlag::AllowMissingOrInvalid), m_pPlayPos(ControlFlag::AllowMissingOrInvalid), @@ -54,29 +105,51 @@ WCueMenuPopup::WCueMenuPopup(UserSettingsPointer pConfig, QWidget* parent) this, &WCueMenuPopup::slotChangeCueColor); - m_pDeleteCue = std::make_unique("", this); + m_pDeleteCue = std::make_unique(this); m_pDeleteCue->setToolTip(tr("Delete this cue")); m_pDeleteCue->setObjectName("CueDeleteButton"); connect(m_pDeleteCue.get(), &QPushButton::clicked, this, &WCueMenuPopup::slotDeleteCue); - m_pSavedLoopCue = std::make_unique(this); - m_pSavedLoopCue->setToolTip( - tr("Toggle this cue type between normal cue and saved loop") + - "\n\n" + - tr("Left-click: Use the old size or the current beatloop size as the loop size") + + m_pStandardCue = std::make_unique(this); + m_pStandardCue->setToolTip( + tr("Turn this cue into a regular hotcue")); + m_pStandardCue->setObjectName("CueStandardButton"); + m_pStandardCue->setCheckable(true); + connect(m_pStandardCue.get(), + &CueMenuPushButton::clicked, + this, + &WCueMenuPopup::slotStandardCue); + + m_pSavedLoopCue = std::make_unique(this); + m_pSavedLoopCue->setToolTip(tr("Turn this cue into a saved loop") + "\n\n" + + tr("Left-click: Use the old size if known or the current beatloop " + "size as the loop size") + "\n" + - tr("Right-click: Use the current play position as loop end if it is after the cue")); + tr("Right-click: Use the current play position as new loop end if " + "it is after the cue")); m_pSavedLoopCue->setObjectName("CueSavedLoopButton"); m_pSavedLoopCue->setCheckable(true); connect(m_pSavedLoopCue.get(), - &CueTypePushButton::clicked, + &CueMenuPushButton::clicked, this, &WCueMenuPopup::slotSavedLoopCueAuto); connect(m_pSavedLoopCue.get(), - &CueTypePushButton::rightClicked, + &CueMenuPushButton::rightClicked, this, &WCueMenuPopup::slotSavedLoopCueManual); + m_pSavedJumpCue = std::make_unique(this); + m_pSavedJumpCue->setObjectName("CueSavedJumpButton"); + m_pSavedJumpCue->setCheckable(true); + connect(m_pSavedJumpCue.get(), + &CueMenuPushButton::clicked, + this, + &WCueMenuPopup::slotSavedJumpCueAuto); + connect(m_pSavedJumpCue.get(), + &CueMenuPushButton::rightClicked, + this, + &WCueMenuPopup::slotSavedJumpCueManual); + QHBoxLayout* pLabelLayout = new QHBoxLayout(); pLabelLayout->addWidget(m_pCueNumber.get()); pLabelLayout->addStretch(1); @@ -89,8 +162,11 @@ WCueMenuPopup::WCueMenuPopup(UserSettingsPointer pConfig, QWidget* parent) QVBoxLayout* pRightLayout = new QVBoxLayout(); pRightLayout->addWidget(m_pDeleteCue.get()); + pRightLayout->addWidget(m_pStandardCue.get()); pRightLayout->addStretch(1); pRightLayout->addWidget(m_pSavedLoopCue.get()); + pRightLayout->addStretch(1); + pRightLayout->addWidget(m_pSavedJumpCue.get()); QHBoxLayout* pMainLayout = new QHBoxLayout(); pMainLayout->addLayout(pLeftLayout); @@ -142,22 +218,83 @@ void WCueMenuPopup::slotUpdate() { QString positionText = ""; Cue::StartAndEndPositions pos = m_pCue->getStartAndEndPosition(); - if (pos.startPosition.isValid()) { + if (pos.startPosition.isValid() && pos.endPosition.isValid() && + m_pCue->getType() != mixxx::CueType::HotCue) { double startPositionSeconds = pos.startPosition.value() / m_pTrack->getSampleRate(); - positionText = mixxx::Duration::formatTime(startPositionSeconds, mixxx::Duration::Precision::CENTISECONDS); - if (pos.endPosition.isValid() && m_pCue->getType() != mixxx::CueType::HotCue) { - double endPositionSeconds = pos.endPosition.value() / m_pTrack->getSampleRate(); - positionText = QString("%1 - %2").arg( - positionText, - mixxx::Duration::formatTime(endPositionSeconds, mixxx::Duration::Precision::CENTISECONDS) - ); - } + double endPositionSeconds = pos.endPosition.value() / m_pTrack->getSampleRate(); + QString startPositionText = + mixxx::Duration::formatTime(std::min(startPositionSeconds, endPositionSeconds), + mixxx::Duration::Precision::CENTISECONDS); + QString endPositionText = mixxx::Duration::formatTime( + std::max(startPositionSeconds, endPositionSeconds), + mixxx::Duration::Precision:: + CENTISECONDS); + positionText = + QString("%1 %2 %3") + .arg(startPositionText, + m_pCue->getType() == mixxx::CueType::Loop + ? "-" + : (startPositionSeconds < endPositionSeconds + ? "⟵" + : "⟶"), + endPositionText); + } else { + double startPositionSeconds = pos.startPosition.value() / m_pTrack->getSampleRate(); + positionText = mixxx::Duration::formatTime(startPositionSeconds, + mixxx::Duration::Precision::CENTISECONDS); } m_pCuePosition->setText(positionText); m_pEditLabel->setText(m_pCue->getLabel()); m_pColorPicker->setSelectedColor(m_pCue->getColor()); + m_pStandardCue->setChecked(m_pCue->getType() == mixxx::CueType::HotCue); m_pSavedLoopCue->setChecked(m_pCue->getType() == mixxx::CueType::Loop); + m_pSavedJumpCue->setChecked(m_pCue->getType() == mixxx::CueType::Jump); + QString direction; + if (m_pCue->getType() == mixxx::CueType::HotCue) { + // Use forward/backward icon if the playposition is before/after + // the hotcue position + auto cueStartEnd = m_pCue->getStartAndEndPosition(); + auto newPosition = cueStartEnd.endPosition; + if (!newPosition.isValid()) { + newPosition = getCurrentPlayPositionWithQuantize(); + } + if (!newPosition.isValid() || + std::abs(newPosition - cueStartEnd.startPosition) <= + kMinimumAudibleLoopSizeFrames) { + direction = "impossible"; + } else if (newPosition < cueStartEnd.startPosition) { + direction = "forward"; + } else { + direction = "backward"; + } + } else { + const bool isforward = m_pCue->getType() != mixxx::CueType::Jump || + m_pCue->getPosition() > m_pCue->getEndPosition(); + // Use forward icon if this is a saved loop, or forward/back if this + // already is a jump cue + direction = isforward + ? "forward" + : "backward"; + m_pSavedJumpCue->setToolTip( + //: \n is a linebreak. Try to not to extend the translation + //: beyond the length of the longest source line so the + //: tooltip remains compact. + (isforward ? tr("Turn this cue into a saved forward jump.") + : tr("Turn this cue into a saved backward jump " + "(one shot loop).")) + + "\n\n" + + tr("Left-click: Use the old size if known or the current " + "play position as jump start position\n" + "If this is already a jump cue, swap the jump position " + "and the cue/target position.") + + "\n\n" + + tr("Right-click: use current play position as new jump " + "start position")); + } + m_pSavedJumpCue->setProperty("direction", direction); + m_pSavedJumpCue->style()->polish(m_pSavedJumpCue.get()); + m_pSavedJumpCue->repaint(); } else { m_pTrack.reset(); m_pCue.reset(); @@ -198,40 +335,20 @@ void WCueMenuPopup::slotDeleteCue() { hide(); } -void WCueMenuPopup::slotSavedLoopCueAuto() { +void WCueMenuPopup::slotStandardCue() { VERIFY_OR_DEBUG_ASSERT(m_pCue != nullptr) { return; } VERIFY_OR_DEBUG_ASSERT(m_pTrack != nullptr) { return; } - VERIFY_OR_DEBUG_ASSERT(m_pBeatLoopSize.valid()) { - return; - } - if (m_pCue->getType() == mixxx::CueType::Loop) { - m_pCue->setType(mixxx::CueType::HotCue); - } else { - auto cueStartEnd = m_pCue->getStartAndEndPosition(); - if (!cueStartEnd.endPosition.isValid() || - cueStartEnd.endPosition <= cueStartEnd.startPosition) { - double beatloopSize = m_pBeatLoopSize.get(); - const mixxx::BeatsPointer pBeats = m_pTrack->getBeats(); - if (beatloopSize <= 0 || !pBeats) { - return; - } - auto position = pBeats->findNBeatsFromPosition( - cueStartEnd.startPosition, beatloopSize); - if (position <= m_pCue->getPosition()) { - return; - } - m_pCue->setEndPosition(position); - } - m_pCue->setType(mixxx::CueType::Loop); + if (m_pCue->getType() != mixxx::CueType::HotCue) { + updateTypeAndColorIfDefault(mixxx::CueType::HotCue); } slotUpdate(); } -void WCueMenuPopup::slotSavedLoopCueManual() { +void WCueMenuPopup::slotSavedLoopCueAuto() { VERIFY_OR_DEBUG_ASSERT(m_pCue != nullptr) { return; } @@ -241,21 +358,127 @@ void WCueMenuPopup::slotSavedLoopCueManual() { VERIFY_OR_DEBUG_ASSERT(m_pBeatLoopSize.valid()) { return; } + auto cueStartEnd = m_pCue->getStartAndEndPosition(); + // If we are changing the cue type from a jump, we need to permute the positions + if (m_pCue->getType() == mixxx::CueType::Jump) { + auto endPosition = cueStartEnd.endPosition; + if (cueStartEnd.endPosition < cueStartEnd.startPosition) { + // Only swap value if this is a forward jump + cueStartEnd.endPosition = cueStartEnd.startPosition; + cueStartEnd.startPosition = endPosition; + } + m_pCue->setStartAndEndPosition(cueStartEnd.startPosition, cueStartEnd.endPosition); + } + if (!cueStartEnd.endPosition.isValid() || + cueStartEnd.endPosition <= cueStartEnd.startPosition) { + double beatloopSize = m_pBeatLoopSize.get(); + const mixxx::BeatsPointer pBeats = m_pTrack->getBeats(); + if (beatloopSize <= 0 || !pBeats) { + return; + } + auto position = pBeats->findNBeatsFromPosition( + cueStartEnd.startPosition, beatloopSize); + if (position <= m_pCue->getPosition()) { + return; + } + m_pCue->setEndPosition(position); + } + updateTypeAndColorIfDefault(mixxx::CueType::Loop); + slotUpdate(); +} + +mixxx::audio::FramePos WCueMenuPopup::getCurrentPlayPositionWithQuantize() const { const mixxx::BeatsPointer pBeats = m_pTrack->getBeats(); auto position = mixxx::audio::FramePos::fromEngineSamplePos( m_pPlayPos.get() * m_pTrackSample.get()); if (m_pQuantizeEnabled.toBool() && pBeats) { mixxx::audio::FramePos nextBeatPosition, prevBeatPosition; pBeats->findPrevNextBeats(position, &prevBeatPosition, &nextBeatPosition, false); - position = (nextBeatPosition - position > position - prevBeatPosition) + return (nextBeatPosition - position > position - prevBeatPosition) ? prevBeatPosition : nextBeatPosition; } - if (position <= m_pCue->getPosition()) { + return position; +} + +void WCueMenuPopup::slotSavedLoopCueManual() { + VERIFY_OR_DEBUG_ASSERT(m_pCue != nullptr) { + return; + } + VERIFY_OR_DEBUG_ASSERT(m_pTrack != nullptr) { + return; + } + // If we are changing the cue type from a jump, we need to permute the + // positions if it wasn't going backward + if (m_pCue->getType() == mixxx::CueType::Jump && + m_pCue->getPosition() > m_pCue->getEndPosition()) { + auto cueStartEnd = m_pCue->getStartAndEndPosition(); + auto endPosition = cueStartEnd.endPosition; + cueStartEnd.endPosition = cueStartEnd.startPosition; + cueStartEnd.startPosition = endPosition; + m_pCue->setStartAndEndPosition(cueStartEnd.startPosition, cueStartEnd.endPosition); + } + auto newPosition = getCurrentPlayPositionWithQuantize(); + if (newPosition <= m_pCue->getPosition()) { + return; + } + m_pCue->setEndPosition(newPosition); + updateTypeAndColorIfDefault(mixxx::CueType::Loop); + slotUpdate(); +} + +void WCueMenuPopup::slotSavedJumpCueAuto() { + VERIFY_OR_DEBUG_ASSERT(m_pCue != nullptr) { + slotUpdate(); + return; + } + VERIFY_OR_DEBUG_ASSERT(m_pTrack != nullptr) { + slotUpdate(); + return; + } + auto cueStartEnd = m_pCue->getStartAndEndPosition(); + // If we are changing the cue type from a loop, we need to permute the position + // Also, if the type is already a jump, we swap to the to/from point + if (m_pCue->getType() == mixxx::CueType::Loop || m_pCue->getType() == mixxx::CueType::Jump) { + auto endPosition = cueStartEnd.endPosition; + cueStartEnd.endPosition = cueStartEnd.startPosition; + cueStartEnd.startPosition = endPosition; + } + if (!cueStartEnd.endPosition.isValid()) { + auto newPosition = getCurrentPlayPositionWithQuantize(); + if (std::abs(newPosition - cueStartEnd.startPosition) <= + kMinimumAudibleLoopSizeFrames) { + slotUpdate(); + return; + } + cueStartEnd.endPosition = newPosition; + } + m_pCue->setStartAndEndPosition(cueStartEnd.startPosition, cueStartEnd.endPosition); + updateTypeAndColorIfDefault(mixxx::CueType::Jump); + slotUpdate(); +} + +void WCueMenuPopup::slotSavedJumpCueManual() { + VERIFY_OR_DEBUG_ASSERT(m_pCue != nullptr) { + return; + } + VERIFY_OR_DEBUG_ASSERT(m_pTrack != nullptr) { + return; + } + auto cueStartEnd = m_pCue->getStartAndEndPosition(); + // If we are changing the cue type from a loop, we need to permute the position + if (m_pCue->getType() == mixxx::CueType::Loop) { + auto endPosition = cueStartEnd.endPosition; + cueStartEnd.endPosition = cueStartEnd.startPosition; + cueStartEnd.startPosition = endPosition; + } + auto newPosition = getCurrentPlayPositionWithQuantize(); + if (newPosition == cueStartEnd.startPosition) { return; } - m_pCue->setEndPosition(position); - m_pCue->setType(mixxx::CueType::Loop); + cueStartEnd.endPosition = newPosition; + m_pCue->setStartAndEndPosition(cueStartEnd.startPosition, cueStartEnd.endPosition); + updateTypeAndColorIfDefault(mixxx::CueType::Jump); slotUpdate(); } diff --git a/src/widget/wcuemenupopup.h b/src/widget/wcuemenupopup.h index 4f20d171ea5f..87617137263a 100644 --- a/src/widget/wcuemenupopup.h +++ b/src/widget/wcuemenupopup.h @@ -15,10 +15,10 @@ class ControlProxy; // Custom PushButton which emit a custom signal when right-clicked -class CueTypePushButton : public QPushButton { +class CueMenuPushButton : public QPushButton { Q_OBJECT public: - explicit CueTypePushButton(QWidget* parent = 0) + explicit CueMenuPushButton(QWidget* parent = 0) : QPushButton(parent) { } @@ -64,6 +64,9 @@ class WCueMenuPopup : public QWidget { void slotEditLabel(); void slotDeleteCue(); void slotUpdate(); + void slotStandardCue(); + void slotSavedJumpCueManual(); + void slotSavedJumpCueAuto(); /// This slot is called when the saved loop button is being left pressed, /// which effectively toggle the cue loop between standard cue and saved /// loop. If the cue was never a saved loop, it will use the current @@ -77,6 +80,10 @@ class WCueMenuPopup : public QWidget { void slotChangeCueColor(mixxx::RgbColor::optional_t color); private: + void updateTypeAndColorIfDefault(mixxx::CueType newType); + mixxx::audio::FramePos getCurrentPlayPositionWithQuantize() const; + + UserSettingsPointer m_pConfig; ColorPaletteSettings m_colorPaletteSettings; PollingControlProxy m_pBeatLoopSize; PollingControlProxy m_pPlayPos; @@ -89,8 +96,10 @@ class WCueMenuPopup : public QWidget { std::unique_ptr m_pCuePosition; std::unique_ptr m_pEditLabel; std::unique_ptr m_pColorPicker; - std::unique_ptr m_pDeleteCue; - std::unique_ptr m_pSavedLoopCue; + std::unique_ptr m_pDeleteCue; + std::unique_ptr m_pStandardCue; + std::unique_ptr m_pSavedLoopCue; + std::unique_ptr m_pSavedJumpCue; protected: void closeEvent(QCloseEvent* event) override; diff --git a/src/widget/whotcuebutton.cpp b/src/widget/whotcuebutton.cpp index 50308a2d0952..6de7c8469f60 100644 --- a/src/widget/whotcuebutton.cpp +++ b/src/widget/whotcuebutton.cpp @@ -9,6 +9,7 @@ #include #include +#include "engine/controls/cuecontrol.h" #include "mixer/playerinfo.h" #include "moc_whotcuebutton.cpp" #include "skin/legacy/skincontext.h" @@ -94,6 +95,23 @@ void WHotcueButton::setup(const QDomNode& node, const SkinContext& context) { m_pCoType->connectValueChanged(this, &WHotcueButton::slotTypeChanged); slotTypeChanged(m_pCoType->get()); + m_pCoPosition = make_parented( + createConfigKey(QStringLiteral("position")), + this, + ControlFlag::NoAssertIfMissing); + m_pCoPosition->connectValueChanged(this, &WHotcueButton::slotUpdateDirection); + m_pCoEndPosition = make_parented( + createConfigKey(QStringLiteral("endposition")), + this, + ControlFlag::NoAssertIfMissing); + m_pCoEndPosition->connectValueChanged(this, &WHotcueButton::slotUpdateDirection); + slotUpdateDirection(); + + m_pCoActive = make_parented( + createConfigKey(QStringLiteral("status")), + this, + ControlFlag::NoAssertIfMissing); + addConnection(std::make_unique( this, getLeftClickConfigKey(), // "activate" @@ -116,6 +134,12 @@ void WHotcueButton::setup(const QDomNode& node, const SkinContext& context) { } } +bool WHotcueButton::isActive() const { + return m_pCoActive && + m_pCoActive->get() == + static_cast(HotcueControl::Status::Active); +} + void WHotcueButton::mousePressEvent(QMouseEvent* pEvent) { const bool rightClick = pEvent->button() == Qt::RightButton; if (rightClick) { @@ -274,6 +298,13 @@ void WHotcueButton::slotColorChanged(double color) { restyleAndRepaint(); } +void WHotcueButton::slotUpdateDirection(double) { + m_direction = m_pCoPosition->get() >= m_pCoEndPosition->get() + ? QStringLiteral("forward") + : QStringLiteral("backward"); + restyleAndRepaint(); +} + void WHotcueButton::slotTypeChanged(double type) { switch (static_cast(static_cast(type))) { case mixxx::CueType::Invalid: diff --git a/src/widget/whotcuebutton.h b/src/widget/whotcuebutton.h index 0a95d264197b..f2f660b4aa7e 100644 --- a/src/widget/whotcuebutton.h +++ b/src/widget/whotcuebutton.h @@ -27,6 +27,10 @@ class WHotcueButton : public WPushButton { Q_PROPERTY(bool light MEMBER m_bCueColorIsLight); Q_PROPERTY(bool dark MEMBER m_bCueColorIsDark); Q_PROPERTY(QString type MEMBER m_type); + Q_PROPERTY(QString direction MEMBER m_direction); + Q_PROPERTY(bool active READ isActive); + + bool isActive() const; protected: void mousePressEvent(QMouseEvent* pEvent) override; @@ -39,6 +43,7 @@ class WHotcueButton : public WPushButton { private slots: void slotColorChanged(double color); void slotTypeChanged(double type); + void slotUpdateDirection(double = 0); private: ConfigKey createConfigKey(const QString& name); @@ -49,11 +54,15 @@ class WHotcueButton : public WPushButton { bool m_hoverCueColor; parented_ptr m_pCoColor; parented_ptr m_pCoType; + parented_ptr m_pCoPosition; + parented_ptr m_pCoEndPosition; + parented_ptr m_pCoActive; parented_ptr m_pCueMenuPopup; int m_cueColorDimThreshold; bool m_bCueColorDimmed; bool m_bCueColorIsLight; bool m_bCueColorIsDark; QString m_type; + QString m_direction; QMargins m_dndRectMargins; }; diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp index 8dcce984d12c..ba9b5ce364f9 100644 --- a/src/widget/woverview.cpp +++ b/src/widget/woverview.cpp @@ -186,6 +186,8 @@ void WOverview::setup(const QDomNode& node, const SkinContext& context) { m_marks.connectSamplePositionChanged(this, &WOverview::onMarkChanged); m_marks.connectSampleEndPositionChanged(this, &WOverview::onMarkChanged); m_marks.connectVisibleChanged(this, &WOverview::onMarkChanged); + m_marks.connectTypeChanged(this, &WOverview::onMarkChanged); + m_marks.connectStatusChanged(this, &WOverview::onMarkChanged); QDomNode child = node.firstChild(); while (!child.isNull()) { @@ -475,7 +477,8 @@ void WOverview::updateCues(const QList &loadedCues) { int hotcueNumber = currentCue->getHotCue(); if ((currentCue->getType() == mixxx::CueType::HotCue || - currentCue->getType() == mixxx::CueType::Loop) && + currentCue->getType() == mixxx::CueType::Loop || + currentCue->getType() == mixxx::CueType::Jump) && hotcueNumber != Cue::kNoHotCue) { // Prepend the hotcue number to hotcues' labels QString newLabel = currentCue->getLabel(); @@ -971,6 +974,7 @@ void WOverview::drawMarks(QPainter* pPainter, const float offset, const float ga offset + static_cast(samplePosition) * gain, 0.0f, static_cast(width())); + float markStartPosition = markPosition; pMark->m_linePosition = markPosition; QLineF line; @@ -986,15 +990,22 @@ void WOverview::drawMarks(QPainter* pPainter, const float offset, const float ga QRectF rect; double sampleEndPosition = pMark->getSampleEndPosition(); if (sampleEndPosition > 0) { - const float markEndPosition = math_clamp( + float markEndPosition = math_clamp( offset + static_cast(sampleEndPosition) * gain, 0.0f, static_cast(width())); + // If it's a Jump cue, end is later than start for a forward jump, + // so swap positions in this case to get a valid rect for + // painting the range. + if (pMark->isJump() && + markEndPosition < markStartPosition) { + std::swap(markStartPosition, markEndPosition); + } if (m_orientation == Qt::Horizontal) { - rect.setCoords(markPosition, 0, markEndPosition, height()); + rect.setCoords(markStartPosition, 0, markEndPosition, height()); } else { - rect.setCoords(0, markPosition, width(), markEndPosition); + rect.setCoords(0, markStartPosition, width(), markEndPosition); } } @@ -1005,9 +1016,18 @@ void WOverview::drawMarks(QPainter* pPainter, const float offset, const float ga pPainter->drawLine(line); if (rect.isValid()) { - QColor loopColor = pMark->fillColor(); - loopColor.setAlphaF(0.5f); - pPainter->fillRect(rect, loopColor); + QColor rangeColor = pMark->fillColor(); + // Less opacity for inactive jump cues to not unnecessarily obstruct + // the waveform image. + // TODO Use played color for forward jumps to clarify we'll skip that region? + if (pMark->getType() == mixxx::CueType::Jump && pMark->isActive()) { + rangeColor.setAlphaF(0.5f); + } else { + rangeColor.setAlphaF(0.2f); + } + // TODO Instead of uniform painting, use different types of gradients + // loops, jump, intro/outro + pPainter->fillRect(rect, rangeColor); } if (!pMark->m_text.isEmpty()) { From 394c4a429e14840267829738d9bc14403b534da4 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 26 May 2025 01:17:56 +0200 Subject: [PATCH 132/163] WCueMenuPopup: remove Loopcue conversion from Jump right-click --- src/widget/wcuemenupopup.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/widget/wcuemenupopup.cpp b/src/widget/wcuemenupopup.cpp index 74996b765836..1e69059f89b7 100644 --- a/src/widget/wcuemenupopup.cpp +++ b/src/widget/wcuemenupopup.cpp @@ -466,12 +466,6 @@ void WCueMenuPopup::slotSavedJumpCueManual() { return; } auto cueStartEnd = m_pCue->getStartAndEndPosition(); - // If we are changing the cue type from a loop, we need to permute the position - if (m_pCue->getType() == mixxx::CueType::Loop) { - auto endPosition = cueStartEnd.endPosition; - cueStartEnd.endPosition = cueStartEnd.startPosition; - cueStartEnd.startPosition = endPosition; - } auto newPosition = getCurrentPlayPositionWithQuantize(); if (newPosition == cueStartEnd.startPosition) { return; From 51135abba5b0e2def48151f868cd92b0bd30ae22 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 6 Apr 2025 21:10:10 +0000 Subject: [PATCH 133/163] feat: add sound hardware setting section --- CMakeLists.txt | 4 + res/qml/ComboBox.qml | 84 ++- res/qml/ControlSlider.qml | 10 +- res/qml/Fader.qml | 49 ++ res/qml/FormButton.qml | 175 ++++++ res/qml/OrientationToggleButton.qml | 4 +- res/qml/Settings/AudioConnection.qml | 173 ++++++ res/qml/Settings/AudioEntity.qml | 326 +++++++++++ res/qml/Settings/AudioEntityEdge.qml | 24 + res/qml/Settings/AudioRouter.qml | 790 +++++++++++++++++++++++++++ res/qml/Settings/RatioChoice.qml | 309 +++++++++++ res/qml/Settings/SoundHardware.qml | 649 ++++++++++++++++++++-- res/qml/Slider.qml | 185 +++++-- src/coreservices.cpp | 2 + src/engine/enginebuffer.h | 1 + src/qml/qml_owned_ptr.h | 120 ++++ src/qml/qmlsoundmanagerproxy.cpp | 264 +++++++++ src/qml/qmlsoundmanagerproxy.h | 179 ++++++ src/soundio/soundmanager.h | 5 + 19 files changed, 3264 insertions(+), 89 deletions(-) create mode 100644 res/qml/Fader.qml create mode 100644 res/qml/FormButton.qml create mode 100644 res/qml/Settings/AudioConnection.qml create mode 100644 res/qml/Settings/AudioEntity.qml create mode 100644 res/qml/Settings/AudioEntityEdge.qml create mode 100644 res/qml/Settings/AudioRouter.qml create mode 100644 res/qml/Settings/RatioChoice.qml create mode 100644 src/qml/qml_owned_ptr.h create mode 100644 src/qml/qmlsoundmanagerproxy.cpp create mode 100644 src/qml/qmlsoundmanagerproxy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c3fb67dd3c1..e70c0eb60456 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3455,6 +3455,7 @@ if(QML) src/qml/qmlwaveformrenderer.cpp src/qml/qmlsettingparameter.cpp src/qml/qmltrackproxy.cpp + src/qml/qmlsoundmanagerproxy.cpp src/waveform/renderers/allshader/digitsrenderer.cpp src/waveform/renderers/allshader/waveformrenderbeat.cpp src/waveform/renderers/allshader/waveformrenderer.cpp @@ -4120,6 +4121,9 @@ if(RUBBERBAND) find_package(rubberband REQUIRED) target_link_libraries(mixxx-lib PRIVATE rubberband::rubberband) target_compile_definitions(mixxx-lib PUBLIC __RUBBERBAND__) + if(QML) + target_compile_definitions(mixxx-qml-lib PUBLIC __RUBBERBAND__) + endif() target_sources( mixxx-lib PRIVATE diff --git a/res/qml/ComboBox.qml b/res/qml/ComboBox.qml index b1f36f5be5ef..c7059aef79d4 100644 --- a/res/qml/ComboBox.qml +++ b/res/qml/ComboBox.qml @@ -1,6 +1,8 @@ import "." as Skin import QtQuick 2.12 import QtQuick.Controls 2.12 +import QtQuick.Shapes +import Qt5Compat.GraphicalEffects import "Theme" ComboBox { @@ -17,12 +19,14 @@ ComboBox { required property int index - width: parent.width highlighted: root.highlightedIndex === this.index text: root.textAt(this.index) + padding: 4 + verticalPadding: 8 contentItem: Text { text: itemDlgt.text + font: root.font color: Theme.deckTextColor elide: Text.ElideRight verticalAlignment: Text.AlignVCenter @@ -30,15 +34,16 @@ ComboBox { background: Rectangle { radius: 5 - border.width: itemDlgt.highlighted ? 1 : 0 - border.color: Theme.deckLineColor + border.width: 1 + border.color: itemDlgt.highlighted ? Theme.deckLineColor : "transparent" color: "transparent" } } + indicator.width: 20 + contentItem: Text { leftPadding: 5 - rightPadding: root.indicator.width + root.spacing text: root.displayText font: root.font color: Theme.deckTextColor @@ -49,21 +54,70 @@ ComboBox { popup: Popup { id: popup - y: root.height - width: root.width - implicitHeight: contentItem.implicitHeight + y: root.height/2 + width: root.width - root.indicator.width / 2 + x: root.indicator.width / 2 + height: Math.min(root.indicator.implicitHeight*3 + root.indicator.width, 150) + + padding: 0 + + contentItem: Item { + // implicitHeight: contentHeight + Item { + id: content + anchors.fill: parent + Shape { + anchors.top: parent.top + anchors.right: parent.right + anchors.rightMargin: 3 + width: root.indicator.width-3 + height: width + antialiasing: true + layer.enabled: true + layer.samples: 4 + ShapePath { + fillColor: Theme.embeddedBackgroundColor + strokeColor: Theme.deckBackgroundColor + strokeWidth: 2 + startX: parent.width/2; startY: 0 + fillRule: ShapePath.WindingFill + capStyle: ShapePath.RoundCap + PathLine { x: root.indicator.width; y: root.indicator.width } + PathLine { x: 0; y: root.indicator.width } + PathLine { x: (root.indicator.width) / 2; y: 0 } + } + } + Skin.EmbeddedBackground { + anchors.topMargin: root.indicator.width + anchors.fill: parent + ListView { + clip: true + + anchors.fill: parent - contentItem: ListView { - clip: true - implicitHeight: contentHeight - model: root.popup.visible ? root.delegateModel : null - currentIndex: root.highlightedIndex + bottomMargin: 0 + leftMargin: 0 + rightMargin: 0 + topMargin: 0 - ScrollIndicator.vertical: ScrollIndicator { + model: root.popup.visible ? root.delegateModel : null + currentIndex: root.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { + } + } + } + } + DropShadow { + anchors.fill: parent + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + color: "#000000" + source: content } } - background: Skin.EmbeddedBackground { - } + background: Item {} } } diff --git a/res/qml/ControlSlider.qml b/res/qml/ControlSlider.qml index 0afd7021c0d4..82d2709e60bc 100644 --- a/res/qml/ControlSlider.qml +++ b/res/qml/ControlSlider.qml @@ -2,15 +2,19 @@ import "." as Skin import Mixxx 1.0 as Mixxx import QtQuick 2.12 -Skin.Slider { - property alias group: control.group - property alias key: control.key +Skin.Fader { + id: root + + required property string group + required property string key value: control.parameter onMoved: control.parameter = value Mixxx.ControlProxy { id: control + group: root.group + key: root.key } TapHandler { diff --git a/res/qml/Fader.qml b/res/qml/Fader.qml new file mode 100644 index 000000000000..bcae15fdde9b --- /dev/null +++ b/res/qml/Fader.qml @@ -0,0 +1,49 @@ +import Mixxx.Controls 1.0 as MixxxControls +import Qt5Compat.GraphicalEffects +import QtQuick 2.12 +import "Theme" + +MixxxControls.Slider { + id: root + + property alias fg: handleImage.source + property alias bg: backgroundImage.source + + bar: true + barMargin: 10 + implicitWidth: backgroundImage.implicitWidth + implicitHeight: backgroundImage.implicitHeight + + Image { + id: handleImage + + visible: false + source: Theme.imgSliderHandle + fillMode: Image.PreserveAspectFit + } + + handle: Item { + id: handleItem + + width: handleImage.paintedWidth + height: handleImage.paintedHeight + x: root.horizontal ? (root.visualPosition * (root.width - width)) : ((root.width - width) / 2) + y: root.vertical ? (root.visualPosition * (root.height - height)) : ((root.height - height) / 2) + + DropShadow { + source: handleImage + width: parent.width + 5 + height: parent.height + 5 + radius: 5 + verticalOffset: 5 + color: "#80000000" + } + } + + background: Image { + id: backgroundImage + + anchors.fill: parent + anchors.margins: root.barMargin + } +} diff --git a/res/qml/FormButton.qml b/res/qml/FormButton.qml new file mode 100644 index 000000000000..ac6ac3ad6ce8 --- /dev/null +++ b/res/qml/FormButton.qml @@ -0,0 +1,175 @@ +import Qt5Compat.GraphicalEffects +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import "Theme" + +AbstractButton { + id: root + + property color normalColor: Theme.white + property color backgroundColor: "#3F3F3F" + property color activeColor: Theme.deckActiveColor + property color pressedColor: activeColor + property bool highlight: false + + implicitWidth: 98 + implicitHeight: 20 + states: [ + State { + name: "pressed" + when: root.pressed + + PropertyChanges { + backgroundImage.color: root.checked ? "#3a60be" : root.backgroundColor + } + + PropertyChanges { + label.color: root.pressedColor + } + + PropertyChanges { + bottomInnerEffect.color: '#353535' + } + + PropertyChanges { + topInnerEffect.color: '#353535' + } + + PropertyChanges { + labelGlow.visible: true + } + + }, + State { + name: "active" + when: (root.highlight || root.checked) && !root.pressed + + PropertyChanges { + backgroundImage.color: "#2D4EA1" + } + + PropertyChanges { + label.color: root.activeColor + } + + PropertyChanges { + bottomInnerEffect.color: '#353535' + } + + PropertyChanges { + topInnerEffect.color: '#353535' + } + + PropertyChanges { + labelGlow.visible: true + } + + }, + State { + name: "inactive" + when: !root.checked && !root.highlight && !root.pressed + + PropertyChanges { + label.color: root.normalColor + } + + PropertyChanges { + labelGlow.visible: false + } + } + ] + + background: Item { + anchors.fill: parent + + Rectangle { + id: backgroundImage + visible: false + + anchors.fill: parent + color: root.backgroundColor + radius: 4 + } + InnerShadow { + id: bottomInnerEffect + anchors.fill: parent + radius: 8 + samples: 16 + spread: 0.3 + horizontalOffset: -1 + verticalOffset: -1 + color: "transparent" + source: backgroundImage + } + InnerShadow { + id: topInnerEffect + anchors.fill: parent + radius: 8 + samples: 16 + spread: 0.3 + horizontalOffset: 1 + verticalOffset: 1 + color: "transparent" + source: bottomInnerEffect + } + + DropShadow { + id: dropEffect + anchors.fill: parent + horizontalOffset: 0 + verticalOffset: 0 + radius: 4.0 + color: "#0E0E0E" + source: topInnerEffect + } + } + + contentItem: Item { + anchors.fill: parent + + Glow { + id: labelGlow + + anchors.fill: parent + radius: 1 + spread: 0.1 + color: label.color + source: label + } + + Label { + id: label + + visible: root.text != null + + anchors.fill: parent + text: root.text + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + font.family: Theme.fontFamily + font.capitalization: Font.AllUppercase + font.bold: true + font.pixelSize: Theme.buttonFontPixelSize + color: root.normalColor + } + Image { + id: image + + height: icon.height + width: icon.width + anchors.centerIn: parent + + source: icon.source + fillMode: Image.PreserveAspectFit + asynchronous: true + visible: false + } + ColorOverlay { + anchors.fill: image + source: image + visible: icon.source != null + color: root.normalColor + antialiasing: true + } + } +} diff --git a/res/qml/OrientationToggleButton.qml b/res/qml/OrientationToggleButton.qml index 280cd3baf443..556c69fc2bec 100644 --- a/res/qml/OrientationToggleButton.qml +++ b/res/qml/OrientationToggleButton.qml @@ -13,7 +13,7 @@ Item { implicitWidth: 56 implicitHeight: 26 - Skin.Slider { + Skin.Fader { id: orientationSlider anchors.fill: parent @@ -28,7 +28,7 @@ Item { stepSize: 1 value: control.value orientation: Qt.Horizontal - snapMode: Slider.SnapOnRelease + snapMode: Fader.SnapOnRelease onMoved: { // The slider's `value` is not updated until after the move ended. const val = valueAt(visualPosition); diff --git a/res/qml/Settings/AudioConnection.qml b/res/qml/Settings/AudioConnection.qml new file mode 100644 index 000000000000..5dac3d13b7a5 --- /dev/null +++ b/res/qml/Settings/AudioConnection.qml @@ -0,0 +1,173 @@ +import QtQuick 2.12 +import QtQuick.Shapes +import "../Theme" + +Item { + id: root + + enum Flags { + AboutToDelete = 1, + CannotConnect = 2 + } + + required property var source + required property var router + property var sink: undefined + property var target: source.mapToItem(router, source.width/2, source.height/2) + + property bool system: false + property bool vertical: false + property bool existing: false + property int flags: 0 + + readonly property bool ready: !!source && !!sink + + visible: !source || !sink || source.visible && sink.visible + + z: 0 + + states: [ + State { + name: "warning" + when: root.flags + + PropertyChanges { + line.strokeColor: Theme.warningColor + } + + PropertyChanges { + root.z: 50 + } + }, + State { + name: "system" + when: root.system + + PropertyChanges { + line.strokeColor: Theme.darkGray2 + } + }, + State { + name: "existing" + when: root.existing + + PropertyChanges { + line.strokeColor: Theme.midGray + } + }, + State { + name: "setting" + when: root.sink === undefined + + PropertyChanges { + line.strokeColor: Theme.accentColor + } + + PropertyChanges { + root.z: 50 + } + }, + State { + name: "set" + when: root.sink != undefined && !root.existing + + PropertyChanges { + line.strokeColor: Theme.accentColor + } + } + ] + + property var sourcePosition: source.mapToItem(router, source.width/2, source.height/2) + property var sinkPosition: sink ? sink.mapToItem(router, sink.width/2, sink.height/2) : target + + onSinkPositionChanged: { + scale.xScale = sourcePosition.x > sinkPosition.x ? -1 : 1 + scale.yScale = sourcePosition.y > sinkPosition.y ? -1 : 1 + } + + onSourcePositionChanged: { + scale.xScale = sourcePosition.x > sinkPosition.x ? -1 : 1 + scale.yScale = sourcePosition.y > sinkPosition.y ? -1 : 1 + } + + x: sourcePosition.x + y: sourcePosition.y + width: Math.max(2, Math.abs(sourcePosition.x - sinkPosition.x)) + height: Math.max(2, Math.abs(sourcePosition.y - sinkPosition.y)) + + onSinkChanged: { + if (sink != null && source != null) { + // swap entities if the connection was made backward + if (source.type !== "source") { + let swap = root.source + root.source = root.sink + root.sink = swap + return; + } + target = null + if (sink.connections !== undefined) { + sink.connections.add(root) + } else { + sink.connection = root + } + if (source.connections !== undefined) { + source.connections.add(root) + } else { + source.connection = root + } + } + } + onSourceChanged: { + if (sink != null && source != null) { + // swap entities if the connection was made backward + if (source.type !== "source") { + let swap = root.source + root.source = root.sink + root.sink = swap + return; + } + target = null + if (sink.connections !== undefined) { + sink.connections.add(root) + } else { + sink.connection = root + } + if (source.connections !== undefined) { + source.connections.add(root) + } else { + source.connection = root + } + } + } + onTargetChanged: { + if (!source) + return + scale.xScale = sourcePosition.x > sinkPosition.x ? -1 : 1 + scale.yScale = sourcePosition.y > sinkPosition.y ? -1 : 1 + } + + Shape { + anchors.fill: parent + // anchors.centerIn: parent + antialiasing: true + layer.enabled: true + layer.samples: 16 + layer.textureMirroring: ShaderEffectSource.MirrorHorizontally + ShapePath { + id: line + strokeColor: Theme.midGray + strokeWidth: 2 + fillColor: "transparent" + capStyle: ShapePath.RoundCap + joinStyle: ShapePath.BevelJoin + + startX: 1 + startY: 1 + PathQuad { x: root.width * 0.5; y: root.height * 0.5; controlX: root.width * (root.vertical ? 0 : 0.3); controlY : root.height * (root.vertical ? 0.3 : 0) } + PathQuad { x: root.width; y: root.height; controlX: root.width * (root.vertical ? 1 : 0.7); controlY : root.height * (root.vertical ? 0.7 : 1) } + } + } + transform: Scale { + id: scale + } +} diff --git a/res/qml/Settings/AudioEntity.qml b/res/qml/Settings/AudioEntity.qml new file mode 100644 index 000000000000..d797ba96ef13 --- /dev/null +++ b/res/qml/Settings/AudioEntity.qml @@ -0,0 +1,326 @@ +import QtQuick 2.12 +import QtQuick.Controls +import QtQuick.Layouts +import ".." as Skin +import "../Theme" + +Item { + id: root + + signal connect(var entity) + signal disconnect(var entity) + + signal scrolled() + signal gatewayReady(string address, Item node) + + required property string name + required property string group + property list gateways: [] + property bool advanced: false + + implicitHeight: 54 + 32 * gatewayRepeater.visibleChannels + width: 135 + z: 10 + + onGatewaysChanged: { + gatewayRepeater.visibleChannels = root.gateways.length + } + + property alias handleSource: handleSourceEdge + property alias handleSink: handleSinkEdge + + property var metaType: null + Rectangle { + id: content + radius: 15 + color: Theme.darkGray3 + anchors.fill: parent + anchors.margins: 8 + Column { + id: gatewayColumn + anchors.fill: parent + padding: 0 + spacing: 4 + + Item { + height: nameLabel.implicitHeight + 18 + width: parent.width + Label { + id: nameLabel + anchors.fill: parent + anchors.margins: 9 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignTop + text: name + color: Theme.white + elide: Text.ElideRight + font.pixelSize: 15 + fontSizeMode: Text.Fit + } + } + + Repeater { + id: gatewayRepeater + model: root.gateways + property int visibleChannels: root.gateways.length + Repeater { + id: node + + required property int index + readonly property string label: root.gateways[index].name + readonly property string address: root.gateways[index].address || root.gateways[index].name + readonly property var channels: root.gateways[index].channels || [0, 1] + readonly property var instances: root.gateways[index].instances || 1 + readonly property string type: root.gateways[index].type + readonly property bool advanced: root.gateways[index].advanced || false + readonly property bool required: !!root.gateways[index].required + + model: node.channels.length/2 * instances + + property list channelAssignation: [...Array(node.channels.length/2)].map((_, i) => i) + + function availableEdge() { + for (let i = 0; i < node.count; i++) { + let current = node.itemAt(i); + if (current.edgeItem.connection) continue; + return i; + } + } + function assignedEdges() { + let assignation = {} + for (let i = 0; i < node.count; i++) { + let current = node.itemAt(i); + if (current.edgeItem.connection) { + assignation[node.channelAssignation[i]] = current.edgeItem.connection + } + } + return assignation + } + property int connectionCount: 0 + Item { + id: channel + + required property int index + property alias edgeItem: edge + property bool counted: channel.index == 0 + + visible: (edgeItem.connection?.ready || index == node.connectionCount) && (!node.advanced || root.advanced) + onVisibleChanged: { + if (counted != channel.visible) + gatewayRepeater.visibleChannels += channel.visible ? 1 : -1 + counted = channel.visible + } + + width: parent.width + height: 28 + RowLayout { + anchors { + left: parent.left + right: parent.right + leftMargin: 15 + rightMargin: 15 + } + id: inputLabel + Label { + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter + Layout.preferredHeight: 28 + verticalAlignment: Text.AlignVCenter + text: node.instances == 1 ? label : `${label} #${index+1}` + color: Theme.white + elide: Text.ElideRight + font.pixelSize: 10 + fontSizeMode: Text.Fit + } + // Item { + // Layout.fillWidth: true + // } + Skin.ComboBox { + Layout.minimumWidth: implicitWidth + id: channelSelector + property int previousIndex: node.channelAssignation[channel.index] ?? 0 + visible: node.count > 1 && node.channels.length > 2 + spacing: 2 + clip: true + + font.pixelSize: 12 + model: { + return [...Array(node.channels.length/2)].map((e, i) => `Ch ${i * 2 + node.channels[0] + 1} - ${i * 2 + node.channels[0] + 2}`); + } + currentIndex: node.channelAssignation[channel.index] ?? 0 + onActivated: (activatedIndex) => { + let alreadyAssigned = node.channelAssignation.indexOf(activatedIndex) + node.channelAssignation[alreadyAssigned] = previousIndex + node.channelAssignation[channel.index] = activatedIndex + } + } + } + Rectangle { + id: edge + property var entity: root + property var advanced: node.advanced + property int instance: index / (node.channels.length/2) + property string type: node.type + property string group: root.group + property var address: node.address + + anchors.horizontalCenter: type == "source" ? parent.right : parent.left + anchors.verticalCenter: inputLabel.verticalCenter + + property var connection: null + property bool counted: false + property bool connecting: false + + onConnectionChanged: { + if (counted != !!edge.connection) + node.connectionCount += edge.connection ? 1 : -1 + counted = !!edge.connection + } + + function updateConnectionPosition() { + if (edge.connection && edge.connection.source == edge) { + edge.connection.sourcePosition = edge.mapToItem(edge.connection.router, edge.width/2, edge.height/2) + } else if (edge.connection && edge.connection.sink == edge) { + edge.connection.sinkPosition = edge.mapToItem(edge.connection.router, edge.width/2, edge.height/2) + } + } + + Connections { + target: root + function onScrolled() { + edge.updateConnectionPosition() + } + function onXChanged() { + edge.updateConnectionPosition() + } + function onYChanged() { + edge.updateConnectionPosition() + } + } + + Connections { + target: channel + function onHeightChanged() { + edge.updateConnectionPosition() + } + function onYChanged() { + edge.updateConnectionPosition() + } + } + + color: Theme.midGray + width: 10 + height: width + radius: width/2 + z: 100 + + states: [ + State { + name: "idle" + }, + State { + name: "warning" + when: (!edge.connection && node.required) || (edge.connection && edge.connection.state == "warning") + + PropertyChanges { + edge.width: 15 + edge.color: Theme.warningColor + } + }, + State { + name: "hidden" + when: edge.connection && !edge.connection.visible + + PropertyChanges { + channel.opacity: 0.5 + } + }, + State { + name: "setting" + when: edge.connection && !edge.connection.existing || edge.connecting + + PropertyChanges { + edge.width: 15 + edge.color: Theme.accentColor + } + } + ] + + MouseArea { + id: edgeMouseArea + hoverEnabled: edge.connection != null && edge.connection.visible + anchors.fill: parent + onPressed: { + if (edge.connection && edge.connection.flags & AudioConnection.Flags.AboutToDelete) { + root.disconnect(edge.connection) + } else if (edge.connection == null) { + root.connect(parent) + } + } + onEntered: { + if (edge.connection) { + edge.connection.flags |= AudioConnection.Flags.AboutToDelete + } + } + onExited: { + if (edge.connection) { + edge.connection.flags &= ~AudioConnection.Flags.AboutToDelete + } + } + } + } + } + Component.onCompleted: { + root.gatewayReady(address, node) + } + } + } + } + AudioEntityEdge { + id: handleSourceEdge + entity: root + type: "source" + + Connections { + target: root + + function onImplicitHeightChanged() { + handleSourceEdge.updateConnectionPosition() + } + function onXChanged() { + handleSourceEdge.updateConnectionPosition() + } + function onYChanged() { + handleSourceEdge.updateConnectionPosition() + } + } + + anchors.horizontalCenter: handleSourceEdge.vertical ? parent.horizontalCenter : parent.right + anchors.verticalCenter: handleSourceEdge.vertical ? parent.bottom : undefined + anchors.top: handleSourceEdge.vertical ? undefined :parent.top + anchors.topMargin: handleSourceEdge.vertical ? 0 :16 + } + AudioEntityEdge { + id: handleSinkEdge + entity: root + type: "sink" + + Connections { + target: root + + function onImplicitHeightChanged() { + handleSinkEdge.updateConnectionPosition() + } + function onXChanged() { + handleSinkEdge.updateConnectionPosition() + } + function onYChanged() { + handleSinkEdge.updateConnectionPosition() + } + } + + anchors.horizontalCenter: handleSinkEdge.vertical ? parent.horizontalCenter : parent.left + anchors.verticalCenter: handleSinkEdge.vertical ? parent.top : parent.verticalCenter + } + } +} diff --git a/res/qml/Settings/AudioEntityEdge.qml b/res/qml/Settings/AudioEntityEdge.qml new file mode 100644 index 000000000000..45b67f584b52 --- /dev/null +++ b/res/qml/Settings/AudioEntityEdge.qml @@ -0,0 +1,24 @@ +import QtQuick 2.12 + +Rectangle { + id: root + property bool vertical: false + required property var entity + required property string type + + property var connections: new Set() + + color: 'transparent' + width: 10 + height: 10 + + function updateConnectionPosition() { + for (let connection of connections) { + if (connection && connection.source == root) { + connection.sourcePosition = root.mapToItem(connection.router, root.width/2, root.height/2) + } else if (connection && connection.sink == root) { + connection.sinkPosition = root.mapToItem(connection.router, root.width/2, root.height/2) + } + } + } +} diff --git a/res/qml/Settings/AudioRouter.qml b/res/qml/Settings/AudioRouter.qml new file mode 100644 index 000000000000..48a0a8ba6fb1 --- /dev/null +++ b/res/qml/Settings/AudioRouter.qml @@ -0,0 +1,790 @@ +import Mixxx 1.0 as Mixxx +import QtQuick 2 +import QtQuick.Layouts +import "../Theme" + +Rectangle { + id: root + color: '#0E0E0E' + radius: 5 + clip: true + + enum Mode { + Simple, + Advanced, + Legacy + } + + property var connections: new Set() + property var selectedTab: "" + property var newConnection: null + readonly property var mode: modeChoice.selected == "simple" ? AudioRouter.Mode.Simple : modeChoice.selected == "legacy" ? AudioRouter.Mode.Legacy : AudioRouter.Mode.Advanced + + property int hiddenConnections: 2 + + onModeChanged: { + updateHiddenConnectionCount() + } + + property var manager: Mixxx.SoundManager + + property Component connectionEdge: Qt.createComponent("AudioConnection.qml") + + property var inputDevices: new Object() + property var outputDevices: new Object() + + property var system: new Object() + property bool hasChanges: false + + property alias multiSoundcard: multiSoundcardChoice + + property var inputs: new Object() + property var outputs: new Object() + + function updateHiddenConnectionCount() { + root.hiddenConnections = 0 + if (root.mode == AudioRouter.Mode.Simple) { + for (let connection of root.connections) { + if (connection.source?.advanced || connection.sink?.advanced) { + root.hiddenConnections += 1 + } + } + } + } + + // FriendlyName aims to parse the raw device name extract it in such a way that it gets grouped within the UI + // Note that naming structures changes across API and devices. This function is experimental and aims to be extended with more logic + // If not extraction works, it will fallback to return the device name as "card name" (a.k.a a group on the router) and a single channel names "Default" + function friendlyName(api, rawName) { + // "api" value can be found in https://github.com/PortAudio/portaudio + switch (api) { + // TODO unimplemented, need some data or platform to test with + // case "JACK Audio Connection Kit": + // case "OSS": + // case "iOS Audio": + // case "Core Audio": + // case "AudioIO": + // case "AudioScience HPI": + // case "PulseAudio": + // case "sndio": + + case "ALSA": { + const hwAlsa = / (\(hw:\d+,\d+\))/; + let components = rawName.split(':') + let cardName = components.shift().trim() + let deviceName = components.length > 0 ? components.join(":").trim().replace(hwAlsa, "") : "Default" + return [cardName, deviceName] + } + case "MME": { + // API truncates the name to 31 chars + if (rawName.length === 31 && rawName.substr(-1) !== ')') { + const match = /(.+) \((.*)/.exec(rawName) + if (match) { + const [_, deviceName, cardName, ..._loopback] = match + return [cardName, deviceName] + } + break + } + } + case "ASIO": + case "Windows DirectSound": + case "Windows WASAPI": { + const match = /(.+) \((.*)\)( \[Loopback\])?/.exec(rawName) + if (match) { + const [_, deviceName, cardName, ..._loopback] = match + return [cardName, deviceName] + } + break + } + case "Windows WDM-KS": { + const match = /(.+) \((.*)\)( \[Loopback\])?/.exec(rawName.replace(/\r?\n/g, '')) + if (match) { + let [_, deviceName, cardName, ..._loopback] = match + if (cardName.startsWith("@System32\\drivers")) { + let components = cardName.split(";") + cardName = components[components.length - 1] + } + return [cardName, deviceName] + } + break + } + } + + return [rawName, ""] + } + + function generateDeviceList(api, devices, existing) { + console.log(`generating device list for: ${JSON.stringify(devices)}`) + let cards = {} + // cardName -> deviceName -> duplicateCount + let deviceNameDuplicate = {} + for (let device of devices) { + let [cardName, deviceName] = root.friendlyName(api, device.displayName) + cardName = !cardName ? "Unnamed card" : cardName + deviceName = !deviceName ? "Default" : deviceName + console.log(`cardName=${cardName},deviceName=${deviceName}`) + if (cards[cardName] === undefined) { + cards[cardName] = { + gateways: { + [deviceName]: { + name: deviceName, + node: existing[cardName]?.gateways?.[deviceName]?.node ?? null, + device: device, + channels: device.channelCount + } + }, + channelCount: device.channelCount, + } + continue + } + console.log(`cards=${cards[cardName]}`) + + // If the group (card name) has already a "Default" channel, we add the new channel as "Default #N" for better UX + if (cards[cardName].gateways[deviceName] !== undefined) { + if (deviceNameDuplicate[cardName] === undefined) { + deviceNameDuplicate[cardName] = { + [deviceName]: 1 + } + } else { + deviceNameDuplicate[cardName][deviceName] = (deviceNameDuplicate[cardName][deviceName] ?? 0) + 1 + } + deviceName = `${deviceName} #${deviceNameDuplicate[cardName][deviceName] + 1}` + } + + cards[cardName].gateways[deviceName] = { + name: deviceName, + node: existing[cardName]?.gateways?.[deviceName]?.node ?? null, + device: device, + channels: device.channelCount + } + cards[cardName].channelCount += device.channelCount + } + return cards + } + + function update(api) { + console.log(`Using sound api: ${api} ${typeof api}`) + root.inputs = generateDeviceList(api, manager.availableInputDevices(api), root.inputs) + root.outputs = generateDeviceList(api, manager.availableOutputDevices(api), root.outputs) + root.loadConnections() + } + + function registerInputEdge(device, address, node) { + root.inputs[device].gateways[address].node = node + if (root.inputs[device].gateways[address].delayedConnections) { + addExistingConnection(node, root.inputs[device].gateways[address].delayedConnections) + root.inputs[device].gateways[address].delayedConnections = undefined + } + } + function registerOutputEdge(device, address, node) { + root.outputs[device].gateways[address].node = node + if (root.outputs[device].gateways[address].delayedConnections) { + addExistingConnection(node, root.outputs[device].gateways[address].delayedConnections) + root.outputs[device].gateways[address].delayedConnections = undefined + } + } + + readonly property list audioTypeMap: [ + {entity: "Mixer",channel: "Main"}, // Main, + {entity: "Mixer",channel: "PFL"}, // Headphones, + {entity: "Mixer",channel: "Booth"}, // Booth, + {entity: "Mixer",channel: "Bus"}, // Bus, + {entity: "Deck",channel: "Output"}, // Deck, + {entity: "Deck",channel: "Vinyl Control"}, // VinylControl, + {entity: "Mixer",channel: "Microphone"}, // Microphone, + {entity: "Mixer",channel: "Auxiliary"}, // Auxiliary, + {entity: "Record",channel: "Additional input"}, // RecordBroadcast, + ] + + function addExistingConnection(node, connections) { + if (!connections) return; + for (let connection of connections) { + let typeDef = audioTypeMap[connection.type] + let source = root.system[typeDef.entity].gateways[typeDef.channel][connection.index].edgeItem + let availableEdge = node.availableEdge() + if (!source || availableEdge === null) { + console.error("Unable to get the source and sink of the existing connection!", source, availableEdge) + continue; + } + let connectionItem = root.connectionEdge.createObject(root, { + "existing": true, + "router": root, + "source": source, + "sink": node.itemAt(availableEdge).edgeItem, + }) + root.connections.add(connectionItem) + node.channelAssignation[availableEdge] = connection.channelGroup / 2 + } + root.updateHiddenConnectionCount() + } + + function loadConnections() { + while (root.connections.size) { + let connection = root.connections.keys().next().value; + root.entityOnDisconnect(connection) + } + + for (let device of Object.keys(root.outputs)) { + for (let address of Object.keys(root.outputs[device].gateways)) { + let gateway = root.outputs[device].gateways[address] + let node = gateway.node + let connections = root.outputs[device].gateways[address].device.connections(Mixxx.SoundManager) + + if (!connections) continue; + if (node) { + addExistingConnection(node, connections) + } else if (connections.length) { + root.outputs[device].gateways[address].delayedConnections = connections + } + } + } + + for (let device of Object.keys(root.inputs)) { + for (let address of Object.keys(root.inputs[device].gateways)) { + let gateway = root.inputs[device].gateways[address] + let node = gateway.node + let connections = root.inputs[device].gateways[address].device.connections(Mixxx.SoundManager) + console.log("INPUT", gateway, node, connections) + + if (!connections) continue; + if (node) { + addExistingConnection(node, connections) + } else if (connections.length) { + root.inputs[device].gateways[address].delayedConnections = connections + } + } + } + + root.hasChanges = false + } + + MouseArea { + enabled: root.newConnection != null + anchors.fill: parent + hoverEnabled: true + preventStealing: true + onPositionChanged: (mouse) => { + if (root.newConnection) { + root.newConnection.target = Qt.point(mouse.x, mouse.y) + } + } + onExited: { + if (root.newConnection) { + root.newConnection.destroy(); + root.newConnection.source.connection = null + root.newConnection = null + } + } + onPressed: { + if (root.newConnection) { + root.newConnection.destroy(); + root.newConnection.source.connection = null + root.newConnection = null + } + } + } + + function entityOnConnect(edge) { + if (root.newConnection != null) { + if (edge.type == root.newConnection.source.type || edge.group == root.newConnection.source.group || edge.entity == root.newConnection.source.entity) { + root.newConnection.flags |= AudioConnection.Flags.CannotConnect + return; + } + root.newConnection.source.connecting = false + if (root.newConnection.source == edge) { + root.newConnection.destroy(); + } else { + root.newConnection.sink = edge + root.connections.add(root.newConnection) + root.hasChanges = true + } + root.newConnection = null + } else { + root.newConnection = connectionEdge.createObject(root, {"router": root, "source": edge}); + } + } + + function entityOnDisconnect(connection) { + var sink = connection.sink; + var source = connection.source; + root.connections.delete(connection) + if (connection.existing) + root.hasChanges = true + + if (source != null) { + if (source.connection !== undefined) { + source.connection = null + } else { + source.connections.delete(connection) + } + } + + if (sink != null) { + if (sink.connection !== undefined) { + sink.connection = null + } else { + sink.connections.delete(connection) + } + } + connection.destroy() + } + + RowLayout { + anchors.fill: parent + + ColumnLayout { + visible: root.mode == AudioRouter.Mode.Advanced + Layout.fillHeight: true + Layout.minimumWidth: 200 + Layout.maximumWidth: 220 + Text { + Layout.alignment: Qt.AlignHCenter + Layout.margins: 15 + text: "Inputs" + color: '#626262' + font.pixelSize: 14 + } + + ListView { + id: inputList + Layout.margins: 15 + Layout.fillHeight: true + Layout.fillWidth: true + model: Object.keys(root.inputs) + clip: true + reuseItems: false + spacing: 15 + delegate: AudioEntity { + id: inputEntity + required property var modelData + width: ListView.view.width + + name: modelData + group: "external" + gateways: { + let channels = [] + let maxChannelPerInput = 4 / root.inputs[modelData].channelCount; + for (let item of Object.values(root.inputs[modelData].gateways)) { + let channel = 0 + for (; channel < item.channels && channel <= maxChannelPerInput; channel += 2) { + channels.push({ + name: item.name, + address: item.address, + channels: [channel, channel+1], + type: "source", + advanced: true + }); + } + + if (channel < item.channels) { + let start = channels[channels.length-1].channels[0] + let channelPicker = [...Array(item.channels - start)] + channels[channels.length-1].channels = channelPicker.map((_, i) => start+i) + } + } + return channels; + } + advanced: root.mode == AudioRouter.Mode.Advanced + + onGatewayReady: (address, node) => { + root.registerInputEdge(modelData, address, node) + } + + onConnect: (point) => root.entityOnConnect(point) + onDisconnect: (point) => root.entityOnDisconnect(point) + Connections { + target: inputList + function onContentYChanged() { + inputEntity.scrolled() + } + function onXChanged() { + inputEntity.scrolled() + } + function onYChanged() { + inputEntity.scrolled() + } + function onWidthChanged() { + inputEntity.scrolled() + } + function onHeightChanged() { + inputEntity.scrolled() + } + } + } + } + } + Rectangle { + visible: root.mode == AudioRouter.Mode.Advanced + Layout.fillHeight: true + Layout.preferredWidth: 1 + color: '#626262' + } + ColumnLayout { + id: mainCanvas + RowLayout { + Layout.topMargin: 6 + Layout.bottomMargin: 3 + Item { + Layout.fillWidth: true + } + RatioChoice { + id: modeChoice + options: [ + "simple", + !root.hiddenConnections ? "advanced" : "advanced (!)", + "legacy" + ] + onOptionsChanged: { + if (modeChoice.selected.startsWith("advanced")) { + modeChoice.selected = options[1] + } + } + tooltips: !root.hiddenConnections ? [] : [null, `${root.hiddenConnections} connection${root.hiddenConnections > 1 ? 's' : ''} hidden\nUse the advanced mode to view them`, null] + } + } + Item { + Layout.fillHeight: true + } + RowLayout { + Layout.bottomMargin: 3 + RatioChoice { + id: multiSoundcardChoice + normalizedWidth: false + options: [ + "experimental", + "default", + "disabled" + ] + tooltips: [ + "No delay", + "Long delay", + "Short delay" + ] + + onSelectedChanged: { + root.hasChanges = true + } + + Mixxx.SettingParameter { + label: "Multi-Soundcard Synchronization" + } + } + Text { + text: "Multi-Soundcard Synchronization" + color: Theme.white + font.pixelSize: 14 + } + Item { + Layout.fillWidth: true + } + } + } + Rectangle { + visible: root.mode != AudioRouter.Mode.Legacy + Layout.fillHeight: true + Layout.preferredWidth: 1 + color: '#626262' + } + + ColumnLayout { + visible: root.mode != AudioRouter.Mode.Legacy + Layout.fillHeight: true + Layout.minimumWidth: 200 + Layout.maximumWidth: 220 + Text { + Layout.alignment: Qt.AlignHCenter + Layout.margins: 15 + text: "Outputs" + color: '#626262' + font.pixelSize: 14 + } + + ListView { + id: outputList + Layout.margins: 15 + Layout.fillHeight: true + Layout.fillWidth: true + model: Object.keys(root.outputs) + clip: true + reuseItems: false + spacing: 15 + cacheBuffer: Math.max(0, contentHeight) // Disable lazy loading to make sure all item are loaded and can be bounded to connection + delegate: AudioEntity { + id: outputEntity + required property var modelData + width: ListView.view.width + + name: modelData + group: "external" + gateways: { + let channels = [] + let maxChannelPerOutput = 4 / root.outputs[modelData].channelCount; + for (let item of Object.values(root.outputs[modelData].gateways)) { + let channel = 0 + for (; channel < item.channels && channel <= maxChannelPerOutput; channel += 2) { + channels.push({ + name: item.name, + address: item.address, + channels: [channel, channel+1], + type: "sink" + }); + } + + if (channel < item.channels) { + let start = channels[channels.length-1].channels[0] + let channelPicker = [...Array(item.channels - start)] + channels[channels.length-1].channels = channelPicker.map((_, i) => start+i) + } + } + return channels; + } + + onGatewayReady: (address, node) => { + root.registerOutputEdge(modelData, address, node) + } + + onConnect: (point) => root.entityOnConnect(point) + onDisconnect: (point) => root.entityOnDisconnect(point) + Connections { + target: outputList + function onContentYChanged() { + outputEntity.scrolled() + } + function onXChanged() { + outputEntity.scrolled() + } + function onYChanged() { + outputEntity.scrolled() + } + function onWidthChanged() { + outputEntity.scrolled() + } + function onHeightChanged() { + outputEntity.scrolled() + } + } + } + } + + Item { + Layout.fillHeight: true + } + } + } + + Repeater { + id: decks + model: 4 + AudioEntity { + visible: root.mode != AudioRouter.Mode.Legacy + required property int index + id: deck + x: root.width / (root.mode == AudioRouter.Mode.Advanced ? 4 : 5) + y: (root.height / 5) * (1 + index) - implicitHeight / 2 + + name: `Deck ${index+1}` + group: "internal" + gateways: [{ + name: "Output", + type: "source", + advanced: true + }, { + name: "Vinyl Control", + type: "sink", + advanced: true + } + ] + advanced: root.mode == AudioRouter.Mode.Advanced + + onConnect: (point) => root.entityOnConnect(point) + onDisconnect: (point) => root.entityOnDisconnect(point) + + onGatewayReady: (address, node) => { + if (!root.system["Deck"]) { + root.system["Deck"] = { + gateways: {} + } + } + if (!root.system["Deck"].gateways[address]) { + root.system["Deck"].gateways[address] = [] + } + root.system["Deck"].gateways[address][deck.index] = node.itemAt(0) + } + } + onItemAdded: (index, item) => { + deckConnections.items.push(item) + } + onItemRemoved: (index, item) => { + deckConnections.items.slice(deckConnections.items.indexOf(item), 1) + } + } + + AudioEntity { + visible: root.mode != AudioRouter.Mode.Legacy + id: mixer + + x: root.width / 2 + y: Math.max(root.height / 16 , root.height / (root.mode == AudioRouter.Mode.Advanced ? 3 : 2) - implicitHeight / 2) + + name: "Mixer" + group: "internal" + + advanced: root.mode == AudioRouter.Mode.Advanced + + gateways: [{ + name: "PFL", + type: "source" + }, { + name: "Main", + type: "source", + required: true + }, { + name: "Booth", + type: "source" + }, { + name: "Left Bus", + type: "source", + advanced: true + }, { + name: "Center Bus", + type: "source", + advanced: true + }, { + name: "Right Bus", + type: "source", + advanced: true + }, { + name: "Auxiliary", + type: "sink", + instances: 4, + advanced: true + }, { + name: "Microphone", + type: "sink", + instances: 4, + advanced: true + } + ] + + Mixxx.SettingParameter { + label: "PFL" + } + Mixxx.SettingParameter { + label: "Main" + } + Mixxx.SettingParameter { + label: "Booth" + } + Mixxx.SettingParameter { + label: "Mixer" + } + Mixxx.SettingParameter { + label: "Decks" + } + Mixxx.SettingParameter { + label: "Input" + } + Mixxx.SettingParameter { + label: "Output" + } + Mixxx.SettingParameter { + label: "Broadcast" + } + + handleSource.vertical: mixer.height < root.height*0.75 + + onConnect: (point) => root.entityOnConnect(point) + onDisconnect: (point) => root.entityOnDisconnect(point) + + onGatewayReady: (address, node) => { + if (!root.system["Mixer"]) { + root.system["Mixer"] = { + gateways: {} + } + } + let nodeIdxOffset = 0 + if (address.endsWith(" Bus")) { + nodeIdxOffset = address.startsWith("Left ") ? 0 : address.startsWith("Right ") ? 2 : 1 + address = "Bus" + } + console.log("register", address, nodeIdxOffset) + if (!root.system["Mixer"].gateways[address]) { + root.system["Mixer"].gateways[address] = [] + } + for (let nodeIdx = 0; nodeIdx < node.count; nodeIdx++) { + root.system["Mixer"].gateways[address][nodeIdxOffset + nodeIdx] = node.itemAt(nodeIdx) + } + } + } + Repeater { + id: deckConnections + property list items: [] + model: items + AudioConnection { + visible: root.mode != AudioRouter.Mode.Legacy + required property var modelData + router: root + source: modelData.handleSource + sink: mixer.handleSink + system: true + } + } + AudioEntity { + id: record + visible: root.mode == AudioRouter.Mode.Advanced + + x: root.width / 5 * 3 + y: root.height / 5 * 4 - implicitHeight / 2 + + name: "Record/Broadcast" + group: "internal" + metaType: "sink" + + handleSink.vertical: true + + gateways: [{ + name: "Alternative input", + type: "sink" + } + ] + property var alternativeConnection: null + readonly property bool hasAlternativeConnection: alternativeConnection && alternativeConnection.ready + + onConnect: (point) => { + if (root.newConnection != null) { + record.alternativeConnection = root.newConnection + } + root.entityOnConnect(point) + if (root.newConnection != null) { + record.alternativeConnection = root.newConnection + } + } + onDisconnect: (point) => { + record.alternativeConnection = null + root.entityOnDisconnect(point) + } + + onGatewayReady: (address, node) => { + if (!root.system["Record"]) { + root.system["Record"] = { + gateways: {} + } + } + if (!root.system["Record"].gateways[address]) { + root.system["Record"].gateways[address] = [] + } + node = node.itemAt(0) + root.system["Record"].gateways[address][node.index] = node + } + } + + AudioConnection { + visible: root.mode == AudioRouter.Mode.Advanced && !record.hasAlternativeConnection + + router: root + source: mixer.handleSource + sink: record.handleSink + system: true + vertical: true + } +} diff --git a/res/qml/Settings/RatioChoice.qml b/res/qml/Settings/RatioChoice.qml new file mode 100644 index 000000000000..137e24cf7bc1 --- /dev/null +++ b/res/qml/Settings/RatioChoice.qml @@ -0,0 +1,309 @@ +import QtQuick 2.12 +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Shapes +import Qt5Compat.GraphicalEffects +import "../Theme" +import ".." as Skin + +Item { + id: root + required property list options + property list tooltips: [] + property string selected: options.length ? options[0] : null + property real spacing: 9 + property real maxWidth: 0 + property bool normalizedWidth: true + + onTooltipsChanged: { + popup.close() + } + + FontMetrics { + id: fontMetrics + font.pixelSize: 14 + font.capitalization: Font.AllUppercase + } + + implicitHeight: (contentList.visible ? contentList.height : contentSpin.height) + dropRatio.radius * 2 + implicitWidth: (contentList.visible ? contentList.width : contentSpin.width) + dropRatio.radius * 2 + readonly property real cellSize: { + Math.max.apply(null, options.map((option) => fontMetrics.advanceWidth(option))) + root.spacing*2 + } + + Rectangle { + id: contentList + visible: root.maxWidth == 0 || root.maxWidth > root.cellSize * root.options.length + anchors.centerIn: parent + height: 24 + width: { + if (root.normalizedWidth) { + root.cellSize * root.options.length + root.spacing + } else { + options.reduce((acc, option) => acc + fontMetrics.advanceWidth(option) + root.spacing*2, 0) + root.spacing + } + } + color: '#2B2B2B' + radius: height / 2 + RowLayout { + anchors.fill: parent + Repeater { + model: options + Item { + required property int index + required property var modelData + width: root.normalizedWidth ? root.cellSize : fontMetrics.advanceWidth(modelData) + root.spacing*2 + height: contentList.height + Rectangle { + anchors.fill: parent + color: root.selected == modelData ? Theme.accentColor : 'transparent' + radius: height / 2 + id: contentOption + Text { + text: modelData + color: Theme.white + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + font: fontMetrics.font + } + MouseArea { + anchors.fill: parent + hoverEnabled: !!root.tooltips[index] + onPressed: { + root.selected = modelData + } + + onEntered: { + if (!root.tooltips[index]) return; + popup.tooltip = root.tooltips[index] || "" + popup.x = Qt.binding(function() { return contentOption.mapToItem(root, 0, 0).x + contentOption.width / 2 - popup.width / 2; }) + popup.open() + } + onExited: { + popup.close() + } + } + } + InnerShadow { + visible: root.selected == modelData + id: bottomOptionInnerEffect + anchors.fill: parent + radius: 8 + samples: 32 + spread: 0.4 + horizontalOffset: -1 + verticalOffset: -1 + color: "#0E2A54" + source: contentOption + } + InnerShadow { + visible: root.selected == modelData + id: topOptionInnerEffect + anchors.fill: parent + radius: 8 + samples: 32 + spread: 0.4 + horizontalOffset: 1 + verticalOffset: 1 + color: "#0E2A54" + source: bottomOptionInnerEffect + } + } + } + } + } + SpinBox { + id: contentSpin + visible: !contentList.visible + anchors.centerIn: parent + from: 0 + padding: 0 + spacing: root.spacing + to: root.options.length - 1 + font: fontMetrics.font + value: root.options.indexOf(root.selected) + + property real textWidth: fontMetrics.advanceWidth(root.options.reduce((accumulator, currentValue) => accumulator.length > currentValue.length ? accumulator : currentValue, "")) + + contentItem: Item { + width: contentSpin.textWidth + 2 * contentSpin.spacing + Rectangle { + id: content + anchors.fill: parent + color: Theme.accentColor + radius: height / 2 + Text { + id: textLabel + anchors.fill: parent + text: contentSpin.textFromValue(contentSpin.value, contentSpin.locale) ?? "" + color: Theme.white + font: contentSpin.font + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + } + InnerShadow { + id: bottomInnerEffect + anchors.fill: parent + radius: 8 + samples: 32 + spread: 0.4 + horizontalOffset: -1 + verticalOffset: -1 + color: "#0E2A54" + source: content + } + InnerShadow { + id: topInnerEffect + anchors.fill: parent + radius: 8 + samples: 32 + spread: 0.4 + horizontalOffset: 1 + verticalOffset: 1 + color: "#0E2A54" + source: bottomInnerEffect + } + } + + component Indicator: Rectangle { + required property string text + height: implicitHeight + implicitWidth: 24 + implicitHeight: 24 + radius: parent.height / 2 + color: '#2B2B2B' + border.width: 0 + + Text { + text: parent.text + font.pixelSize: contentSpin.font.pixelSize + color: Theme.white + anchors.fill: parent + fontSizeMode: Text.Fit + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + } + + up.indicator: Indicator { + x: contentSpin.mirrored ? 0 : parent.width - width + text: ">" + } + + down.indicator: Indicator { + x: contentSpin.mirrored ? parent.width - width : 0 + text: "<" + } + + background: Rectangle { + implicitWidth: contentSpin.textWidth + 2 * contentSpin.spacing + 48 + radius: parent.height / 2 + color: '#2B2B2B' + } + + textFromValue: function(value) { + return root.options[value]; + } + + valueFromText: function(text) { + for (var i = 0; i < root.options.length; ++i) { + if (root.options[i].toLowerCase().indexOf(text.toLowerCase()) === 0) + return i + } + return contentSpin.value + } + + onValueChanged: { + root.selected = contentSpin.textFromValue(value) ?? "" + popup.tooltip = root.tooltips[contentSpin.value] ?? "" + popup.x = contentSpin.width / 2 - popup.width / 2 + } + MouseArea { + anchors.fill: parent + hoverEnabled: true + + onEntered: { + if (!root.tooltips[contentSpin.value]) return; + popup.x = contentSpin.width / 2 - popup.width / 2 + popup.open() + } + onExited: { + popup.close() + } + onPressed: { + mouse.accepted = false + } + } + } + DropShadow { + id: dropRatio + anchors.margins: dropRatio.radius + anchors.fill: root + horizontalOffset: 0 + verticalOffset: 0 + radius: 4.0 + color: "#80000000" + source: contentList.visible ? contentList : contentSpin + } + Popup { + id: popup + y: root.height + x: 0 + width: Math.max(tooltip.implicitWidth* 1.5, 50) + height: tooltip.implicitHeight + 15 + closePolicy: Popup.NoAutoClose + + property string tooltip: "" + + padding: 0 + + contentItem: Item { + Item { + id: contentPopup + anchors.fill: parent + Shape { + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + width: 20 + height: width + antialiasing: true + layer.enabled: true + layer.samples: 4 + ShapePath { + fillColor: Theme.embeddedBackgroundColor + strokeColor: Theme.deckBackgroundColor + strokeWidth: 2 + startX: 10; startY: 0 + fillRule: ShapePath.WindingFill + capStyle: ShapePath.RoundCap + PathLine { x: 20; y: 10 } + PathLine { x: 0; y: 10 } + PathLine { x: 10; y: 0 } + } + } + Skin.EmbeddedBackground { + anchors.topMargin: 10 + anchors.fill: parent + Text { + anchors.centerIn: parent + id: tooltip + color: Theme.white + text: popup.tooltip + } + } + } + DropShadow { + anchors.fill: parent + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + color: "#000000" + source: contentPopup + } + } + + background: Item {} + } +} diff --git a/res/qml/Settings/SoundHardware.qml b/res/qml/Settings/SoundHardware.qml index b1b6f70c9de2..16ca0c5d56c9 100644 --- a/res/qml/Settings/SoundHardware.qml +++ b/res/qml/Settings/SoundHardware.qml @@ -1,5 +1,8 @@ import QtQuick +import QtQuick.Layouts import Mixxx 1.0 as Mixxx +import ".." as Skin +import "../Theme" Category { id: root @@ -7,58 +10,630 @@ Category { label: "Sound hardware" tabs: ["engine", "delays", "stats"] - Mixxx.SettingGroup { - label: "Engine" - visible: root.selectedIndex == 0 + property bool hasChanges: router.hasChanges + property bool committing: false - onActivated: { - root.selectedIndex = 0; - } + Mixxx.ControlProxy { + id: mainEnabled + group: "[Master]" + key: "enabled" + } + Mixxx.ControlProxy { + id: headEnabled + group: "[Master]" + key: "headEnabled" + } + Mixxx.ControlProxy { + id: boothEnabled + group: "[Master]" + key: "booth_enabled" + } + Mixxx.ControlProxy { + id: mainDelay + group: "[Master]" + key: "delay" + } + Mixxx.ControlProxy { + id: headDelay + group: "[Master]" + key: "headDelay" + } + Mixxx.ControlProxy { + id: boothDelay + group: "[Master]" + key: "boothDelay" + } + Mixxx.ControlProxy { + id: monoMix + group: "[Master]" + key: "mono_mixdown" + } + Mixxx.ControlProxy { + id: micMonitorMode + group: "[Master]" + key: "talkover_mix" + } - Mixxx.SettingParameter { - label: "A cyan square" + function save() { + const manager = Mixxx.SoundManager; + mainEnabled.value = mainMixEnabled.options.indexOf(mainMixEnabled.selected) + monoMix.value = !mainOutputMode.options.indexOf(mainOutputMode.selected) + manager.setForceNetworkClock(soundClock.options[1] == soundClock.selected) + manager.setSampleRate(parseInt(sampleRate.selected)) + manager.setAudioBufferSizeIndex(audioBuffer.currentIndex + 1) + micMonitorMode.value = microphoneMonitorMode.currentIndex + manager.setAPI(soundApi.selected) + manager.setKeylockEngine(keylock.options.indexOf(keylock.selected)) - Rectangle { - color: 'cyan' - height: 20 - width: 20 + // Router + manager.setSyncBuffers(router.multiSoundcard.options.indexOf(router.multiSoundcard.selected)) + + let connectionsHandler = (connections, device) => { + for (let channel of Object.keys(connections)) { + let connection = connections[channel] + let type; + let index = 0; + let isOutput = true + if (connection.source.entity.name == "Mixer") { + switch (connection.source.address) { + case "Main": + type = 0; + break; + case "PFL": + type = 1; + break; + case "Booth": + type = 2; + break; + case "Left Bus": + case "Center Bus": + case "Right Bus": + index = connection.source.address.startsWith("Left") ? 0 : connection.source.address.startsWith("Right") ? 2 : 1; + type = 3; + break; + default: + console.error(`unsupported address: ${connection.source.address}`) + continue; + } + } else if (connection.sink.entity.name == "Mixer") { + isOutput = false; + type = connection.sink.address == "Auxiliary" ? 7 : 6; + index = connection.sink.instance; + } else if (connection.source.entity.name.startsWith("Deck ") && connection.source.address == "Output") { + type = 4; + index = parseInt(connection.source.entity.name.split(' ')[1])-1; + } else if (connection.sink.entity.name.startsWith("Deck ")) { + isOutput = false; + type = connection.source.address == "Output" ? 4 : 5; + index = parseInt(connection.sink.entity.name.split(' ')[1])-1; + } else if (connection.sink.entity.name == "Microphone") { + isOutput = false; + type = 6 + index = connection.sink.instance; + } else if (connection.sink.entity.name == "Auxiliary") { + isOutput = false; + type = 7; + index = connection.sink.instance; + } else if (connection.sink.entity.name == "RecordBroadcast") { + isOutput = false; + type = 8; + index = connection.sink.instance; + } else { + console.error(`unsupported entity: ${connection.source.entity.name} ${connection.sink.entity.name}`) + continue; + } + console.log(isOutput ? "addOutput" : "addInput", device, type, channel * 2, index) + if (isOutput) { + manager.addOutput(device, type, channel * 2, index) + } else { + manager.addInput(device, type, channel * 2, index) + } + } + }; + manager.clearOutputs() + for (let device of Object.keys(router.outputs)) { + for (let address of Object.keys(router.outputs[device].gateways)) { + let gateway = router.outputs[device].gateways[address] + let connections = gateway.node && gateway.node.assignedEdges ? gateway.node.assignedEdges() : {}; + connectionsHandler(connections, gateway.device) + } + } + manager.clearInputs() + for (let device of Object.keys(router.inputs)) { + for (let address of Object.keys(router.inputs[device].gateways)) { + let gateway = router.inputs[device].gateways[address] + let connections = gateway.node && gateway.node.assignedEdges ? gateway.node.assignedEdges() : {}; + connectionsHandler(connections, gateway.device) } } + + mainDelay.value = mainDelaySlider.value + boothDelay.value = boothDelaySlider.value + headDelay.value = headphoneDelaySlider.value + + root.committing = true + manager.commit() } - Mixxx.SettingGroup { - label: "Delays" - visible: root.selectedIndex == 1 - onActivated: { - root.selectedIndex = 1; - } + function load() { + const manager = Mixxx.SoundManager; + mainMixEnabled.selected = mainMixEnabled.options[mainEnabled.value ? 0 : 1 ] + mainOutputMode.selected = mainOutputMode.options[monoMix.value ? 0 : 1 ] + soundClock.selected = soundClock.options[manager.getForceNetworkClock() ? 1 : 0 ] + sampleRate.update(manager.getAPI()) + sampleRate.selected = qsTr("%1 Hz").arg(manager.getSampleRate()) + audioBuffer.currentIndex = manager.getAudioBufferSizeIndex() - 1 + microphoneMonitorMode.enabled = manager.hasMicInputs() + microphoneMonitorMode.currentIndex = micMonitorMode.value + soundApi.options = manager.getHostAPIList() + soundApi.selected = manager.getAPI() + keylock.update() + keylock.selected = keylock.options[manager.getKeylockEngine()] - Mixxx.SettingParameter { - label: "A magenta square" + // Router + router.multiSoundcard.selected = router.multiSoundcard.options[manager.getSyncBuffers()] + router.update(manager.getAPI()) - Rectangle { - color: 'magenta' - height: 20 - width: 20 - } - } + //Delays + mainDelayLabel.enabled = mainEnabled.value + mainDelaySlider.enabled = mainEnabled.value + mainDelaySlider.value = mainDelay.value + boothDelayLabel.enabled = boothEnabled.value + boothDelaySlider.enabled = boothEnabled.value + boothDelaySlider.value = boothDelay.value + headphoneDelayLabel.enabled = headEnabled.value + headphoneDelaySlider.enabled = headEnabled.value + headphoneDelaySlider.value = headDelay.value + + root.hasChanges = Qt.binding(function() { return router.hasChanges; }); } - Mixxx.SettingGroup { - label: "Stats" - visible: root.selectedIndex == 2 - onActivated: { - root.selectedIndex = 2; - } + Component.onCompleted: { + load() + } + + ColumnLayout { + anchors.fill: parent + + Item { + id: tabSection + Layout.fillWidth: true + Layout.preferredHeight: root.selectedIndex == 0 ? engine.height : delays.height + Mixxx.SettingGroup { + label: "Engine" + visible: root.selectedIndex == 0 + onActivated: { + root.selectedIndex = 0 + } + anchors.left: parent.left + anchors.right: parent.right + RowLayout { + id: engine + anchors.left: parent.left + anchors.right: parent.right + ColumnLayout { + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop + RowLayout { + Text { + Mixxx.SettingParameter { + label: "Main Mix" + } + Layout.fillWidth: true + text: "Main Mix" + color: Theme.white + font.pixelSize: 14 + } + RatioChoice { + id: mainMixEnabled + options: [ + "on", + "off" + ] + selected: options[mainEnabled.value ? 0 : 1 ] + onSelectedChanged: { + root.hasChanges = true + } + } + } + + RowLayout { + Text { + Mixxx.SettingParameter { + label: "Main Output Mode" + } + Layout.fillWidth: true + text: "Main Output Mode" + color: Theme.white + font.pixelSize: 14 + } + RatioChoice { + id: mainOutputMode + options: [ + "mono", + "stereo" + ] + selected: options[monoMix.value ? 0 : 1 ] + onSelectedChanged: { + root.hasChanges = true + } + } + } + + RowLayout { + Text { + Mixxx.SettingParameter { + label: "Sound Clock" + } + Layout.fillWidth: true + text: "Sound Clock" + color: Theme.white + font.pixelSize: 14 + } + RatioChoice { + id: soundClock + options: [ + "soundcard", + "network" + ] + onSelectedChanged: { + root.hasChanges = true + } + } + } + + RowLayout { + Text { + Layout.fillWidth: true + text: "Keylock engine" + color: Theme.white + font.pixelSize: 14 + } + RatioChoice { + id: keylock + normalizedWidth: false + maxWidth: tabSection.width * 0.4 + options: [] + tooltips: [] - Mixxx.SettingParameter { - label: "A white square" + function update() { + let options = [] + let tooltips = [] + for (let engine of Mixxx.SoundManager.getKeylockEngines()) { + switch (engine) { + case 0: + options.push(qsTr("Soundtouch")) + tooltips.push(qsTr("Faster")) + break + case 1: + options.push(qsTr("Rubberband")) + tooltips.push(qsTr("Better")) + break + case 2: + options.push(qsTr("Rubberband R3")) + tooltips.push(qsTr("Near-hi-fi quality")) + break + } + } + keylock.options = options + keylock.tooltips = tooltips + } + onSelectedChanged: { + root.hasChanges = true + } + + Mixxx.SettingParameter { + label: "Keylock engine" + } + } + } + } + Item { + Layout.preferredWidth: 70 + } + ColumnLayout { + Layout.alignment: Qt.AlignTop + RowLayout { + Text { + Layout.fillWidth: true + text: "Sound API" + color: Theme.white + font.pixelSize: 14 + } + RatioChoice { + id: soundApi + maxWidth: tabSection.width * 0.4 + options: [] + + onSelectedChanged: { + root.hasChanges = true + router.update(soundApi.selected) + sampleRate.update(soundApi.selected) + } + + Mixxx.SettingParameter { + label: "Sound API" + } + } + } + RowLayout { + Text { + Mixxx.SettingParameter { + label: "Sample Rate" + } + Layout.fillWidth: true + text: "Sample Rate" + color: Theme.white + font.pixelSize: 14 + } + RatioChoice { + id: sampleRate + Layout.minimumWidth: sampleRate.implicitWidth + options: [] + function update(api) { + let data = [] + for (let sampleRate of Mixxx.SoundManager.getSampleRates(api)) { + data.push(qsTr("%1 Hz").arg(sampleRate)); + } + sampleRate.options = data + } + onSelectedChanged: { + root.hasChanges = true + } + } + } + + Connections { + target: sampleRate + function onSelectedChanged() { + let sampleRateValue = parseInt(sampleRate.selected) + audioBuffer.update(sampleRateValue) + } + } + + RowLayout { + Text { + Mixxx.SettingParameter { + label: "Audio Buffer" + } + Layout.fillWidth: true + text: "Audio Buffer" + color: Theme.white + font.pixelSize: 14 + } + Skin.ComboBox { + id: audioBuffer + spacing: 2 + clip: true + + font.pixelSize: 12 + + function update(sampleRate) { + let data = [] + let framesPerBuffer = 1; + for (; framesPerBuffer / sampleRate * 1000 < 1.0; framesPerBuffer *= 2) { + } + for (let i = 0; i < 7; i++) { + const latency = framesPerBuffer / sampleRate * 1000; + // i + 1 in the next line is a latency index as described in SSConfig + data.push(qsTr("%1 ms").arg(latency.toFixed(1))); + framesPerBuffer *= 2 + } + let currentIndex = audioBuffer.currentIndex + audioBuffer.model = data + audioBuffer.currentIndex = currentIndex + } + onCurrentIndexChanged: { + root.hasChanges = true + } + } + } + + RowLayout { + Text { + Mixxx.SettingParameter { + label: "Microphone Monitor Mode" + } + Layout.fillWidth: true + text: "Microphone Monitor Mode" + color: Theme.white + opacity: Mixxx.SoundManager.hasMicInputs() ? 1.0 : 0.5 + font.pixelSize: 14 + } + Skin.ComboBox { + id: microphoneMonitorMode + spacing: 2 + clip: true + opacity: enabled ? 1.0 : 0.5 + + font.pixelSize: 12 + model: [ + "Main output only", + "Main and booth outputs", + "Direct monitor (recording and broadcasting only)" + ] + onCurrentIndexChanged: { + root.hasChanges = true + } + } + } + } + } + } + + Mixxx.SettingGroup { + label: "Delays" + visible: root.selectedIndex == 1 + onActivated: { + root.selectedIndex = 1 + } + anchors.left: parent.left + anchors.right: parent.right + GridLayout { + id: delays + anchors.left: parent.left + anchors.right: parent.right + columns: 2 + rowSpacing: 0 + Text { + Mixxx.SettingParameter { + label: "Main Output" + } + id: mainDelayLabel + Layout.fillWidth: true + text: "Main Output" + color: Theme.white + opacity: enabled ? 1 : 0.5 + font.pixelSize: 14 + } + Skin.Slider { + id: mainDelaySlider + Layout.fillWidth: true + markers: ["0ms", "100ms", "1s", "10s", null] + suffix: "ms" + slider.to: 1000 + + onValueChanged: { + root.hasChanges = true + } + } + Text { + Mixxx.SettingParameter { + label: "Booth Output" + } + id: boothDelayLabel + Layout.fillWidth: true + text: "Booth Output" + color: Theme.white + opacity: enabled ? 1 : 0.5 + enabled: boothEnabled.value + font.pixelSize: 14 + } + Skin.Slider { + id: boothDelaySlider + Layout.fillWidth: true + markers: ["0ms", "100ms", "1s", "10s", null] + suffix: "ms" + enabled: boothEnabled.value + value: boothDelay.value + slider.to: 1000 + + onValueChanged: { + root.hasChanges = true + } + } + Text { + Mixxx.SettingParameter { + label: "Headphone Output" + } + id: headphoneDelayLabel + Layout.fillWidth: true + text: "Headphone Output" + color: Theme.white + opacity: enabled ? 1 : 0.5 + enabled: headEnabled.value + font.pixelSize: 14 + } + Skin.Slider { + id: headphoneDelaySlider + Layout.fillWidth: true + markers: ["0ms", "100ms", "1s", "10s", null] + suffix: "ms" + enabled: headEnabled.value + value: headDelay.value + slider.to: 1000 + + onValueChanged: { + root.hasChanges = true + } + } + } + } + + Mixxx.SettingGroup { + label: "Stats" + visible: root.selectedIndex == 2 + onActivated: { + root.selectedIndex = 2 + } + Mixxx.SettingParameter { + label: "A white square" + Rectangle { + width: 20 + height: 20 + color: 'white' + } + } + } + } + Mixxx.SettingGroup { + label: "Router" + Layout.fillWidth: true + Layout.fillHeight: true + AudioRouter { + id: router + anchors.fill: parent + } Rectangle { - color: 'white' - height: 20 - width: 20 + anchors.fill: parent + visible: root.committing + color: Qt.alpha('grey', 0.3) + MouseArea { + anchors.fill: parent + preventStealing: true + hoverEnabled: true + + onWheel: (mouse)=> { + mouse.accepted = true + } + } + } + } + RowLayout { + Layout.topMargin: 4 + Skin.FormButton { + enabled: !root.committing + visible: root.hasChanges + text: "Cancel" + opacity: enabled ? 1.0 : 0.5 + backgroundColor: "#7D3B3B" + activeColor: "#999999" + onPressed: { + root.load() + } + } + Item { + Layout.fillWidth: true + } + Text { + Layout.alignment: Qt.AlignVCenter + Layout.rightMargin: 16 + id: errorMessage + text: "" + color: "#7D3B3B" + } + Skin.FormButton { + enabled: root.hasChanges && !root.committing + text: "Save" + opacity: enabled ? 1.0 : 0.5 + backgroundColor: root.hasChanges ? "#3a60be" : "#3F3F3F" + activeColor: "#999999" + onPressed: { + errorMessage.text = "" + root.save() + } + } + } + } + Connections { + target: Mixxx.SoundManager + function onCommitted(error) { + root.committing = false + if (error) { + errorMessage.text = error } + root.load() } } } diff --git a/res/qml/Slider.qml b/res/qml/Slider.qml index bcae15fdde9b..ae9f828f73f0 100644 --- a/res/qml/Slider.qml +++ b/res/qml/Slider.qml @@ -1,49 +1,170 @@ -import Mixxx.Controls 1.0 as MixxxControls import Qt5Compat.GraphicalEffects import QtQuick 2.12 +import QtQuick.Controls +import QtQuick.Layouts import "Theme" -MixxxControls.Slider { +RowLayout { id: root + property list markers: ["", ""] - property alias fg: handleImage.source - property alias bg: backgroundImage.source + property alias suffix: textInputSection.suffix + property alias slider: control + property alias value: control.value - bar: true - barMargin: 10 - implicitWidth: backgroundImage.implicitWidth - implicitHeight: backgroundImage.implicitHeight + height: 30 - Image { - id: handleImage + Slider { + id: control - visible: false - source: Theme.imgSliderHandle - fillMode: Image.PreserveAspectFit - } - - handle: Item { - id: handleItem + Layout.fillWidth: true - width: handleImage.paintedWidth - height: handleImage.paintedHeight - x: root.horizontal ? (root.visualPosition * (root.width - width)) : ((root.width - width) / 2) - y: root.vertical ? (root.visualPosition * (root.height - height)) : ((root.height - height) / 2) + background: Item { + x: control.leftPadding + 7 + implicitWidth: 200 + implicitHeight: 4 + width: control.availableWidth - 7 + height: control.availableHeight + Rectangle { + width: parent.width + height: 4 + radius: 2 + color: "#181818" + } + Repeater { + id: delegate + model: markers + anchors.fill: parent + anchors.leftMargin: 7 + Item { + required property int index + required property var modelData + x: parent.width * (index / (delegate.model.length - 1)) + y: -4 + height: control.availableHeight - DropShadow { - source: handleImage - width: parent.width + 5 - height: parent.height + 5 - radius: 5 - verticalOffset: 5 - color: "#80000000" + Rectangle { + id: mark + visible: modelData != null + anchors { + top: parent.top + } + width: 1 + height: 11 + color: Qt.alpha(Theme.white, 0.25) + } + Text { + id: label + visible: modelData != null + anchors { + top: mark.bottom + topMargin: 4 + horizontalCenter: mark.left + } + color: Qt.alpha(Theme.white, 0.25) + font.pixelSize: 9 + text: modelData ?? "" + } + } + } + } + handle: Item { + x: control.leftPadding + control.visualPosition * (control.availableWidth - width) + y: -5 + width: 14 + height: 14 + Rectangle { + id: handle + anchors.fill: parent + radius: 7 + color: Theme.accentColor + } + InnerShadow { + id: handleEffect1 + anchors.fill: parent + samples: 16 + horizontalOffset: 0 + verticalOffset: 0 + radius: 16.0 + color: "#0E2A54" + source: handle + } + DropShadow { + id: handleEffect2 + anchors.fill: parent + source: handleEffect1 + horizontalOffset: 0 + verticalOffset: 0 + radius: 12.0 + color: Qt.alpha(Theme.darkGray, 0.25) + } } } + FocusScope { + id: textInputSection + Layout.leftMargin: 17 + Layout.minimumWidth: fontMetrics.advanceWidth + 8 + Layout.preferredHeight: 30 + Layout.margins: 4 - background: Image { - id: backgroundImage + property string suffix: "" + visible: suffix.length > 0 - anchors.fill: parent - anchors.margins: root.barMargin + Rectangle { + id: backgroundInput + radius: 4 + color: Theme.darkGray2 + anchors.fill: parent + anchors.margins: 4 + } + DropShadow { + id: dropSetting + anchors.fill: parent + horizontalOffset: 0 + verticalOffset: 0 + radius: 4.0 + color: Theme.darkGray + source: backgroundInput + } + InnerShadow { + id: effect2 + anchors.fill: parent + source: dropSetting + spread: 0.2 + radius: 12 + samples: 24 + horizontalOffset: 0 + verticalOffset: 0 + color: "#353535" + } + Item { + anchors.fill: parent + anchors.margins: 4 + TextInput { + anchors.left: parent.left + anchors.right: inputField.left + anchors.margins: 3 + focus: true + color: Qt.alpha(acceptableInput ? Theme.white : Theme.warningColor, root.enabled ? 1 : 0.5) + onAccepted: { + control.value = parseInt(text) + } + text: Math.round(control.value) + horizontalAlignment: TextInput.AlignRight + validator: IntValidator {bottom: control.from; top: control.to} + } + Text { + id: inputField + anchors.right: parent.right + anchors.margins: textInputSection.suffix.length > 0 ? 10 : 0 + text: textInputSection.suffix + color: Qt.alpha(Theme.white, root.enabled ? 1 : 0.5) + TextMetrics { + id: fontMetrics + font.family: inputField.font.family + text: `${control.to} ${parent.text}` + } + } + } } } diff --git a/src/coreservices.cpp b/src/coreservices.cpp index 040b9dad15b9..a2ff74d8391f 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -43,6 +43,7 @@ #include "qml/qmleffectsmanagerproxy.h" #include "qml/qmllibraryproxy.h" #include "qml/qmlplayermanagerproxy.h" +#include "qml/qmlsoundmanagerproxy.h" #endif #include "soundio/soundmanager.h" #include "sources/soundsourceproxy.h" @@ -513,6 +514,7 @@ void CoreServices::initializeQMLSingletons() { mixxx::qml::QmlPlayerManagerProxy::registerPlayerManager(getPlayerManager()); mixxx::qml::QmlConfigProxy::registerUserSettings(getSettings()); mixxx::qml::QmlLibraryProxy::registerLibrary(getLibrary()); + mixxx::qml::QmlSoundManagerProxy::registerManager(getSoundManager()); ControllerScriptEngineBase::registerTrackCollectionManager(getTrackCollectionManager()); diff --git a/src/engine/enginebuffer.h b/src/engine/enginebuffer.h index f844235565c9..37b4387224a1 100644 --- a/src/engine/enginebuffer.h +++ b/src/engine/enginebuffer.h @@ -89,6 +89,7 @@ class EngineBuffer : public EngineObject { RubberBandFiner = 2, #endif }; + Q_ENUM(KeylockEngine); // intended for iteration over the KeylockEngine enum constexpr static std::initializer_list kKeylockEngines = { diff --git a/src/qml/qml_owned_ptr.h b/src/qml/qml_owned_ptr.h new file mode 100644 index 000000000000..58c68f815d9f --- /dev/null +++ b/src/qml/qml_owned_ptr.h @@ -0,0 +1,120 @@ +#pragma once + +#include +#include +#include +#include + +#include "util/assert.h" + +// Use this wrapper class to clearly represent a raw pointer that is owned by a +// QML Engine. Objects which derive from QObject, have their lifetime governed +// by the QML (or JavaScript) Engine, and thus such pointers do not require a +// manual delete to free the heap memory when they go out of scope, as they will +// be handled by the engine garbage collector. +template + requires(std::is_base_of_v) +class qml_owned_ptr final { + public: + explicit qml_owned_ptr(T* t = nullptr) noexcept + : m_ptr{t} { + if (m_ptr) { + QQmlEngine::setObjectOwnership(m_ptr, QQmlEngine::JavaScriptOwnership); + } + } + + // explicitly generate trivial destructor (since decltype(m_ptr) is not a class type) + ~qml_owned_ptr() noexcept = default; + + // Rule of 5 + qml_owned_ptr(const qml_owned_ptr& other) + : m_ptr{other.m_ptr} { + DEBUG_ASSERT(!m_ptr || + QQmlEngine::objectOwnership(m_ptr) == + QQmlEngine::JavaScriptOwnership); + } + qml_owned_ptr& operator=(const qml_owned_ptr&) = delete; + qml_owned_ptr(const qml_owned_ptr&& other) + : m_ptr{other.m_ptr} { + DEBUG_ASSERT(!m_ptr || + QQmlEngine::objectOwnership(m_ptr) == + QQmlEngine::JavaScriptOwnership); + } + qml_owned_ptr& operator=(const qml_owned_ptr&& other) = delete; + + // If U* is convertible to T* then qml_owned_ptr is convertible to qml_owned_ptr + template< + typename U, + typename = typename std::enable_if_t, U>> + qml_owned_ptr(qml_owned_ptr&& u) noexcept + : m_ptr{u.m_ptr} { + u.m_ptr = nullptr; + } + + // If U* is convertible to T* then qml_owned_ptr is assignable to qml_owned_ptr + template + requires std::is_convertible_v + qml_owned_ptr& operator=(qml_owned_ptr&& u) noexcept { + qml_owned_ptr temp{std::move(u)}; + std::swap(temp.m_ptr, m_ptr); + DEBUG_ASSERT(!m_ptr || + QQmlEngine::objectOwnership(m_ptr) == + QQmlEngine::JavaScriptOwnership); + return *this; + } + + qml_owned_ptr& operator=(std::nullptr_t) noexcept { + qml_owned_ptr{std::move(*this)}; // move *this into a temporary that gets destructed + return *this; + } + + // Prevent unintended invocation of delete on qml_owned_ptr + operator void*() const = delete; + + operator T*() const noexcept { + return m_ptr; + } + + T* get() const noexcept { + return m_ptr; + } + + T& operator*() const noexcept { + return *m_ptr; + } + + T* operator->() const noexcept { + return m_ptr; + } + + operator bool() const noexcept { + return m_ptr != nullptr; + } + + QPointer toWeakRef() { + return m_ptr; + } + + private: + T* m_ptr; +}; + +template +qml_owned_ptr make_qml_owned(Args&&... args) { + return qml_owned_ptr(new T(std::forward(args)...)); +} + +// A use case for this function is when giving an object owned by `std::unique_ptr` to a Qt +// function, that will make the object owned by the Qt object tree. Example: +// ``` +// parent->someFunctionThatAddsAChild(to_qml_owned(child)) +// ``` +// where `child` is a `std::unique_ptr`. After the call, the created `qml_owned_ptr` will +// automatically be destructed such that the DEBUG_ASSERT that checks whether a parent exists is +// triggered. +template +qml_owned_ptr to_qml_owned(std::unique_ptr& u) noexcept { + // the DEBUG_ASSERT in the qml_owned_ptr constructor will catch cases where + // the unique_ptr should not have been released + return qml_owned_ptr{u.release()}; +} diff --git a/src/qml/qmlsoundmanagerproxy.cpp b/src/qml/qmlsoundmanagerproxy.cpp new file mode 100644 index 000000000000..2ca419d348d4 --- /dev/null +++ b/src/qml/qmlsoundmanagerproxy.cpp @@ -0,0 +1,264 @@ +#include "qmlsoundmanagerproxy.h" + +#include + +#include + +#include "moc_qmlsoundmanagerproxy.cpp" +#include "qml_owned_ptr.h" +#include "soundio/soundmanager.h" +#include "soundio/soundmanagerutil.h" +#include "util/assert.h" +#include "util/scopedoverridecursor.h" + +namespace mixxx { +namespace qml { + +namespace { +const QString kAppGroup = QStringLiteral("[App]"); +const ConfigKey kKeylockEngineCfgkey = + ConfigKey(kAppGroup, QStringLiteral("keylock_engine")); + +} // namespace + +uint QmlSoundInputDeviceProxy::getChannelCount() const { + return m_pInternal->getNumInputChannels(); +} +uint QmlSoundOutputDeviceProxy::getChannelCount() const { + return m_pInternal->getNumOutputChannels(); +} +SoundDeviceId QmlSoundDeviceProxy::getDeviceId() const { + return m_pInternal->getDeviceId(); +} + +QList QmlSoundInputDeviceProxy::connections( + mixxx::qml::QmlSoundManagerProxy* manager) { + DEBUG_ASSERT(qml_owned_ptr(manager)); + QList connections; + + auto pManager = manager->internal(); + auto config = pManager->getConfig(); + + const auto inputDeviceMap = config.getInputs(); + for (auto it = inputDeviceMap.cbegin(); it != inputDeviceMap.cend(); ++it) { + if (it.key() == getDeviceId()) { + connections.push_back(make_qml_owned( + std::make_unique(it.value()), this)); + } + } + return connections; +} + +QList QmlSoundOutputDeviceProxy::connections( + mixxx::qml::QmlSoundManagerProxy* manager) { + DEBUG_ASSERT(qml_owned_ptr(manager)); + QList connections; + + auto pManager = manager->internal(); + auto config = pManager->getConfig(); + const auto ouputDeviceMap = config.getOutputs(); + for (auto it = ouputDeviceMap.cbegin(); it != ouputDeviceMap.cend(); ++it) { + if (it.key() == getDeviceId()) { + connections.push_back(make_qml_owned( + std::make_unique(it.value()), this)); + } + } + return connections; +} + +int QmlSoundDeviceConnection::getType() const { + return static_cast(m_audioPath->getType()); +} + +uchar QmlSoundDeviceConnection::getChannelGroup() const { + auto group = m_audioPath->getChannelGroup(); + return group.getChannelBase(); +} +uchar QmlSoundDeviceConnection::getIndex() const { + return m_audioPath->getIndex(); +} + +QmlSoundManagerProxy::QmlSoundManagerProxy( + std::shared_ptr pSoundManager, + QObject* parent) + : QObject(parent), + m_pSoundManager(pSoundManager), + m_keylockEngine(kKeylockEngineCfgkey), + m_config(m_pSoundManager->getConfig()) { + connect(m_pSoundManager.get(), &SoundManager::devicesClosed, this, [this]() { + SoundDeviceStatus status = SoundDeviceStatus::Ok; + { + ScopedWaitCursor cursor; + + if (m_commitInProgress.fetchAndStoreRelease(0) != 1) { + return; + } + + status = m_pSoundManager->setConfig(m_config); + } + if (status != SoundDeviceStatus::Ok) { + emit committed(m_pSoundManager->getLastErrorMessage(status)); + } else { + emit committed(); + } + m_config = m_pSoundManager->getConfig(); + }); +} + +// static +QmlSoundManagerProxy* QmlSoundManagerProxy::create( + QQmlEngine* pQmlEngine, + QJSEngine*) { + // The instance has to exist before it is used. We cannot replace it. + VERIFY_OR_DEBUG_ASSERT(s_pSoundManager) { + qWarning() << "SoundManager hasn't been registered yet"; + return nullptr; + } + return make_qml_owned(s_pSoundManager, pQmlEngine); +} + +QList QmlSoundManagerProxy::getHostAPIList() const { + return m_pSoundManager->getHostAPIList(); +} + +QList QmlSoundManagerProxy::availableInputDevices(const QString& filterAPI) { + QList devices; + + for (const auto& device : m_pSoundManager->getDeviceList(filterAPI, false, true)) { + devices.push_back(make_qml_owned(device, this)); + } + + return devices; +} + +QList QmlSoundManagerProxy::availableOutputDevices(const QString& filterAPI) { + QList devices; + + for (const auto& device : m_pSoundManager->getDeviceList(filterAPI, true, false)) { + devices.push_back(make_qml_owned(device, this)); + } + + return devices; +} + +QList QmlSoundManagerProxy::getKeylockEngines() const { + QList list; + for (const auto engine : EngineBuffer::kKeylockEngines) { + if (EngineBuffer::isKeylockEngineAvailable(engine)) { + list.append(engine); + } + } + return list; +} + +void QmlSoundManagerProxy::setKeylockEngine(EngineBuffer::KeylockEngine keylockEngine) { + m_keylockEngine.set(static_cast(keylockEngine)); + m_pSoundManager->userSettings()->setValue(kKeylockEngineCfgkey, keylockEngine); +} + +EngineBuffer::KeylockEngine QmlSoundManagerProxy::getKeylockEngine() const { + return m_pSoundManager->userSettings() + ->getValue( + kKeylockEngineCfgkey, EngineBuffer::defaultKeylockEngine()); +} + +QString QmlSoundManagerProxy::getAPI() const { + return m_config.getAPI(); +} +void QmlSoundManagerProxy::setAPI(const QString& api) { + m_config.setAPI(api); +} + +unsigned int QmlSoundManagerProxy::getSyncBuffers() const { + return m_config.getSyncBuffers(); +} + +void QmlSoundManagerProxy::setSyncBuffers(unsigned int syncBuffers) { + m_config.setSyncBuffers(syncBuffers); +} + +uint32_t QmlSoundManagerProxy::getSampleRate() const { + return m_config.getSampleRate(); +} + +void QmlSoundManagerProxy::setSampleRate(uint32_t sampleRate) { + m_config.setSampleRate(mixxx::audio::SampleRate(sampleRate)); +} + +QList QmlSoundManagerProxy::getSampleRates(const QString& filterAPI) const { + QList sampleRates; + for (const auto& sampleRate : m_pSoundManager->getSampleRates(filterAPI)) { + if (sampleRate.isValid()) { + sampleRates.append(sampleRate); + } + } + return sampleRates; +} + +bool QmlSoundManagerProxy::getForceNetworkClock() const { + return m_config.getForceNetworkClock(); +} + +void QmlSoundManagerProxy::setForceNetworkClock(bool force) { + m_config.setForceNetworkClock(force); +} + +unsigned int QmlSoundManagerProxy::getAudioBufferSizeIndex() const { + return m_config.getAudioBufferSizeIndex(); +} + +void QmlSoundManagerProxy::setAudioBufferSizeIndex(unsigned int latency) { + m_config.setAudioBufferSizeIndex(latency); +} + +void QmlSoundManagerProxy::addOutput(QmlSoundOutputDeviceProxy* device, + int type, + unsigned char channelGroup, + unsigned char index) { + VERIFY_OR_DEBUG_ASSERT(device && qml_owned_ptr(device)) { + return; + } + m_config.addOutput(device->getDeviceId(), + AudioOutput(static_cast(type), + channelGroup, + mixxx::audio::ChannelCount::stereo(), + index)); +} + +void QmlSoundManagerProxy::addInput(QmlSoundInputDeviceProxy* device, + int type, + unsigned char channelGroup, + unsigned char index) { + VERIFY_OR_DEBUG_ASSERT(device && qml_owned_ptr(device)) { + return; + } + m_config.addInput(device->getDeviceId(), + AudioInput(static_cast(type), + channelGroup, + mixxx::audio::ChannelCount::stereo(), + index)); +} + +void QmlSoundManagerProxy::clearOutputs() { + m_config.clearOutputs(); +} + +void QmlSoundManagerProxy::clearInputs() { + m_config.clearInputs(); +} + +bool QmlSoundManagerProxy::hasMicInputs() { + return m_config.hasMicInputs(); +} + +std::shared_ptr QmlSoundManagerProxy::internal() const { + return m_pSoundManager; +} + +void QmlSoundManagerProxy::commit() { + m_commitInProgress.storeRelease(1); + m_pSoundManager->closeActiveConfig(true); +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmlsoundmanagerproxy.h b/src/qml/qmlsoundmanagerproxy.h new file mode 100644 index 000000000000..916546ecc938 --- /dev/null +++ b/src/qml/qmlsoundmanagerproxy.h @@ -0,0 +1,179 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +#include "control/pollingcontrolproxy.h" +#include "engine/enginebuffer.h" +#include "qml_owned_ptr.h" +#include "soundio/sounddevice.h" +#include "soundio/soundmanagerconfig.h" + +class SoundManager; + +namespace mixxx { +namespace qml { + +class QmlSoundManagerProxy; +class QmlSoundDeviceConnection; +class QmlSoundDeviceProxy : public QObject { + Q_OBJECT + Q_PROPERTY(QString displayName READ getDisplayName CONSTANT) + Q_PROPERTY(uint channelCount READ getChannelCount CONSTANT) + QML_ANONYMOUS + public: + explicit QmlSoundDeviceProxy(SoundDevicePointer pInternal, QObject* parent) + : QObject(parent), + m_pInternal(std::move(pInternal)) { + } + + QString getDisplayName() const { + return m_pInternal->getDisplayName(); + } + + virtual uint getChannelCount() const = 0; + SoundDeviceId getDeviceId() const; + + Q_INVOKABLE virtual QList connections( + mixxx::qml::QmlSoundManagerProxy* manager) = 0; + + protected: + SoundDevicePointer m_pInternal; +}; + +class QmlSoundInputDeviceProxy : public QmlSoundDeviceProxy { + Q_OBJECT + QML_NAMED_ELEMENT(InputDevice) + QML_UNCREATABLE("Use Mixxx.SoundManager to get devices") + public: + explicit QmlSoundInputDeviceProxy(SoundDevicePointer pInternal, QObject* parent) + : QmlSoundDeviceProxy(std::move(pInternal), parent) { + } + uint getChannelCount() const override; + Q_INVOKABLE QList connections( + mixxx::qml::QmlSoundManagerProxy* manager) override; +}; + +class QmlSoundOutputDeviceProxy : public QmlSoundDeviceProxy { + Q_OBJECT + QML_NAMED_ELEMENT(OutputDevice) + QML_UNCREATABLE("Use Mixxx.SoundManager to get devices") + public: + explicit QmlSoundOutputDeviceProxy(SoundDevicePointer pInternal, QObject* parent) + : QmlSoundDeviceProxy(std::move(pInternal), parent) { + } + uint getChannelCount() const override; + Q_INVOKABLE QList connections( + mixxx::qml::QmlSoundManagerProxy* manager) override; +}; + +class QmlSoundDeviceConnection : public QObject { + Q_OBJECT + Q_PROPERTY(int type READ getType CONSTANT) + Q_PROPERTY(uchar channelGroup READ getChannelGroup CONSTANT) + Q_PROPERTY(uchar index READ getIndex CONSTANT) + QML_ANONYMOUS + public: + QmlSoundDeviceConnection(std::unique_ptr path, QObject* parent = nullptr) + : QObject(parent), + m_audioPath(std::move(path)) { + } + + int getType() const; + uchar getChannelGroup() const; + uchar getIndex() const; + + private: + std::unique_ptr m_audioPath; +}; + +class QmlSoundDeviceInputConnection : public QmlSoundDeviceConnection { + Q_OBJECT + QML_NAMED_ELEMENT(InputConnection) + QML_UNCREATABLE("Use Mixxx.SoundDevice to get connections") + public: + QmlSoundDeviceInputConnection(std::unique_ptr path, QObject* parent = nullptr) + : QmlSoundDeviceConnection(std::move(path), parent) { + } +}; + +class QmlSoundDeviceOutputConnection : public QmlSoundDeviceConnection { + Q_OBJECT + QML_NAMED_ELEMENT(OutputConnection) + QML_UNCREATABLE("Use Mixxx.SoundDevice to get connections") + public: + QmlSoundDeviceOutputConnection(std::unique_ptr path, QObject* parent = nullptr) + : QmlSoundDeviceConnection(std::move(path), parent) { + } +}; + +class QmlSoundManagerProxy : public QObject { + Q_OBJECT + QML_NAMED_ELEMENT(SoundManager) + QML_SINGLETON + public: + explicit QmlSoundManagerProxy( + std::shared_ptr pSoundManager, + QObject* parent = nullptr); + + Q_INVOKABLE QList getHostAPIList() const; + Q_INVOKABLE QList availableInputDevices( + const QString& filterAPI); + Q_INVOKABLE QList availableOutputDevices( + const QString& filterAPI); + + Q_INVOKABLE QList getKeylockEngines() const; + Q_INVOKABLE EngineBuffer::KeylockEngine getKeylockEngine() const; + Q_INVOKABLE void setKeylockEngine(EngineBuffer::KeylockEngine); + Q_INVOKABLE QString getAPI() const; + Q_INVOKABLE void setAPI(const QString& api); + Q_INVOKABLE unsigned int getSyncBuffers() const; + Q_INVOKABLE void setSyncBuffers(unsigned int syncBuffers); + Q_INVOKABLE uint32_t getSampleRate() const; + Q_INVOKABLE void setSampleRate(uint32_t sampleRate); + Q_INVOKABLE bool getForceNetworkClock() const; + Q_INVOKABLE void setForceNetworkClock(bool force); + Q_INVOKABLE unsigned int getAudioBufferSizeIndex() const; + Q_INVOKABLE void setAudioBufferSizeIndex(unsigned int latency); + Q_INVOKABLE QList getSampleRates(const QString& filterAPI) const; + Q_INVOKABLE void addOutput(mixxx::qml::QmlSoundOutputDeviceProxy* device, + int type, + unsigned char channelGroup, + unsigned char index); + Q_INVOKABLE void addInput(mixxx::qml::QmlSoundInputDeviceProxy* device, + int type, + unsigned char channelGroup, + unsigned char index); + Q_INVOKABLE void clearOutputs(); + Q_INVOKABLE void clearInputs(); + Q_INVOKABLE bool hasMicInputs(); + + std::shared_ptr internal() const; + Q_INVOKABLE void commit(); + + static QmlSoundManagerProxy* create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine); + static void registerManager(std::shared_ptr pManager) { + s_pSoundManager = std::move(pManager); + } + + signals: + void committed(const QString& error = {}); + + private: + static inline std::shared_ptr s_pSoundManager; + + PollingControlProxy m_keylockEngine; + + std::shared_ptr m_pSoundManager; + SoundManagerConfig m_config; + QAtomicInt m_commitInProgress; +}; + +} // namespace qml +} // namespace mixxx diff --git a/src/soundio/soundmanager.h b/src/soundio/soundmanager.h index 205909535f4b..a33399fa4941 100644 --- a/src/soundio/soundmanager.h +++ b/src/soundio/soundmanager.h @@ -107,9 +107,14 @@ class SoundManager : public QObject { void processUnderflowHappened(SINT framesPerBuffer); + UserSettingsPointer userSettings() const { + return m_pConfig; + } + signals: void devicesUpdated(); // emitted when pointers to SoundDevices go stale void devicesSetup(); // emitted when the sound devices have been set up + void devicesClosed(); // emitted when the sound devices have been closed and resources freed void outputRegistered(const AudioOutput& output, AudioSource* src); void inputRegistered(const AudioInput& input, AudioDestination* dest); From 820d46c1182a4ddcc79d312641d814f63aeaa522 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Mon, 19 May 2025 00:22:13 +0000 Subject: [PATCH 134/163] fix: add scrollbar to i/o item lists --- res/qml/ComboBox.qml | 14 ++++++++------ res/qml/Settings/AudioRouter.qml | 15 +++++++++++---- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/res/qml/ComboBox.qml b/res/qml/ComboBox.qml index c7059aef79d4..ecf32cf871b7 100644 --- a/res/qml/ComboBox.qml +++ b/res/qml/ComboBox.qml @@ -10,6 +10,7 @@ ComboBox { property alias popupWidth: popup.width property bool clip: false + property int popupMaxItem: 3 background: Skin.EmbeddedBackground { } @@ -57,20 +58,20 @@ ComboBox { y: root.height/2 width: root.width - root.indicator.width / 2 x: root.indicator.width / 2 - height: Math.min(root.indicator.implicitHeight*3 + root.indicator.width, 150) + height: root.indicator.implicitHeight*Math.min(root.popupMaxItem, root.count) + root.indicator.width padding: 0 contentItem: Item { - // implicitHeight: contentHeight Item { id: content anchors.fill: parent Shape { + id: arrow anchors.top: parent.top anchors.right: parent.right anchors.rightMargin: 3 - width: root.indicator.width-3 + width: root.indicator.width-4 height: width antialiasing: true layer.enabled: true @@ -79,7 +80,7 @@ ComboBox { fillColor: Theme.embeddedBackgroundColor strokeColor: Theme.deckBackgroundColor strokeWidth: 2 - startX: parent.width/2; startY: 0 + startX: arrow.width/2; startY: 0 fillRule: ShapePath.WindingFill capStyle: ShapePath.RoundCap PathLine { x: root.indicator.width; y: root.indicator.width } @@ -88,7 +89,7 @@ ComboBox { } } Skin.EmbeddedBackground { - anchors.topMargin: root.indicator.width + anchors.topMargin: root.indicator.width-6 anchors.fill: parent ListView { clip: true @@ -103,7 +104,8 @@ ComboBox { model: root.popup.visible ? root.delegateModel : null currentIndex: root.highlightedIndex - ScrollIndicator.vertical: ScrollIndicator { + ScrollBar.vertical: ScrollBar { + policy: ScrollBar.AlwaysOn } } } diff --git a/res/qml/Settings/AudioRouter.qml b/res/qml/Settings/AudioRouter.qml index 48a0a8ba6fb1..5b60bf879258 100644 --- a/res/qml/Settings/AudioRouter.qml +++ b/res/qml/Settings/AudioRouter.qml @@ -1,5 +1,6 @@ import Mixxx 1.0 as Mixxx import QtQuick 2 +import QtQuick.Controls import QtQuick.Layouts import "../Theme" @@ -351,7 +352,6 @@ Rectangle { Layout.fillHeight: true Layout.fillWidth: true model: Object.keys(root.inputs) - clip: true reuseItems: false spacing: 15 delegate: AudioEntity { @@ -375,7 +375,6 @@ Rectangle { advanced: true }); } - if (channel < item.channels) { let start = channels[channels.length-1].channels[0] let channelPicker = [...Array(item.channels - start)] @@ -411,6 +410,11 @@ Rectangle { } } } + ScrollBar.vertical: ScrollBar { + policy: ScrollBar.AlwaysOn + anchors.right: inputList.left + anchors.rightMargin: 6 + } } } Rectangle { @@ -505,7 +509,6 @@ Rectangle { Layout.fillHeight: true Layout.fillWidth: true model: Object.keys(root.outputs) - clip: true reuseItems: false spacing: 15 cacheBuffer: Math.max(0, contentHeight) // Disable lazy loading to make sure all item are loaded and can be bounded to connection @@ -529,7 +532,6 @@ Rectangle { type: "sink" }); } - if (channel < item.channels) { let start = channels[channels.length-1].channels[0] let channelPicker = [...Array(item.channels - start)] @@ -564,6 +566,11 @@ Rectangle { } } } + ScrollBar.vertical: ScrollBar { + policy: ScrollBar.AlwaysOn + anchors.left: outputList.right + anchors.leftMargin: 6 + } } Item { From 21a5d2075248beb0c828d4d0d6221beaef8dd1e2 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sat, 31 May 2025 00:40:18 +0000 Subject: [PATCH 135/163] chore(pre-commit): upgrade qml_formatter to support switch fallthrough cases --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5812cd6cf442..f9c7f3edf76a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -126,7 +126,7 @@ repos: - id: prettier types: [yaml] - repo: https://github.com/qarmin/qml_formatter.git - rev: 16f651d727652dffff92678f4b602df9bfb45eb7 # No release tag yet including #7 fix + rev: 706250038bb565f4c630ca3aab09f764faabae67 # No release tag yet including #9 fix hooks: - id: qml_formatter - repo: https://github.com/BlankSpruce/gersemi From 85115638964d59440b25eed20ee8d1a42b433caf Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Fri, 8 Aug 2025 22:45:23 +0000 Subject: [PATCH 136/163] fix: allow device closing to be async --- src/soundio/soundmanager.cpp | 32 +++++++++++++++++++++++++++----- src/soundio/soundmanager.h | 12 ++++++++++-- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/soundio/soundmanager.cpp b/src/soundio/soundmanager.cpp index 273211831cac..4241696aa37d 100644 --- a/src/soundio/soundmanager.cpp +++ b/src/soundio/soundmanager.cpp @@ -145,27 +145,48 @@ QList SoundManager::getHostAPIList() const { return apiList; } -void SoundManager::closeDevices(bool sleepAfterClosing) { - //qDebug() << "SoundManager::closeDevices()"; +void SoundManager::closeDevices( + [[maybe_unused]] bool sleepAfterClosing, [[maybe_unused]] bool async) { + // sleepAfterClosing and async maybe unused depending on platform support + // qDebug() << "SoundManager::closeDevices()"; +#ifdef __LINUX__ bool closed = false; +#endif for (const auto& pDevice : std::as_const(m_devices)) { if (pDevice->isOpen()) { // NOTE(rryan): As of 2009 (?) it has been safe to close() a SoundDevice // while callbacks are active. pDevice->close(); +#ifdef __LINUX__ closed = true; +#endif } } - if (closed && sleepAfterClosing) { #ifdef __LINUX__ + if (closed && sleepAfterClosing) { // Sleep for 5 sec to allow asynchronously sound APIs like "pulse" to free // its resources as well + if (async) { + // Async mode - the caller will wait for `devicesClosed` before + // trying to reconfigure or reopen audio devices + QTimer::singleShot( + std::chrono::seconds(kSleepSecondsAfterClosingDevice), + this, + &SoundManager::completeDevicesClosing); + return; + } + // Sync mode, legacy - we sleep the current thread for 5 seconds QThread::sleep(kSleepSecondsAfterClosingDevice); + } else if (!closed) #endif + { + completeDevicesClosing(); } +} +void SoundManager::completeDevicesClosing() { // TODO(rryan): Should we do this before SoundDevice::close()? No! Because // then the callback may be running when we call // onInputDisconnected/onOutputDisconnected. @@ -199,6 +220,7 @@ void SoundManager::closeDevices(bool sleepAfterClosing) { // Indicate to the rest of Mixxx that sound is disconnected. m_pControlObjectSoundStatusCO->set(SOUNDMANAGER_DISCONNECTED); + emit devicesClosed(); } void SoundManager::clearDeviceList(bool sleepAfterClosing) { @@ -553,12 +575,12 @@ SoundManagerConfig SoundManager::getConfig() const { return m_config; } -void SoundManager::closeActiveConfig() { +void SoundManager::closeActiveConfig(bool async) { // Close open devices. After this call we will not get any more // onDeviceOutputCallback() or pushBuffer() calls because all the // SoundDevices are closed. closeDevices() blocks and can take a while. const bool sleepAfterClosing = true; - closeDevices(sleepAfterClosing); + closeDevices(sleepAfterClosing, async); } SoundDeviceStatus SoundManager::setConfig(const SoundManagerConfig& config) { diff --git a/src/soundio/soundmanager.h b/src/soundio/soundmanager.h index a33399fa4941..a5f4e92138cd 100644 --- a/src/soundio/soundmanager.h +++ b/src/soundio/soundmanager.h @@ -74,7 +74,12 @@ class SoundManager : public QObject { QList getHostAPIList() const; SoundManagerConfig getConfig() const; SoundDeviceStatus setConfig(const SoundManagerConfig& config); - void closeActiveConfig(); + // Due to a bug in in PulseAudio, we must give at least 5 seconds of cool + // down before performing further audio related operation. This sleep + // happens during the function call by default (synchronous blocking), but + // the caller may decide to use the async version, and must not performs any + // audio operation till it received the `devicesClosed` signal + void closeActiveConfig(bool async = false); void checkConfig(); void onDeviceOutputCallback(const SINT iFramesPerBuffer); @@ -118,6 +123,9 @@ class SoundManager : public QObject { void outputRegistered(const AudioOutput& output, AudioSource* src); void inputRegistered(const AudioInput& input, AudioDestination* dest); + private slots: + void completeDevicesClosing(); + private: // Closes all the devices and empties the list of devices we have. void clearDeviceList(bool sleepAfterClosing); @@ -126,7 +134,7 @@ class SoundManager : public QObject { // open, this method simply runs through the list of all known soundcards // (from PortAudio) and attempts to close them all. Closing a soundcard that // isn't open is safe. - void closeDevices(bool sleepAfterClosing); + void closeDevices(bool sleepAfterClosing, bool async = false); void setJACKName() const; bool jackApiUsed() const { From d43910d38219f4b7d457c57dc09f3e6d0ee72d3a Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sat, 13 Sep 2025 22:05:16 +0000 Subject: [PATCH 137/163] fix: correctly free reference to m_pSoundManager --- src/coreservices.cpp | 1 + src/qml/qmlwaveformrenderer.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreservices.cpp b/src/coreservices.cpp index f50c6d9fff18..a96a9e286404 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -865,6 +865,7 @@ void CoreServices::finalize() { mixxx::qml::QmlPlayerManagerProxy::registerPlayerManager(nullptr); mixxx::qml::QmlConfigProxy::registerUserSettings(nullptr); mixxx::qml::QmlLibraryProxy::registerLibrary(nullptr); + mixxx::qml::QmlSoundManagerProxy::registerManager(nullptr); ControllerScriptEngineBase::registerTrackCollectionManager(nullptr); #endif diff --git a/src/qml/qmlwaveformrenderer.cpp b/src/qml/qmlwaveformrenderer.cpp index 77017e9683e8..08eee1717368 100644 --- a/src/qml/qmlwaveformrenderer.cpp +++ b/src/qml/qmlwaveformrenderer.cpp @@ -338,7 +338,7 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererMark::create( const QString endIcon = pMark->endIcon().toLocalFile(); // FIXME: the following checks should be done on the WaveformMarker // setter (depends of #14515) - if (!QFileInfo::exists(pixmap)) { + if (!pixmap.isEmpty() && !QFileInfo::exists(pixmap)) { qmlEngine(this)->throwError(tr("Cannot find the marker pixmap") + " \"" + pixmap + '"'); } From 81741b792f6772796b255dddb1789e4095f80ef2 Mon Sep 17 00:00:00 2001 From: Ahmed Salah <140831492+NeuroXS@users.noreply.github.com> Date: Sun, 14 Sep 2025 06:54:42 +0300 Subject: [PATCH 138/163] Add track count to Tracks item in sidebar" --- src/library/librarytablemodel.cpp | 5 +++++ src/library/librarytablemodel.h | 5 +++++ src/library/mixxxlibraryfeature.cpp | 19 +++++++++++++++++-- src/library/mixxxlibraryfeature.h | 3 +++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/library/librarytablemodel.cpp b/src/library/librarytablemodel.cpp index 4ed18d3c2dc8..3c3bf4b2dc5d 100644 --- a/src/library/librarytablemodel.cpp +++ b/src/library/librarytablemodel.cpp @@ -101,3 +101,8 @@ TrackModel::Capabilities LibraryTableModel::getCapabilities() const { Capability::Properties | Capability::Sorting; } + +void LibraryTableModel::select() { + BaseSqlTableModel::select(); + emit updateTrackCount(); +} diff --git a/src/library/librarytablemodel.h b/src/library/librarytablemodel.h index b5a6c359cbad..299e4f42de06 100644 --- a/src/library/librarytablemodel.h +++ b/src/library/librarytablemodel.h @@ -16,4 +16,9 @@ class LibraryTableModel : public BaseSqlTableModel { // number of successful additions. int addTracks(const QModelIndex& index, const QList& locations) final; TrackModel::Capabilities getCapabilities() const final; + + void select() override; + + signals: + void updateTrackCount(); }; diff --git a/src/library/mixxxlibraryfeature.cpp b/src/library/mixxxlibraryfeature.cpp index 519f80f86790..e449c5304c34 100644 --- a/src/library/mixxxlibraryfeature.cpp +++ b/src/library/mixxxlibraryfeature.cpp @@ -32,7 +32,8 @@ MixxxLibraryFeature::MixxxLibraryFeature(Library* pLibrary, m_pLibraryTableModel(nullptr), m_pSidebarModel(make_parented(this)), m_pMissingView(nullptr), - m_pHiddenView(nullptr) { + m_pHiddenView(nullptr), + m_trackCount{0} { QString idColumn = LIBRARYTABLE_ID; QStringList columns = { LIBRARYTABLE_ID, @@ -114,6 +115,11 @@ MixxxLibraryFeature::MixxxLibraryFeature(Library* pLibrary, pLibrary->trackCollectionManager(), "mixxx.db.model.library"); + connect(m_pLibraryTableModel, + &LibraryTableModel::updateTrackCount, + this, + &MixxxLibraryFeature::slotUpdateTrackCount); + std::unique_ptr pRootItem = TreeItem::newRoot(this); pRootItem->appendChild(kMissingTitle); pRootItem->appendChild(kHiddenTitle); @@ -149,7 +155,8 @@ void MixxxLibraryFeature::bindLibraryWidget(WLibrary* pLibraryWidget, } QVariant MixxxLibraryFeature::title() { - return tr("Tracks"); + const QString title = tr("Tracks") + QStringLiteral(" (%1)").arg(m_trackCount); + return title; } TreeItemModel* MixxxLibraryFeature::sidebarModel() const { @@ -183,6 +190,14 @@ void MixxxLibraryFeature::bindSidebarWidget(WLibrarySidebar* pSidebarWidget) { } #endif +void MixxxLibraryFeature::slotUpdateTrackCount() { + m_trackCount = m_pLibraryTableModel->rowCount(); + + // Force updating the Tracks sidebar item. + // `select` must be false as we don't want to select again + emit featureIsLoading(this, false); +} + void MixxxLibraryFeature::activate() { //qDebug() << "MixxxLibraryFeature::activate()"; emit saveModelState(); diff --git a/src/library/mixxxlibraryfeature.h b/src/library/mixxxlibraryfeature.h index 50eb06258a7c..69f4da83fefe 100644 --- a/src/library/mixxxlibraryfeature.h +++ b/src/library/mixxxlibraryfeature.h @@ -50,6 +50,7 @@ class MixxxLibraryFeature final : public LibraryFeature { public slots: void activate() override; void activateChild(const QModelIndex& index) override; + void slotUpdateTrackCount(); #ifdef __ENGINEPRIME__ void onRightClick(const QPoint& globalPos) override; #endif @@ -74,6 +75,8 @@ class MixxxLibraryFeature final : public LibraryFeature { DlgMissing* m_pMissingView; DlgHidden* m_pHiddenView; + int m_trackCount; + #ifdef __ENGINEPRIME__ parented_ptr m_pExportLibraryAction; From b20bb77463f3c94eb5e5f815a2aaa745db229f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 15 Sep 2025 18:36:44 +0200 Subject: [PATCH 139/163] Remove #include This is not available with QT 6.2 --- src/qml/qmlsoundmanagerproxy.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qml/qmlsoundmanagerproxy.h b/src/qml/qmlsoundmanagerproxy.h index 916546ecc938..0cddcbbe15fc 100644 --- a/src/qml/qmlsoundmanagerproxy.h +++ b/src/qml/qmlsoundmanagerproxy.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include From 426c3e54dcc8c9bd89145d97b7e65e5eeedbdc5b Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Mon, 26 May 2025 16:06:06 +0000 Subject: [PATCH 140/163] feat: add Library cappability on QML --- CMakeLists.txt | 14 + res/qml/ActionButton.qml | 47 +++ res/qml/ActionPopup.qml | 69 ++++ res/qml/DeckInfoBar.qml | 13 +- res/qml/InputField.qml | 48 +++ res/qml/Library.qml | 205 ++++++------ res/qml/Library/Browser.qml | 223 +++++++++++++ res/qml/Library/Cell.qml | 104 ++++++ .../Control.qml} | 34 +- .../ControlLoadSelectedTrackHandler.qml} | 0 res/qml/Library/SourceTree.qml | 194 ++++++++++++ res/qml/Library/Track.qml | 131 ++++++++ res/qml/Library/TrackList.qml | 295 ++++++++++++++++++ res/qml/PreviewDeck.qml | 42 +++ res/qml/Sampler.qml | 9 +- res/qml/Theme/Theme.qml | 17 +- res/qml/images/library_computer.png | Bin 0 -> 2442 bytes res/qml/images/library_crates.png | Bin 0 -> 1651 bytes res/qml/images/library_playlist.png | Bin 0 -> 1610 bytes src/library/browse/browsetablemodel.cpp | 4 +- src/library/sidebarmodel.h | 4 +- src/library/treeitemmodel.h | 2 +- src/main.cpp | 5 + src/qml/qmlconfigproxy.h | 4 + src/qml/qmllibraryproxy.cpp | 28 +- src/qml/qmllibraryproxy.h | 23 +- src/qml/qmllibrarysource.cpp | 61 ++++ src/qml/qmllibrarysource.h | 116 +++++++ src/qml/qmllibrarysourcetree.cpp | 80 +++++ src/qml/qmllibrarysourcetree.h | 65 ++++ src/qml/qmllibrarytracklistcolumn.cpp | 25 ++ src/qml/qmllibrarytracklistcolumn.h | 86 +++++ src/qml/qmllibrarytracklistmodel.cpp | 221 ++++++++++--- src/qml/qmllibrarytracklistmodel.h | 92 +++++- src/qml/qmlsidebarmodelproxy.cpp | 88 ++++++ src/qml/qmlsidebarmodelproxy.h | 55 ++++ src/qml/qmlwaveformoverview.h | 2 +- 37 files changed, 2181 insertions(+), 225 deletions(-) create mode 100644 res/qml/ActionButton.qml create mode 100644 res/qml/ActionPopup.qml create mode 100644 res/qml/InputField.qml create mode 100644 res/qml/Library/Browser.qml create mode 100644 res/qml/Library/Cell.qml rename res/qml/{LibraryControl.qml => Library/Control.qml} (68%) rename res/qml/{LibraryControlLoadSelectedTrackHandler.qml => Library/ControlLoadSelectedTrackHandler.qml} (100%) create mode 100644 res/qml/Library/SourceTree.qml create mode 100644 res/qml/Library/Track.qml create mode 100644 res/qml/Library/TrackList.qml create mode 100644 res/qml/PreviewDeck.qml create mode 100644 res/qml/images/library_computer.png create mode 100644 res/qml/images/library_crates.png create mode 100644 res/qml/images/library_playlist.png create mode 100644 src/qml/qmllibrarysource.cpp create mode 100644 src/qml/qmllibrarysource.h create mode 100644 src/qml/qmllibrarysourcetree.cpp create mode 100644 src/qml/qmllibrarysourcetree.h create mode 100644 src/qml/qmllibrarytracklistcolumn.cpp create mode 100644 src/qml/qmllibrarytracklistcolumn.h create mode 100644 src/qml/qmlsidebarmodelproxy.cpp create mode 100644 src/qml/qmlsidebarmodelproxy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 25874a9aa390..c346035ba195 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3474,6 +3474,15 @@ if(QML) set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/qml) qt_add_library(mixxx-qml-lib STATIC) + + if(WIN32) + target_compile_definitions(mixxx-qml-lib PUBLIC __WINDOWS__) + endif() + + if(ENGINEPRIME) + target_compile_definitions(mixxx-qml-lib PUBLIC __ENGINEPRIME__) + endif() + foreach(component ${QT_COMPONENTS}) target_link_libraries( mixxx-qml-lib @@ -3555,10 +3564,15 @@ if(QML) src/qml/qmleffectslotproxy.cpp src/qml/qmleffectsmanagerproxy.cpp src/qml/qmllibraryproxy.cpp + src/qml/qmllibrarysource.cpp + src/qml/qmllibrarysourcetree.cpp src/qml/qmllibrarytracklistmodel.cpp src/qml/qmlmixxxcontrollerscreen.cpp src/qml/qmlplayermanagerproxy.cpp src/qml/qmlplayerproxy.cpp + src/qml/qmlsidebarmodelproxy.cpp + src/qml/qmllibrarytracklistcolumn.cpp + src/qml/qmltrackproxy.cpp src/qml/qmlvisibleeffectsmodel.cpp src/qml/qmlwaveformdisplay.cpp src/qml/qmlwaveformoverview.cpp diff --git a/res/qml/ActionButton.qml b/res/qml/ActionButton.qml new file mode 100644 index 000000000000..77e57dca5dd1 --- /dev/null +++ b/res/qml/ActionButton.qml @@ -0,0 +1,47 @@ +import QtQuick +import QtQuick.Controls 2.12 +import Qt5Compat.GraphicalEffects +import "Theme" + +AbstractButton { + id: root + enum Category { + None, + Danger, + Action + } + + property var category: ActionButton.Category.None + property alias label: labelField + + implicitHeight: 24 + background: Item { + Rectangle { + id: content + anchors.fill: parent + color: root.category == ActionButton.Category.Action ? '#2D4EA1' : root.category == ActionButton.Category.Danger ? '#7D3B3B' : '#3F3F3F' + radius: 4 + } + DropShadow { + anchors.fill: parent + source: content + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + color: "#80000000" + } + } + contentItem: Item { + Label { + id: labelField + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + font.family: Theme.fontFamily + font.capitalization: Font.AllUppercase + font.bold: true + font.pixelSize: Theme.buttonFontPixelSize + color: Theme.white + } + } +} diff --git a/res/qml/ActionPopup.qml b/res/qml/ActionPopup.qml new file mode 100644 index 000000000000..b8b30ea392e8 --- /dev/null +++ b/res/qml/ActionPopup.qml @@ -0,0 +1,69 @@ +import QtQml +import QtQuick +import QtQml.Models +import QtQuick.Layouts +import QtQuick.Controls 2.15 +import QtQuick.Shapes 1.12 +import Qt5Compat.GraphicalEffects +import "Theme" + +Popup { + id: root + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent + width: 200 + + padding: 0 + margins: 0 + leftInset: 0 + + default property alias children: content.children + + contentItem: Item { + ColumnLayout { + spacing: 2 + anchors.fill: parent + anchors.leftMargin: 20 + id: content + } + } + + background: Item { + Item { + id: content3 + anchors.fill: parent + Shape { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + implicitHeight: 20 + ShapePath { + strokeWidth: 0 + strokeColor: 'transparent' + fillColor: Theme.backgroundColor + fillRule: ShapePath.OddEvenFill + + startX: 0 + startY: 10 + PathLine { x: 20; y: 0 } + PathLine { x: 20; y: 20 } + PathLine { x: 0; y: 10 } + } + } + Rectangle { + anchors.fill: parent + anchors.right: parent.right + anchors.leftMargin: 20 + border.width: 0 + radius: 8 + color: Theme.backgroundColor + } + } + DropShadow { + anchors.fill: parent + source: content3 + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + color: "#80000000" + } + } +} diff --git a/res/qml/DeckInfoBar.qml b/res/qml/DeckInfoBar.qml index 8dc7326dc1e4..cedb6e2ba965 100644 --- a/res/qml/DeckInfoBar.qml +++ b/res/qml/DeckInfoBar.qml @@ -11,6 +11,7 @@ Rectangle { required property string group required property int rightColumnWidth property var deckPlayer: Mixxx.PlayerManager.getPlayer(group) + property var currentTrack: deckPlayer.currentTrack property color lineColor: Theme.deckLineColor border.width: 2 @@ -26,7 +27,7 @@ Rectangle { anchors.bottom: parent.bottom anchors.margins: 5 width: height - source: root.deckPlayer.coverArtUrl + source: root.currentTrack.coverArtUrl visible: false asynchronous: true } @@ -95,7 +96,7 @@ Rectangle { Skin.EmbeddedText { id: infoBarTitle - text: root.deckPlayer.title + text: root.currentTrack.title anchors.top: infoBarHSeparator1.top anchors.left: infoBarVSeparator.left anchors.right: infoBarHSeparator1.left @@ -119,7 +120,7 @@ Rectangle { Skin.EmbeddedText { id: infoBarArtist - text: root.deckPlayer.artist + text: root.currentTrack.artist anchors.top: infoBarVSeparator.bottom anchors.left: infoBarVSeparator.left anchors.right: infoBarHSeparator1.left @@ -144,7 +145,7 @@ Rectangle { Skin.EmbeddedText { id: infoBarKey - text: root.deckPlayer.keyText + text: root.currentTrack.keyText anchors.top: infoBarHSeparator1.top anchors.bottom: infoBarVSeparator.top anchors.right: infoBarHSeparator2.left @@ -206,11 +207,11 @@ Rectangle { GradientStop { position: 0 color: { - const trackColor = root.deckPlayer.color; + const trackColor = root.currentTrack.color; if (!trackColor.valid) return Theme.deckBackgroundColor; - return Qt.darker(root.deckPlayer.color, 2); + return Qt.darker(root.currentTrack.color, 2); } } diff --git a/res/qml/InputField.qml b/res/qml/InputField.qml new file mode 100644 index 000000000000..43dc1cc2ffe4 --- /dev/null +++ b/res/qml/InputField.qml @@ -0,0 +1,48 @@ +import QtQuick +import QtQuick.Controls 2.15 +import Qt5Compat.GraphicalEffects +import "Theme" + +FocusScope { + id: root + + property alias input: inputField + + Rectangle { + id: backgroundInput + radius: 4 + color: '#232323' + anchors.fill: parent + } + DropShadow { + id: dropSetting + anchors.fill: parent + horizontalOffset: 0 + verticalOffset: 0 + radius: 4.0 + color: "#000000" + source: backgroundInput + } + InnerShadow { + id: effect2 + anchors.fill: parent + source: dropSetting + spread: 0.2 + radius: 12 + samples: 24 + horizontalOffset: 0 + verticalOffset: 0 + color: "#353535" + } + TextInput { + id: inputField + anchors.fill: parent + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + anchors.margins: 7 + focus: true + clip: true + color: acceptableInput ? "#FFFFFF" : "#7D3B3B" + horizontalAlignment: TextInput.AlignLeft + } +} diff --git a/res/qml/Library.qml b/res/qml/Library.qml index 3f94320aac26..7be4f4ade0a5 100644 --- a/res/qml/Library.qml +++ b/res/qml/Library.qml @@ -1,140 +1,115 @@ +import "." as Skin import Mixxx 1.0 as Mixxx -import QtQuick 2.12 +import Qt.labs.qmlmodels +import QtQml +import QtQuick +import QtQml.Models +import QtQuick.Layouts +import QtQuick.Controls 2.15 +import QtQuick.Shapes 1.6 import "Theme" +import "Library" as LibraryComponent Item { - Rectangle { - color: Theme.deckBackgroundColor - anchors.fill: parent - - LibraryControl { - id: libraryControl - - onMoveVertical: (offset) => { - listView.moveSelectionVertical(offset); - } - onLoadSelectedTrack: (group, play) => { - listView.loadSelectedTrack(group, play); - } - onLoadSelectedTrackIntoNextAvailableDeck: (play) => { - listView.loadSelectedTrackIntoNextAvailableDeck(play); - } - onFocusWidgetChanged: { - switch (focusWidget) { - case FocusedWidgetControl.WidgetKind.LibraryView: - listView.forceActiveFocus(); - break; - } - } - } + id: root - ListView { - id: listView + property var sidebar: librarySources.sidebar() - function moveSelectionVertical(value) { - if (value == 0) - return ; - - const rowCount = model.rowCount(); - if (rowCount == 0) - return ; - - currentIndex = Mixxx.MathUtils.positiveModulo(currentIndex + value, rowCount); - } - - function loadSelectedTrackIntoNextAvailableDeck(play) { - const url = model.get(currentIndex).fileUrl; - if (!url) - return ; - - Mixxx.PlayerManager.loadLocationUrlIntoNextAvailableDeck(url, play); - } - - function loadSelectedTrack(group, play) { - const url = model.get(currentIndex).fileUrl; - if (!url) - return ; - - const player = Mixxx.PlayerManager.getPlayer(group); - if (!player) - return ; + LibraryComponent.SourceTree { + id: librarySources + } - player.loadTrackFromLocationUrl(url, play); - } + SplitView { + id: librarySplitView + orientation: Qt.Horizontal + anchors.fill: parent - anchors.fill: parent - anchors.margins: 10 + handle: Rectangle { + id: handleDelegate + implicitWidth: 8 + implicitHeight: 8 + color: Theme.panelSplitterBackground clip: true - keyNavigationWraps: true - highlightMoveDuration: 250 - highlightResizeDuration: 50 - model: Mixxx.Library.model - Keys.onPressed: (event) => { - switch (event.key) { - case Qt.Key_Enter: - case Qt.Key_Return: - listView.loadSelectedTrackIntoNextAvailableDeck(false); - break; + property color handleColor: SplitHandle.pressed || SplitHandle.hovered ? Theme.panelSplitterHandleActive : Theme.panelSplitterHandle + property int handleSize: SplitHandle.pressed || SplitHandle.hovered ? 6 : 5 + + ColumnLayout { + anchors.centerIn: parent + Repeater { + model: 3 + Rectangle { + width: handleSize + height: handleSize + radius: handleSize + color: handleColor + } } } - delegate: Item { - id: itemDlgt - - required property int index - required property url fileUrl - required property string artist - required property string title - - implicitWidth: listView.width - implicitHeight: 30 - - Text { - anchors.verticalCenter: parent.verticalCenter - text: itemDlgt.artist + " - " + itemDlgt.title - color: (listView.currentIndex == itemDlgt.index && listView.activeFocus) ? Theme.blue : Theme.deckTextColor + containmentMask: Item { + x: (handleDelegate.width - width) / 2 + width: 8 + height: librarySplitView.height + } + } - Behavior on color { - ColorAnimation { - duration: listView.highlightMoveDuration + SplitView { + id: sideBarSplitView + SplitView.minimumWidth: 100 + SplitView.preferredWidth: 415 + SplitView.maximumWidth: 600 + + orientation: Qt.Vertical + + handle: Rectangle { + id: handleDelegate + implicitWidth: 8 + implicitHeight: 8 + color: Theme.panelSplitterBackground + clip: true + property color handleColor: SplitHandle.pressed || SplitHandle.hovered ? Theme.panelSplitterHandleActive : Theme.panelSplitterHandle + property int handleSize: SplitHandle.pressed || SplitHandle.hovered ? 6 : 5 + + RowLayout { + anchors.centerIn: parent + Repeater { + model: 3 + Rectangle { + width: handleSize + height: handleSize + radius: handleSize + color: handleColor } } } - Image { - id: dragItem - - Drag.active: dragArea.drag.active - Drag.dragType: Drag.Automatic - Drag.supportedActions: Qt.CopyAction - Drag.mimeData: { - "text/uri-list": itemDlgt.fileUrl, - "text/plain": itemDlgt.fileUrl - } - anchors.fill: parent + containmentMask: Item { + x: (handleDelegate.width - width) / 2 + height: 8 + width: sideBarSplitView.width } + } + LibraryComponent.Browser { + SplitView.minimumHeight: 200 + SplitView.preferredHeight: 500 + SplitView.fillHeight: true - MouseArea { - id: dragArea - - anchors.fill: parent - drag.target: dragItem - onPressed: { - listView.forceActiveFocus(); - listView.currentIndex = itemDlgt.index; - parent.grabToImage((result) => { - dragItem.Drag.imageSource = result.url; - }); - } - onDoubleClicked: listView.loadSelectedTrackIntoNextAvailableDeck(false) - } + model: root.sidebar } - highlight: Rectangle { - border.color: listView.activeFocus ? Theme.blue : Theme.deckTextColor - border.width: 1 - color: "transparent" + Skin.PreviewDeck { + SplitView.minimumHeight: 100 + SplitView.preferredHeight: 100 + SplitView.maximumHeight: 200 } } + LibraryComponent.TrackList { + SplitView.fillHeight: true + + // FIXME: this is necessary to prevent the header label to render outside of the table when horizontally scrolling: https://github.com/mixxxdj/mixxx/pull/14514#issuecomment-3311914346 + clip: true + + model: root.sidebar.tracklist + } } } diff --git a/res/qml/Library/Browser.qml b/res/qml/Library/Browser.qml new file mode 100644 index 000000000000..3e28934e6b8a --- /dev/null +++ b/res/qml/Library/Browser.qml @@ -0,0 +1,223 @@ +import ".." as Skin +import Mixxx 1.0 as Mixxx +import Qt.labs.qmlmodels +import QtQml +import QtQuick +import QtQml.Models +import QtQuick.Layouts +import QtQuick.Controls 2.15 +import QtQuick.Shapes 1.12 +import Qt5Compat.GraphicalEffects +import "../Theme" + +Rectangle { + id: root + + required property var model + readonly property var featureSelection: ItemSelectionModel {} + + color: Theme.backgroundColor + + Component.onCompleted: { + root.model.activate(root.model.index(0, 0)) + } + + Rectangle { + anchors.fill: parent + anchors.topMargin: 7 + anchors.leftMargin: 7 + anchors.rightMargin: 25 + anchors.bottomMargin: 40 + color: Theme.sunkenBackgroundColor + + ColumnLayout { + anchors.fill: parent + spacing: 0 + ScrollView { + Layout.fillHeight: true + Layout.fillWidth: true + + TreeView { + id: featureView + Layout.fillWidth: true + + clip: true + + model: root.model + + selectionModel: featureSelection + + delegate: FocusScope { + required property string label + required property var icon + + readonly property real indentation: 40 + readonly property real padding: 5 + + // Assigned to by TreeView: + required property TreeView treeView + required property bool isTreeNode + required property bool expanded + required property int hasChildren + required property int depth + required property int row + required property int column + required property bool current + // FIXME The signature for that function has changed after Qt 6.4.2 (currently shipped on Ubuntu 24.04) + // See https://github.com/mixxxdj/mixxx/pull/14514#issuecomment-2770811094 for further details + readonly property var index: treeView.modelIndex(column, row) + + implicitWidth: treeView.width + implicitHeight: depth == 0 ? 42 : 35 + + // Rotate indicator when expanded by the user + // (requires TreeView to have a selectionModel) + property Animation indicatorAnimation: NumberAnimation { + target: indicator + property: "rotation" + from: expanded ? 0 : 90 + to: expanded ? 90 : 0 + duration: 100 + easing.type: Easing.OutQuart + } + TableView.onPooled: indicatorAnimation.complete() + TableView.onReused: if (current) indicatorAnimation.start() + onExpandedChanged: indicator.rotation = expanded ? 90 : 0 + + Rectangle { + id: background + anchors.fill: parent + color: depth == 0 ? Theme.darkGray3 : 'transparent' + + MouseArea { + id: rowMouseArea + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: (event) => { + treeView.selectionModel.select(treeView.selectionModel.model.index(row, 0), ItemSelectionModel.Rows | ItemSelectionModel.Select | ItemSelectionModel.Clear | ItemSelectionModel.Current); + treeView.model.activate(index) + if (isTreeNode && hasChildren) { + treeView.toggleExpanded(row) + } + event.accepted = true + } + } + + Rectangle { + width: 25 + anchors.left: parent.left + anchors.leftMargin: 10 + 15 * depth + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + color: current ? Theme.midGray : 'transparent' + + Repeater { + id: lineIcon + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + model: !!icon ? 1 : 0 + Image { + visible: depth == 0 && icon + source: icon + height: 25 + width: 25 + } + } + + Label { + id: indicator + Layout.preferredWidth: indicator.implicitWidth + visible: isTreeNode && hasChildren + color: Theme.textColor + text: "▶" + + anchors { + left: parent.left + verticalCenter: lineIcon.bottom + } + } + + Label { + id: labelItem + anchors.left: parent.left + anchors.leftMargin: depth == 0 && row == 0 ? 10 : 34 + anchors.verticalCenter: parent.verticalCenter + clip: true + font.weight: depth == 0 ? Font.Bold : Font.Medium + font.pixelSize: 14 + text: label + color: Theme.textColor + } + Item { + visible: rowMouseArea.containsMouse && isTreeNode && hasChildren + id: newItem + height: parent.height + anchors { + verticalCenter: parent.verticalCenter + right: parent.right + rightMargin: 10 + } + Rectangle { + width: 30 + height: parent.height + anchors.centerIn: parent + gradient: Gradient { + orientation: Gradient.Horizontal + + GradientStop { + position: 1 + color: Theme.sunkenBackgroundColor + } + + GradientStop { + position: 0 + color: 'transparent' + } + } + } + Rectangle { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: 5 + width: 20 + height: 20 + border.width: 2 + border.color: Theme.white + radius: 20 + color: 'transparent' + Shape { + anchors.fill: parent + anchors.margins: 4 + ShapePath { + strokeWidth: 2 + fillColor: Theme.white + capStyle: ShapePath.RoundCap + + startX: 6 + startY: 0 + PathLine { x: 6; y: 12 } + PathLine { x: 6; y: 8 } + } + ShapePath { + strokeWidth: 2 + fillColor: Theme.white + capStyle: ShapePath.RoundCap + + startX: 0 + startY: 6 + PathLine { y: 6; x: 12 } + PathLine { y: 6; x: 8 } + } + } + } + } + } + } + } + } + } + } + } +} diff --git a/res/qml/Library/Cell.qml b/res/qml/Library/Cell.qml new file mode 100644 index 000000000000..d93e57a0e765 --- /dev/null +++ b/res/qml/Library/Cell.qml @@ -0,0 +1,104 @@ +import Qt5Compat.GraphicalEffects +import QtQuick +import QtQuick.Layouts +import "../Theme" + +Rectangle { + id: root + + readonly property alias dragImage: dragImageEffect + + anchors.fill: parent + + color: selected ? Theme.accent : (row % 2 == 0 ? Theme.sunkenBackgroundColor : Theme.backgroundColor) + + Drag.dragType: Drag.Automatic + Drag.supportedActions: Qt.CopyAction + Drag.mimeData: { + "text/uri-list": file_url.toString(), + "text/plain": file_url.toString(), + } + Item { + id: dragImageSource + width: 190 + height: 85 + visible: false + Rectangle { + color: Theme.sunkenBackgroundColor + anchors { + left: parent.left + right: parent.right + top: parent.top + bottom: parent.bottom + margins: 5 + } + radius: 12 + RowLayout { + anchors.fill: parent + Image { + id: cover + Layout.fillHeight: true + Layout.preferredWidth: cover_art ? 75 : 0 + fillMode: Image.PreserveAspectFit + source: cover_art + clip: true + asynchronous: true + } + ColumnLayout { + Layout.fillWidth: true + Layout.fillHeight: true + Text { + text: track ? track.title : 'Unknown title' + color: Theme.textColor + } + Text { + text: track ? track.artist : 'Unknown artist' + color: Theme.midGray + } + } + } + Rectangle { + width: 20 + anchors { + top: parent.top + right: parent.right + bottom:parent.bottom + } + gradient: Gradient { + orientation: Gradient.Horizontal + + GradientStop { + position: 1 + color: Theme.darkGray + } + + GradientStop { + position: 0 + color: 'transparent' + } + } + } + } + } + DropShadow { + id: dragImageEffect + visible: false + anchors.fill: dragImageSource + source: dragImageSource + horizontalOffset: 0 + verticalOffset: 0 + radius: 10.0 + color: "#80000000" + } + + Rectangle { + id: border + color: Theme.darkGray2 + width: 1 + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + } + } +} diff --git a/res/qml/LibraryControl.qml b/res/qml/Library/Control.qml similarity index 68% rename from res/qml/LibraryControl.qml rename to res/qml/Library/Control.qml index 353e4b8bb21e..a5da4c133810 100644 --- a/res/qml/LibraryControl.qml +++ b/res/qml/Library/Control.qml @@ -1,3 +1,5 @@ +import ".." as Skin +import "." as LibraryComponent import Mixxx 1.0 as Mixxx import QtQuick 2.12 @@ -10,17 +12,17 @@ Item { signal loadSelectedTrack(string group, bool play) signal loadSelectedTrackIntoNextAvailableDeck(bool play) - FocusedWidgetControl { + Skin.FocusedWidgetControl { id: focusedWidgetControl - Component.onCompleted: this.value = FocusedWidgetControl.WidgetKind.LibraryView + Component.onCompleted: this.value = Skin.FocusedWidgetControl.WidgetKind.LibraryView } Mixxx.ControlProxy { group: "[Library]" key: "GoToItem" onValueChanged: (value) => { - if (value != 0 && root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView) + if (value != 0 && root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView) root.loadSelectedTrackIntoNextAvailableDeck(false); } } @@ -29,7 +31,7 @@ Item { group: "[Playlist]" key: "LoadSelectedIntoFirstStopped" onValueChanged: (value) => { - if (value != 0 && root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView) + if (value != 0 && root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView) root.loadSelectedTrackIntoNextAvailableDeck(false); } } @@ -39,7 +41,7 @@ Item { key: "SelectTrackKnob" onValueChanged: (value) => { if (value != 0) { - root.focusWidget = FocusedWidgetControl.WidgetKind.LibraryView; + root.focusWidget = Skin.FocusedWidgetControl.WidgetKind.LibraryView; root.moveVertical(value); } } @@ -50,7 +52,7 @@ Item { key: "SelectPrevTrack" onValueChanged: (value) => { if (value != 0) { - root.focusWidget = FocusedWidgetControl.WidgetKind.LibraryView; + root.focusWidget = Skin.FocusedWidgetControl.WidgetKind.LibraryView; root.moveVertical(-1); } } @@ -61,7 +63,7 @@ Item { key: "SelectNextTrack" onValueChanged: (value) => { if (value != 0) { - root.focusWidget = FocusedWidgetControl.WidgetKind.LibraryView; + root.focusWidget = Skin.FocusedWidgetControl.WidgetKind.LibraryView; root.moveVertical(1); } } @@ -71,7 +73,7 @@ Item { group: "[Library]" key: "MoveVertical" onValueChanged: (value) => { - if (value != 0 && root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView) + if (value != 0 && root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView) root.moveVertical(value); } } @@ -80,7 +82,7 @@ Item { group: "[Library]" key: "MoveUp" onValueChanged: (value) => { - if (value != 0 && root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView) + if (value != 0 && root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView) root.moveVertical(-1); } } @@ -89,7 +91,7 @@ Item { group: "[Library]" key: "MoveDown" onValueChanged: (value) => { - if (value != 0 && root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView) + if (value != 0 && root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView) root.moveVertical(1); } } @@ -104,11 +106,11 @@ Item { Instantiator { model: numDecksControl.value - delegate: LibraryControlLoadSelectedTrackHandler { + delegate: LibraryComponent.ControlLoadSelectedTrackHandler { required property int index group: "[Channel" + (index + 1) + "]" - enabled: root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView + enabled: root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView onLoadTrackRequested: (play) => { root.loadSelectedTrack(this.group, play); } @@ -125,11 +127,11 @@ Item { Instantiator { model: numPreviewDecksControl.value - delegate: LibraryControlLoadSelectedTrackHandler { + delegate: LibraryComponent.ControlLoadSelectedTrackHandler { required property int index group: "[PreviewDeck" + (index + 1) + "]" - enabled: root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView + enabled: root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView onLoadTrackRequested: (play) => { root.loadSelectedTrack(this.group, play); } @@ -146,11 +148,11 @@ Item { Instantiator { model: numSamplersControl.value - delegate: LibraryControlLoadSelectedTrackHandler { + delegate: LibraryComponent.ControlLoadSelectedTrackHandler { required property int index group: "[Sampler" + (index + 1) + "]" - enabled: root.focusWidget == FocusedWidgetControl.WidgetKind.LibraryView + enabled: root.focusWidget == Skin.FocusedWidgetControl.WidgetKind.LibraryView onLoadTrackRequested: (play) => { root.loadSelectedTrack(this.group, play); } diff --git a/res/qml/LibraryControlLoadSelectedTrackHandler.qml b/res/qml/Library/ControlLoadSelectedTrackHandler.qml similarity index 100% rename from res/qml/LibraryControlLoadSelectedTrackHandler.qml rename to res/qml/Library/ControlLoadSelectedTrackHandler.qml diff --git a/res/qml/Library/SourceTree.qml b/res/qml/Library/SourceTree.qml new file mode 100644 index 000000000000..470a03da7101 --- /dev/null +++ b/res/qml/Library/SourceTree.qml @@ -0,0 +1,194 @@ +import QtQuick +import Mixxx 1.0 as Mixxx +import "." as LibraryComponent +import "../Theme" + +Mixxx.LibrarySourceTree { + id: root + + component DefaultDelegate: LibraryComponent.Cell { + id: cell + readonly property var caps: capabilities + // FIXME: https://bugreports.qt.io/browse/QTBUG-111789 + Binding on Drag.active { + value: dragArea.drag.active + // This delays the update until the even queue is cleared + // preventing any potential oscillations causing a loop + delayed: true + } + + LibraryComponent.Track { + id: dragArea + anchors.fill: parent + capabilities: cell.caps + + onPressed: { + if (pressedButtons == Qt.LeftButton) { + tableView.selectionModel.selectRow(row); + parent.dragImage.grabToImage((result) => { + parent.Drag.imageSource = result.url; + }, Qt.size(parent.dragImage.width, parent.dragImage.height)); + } + } + onDoubleClicked: { + tableView.selectionModel.selectRow(row); + tableView.loadSelectedTrackIntoNextAvailableDeck(false); + } + } + + Text { + id: value + anchors.fill: parent + anchors.leftMargin: 15 + font.pixelSize: 14 + text: display ?? "" + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + color: Theme.textColor + } + } + + defaultColumns: [ + Mixxx.TrackListColumn { + preferredWidth: 110 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Album + + delegate: Rectangle { + color: decoration + implicitHeight: 30 + + Image { + anchors.fill: parent + fillMode: Image.PreserveAspectCrop + source: cover_art + clip: true + asynchronous: true + } + } + }, + // FIXME: WaveformOverview is currently disabled due to performance limitation. Like for the legacy UI, a cache likely needs to be implemented to help + // Mixxx.TrackListColumn { + // label: qsTr("Preview") + // fillSpan: 3 + // preferredWidth: 300 + // columnIdx: Mixxx.TrackListColumn.SQLColumns.Title + + // delegate: LibraryCell { + // // implicitHeight: 30 + // anchors.fill: parent + + // readonly property var trackProxy: track + + // Drag.active: dragArea.drag.active + // Drag.dragType: Drag.Automatic + // Drag.supportedActions: Qt.CopyAction + // Drag.mimeData: { + // "text/uri-list": file_url, + // "text/plain": file_url + // } + + // LibraryComponent.Track { + // id: dragArea + // anchors.fill: parent + // capabilities: parent.capabilities + + // onPressed: { + // if (pressedButtons == Qt.LeftButton) { + // tableView.selectionModel.selectRow(row); + // parent.dragImage.grabToImage((result) => { + // parent.Drag.imageSource = result.url; + // }); + // } else { + // } + // } + // onDoubleClicked: { + // tableView.selectionModel.selectRow(row); + // tableView.loadSelectedTrackIntoNextAvailableDeck(false); + // } + // } + + // Mixxx.WaveformOverview { + // anchors.fill: parent + // channels: Mixxx.WaveformOverview.Channels.LeftChannel + // renderer: Mixxx.WaveformOverview.Renderer.Filtered + // colorHigh: Theme.white + // colorMid: Theme.blue + // colorLow: Theme.green + // track: trackProxy + // } + // Rectangle { + // id: border + // color: Theme.darkGray2 + // width: 1 + // anchors { + // top: parent.top + // bottom: parent.bottom + // right: parent.right + // } + // } + // } + + // }, + Mixxx.TrackListColumn { + label: qsTr("Title") + fillSpan: 3 + columnIdx: Mixxx.TrackListColumn.SQLColumns.Title + + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("Artist") + fillSpan: 2 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Artist + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("Album") + fillSpan: 1 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Album + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("Year") + preferredWidth: 80 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Year + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("Bpm") + preferredWidth: 60 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Bpm + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("Key") + preferredWidth: 70 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Key + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("File Type") + preferredWidth: 70 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.FileType + delegate: DefaultDelegate { } + }, + Mixxx.TrackListColumn { + label: qsTr("Bitrate") + preferredWidth: 70 + + columnIdx: Mixxx.TrackListColumn.SQLColumns.Bitrate + delegate: DefaultDelegate { } + } + ] + Mixxx.LibraryAllTrackSource { + label: qsTr("All...") + columns: root.defaultColumns + } +} diff --git a/res/qml/Library/Track.qml b/res/qml/Library/Track.qml new file mode 100644 index 000000000000..253c4a188b9e --- /dev/null +++ b/res/qml/Library/Track.qml @@ -0,0 +1,131 @@ +import Mixxx 1.0 as Mixxx +import QtQuick +import QtQuick.Controls 2.15 +import "../Theme" + +MouseArea { + id: dragArea + + required property var capabilities + + readonly property var library: Mixxx.Library + + drag.target: value + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: (mouse) => { + if (mouse.button === Qt.RightButton) + contextMenu.popup() + } + onPressAndHold: (mouse) => { + if (mouse.source === Qt.MouseEventNotSynthesized) + contextMenu.popup() + } + + function hasCapabilities(caps) { + return (dragArea.capabilities & caps) == caps; + } + + Menu { + id: contextMenu + title: qsTr("File") + + Menu { + title: qsTr("Load to") + enabled: { + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.LoadToDeck) || + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.LoadToSampler) || + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.LoadToPreviewDeck) + } + + Menu { + id: loadToDeckMenu + title: qsTr("Deck") + enabled: hasCapabilities(Mixxx.LibraryTrackListModel.Capability.LoadToDeck) + Instantiator { + model: 4 + delegate: MenuItem { + text: qsTr("Deck %1").arg(modelData+1) + onTriggered: Mixxx.PlayerManager.getPlayer(`[Channel${modelData+1}]`).loadTrack(track) + } + + onObjectAdded: (index, object) => loadToDeckMenu.insertItem(index, object) + onObjectRemoved: (index, object) => loadToDeckMenu.removeItem(object) + } + } + + Menu { + title: qsTr("Sampler") + enabled: hasCapabilities(Mixxx.LibraryTrackListModel.Capability.LoadToSampler) + } + + // Instantiator { + // id: recentFilesInstantiator + // model: settings.recentFiles + // delegate: MenuItem { + // text: settings.displayableFilePath(modelData) + // onTriggered: loadFile(modelData) + // } + + // onObjectAdded: (index, object) => recentFilesMenu.insertItem(index, object) + // onObjectRemoved: (index, object) => recentFilesMenu.removeItem(object) + // } + } + + Menu { + id: addToPlaylistMenu + title: qsTr("Add to playlists") + enabled: { + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.AddToTrackSet) + } + + MenuSeparator {} + + MenuItem { + enabled: false // TODO implement + text: qsTr("Create New Playlist") + } + } + + Menu { + id: addToCrateMenu + title: qsTr("Crates") + enabled: { + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.AddToTrackSet) + } + + MenuSeparator {} + + MenuItem { + enabled: false // TODO implement + text: qsTr("Create New Crate") + } + } + + Menu { + id: analyzeMenu + title: qsTr("Analyze") + enabled: { + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.EditMetadata)|| + hasCapabilities(Mixxx.LibraryTrackListModel.Capability.Analyze) + } + MenuItem { + text: qsTr("Analyze") + onTriggered: { + library.analyze(track) + } + } + MenuItem { + enabled: false // TODO implement + text: qsTr("Reanalyze") + } + MenuItem { + enabled: false // TODO implement + text: qsTr("Reanalyze (constant BPM)") + } + MenuItem { + enabled: false // TODO implement + text: qsTr("Reanalyze (variable BPM)") + } + } + } +} diff --git a/res/qml/Library/TrackList.qml b/res/qml/Library/TrackList.qml new file mode 100644 index 000000000000..715b7a6323e4 --- /dev/null +++ b/res/qml/Library/TrackList.qml @@ -0,0 +1,295 @@ +import ".." as Skin +import "." as LibraryComponent +import Mixxx 1.0 as Mixxx +import Qt.labs.qmlmodels +import QtQml +import QtQuick +import QtQml.Models +import QtQuick.Layouts +import QtQuick.Controls 2.15 +import "../Theme" + +Rectangle { + id: root + + color: Theme.darkGray + + required property var model + + LibraryComponent.Control { + id: libraryControl + + onMoveVertical: (offset) => { + view.selectionModel.moveSelectionVertical(offset); + } + onLoadSelectedTrack: (group, play) => { + view.loadSelectedTrack(group, play); + } + onLoadSelectedTrackIntoNextAvailableDeck: (play) => { + view.loadSelectedTrackIntoNextAvailableDeck(play); + } + onFocusWidgetChanged: { + switch (focusWidget) { + case Skin.FocusedWidgetControl.WidgetKind.LibraryView: + view.forceActiveFocus(); + break; + } + } + } + + HorizontalHeaderView { + id: horizontalHeader + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 5 + syncView: view + + property int sortingColumn: -1 + property var sortingOrder: Qt.Descending + + delegate: Item { + id: column + required property string display + required property int index + + implicitHeight: columnName.contentHeight + 5 + implicitWidth: columnName.contentWidth + 5 + + MouseArea { + id: columnMouseHandler + anchors.fill: parent + acceptedButtons: Qt.LeftButton + onClicked: { + if (horizontalHeader.sortingColumn == index) { + horizontalHeader.sortingOrder = horizontalHeader.sortingOrder == Qt.DescendingOrder ? Qt.AscendingOrder : Qt.DescendingOrder + } else { + horizontalHeader.sortingColumn = index + horizontalHeader.sortingOrder = Qt.AscendingOrder + } + view.model.sort(horizontalHeader.sortingColumn, horizontalHeader.sortingOrder); + } + } + + Text { + id: columnName + + text: display + anchors.fill: parent + anchors.leftMargin: 15 + elide: Text.ElideRight + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + font.family: Theme.fontFamily + font.capitalization: Font.Capitalize + font.pixelSize: 12 + font.weight: Font.Medium + color: Theme.textColor + } + + Item { + anchors { + left: parent.left + leftMargin: 5 + top: parent.top + bottom: parent.bottom + } + Label { + id: sortIndicator + + visible: horizontalHeader.sortingColumn == index + + text: "▶" + rotation: horizontalHeader.sortingOrder == Qt.AscendingOrder ? 90 : -90 + + anchors.centerIn: parent + elide: Text.ElideRight + horizontalAlignment: Text.AlignRight + verticalAlignment: Text.AlignVCenter + font.family: Theme.fontFamily + font.capitalization: Font.AllUppercase + font.bold: true + font.pixelSize: Theme.buttonFontPixelSize + color: "red" + } + } + Rectangle { + id: columnResizer + color: Theme.darkGray2 + width: 1 + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + } + MouseArea { + id: columnResizeHandler + + property int sizeOffset: 0 + + anchors.fill: parent + preventStealing: true + drag { + target: parent + axis: Drag.XAxis + threshold: 2 + onActiveChanged: { + if (!drag.active && columnResizeHandler.sizeOffset !== 0) { + view.model.columns[index].preferredWidth = column.width + columnResizeHandler.sizeOffset = 0 + view.updateColumnSize() + view.forceLayout() + } + } + } + cursorShape: Qt.SizeHorCursor + onMouseXChanged: { + if (drag.active) { + column.width += mouseX + sizeOffset += mouseX + } + } + } + } + } + } + + TableView { + id: view + + function loadSelectedTrackIntoNextAvailableDeck(play) { + const urls = this.selectionModel.selectedTrackUrls(); + if (urls.length == 0) + return ; + + Mixxx.PlayerManager.loadLocationUrlIntoNextAvailableDeck(urls[0], play); + } + + function loadSelectedTrack(group, play) { + const urls = this.selectionModel.selectedTrackUrls(); + if (urls.length == 0) + return ; + + player.loadTrackFromLocationUrl(urls[0], play); + } + + ScrollBar.vertical: ScrollBar { + policy: ScrollBar.AlwaysOn + } + + anchors.top: horizontalHeader.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: 5 + clip: true + reuseItems: true + Keys.onUpPressed: this.selectionModel.moveSelectionVertical(-1) + Keys.onDownPressed: this.selectionModel.moveSelectionVertical(1) + Keys.onEnterPressed: this.loadSelectedTrackIntoNextAvailableDeck(false) + Keys.onReturnPressed: this.loadSelectedTrackIntoNextAvailableDeck(false) + model: root.model + function updateColumnSize() { + usedWidth = 0; + dynamicColumnCount = 0; + if (model == null) { + return; + } + for (let c = 0; c < model.columns.length; c++) { + if (model.columns[c].hidden) { + continue + } else if (model.columns[c].preferredWidth > 0) { + usedWidth += model.columns[c].preferredWidth; + } else { + dynamicColumnCount += model.columns[c].fillSpan || 1 + } + } + } + Component.onCompleted: this.updateColumnSize() + onModelChanged: this.updateColumnSize() + + property int usedWidth: 0 + property int dynamicColumnCount: 0 + + columnWidthProvider: function(column) { + const columnDef = view.model.columns[column] + if (columnDef.hidden) { + return 0; + } + if (columnDef.preferredWidth >= 0) { + return columnDef.preferredWidth; + } + const span = columnDef.fillSpan || 1; + return span * (view.width - view.usedWidth) / view.dynamicColumnCount; + } + + selectionModel: ItemSelectionModel { + function selectRow(row) { + const rowCount = this.model.rowCount(); + if (rowCount == 0) { + this.clear(); + return ; + } + const newRow = Mixxx.MathUtils.positiveModulo(row, rowCount); + this.select(this.model.index(newRow, 0), ItemSelectionModel.Rows | ItemSelectionModel.Select | ItemSelectionModel.Clear | ItemSelectionModel.Current); + } + + function moveSelectionVertical(value) { + if (value == 0) + return ; + + const selected = this.selectedIndexes; + const oldRow = (selected.length == 0) ? 0 : selected[0].row; + this.selectRow(oldRow + value); + } + + function selectedTrackUrls() { + return this.selectedIndexes.map((index) => { + return this.model.getUrl(index.row); + }); + } + model: view.model + } + + delegate: Item { + id: item + required property bool selected + required property color decoration + required property var display + required property var track + required property string file_url + required property url cover_art + required property int row + + implicitHeight: 30 + + Loader { + id: loader + anchors.fill: parent + property bool selected: item.selected + property color decoration: item.decoration + property var display: item.display + property var track: item.track + property url file_url: item.file_url + property url cover_art: item.cover_art + property int row: item.row + property var tableView: view + property var capabilities: root.model ? root.model.getCapabilities() : Mixxx.LibraryTrackListModel.Capability.None + sourceComponent: delegate + focus: true + + onLoaded: { + // Workaround needed for WaveformOverview column to load the data + // if (track) + // Mixxx.Library.analyze(track) + } + } + // Workaround needed for WaveformOverview column to load the data + // TableView.onReused: { + // if (track) + // Mixxx.Library.analyze(track) + // } + } + } +} diff --git a/res/qml/PreviewDeck.qml b/res/qml/PreviewDeck.qml new file mode 100644 index 000000000000..d7e22d7cd8cd --- /dev/null +++ b/res/qml/PreviewDeck.qml @@ -0,0 +1,42 @@ +import "." as Skin +import Mixxx 1.0 as Mixxx +import Qt.labs.qmlmodels +import QtQml +import QtQuick +import QtQml.Models +import QtQuick.Layouts +import QtQuick.Controls 2.15 +import QtQuick.Shapes 1.6 +import "Theme" + +Rectangle { + id: root + + color: 'transparent' + + Shape { + anchors.fill: parent + ShapePath { + strokeColor: Theme.midGray + strokeWidth: 1 + fillColor: "transparent" + capStyle: ShapePath.RoundCap + + startX: 0 + startY: 0 + PathLine { x: width; y: 0 } + PathLine { x: width; y: height } + PathLine { x: 0; y: height } + PathLine { x: 0; y: 0 } + PathLine { x: width; y: height } + PathLine { x: 0; y: height } + PathLine { x: width; y: 0 } + } + } + + Text { + anchors.centerIn: parent + color: 'white' + text: "PreviewDeck placeholder" + } +} diff --git a/res/qml/Sampler.qml b/res/qml/Sampler.qml index df39c786ed06..936d683990c7 100644 --- a/res/qml/Sampler.qml +++ b/res/qml/Sampler.qml @@ -9,13 +9,14 @@ Rectangle { required property string group property bool minimized: false property var deckPlayer: Mixxx.PlayerManager.getPlayer(group) + property var currentTrack: deckPlayer.currentTrack color: { - const trackColor = root.deckPlayer.color; + const trackColor = root.currentTrack.color; if (!trackColor.valid) return Theme.backgroundColor; - return Qt.darker(root.deckPlayer.color, 2); + return Qt.darker(root.currentTrack.color, 2); } implicitHeight: gainKnob.height + 10 Drag.active: dragArea.drag.active @@ -25,7 +26,7 @@ Rectangle { let data = { "mixxx/player": group }; - const trackLocationUrl = deckPlayer.trackLocationUrl; + const trackLocationUrl = root.currentTrack.trackLocationUrl; if (trackLocationUrl) data["text/uri-list"] = trackLocationUrl; @@ -83,7 +84,7 @@ Rectangle { Text { id: label - text: root.deckPlayer.title + text: root.currentTrack.title anchors.top: embedded.top anchors.left: playButton.right anchors.right: embedded.right diff --git a/res/qml/Theme/Theme.qml b/res/qml/Theme/Theme.qml index 375911fcd0e8..31154df62ce0 100644 --- a/res/qml/Theme/Theme.qml +++ b/res/qml/Theme/Theme.qml @@ -2,20 +2,21 @@ import QtQuick 2.12 pragma Singleton QtObject { + property color accent: "#2D4EA1" property color accentColor: "#3a60be" - property color backgroundColor: "#1e1e20" + property color backgroundColor: "#2E2E2E" property color blue: "#01dcfc" property color bpmSliderBarColor: green property color buttonNormalColor: midGray property color crossfaderBarColor: red property color crossfaderOrientationColor: lightGray property color darkGray: "#0f0f0f" - property color darkGray2: "#2e2e2e" - property color darkGray3: "#3F3F3F" + property color darkGray2: "#242424" + property color darkGray3: "#202020" property color deckActiveColor: green property color deckBackgroundColor: darkGray property color deckLineColor: darkGray2 - property color deckTextColor: lightGray2 + property color deckTextColor: white property color effectColor: yellow property color effectUnitColor: red property color embeddedBackgroundColor: "#a0000000" @@ -26,13 +27,17 @@ QtObject { property color gainKnobColor: blue property color green: "#85c85b" property color knobBackgroundColor: "#262626" - property color lightGray: "#747474" property color lightGray2: "#b0b0b0" + property color lightGray: "#747474" property color midGray: "#696969" + property color panelSplitterBackground: backgroundColor + property color panelSplitterHandleActive: lightGray2 + property color panelSplitterHandle: midGray property color pflActiveButtonColor: blue property color red: "#ea2a4e" property color samplerColor: blue - property color textColor: lightGray2 + property color sunkenBackgroundColor: "#0C0C0C" + property color textColor: white property color toolbarActiveColor: white property color toolbarBackgroundColor: darkGray2 property color volumeSliderBarColor: blue diff --git a/res/qml/images/library_computer.png b/res/qml/images/library_computer.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fd2fd4d368df4b6e91cab96dc915d95e1fcb2b GIT binary patch literal 2442 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 IM6N<$f)Mg)i2wiq literal 0 HcmV?d00001 diff --git a/res/qml/images/library_crates.png b/res/qml/images/library_crates.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6874104abe046cacc28d00bf3654fda59eff86 GIT binary patch literal 1651 zcmV-(28{WMP)EX>4Tx04R}tkv&MmP!xqvQ$>+V5j%)DWT*~e7Zq`=RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`yWphgA|>9J6k5c1;qgAsyXWxUeSpxYFwN?U1DbA| z>10C8=2pd?R|GMD0KyoTnPtpLQVPEHbx)mCcQKyj-}h(rt9gq70g*V)4AUmwAfDN@ z4bJ<-5mu5_;&b8&lP*a7$aTfzH_kz@3Dp}fAb%yn8LNMaF7kRU=q4P{hdBSyPUiiI?tCw%<_Qpd2CnqBzuEw1KS{5* zwdfHL-UcqN+nTZmTrh~5jw_=I#mDw02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00c`(L_t(&-tC!NY!p=($A4#Lc4ygbX-f;`Qfm`T2{w}8 z4I*en9;%|zq-o288k$HViNS~Rf{G#Wfj*FGO?>dh8j%NzV7VDE#Da;+ML~sNND$lF z2D+8fZTC8}XO0hTMazP{?RIMR|1_DIGc&*WzVkodHv?H^mDSxOM(^0r+~(VNt#`Rs zFhAu8O(~yYT<@;0I^|lBIXheKk43DuSW?dWuYq2Ve%kLZsO{gfuEPx=+Q`Q9huVtz z24Y9X0s&yzaz!NE_jz^8ceC68VvKBjd9G&_iZV?InqI4!qs=z#FcKh)l!^0E+VbcZC3Wa#S1Xs(9t_dh8xjLDzF*(|S(}u}=u|$SN7wpoQ#P@+u03raxqg#3YghBm zt~P?9=v<_%N#W>|k}VZlLSOIQxo>5BOI1f&KmdyK1HAk48qQz6PEUUXrPP!`NJnwv zLOX*|Yrcxb8-c2{fdI_Q4^a8w;D)X%JbV@b6=|95nbOK7izr`INaaI|Wm@J) zA}L8&$&A3fRl6D~9sR)8mbsKi2C1uyPa32*6y<}1XZZDxUZkTk8Jr~;1i7lgwoi_t zt4(abS7q>S}#L5xLxTgJ6FYG(p~TE6{Sxj3d~= z5aHuLffA2Uv2HDU_kJ~QkiNm#5Pjinj0FYL5(_iePxSO;l*^*Og=4nr@-Tqq; z0417Wo6p0^9Fxa%ZDxQ3grG!A-7(&y33dm(yg$oBi4g7v@r~h}7d$%0b4=<@V^U4B zD_qMI@VaSmG+>fH!RWZke#>=1jYpgLAOK7C{|U%%jx+N?x*SETHG@Htz#dz&E@II& z!S7;eUD@Rr&N(j?JK{EHr8B8}r4^)KDSDKmIEAH#lwx~4$pL$6N|m&y*5;^9_#f$# z1U|MTkB2Q(bFFpdJ)UYrU#-UNch`J z!(kD-*!IfrBgg)=QWZ2ED!tj)cM^v(fZ~E2a(!MpdqY^mZ$X$IjKbUu=MuwhMztg;%n{sQ5!l~}8jm*fBd002ovPDHLkV1h@n1}Fdk literal 0 HcmV?d00001 diff --git a/res/qml/images/library_playlist.png b/res/qml/images/library_playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f88e1ce98cbca2991b58f3d6115431b4360c58 GIT binary patch literal 1610 zcmV-Q2DSN#P)EX>4Tx04R}tkv&MmP!xqvQ$>+V5j%)DWT*~e7Zq`=RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`yWphgA|>9J6k5c1;qgAsyXWxUeSpxYFwN?U1DbA| z>10C8=2pd?R|GMD0KyoTnPtpLQVPEHbx)mCcQKyj-}h(rt9gq70g*V)4AUmwAfDN@ z4bJ<-5mu5_;&b8&lP*a7$aTfzH_kz@3Dp}fAb%yn8LNMaF7kRU=q4P{hdBSyPUiiI?tCw%<_Qpd2CnqBzuEw1KS{5* zwdfHL-UcqN+nTZmTrh~5gz)E-h==E02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00bgQL_t(&-tC!RY*SSn$G`X7+k1Q4u77}b8)XC5xxp9< zWKl7o#t_61V~j6K6vLkf9()iDI;X}*jW5W9FPiAcOicU}AM^VKKFNi|IP(0S+ZnlIf<)iR^JC62=+tZ zHMgOwQArwf?jyW=c;;@W3KiW@l#c=IAQ&DV^$c@V6u(-PxQluwrm0K%O+b{!wLAawwENuRTGny2pj zhDS)hv)jlkpsWQd*H|ZvG1&MwEN2(r`)VW2WOr#ATLDe0`$A>AGfk;>dj73ve!U}* z#=(<;WF$F2^YeSm_~dy(_(W=I>B}8{D0W*PnTkxFqItU6tXoK>bl+_3?@j>sFK&_7 z2ls<#1BD+62gxa$0$?taD~&-8@xXll-VS0I?4pV?AH|B8h zi|-3ST8=&f;6&Lx!Wi-0y7mSArhxze$!Ui#=r5L*K&t`OZ~etUIsMh|U26PF1hLCu z*xgR7-n1T)>!#l+nH&-$QDi1k2z0a{*xgon6;lh4Yv+E4a$^=4OCUBJE<0vsJgEzW z)W%U~m#%~yc71haz4tm11o+#U(e^<1@&XBM?}4XrMIjQ|WC?;~(_iV=8bp*Oc!R5q zx2)k|k!nyfIWVf$w)ZmZ)L=A@$WMP_CYAuDH>+iDqYup+)-Mwf#xQ*P0%F6Fg>dl{ zrsJvF1P#4^Fmm>{vJf?I>-9{Yx*kRNm%j?1y)HW*zqb>eYgS=0ox^8mhA^JWnjd8R zaxqK$Jx;u{e-~D-EFK5%+!8|nz_++GI$`duHF3Szr0wp#rvw531fF2u&MoHm5seiO zySiHaWyf^221Dnnd5nC(GYR60vSak9iYf*JIn@@ZA2rk6;t9^~nceui_biZV<^OW7~7Pv36_6 zf`#&gAh50(_dWY48miyPBQ*P-CQ5qpI5+03-#T{Kz|nx9QQR&%lx;OaD*(1F9fJvR>P1+5i9m07*qo IM6N<$g5DGBfB*mh literal 0 HcmV?d00001 diff --git a/src/library/browse/browsetablemodel.cpp b/src/library/browse/browsetablemodel.cpp index dfd259448205..06b98574e78d 100644 --- a/src/library/browse/browsetablemodel.cpp +++ b/src/library/browse/browsetablemodel.cpp @@ -219,7 +219,9 @@ TrackPointer BrowseTableModel::getTrack(const QModelIndex& index) const { } TrackPointer BrowseTableModel::getTrackByRef(const TrackRef& trackRef) const { - if (m_pRecordingManager->getRecordingLocation() == trackRef.getLocation()) { + if (m_pRecordingManager && + m_pRecordingManager->getRecordingLocation() == + trackRef.getLocation()) { QMessageBox::critical(nullptr, tr("Mixxx Library"), tr("Could not load the following file because it is in use by " diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h index 742bb0c28417..f5a36d2c50ae 100644 --- a/src/library/sidebarmodel.h +++ b/src/library/sidebarmodel.h @@ -86,11 +86,13 @@ class SidebarModel : public QAbstractItemModel { private slots: void slotPressedUntilClickedTimeout(); + protected: + QList m_sFeatures; + private: QModelIndex translateSourceIndex(const QModelIndex& parent); QModelIndex translateIndex(const QModelIndex& index, const QAbstractItemModel* model); void featureRenamed(LibraryFeature*); - QList m_sFeatures; unsigned int m_iDefaultSelectedIndex; /** Index of the item in the sidebar model to select at startup. */ QTimer* const m_pressedUntilClickedTimer; diff --git a/src/library/treeitemmodel.h b/src/library/treeitemmodel.h index 3972e3889cf4..142d635e2822 100644 --- a/src/library/treeitemmodel.h +++ b/src/library/treeitemmodel.h @@ -13,7 +13,7 @@ class TreeItemModel : public QAbstractItemModel { static const int kDataRole = Qt::UserRole; static const int kBoldRole = Qt::UserRole + 1; - explicit TreeItemModel(QObject *parent = 0); + explicit TreeItemModel(QObject* parent = nullptr); ~TreeItemModel() override; QVariant data(const QModelIndex &index, int role) const override; diff --git a/src/main.cpp b/src/main.cpp index 3f4c0b1f6d6a..f7741c98882f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,6 +62,11 @@ int runMixxx(MixxxApplication* pApp, const CmdlineArgs& args) { int exitCode; #ifdef MIXXX_USE_QML if (args.isQml()) { + // This is a workaround to support Qt 6.4.2, currently shipped on + // Ubuntu 24.04 See + // https://github.com/mixxxdj/mixxx/pull/14514#issuecomment-2770811094 + // for further details + qputenv("QT_QUICK_TABLEVIEW_COMPAT_VERSION", "6.4"); mixxx::qml::QmlApplication qmlApplication(pApp, args); exitCode = pApp->exec(); } else diff --git a/src/qml/qmlconfigproxy.h b/src/qml/qmlconfigproxy.h index d5a03bc7040e..3b2e534fb34d 100644 --- a/src/qml/qmlconfigproxy.h +++ b/src/qml/qmlconfigproxy.h @@ -34,6 +34,10 @@ class QmlConfigProxy : public QObject { s_pUserSettings = std::move(pConfig); } + static UserSettingsPointer get() { + return s_pUserSettings; + } + private: static inline UserSettingsPointer s_pUserSettings = nullptr; diff --git a/src/qml/qmllibraryproxy.cpp b/src/qml/qmllibraryproxy.cpp index fec3d21120c4..5856438354ed 100644 --- a/src/qml/qmllibraryproxy.cpp +++ b/src/qml/qmllibraryproxy.cpp @@ -1,17 +1,35 @@ #include "qml/qmllibraryproxy.h" #include +#include #include "library/library.h" +#include "library/librarytablemodel.h" #include "moc_qmllibraryproxy.cpp" +#include "qml/qmllibraryproxy.h" +#include "qml/qmllibrarytracklistmodel.h" +#include "qmltrackproxy.h" +#include "track/track.h" +#include "util/assert.h" namespace mixxx { namespace qml { -QmlLibraryProxy::QmlLibraryProxy(std::shared_ptr pLibrary, QObject* parent) - : QObject(parent), - m_pLibrary(pLibrary), - m_pModelProperty(new QmlLibraryTrackListModel(m_pLibrary->trackTableModel(), this)) { +QmlLibraryProxy::QmlLibraryProxy(QObject* parent) + : QObject(parent) { +} + +QmlLibraryTrackListModel* QmlLibraryProxy::model() const { + return make_qml_owned( + QList{}, s_pLibrary->trackTableModel()) + .get(); +} + +void QmlLibraryProxy::analyze(const QmlTrackProxy* track) const { + VERIFY_OR_DEBUG_ASSERT(track && track->internal()) { + return; + } + emit s_pLibrary->analyzeTracks({track->internal()->getId()}); } // static @@ -26,7 +44,7 @@ QmlLibraryProxy* QmlLibraryProxy::create(QQmlEngine* pQmlEngine, QJSEngine* pJsE qWarning() << "Library hasn't been registered yet"; return nullptr; } - return new QmlLibraryProxy(s_pLibrary, pQmlEngine); + return new QmlLibraryProxy(pQmlEngine); } } // namespace qml diff --git a/src/qml/qmllibraryproxy.h b/src/qml/qmllibraryproxy.h index 3b5d80967b9b..07f46106ac4d 100644 --- a/src/qml/qmllibraryproxy.h +++ b/src/qml/qmllibraryproxy.h @@ -1,39 +1,42 @@ #pragma once #include #include +#include #include -#include "qml/qmllibrarytracklistmodel.h" -#include "util/parented_ptr.h" +#include "qml_owned_ptr.h" +#include "qmllibrarytracklistmodel.h" class Library; namespace mixxx { namespace qml { -class QmlLibraryTrackListModel; +class QmlTrackProxy; class QmlLibraryProxy : public QObject { Q_OBJECT - Q_PROPERTY(mixxx::qml::QmlLibraryTrackListModel* model MEMBER m_pModelProperty CONSTANT) + Q_PROPERTY(mixxx::qml::QmlLibraryTrackListModel* model READ model CONSTANT) QML_NAMED_ELEMENT(Library) QML_SINGLETON public: - explicit QmlLibraryProxy(std::shared_ptr pLibrary, QObject* parent = nullptr); + explicit QmlLibraryProxy(QObject* parent = nullptr); static QmlLibraryProxy* create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine); static void registerLibrary(std::shared_ptr pLibrary) { s_pLibrary = std::move(pLibrary); } - private: - static inline std::shared_ptr s_pLibrary; + static Library* get() { + return s_pLibrary.get(); + } - std::shared_ptr m_pLibrary; + QmlLibraryTrackListModel* model() const; + Q_INVOKABLE void analyze(const mixxx::qml::QmlTrackProxy* track) const; - /// This needs to be a plain pointer because it's used as a `Q_PROPERTY` member variable. - QmlLibraryTrackListModel* m_pModelProperty; + private: + static inline std::shared_ptr s_pLibrary; }; } // namespace qml diff --git a/src/qml/qmllibrarysource.cpp b/src/qml/qmllibrarysource.cpp new file mode 100644 index 000000000000..cc11d6f16606 --- /dev/null +++ b/src/qml/qmllibrarysource.cpp @@ -0,0 +1,61 @@ +#include "qml/qmllibrarysource.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include "library/browse/browsefeature.h" +#include "library/library.h" +#include "library/librarytablemodel.h" +#include "library/trackcollection.h" +#include "library/trackcollectionmanager.h" +#include "library/trackset/crate/cratefeature.h" +#include "library/trackset/crate/cratesummary.h" +#include "library/trackset/playlistfeature.h" +#include "library/treeitemmodel.h" +#include "moc_qmllibrarysource.cpp" +#include "qmllibraryproxy.h" +#include "track/track.h" + +AllTrackLibraryFeature::AllTrackLibraryFeature(Library* pLibrary, UserSettingsPointer pConfig) + : LibraryFeature(pLibrary, pConfig, QStringLiteral("")), + m_pSidebarModel(make_parented(this)), + m_pLibraryTableModel(pLibrary->trackTableModel()) { + m_pSidebarModel->setRootItem(TreeItem::newRoot(this)); +} + +void AllTrackLibraryFeature::activate() { + emit showTrackModel(m_pLibraryTableModel); +} + +namespace mixxx { +namespace qml { + +QmlLibrarySource::QmlLibrarySource( + QObject* parent, const QList& columns) + : QObject(parent), + m_columns(columns) { +} + +void QmlLibrarySource::slotShowTrackModel(QAbstractItemModel* pModel) { + emit requestTrackModel(std::make_shared(columns(), pModel)); +} + +QmlLibraryAllTrackSource::QmlLibraryAllTrackSource( + QObject* parent, const QList& columns) + : QmlLibrarySource(parent, columns), + m_pLibraryFeature(std::make_unique( + QmlLibraryProxy::get(), QmlConfigProxy::get())) { + connect(m_pLibraryFeature.get(), + &LibraryFeature::showTrackModel, + this, + &QmlLibrarySource::slotShowTrackModel); +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmllibrarysource.h b/src/qml/qmllibrarysource.h new file mode 100644 index 000000000000..88e4d675d96a --- /dev/null +++ b/src/qml/qmllibrarysource.h @@ -0,0 +1,116 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "library/browse/browsefeature.h" +#include "library/libraryfeature.h" +#include "library/sidebarmodel.h" +#include "library/trackset/crate/cratefeature.h" +#include "library/trackset/playlistfeature.h" +#include "library/treeitem.h" +#include "qmlconfigproxy.h" +#include "qmllibrarytracklistmodel.h" +#include "util/parented_ptr.h" + +class LibraryTableModel; +class TreeItemModel; +class AllTrackLibraryFeature final : public LibraryFeature { + Q_OBJECT + public: + AllTrackLibraryFeature(Library* pLibrary, + UserSettingsPointer pConfig); + ~AllTrackLibraryFeature() override = default; + + QVariant title() override { + return tr("All..."); + } + TreeItemModel* sidebarModel() const override { + return m_pSidebarModel; + } + + bool hasTrackTable() override { + return true; + } + + LibraryTableModel* trackTableModel() const { + return m_pLibraryTableModel; + } + + void searchAndActivate(const QString& query); + + public slots: + void activate() override; + + private: + LibraryTableModel* m_pLibraryTableModel; + + parented_ptr m_pSidebarModel; +}; + +namespace mixxx { +namespace qml { + +class QmlLibraryTrackListColumn; + +class QmlLibrarySource : public QObject { + Q_OBJECT + Q_PROPERTY(QString label MEMBER m_label) + Q_PROPERTY(QString icon MEMBER m_icon) + Q_PROPERTY(QQmlListProperty columns READ columnsQml) + Q_CLASSINFO("DefaultProperty", "columns") + QML_NAMED_ELEMENT(LibrarySource) + QML_UNCREATABLE("Only accessible via its specialization") + public: + explicit QmlLibrarySource(QObject* parent = nullptr, + const QList& columns = {}); + + QQmlListProperty columnsQml() { + return {this, &m_columns}; + } + + const QList& columns() const { + return m_columns; + } + virtual LibraryFeature* internal() = 0; + public slots: + void slotShowTrackModel(QAbstractItemModel* pModel); + + signals: +#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0) + void requestTrackModel(std::shared_ptr pModel); +#else + void requestTrackModel(std::shared_ptr pModel); +#endif + + protected: + QString m_label; + QString m_icon; + QList m_columns; +}; + +class QmlLibraryAllTrackSource : public QmlLibrarySource { + Q_OBJECT + QML_NAMED_ELEMENT(LibraryAllTrackSource) + public: + explicit QmlLibraryAllTrackSource(QObject* parent = nullptr, + const QList& columns = {}); + + LibraryFeature* internal() override { + return m_pLibraryFeature.get(); + } + + private: + std::unique_ptr m_pLibraryFeature; +}; + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmllibrarysourcetree.cpp b/src/qml/qmllibrarysourcetree.cpp new file mode 100644 index 000000000000..2854c2b5063d --- /dev/null +++ b/src/qml/qmllibrarysourcetree.cpp @@ -0,0 +1,80 @@ +#include "qml/qmllibrarysourcetree.h" + +#include +#include + +#include +#include + +#include "library/library.h" +#include "library/librarytablemodel.h" +#include "moc_qmllibrarysourcetree.cpp" +#include "qml_owned_ptr.h" +#include "qmllibraryproxy.h" +#include "qmllibrarytracklistmodel.h" +#include "qmlsidebarmodelproxy.h" + +namespace mixxx { +namespace qml { + +QmlLibrarySourceTree::QmlLibrarySourceTree(QQuickItem* parent) + : QQuickItem(parent), + m_model(new QmlSidebarModelProxy(this)) { +} +QmlLibrarySourceTree::~QmlLibrarySourceTree() = default; + +Q_INVOKABLE QmlLibraryTrackListModel* QmlLibrarySourceTree::allTracks() const { + return make_qml_owned( + m_defaultColumns, QmlLibraryProxy::get()->trackTableModel()); +}; + +void QmlLibrarySourceTree::append_source( + QQmlListProperty* list, QmlLibrarySource* source) { + reinterpret_cast*>(list->data)->append(source); + QmlLibrarySourceTree* librarySourceTree = qobject_cast(list->object); + if (librarySourceTree && librarySourceTree->isComponentComplete()) { + librarySourceTree->m_model->update(librarySourceTree->m_sources); + } +} + +void QmlLibrarySourceTree::clear_source(QQmlListProperty* p) { + reinterpret_cast*>(p->data)->clear(); + QmlLibrarySourceTree* librarySourceTree = qobject_cast(p->object); + if (librarySourceTree) { + librarySourceTree->m_model->update(librarySourceTree->m_sources); + } +} +void QmlLibrarySourceTree::replace_source(QQmlListProperty* p, + qsizetype idx, + QmlLibrarySource* v) { + return reinterpret_cast*>(p->data)->replace(idx, v); + QmlLibrarySourceTree* librarySourceTree = qobject_cast(p->object); + if (librarySourceTree && librarySourceTree->isComponentComplete()) { + librarySourceTree->m_model->update(librarySourceTree->m_sources); + } +} +void QmlLibrarySourceTree::removeLast_source(QQmlListProperty* p) { + return reinterpret_cast*>(p->data)->removeLast(); + QmlLibrarySourceTree* librarySourceTree = qobject_cast(p->object); + if (librarySourceTree && librarySourceTree->isComponentComplete()) { + librarySourceTree->m_model->update(librarySourceTree->m_sources); + } +} + +QQmlListProperty QmlLibrarySourceTree::sources() { + return QQmlListProperty(this, + &m_sources, + &QmlLibrarySourceTree::append_source, + &QmlLibrarySourceTree::count_source, + &QmlLibrarySourceTree::at_source, + &QmlLibrarySourceTree::clear_source, + &QmlLibrarySourceTree::replace_source, + &QmlLibrarySourceTree::removeLast_source); +} + +void QmlLibrarySourceTree::componentComplete() { + m_model->update(m_sources); +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmllibrarysourcetree.h b/src/qml/qmllibrarysourcetree.h new file mode 100644 index 000000000000..907f890f2aa5 --- /dev/null +++ b/src/qml/qmllibrarysourcetree.h @@ -0,0 +1,65 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "qmllibrarysource.h" +#include "qmllibrarytracklistcolumn.h" +#include "qmlsidebarmodelproxy.h" +#include "util/parented_ptr.h" + +namespace mixxx { +namespace qml { + +class QmlLibrarySourceTree : public QQuickItem { + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(QQmlListProperty sources READ sources) + Q_PROPERTY(QQmlListProperty defaultColumns READ + defaultColumns CONSTANT) + Q_CLASSINFO("DefaultProperty", "sources") + QML_NAMED_ELEMENT(LibrarySourceTree) + + public: + Q_DISABLE_COPY_MOVE(QmlLibrarySourceTree) + explicit QmlLibrarySourceTree(QQuickItem* parent = nullptr); + ~QmlLibrarySourceTree() override; + + void componentComplete() override; + + QQmlListProperty defaultColumns() { + return {this, &m_defaultColumns}; + } + + QQmlListProperty sources(); + Q_INVOKABLE mixxx::qml::QmlSidebarModelProxy* sidebar() const { + return m_model.get(); + }; + Q_INVOKABLE mixxx::qml::QmlLibraryTrackListModel* allTracks() const; + + private: + static void append_source(QQmlListProperty* list, QmlLibrarySource* slice); + static qsizetype count_source(QQmlListProperty* p) { + return reinterpret_cast*>(p->data)->size(); + } + static QmlLibrarySource* at_source(QQmlListProperty* p, qsizetype idx) { + return reinterpret_cast*>(p->data)->at(idx); + } + static void clear_source(QQmlListProperty* p); + static void replace_source(QQmlListProperty* p, + qsizetype idx, + QmlLibrarySource* v); + static void removeLast_source(QQmlListProperty* p); + + QList m_sources; + parented_ptr m_model; + QList m_defaultColumns; +}; + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmllibrarytracklistcolumn.cpp b/src/qml/qmllibrarytracklistcolumn.cpp new file mode 100644 index 000000000000..5e64555c6f7d --- /dev/null +++ b/src/qml/qmllibrarytracklistcolumn.cpp @@ -0,0 +1,25 @@ +#include "qml/qmllibrarytracklistcolumn.h" + +#include "moc_qmllibrarytracklistcolumn.cpp" + +namespace mixxx { +namespace qml { + +QmlLibraryTrackListColumn::QmlLibraryTrackListColumn(QObject* parent, + const QString& label, + int fillSpan, + int columnIdx, + double preferredWidth, + QQmlComponent* pDelegate, + Role role) + : QObject(parent), + m_label(label), + m_role(role), + m_fillSpan(fillSpan), + m_columnIdx(columnIdx), + m_preferredWidth(preferredWidth), + m_pDelegate(pDelegate) { +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmllibrarytracklistcolumn.h b/src/qml/qmllibrarytracklistcolumn.h new file mode 100644 index 000000000000..3d55002ba9a6 --- /dev/null +++ b/src/qml/qmllibrarytracklistcolumn.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "library/columncache.h" +#include "qml/qml_owned_ptr.h" + +namespace mixxx { +namespace qml { + +class QmlLibraryTrackListColumn : public QObject { + Q_OBJECT + Q_PROPERTY(QString label MEMBER m_label FINAL) + Q_PROPERTY(int fillSpan MEMBER m_fillSpan FINAL) + Q_PROPERTY(int columnIdx MEMBER m_columnIdx FINAL) + Q_PROPERTY(double preferredWidth MEMBER m_preferredWidth FINAL) + Q_PROPERTY(QQmlComponent* delegate READ delegate WRITE setDelegate FINAL) + Q_PROPERTY(Role role MEMBER m_role FINAL) + QML_NAMED_ELEMENT(TrackListColumn) + public: + enum class SQLColumns { + Album = ColumnCache::COLUMN_LIBRARYTABLE_ALBUM, + Artist = ColumnCache::COLUMN_LIBRARYTABLE_ARTIST, + Title = ColumnCache::COLUMN_LIBRARYTABLE_TITLE, + Year = ColumnCache::COLUMN_LIBRARYTABLE_YEAR, + Bpm = ColumnCache::COLUMN_LIBRARYTABLE_BPM, + Key = ColumnCache::COLUMN_LIBRARYTABLE_KEY, + FileType = ColumnCache::COLUMN_LIBRARYTABLE_FILETYPE, + Bitrate = ColumnCache::COLUMN_LIBRARYTABLE_BITRATE, + }; + Q_ENUM(SQLColumns) + enum class Role { + Location, + Artist, + Title, + Cover, + }; + Q_ENUM(Role) + explicit QmlLibraryTrackListColumn(QObject* parent = nullptr) + : QObject(parent) { + } + explicit QmlLibraryTrackListColumn(QObject* parent, + const QString& label, + int fillSpan, + int columnIdx, + double preferredWidth, + QQmlComponent* delegate, + Role role); + const QString& label() const { + return m_label; + } + Role role() const { + return m_role; + } + int fillSpan() const { + return m_fillSpan; + } + int columnIdx() const { + return m_columnIdx; + } + double preferredWidth() const { + return m_preferredWidth; + } + QQmlComponent* delegate() const { + return m_pDelegate; + } + void setDelegate(QQmlComponent* delegate) { + m_pDelegate = qml_owned_ptr(delegate); + } + + private: + QString m_label; + Role m_role; + int m_fillSpan{0}; + int m_columnIdx{-1}; + double m_preferredWidth{-1}; + qml_owned_ptr m_pDelegate; +}; +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmllibrarytracklistmodel.cpp b/src/qml/qmllibrarytracklistmodel.cpp index 1d8d77c27b16..2c14a5ccffc9 100644 --- a/src/qml/qmllibrarytracklistmodel.cpp +++ b/src/qml/qmllibrarytracklistmodel.cpp @@ -1,23 +1,68 @@ #include "qml/qmllibrarytracklistmodel.h" -#include "library/librarytablemodel.h" +#include + +#include +#include +#include +#include +#include + +#include "library/basetracktablemodel.h" +#include "library/columncache.h" #include "moc_qmllibrarytracklistmodel.cpp" +#include "qml/asyncimageprovider.h" +#include "qml/qmllibrarytracklistcolumn.h" +#include "qml_owned_ptr.h" +#include "qmltrackproxy.h" +#include "track/track.h" +#include "util/assert.h" +#include "util/parented_ptr.h" namespace mixxx { namespace qml { namespace { const QHash kRoleNames = { - {QmlLibraryTrackListModel::TitleRole, "title"}, - {QmlLibraryTrackListModel::ArtistRole, "artist"}, - {QmlLibraryTrackListModel::AlbumRole, "album"}, - {QmlLibraryTrackListModel::AlbumArtistRole, "albumArtist"}, - {QmlLibraryTrackListModel::FileUrlRole, "fileUrl"}, + {Qt::DisplayRole, "display"}, + {Qt::DecorationRole, "decoration"}, + {QmlLibraryTrackListModel::Delegate, "delegate"}, + {QmlLibraryTrackListModel::Track, "track"}, + {QmlLibraryTrackListModel::FileURL, "file_url"}, + {QmlLibraryTrackListModel::CoverArt, "cover_art"}, }; + +QColor colorFromRgbCode(double colorValue) { + if (colorValue < 0 || colorValue > 0xFFFFFF) { + return {}; + } + + QRgb rgbValue = static_cast(colorValue) | 0xFF000000; + return QColor(rgbValue); } +} // namespace -QmlLibraryTrackListModel::QmlLibraryTrackListModel(LibraryTableModel* pModel, QObject* pParent) - : QIdentityProxyModel(pParent) { - pModel->select(); +QmlLibraryTrackListModel::QmlLibraryTrackListModel( + const QList& librarySource, + QAbstractItemModel* pModel, + QObject* pParent) + : QIdentityProxyModel(pParent), + m_columns() { + m_columns.reserve(librarySource.size()); + for (const auto* pColumn : std::as_const(librarySource)) { + m_columns.emplace_back(make_parented(this, + pColumn->label(), + pColumn->fillSpan(), + pColumn->columnIdx(), + pColumn->preferredWidth(), + pColumn->delegate(), + pColumn->role())); + } + + auto* pTrackModel = dynamic_cast(pModel); + VERIFY_OR_DEBUG_ASSERT(pTrackModel) { + return; + } + pTrackModel->select(); setSourceModel(pModel); } @@ -29,72 +74,148 @@ QVariant QmlLibraryTrackListModel::data(const QModelIndex& proxyIndex, int role) VERIFY_OR_DEBUG_ASSERT(checkIndex(proxyIndex)) { return {}; } - - const auto pSourceModel = static_cast(sourceModel()); - VERIFY_OR_DEBUG_ASSERT(pSourceModel) { + auto columnIdx = proxyIndex.column(); + VERIFY_OR_DEBUG_ASSERT(columnIdx >= 0 || columnIdx < m_columns.size()) { return {}; } - if (proxyIndex.column() > 0) { - return {}; - } + auto* const pTrackTableModel = qobject_cast(sourceModel()); + auto* const pTrackModel = dynamic_cast(sourceModel()); + + const auto& pColumn = m_columns[columnIdx]; - int column = -1; switch (role) { - case TitleRole: - column = pSourceModel->fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_TITLE); - break; - case ArtistRole: - column = pSourceModel->fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_ARTIST); - break; - case AlbumRole: - column = pSourceModel->fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_ALBUM); - break; - case AlbumArtistRole: - column = pSourceModel->fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_ALBUMARTIST); - break; - case FileUrlRole: { - column = pSourceModel->fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_LOCATION); - const QString location = QIdentityProxyModel::data( - proxyIndex.siblingAtColumn(column), Qt::DisplayRole) - .toString(); + case Track: { + if (pTrackModel == nullptr) { + return {}; + } + auto pTrack = make_qml_owned(pTrackModel->getTrack( + QIdentityProxyModel::mapToSource(proxyIndex))); + return QVariant::fromValue(pTrack.get()); + } + case Qt::DecorationRole: { + if (pTrackTableModel == nullptr) { + return {}; + }; + return colorFromRgbCode(QIdentityProxyModel::data( + proxyIndex.siblingAtColumn(pTrackTableModel->fieldIndex( + ColumnCache::COLUMN_LIBRARYTABLE_COLOR)), + Qt::DisplayRole) + .toDouble()); + } + case CoverArt: { + QString location; + if (pTrackTableModel != nullptr) { + location = QIdentityProxyModel::data( + proxyIndex.siblingAtColumn(pTrackTableModel->fieldIndex( + ColumnCache::COLUMN_TRACKLOCATIONSTABLE_LOCATION)), + Qt::DisplayRole) + .toString(); + } else if (pTrackModel != nullptr) { + auto pTrack = pTrackModel->getTrack( + QIdentityProxyModel::mapToSource(proxyIndex)); + location = pTrack->getCoverInfo().coverLocation; + } if (location.isEmpty()) { return {}; } - return QUrl::fromLocalFile(location); + + return AsyncImageProvider::trackLocationToCoverArtUrl(location); + } + case FileURL: { + if (pTrackModel == nullptr) { + return {}; + } + return pTrackModel->getTrackUrl(QIdentityProxyModel::mapToSource(proxyIndex)); } - default: + case Delegate: + return QVariant::fromValue(pColumn->delegate()); break; } - - if (column < 0) { - return {}; + if (pColumn->columnIdx() < 0) { + // Use proxyIndex.column() + return QIdentityProxyModel::data(proxyIndex, role); } - - return QIdentityProxyModel::data(proxyIndex.siblingAtColumn(column), Qt::DisplayRole); + return QIdentityProxyModel::data( + proxyIndex.siblingAtColumn(pTrackTableModel != nullptr + ? pTrackTableModel->fieldIndex( + static_cast( + pColumn->columnIdx())) + : pColumn->columnIdx()), + role); } int QmlLibraryTrackListModel::columnCount(const QModelIndex& parent) const { - // This is a list model, i.e. no entries have a parent. - VERIFY_OR_DEBUG_ASSERT(!parent.isValid()) { + VERIFY_OR_DEBUG_ASSERT(static_cast( + parent.internalPointer()) != this) { return 0; } + return m_columns.size(); +} - // There is exactly one column. All data is exposed as roles. - return 1; +QVariant QmlLibraryTrackListModel::headerData( + int section, Qt::Orientation orientation, int role) const { + VERIFY_OR_DEBUG_ASSERT(section >= 0 || section < m_columns.size()) { + return {}; + } + // TODO role + return m_columns[section]->label(); } QHash QmlLibraryTrackListModel::roleNames() const { return kRoleNames; } -QVariant QmlLibraryTrackListModel::get(int row) const { - QModelIndex idx = index(row, 0); - QVariantMap dataMap; - for (auto it = kRoleNames.constBegin(); it != kRoleNames.constEnd(); it++) { - dataMap.insert(it.value(), data(idx, it.key())); +QUrl QmlLibraryTrackListModel::getUrl(int row) const { + auto* const pTrackModel = dynamic_cast(sourceModel()); + + if (pTrackModel == nullptr) { + // TODO search for column with role + return {}; + } + return pTrackModel->getTrackUrl(sourceModel()->index(row, 0)); +} + +QmlTrackProxy* QmlLibraryTrackListModel::getTrack(int row) const { + auto* const pTrackModel = dynamic_cast(sourceModel()); + + if (pTrackModel == nullptr) { + // TODO search for column with role + return {}; + } + return make_qml_owned(pTrackModel->getTrack(sourceModel()->index(row, 0))); +} + +TrackModel::Capabilities QmlLibraryTrackListModel::getCapabilities() const { + auto* const pTrackModel = dynamic_cast(sourceModel()); + + if (pTrackModel != nullptr) { + return pTrackModel->getCapabilities(); + } + return TrackModel::Capability::None; +} +bool QmlLibraryTrackListModel::hasCapabilities(TrackModel::Capabilities caps) const { + return (getCapabilities() & caps) == caps; +} +void QmlLibraryTrackListModel::sort(int column, Qt::SortOrder order) { + VERIFY_OR_DEBUG_ASSERT(column >= 0 || column < m_columns.size()) { + return; + } + const auto& pColumn = m_columns[column]; + emit layoutAboutToBeChanged(QList(), + QAbstractItemModel::VerticalSortHint); + if (pColumn->columnIdx() < 0) { + // Use proxyIndex.column() + return sourceModel()->sort(column, order); } - return dataMap; + auto* const pTrackTableModel = qobject_cast(sourceModel()); + sourceModel()->sort(pTrackTableModel != nullptr + ? pTrackTableModel->fieldIndex( + static_cast( + pColumn->columnIdx())) + : pColumn->columnIdx(), + order); + emit layoutChanged(QList(), QAbstractItemModel::VerticalSortHint); } } // namespace qml diff --git a/src/qml/qmllibrarytracklistmodel.h b/src/qml/qmllibrarytracklistmodel.h index 10d8e9d5353f..6ee7203b8ae9 100644 --- a/src/qml/qmllibrarytracklistmodel.h +++ b/src/qml/qmllibrarytracklistmodel.h @@ -2,7 +2,9 @@ #include #include -class LibraryTableModel; +#include "library/trackmodel.h" +#include "qml/qmllibrarytracklistcolumn.h" +#include "qml/qmltrackproxy.h" namespace mixxx { namespace qml { @@ -10,25 +12,97 @@ namespace qml { class QmlLibraryTrackListModel : public QIdentityProxyModel { Q_OBJECT QML_NAMED_ELEMENT(LibraryTrackListModel) - QML_UNCREATABLE("Only accessible via Mixxx.Library.model") + Q_PROPERTY(QQmlListProperty columns READ columns FINAL) + QML_UNCREATABLE("Only accessible via Mixxx.Library") public: enum Roles { - TitleRole = Qt::UserRole, - ArtistRole, - AlbumRole, - AlbumArtistRole, - FileUrlRole, + Track = Qt::UserRole, + FileURL, + CoverArt, + Delegate }; Q_ENUM(Roles); - QmlLibraryTrackListModel(LibraryTableModel* pModel, QObject* pParent = nullptr); + // FIXME Remove the enum duplication with the `Capability` in `trackmodel.h` + enum class Capability { + None = 0u, + Reorder = 1u << 0u, + ReceiveDrops = 1u << 1u, + AddToTrackSet = 1u << 2u, + AddToAutoDJ = 1u << 3u, + Locked = 1u << 4u, + EditMetadata = 1u << 5u, + LoadToDeck = 1u << 6u, + LoadToSampler = 1u << 7u, + LoadToPreviewDeck = 1u << 8u, + Remove = 1u << 9u, + ResetPlayed = 1u << 10u, + Hide = 1u << 11u, + Unhide = 1u << 12u, + Purge = 1u << 13u, + RemovePlaylist = 1u << 14u, + RemoveCrate = 1u << 15u, + RemoveFromDisk = 1u << 16u, + Analyze = 1u << 17u, + Properties = 1u << 18u, + Sorting = 1u << 19u, + }; + Q_ENUM(Capability) + + QmlLibraryTrackListModel(const QList& librarySource, + QAbstractItemModel* pModel, + QObject* pParent = nullptr); ~QmlLibraryTrackListModel() = default; + QQmlListProperty columns() { + return {this, + &m_columns, + parent_qlist_append, + parent_qlist_count, + parent_qlist_at, + parent_qlist_clear}; + } + QVariant data(const QModelIndex& index, int role) const override; int columnCount(const QModelIndex& index = QModelIndex()) const override; + Q_INVOKABLE QUrl getUrl(int row) const; + Q_INVOKABLE mixxx::qml::QmlTrackProxy* getTrack(int row) const; + Q_INVOKABLE TrackModel::Capabilities getCapabilities() const; + Q_INVOKABLE bool hasCapabilities(TrackModel::Capabilities caps) const; QHash roleNames() const override; - Q_INVOKABLE QVariant get(int row) const; + Q_INVOKABLE QVariant headerData(int section, + Qt::Orientation orientation, + int role = Qt::DisplayRole) const override; + Q_INVOKABLE void sort(int column, Qt::SortOrder order) override; + + private: + std::vector> m_columns; + + static void parent_qlist_append( + QQmlListProperty* p, + QmlLibraryTrackListColumn* v) { + reinterpret_cast>*>( + p->data) + ->emplace_back(v); + } + static qsizetype parent_qlist_count(QQmlListProperty* p) { + return reinterpret_cast< + std::vector>*>(p->data) + ->size(); + } + static QmlLibraryTrackListColumn* parent_qlist_at( + QQmlListProperty* p, qsizetype idx) { + return reinterpret_cast< + std::vector>*>(p->data) + ->at(idx) + .get(); + } + static void parent_qlist_clear(QQmlListProperty* p) { + return reinterpret_cast< + std::vector>*>(p->data) + ->clear(); + } }; } // namespace qml diff --git a/src/qml/qmlsidebarmodelproxy.cpp b/src/qml/qmlsidebarmodelproxy.cpp new file mode 100644 index 000000000000..4483a732ccab --- /dev/null +++ b/src/qml/qmlsidebarmodelproxy.cpp @@ -0,0 +1,88 @@ +#include "qml/qmlsidebarmodelproxy.h" + +#include + +#include +#include +#include + +#include "library/treeitem.h" +#include "moc_qmlsidebarmodelproxy.cpp" +#include "qml/qmllibrarysource.h" +#include "util/assert.h" +#include "util/parented_ptr.h" + +namespace mixxx { +namespace qml { + +namespace { +const QHash kRoleNames = { + {Qt::DisplayRole, "label"}, + {QmlSidebarModelProxy::IconRole, "icon"}, +}; +} // namespace + +QHash QmlSidebarModelProxy::roleNames() const { + return kRoleNames; +} + +QVariant QmlSidebarModelProxy::get(int row) const { + QModelIndex idx = index(row, 0); + QVariantMap dataMap; + for (auto it = kRoleNames.constBegin(); it != kRoleNames.constEnd(); it++) { + dataMap.insert(it.value(), data(idx, it.key())); + } + return dataMap; +} + +void QmlSidebarModelProxy::activate(const QModelIndex& index) { + VERIFY_OR_DEBUG_ASSERT(index.isValid()) { + return; + } + if (index.internalPointer() == this) { + VERIFY_OR_DEBUG_ASSERT(index.row() >= 0 && index.row() < m_sFeatures.length()) { + return; + } + m_sFeatures[index.row()]->activate(); + } else { + TreeItem* pTreeItem = static_cast(index.internalPointer()); + VERIFY_OR_DEBUG_ASSERT(pTreeItem != nullptr) { + return; + } + LibraryFeature* pFeature = pTreeItem->feature(); + DEBUG_ASSERT(pFeature); + pFeature->activateChild(index); + pFeature->onLazyChildExpandation(index); + } +} + +QmlSidebarModelProxy::QmlSidebarModelProxy(QObject* parent) + : SidebarModel(parent), + m_tracklist(nullptr) { +} +QmlSidebarModelProxy::~QmlSidebarModelProxy() = default; + +void QmlSidebarModelProxy::update(const QList& sources) { + beginResetModel(); + qDeleteAll(m_sFeatures); + for (const auto& librarySource : sources) { + VERIFY_OR_DEBUG_ASSERT(librarySource) { + continue; + } + connect(librarySource, + &QmlLibrarySource::requestTrackModel, + this, + &QmlSidebarModelProxy::slotShowTrackModel); + auto* pLibrarySource = librarySource->internal(); + addLibraryFeature(pLibrarySource); + } + endResetModel(); +} + +void QmlSidebarModelProxy::slotShowTrackModel(std::shared_ptr pModel) { + m_tracklist = pModel; + emit tracklistChanged(); +} + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmlsidebarmodelproxy.h b/src/qml/qmlsidebarmodelproxy.h new file mode 100644 index 000000000000..8607da4c2562 --- /dev/null +++ b/src/qml/qmlsidebarmodelproxy.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "library/libraryfeature.h" +#include "library/sidebarmodel.h" +#include "qmllibrarytracklistmodel.h" +#include "util/parented_ptr.h" + +namespace mixxx { +namespace qml { + +class QmlLibrarySource; + +class QmlSidebarModelProxy : public SidebarModel { + Q_OBJECT + Q_PROPERTY(QmlLibraryTrackListModel* tracklist READ tracklist NOTIFY tracklistChanged) + QML_ANONYMOUS + public: + enum Roles { + LabelRole = Qt::UserRole, + IconRole, + }; + Q_ENUM(Roles); + Q_DISABLE_COPY_MOVE(QmlSidebarModelProxy) + explicit QmlSidebarModelProxy(QObject* parent = nullptr); + ~QmlSidebarModelProxy() override; + + QmlLibraryTrackListModel* tracklist() const { + return m_tracklist.get(); + } + + void update(const QList& sources); + QHash roleNames() const override; + Q_INVOKABLE QVariant get(int row) const; + Q_INVOKABLE void activate(const QModelIndex& index); + signals: + void tracklistChanged(); + + protected slots: + void slotShowTrackModel(std::shared_ptr pModel); + + private: + std::shared_ptr m_tracklist; +}; + +} // namespace qml +} // namespace mixxx diff --git a/src/qml/qmlwaveformoverview.h b/src/qml/qmlwaveformoverview.h index 1b3ebe745095..431ab48aa034 100644 --- a/src/qml/qmlwaveformoverview.h +++ b/src/qml/qmlwaveformoverview.h @@ -6,7 +6,7 @@ #include #include -#include "qmlplayerproxy.h" +#include "qmltrackproxy.h" #include "waveform/waveform.h" namespace mixxx { From e58c5f72420d727243ca4755617d5b5ad9a90799 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 22 Sep 2025 19:08:27 +0200 Subject: [PATCH 141/163] Playlists: allow to adopt current order (sorted) as playlist order Co-authored-by: Swiftb0y <12380386+Swiftb0y@users.noreply.github.com> --- src/library/dao/playlistdao.cpp | 39 ++++++++++++++++++++++++ src/library/dao/playlistdao.h | 4 +++ src/library/playlisttablemodel.cpp | 19 +++++++++++- src/library/playlisttablemodel.h | 4 ++- src/library/trackset/playlistfeature.cpp | 34 +++++++++++++++++++-- src/library/trackset/playlistfeature.h | 2 ++ 6 files changed, 97 insertions(+), 5 deletions(-) diff --git a/src/library/dao/playlistdao.cpp b/src/library/dao/playlistdao.cpp index 2383e12e03ed..ae557a5dbd01 100644 --- a/src/library/dao/playlistdao.cpp +++ b/src/library/dao/playlistdao.cpp @@ -1116,6 +1116,45 @@ int PlaylistDAO::tracksInPlaylist(const int playlistId) const { return count; } +void PlaylistDAO::orderTracksByCurrPos(const int playlistId, + QList>& newOrder) { + if (newOrder.isEmpty() || + playlistId == kInvalidPlaylistId || + isPlaylistLocked(playlistId) || + newOrder.size() != tracksInPlaylist(playlistId)) { + return; + } + + ScopedTransaction transaction(m_database); + QSqlQuery query(m_database); + query.prepare(QStringLiteral( + "UPDATE PlaylistTracks " + "SET position=:new_pos " + "WHERE position=:old_pos AND " + "track_id=:track_id AND " + "playlist_id=:pl_id")); + int newPos = 1; + for (auto [trackId, oldPos] : newOrder) { + VERIFY_OR_DEBUG_ASSERT(trackId.isValid()) { + return; + } + query.bindValue(":new_pos", newPos++); + query.bindValue(":old_pos", oldPos); + query.bindValue(":track_id", trackId.toVariant()); + query.bindValue(":pl_id", playlistId); + if (!query.exec()) { + // We temporarily have duplicate positions, so abort the entire operation + // to not leave the playlist with an invalid state. + LOG_FAILED_QUERY(query); + return; + } + } + + transaction.commit(); + + emit tracksMoved(QSet{playlistId}); +} + void PlaylistDAO::moveTrack(const int playlistId, const int oldPosition, const int newPosition) { ScopedTransaction transaction(m_database); QSqlQuery query(m_database); diff --git a/src/library/dao/playlistdao.h b/src/library/dao/playlistdao.h index 5a3836c4fe9b..e4e2f368ce91 100644 --- a/src/library/dao/playlistdao.h +++ b/src/library/dao/playlistdao.h @@ -110,6 +110,10 @@ class PlaylistDAO : public QObject, public virtual DAO { bool copyPlaylistTracks(const int sourcePlaylistID, const int targetPlaylistID); // Returns the number of tracks in the given playlist. int tracksInPlaylist(const int playlistId) const; + // This receives a track list that represents the current order (sorted by BPM for example) + // and adopts this order for `position` in the playlist. + // Returns true on success. + void orderTracksByCurrPos(const int playlistId, QList>& newOrder); // moved Track to a new position void moveTrack(const int playlistId, const int oldPosition, const int newPosition); diff --git a/src/library/playlisttablemodel.cpp b/src/library/playlisttablemodel.cpp index fb9e0f0b77b8..c6cc30e4285c 100644 --- a/src/library/playlisttablemodel.cpp +++ b/src/library/playlisttablemodel.cpp @@ -315,7 +315,7 @@ void PlaylistTableModel::shuffleTracks(const QModelIndexList& shuffle, const QMo int numOfTracks = rowCount(); if (shuffle.count() > 1) { // if there is more then one track selected, shuffle selection only - foreach (QModelIndex shuffleIndex, shuffle) { + for (const QModelIndex& shuffleIndex : std::as_const(shuffle)) { int oldPosition = shuffleIndex.sibling(shuffleIndex.row(), positionColumn).data().toInt(); if (oldPosition != excludePos) { positions.append(oldPosition); @@ -339,6 +339,23 @@ void PlaylistTableModel::shuffleTracks(const QModelIndexList& shuffle, const QMo m_pTrackCollectionManager->internalCollection()->getPlaylistDAO().shuffleTracks(m_iPlaylistId, positions, allIds); } +void PlaylistTableModel::orderTracksByCurrPos() { + QList> idPosList; + int numOfTracks = rowCount(); + idPosList.reserve(numOfTracks); + const int positionColumn = fieldIndex(ColumnCache::COLUMN_PLAYLISTTRACKSTABLE_POSITION); + const int idColumn = fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_ID); + // Set up list of all IDs + for (int i = 0; i < numOfTracks; i++) { + TrackId trackId(index(i, idColumn).data()); + int oldPosition = index(i, positionColumn).data().toInt(); + idPosList.append(std::make_pair(trackId, oldPosition)); + } + m_pTrackCollectionManager->internalCollection() + ->getPlaylistDAO() + .orderTracksByCurrPos(m_iPlaylistId, idPosList); +} + const QList PlaylistTableModel::getSelectedPositions(const QModelIndexList& indices) const { if (indices.isEmpty()) { return {}; diff --git a/src/library/playlisttablemodel.h b/src/library/playlisttablemodel.h index cbdc930f6459..d8b98b5fa022 100644 --- a/src/library/playlisttablemodel.h +++ b/src/library/playlisttablemodel.h @@ -21,7 +21,9 @@ class PlaylistTableModel final : public TrackSetTableModel { bool appendTrack(TrackId trackId); void moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex) override; void removeTrack(const QModelIndex& index); - void shuffleTracks(const QModelIndexList& shuffle, const QModelIndex& exclude); + void shuffleTracks(const QModelIndexList& shuffle = QModelIndexList(), + const QModelIndex& exclude = QModelIndex()); + void orderTracksByCurrPos(); bool isColumnInternal(int column) final; bool isColumnHiddenByDefault(int column) final; diff --git a/src/library/trackset/playlistfeature.cpp b/src/library/trackset/playlistfeature.cpp index 17eab0ea2d11..7ddc9b387d3e 100644 --- a/src/library/trackset/playlistfeature.cpp +++ b/src/library/trackset/playlistfeature.cpp @@ -39,6 +39,12 @@ PlaylistFeature::PlaylistFeature(Library* pLibrary, UserSettingsPointer pConfig) this, &PlaylistFeature::slotShufflePlaylist); + m_pOrderByCurrentPosAction = make_parented(tr("Adopt current order"), this); + connect(m_pOrderByCurrentPosAction, + &QAction::triggered, + this, + &PlaylistFeature::slotOrderTracksByCurrentPosition); + m_pUnlockPlaylistsAction = make_parented(tr("Unlock all playlists"), this); connect(m_pUnlockPlaylistsAction, @@ -81,6 +87,8 @@ void PlaylistFeature::onRightClickChild( int playlistId = playlistIdFromIndex(index); bool locked = m_playlistDao.isPlaylistLocked(playlistId); + m_pShufflePlaylistAction->setEnabled(!locked); + m_pOrderByCurrentPosAction->setEnabled(!locked && isChildIndexSelectedInSidebar(index)); m_pDeletePlaylistAction->setEnabled(!locked); m_pRenamePlaylistAction->setEnabled(!locked); @@ -92,6 +100,7 @@ void PlaylistFeature::onRightClickChild( // TODO If playlist is selected and has more than one track selected // show "Shuffle selected tracks", else show "Shuffle playlist"? menu.addAction(m_pShufflePlaylistAction); + menu.addAction(m_pOrderByCurrentPosAction); menu.addSeparator(); menu.addAction(m_pRenamePlaylistAction); menu.addAction(m_pDuplicatePlaylistAction); @@ -228,9 +237,9 @@ void PlaylistFeature::slotShufflePlaylist() { // Shuffle all tracks // If the playlist is loaded/visible shuffle only selected tracks - QModelIndexList selection; if (isChildIndexSelectedInSidebar(m_lastRightClickedIndex) && m_pPlaylistTableModel->getPlaylist() == playlistId) { + QModelIndexList selection; if (m_pLibraryWidget) { WTrackTableView* view = dynamic_cast( m_pLibraryWidget->getActiveView()); @@ -238,7 +247,7 @@ void PlaylistFeature::slotShufflePlaylist() { selection = view->selectionModel()->selectedIndexes(); } } - m_pPlaylistTableModel->shuffleTracks(selection, QModelIndex()); + m_pPlaylistTableModel->shuffleTracks(selection); } else { // Create a temp model so we don't need to select the playlist // in the persistent model in order to shuffle it @@ -253,8 +262,27 @@ void PlaylistFeature::slotShufflePlaylist() { Qt::AscendingOrder); pPlaylistTableModel->select(); - pPlaylistTableModel->shuffleTracks(selection, QModelIndex()); + pPlaylistTableModel->shuffleTracks(); + } +} + +void PlaylistFeature::slotOrderTracksByCurrentPosition() { + int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); + if (playlistId == kInvalidPlaylistId) { + return; + } + + if (m_playlistDao.isPlaylistLocked(playlistId)) { + qDebug() << "Can't adopt current sorting for locked playlist" << playlistId + << m_playlistDao.getPlaylistName(playlistId); + return; + } + // Note(ronso0) I propose to proceed only if the playlist is selected and loaded. + // without playlist content visible we don't have a preview. + if (!isChildIndexSelectedInSidebar(m_lastRightClickedIndex)) { + return; } + m_pPlaylistTableModel->orderTracksByCurrPos(); } void PlaylistFeature::slotUnlockAllPlaylists() { diff --git a/src/library/trackset/playlistfeature.h b/src/library/trackset/playlistfeature.h index 132dab1898c3..14d57097b17d 100644 --- a/src/library/trackset/playlistfeature.h +++ b/src/library/trackset/playlistfeature.h @@ -37,6 +37,7 @@ class PlaylistFeature : public BasePlaylistFeature { void slotPlaylistContentOrLockChanged(const QSet& playlistIds) override; void slotPlaylistTableRenamed(int playlistId, const QString& newName) override; void slotShufflePlaylist(); + void slotOrderTracksByCurrentPosition(); void slotUnlockAllPlaylists(); void slotDeleteAllUnlockedPlaylists(); @@ -49,6 +50,7 @@ class PlaylistFeature : public BasePlaylistFeature { QString getRootViewHtml() const override; parented_ptr m_pShufflePlaylistAction; + parented_ptr m_pOrderByCurrentPosAction; parented_ptr m_pUnlockPlaylistsAction; parented_ptr m_pDeleteAllUnlockedPlaylistsAction; }; From d9e5e9b08b2b25ccf66a7790a3f9f2fb72f87897 Mon Sep 17 00:00:00 2001 From: danferns Date: Sat, 7 Jun 2025 17:45:29 +0530 Subject: [PATCH 142/163] feat: add key colors to WKey label in decks Co-authored-by: ronso0 --- src/preferences/colorpalettesettings.h | 2 +- src/skin/legacy/legacyskinparser.cpp | 2 +- src/widget/wkey.cpp | 99 +++++++++++++++++++++----- src/widget/wkey.h | 14 ++-- 4 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/preferences/colorpalettesettings.h b/src/preferences/colorpalettesettings.h index c0e9725e02ca..716111a6e27f 100644 --- a/src/preferences/colorpalettesettings.h +++ b/src/preferences/colorpalettesettings.h @@ -29,7 +29,7 @@ class ColorPaletteSettings { void removePalette(const QString& name); QSet getColorPaletteNames() const; - DEFINE_PREFERENCE_HELPERS(KeyColorsEnabled, bool, "[Config]", "KeyColorsEnabled", true); + DEFINE_PREFERENCE_HELPERS(KeyColorsEnabled, bool, "[Config]", "key_colors_enabled", true); private: UserSettingsPointer m_pConfig; diff --git a/src/skin/legacy/legacyskinparser.cpp b/src/skin/legacy/legacyskinparser.cpp index 2e0951b3961a..58e97ed4c43a 100644 --- a/src/skin/legacy/legacyskinparser.cpp +++ b/src/skin/legacy/legacyskinparser.cpp @@ -1338,7 +1338,7 @@ QWidget* LegacySkinParser::parseNumberPos(const QDomElement& node) { QWidget* LegacySkinParser::parseEngineKey(const QDomElement& node) { QString group = lookupNodeGroup(node); - WKey* pEngineKey = new WKey(group, m_pParent); + WKey* pEngineKey = new WKey(group, m_pConfig, m_pParent); setupLabelWidget(node, pEngineKey); return pEngineKey; } diff --git a/src/widget/wkey.cpp b/src/widget/wkey.cpp index 3186e2275340..b335f6b19e5d 100644 --- a/src/widget/wkey.cpp +++ b/src/widget/wkey.cpp @@ -1,28 +1,37 @@ #include "widget/wkey.h" +#include +#include + #include "library/library_prefs.h" #include "moc_wkey.cpp" +#include "preferences/usersettings.h" #include "skin/legacy/skincontext.h" #include "track/keyutils.h" -WKey::WKey(const QString& group, QWidget* pParent) +WKey::WKey(const QString& group, UserSettingsPointer pConfig, QWidget* pParent) : WLabel(pParent), - m_dOldValue(0), m_keyNotation(mixxx::library::prefs::kKeyNotationConfigKey, this), m_engineKeyDistance(group, "visual_key_distance", this, - ControlFlag::AllowMissingOrInvalid) { - setValue(m_dOldValue); + ControlFlag::AllowMissingOrInvalid), + m_engineKey(group, + "key", + this, + ControlFlag::AllowMissingOrInvalid), + m_colorPaletteSettings(pConfig) { + setValue(); m_keyNotation.connectValueChanged(this, &WKey::keyNotationChanged); m_engineKeyDistance.connectValueChanged(this, &WKey::setCents); } void WKey::onConnectedControlChanged(double dParameter, double dValue) { Q_UNUSED(dParameter); + Q_UNUSED(dValue); // Enums are not currently represented using parameter space so it doesn't // make sense to use the parameter here yet. - setValue(dValue); + setValue(); } void WKey::setup(const QDomNode& node, const SkinContext& context) { @@ -31,23 +40,21 @@ void WKey::setup(const QDomNode& node, const SkinContext& context) { m_displayKey = context.selectBool(node, "DisplayKey", true); } -void WKey::setValue(double dValue) { - m_dOldValue = dValue; - mixxx::track::io::key::ChromaticKey key = - KeyUtils::keyFromNumericValue(dValue); - if (key != mixxx::track::io::key::INVALID) { +void WKey::setValue() { + m_key = KeyUtils::keyFromNumericValue(m_engineKey.get()); + m_diff_cents = m_engineKeyDistance.get(); + if (m_key != mixxx::track::io::key::INVALID) { // Render this key with the user-provided notation. QString keyStr = ""; if (m_displayKey) { - keyStr = KeyUtils::keyToString(key); + keyStr = KeyUtils::keyToString(m_key); } if (m_displayCents) { - double diff_cents = m_engineKeyDistance.get(); - int cents_to_display = static_cast(diff_cents * 100); + int cents_to_display = static_cast(m_diff_cents * 100); char sign = ' '; - if (diff_cents < 0) { + if (m_diff_cents < 0) { sign = '-'; - } else if (diff_cents > 0) { + } else if (m_diff_cents > 0) { sign = '+'; } keyStr.append(QString(" %1%2c").arg(sign).arg(qAbs(cents_to_display))); @@ -56,15 +63,73 @@ void WKey::setValue(double dValue) { } else { setText(""); } + update(); } void WKey::setCents() { - setValue(m_dOldValue); + setValue(); } void WKey::keyNotationChanged(double dKeyNotationValue) { Q_UNUSED(dKeyNotationValue); // NOTE: dKeyNotationValue is the index of the key notation type, NOT the // key itself, so we intentionally set the old value again to update the UI. - setValue(m_dOldValue); + setValue(); +} + +void WKey::paintEvent(QPaintEvent* event) { + if (m_key == mixxx::track::io::key::INVALID || !m_colorPaletteSettings.getKeyColorsEnabled()) { + WLabel::paintEvent(event); + return; + } + + ColorPalette keyColorPalette = m_colorPaletteSettings.getConfigKeyColorPalette(); + + QColor colorTop, colorBottom; + double splitPoint = 0; // 'height' of top color + if (m_diff_cents < 0) { + colorTop = KeyUtils::keyToColor(m_key, keyColorPalette); + colorBottom = KeyUtils::keyToColor(KeyUtils::scaleKeySteps(m_key, -1), keyColorPalette); + splitPoint = m_diff_cents + 1; + } else { + colorTop = KeyUtils::keyToColor(KeyUtils::scaleKeySteps(m_key, 1), keyColorPalette); + colorBottom = KeyUtils::keyToColor(m_key, keyColorPalette); + splitPoint = m_diff_cents; + } + + QStyleOption option; + option.initFrom(this); + QStylePainter painter(this); + + const QStyle* pStyle = style(); + const QRect contRect = pStyle->subElementRect(QStyle::SE_FrameContents, &option, this); + + const int rectWidth = 4; + const int splitHeight = static_cast(contRect.height() * splitPoint); + + painter.fillRect(contRect.left(), + contRect.top(), + rectWidth, + splitHeight, + colorTop); + + painter.fillRect(contRect.left(), + splitHeight + 1, + rectWidth, + contRect.height() - splitHeight, + colorBottom); + + painter.setPen(option.palette.text().color()); + + QString elidedText = option.fontMetrics.elidedText( + text(), + Qt::ElideRight, + width() - rectWidth); + + painter.drawText(rectWidth, + contRect.top(), + contRect.width() - rectWidth, + contRect.height(), + Qt::AlignCenter, + elidedText); } diff --git a/src/widget/wkey.h b/src/widget/wkey.h index 99215b1fa9e1..23723316eb7c 100644 --- a/src/widget/wkey.h +++ b/src/widget/wkey.h @@ -1,25 +1,31 @@ #pragma once -#include "widget/wlabel.h" #include "control/controlproxy.h" +#include "preferences/colorpalettesettings.h" +#include "proto/keys.pb.h" +#include "widget/wlabel.h" class WKey : public WLabel { Q_OBJECT public: - explicit WKey(const QString& group, QWidget* pParent = nullptr); + explicit WKey(const QString& group, UserSettingsPointer pConfig, QWidget* pParent = nullptr); void onConnectedControlChanged(double dParameter, double dValue) override; void setup(const QDomNode& node, const SkinContext& context) override; private slots: - void setValue(double dValue); + void setValue(); void keyNotationChanged(double dValue); void setCents(); private: - double m_dOldValue; + double m_diff_cents; bool m_displayCents; bool m_displayKey; ControlProxy m_keyNotation; ControlProxy m_engineKeyDistance; + ControlProxy m_engineKey; + ColorPaletteSettings m_colorPaletteSettings; + mixxx::track::io::key::ChromaticKey m_key; + void paintEvent(QPaintEvent* event) override; }; From 74758bf5eaabbaf0c563e908ea03488a463e11fc Mon Sep 17 00:00:00 2001 From: danferns Date: Tue, 14 Oct 2025 22:23:11 +0530 Subject: [PATCH 143/163] Update WKey tooltip to mention Key colors --- src/skin/legacy/tooltips.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/skin/legacy/tooltips.cpp b/src/skin/legacy/tooltips.cpp index 34f0fdc23d74..9b5d207f6cac 100644 --- a/src/skin/legacy/tooltips.cpp +++ b/src/skin/legacy/tooltips.cpp @@ -418,7 +418,9 @@ void Tooltips::addStandardTooltips() { add("visual_key") //: The musical key of a track << tr("Key") - << tr("Displays the current musical key of the loaded track after pitch shifting."); + << tr("Displays the current musical key of the loaded track after pitch shifting.") + << tr("It also shows a colored bar if Key colors are enabled in the Preferences.") + << tr("The bar will be split vertically if the track's key is in between full keys."); add("visual_bpm_edit") << tempoDisplay From bd8511e69ac1165fb0298bf5f146a7bbda47144f Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 16 Oct 2025 16:35:07 +0200 Subject: [PATCH 144/163] Color preferences: disable Key color combobox when Key are disabled --- src/preferences/dialog/dlgprefcolors.cpp | 10 +++++++++- src/preferences/dialog/dlgprefcolors.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/preferences/dialog/dlgprefcolors.cpp b/src/preferences/dialog/dlgprefcolors.cpp index 44e007c1f924..884ae308958e 100644 --- a/src/preferences/dialog/dlgprefcolors.cpp +++ b/src/preferences/dialog/dlgprefcolors.cpp @@ -123,6 +123,7 @@ void DlgPrefColors::slotUpdate() { paletteIcon); } } + updateKeyColorsCombobox(); const QSet colorPaletteNames = m_colorPaletteSettings.getColorPaletteNames(); for (const auto& paletteName : colorPaletteNames) { @@ -227,6 +228,7 @@ void DlgPrefColors::slotResetToDefaults() { comboBoxLoopDefaultColor->setCurrentIndex( mixxx::PredefinedColorPalettes::kDefaultTrackColorPalette.size() - 1); checkboxKeyColorsEnabled->setChecked(BaseTrackTableModel::kKeyColorsEnabledDefault); + updateKeyColorsCombobox(); comboBoxJumpDefaultColor->setCurrentIndex( mixxx::PredefinedColorPalettes::kDefaultTrackColorPalette.size() - 2); } @@ -468,7 +470,13 @@ void DlgPrefColors::slotKeyColorsEnabled(int i) { m_bKeyColorsEnabled = static_cast(i); #endif BaseTrackTableModel::setKeyColorsEnabled(m_bKeyColorsEnabled); - m_pConfig->setValue(kKeyColorsEnabledConfigKey, checkboxKeyColorsEnabled->checkState()); + + updateKeyColorsCombobox(); + m_pConfig->setValue(kKeyColorsEnabledConfigKey, m_bKeyColorsEnabled); +} + +void DlgPrefColors::updateKeyColorsCombobox() { + comboBoxKeyColors->setEnabled(checkboxKeyColorsEnabled->isChecked()); } void DlgPrefColors::openColorPaletteEditor( diff --git a/src/preferences/dialog/dlgprefcolors.h b/src/preferences/dialog/dlgprefcolors.h index e2188df51031..8cdf7fe6dd90 100644 --- a/src/preferences/dialog/dlgprefcolors.h +++ b/src/preferences/dialog/dlgprefcolors.h @@ -58,6 +58,7 @@ class DlgPrefColors : public DlgPreferencePage, public Ui::DlgPrefColorsDlg { int defaultHotcueColor, int defaultLoopColor, int defaultJumpColor); + void updateKeyColorsCombobox(); const UserSettingsPointer m_pConfig; ColorPaletteSettings m_colorPaletteSettings; From 81ef690af09b91001c679e984bd83d213cd5e30a Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 13 Mar 2025 11:44:30 +0100 Subject: [PATCH 145/163] Track comment: add shortcut to edit deck label, Alt + deckNum --- src/widget/wtrackproperty.cpp | 102 ++++++++++++++++++++++++++-------- src/widget/wtrackproperty.h | 3 + 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp index ca1f0d03ec3f..eef249ad9ec8 100644 --- a/src/widget/wtrackproperty.cpp +++ b/src/widget/wtrackproperty.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "control/controlobject.h" @@ -29,6 +30,7 @@ WTrackProperty::WTrackProperty( m_pConfig(pConfig), m_pLibrary(pLibrary), m_isMainDeck(isMainDeck), + m_isComment(false), m_propertyIsWritable(false), m_pSelectedClickTimer(nullptr), m_bSelected(false), @@ -65,8 +67,50 @@ void WTrackProperty::setup(const QDomNode& node, const SkinContext& context) { return; } m_editProperty = m_displayProperty; + if (m_editProperty == QStringLiteral("comment")) { + m_isComment = true; + } } m_propertyIsWritable = true; + + if (m_isMainDeck && m_isComment) { + QRegExp numGroupMatcher("\\[Channel([1-9])\\]"); + if (!numGroupMatcher.exactMatch(m_group)) { + qWarning() << " ."; + qWarning() << " Trying to create comment edit shortcut for" << m_group; + qWarning() << " -- no RegEx match"; + qWarning() << " ."; + return; + } + bool ok = false; + int deckNum = numGroupMatcher.cap(1).toInt(&ok); + VERIFY_OR_DEBUG_ASSERT(!ok) { // Just in case... + qWarning() << " ."; + qWarning() << " Trying to create comment edit shortcut for" << m_group; + qWarning() << " -- deckNum not an int"; + qWarning() << " ."; + return; + } + parented_ptr pEditCommentAction = make_parented("edit comment", this); + pEditCommentAction->setShortcut(QKeySequence(tr("Alt+%1").arg(deckNum))); + connect(pEditCommentAction.get(), + &QAction::triggered, + this, + [this]() { + // Assumes only one comment label is visible. + // If there are more, Qt _should_ trigger the first QAction + // in the internal list and throw a warning for the others + // "QAction::event: Ambiguous shortcut overload: [shortcut]" + // Anyways, as soon as one editor is opened (gets focus), + // others will receive a focusOut event and close. + if (isVisible() && !m_pEditor->isVisible()) { + // Note: if the editor is already visible, this would + // reload/reset the comment from the track + openEditor(); + } + }); + addAction(pEditCommentAction); + } } void WTrackProperty::slotTrackLoaded(TrackPointer pTrack) { @@ -97,6 +141,10 @@ void WTrackProperty::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldT void WTrackProperty::slotTrackChanged(TrackId trackId) { Q_UNUSED(trackId); updateLabel(); + if (m_pEditor && m_pEditor->isVisible()) { + // Close and discard new text + m_pEditor->hide(); + } } void WTrackProperty::updateLabel() { @@ -148,28 +196,7 @@ void WTrackProperty::mousePressEvent(QMouseEvent* pEvent) { m_pSelectedClickTimer->callOnTimeout( this, &WTrackProperty::resetSelectedState); } else if (m_pSelectedClickTimer->isActive()) { - resetSelectedState(); - // create the persistent editor, populate & connect - if (!m_pEditor) { - m_pEditor = make_parented(this); - connect(m_pEditor, - // use custom signal. editingFinished() doesn't suit since it's - // also emitted weh pressing Esc (which should cancel editing) - &WTrackPropertyEditor::commitEditorData, - this, - &WTrackProperty::slotCommitEditorData); - } - // Don't let the editor expand beyond its initial size - m_pEditor->setFixedSize(size()); - - QString editText = getPropertyStringFromTrack(m_editProperty); - if (m_displayProperty == "titleInfo" && editText.isEmpty()) { - editText = tr("title"); - } - m_pEditor->setText(editText); - m_pEditor->selectAll(); - m_pEditor->show(); - m_pEditor->setFocus(); + openEditor(); return; } // start timer @@ -178,6 +205,34 @@ void WTrackProperty::mousePressEvent(QMouseEvent* pEvent) { restyleAndRepaint(); } +void WTrackProperty::openEditor() { + resetSelectedState(); + if (!m_pCurrentTrack) { + return; + } + // create the persistent editor, populate & connect + if (!m_pEditor) { + m_pEditor = make_parented(this); + connect(m_pEditor, + // use custom signal. editingFinished() doesn't suit since it's + // also emitted weh pressing Esc (which should cancel editing) + &WTrackPropertyEditor::commitEditorData, + this, + &WTrackProperty::slotCommitEditorData); + } + // Don't let the editor expand beyond its initial size + m_pEditor->setFixedSize(size()); + + QString editText = getPropertyStringFromTrack(m_editProperty); + if (m_displayProperty == "titleInfo" && editText.isEmpty()) { + editText = tr("title"); + } + m_pEditor->setText(editText); + m_pEditor->selectAll(); + m_pEditor->show(); + m_pEditor->setFocus(); +} + void WTrackProperty::mouseMoveEvent(QMouseEvent* pEvent) { if (m_pCurrentTrack && DragAndDropHelper::mouseMoveInitiatesDrag(pEvent)) { DragAndDropHelper::dragTrack(m_pCurrentTrack, this, m_group); @@ -309,6 +364,9 @@ void WTrackProperty::slotShowTrackMenuChangeRequest(bool show) { } void WTrackProperty::slotCommitEditorData(const QString& text) { + if (!m_pCurrentTrack) { + return; + } // use real track data instead of text() to be independent from display text if (m_pCurrentTrack && text != getPropertyStringFromTrack(m_editProperty)) { const QVariant var(QVariant::fromValue(text)); diff --git a/src/widget/wtrackproperty.h b/src/widget/wtrackproperty.h index 0e97f5efe98b..a7240f9654b6 100644 --- a/src/widget/wtrackproperty.h +++ b/src/widget/wtrackproperty.h @@ -88,11 +88,14 @@ class WTrackProperty : public WLabel, public TrackDropTarget { const QString getPropertyStringFromTrack(QString& property) const; void restyleAndRepaint(); + void openEditor(); + void ensureTrackMenuIsCreated(); const QString m_group; const UserSettingsPointer m_pConfig; Library* m_pLibrary; const bool m_isMainDeck; + bool m_isComment; TrackPointer m_pCurrentTrack; QString m_displayProperty; From 6c697db1f29709361d8c153bf7d39318d6f7dd0c Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 13 Mar 2025 11:46:13 +0100 Subject: [PATCH 146/163] Track comment: show only first line in WTrackPropertyEditor --- src/widget/wtrackproperty.cpp | 37 +++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp index eef249ad9ec8..8a1b22cac352 100644 --- a/src/widget/wtrackproperty.cpp +++ b/src/widget/wtrackproperty.cpp @@ -17,6 +17,7 @@ namespace { // Duration (ms) the widget is 'selected' after left click, i.e. the duration // a second click would open the value editor constexpr int kSelectedClickTimeoutMs = 2000; +const QString kLinebreak = QStringLiteral("\n"); } // namespace WTrackProperty::WTrackProperty( @@ -226,6 +227,14 @@ void WTrackProperty::openEditor() { QString editText = getPropertyStringFromTrack(m_editProperty); if (m_displayProperty == "titleInfo" && editText.isEmpty()) { editText = tr("title"); + } else if (m_isComment) { + // For comments we only load the first line, + // ie. truncate track text at first linebreak. + // On commit we replace the first line with the edited text. + int firstLB = editText.indexOf(kLinebreak); + if (firstLB >= 0) { + editText.truncate(firstLB); + } } m_pEditor->setText(editText); m_pEditor->selectAll(); @@ -368,13 +377,29 @@ void WTrackProperty::slotCommitEditorData(const QString& text) { return; } // use real track data instead of text() to be independent from display text - if (m_pCurrentTrack && text != getPropertyStringFromTrack(m_editProperty)) { - const QVariant var(QVariant::fromValue(text)); - m_pCurrentTrack->setProperty( - m_editProperty.toUtf8().constData(), - var); - // Track::changed() will update label + const QString trackText = getPropertyStringFromTrack(m_editProperty); + QString editorText = text; + if (m_isComment) { + // For multi-line comments, the editor received only the first line. + // In order to keep the other lines, we need to replace + // the first line of the original text with the editor text. + // (which may add new linebreaks) + // Note: assumes the comment didn't change while we were editing it. + int firstLB = trackText.indexOf(kLinebreak); + if (firstLB >= 0) { // has linebreak + QString trackTSliced = trackText; + trackTSliced = trackTSliced.sliced(firstLB); + editorText.append(trackTSliced); + } + } + if (editorText == trackText) { + return; } + const QVariant var(QVariant::fromValue(editorText)); + m_pCurrentTrack->setProperty( + m_editProperty.toUtf8().constData(), + var); + // Track::changed() will update label } void WTrackProperty::resetSelectedState() { From 9b18da40daf8b31aee9b38fdbbb917041c4ea959 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 13 Mar 2025 13:12:09 +0100 Subject: [PATCH 147/163] Track comment: add linebreak with \n in WTrackPropertyEditor --- src/widget/wtrackproperty.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp index 8a1b22cac352..01914eb8915d 100644 --- a/src/widget/wtrackproperty.cpp +++ b/src/widget/wtrackproperty.cpp @@ -380,6 +380,11 @@ void WTrackProperty::slotCommitEditorData(const QString& text) { const QString trackText = getPropertyStringFromTrack(m_editProperty); QString editorText = text; if (m_isComment) { + // Transform ALL occurrences of \n into linebreaks. + // Existing linebreaks are not affected. + QString cr(QChar::CarriageReturn); + cr.append(QChar::LineFeed); + editorText.replace("\\n", cr); // For multi-line comments, the editor received only the first line. // In order to keep the other lines, we need to replace // the first line of the original text with the editor text. From 8cc8b115db910d69cebba3b1097cb3bb00cf6c9c Mon Sep 17 00:00:00 2001 From: ronso0 Date: Sun, 26 Oct 2025 22:07:23 +0100 Subject: [PATCH 148/163] Revert "Merge branch 'track-comment-hotkey' of github.com:ronso0/mixxx" This reverts commit 1afeaa46937dc02e8669c0f4c450398bf43c9eb7, reversing changes made to 6c304da068849f369402c3c60eeebb9e03c04407. --- src/widget/wtrackproperty.cpp | 144 +++++++--------------------------- src/widget/wtrackproperty.h | 3 - 2 files changed, 28 insertions(+), 119 deletions(-) diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp index 01914eb8915d..ca1f0d03ec3f 100644 --- a/src/widget/wtrackproperty.cpp +++ b/src/widget/wtrackproperty.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include "control/controlobject.h" @@ -17,7 +16,6 @@ namespace { // Duration (ms) the widget is 'selected' after left click, i.e. the duration // a second click would open the value editor constexpr int kSelectedClickTimeoutMs = 2000; -const QString kLinebreak = QStringLiteral("\n"); } // namespace WTrackProperty::WTrackProperty( @@ -31,7 +29,6 @@ WTrackProperty::WTrackProperty( m_pConfig(pConfig), m_pLibrary(pLibrary), m_isMainDeck(isMainDeck), - m_isComment(false), m_propertyIsWritable(false), m_pSelectedClickTimer(nullptr), m_bSelected(false), @@ -68,50 +65,8 @@ void WTrackProperty::setup(const QDomNode& node, const SkinContext& context) { return; } m_editProperty = m_displayProperty; - if (m_editProperty == QStringLiteral("comment")) { - m_isComment = true; - } } m_propertyIsWritable = true; - - if (m_isMainDeck && m_isComment) { - QRegExp numGroupMatcher("\\[Channel([1-9])\\]"); - if (!numGroupMatcher.exactMatch(m_group)) { - qWarning() << " ."; - qWarning() << " Trying to create comment edit shortcut for" << m_group; - qWarning() << " -- no RegEx match"; - qWarning() << " ."; - return; - } - bool ok = false; - int deckNum = numGroupMatcher.cap(1).toInt(&ok); - VERIFY_OR_DEBUG_ASSERT(!ok) { // Just in case... - qWarning() << " ."; - qWarning() << " Trying to create comment edit shortcut for" << m_group; - qWarning() << " -- deckNum not an int"; - qWarning() << " ."; - return; - } - parented_ptr pEditCommentAction = make_parented("edit comment", this); - pEditCommentAction->setShortcut(QKeySequence(tr("Alt+%1").arg(deckNum))); - connect(pEditCommentAction.get(), - &QAction::triggered, - this, - [this]() { - // Assumes only one comment label is visible. - // If there are more, Qt _should_ trigger the first QAction - // in the internal list and throw a warning for the others - // "QAction::event: Ambiguous shortcut overload: [shortcut]" - // Anyways, as soon as one editor is opened (gets focus), - // others will receive a focusOut event and close. - if (isVisible() && !m_pEditor->isVisible()) { - // Note: if the editor is already visible, this would - // reload/reset the comment from the track - openEditor(); - } - }); - addAction(pEditCommentAction); - } } void WTrackProperty::slotTrackLoaded(TrackPointer pTrack) { @@ -142,10 +97,6 @@ void WTrackProperty::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldT void WTrackProperty::slotTrackChanged(TrackId trackId) { Q_UNUSED(trackId); updateLabel(); - if (m_pEditor && m_pEditor->isVisible()) { - // Close and discard new text - m_pEditor->hide(); - } } void WTrackProperty::updateLabel() { @@ -197,7 +148,28 @@ void WTrackProperty::mousePressEvent(QMouseEvent* pEvent) { m_pSelectedClickTimer->callOnTimeout( this, &WTrackProperty::resetSelectedState); } else if (m_pSelectedClickTimer->isActive()) { - openEditor(); + resetSelectedState(); + // create the persistent editor, populate & connect + if (!m_pEditor) { + m_pEditor = make_parented(this); + connect(m_pEditor, + // use custom signal. editingFinished() doesn't suit since it's + // also emitted weh pressing Esc (which should cancel editing) + &WTrackPropertyEditor::commitEditorData, + this, + &WTrackProperty::slotCommitEditorData); + } + // Don't let the editor expand beyond its initial size + m_pEditor->setFixedSize(size()); + + QString editText = getPropertyStringFromTrack(m_editProperty); + if (m_displayProperty == "titleInfo" && editText.isEmpty()) { + editText = tr("title"); + } + m_pEditor->setText(editText); + m_pEditor->selectAll(); + m_pEditor->show(); + m_pEditor->setFocus(); return; } // start timer @@ -206,42 +178,6 @@ void WTrackProperty::mousePressEvent(QMouseEvent* pEvent) { restyleAndRepaint(); } -void WTrackProperty::openEditor() { - resetSelectedState(); - if (!m_pCurrentTrack) { - return; - } - // create the persistent editor, populate & connect - if (!m_pEditor) { - m_pEditor = make_parented(this); - connect(m_pEditor, - // use custom signal. editingFinished() doesn't suit since it's - // also emitted weh pressing Esc (which should cancel editing) - &WTrackPropertyEditor::commitEditorData, - this, - &WTrackProperty::slotCommitEditorData); - } - // Don't let the editor expand beyond its initial size - m_pEditor->setFixedSize(size()); - - QString editText = getPropertyStringFromTrack(m_editProperty); - if (m_displayProperty == "titleInfo" && editText.isEmpty()) { - editText = tr("title"); - } else if (m_isComment) { - // For comments we only load the first line, - // ie. truncate track text at first linebreak. - // On commit we replace the first line with the edited text. - int firstLB = editText.indexOf(kLinebreak); - if (firstLB >= 0) { - editText.truncate(firstLB); - } - } - m_pEditor->setText(editText); - m_pEditor->selectAll(); - m_pEditor->show(); - m_pEditor->setFocus(); -} - void WTrackProperty::mouseMoveEvent(QMouseEvent* pEvent) { if (m_pCurrentTrack && DragAndDropHelper::mouseMoveInitiatesDrag(pEvent)) { DragAndDropHelper::dragTrack(m_pCurrentTrack, this, m_group); @@ -373,38 +309,14 @@ void WTrackProperty::slotShowTrackMenuChangeRequest(bool show) { } void WTrackProperty::slotCommitEditorData(const QString& text) { - if (!m_pCurrentTrack) { - return; - } // use real track data instead of text() to be independent from display text - const QString trackText = getPropertyStringFromTrack(m_editProperty); - QString editorText = text; - if (m_isComment) { - // Transform ALL occurrences of \n into linebreaks. - // Existing linebreaks are not affected. - QString cr(QChar::CarriageReturn); - cr.append(QChar::LineFeed); - editorText.replace("\\n", cr); - // For multi-line comments, the editor received only the first line. - // In order to keep the other lines, we need to replace - // the first line of the original text with the editor text. - // (which may add new linebreaks) - // Note: assumes the comment didn't change while we were editing it. - int firstLB = trackText.indexOf(kLinebreak); - if (firstLB >= 0) { // has linebreak - QString trackTSliced = trackText; - trackTSliced = trackTSliced.sliced(firstLB); - editorText.append(trackTSliced); - } - } - if (editorText == trackText) { - return; + if (m_pCurrentTrack && text != getPropertyStringFromTrack(m_editProperty)) { + const QVariant var(QVariant::fromValue(text)); + m_pCurrentTrack->setProperty( + m_editProperty.toUtf8().constData(), + var); + // Track::changed() will update label } - const QVariant var(QVariant::fromValue(editorText)); - m_pCurrentTrack->setProperty( - m_editProperty.toUtf8().constData(), - var); - // Track::changed() will update label } void WTrackProperty::resetSelectedState() { diff --git a/src/widget/wtrackproperty.h b/src/widget/wtrackproperty.h index a7240f9654b6..0e97f5efe98b 100644 --- a/src/widget/wtrackproperty.h +++ b/src/widget/wtrackproperty.h @@ -88,14 +88,11 @@ class WTrackProperty : public WLabel, public TrackDropTarget { const QString getPropertyStringFromTrack(QString& property) const; void restyleAndRepaint(); - void openEditor(); - void ensureTrackMenuIsCreated(); const QString m_group; const UserSettingsPointer m_pConfig; Library* m_pLibrary; const bool m_isMainDeck; - bool m_isComment; TrackPointer m_pCurrentTrack; QString m_displayProperty; From 34be6f2fac72531b246004a35f8d93651e99e885 Mon Sep 17 00:00:00 2001 From: Owen Turnbull Date: Mon, 27 Oct 2025 11:10:32 -0700 Subject: [PATCH 149/163] feat: Additional Metadata Variables for Broadcasting --- src/engine/sidechain/shoutconnection.cpp | 57 +++++++----------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/src/engine/sidechain/shoutconnection.cpp b/src/engine/sidechain/shoutconnection.cpp index 167e4915fcf4..5cce4521a38c 100644 --- a/src/engine/sidechain/shoutconnection.cpp +++ b/src/engine/sidechain/shoutconnection.cpp @@ -1,6 +1,5 @@ #include "engine/sidechain/shoutconnection.h" -#include #include #include @@ -35,9 +34,6 @@ constexpr int kMaxNetworkCache = 491520; // 10 s mp3 @ 192 kbit/s // http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2 constexpr int kMaxShoutFailures = 3; -const QRegularExpression kArtistOrTitleRegex(QStringLiteral("\\$artist|\\$title")); -const QRegularExpression kArtistRegex(QStringLiteral("\\$artist")); - const mixxx::Logger kLogger("ShoutConnection"); } // namespace @@ -816,9 +812,7 @@ void ShoutConnection::updateMetaData() { // metadata being enabled, we want dynamic metadata changes if (!m_custom_metadata && (m_format_is_mp3 || m_format_is_aac || m_ogg_dynamic_update)) { if (m_pMetaData != nullptr) { - QString artist = m_pMetaData->getArtist(); - QString title = m_pMetaData->getTitle(); // shoutcast uses only "song" as field for "artist - title". // icecast2 supports separate fields for "artist" and "title", @@ -831,41 +825,24 @@ void ShoutConnection::updateMetaData() { // Also I do not know about icecast1. To be safe, i stick to the // old way for those use cases. if (!m_format_is_mp3 && m_protocol_is_icecast2) { - setFunctionCode(9); - insertMetaData("artist", encodeString(artist).constData()); - insertMetaData("title", encodeString(title).constData()); - } else { - // we are going to take the metadata format and replace all - // the references to $title and $artist by doing a single - // pass over the string - int replaceIndex = 0; - - // Make a copy so we don't overwrite the references only - // once per streaming session. - QString metadataFinal = m_metadataFormat; - do { - // find the next occurrence - replaceIndex = metadataFinal.indexOf( - kArtistOrTitleRegex, - replaceIndex); - - if (replaceIndex != -1) { - if (metadataFinal.indexOf( - kArtistRegex, replaceIndex) == replaceIndex) { - metadataFinal.replace(replaceIndex, 7, artist); - // skip to the end of the replacement - replaceIndex += artist.length(); - } else { - metadataFinal.replace(replaceIndex, 6, title); - replaceIndex += title.length(); - } - } - } while (replaceIndex != -1); - - QByteArray baSong = encodeString(metadataFinal); - setFunctionCode(10); - insertMetaData("song", baSong.constData()); + setFunctionCode(9); + insertMetaData("artist", encodeString(artist).constData()); } + + // Make a copy so we don't overwrite the references only + // once per streaming session. + QString metadataFinal = m_metadataFormat; + + metadataFinal.replace("$artist", artist); + metadataFinal.replace("$title", m_pMetaData->getTitle()); + metadataFinal.replace("$year", m_pMetaData->getYear()); + metadataFinal.replace("$album", m_pMetaData->getAlbum()); + metadataFinal.replace("$genre", m_pMetaData->getGenre()); + metadataFinal.replace("$bpm", QString::number(m_pMetaData->getBpm())); + + QByteArray baSong = encodeString(metadataFinal); + setFunctionCode(10); + insertMetaData("song", baSong.constData()); setFunctionCode(11); int ret = shout_set_metadata(m_pShout, m_pShoutMetaData); if (ret != SHOUTERR_SUCCESS) { From 4e4ff205986f79aa99cce13b8ecf93201cf6165c Mon Sep 17 00:00:00 2001 From: Owen Turnbull Date: Tue, 28 Oct 2025 08:23:05 -0700 Subject: [PATCH 150/163] feat: add tooltip for new metadata broadcasting variables --- src/preferences/dialog/dlgprefbroadcastdlg.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/preferences/dialog/dlgprefbroadcastdlg.ui b/src/preferences/dialog/dlgprefbroadcastdlg.ui index 077e47258308..1b8f55099d44 100644 --- a/src/preferences/dialog/dlgprefbroadcastdlg.ui +++ b/src/preferences/dialog/dlgprefbroadcastdlg.ui @@ -376,6 +376,9 @@ + + Available fields: $artist, $title, $year, $album, $genre, $bpm + $artist - $title From 641cdbcb9b5efe5bd03533773682ea0ba72b377f Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 29 Oct 2025 16:41:33 +0100 Subject: [PATCH 151/163] Interface preferences: separate user & built-in skins in drop-down --- src/preferences/dialog/dlgprefinterface.cpp | 69 ++++++++++++++++----- src/preferences/dialog/dlgprefinterface.h | 1 + src/skin/skinloader.cpp | 60 ++++++++++++------ src/skin/skinloader.h | 6 +- 4 files changed, 101 insertions(+), 35 deletions(-) diff --git a/src/preferences/dialog/dlgprefinterface.cpp b/src/preferences/dialog/dlgprefinterface.cpp index f4e0c7841d70..1151817285fc 100644 --- a/src/preferences/dialog/dlgprefinterface.cpp +++ b/src/preferences/dialog/dlgprefinterface.cpp @@ -140,20 +140,7 @@ DlgPrefInterface::DlgPrefInterface( tr("The minimum size of the selected skin is bigger than your " "screen resolution.")); - ComboBoxSkinconf->clear(); - skinPreviewLabel->setText(""); - skinDescriptionText->setText(""); - skinDescriptionText->hide(); - - const QList skins = m_pSkinLoader->getSkins(); - int index = 0; - for (const SkinPointer& pSkin : skins) { - ComboBoxSkinconf->insertItem(index, pSkin->name()); - m_skins.insert(pSkin->name(), pSkin); - index++; - } - - ComboBoxSkinconf->setCurrentIndex(index); + slotUpdateSkins(); // schemes must be updated here to populate the drop-down box and set m_colorScheme slotUpdateSchemes(); slotSetSkinPreview(); @@ -258,6 +245,58 @@ QScreen* DlgPrefInterface::getScreen() const { return pScreen; } +void DlgPrefInterface::slotUpdateSkins() { + if (!m_pSkinLoader) { + return; + } + + ComboBoxSkinconf->blockSignals(true); + ComboBoxSkinconf->clear(); + m_skins.clear(); + skinPreviewLabel->setText(""); + skinDescriptionText->setText(""); + skinDescriptionText->hide(); + + // Check the text color of the palette for whether to use dark or light icons + QDir iconsPath; + if (!Color::isDimColor(palette().text().color())) { + iconsPath.setPath(":/images/preferences/light/"); + } else { + iconsPath.setPath(":/images/preferences/dark/"); + } + + // Set the user skin icon. + QIcon userSkinIcon(iconsPath.filePath("ic_custom.svg")); + + const QList userSkins = m_pSkinLoader->getUserSkins(); + int index = 0; + for (const SkinPointer& pSkin : userSkins) { + ComboBoxSkinconf->insertItem(index, userSkinIcon, pSkin->name()); + m_skins.insert(pSkin->name(), pSkin); + index++; + } + + // If there are user skins, we add a separator and the + // built-in skins also get an icon. + QIcon systemSkinIcon; + if (ComboBoxSkinconf->count() > 0) { + ComboBoxSkinconf->insertSeparator(index); + systemSkinIcon = QIcon(iconsPath.filePath("ic_mixxx_symbolic.svg")); + index++; + } + + const QList systemSkins = m_pSkinLoader->getSystemSkins(); + for (const SkinPointer& pSkin : systemSkins) { + ComboBoxSkinconf->insertItem( + index, systemSkinIcon, pSkin->name()); + m_skins.insert(pSkin->name(), pSkin); + index++; + } + + ComboBoxSkinconf->setCurrentIndex(index); + ComboBoxSkinconf->blockSignals(false); +} + void DlgPrefInterface::slotUpdateSchemes() { if (!m_pSkinLoader) { return; @@ -303,6 +342,8 @@ void DlgPrefInterface::slotUpdateSchemes() { void DlgPrefInterface::slotUpdate() { if (m_pSkinLoader) { + slotUpdateSkins(); + const SkinPointer pSkinOnUpdate = m_pSkinLoader->getConfiguredSkin(); if (pSkinOnUpdate != nullptr && pSkinOnUpdate->isValid()) { m_skinNameOnUpdate = pSkinOnUpdate->name(); diff --git a/src/preferences/dialog/dlgprefinterface.h b/src/preferences/dialog/dlgprefinterface.h index 1a990b25d1b6..13e3d02fca92 100644 --- a/src/preferences/dialog/dlgprefinterface.h +++ b/src/preferences/dialog/dlgprefinterface.h @@ -40,6 +40,7 @@ class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg void slotSetScheme(int); void slotSetSkinDescription(); void slotSetSkinPreview(); + void slotUpdateSkins(); void slotUpdateSchemes(); signals: diff --git a/src/skin/skinloader.cpp b/src/skin/skinloader.cpp index a2795f8b4b6b..271042078383 100644 --- a/src/skin/skinloader.cpp +++ b/src/skin/skinloader.cpp @@ -14,6 +14,8 @@ #include "util/debug.h" #include "util/timer.h" +const QString kSkinsDirName = QStringLiteral("skins"); + namespace mixxx { namespace skin { @@ -30,20 +32,25 @@ SkinLoader::~SkinLoader() { LegacySkinParser::clearSharedGroupStrings(); } -QList SkinLoader::getSkins() const { - const QList skinSearchPaths = getSkinSearchPaths(); +QList SkinLoader::getUserSkins() const { + return getSkinsFromDir(getUserSkinDir()); +} + +QList SkinLoader::getSystemSkins() const { + return getSkinsFromDir(getSytemSkinDir()); +} + +QList SkinLoader::getSkinsFromDir(const QDir& dir) const { QList skins; - for (const QDir& dir : skinSearchPaths) { - const QList fileInfos = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QFileInfo& fileInfo : fileInfos) { - QDir skinDir(fileInfo.absoluteFilePath()); - SkinPointer pSkin = skinFromDirectory(skinDir); - if (pSkin) { - VERIFY_OR_DEBUG_ASSERT(pSkin->isValid()) { - continue; - } - skins.append(pSkin); + const QList fileInfos = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const QFileInfo& fileInfo : fileInfos) { + QDir skinDir(fileInfo.absoluteFilePath()); + SkinPointer pSkin = skinFromDirectory(skinDir); + if (pSkin) { + VERIFY_OR_DEBUG_ASSERT(pSkin->isValid()) { + continue; } + skins.append(pSkin); } } @@ -53,25 +60,38 @@ QList SkinLoader::getSkins() const { QList SkinLoader::getSkinSearchPaths() const { QList searchPaths; - // Add user skin path to search paths + const auto userSkinDir = getUserSkinDir(); + if (!userSkinDir.path().isEmpty()) { + searchPaths.append(userSkinDir); + } + + searchPaths.append(getSytemSkinDir()); + + return searchPaths; +} + +QDir SkinLoader::getUserSkinDir() const { QDir userSkinsPath(m_pConfig->getSettingsPath()); - if (userSkinsPath.cd("skins")) { - searchPaths.append(userSkinsPath); + if (userSkinsPath.cd(kSkinsDirName)) { + return userSkinsPath; } + return {}; +} +QDir SkinLoader::getSytemSkinDir() const { // If we can't find the skins folder then we can't load a skin at all. This // is a critical error in the user's Mixxx installation. QDir skinsPath(m_pConfig->getResourcePath()); - if (!skinsPath.cd("skins")) { + if (!skinsPath.cd(kSkinsDirName)) { reportCriticalErrorAndQuit("Skin directory does not exist: " + - skinsPath.absoluteFilePath("skins")); + skinsPath.absoluteFilePath(kSkinsDirName)); } - searchPaths.append(skinsPath); - - return searchPaths; + return skinsPath; } SkinPointer SkinLoader::getSkin(const QString& skinName) const { + // If there are skins with identical name in both the resource and user + // directory, we'll discover the one from the user dir first const QList skinSearchPaths = getSkinSearchPaths(); for (QDir dir : skinSearchPaths) { if (dir.cd(skinName)) { diff --git a/src/skin/skinloader.h b/src/skin/skinloader.h index d306204fca73..c997e22b4fd4 100644 --- a/src/skin/skinloader.h +++ b/src/skin/skinloader.h @@ -32,12 +32,16 @@ class SkinLoader : public QObject { SkinPointer getConfiguredSkin() const; QString getDefaultSkinName() const; QList getSkinSearchPaths() const; - QList getSkins() const; + QDir getUserSkinDir() const; + QDir getSytemSkinDir() const; + QList getUserSkins() const; + QList getSystemSkins() const; private slots: void slotNumMicsChanged(double numMics); private: + QList getSkinsFromDir(const QDir& dir) const; QString pickResizableSkin(const QString& oldSkin) const; SkinPointer skinFromDirectory(const QDir& dir) const; From e14c750e8af7754b7a0269e929c9915797dcf373 Mon Sep 17 00:00:00 2001 From: vespadj Date: Sat, 25 Oct 2025 17:36:59 +0200 Subject: [PATCH 152/163] MixtrackPro: XML: Open and Save xml in Mixxx (auto tags sort) and minor upgrade --- res/controllers/Numark Mixtrack Pro.midi.xml | 761 ++++++++----------- 1 file changed, 330 insertions(+), 431 deletions(-) diff --git a/res/controllers/Numark Mixtrack Pro.midi.xml b/res/controllers/Numark Mixtrack Pro.midi.xml index f2ddff9750eb..a801211ef0eb 100644 --- a/res/controllers/Numark Mixtrack Pro.midi.xml +++ b/res/controllers/Numark Mixtrack Pro.midi.xml @@ -1,846 +1,745 @@ - - + + - Numark MixTrack Pro - Matteo (matteo@magm3.com), James Ralston, and D. J. Freije (dario2004@gmail.com) - version v1.2 w/brake, backspin, blink beat Leds. - https://mixxx.discourse.group/t/numark-mixtrack-pro-with-backspin-and-more/12557 - numark_mixtrack_pro + Numark MixTrack Pro + Vespadj, Josh Patten, Matteo (matteo@magm3.com), James Ralston, and D. J. Freije (dario2004@gmail.com) + version v2.5 (2025) + https://mixxx.discourse.group/t/numark-mixtrack-pro-by-vespadj/32635 - + - + - - - - - 0xb0 - 0xc - [Master] - headMix + + [Channel1] + volume + 0xB0 + 0x08 - 0xb0 - 0x17 - [Master] + [Channel2] volume + 0xB0 + 0x09 - 0xb0 - 0xb + [Master] + crossfader + 0xB0 + 0x0A + + + + + [Master] headVolume + 0xB0 + 0x0B - 0xb0 - 0x0a [Master] - crossfader + headMix + 0xB0 + 0x0C - + - 0xb0 - 0x1a - [Playlist] - NumarkMixTrackPro.selectKnob + [Channel1] + NumarkMixTrackPro.pitch + 0xB0 + 0x0D - 0x90 - 0x69 - [Playlist] - NumarkMixTrackPro.toggleDirectoryMode + [Channel2] + NumarkMixTrackPro.pitch + 0xB0 + 0x0E - 0x90 - 0x4f - [Playlist] - LoadSelectedIntoFirstStopped + [Channel1] + filterHigh + 0xB0 + 0x10 - - - - - 0xb0 - 0x1b - [Flanger] - lfoDepth + + [Channel2] + filterHigh + 0xB0 + 0x11 - + - 0xb0 - 0x1c - [Flanger] - lfoDelay + [Channel1] + filterMid + 0xB0 + 0x12 - + - 0xb0 - 0x1d - [Channel1] - pregain + [Channel2] + filterMid + 0xB0 + 0x13 - + - 0x90 - 0x3b [Channel1] - NumarkMixTrackPro.playbutton + filterLow + 0xB0 + 0x14 - + - 0x90 - 0x33 - [Channel1] - NumarkMixTrackPro.cuebutton + [Channel2] + filterLow + 0xB0 + 0x15 - + - 0x90 - 0x40 - [Channel1] - NumarkMixTrackPro.beatsync + [Master] + volume + 0xB0 + 0x17 - + - 0x90 - 0x4a - [Channel1] - NumarkMixTrackPro.playFromCue + [Channel2] + NumarkMixTrackPro.jogWheel + 0xB0 + 0x18 - - 0x90 - 0x65 [Channel1] - pfl + NumarkMixTrackPro.jogWheel + 0xB0 + 0x19 - + - 0x90 - 0x5C - [Channel1] - NumarkMixTrackPro.changeHotCue + [Playlist] + NumarkMixTrackPro.selectKnob + 0xB0 + 0x1A - 0x90 - 0x5B - [Channel1] - NumarkMixTrackPro.changeHotCue + [Flanger] + lfoDepth + 0xB0 + 0x1B - + - 0x90 - 0x5A - [Channel1] - NumarkMixTrackPro.changeHotCue + [Flanger] + lfoDelay + 0xB0 + 0x1C - + - - 0x90 - 0x59 [Channel1] - NumarkMixTrackPro.toggleDeleteKey + pregain + 0xB0 + 0x1D - + - 0xb0 - 0x10 - [Channel1] - filterHigh + [Flanger] + lfoDepth + 0xB0 + 0x1E - + - 0xb0 - 0x12 - [Channel1] - filterMid + [Flanger] + lfoDelay + 0xB0 + 0x1F - + - 0xb0 - 0x14 - [Channel1] - filterLow + [Channel2] + pregain + 0xB0 + 0x20 - + - - 0x90 - 0x61 [Channel1] - NumarkMixTrackPro.toggleManualLooping + NumarkMixTrackPro.cuebutton + 0x90 + 0x33 + [Channel2] + NumarkMixTrackPro.LoadTrack 0x90 - 0x53 - [Channel1] - NumarkMixTrackPro.loopIn + 0x34 - 0x90 - 0x54 [Channel1] - NumarkMixTrackPro.loopOut + NumarkMixTrackPro.playbutton + 0x90 + 0x3B + [Channel2] + NumarkMixTrackPro.cuebutton 0x90 - 0x55 + 0x3C + + + + + [Channel1] - NumarkMixTrackPro.reLoop + NumarkMixTrackPro.beatsync + 0x90 + 0x40 + [Channel2] + NumarkMixTrackPro.playbutton 0x90 - 0x4b - [Channel1] - NumarkMixTrackPro.LoadTrack + 0x42 - 0xb0 - 0x8 [Channel1] - volume + rate_temp_down + 0x90 + 0x43 - 0xb0 - 0xd [Channel1] - NumarkMixTrackPro.pitch + rate_temp_up + 0x90 + 0x44 - + + [Channel2] + rate_temp_down 0x90 - 0x44 - [Channel1] - rate_temp_up + 0x45 + [Channel2] + rate_temp_up 0x90 - 0x43 - [Channel1] - rate_temp_down + 0x46 - - + [Channel2] + NumarkMixTrackPro.beatsync 0x90 - 0x48 + 0x47 + + + + + [Channel1] NumarkMixTrackPro.toggleScratchMode + 0x90 + 0x48 - 0xb0 - 0x19 [Channel1] - NumarkMixTrackPro.jogWheel + NumarkMixTrackPro.playFromCue + 0x90 + 0x4A - 0x90 - 0x4e [Channel1] - NumarkMixTrackPro.wheelTouch + NumarkMixTrackPro.LoadTrack + 0x90 + 0x4B + [Channel2] + NumarkMixTrackPro.playFromCue 0x90 - 0x51 - [Channel1] - keylock + 0x4C - + + [Channel2] + NumarkMixTrackPro.wheelTouch 0x90 - 0x63 - [Channel1] - NumarkMixTrackPro.flanger + 0x4D - - - - - 0xb0 - 0x1e - [Flanger] - lfoDepth + + [Channel1] + NumarkMixTrackPro.wheelTouch + 0x90 + 0x4E - + - 0xb0 - 0x1f - [Flanger] - lfoDelay + [Playlist] + LoadSelectedIntoFirstStopped + 0x90 + 0x4F - + - 0xb0 - 0x20 [Channel2] - pregain + NumarkMixTrackPro.toggleScratchMode + 0x90 + 0x50 - - - - - 0x90 - 0x42 - [Channel2] - NumarkMixTrackPro.playbutton - - - - - - 0x90 - 0x3c - [Channel2] - NumarkMixTrackPro.cuebutton - - + + [Channel1] + keylock 0x90 - 0x47 - [Channel2] - NumarkMixTrackPro.beatsync + 0x51 - + - - 0x90 - 0x4C [Channel2] - NumarkMixTrackPro.playFromCue - - - - - - + keylock 0x90 - 0x66 - [Channel2] - pfl + 0x52 + [Channel1] + NumarkMixTrackPro.loopIn 0x90 - 0x60 - [Channel2] - NumarkMixTrackPro.changeHotCue + 0x53 + [Channel1] + NumarkMixTrackPro.loopOut 0x90 - 0x5f - [Channel2] - NumarkMixTrackPro.changeHotCue + 0x54 + [Channel1] + NumarkMixTrackPro.reLoop 0x90 - 0x5e - [Channel2] - NumarkMixTrackPro.changeHotCue + 0x55 - 0x90 - 0x5d [Channel2] - NumarkMixTrackPro.toggleDeleteKey + NumarkMixTrackPro.loopIn + 0x90 + 0x56 - 0xb0 - 0x11 [Channel2] - filterHigh + NumarkMixTrackPro.loopOut + 0x90 + 0x57 - + - 0xb0 - 0x13 [Channel2] - filterMid + NumarkMixTrackPro.reLoop + 0x90 + 0x58 - + - 0xb0 - 0x15 - [Channel2] - filterLow + [Channel1] + NumarkMixTrackPro.toggleDeleteKey + 0x90 + 0x59 - + + [Channel1] + NumarkMixTrackPro.changeHotCue 0x90 - 0x62 - [Channel2] - NumarkMixTrackPro.toggleManualLooping + 0x5A + [Channel1] + NumarkMixTrackPro.changeHotCue 0x90 - 0x56 - [Channel2] - NumarkMixTrackPro.loopIn + 0x5B + [Channel1] + NumarkMixTrackPro.changeHotCue 0x90 - 0x57 - [Channel2] - NumarkMixTrackPro.loopOut + 0x5C - + - 0x90 - 0x58 [Channel2] - NumarkMixTrackPro.reLoop + NumarkMixTrackPro.toggleDeleteKey + 0x90 + 0x5D - - 0x90 - 0x34 + [Channel2] - NumarkMixTrackPro.LoadTrack + NumarkMixTrackPro.changeHotCue + 0x90 + 0x5E - 0xb0 - 0x9 [Channel2] - volume + NumarkMixTrackPro.changeHotCue + 0x90 + 0x5F - + - 0xb0 - 0xe [Channel2] - NumarkMixTrackPro.pitch + NumarkMixTrackPro.changeHotCue + 0x90 + 0x60 + [Channel1] + NumarkMixTrackPro.toggleManualLooping 0x90 - 0x46 - [Channel2] - rate_temp_up + 0x61 - + - 0x90 - 0x45 [Channel2] - rate_temp_down + NumarkMixTrackPro.toggleManualLooping + 0x90 + 0x62 - + - - + [Channel1] + NumarkMixTrackPro.flanger 0x90 - 0x50 - [Channel2] - NumarkMixTrackPro.toggleScratchMode + 0x63 - - 0xb0 - 0x18 + [Channel2] - NumarkMixTrackPro.jogWheel + NumarkMixTrackPro.flanger + 0x90 + 0x64 - - + + [Channel1] + pfl 0x90 - 0x4D - [Channel2] - NumarkMixTrackPro.wheelTouch + 0x65 - + - - 0x90 - 0x52 + [Channel2] - keylock + pfl + 0x90 + 0x66 + [Playlist] + NumarkMixTrackPro.toggleDirectoryMode 0x90 - 0x64 - [Channel2] - NumarkMixTrackPro.flanger + 0x69 - - - - - - [Channel1] - play - - - - 0 - 0.1 - 0x90 - 0x3b - 0x0 - 0x64 - - - - [Channel1] - play - - - - 0 - 0.1 - 0x90 - 0x33 - 0x64 - 0x00 - - [Channel1] beatsync - - - - 0 - 0.1 0x90 0x40 - 0x0 + 0x00 0x64 + 0.1 - [Channel1] beatsync_tempo - - - - 0 - 0.1 0x90 0x40 - 0x0 + 0x00 0x64 + 0.1 - [Channel1] - pfl - - - - 0 - 0.1 + flanger 0x90 - 0x65 - 0x0 + 0x63 + 0x00 0x64 + 0.1 [Channel1] keylock - - - - 0 - 0.1 0x90 0x51 - 0x0 + 0x00 0x64 + 0.1 [Channel1] - flanger - - - - 0 - 0.1 + pfl 0x90 - 0x63 - 0x0 + 0x65 + 0x00 0x64 + 0.1 [Channel1] - rate - - - - -0.1 - 0.1 + play 0x90 - 0x70 + 0x33 0x64 - 0x0 + 0.1 - - - - [Channel2] + [Channel1] play - - - - 0 - 0.1 0x90 - 0x42 - 0x0 + 0x3B + 0x00 0x64 + 0.1 - - [Channel2] - play - - - - 0 - 0.1 + [Channel1] + rate 0x90 - 0x3c + 0x70 0x64 - 0x00 + 0.1 + -0.1 - [Channel2] beatsync - - - - 0 - 0.1 0x90 0x47 - 0x0 + 0x00 0x64 + 0.1 - [Channel2] beatsync_tempo - - - - 0 - 0.1 0x90 0x47 - 0x0 + 0x00 0x64 + 0.1 - [Channel2] - pfl - - - - 0 - 0.1 + flanger 0x90 - 0x66 - 0x0 + 0x64 + 0x00 0x64 + 0.1 [Channel2] keylock - - - - 0 - 0.1 0x90 0x52 - 0x0 + 0x00 0x64 + 0.1 [Channel2] - flanger - - - - 0 + pfl + 0x90 + 0x66 + 0x00 + 0x64 + 0.1 + + + [Channel2] + play + 0x90 + 0x3C + 0x64 0.1 + + + [Channel2] + play 0x90 - 0x64 - 0x0 + 0x42 + 0x00 0x64 + 0.1 - + [Channel2] rate - - - - -0.1 - 0.1 0x90 0x71 0x64 - 0x0 + 0.1 + -0.1 - + From 545605aa11622d947926d06f7290c6f1d9913908 Mon Sep 17 00:00:00 2001 From: vespadj Date: Sat, 25 Oct 2025 20:42:50 +0200 Subject: [PATCH 153/163] MixtrackPro: XML: upgrade v.1.2 > 2.5 High, Bass..., + Settings, + js fn. JS: eslint, Prettier, rm old [Flanger], deleteKey to shiftKey --- res/controllers/Numark Mixtrack Pro.midi.xml | 210 ++- .../Numark-Mixtrack-Pro-scripts.js | 1437 ++++++++++------- 2 files changed, 957 insertions(+), 690 deletions(-) diff --git a/res/controllers/Numark Mixtrack Pro.midi.xml b/res/controllers/Numark Mixtrack Pro.midi.xml index a801211ef0eb..0c643236a02e 100644 --- a/res/controllers/Numark Mixtrack Pro.midi.xml +++ b/res/controllers/Numark Mixtrack Pro.midi.xml @@ -6,6 +6,53 @@ version v2.5 (2025) https://mixxx.discourse.group/t/numark-mixtrack-pro-by-vespadj/32635 + + + + + + + + + + + + @@ -14,6 +61,7 @@ [Channel1] volume + [Channel1], volume 0xB0 0x08 @@ -23,6 +71,7 @@ [Channel2] volume + [Channel2], volume 0xB0 0x09 @@ -40,7 +89,7 @@ [Master] - headVolume + headGain 0xB0 0x0B @@ -58,7 +107,8 @@ [Channel1] - NumarkMixTrackPro.pitch + NumarkMixTrackPro.pitchFader + with softTakeover 0xB0 0x0D @@ -67,7 +117,8 @@ [Channel2] - NumarkMixTrackPro.pitch + NumarkMixTrackPro.pitchFader + with softTakeover 0xB0 0x0E @@ -75,8 +126,9 @@ - [Channel1] - filterHigh + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + High 0xB0 0x10 @@ -84,8 +136,9 @@ - [Channel2] - filterHigh + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + High 0xB0 0x11 @@ -94,25 +147,28 @@ [Channel1] - filterMid + NumarkMixTrackPro.mid + Mid 0xB0 0x12 - + [Channel2] - filterMid + NumarkMixTrackPro.mid + Mid 0xB0 0x13 - + - [Channel1] - filterLow + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + Low 0xB0 0x14 @@ -120,8 +176,9 @@ - [Channel2] - filterLow + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + Low 0xB0 0x15 @@ -130,7 +187,8 @@ [Master] - volume + gain + [Master],gain 0xB0 0x17 @@ -165,17 +223,17 @@ - [Flanger] - lfoDepth + [Channel1] + NumarkMixTrackPro.fxSelectKnobRotate 0xB0 0x1B - + - [Flanger] - lfoDelay + [EffectRack1_EffectUnit1_Effect1] + meta 0xB0 0x1C @@ -183,8 +241,8 @@ - [Channel1] - pregain + [EffectRack1_EffectUnit1] + mix 0xB0 0x1D @@ -192,17 +250,17 @@ - [Flanger] - lfoDepth + [EffectRack1_EffectUnit2_Effect1] + effect_selector 0xB0 0x1E - + - [Flanger] - lfoDelay + [EffectRack1_EffectUnit2_Effect1] + meta 0xB0 0x1F @@ -210,8 +268,8 @@ - [Channel2] - pregain + [EffectRack1_EffectUnit2] + mix 0xB0 0x20 @@ -274,38 +332,38 @@ [Channel1] - rate_temp_down + NumarkMixTrackPro.pitchBendMinus 0x90 0x43 - + [Channel1] - rate_temp_up + NumarkMixTrackPro.pitchBendPlus 0x90 0x44 - + [Channel2] - rate_temp_down + NumarkMixTrackPro.pitchBendMinus 0x90 0x45 - + [Channel2] - rate_temp_up + NumarkMixTrackPro.pitchBendPlus 0x90 0x46 - + @@ -373,11 +431,11 @@ [Playlist] - LoadSelectedIntoFirstStopped + NumarkMixTrackPro.onCentralKnobPress 0x90 0x4F - + @@ -463,7 +521,7 @@ [Channel1] - NumarkMixTrackPro.toggleDeleteKey + NumarkMixTrackPro.toggleShiftKey 0x90 0x59 @@ -499,7 +557,7 @@ [Channel2] - NumarkMixTrackPro.toggleDeleteKey + NumarkMixTrackPro.toggleShiftKey 0x90 0x5D @@ -552,21 +610,21 @@ - [Channel1] - NumarkMixTrackPro.flanger + [EffectRack1_EffectUnit1_Effect1] + enabled 0x90 0x63 - + - [Channel2] - NumarkMixTrackPro.flanger + [EffectRack1_EffectUnit2_Effect1] + enabled 0x90 0x64 - + @@ -587,6 +645,26 @@ + + [QuickEffectRack1_[Channel2]] + super1_set_default + was [EffectRack1_EffectUnit2_Effect1],clear + 0x90 + 0x67 + + + + + + [Channel1] + NumarkMixTrackPro.fxSelectKnobPress + was [EffectRack1_EffectUnit1_Effect1],clear + 0x90 + 0x68 + + + + [Playlist] NumarkMixTrackPro.toggleDirectoryMode @@ -616,15 +694,6 @@ 0x64 0.1 - - [Channel1] - flanger - 0x90 - 0x63 - 0x00 - 0x64 - 0.1 - [Channel1] keylock @@ -687,15 +756,6 @@ 0x64 0.1 - - [Channel2] - flanger - 0x90 - 0x64 - 0x00 - 0x64 - 0.1 - [Channel2] keylock @@ -740,6 +800,24 @@ 0.1 -0.1 + + [EffectRack1_EffectUnit1_Effect1] + enabled + 0x90 + 0x63 + 0x00 + 0x64 + 0.1 + + + [EffectRack1_EffectUnit2_Effect1] + enabled + 0x90 + 0x64 + 0x00 + 0x64 + 0.1 + diff --git a/res/controllers/Numark-Mixtrack-Pro-scripts.js b/res/controllers/Numark-Mixtrack-Pro-scripts.js index 1bbf23d5ec74..1655848e075b 100644 --- a/res/controllers/Numark-Mixtrack-Pro-scripts.js +++ b/res/controllers/Numark-Mixtrack-Pro-scripts.js @@ -3,6 +3,13 @@ // // 5/18/2011 - Changed by James Ralston // +// 3/11/2024 - Changed by Josh Patten // codespell:ignore patten +// 2025-04-19 - engine.softTakeover("[Channel1]", "rate", true); by vespadj +// - waveform_zoom _up _down: press hold and rotate FX Select Deck1 +// - Filter: PFL(cue) + Mid +// - Original "PITCH BEND" buttons remapped as beatjump_forward and beatjump_forward +// - Fast forward/rewind: hold beatjump_forward + jogWheel (or beatjump_backward) +// // Known Bugs: // Mixxx complains about an undefined variable on 1st load of the mapping (ignore it, then restart Mixxx) // Each slide/knob needs to be moved on Mixxx startup to match levels with the Mixxx UI @@ -13,8 +20,7 @@ // // ************* Script now is Only for 1.11.0 and above ************* // -// Delete + Effect: Brake Effect (maintain pressed). -// Flanger Delay (2nd knob of effect section): Adjust the speed of Brake. +// "Delete", aka "VIEW" and "TICK" buttons, used as [Shift]. // // Delete + Hotcues: Clear Hotcues (First press Delete, then Hotcue). // Delete + Reloop: Clear Loop. @@ -53,656 +59,839 @@ // Border of the wheels: Pitch Bend. // +/* eslint no-undef: "error" */ function NumarkMixTrackPro() {} -NumarkMixTrackPro.init = function(id) { // called when the MIDI device is opened & set up - NumarkMixTrackPro.id = id; // Store the ID of this device for later use - - NumarkMixTrackPro.directoryMode = false; - NumarkMixTrackPro.scratchMode = [false, false]; - NumarkMixTrackPro.manualLoop = [true, true]; - NumarkMixTrackPro.deleteKey = [false, false]; - NumarkMixTrackPro.isKeyLocked = [0, 0]; - NumarkMixTrackPro.touch = [false, false]; - NumarkMixTrackPro.scratchTimer = [-1, -1]; - - NumarkMixTrackPro.leds = [ - // Common - { "directory": 0x73, "file": 0x72 }, - // Deck 1 - { "rate": 0x70, "scratchMode": 0x48, "manualLoop": 0x61, - "loop_start_position": 0x53, "loop_end_position": 0x54, "reloop_exit": 0x55, - "deleteKey" : 0x59, "hotCue1" : 0x5a,"hotCue2" : 0x5b,"hotCue3" : 0x5c, - "stutter" : 0x4a, "Cue" : 0x33, "sync" : 0x40 - }, - // Deck 2 - { "rate": 0x71, "scratchMode": 0x50, "manualLoop": 0x62, - "loop_start_position": 0x56, "loop_end_position": 0x57, "reloop_exit": 0x58, - "deleteKey" : 0x5d, "hotCue1" : 0x5e, "hotCue2" : 0x5f, "hotCue3" : 0x60, - "stutter" : 0x4c, "Cue" : 0x3c, "sync" : 0x47 - } - ]; - - NumarkMixTrackPro.ledTimers = {}; - - NumarkMixTrackPro.LedTimer = function(id, led, count, state){ - this.id = id; - this.led = led; - this.count = count; - this.state = state; - } - - for (i=0x30; i<=0x73; i++) midi.sendShortMsg(0x90, i, 0x00); // Turn off all the lights - - NumarkMixTrackPro.hotCue = { - //Deck 1 - 0x5a:"1", 0x5b:"2", 0x5c:"3", - //Deck 2 - 0x5e: "1", 0x5f:"2", 0x60:"3" - }; - - //Add event listeners - for (var i=1; i<3; i++){ - for (var x=1; x<4; x++){ - engine.connectControl("[Channel" + i +"]", "hotcue_"+ x +"_enabled", "NumarkMixTrackPro.onHotCueChange"); - } - NumarkMixTrackPro.setLoopMode(i, false); - } - - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[0]["file"], true); - - -// Enable soft-takeover for Pitch slider - - engine.softTakeover("[Channel1]", "rate", true); - engine.softTakeover("[Channel2]", "rate", true); - - -// Clipping LED - engine.connectControl("[Channel1]","peak_indicator","NumarkMixTrackPro.Channel1Clip"); - engine.connectControl("[Channel2]","peak_indicator","NumarkMixTrackPro.Channel2Clip"); - -// Stutter beat light - engine.connectControl("[Channel1]","beat_active","NumarkMixTrackPro.Stutter1Beat"); - engine.connectControl("[Channel2]","beat_active","NumarkMixTrackPro.Stutter2Beat"); - - -} - - -NumarkMixTrackPro.Channel1Clip = function (value) { - NumarkMixTrackPro.clipLED(value,NumarkMixTrackPro.leds[1]["sync"]); - -} - -NumarkMixTrackPro.Channel2Clip = function (value) { - NumarkMixTrackPro.clipLED(value,NumarkMixTrackPro.leds[2]["sync"]); - -} - -NumarkMixTrackPro.Stutter1Beat = function (value) { - - var secondsBlink = 30; - var secondsToEnd = engine.getValue("[Channel1]", "duration") * (1-engine.getValue("[Channel1]", "playposition")); - - if (secondsToEnd < secondsBlink && secondsToEnd > 1 && engine.getValue("[Channel1]", "play")) { // The song is going to end - - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1]["Cue"], value); - } - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1]["stutter"], value); - -} - -NumarkMixTrackPro.Stutter2Beat = function (value) { - - var secondsBlink = 30; - var secondsToEnd = engine.getValue("[Channel2]", "duration") * (1-engine.getValue("[Channel2]", "playposition")); - - if (secondsToEnd < secondsBlink && secondsToEnd > 1 && engine.getValue("[Channel2]", "play")) { // The song is going to end - - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2]["Cue"], value); - } - - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2]["stutter"], value); - -} - -NumarkMixTrackPro.clipLED = function (value, note) { - - if (value>0) NumarkMixTrackPro.flashLED(note, 1); - -} - -NumarkMixTrackPro.shutdown = function(id) { // called when the MIDI device is closed - - // First Remove event listeners - for (var i=1; i<2; i++){ - for (var x=1; x<4; x++){ - engine.connectControl("[Channel" + i +"]", "hotcue_"+ x +"_enabled", "NumarkMixTrackPro.onHotCueChange", true); - } - NumarkMixTrackPro.setLoopMode(i, false); - } - - var lowestLED = 0x30; - var highestLED = 0x73; - for (var i=lowestLED; i<=highestLED; i++) { - NumarkMixTrackPro.setLED(i, false); // Turn off all the lights - } - -} +NumarkMixTrackPro.init = function(id) { + // called when the MIDI device is opened & set up + + // Store the ID of this device for later use + NumarkMixTrackPro.id = id; + + NumarkMixTrackPro.directoryMode = false; + NumarkMixTrackPro.scratchMode = [false, false]; + NumarkMixTrackPro.manualLoop = [true, true]; + NumarkMixTrackPro.shiftKey = [false, false]; + NumarkMixTrackPro.isKeyLocked = [0, 0]; + NumarkMixTrackPro.touch = [false, false]; + NumarkMixTrackPro.scratchTimer = [-1, -1]; + + NumarkMixTrackPro.leds = [ + // Common + {directory: 0x73, file: 0x72}, + // Deck 1 + { + effect: 0x63, + headphone: 0x65, + rate: 0x70, + scratchMode: 0x48, + manualLoop: 0x61, + keylock: 0x51, + loopStartPosition: 0x53, + loopEndPosition: 0x54, + reloopExit: 0x55, + shiftKey: 0x59, + hotCue1: 0x5a, + hotCue2: 0x5b, + hotCue3: 0x5c, + stutter: 0x4a, + Cue: 0x33, + sync: 0x40, + }, + // Deck 2 + { + effect: 0x64, + headphone: 0x66, + rate: 0x71, + scratchMode: 0x50, + manualLoop: 0x62, + keylock: 0x52, + loopStartPosition: 0x56, + loopEndPosition: 0x57, + reloopExit: 0x58, + shiftKey: 0x5d, + hotCue1: 0x5e, + hotCue2: 0x5f, + hotCue3: 0x60, + stutter: 0x4c, + Cue: 0x3c, + sync: 0x47, + }, + ]; + + NumarkMixTrackPro.ledTimers = {}; + + NumarkMixTrackPro.LedTimer = function(id, led, count, state) { + this.id = id; + this.led = led; + this.count = count; + this.state = state; + }; + + for (let i = 0x30; i <= 0x73; i++) { + midi.sendShortMsg(0x90, i, 0x00); + } // Turn off all the lights + + NumarkMixTrackPro.hotCue = { + //Deck 1 + 0x5a: "1", + 0x5b: "2", + 0x5c: "3", + //Deck 2 + 0x5e: "1", + 0x5f: "2", + 0x60: "3", + }; + + //Add event listeners + for (let i = 1; i < 3; i++) { + for (let x = 1; x < 4; x++) { + engine.makeConnection( + `[Channel${i}]`, + `hotcue_${x}_status`, + NumarkMixTrackPro.onHotCueChange + ); + } + NumarkMixTrackPro.setLoopMode(i, false); + } + + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[0].file, true); + + // Enable soft-takeover for Pitch slider + engine.softTakeover("[Channel1]", "rate", true); + engine.softTakeover("[Channel2]", "rate", true); + + // Clipping LED + engine.makeConnection( + "[Channel1]", + "peak_indicator", + NumarkMixTrackPro.Channel1Clip + ); + engine.makeConnection( + "[Channel2]", + "peak_indicator", + NumarkMixTrackPro.Channel2Clip + ); + + // Stutter beat light + engine.makeConnection( + "[Channel1]", + "beat_active", + NumarkMixTrackPro.Stutter1Beat + ); + engine.makeConnection( + "[Channel2]", + "beat_active", + NumarkMixTrackPro.Stutter2Beat + ); +}; + +NumarkMixTrackPro.Channel1Clip = function(value) { + NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[1].sync); +}; + +NumarkMixTrackPro.Channel2Clip = function(value) { + NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[2].sync); +}; + +NumarkMixTrackPro.Stutter1Beat = function(value) { + const secondsBlink = 30; + const secondsToEnd = + engine.getValue("[Channel1]", "duration") * + (1 - engine.getValue("[Channel1]", "playposition")); + + if ( + secondsToEnd < secondsBlink && + secondsToEnd > 1 && + engine.getValue("[Channel1]", "play") + ) { + // The song is going to end + + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1].Cue, value); + } + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1].stutter, value); +}; + +NumarkMixTrackPro.Stutter2Beat = function(value) { + const secondsBlink = 30; + const secondsToEnd = + engine.getValue("[Channel2]", "duration") * + (1 - engine.getValue("[Channel2]", "playposition")); + + if ( + secondsToEnd < secondsBlink && + secondsToEnd > 1 && + engine.getValue("[Channel2]", "play") + ) { + // The song is going to end + + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2].Cue, value); + } + + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2].stutter, value); +}; + +NumarkMixTrackPro.clipLED = function(value, note) { + if (value > 0) { + NumarkMixTrackPro.flashLED(note, 1); + } else { + NumarkMixTrackPro.setLED(note, value); + } +}; + +NumarkMixTrackPro.shutdown = function() { + // called when the MIDI device is closed + + // First Remove event listeners + for (let i = 1; i < 2; i++) { + for (let x = 1; x < 4; x++) { + engine.connectControl( + `[Channel${i}]`, + `hotcue_${x}_enabled`, + "NumarkMixTrackPro.onHotCueChange", + true + ); + } + NumarkMixTrackPro.setLoopMode(i, false); + } + + const lowestLED = 0x30; + const highestLED = 0x73; + for (let i = lowestLED; i <= highestLED; i++) { + NumarkMixTrackPro.setLED(i, false); // Turn off all the lights + } +}; NumarkMixTrackPro.samplesPerBeat = function(group) { - // FIXME: Get correct samplerate and channels for current deck - var sampleRate = 44100; - var channels = 2; - var bpm = engine.getValue(group, "file_bpm"); - return channels * sampleRate * 60 / bpm; -} + // FIXME: Get correct samplerate and channels for current deck + const sampleRate = 44100; + const channels = 2; + const bpm = engine.getValue(group, "file_bpm"); + return (channels * sampleRate * 60) / bpm; +}; NumarkMixTrackPro.groupToDeck = function(group) { + const matches = group.match(/^\[Channel(\d+)\]$/); - var matches = group.match(/^\[Channel(\d+)\]$/); - - if (matches == null) { - return -1; - } else { - return matches[1]; - } - -} + if (matches === null) { + return -1; + } else { + return matches[1]; + } +}; NumarkMixTrackPro.setLED = function(value, status) { - - status = status ? 0x64 : 0x00; - midi.sendShortMsg(0x90, value, status); -} - -NumarkMixTrackPro.flashLED = function (led, veces){ - var ndx = Math.random(); - var id = engine.beginTimer(120, NumarkMixTrackPro.doFlash(ndx, veces)); - NumarkMixTrackPro.ledTimers[ndx] = new NumarkMixTrackPro.LedTimer(id, led, 0, false); -} - -NumarkMixTrackPro.doFlash = function(ndx, veces){ - var ledTimer = NumarkMixTrackPro.ledTimers[ndx]; - - if (!ledTimer) return; - - if (ledTimer.count > veces){ // how many times blink the button - engine.stopTimer(ledTimer.id); - delete NumarkMixTrackPro.ledTimers[ndx]; - } else{ - ledTimer.count++; - ledTimer.state = !ledTimer.state; - NumarkMixTrackPro.setLED(ledTimer.led, ledTimer.state); - } -} - -NumarkMixTrackPro.selectKnob = function(channel, control, value, status, group) { - if (value > 63) { - value = value - 128; - } - if (NumarkMixTrackPro.directoryMode) { - if (value > 0) { - for (var i = 0; i < value; i++) { - engine.setValue(group, "SelectNextPlaylist", 1); - } - } else { - for (var i = 0; i < -value; i++) { - engine.setValue(group, "SelectPrevPlaylist", 1); - } - } - } else { - engine.setValue(group, "SelectTrackKnob", value); - - } -} - -NumarkMixTrackPro.LoadTrack = function(channel, control, value, status, group) { - - // Load the selected track in the corresponding deck only if the track is paused - - if(value && engine.getValue(group, "play") != 1) - { - engine.setValue(group, "LoadSelectedTrack", 1); - - // cargar el tema con el pitch en 0 - engine.softTakeover(group, "rate", false); - engine.setValue(group, "rate", 0); - engine.softTakeover(group, "rate", true); - } - else engine.setValue(group, "LoadSelectedTrack", 0); - -} - -NumarkMixTrackPro.flanger = function(channel, control, value, status, group) { - -// if (!value) return; - - var deck = NumarkMixTrackPro.groupToDeck(group); - - var speed = 1; - - if(NumarkMixTrackPro.deleteKey[deck-1]){ - - // Delete + Effect = Brake - -// print ("Delay: " + engine.getValue("[Flanger]","lfoDelay")); - - if (engine.getValue("[Flanger]","lfoDelay") < 5026) { - - speed = engine.getValue("[Flanger]","lfoDelay") / 5025; - - if (speed < 0) speed = 0; - - } else { - - speed = (engine.getValue("[Flanger]","lfoDelay") - 5009)/ 16,586666667 - - if (speed > 300) speed = 300; - } - -// print ("Speed: " + speed); - - engine.brake(deck, value, speed); - - if (!value) NumarkMixTrackPro.toggleDeleteKey(channel, control, 1, status, group); - - } else { - if (!value) return; - if (engine.getValue(group, "flanger")) { - engine.setValue(group, "flanger", 0); - }else{ - engine.setValue(group, "flanger", 1); - } - } - -} - - -NumarkMixTrackPro.cuebutton = function(channel, control, value, status, group) { - - - // Don't set Cue accidentally at the end of the song - if (engine.getValue(group, "playposition") <= 0.97) { - engine.setValue(group, "cue_default", value ? 1 : 0); - } else { - engine.setValue(group, "cue_preview", value ? 1 : 0); - } - -} + status = status ? 0x64 : 0x00; + midi.sendShortMsg(0x90, value, status); +}; + +NumarkMixTrackPro.flashLED = function(led, veces) { + const ndx = Math.random(); + const id = engine.beginTimer(120, NumarkMixTrackPro.doFlash(ndx, veces)); + NumarkMixTrackPro.ledTimers[ndx] = new NumarkMixTrackPro.LedTimer( + id, + led, + 0, + false + ); +}; + +NumarkMixTrackPro.doFlash = function(ndx, veces) { + const ledTimer = NumarkMixTrackPro.ledTimers[ndx]; + + if (!ledTimer) { + return; + } + + if (ledTimer.count > veces) { + // how many times blink the button + engine.stopTimer(ledTimer.id); + delete NumarkMixTrackPro.ledTimers[ndx]; + } else { + ledTimer.count++; + ledTimer.state = !ledTimer.state; + NumarkMixTrackPro.setLED(ledTimer.led, ledTimer.state); + } +}; + +NumarkMixTrackPro.selectKnob = function( + channel, + control, + value, + status, + group +) { + if (value > 63) { + value = value - 128; + } + if (NumarkMixTrackPro.directoryMode) { + if (value > 0) { + for (let i = 0; i < value; i++) { + engine.setParameter(group, "SelectNextPlaylist", 1); + } + } else { + for (let i = 0; i < -value; i++) { + engine.setParameter(group, "SelectPrevPlaylist", 1); + } + } + } else { + engine.setParameter(group, "SelectTrackKnob", value); + } +}; + +NumarkMixTrackPro.LoadTrack = function( + channel, + control, + value, + status, + group +) { + // Load the selected track in the corresponding deck only if the track is paused + + if (value && engine.getValue(group, "play") !== 1) { + engine.setValue(group, "LoadSelectedTrack", 1); + + // cargar el tema con el pitch en 0 + engine.softTakeover(group, "rate", false); + engine.setValue(group, "rate", 0); + engine.softTakeover(group, "rate", true); + } else { + engine.setValue(group, "LoadSelectedTrack", 0); + } +}; + +NumarkMixTrackPro.cuebutton = function( + channel, + control, + value, + status, + group +) { + // Don't set Cue accidentally at the end of the song + if (engine.getValue(group, "playposition") <= 0.97) { + engine.setValue(group, "cue_default", value ? 1 : 0); + } else { + engine.setValue(group, "cue_preview", value ? 1 : 0); + } +}; NumarkMixTrackPro.beatsync = function(channel, control, value, status, group) { - - var deck = NumarkMixTrackPro.groupToDeck(group); - - if(NumarkMixTrackPro.deleteKey[deck-1]){ - - // Delete + SYNC = vuelve pitch a 0 - engine.softTakeover(group, "rate", false); - engine.setValue(group, "rate", 0); - engine.softTakeover(group, "rate", true); - - NumarkMixTrackPro.toggleDeleteKey(channel, control, value, status, group); - - } else { - - if (deck == 1) { - // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) - if(!engine.getValue("[Channel2]", "play")) { - engine.setValue(group, "beatsync_tempo", value ? 1 : 0); - } else { - engine.setValue(group, "beatsync", value ? 1 : 0); - } - } - - if (deck == 2) { - // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) - if(!engine.getValue("[Channel1]", "play")) { - engine.setValue(group, "beatsync_tempo", value ? 1 : 0); - } else { - engine.setValue(group, "beatsync", value ? 1 : 0); - } - } - } -} - - -NumarkMixTrackPro.playbutton = function(channel, control, value, status, group) { - - if (!value) return; - - var deck = NumarkMixTrackPro.groupToDeck(group); - - if (engine.getValue(group, "play")) { - engine.setValue(group, "play", 0); - }else{ - engine.setValue(group, "play", 1); - } - -} - + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (NumarkMixTrackPro.shiftKey[deck - 1]) { + // Delete + SYNC = vuelve pitch a 0 + engine.softTakeover(group, "rate", false); + engine.setValue(group, "rate", 0); + engine.softTakeover(group, "rate", true); + + NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); + } else { + if (deck === 1) { + // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) + if (!engine.getValue("[Channel2]", "play")) { + engine.setValue(group, "beatsync_tempo", value ? 1 : 0); + } else { + engine.setValue(group, "beatsync", value ? 1 : 0); + } + } + + if (deck === 2) { + // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) + if (!engine.getValue("[Channel1]", "play")) { + engine.setValue(group, "beatsync_tempo", value ? 1 : 0); + } else { + engine.setValue(group, "beatsync", value ? 1 : 0); + } + } + } +}; + +NumarkMixTrackPro.playbutton = function( + channel, + control, + value, + status, + group +) { + if (!value) { + return; + } + + // var deck = NumarkMixTrackPro.groupToDeck(group); + + if (engine.getValue(group, "play")) { + engine.setValue(group, "play", 0); + } else { + engine.setValue(group, "play", 1); + } +}; NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { - var deck = NumarkMixTrackPro.groupToDeck(group); - - if (NumarkMixTrackPro.manualLoop[deck-1]){ - if (!value) return; - // Act like the Mixxx UI - engine.setValue(group, "loop_in", status?1:0); - return; - } - - // Auto Loop: 1/2 loop size - var start = engine.getValue(group, "loop_start_position"); - var end = engine.getValue(group, "loop_end_position"); - if (start<0 || end<0) { - NumarkMixTrackPro.flashLED(NumarkMixTrackPro.leds[deck]["loop_start_position"], 4); - return; - } - - if (value){ - var start = engine.getValue(group, "loop_start_position"); - var end = engine.getValue(group, "loop_end_position"); - var len = (end - start) / 2; - engine.setValue(group, "loop_end_position", start + len); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["loop_start_position"], true); - } else { - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["loop_start_position"], false); - } -} + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (NumarkMixTrackPro.manualLoop[deck - 1]) { + if (!value) { + return; + } + // Act like the Mixxx UI + engine.setValue(group, "loop_in", status ? 1 : 0); + return; + } + + // Auto Loop: 1/2 loop size + const start = engine.getValue(group, "loop_start_position"); + const end = engine.getValue(group, "loop_end_position"); + if (start < 0 || end < 0) { + NumarkMixTrackPro.flashLED( + NumarkMixTrackPro.leds[deck].loopStartPosition, + 4 + ); + return; + } + + if (value) { + const start = engine.getValue(group, "loop_start_position"); + const end = engine.getValue(group, "loop_end_position"); + const len = (end - start) / 2; + engine.setValue(group, "loop_end_position", start + len); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopStartPosition, + true + ); + } else { + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopStartPosition, + false + ); + } +}; NumarkMixTrackPro.loopOut = function(channel, control, value, status, group) { - var deck = NumarkMixTrackPro.groupToDeck(group); - - if (!value) return; - - if (NumarkMixTrackPro.manualLoop[deck-1]){ - // Act like the Mixxx UI - engine.setValue(group, "loop_out", status?1:0); - return; - } - - var isLoopActive = engine.getValue(group, "loop_enabled"); - - // Set a 4 beat auto loop or exit the loop - - if(!isLoopActive){ - engine.setValue(group,"beatloop_4",1); - }else{ - engine.setValue(group,"beatloop_4",0); - } - -} - -NumarkMixTrackPro.repositionHack = function(group, oldPosition){ - // see if the value has been updated - if (engine.getValue(group, "loop_start_position")==oldPosition){ - if (NumarkMixTrackPro.hackCount[group]++ < 9){ - engine.beginTimer(20, "NumarkMixTrackPro.repositionHack('" + group + "', " + oldPosition + ")", true); - } else { - var deck = NumarkMixTrackPro.groupToDeck(group); - NumarkMixTrackPro.flashLED(NumarkMixTrackPro.leds[deck]["loop_start_position"], 4); - } - return; - } - var bar = NumarkMixTrackPro.samplesPerBeat(group); - var start = engine.getValue(group, "loop_start_position"); - engine.setValue(group,"loop_end_position", start + bar); -} + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (!value) { + return; + } + + if (NumarkMixTrackPro.manualLoop[deck - 1]) { + // Act like the Mixxx UI + engine.setValue(group, "loop_out", status ? 1 : 0); + return; + } + + const isLoopActive = engine.getValue(group, "loop_enabled"); + + // Set a 4 beat auto loop or exit the loop + + if (!isLoopActive) { + engine.setValue(group, "beatloop_4", 1); + } else { + engine.setValue(group, "beatloop_4", 0); + } +}; + +NumarkMixTrackPro.repositionHack = function(group, oldPosition) { + // see if the value has been updated + if (engine.getValue(group, "loop_start_position") === oldPosition) { + if (NumarkMixTrackPro.hackCount[group]++ < 9) { + engine.beginTimer( + 20, + `NumarkMixTrackPro.repositionHack('${group}', ${oldPosition})`, + true + ); + } else { + const deck = NumarkMixTrackPro.groupToDeck(group); + NumarkMixTrackPro.flashLED( + NumarkMixTrackPro.leds[deck].loopStartPosition, + 4 + ); + } + return; + } + const bar = NumarkMixTrackPro.samplesPerBeat(group); + const start = engine.getValue(group, "loop_start_position"); + engine.setValue(group, "loop_end_position", start + bar); +}; NumarkMixTrackPro.reLoop = function(channel, control, value, status, group) { - var deck = NumarkMixTrackPro.groupToDeck(group); - - if (NumarkMixTrackPro.manualLoop[deck-1]){ - // Act like the Mixxx UI (except for working delete) - if (!value) return; - if (NumarkMixTrackPro.deleteKey[deck-1]){ - engine.setValue(group, "reloop_exit", 0); - engine.setValue(group, "loop_start_position", -1); - engine.setValue(group, "loop_end_position", -1); - NumarkMixTrackPro.toggleDeleteKey(channel, control, value, status, group); - } else { - engine.setValue(group, "reloop_exit", status?1:0); - } - return; - } - - // Auto Loop: Double Loop Size - var start = engine.getValue(group, "loop_start_position"); - var end = engine.getValue(group, "loop_end_position"); - if (start<0 || end<0) { - NumarkMixTrackPro.flashLED(NumarkMixTrackPro.leds[deck]["reloop_exit"], 4); - return; - } - - if (value){ - var len = (end - start) * 2; - engine.setValue(group, "loop_end_position", start + len); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["reloop_exit"], true); - } else { - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["reloop_exit"], false); - } -} + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (NumarkMixTrackPro.manualLoop[deck - 1]) { + // Act like the Mixxx UI (except for working delete) + if (!value) { + return; + } + if (NumarkMixTrackPro.shiftKey[deck - 1]) { + engine.setValue(group, "reloop_exit", 0); + engine.setValue(group, "loop_start_position", -1); + engine.setValue(group, "loop_end_position", -1); + NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); + } else { + engine.setValue(group, "reloop_exit", status ? 1 : 0); + } + return; + } + + // Auto Loop: Double Loop Size + const start = engine.getValue(group, "loop_start_position"); + const end = engine.getValue(group, "loop_end_position"); + if (start < 0 || end < 0) { + NumarkMixTrackPro.flashLED(NumarkMixTrackPro.leds[deck].reloopExit, 4); + return; + } + + if (value) { + const len = (end - start) * 2; + engine.setValue(group, "loop_end_position", start + len); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, true); + } else { + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, false); + } +}; NumarkMixTrackPro.setLoopMode = function(deck, manual) { - - NumarkMixTrackPro.manualLoop[deck-1] = manual; - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["manualLoop"], !manual); - engine.connectControl("[Channel" + deck + "]", "loop_start_position", "NumarkMixTrackPro.onLoopChange", !manual); - engine.connectControl("[Channel" + deck + "]", "loop_end_position", "NumarkMixTrackPro.onLoopChange", !manual); - engine.connectControl("[Channel" + deck + "]", "loop_enabled", "NumarkMixTrackPro.onReloopExitChange", !manual); - engine.connectControl("[Channel" + deck + "]", "loop_enabled", "NumarkMixTrackPro.onReloopExitChangeAuto", manual); - - var group = "[Channel" + deck + "]" - if (manual){ - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["loop_start_position"], engine.getValue(group, "loop_start_position")>-1); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["loop_end_position"], engine.getValue(group, "loop_end_position")>-1); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["reloop_exit"], engine.getValue(group, "loop_enabled")); - }else{ - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["loop_start_position"], false); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["loop_end_position"], engine.getValue(group, "loop_enabled")); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["reloop_exit"], false); - } -} - -NumarkMixTrackPro.toggleManualLooping = function(channel, control, value, status, group) { - if (!value) return; - - var deck = NumarkMixTrackPro.groupToDeck(group); - - if(NumarkMixTrackPro.deleteKey[deck-1]){ - // activar o desactivar quantize - - if (engine.getValue(group, "quantize")) { - engine.setValue(group, "quantize", 0); - }else{ - engine.setValue(group, "quantize", 1); - } - - NumarkMixTrackPro.toggleDeleteKey(channel, control, value, status, group); - } else { - - NumarkMixTrackPro.setLoopMode(deck, !NumarkMixTrackPro.manualLoop[deck-1]); - } -} - -NumarkMixTrackPro.onLoopChange = function(value, group, key){ - var deck = NumarkMixTrackPro.groupToDeck(group); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck][key], value>-1? true : false); -} - -NumarkMixTrackPro.onReloopExitChange = function(value, group, key){ - var deck = NumarkMixTrackPro.groupToDeck(group); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]['reloop_exit'], value); -} - -NumarkMixTrackPro.onReloopExitChangeAuto = function(value, group, key){ - var deck = NumarkMixTrackPro.groupToDeck(group); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]['loop_end_position'], value); -} + NumarkMixTrackPro.manualLoop[deck - 1] = manual; + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].manualLoop, !manual); + engine.connectControl( + `[Channel${deck}]`, + "loop_start_position", + "NumarkMixTrackPro.onLoopChange", + !manual + ); + engine.connectControl( + `[Channel${deck}]`, + "loop_end_position", + "NumarkMixTrackPro.onLoopChange", + !manual + ); + engine.connectControl( + `[Channel${deck}]`, + "loop_enabled", + "NumarkMixTrackPro.onReloopExitChange", + !manual + ); + engine.connectControl( + `[Channel${deck}]`, + "loop_enabled", + "NumarkMixTrackPro.onReloopExitChangeAuto", + manual + ); + + const group = `[Channel${deck}]`; + if (manual) { + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopStartPosition, + engine.getValue(group, "loop_start_position") > -1 + ); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopEndPosition, + engine.getValue(group, "loop_end_position") > -1 + ); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].reloopExit, + engine.getValue(group, "loop_enabled") + ); + } else { + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopStartPosition, + false + ); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopEndPosition, + engine.getValue(group, "loop_enabled") + ); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, false); + } +}; + +NumarkMixTrackPro.toggleManualLooping = function( + channel, + control, + value, + status, + group +) { + if (!value) { + return; + } + + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (NumarkMixTrackPro.shiftKey[deck - 1]) { + // activar o desactivar quantize + + if (engine.getValue(group, "quantize")) { + engine.setValue(group, "quantize", 0); + } else { + engine.setValue(group, "quantize", 1); + } + + NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); + } else { + NumarkMixTrackPro.setLoopMode( + deck, + !NumarkMixTrackPro.manualLoop[deck - 1] + ); + } +}; + +NumarkMixTrackPro.onLoopChange = function(value, group, key) { + const deck = NumarkMixTrackPro.groupToDeck(group); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck][key], value > -1); +}; + +NumarkMixTrackPro.onReloopExitChange = function(value, group) { + const deck = NumarkMixTrackPro.groupToDeck(group); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, value); +}; + +NumarkMixTrackPro.onReloopExitChangeAuto = function(value, group) { + const deck = NumarkMixTrackPro.groupToDeck(group); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].loopEndPosition, value); +}; // Stutters adjust BeatGrid -NumarkMixTrackPro.playFromCue = function(channel, control, value, status, group) { - - var deck = NumarkMixTrackPro.groupToDeck(group); - - if (engine.getValue(group, "beats_translate_curpos")){ - - engine.setValue(group, "beats_translate_curpos", 0); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["stutter"], 0); - }else{ - engine.setValue(group, "beats_translate_curpos", 1); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["stutter"], 1); - } - -} +NumarkMixTrackPro.playFromCue = function( + channel, + control, + value, + status, + group +) { + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (engine.getValue(group, "beats_translate_curpos")) { + engine.setValue(group, "beats_translate_curpos", 0); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, 0); + } else { + engine.setValue(group, "beats_translate_curpos", 1); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, 1); + } +}; NumarkMixTrackPro.pitch = function(channel, control, value, status, group) { - var deck = NumarkMixTrackPro.groupToDeck(group); - - var pitch_value = 0; + const deck = NumarkMixTrackPro.groupToDeck(group); - if (value < 64) pitch_value = (value-64) /64; - if (value > 64) pitch_value = (value-64) /63; + let pitchValue = 0; - engine.setValue("[Channel"+deck+"]","rate",pitch_value); -} + if (value < 64) { + pitchValue = (value - 64) / 64; + } + if (value > 64) { + pitchValue = (value - 64) / 63; + } + engine.setValue(`[Channel${deck}]`, "rate", pitchValue); +}; NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { - var deck = NumarkMixTrackPro.groupToDeck(group); - -// if (!NumarkMixTrackPro.touch[deck-1] && !engine.getValue(group, "play")) return; - - var adjustedJog = parseFloat(value); - var posNeg = 1; - if (adjustedJog > 63) { // Counter-clockwise - posNeg = -1; - adjustedJog = value - 128; - } - - if (engine.getValue(group, "play")) { - - if (NumarkMixTrackPro.scratchMode[deck-1] && posNeg == -1 && !NumarkMixTrackPro.touch[deck-1]) { - - if (NumarkMixTrackPro.scratchTimer[deck-1] != -1) engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck-1]); - NumarkMixTrackPro.scratchTimer[deck-1] = engine.beginTimer(20, () => {NumarkMixTrackPro.jogWheelStopScratch(deck); }, true); - } - - } else { // stop scratching - - if (!NumarkMixTrackPro.touch[deck-1]){ - - if (NumarkMixTrackPro.scratchTimer[deck-1] != -1) engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck-1]); - NumarkMixTrackPro.scratchTimer[deck-1] = engine.beginTimer(20, () => { NumarkMixTrackPro.jogWheelStopScratch(); }, true); - } - - } - - engine.scratchTick(deck, adjustedJog); - - if (engine.getValue(group,"play")) { - var gammaInputRange = 13; // Max jog speed - var maxOutFraction = 0.8; // Where on the curve it should peak; 0.5 is half-way - var sensitivity = 0.5; // Adjustment gamma - var gammaOutputRange = 2; // Max rate change - - adjustedJog = posNeg * gammaOutputRange * Math.pow(Math.abs(adjustedJog) / (gammaInputRange * maxOutFraction), sensitivity); - engine.setValue(group, "jog", adjustedJog); - } - -} - + const deck = NumarkMixTrackPro.groupToDeck(group); + + // if (!NumarkMixTrackPro.touch[deck-1] && !engine.getValue(group, "play")) return; + + let adjustedJog = parseFloat(value); + let posNeg = 1; + if (adjustedJog > 63) { + // Counter-clockwise + posNeg = -1; + adjustedJog = value - 128; + } + + if (engine.getValue(group, "play")) { + if ( + NumarkMixTrackPro.scratchMode[deck - 1] && + posNeg === -1 && + !NumarkMixTrackPro.touch[deck - 1] + ) { + if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { + engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + } + NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( + 20, + () => { + NumarkMixTrackPro.jogWheelStopScratch(deck); + }, + true + ); + } + } else { + // stop scratching + + if (!NumarkMixTrackPro.touch[deck - 1]) { + if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { + engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + } + NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( + 20, + () => { + NumarkMixTrackPro.jogWheelStopScratch(); + }, + true + ); + } + } + + engine.scratchTick(deck, adjustedJog); + + if (engine.getValue(group, "play")) { + const gammaInputRange = 13; // Max jog speed + const maxOutFraction = 0.8; // Where on the curve it should peak; 0.5 is half-way + const sensitivity = 0.5; // Adjustment gamma + const gammaOutputRange = 2; // Max rate change + + adjustedJog = + posNeg * + gammaOutputRange * + Math.pow( + Math.abs(adjustedJog) / (gammaInputRange * maxOutFraction), + sensitivity + ); + engine.setValue(group, "jog", adjustedJog); + } +}; NumarkMixTrackPro.jogWheelStopScratch = function(deck) { - NumarkMixTrackPro.scratchTimer[deck-1] = -1; - engine.scratchDisable(deck); -} - -NumarkMixTrackPro.wheelTouch = function(channel, control, value, status, group){ - - var deck = NumarkMixTrackPro.groupToDeck(group); - - if(!value){ - - NumarkMixTrackPro.touch[deck-1]= false; - -// paro el timer (si no existe da error mmmm) y arranco un nuevo timer. -// Si en 20 milisegundos no se mueve el plato, desactiva el scratch - - if (NumarkMixTrackPro.scratchTimer[deck-1] != -1) engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck-1]); - - NumarkMixTrackPro.scratchTimer[deck-1] = engine.beginTimer(20, () => { NumarkMixTrackPro.jogWheelStopScratch(deck); }, true); - - } else { - - // if playing and scratch mode is disabled, do nothing on press - if (!NumarkMixTrackPro.scratchMode[deck-1] && engine.getValue(group, "play")) return; - - if (NumarkMixTrackPro.scratchTimer[deck-1] != -1) engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck-1]); - - // change the 600 value for sensibility - engine.scratchEnable(deck, 600, 33+1/3, 1.0/8, (1.0/8)/32); - - NumarkMixTrackPro.touch[deck-1]= true; - } -} - -NumarkMixTrackPro.toggleDirectoryMode = function(channel, control, value, status, group) { - // Toggle setting and light - if (value) { - NumarkMixTrackPro.directoryMode = !NumarkMixTrackPro.directoryMode; - - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[0]["directory"], NumarkMixTrackPro.directoryMode); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[0]["file"], !NumarkMixTrackPro.directoryMode); - } -} - -NumarkMixTrackPro.toggleScratchMode = function(channel, control, value, status, group) { - if (!value) return; - - var deck = NumarkMixTrackPro.groupToDeck(group); - // Toggle setting and light - NumarkMixTrackPro.scratchMode[deck-1] = !NumarkMixTrackPro.scratchMode[deck-1]; - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["scratchMode"], NumarkMixTrackPro.scratchMode[deck-1]); -} - - -NumarkMixTrackPro.onHotCueChange = function(value, group, key){ - var deck = NumarkMixTrackPro.groupToDeck(group); - var hotCueNum = key[7]; - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["hotCue" + hotCueNum], value ? true : false); -} - -NumarkMixTrackPro.changeHotCue = function(channel, control, value, status, group){ - - var deck = NumarkMixTrackPro.groupToDeck(group); - var hotCue = NumarkMixTrackPro.hotCue[control]; - - // onHotCueChange called automatically - if(NumarkMixTrackPro.deleteKey[deck-1]){ - if (engine.getValue(group, "hotcue_" + hotCue + "_enabled")){ - engine.setValue(group, "hotcue_" + hotCue + "_clear", 1); - } - NumarkMixTrackPro.toggleDeleteKey(channel, control, value, status, group); - } else { - if (value) { - engine.setValue(group, "hotcue_" + hotCue + "_activate", 1); - - }else{ - - engine.setValue(group, "hotcue_" + hotCue + "_activate", 0); - } - } -} - - -NumarkMixTrackPro.toggleDeleteKey = function(channel, control, value, status, group){ - if (!value) return; - - var deck = NumarkMixTrackPro.groupToDeck(group); - NumarkMixTrackPro.deleteKey[deck-1] = !NumarkMixTrackPro.deleteKey[deck-1]; - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck]["deleteKey"], NumarkMixTrackPro.deleteKey[deck-1]); -} + NumarkMixTrackPro.scratchTimer[deck - 1] = -1; + engine.scratchDisable(deck); +}; + +NumarkMixTrackPro.wheelTouch = function( + channel, + control, + value, + status, + group +) { + const deck = NumarkMixTrackPro.groupToDeck(group); + + if (!value) { + NumarkMixTrackPro.touch[deck - 1] = false; + + // paro el timer (si no existe da error mmmm) y arranco un nuevo timer. + // Si en 20 milisegundos no se mueve el plato, desactiva el scratch + + if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { + engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + } + + NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( + 20, + () => { + NumarkMixTrackPro.jogWheelStopScratch(deck); + }, + true + ); + } else { + // if playing and scratch mode is disabled, do nothing on press + if ( + !NumarkMixTrackPro.scratchMode[deck - 1] && + engine.getValue(group, "play") + ) { + return; + } + + if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { + engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + } + + // change the 600 value for sensibility + engine.scratchEnable(deck, 600, 33 + 1 / 3, 1.0 / 8, 1.0 / 8 / 32); + + NumarkMixTrackPro.touch[deck - 1] = true; + } +}; + +NumarkMixTrackPro.toggleDirectoryMode = function( + channel, + control, + value +) { + // Toggle setting and light + if (value) { + NumarkMixTrackPro.directoryMode = !NumarkMixTrackPro.directoryMode; + + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[0].directory, + NumarkMixTrackPro.directoryMode + ); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[0].file, + !NumarkMixTrackPro.directoryMode + ); + } +}; + +NumarkMixTrackPro.toggleScratchMode = function( + channel, + control, + value, + status, + group +) { + if (!value) { + return; + } + + const deck = NumarkMixTrackPro.groupToDeck(group); + // Toggle setting and light + NumarkMixTrackPro.scratchMode[deck - 1] = + !NumarkMixTrackPro.scratchMode[deck - 1]; + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].scratchMode, + NumarkMixTrackPro.scratchMode[deck - 1] + ); +}; + +NumarkMixTrackPro.onHotCueChange = function(value, group, key) { + const deck = NumarkMixTrackPro.groupToDeck(group); + const hotCueNum = key[7]; + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck][`hotCue${hotCueNum}`], + !!value + ); +}; + +NumarkMixTrackPro.changeHotCue = function( + channel, + control, + value, + status, + group +) { + const deck = NumarkMixTrackPro.groupToDeck(group); + const hotCue = NumarkMixTrackPro.hotCue[control]; + + // onHotCueChange called automatically + if (NumarkMixTrackPro.shiftKey[deck - 1]) { + if (engine.getValue(group, `hotcue_${hotCue}_enabled`)) { + engine.setValue(group, `hotcue_${hotCue}_clear`, 1); + } + NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); + } else { + if (value) { + engine.setValue(group, `hotcue_${hotCue}_activate`, 1); + } else { + engine.setValue(group, `hotcue_${hotCue}_activate`, 0); + } + } +}; + +NumarkMixTrackPro.toggleShiftKey = function( + channel, + control, + value, + status, + group +) { + if (!value) { + return; + } + + const deck = NumarkMixTrackPro.groupToDeck(group); + NumarkMixTrackPro.shiftKey[deck - 1] = !NumarkMixTrackPro.shiftKey[deck - 1]; + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].shiftKey, + NumarkMixTrackPro.shiftKey[deck - 1] + ); +}; From c9f14c7144f5b9fae7be11cb737f9c798ea09557 Mon Sep 17 00:00:00 2001 From: vespadj Date: Sun, 26 Oct 2025 00:59:15 +0200 Subject: [PATCH 154/163] MixtrackPro: JS: modernize functions, purge unused --- .../Numark-Mixtrack-Pro-scripts.js | 274 +++++++++--------- 1 file changed, 131 insertions(+), 143 deletions(-) diff --git a/res/controllers/Numark-Mixtrack-Pro-scripts.js b/res/controllers/Numark-Mixtrack-Pro-scripts.js index 1655848e075b..961a786479d1 100644 --- a/res/controllers/Numark-Mixtrack-Pro-scripts.js +++ b/res/controllers/Numark-Mixtrack-Pro-scripts.js @@ -59,8 +59,17 @@ // Border of the wheels: Pitch Bend. // -/* eslint no-undef: "error" */ +// Global constants/variables +/* +const ON = 0x7f; +const OFF = 0x00; +const DOWN = 0x7f; +const FW = 0x01; // wheel forward +const RW = 0x7f; // wheel rewind +*/ + +/* eslint no-undef: "error" */ function NumarkMixTrackPro() {} NumarkMixTrackPro.init = function(id) { @@ -72,13 +81,13 @@ NumarkMixTrackPro.init = function(id) { NumarkMixTrackPro.directoryMode = false; NumarkMixTrackPro.scratchMode = [false, false]; NumarkMixTrackPro.manualLoop = [true, true]; - NumarkMixTrackPro.shiftKey = [false, false]; - NumarkMixTrackPro.isKeyLocked = [0, 0]; + NumarkMixTrackPro.shiftKey = [false, false]; // used as [Shift], aka "VIEW" and "TICK" buttons + NumarkMixTrackPro.isKeyLocked = [0, 0]; // TODO: delete unused NumarkMixTrackPro.touch = [false, false]; NumarkMixTrackPro.scratchTimer = [-1, -1]; NumarkMixTrackPro.leds = [ - // Common + // Common {directory: 0x73, file: 0x72}, // Deck 1 { @@ -129,12 +138,13 @@ NumarkMixTrackPro.init = function(id) { this.state = state; }; + // Turn off all the lights for (let i = 0x30; i <= 0x73; i++) { midi.sendShortMsg(0x90, i, 0x00); - } // Turn off all the lights + } NumarkMixTrackPro.hotCue = { - //Deck 1 + //Deck 1 0x5a: "1", 0x5b: "2", 0x5c: "3", @@ -158,6 +168,16 @@ NumarkMixTrackPro.init = function(id) { NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[0].file, true); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[1].keylock, + engine.getParameter("[Channel1]", "keylock") + ); + + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[2].keylock, + engine.getParameter("[Channel2]", "keylock") + ); + // Enable soft-takeover for Pitch slider engine.softTakeover("[Channel1]", "rate", true); engine.softTakeover("[Channel2]", "rate", true); @@ -187,6 +207,21 @@ NumarkMixTrackPro.init = function(id) { ); }; + +NumarkMixTrackPro.pitchFader = function( + channel, + control, + value, + status, + group +) { + let newValue = value / 127; + if (value === 63 || value === 64) { + newValue = 0.5; + } + engine.setParameter(group, "rate", newValue); +}; + NumarkMixTrackPro.Channel1Clip = function(value) { NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[1].sync); }; @@ -198,13 +233,13 @@ NumarkMixTrackPro.Channel2Clip = function(value) { NumarkMixTrackPro.Stutter1Beat = function(value) { const secondsBlink = 30; const secondsToEnd = - engine.getValue("[Channel1]", "duration") * - (1 - engine.getValue("[Channel1]", "playposition")); + engine.getParameter("[Channel1]", "duration") * + (1 - engine.getParameter("[Channel1]", "playposition")); if ( secondsToEnd < secondsBlink && secondsToEnd > 1 && - engine.getValue("[Channel1]", "play") + engine.getParameter("[Channel1]", "play") ) { // The song is going to end @@ -216,13 +251,13 @@ NumarkMixTrackPro.Stutter1Beat = function(value) { NumarkMixTrackPro.Stutter2Beat = function(value) { const secondsBlink = 30; const secondsToEnd = - engine.getValue("[Channel2]", "duration") * - (1 - engine.getValue("[Channel2]", "playposition")); + engine.getParameter("[Channel2]", "duration") * + (1 - engine.getParameter("[Channel2]", "playposition")); if ( secondsToEnd < secondsBlink && secondsToEnd > 1 && - engine.getValue("[Channel2]", "play") + engine.getParameter("[Channel2]", "play") ) { // The song is going to end @@ -246,10 +281,11 @@ NumarkMixTrackPro.shutdown = function() { // First Remove event listeners for (let i = 1; i < 2; i++) { for (let x = 1; x < 4; x++) { - engine.connectControl( + // TODO: Check + engine.makeConnection( `[Channel${i}]`, - `hotcue_${x}_enabled`, - "NumarkMixTrackPro.onHotCueChange", + `hotcue_${x}_status`, // was _enabled + NumarkMixTrackPro.onHotCueChange, true ); } @@ -263,24 +299,6 @@ NumarkMixTrackPro.shutdown = function() { } }; -NumarkMixTrackPro.samplesPerBeat = function(group) { - // FIXME: Get correct samplerate and channels for current deck - const sampleRate = 44100; - const channels = 2; - const bpm = engine.getValue(group, "file_bpm"); - return (channels * sampleRate * 60) / bpm; -}; - -NumarkMixTrackPro.groupToDeck = function(group) { - const matches = group.match(/^\[Channel(\d+)\]$/); - - if (matches === null) { - return -1; - } else { - return matches[1]; - } -}; - NumarkMixTrackPro.setLED = function(value, status) { status = status ? 0x64 : 0x00; midi.sendShortMsg(0x90, value, status); @@ -349,15 +367,15 @@ NumarkMixTrackPro.LoadTrack = function( ) { // Load the selected track in the corresponding deck only if the track is paused - if (value && engine.getValue(group, "play") !== 1) { - engine.setValue(group, "LoadSelectedTrack", 1); + if (value && engine.getParameter(group, "play") !== 1) { + engine.setParameter(group, "LoadSelectedTrack", 1); // cargar el tema con el pitch en 0 engine.softTakeover(group, "rate", false); - engine.setValue(group, "rate", 0); + engine.setParameter(group, "rate", 0.5); engine.softTakeover(group, "rate", true); } else { - engine.setValue(group, "LoadSelectedTrack", 0); + engine.setParameter(group, "LoadSelectedTrack", 0); } }; @@ -369,39 +387,40 @@ NumarkMixTrackPro.cuebutton = function( group ) { // Don't set Cue accidentally at the end of the song - if (engine.getValue(group, "playposition") <= 0.97) { - engine.setValue(group, "cue_default", value ? 1 : 0); + if (engine.getParameter(group, "playposition") <= 0.97) { + engine.setParameter(group, "cue_default", value ? 1 : 0); } else { - engine.setValue(group, "cue_preview", value ? 1 : 0); + engine.setParameter(group, "cue_preview", value ? 1 : 0); } }; NumarkMixTrackPro.beatsync = function(channel, control, value, status, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); if (NumarkMixTrackPro.shiftKey[deck - 1]) { - // Delete + SYNC = vuelve pitch a 0 + // Shift + SYNC = reset rate to 0, at half (0.5) engine.softTakeover(group, "rate", false); - engine.setValue(group, "rate", 0); + engine.setParameter(group, "rate", 0.5); engine.softTakeover(group, "rate", true); + // Reset shift key state NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else { if (deck === 1) { // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) - if (!engine.getValue("[Channel2]", "play")) { - engine.setValue(group, "beatsync_tempo", value ? 1 : 0); + if (!engine.getParameter("[Channel2]", "play")) { + engine.setParameter(group, "beatsync_tempo", value ? 1 : 0); } else { - engine.setValue(group, "beatsync", value ? 1 : 0); + engine.setParameter(group, "beatsync", value ? 1 : 0); } } if (deck === 2) { // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) - if (!engine.getValue("[Channel1]", "play")) { - engine.setValue(group, "beatsync_tempo", value ? 1 : 0); + if (!engine.getParameter("[Channel1]", "play")) { + engine.setParameter(group, "beatsync_tempo", value ? 1 : 0); } else { - engine.setValue(group, "beatsync", value ? 1 : 0); + engine.setParameter(group, "beatsync", value ? 1 : 0); } } } @@ -418,30 +437,28 @@ NumarkMixTrackPro.playbutton = function( return; } - // var deck = NumarkMixTrackPro.groupToDeck(group); - - if (engine.getValue(group, "play")) { - engine.setValue(group, "play", 0); + if (engine.getParameter(group, "play")) { + engine.setParameter(group, "play", 0); } else { - engine.setValue(group, "play", 1); + engine.setParameter(group, "play", 1); } }; NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); if (NumarkMixTrackPro.manualLoop[deck - 1]) { if (!value) { return; } // Act like the Mixxx UI - engine.setValue(group, "loop_in", status ? 1 : 0); + engine.setParameter(group, "loop_in", status ? 1 : 0); return; } // Auto Loop: 1/2 loop size - const start = engine.getValue(group, "loop_start_position"); - const end = engine.getValue(group, "loop_end_position"); + const start = engine.getParameter(group, "loop_start_position"); + const end = engine.getParameter(group, "loop_end_position"); if (start < 0 || end < 0) { NumarkMixTrackPro.flashLED( NumarkMixTrackPro.leds[deck].loopStartPosition, @@ -451,10 +468,10 @@ NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { } if (value) { - const start = engine.getValue(group, "loop_start_position"); - const end = engine.getValue(group, "loop_end_position"); + const start = engine.getParameter(group, "loop_start_position"); + const end = engine.getParameter(group, "loop_end_position"); const len = (end - start) / 2; - engine.setValue(group, "loop_end_position", start + len); + engine.setParameter(group, "loop_end_position", start + len); NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].loopStartPosition, true @@ -468,7 +485,7 @@ NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { }; NumarkMixTrackPro.loopOut = function(channel, control, value, status, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); if (!value) { return; @@ -476,46 +493,23 @@ NumarkMixTrackPro.loopOut = function(channel, control, value, status, group) { if (NumarkMixTrackPro.manualLoop[deck - 1]) { // Act like the Mixxx UI - engine.setValue(group, "loop_out", status ? 1 : 0); + engine.setParameter(group, "loop_out", status ? 1 : 0); return; } - const isLoopActive = engine.getValue(group, "loop_enabled"); + const isLoopActive = engine.getParameter(group, "loop_enabled"); // Set a 4 beat auto loop or exit the loop if (!isLoopActive) { - engine.setValue(group, "beatloop_4", 1); + engine.setParameter(group, "beatloop_4", 1); } else { - engine.setValue(group, "beatloop_4", 0); - } -}; - -NumarkMixTrackPro.repositionHack = function(group, oldPosition) { - // see if the value has been updated - if (engine.getValue(group, "loop_start_position") === oldPosition) { - if (NumarkMixTrackPro.hackCount[group]++ < 9) { - engine.beginTimer( - 20, - `NumarkMixTrackPro.repositionHack('${group}', ${oldPosition})`, - true - ); - } else { - const deck = NumarkMixTrackPro.groupToDeck(group); - NumarkMixTrackPro.flashLED( - NumarkMixTrackPro.leds[deck].loopStartPosition, - 4 - ); - } - return; + engine.setParameter(group, "beatloop_4", 0); } - const bar = NumarkMixTrackPro.samplesPerBeat(group); - const start = engine.getValue(group, "loop_start_position"); - engine.setValue(group, "loop_end_position", start + bar); }; NumarkMixTrackPro.reLoop = function(channel, control, value, status, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); if (NumarkMixTrackPro.manualLoop[deck - 1]) { // Act like the Mixxx UI (except for working delete) @@ -523,19 +517,19 @@ NumarkMixTrackPro.reLoop = function(channel, control, value, status, group) { return; } if (NumarkMixTrackPro.shiftKey[deck - 1]) { - engine.setValue(group, "reloop_exit", 0); - engine.setValue(group, "loop_start_position", -1); - engine.setValue(group, "loop_end_position", -1); + engine.setParameter(group, "reloop_exit", 0); + engine.setParameter(group, "loop_start_position", -1); + engine.setParameter(group, "loop_end_position", -1); NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else { - engine.setValue(group, "reloop_exit", status ? 1 : 0); + engine.setParameter(group, "reloop_exit", status ? 1 : 0); } return; } // Auto Loop: Double Loop Size - const start = engine.getValue(group, "loop_start_position"); - const end = engine.getValue(group, "loop_end_position"); + const start = engine.getParameter(group, "loop_start_position"); + const end = engine.getParameter(group, "loop_end_position"); if (start < 0 || end < 0) { NumarkMixTrackPro.flashLED(NumarkMixTrackPro.leds[deck].reloopExit, 4); return; @@ -543,7 +537,7 @@ NumarkMixTrackPro.reLoop = function(channel, control, value, status, group) { if (value) { const len = (end - start) * 2; - engine.setValue(group, "loop_end_position", start + len); + engine.setParameter(group, "loop_end_position", start + len); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, true); } else { NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, false); @@ -582,15 +576,15 @@ NumarkMixTrackPro.setLoopMode = function(deck, manual) { if (manual) { NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].loopStartPosition, - engine.getValue(group, "loop_start_position") > -1 + engine.getParameter(group, "loop_start_position") > -1 ); NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].loopEndPosition, - engine.getValue(group, "loop_end_position") > -1 + engine.getParameter(group, "loop_end_position") > -1 ); NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].reloopExit, - engine.getValue(group, "loop_enabled") + engine.getParameter(group, "loop_enabled") ); } else { NumarkMixTrackPro.setLED( @@ -599,7 +593,7 @@ NumarkMixTrackPro.setLoopMode = function(deck, manual) { ); NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].loopEndPosition, - engine.getValue(group, "loop_enabled") + engine.getParameter(group, "loop_enabled") ); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, false); } @@ -616,15 +610,15 @@ NumarkMixTrackPro.toggleManualLooping = function( return; } - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); if (NumarkMixTrackPro.shiftKey[deck - 1]) { // activar o desactivar quantize - if (engine.getValue(group, "quantize")) { - engine.setValue(group, "quantize", 0); + if (engine.getParameter(group, "quantize")) { + engine.setParameter(group, "quantize", 0); } else { - engine.setValue(group, "quantize", 1); + engine.setParameter(group, "quantize", 1); } NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); @@ -637,17 +631,17 @@ NumarkMixTrackPro.toggleManualLooping = function( }; NumarkMixTrackPro.onLoopChange = function(value, group, key) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck][key], value > -1); }; NumarkMixTrackPro.onReloopExitChange = function(value, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, value); }; NumarkMixTrackPro.onReloopExitChangeAuto = function(value, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].loopEndPosition, value); }; @@ -659,36 +653,23 @@ NumarkMixTrackPro.playFromCue = function( status, group ) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); - if (engine.getValue(group, "beats_translate_curpos")) { - engine.setValue(group, "beats_translate_curpos", 0); + if (engine.getParameter(group, "beats_translate_curpos")) { + engine.setParameter(group, "beats_translate_curpos", 0); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, 0); } else { - engine.setValue(group, "beats_translate_curpos", 1); + engine.setParameter(group, "beats_translate_curpos", 1); NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, 1); } }; -NumarkMixTrackPro.pitch = function(channel, control, value, status, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); - - let pitchValue = 0; - - if (value < 64) { - pitchValue = (value - 64) / 64; - } - if (value > 64) { - pitchValue = (value - 64) / 63; - } - engine.setValue(`[Channel${deck}]`, "rate", pitchValue); -}; NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); - // if (!NumarkMixTrackPro.touch[deck-1] && !engine.getValue(group, "play")) return; + // if (!NumarkMixTrackPro.touch[deck-1] && !engine.getParameter(group, "play")) return; let adjustedJog = parseFloat(value); let posNeg = 1; @@ -698,7 +679,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { adjustedJog = value - 128; } - if (engine.getValue(group, "play")) { + if (engine.getParameter(group, "play")) { if ( NumarkMixTrackPro.scratchMode[deck - 1] && posNeg === -1 && @@ -716,8 +697,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { ); } } else { - // stop scratching - + // stop scratching if (!NumarkMixTrackPro.touch[deck - 1]) { if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); @@ -734,7 +714,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { engine.scratchTick(deck, adjustedJog); - if (engine.getValue(group, "play")) { + if (engine.getParameter(group, "play")) { const gammaInputRange = 13; // Max jog speed const maxOutFraction = 0.8; // Where on the curve it should peak; 0.5 is half-way const sensitivity = 0.5; // Adjustment gamma @@ -747,7 +727,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { Math.abs(adjustedJog) / (gammaInputRange * maxOutFraction), sensitivity ); - engine.setValue(group, "jog", adjustedJog); + engine.setParameter(group, "jog", adjustedJog); } }; @@ -763,7 +743,7 @@ NumarkMixTrackPro.wheelTouch = function( status, group ) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); if (!value) { NumarkMixTrackPro.touch[deck - 1] = false; @@ -786,7 +766,7 @@ NumarkMixTrackPro.wheelTouch = function( // if playing and scratch mode is disabled, do nothing on press if ( !NumarkMixTrackPro.scratchMode[deck - 1] && - engine.getValue(group, "play") + engine.getParameter(group, "play") ) { return; } @@ -810,7 +790,12 @@ NumarkMixTrackPro.toggleDirectoryMode = function( // Toggle setting and light if (value) { NumarkMixTrackPro.directoryMode = !NumarkMixTrackPro.directoryMode; - + // https://manual.mixxx.org/latest/it/chapters/appendix/mixxx_controls.html#control-[Library]-focused_widget + /* + if (NumarkMixTrackPro.directoryMode) { + engine.setParameter('[Library]', 'MoveFocusBackward', 1); // [Shift+TAB]; [TAB]: MoveFocusForward + } + */ NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[0].directory, NumarkMixTrackPro.directoryMode @@ -833,7 +818,7 @@ NumarkMixTrackPro.toggleScratchMode = function( return; } - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); // Toggle setting and light NumarkMixTrackPro.scratchMode[deck - 1] = !NumarkMixTrackPro.scratchMode[deck - 1]; @@ -844,7 +829,7 @@ NumarkMixTrackPro.toggleScratchMode = function( }; NumarkMixTrackPro.onHotCueChange = function(value, group, key) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); const hotCueNum = key[7]; NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck][`hotCue${hotCueNum}`], @@ -859,20 +844,20 @@ NumarkMixTrackPro.changeHotCue = function( status, group ) { - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); const hotCue = NumarkMixTrackPro.hotCue[control]; // onHotCueChange called automatically if (NumarkMixTrackPro.shiftKey[deck - 1]) { - if (engine.getValue(group, `hotcue_${hotCue}_enabled`)) { - engine.setValue(group, `hotcue_${hotCue}_clear`, 1); + if (engine.getParameter(group, `hotcue_${hotCue}_enabled`)) { + engine.setParameter(group, `hotcue_${hotCue}_clear`, 1); } NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else { if (value) { - engine.setValue(group, `hotcue_${hotCue}_activate`, 1); + engine.setParameter(group, `hotcue_${hotCue}_activate`, 1); } else { - engine.setValue(group, `hotcue_${hotCue}_activate`, 0); + engine.setParameter(group, `hotcue_${hotCue}_activate`, 0); } } }; @@ -884,11 +869,14 @@ NumarkMixTrackPro.toggleShiftKey = function( status, group ) { + // used as [Shift], aka "VIEW" and "TICK" buttons + // was toggleDeleteKey + if (!value) { return; } - const deck = NumarkMixTrackPro.groupToDeck(group); + const deck = script.deckFromGroup(group); NumarkMixTrackPro.shiftKey[deck - 1] = !NumarkMixTrackPro.shiftKey[deck - 1]; NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].shiftKey, From 6f09e6eed454fdae98ec99e4552c0926e068d304 Mon Sep 17 00:00:00 2001 From: vespadj Date: Sun, 26 Oct 2025 11:28:34 +0100 Subject: [PATCH 155/163] MixtrackPro: Settings, Brake/SoftStart, Mid, selector knob, pitch_bend btns in alterative, beatsync > sync_enabled --- .../Numark-Mixtrack-Pro-scripts.js | 343 +++++++++++++++--- 1 file changed, 302 insertions(+), 41 deletions(-) diff --git a/res/controllers/Numark-Mixtrack-Pro-scripts.js b/res/controllers/Numark-Mixtrack-Pro-scripts.js index 961a786479d1..b8a3423fc989 100644 --- a/res/controllers/Numark-Mixtrack-Pro-scripts.js +++ b/res/controllers/Numark-Mixtrack-Pro-scripts.js @@ -61,8 +61,8 @@ // Global constants/variables -/* const ON = 0x7f; +/* const OFF = 0x00; const DOWN = 0x7f; const FW = 0x01; // wheel forward @@ -82,9 +82,52 @@ NumarkMixTrackPro.init = function(id) { NumarkMixTrackPro.scratchMode = [false, false]; NumarkMixTrackPro.manualLoop = [true, true]; NumarkMixTrackPro.shiftKey = [false, false]; // used as [Shift], aka "VIEW" and "TICK" buttons - NumarkMixTrackPro.isKeyLocked = [0, 0]; // TODO: delete unused NumarkMixTrackPro.touch = [false, false]; NumarkMixTrackPro.scratchTimer = [-1, -1]; + NumarkMixTrackPro.fxKnobPressed = false; // TODO: to [0, 0] + NumarkMixTrackPro.syncLastTimestamp = [0, 0]; + NumarkMixTrackPro.loopEditIn = [-1, -1]; + + NumarkMixTrackPro.isBeatJumpBackwardOn = [0, 0]; // glossary: forward, backward + engine.makeConnection("[Channel1]", "beatjump_backward", (value) => { + NumarkMixTrackPro.isBeatJumpBackwardOn[0] = value; + }); + engine.makeConnection("[Channel2]", "beatjump_backward", (value) => { + NumarkMixTrackPro.isBeatJumpBackwardOn[1] = value; + }); + + NumarkMixTrackPro.isBeatJumpForwardOn = [0, 0]; // glossary: forward, backward + engine.makeConnection("[Channel1]", "beatjump_forward", (value) => { + NumarkMixTrackPro.isBeatJumpForwardOn[0] = value; + }); + engine.makeConnection("[Channel2]", "beatjump_forward", (value) => { + NumarkMixTrackPro.isBeatJumpForwardOn[1] = value; + }); + + NumarkMixTrackPro.isPflOn = [0, 0]; + engine.makeConnection("[Channel1]", "pfl", (value) => { + NumarkMixTrackPro.isPflOn[0] = value; + console.log("NumarkMixTrackPro.isPflOn[0]", NumarkMixTrackPro.isPflOn[0]); + }); + engine.makeConnection("[Channel2]", "pfl", (value) => { + NumarkMixTrackPro.isPflOn[1] = value; + }); + + NumarkMixTrackPro.isFxOn = [0, 0]; + engine.makeConnection( + "[EffectRack1_EffectUnit1_Effect1]", + "enabled", + (value) => { + NumarkMixTrackPro.isFxOn[0] = value; + } + ); + engine.makeConnection( + "[EffectRack1_EffectUnit2_Effect1]", + "enabled", + (value) => { + NumarkMixTrackPro.isFxOn[1] = value; + } + ); NumarkMixTrackPro.leds = [ // Common @@ -205,8 +248,84 @@ NumarkMixTrackPro.init = function(id) { "beat_active", NumarkMixTrackPro.Stutter2Beat ); + + // Settings + NumarkMixTrackPro.settings = {}; + + // get and map + const settingsOptions = [ + "brakeEnabled", + "meanPitchBendBtns", + "editLoopByWheelEnabled", + "quickFxActivator", + ]; + settingsOptions.forEach((item) => { + NumarkMixTrackPro.settings[item] = + engine.getSetting(`numarkMixTrackPro_${item}`) || 0; + }); }; +NumarkMixTrackPro.pitchBendBtns = function(group, value, isPlus) { + switch (NumarkMixTrackPro.settings.meanPitchBendBtns) { + case "beatjump": + engine.setParameter( + group, + `beatjump${isPlus ? "_forward" : "_backward"}`, + !!value + ); + break; + + case "rate_temp": + engine.setParameter( + group, + `rate_temp${isPlus ? "_up" : "_down"}`, + !!value + ); + break; + + case "pitch": + if ( + // if also the other button is pressed + value && + engine.getParameter(group, `pitch${!isPlus ? "_up" : "_down"}`) + ) { + // reset pitch + engine.setParameter(group, "pitch", 0.5); + } else { + engine.setParameter(group, `pitch${isPlus ? "_up" : "_down"}`, !!value); + } + break; + + default: + console.log( + "NumarkMixTrackPro.settings.meanPitchBendBtns", + NumarkMixTrackPro.settings.meanPitchBendBtns + ); + break; + } +}; + +NumarkMixTrackPro.pitchBendMinus = function( + channel, + control, + value, + status, + group +) { + const isPlus = false; + NumarkMixTrackPro.pitchBendBtns(group, value, isPlus); +}; + +NumarkMixTrackPro.pitchBendPlus = function( + channel, + control, + value, + status, + group +) { + const isPlus = true; + NumarkMixTrackPro.pitchBendBtns(group, value, isPlus); +}; NumarkMixTrackPro.pitchFader = function( channel, @@ -233,15 +352,15 @@ NumarkMixTrackPro.Channel2Clip = function(value) { NumarkMixTrackPro.Stutter1Beat = function(value) { const secondsBlink = 30; const secondsToEnd = - engine.getParameter("[Channel1]", "duration") * - (1 - engine.getParameter("[Channel1]", "playposition")); + engine.getParameter("[Channel1]", "duration") * + (1 - engine.getParameter("[Channel1]", "playposition")); if ( secondsToEnd < secondsBlink && - secondsToEnd > 1 && - engine.getParameter("[Channel1]", "play") + secondsToEnd > 1 && + engine.getParameter("[Channel1]", "play") ) { - // The song is going to end + // The song is going to end NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1].Cue, value); } @@ -251,15 +370,15 @@ NumarkMixTrackPro.Stutter1Beat = function(value) { NumarkMixTrackPro.Stutter2Beat = function(value) { const secondsBlink = 30; const secondsToEnd = - engine.getParameter("[Channel2]", "duration") * - (1 - engine.getParameter("[Channel2]", "playposition")); + engine.getParameter("[Channel2]", "duration") * + (1 - engine.getParameter("[Channel2]", "playposition")); if ( secondsToEnd < secondsBlink && - secondsToEnd > 1 && - engine.getParameter("[Channel2]", "play") + secondsToEnd > 1 && + engine.getParameter("[Channel2]", "play") ) { - // The song is going to end + // The song is going to end NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2].Cue, value); } @@ -323,7 +442,7 @@ NumarkMixTrackPro.doFlash = function(ndx, veces) { } if (ledTimer.count > veces) { - // how many times blink the button + // how many times blink the button engine.stopTimer(ledTimer.id); delete NumarkMixTrackPro.ledTimers[ndx]; } else { @@ -406,22 +525,38 @@ NumarkMixTrackPro.beatsync = function(channel, control, value, status, group) { // Reset shift key state NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else { - if (deck === 1) { - // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) - if (!engine.getParameter("[Channel2]", "play")) { - engine.setParameter(group, "beatsync_tempo", value ? 1 : 0); - } else { - engine.setParameter(group, "beatsync", value ? 1 : 0); - } - } + // New sync_enabled. Fix for Leader persistent, same as GUI + // define an Handler and link to global var + const lastTimestampHandler = (deck) => { + const index = deck - 1; + return { + get: () => NumarkMixTrackPro.syncLastTimestamp[index], + set: (value) => { + NumarkMixTrackPro.syncLastTimestamp[index] = value; + }, + }; + }; + const lastTimestamp = lastTimestampHandler(deck); - if (deck === 2) { - // si la otra deck esta en stop, sincronizo sólo el tempo (no el golpe) - if (!engine.getParameter("[Channel1]", "play")) { - engine.setParameter(group, "beatsync_tempo", value ? 1 : 0); + const syncLeader = engine.getParameter(group, "sync_leader"); + const timestamp = Date.now(); + + if (value === ON) { + if (!syncLeader) { + engine.setParameter(group, "sync_enabled", true); + lastTimestamp.set(timestamp); } else { - engine.setParameter(group, "beatsync", value ? 1 : 0); + engine.setParameter(group, "sync_enabled", false); + lastTimestamp.set(0); + } + } else { + if (lastTimestamp.get() === 0) { + return; } + if (timestamp - lastTimestamp.get() < 250) { + engine.setParameter(group, "sync_enabled", false); + } + // else for long press > 250 ms, do nothing } } }; @@ -435,15 +570,36 @@ NumarkMixTrackPro.playbutton = function( ) { if (!value) { return; - } + } // (NoteOff, 0x00, button up) + const deck = script.deckFromGroup(group); - if (engine.getParameter(group, "play")) { - engine.setParameter(group, "play", 0); + if (!NumarkMixTrackPro.settings.brakeEnabled) { + // Play/Pause standard + if (engine.getParameter(group, "play")) { + engine.setParameter(group, "play", 0); + } else { + engine.setParameter(group, "play", 1); + } } else { - engine.setParameter(group, "play", 1); + // Brake and Soft Start if scratch led is on + // Mixxx v.2.6+ required + if (engine.getParameter(group, "play") && !engine.isBrakeActive(deck)) { + if (NumarkMixTrackPro.scratchMode[deck - 1]) { + engine.brake(deck, true); + } else { + engine.setParameter(group, "play", 0); + } + } else { + if (NumarkMixTrackPro.scratchMode[deck - 1]) { + engine.softStart(deck, true); + } else { + engine.setParameter(group, "play", 1); + } + } } }; + NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { const deck = script.deckFromGroup(group); @@ -595,7 +751,10 @@ NumarkMixTrackPro.setLoopMode = function(deck, manual) { NumarkMixTrackPro.leds[deck].loopEndPosition, engine.getParameter(group, "loop_enabled") ); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, false); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].reloopExit, + false + ); } }; @@ -632,17 +791,26 @@ NumarkMixTrackPro.toggleManualLooping = function( NumarkMixTrackPro.onLoopChange = function(value, group, key) { const deck = script.deckFromGroup(group); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck][key], value > -1); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck][key], + value > -1 + ); }; NumarkMixTrackPro.onReloopExitChange = function(value, group) { const deck = script.deckFromGroup(group); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, value); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].reloopExit, + value + ); }; NumarkMixTrackPro.onReloopExitChangeAuto = function(value, group) { const deck = script.deckFromGroup(group); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].loopEndPosition, value); + NumarkMixTrackPro.setLED( + NumarkMixTrackPro.leds[deck].loopEndPosition, + value + ); }; // Stutters adjust BeatGrid @@ -669,14 +837,12 @@ NumarkMixTrackPro.playFromCue = function( NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { const deck = script.deckFromGroup(group); - // if (!NumarkMixTrackPro.touch[deck-1] && !engine.getParameter(group, "play")) return; - - let adjustedJog = parseFloat(value); + let adjustedJog = parseFloat(value); // 1; 2; ...; 13 or 120; ...; 127 let posNeg = 1; if (adjustedJog > 63) { // Counter-clockwise posNeg = -1; - adjustedJog = value - 128; + adjustedJog = value - 128; // -13 .. +13 } if (engine.getParameter(group, "play")) { @@ -746,6 +912,7 @@ NumarkMixTrackPro.wheelTouch = function( const deck = script.deckFromGroup(group); if (!value) { + // Untouch NumarkMixTrackPro.touch[deck - 1] = false; // paro el timer (si no existe da error mmmm) y arranco un nuevo timer. @@ -763,6 +930,8 @@ NumarkMixTrackPro.wheelTouch = function( true ); } else { + NumarkMixTrackPro.touch[deck - 1] = true; + // if playing and scratch mode is disabled, do nothing on press if ( !NumarkMixTrackPro.scratchMode[deck - 1] && @@ -777,8 +946,6 @@ NumarkMixTrackPro.wheelTouch = function( // change the 600 value for sensibility engine.scratchEnable(deck, 600, 33 + 1 / 3, 1.0 / 8, 1.0 / 8 / 32); - - NumarkMixTrackPro.touch[deck - 1] = true; } }; @@ -807,6 +974,26 @@ NumarkMixTrackPro.toggleDirectoryMode = function( } }; +NumarkMixTrackPro.onCentralKnobPress = function( + channel, + control, + value, + // status, + // group +) { + if (!value) { return; } + + // DEPRECADED mode + if (NumarkMixTrackPro.directoryMode) { + engine.setParameter("[Playlist]", "ToggleSelectedSidebarItem", 1); + } else { + engine.setParameter("[Playlist]", "LoadSelectedIntoFirstStopped", 1); + } + + // New Mode: TODO: fix leds in toggleDirectoryMode + // engine.setParameter('[Library]', 'GoToItem', 1); +}; + NumarkMixTrackPro.toggleScratchMode = function( channel, control, @@ -821,7 +1008,7 @@ NumarkMixTrackPro.toggleScratchMode = function( const deck = script.deckFromGroup(group); // Toggle setting and light NumarkMixTrackPro.scratchMode[deck - 1] = - !NumarkMixTrackPro.scratchMode[deck - 1]; + !NumarkMixTrackPro.scratchMode[deck - 1]; NumarkMixTrackPro.setLED( NumarkMixTrackPro.leds[deck].scratchMode, NumarkMixTrackPro.scratchMode[deck - 1] @@ -883,3 +1070,77 @@ NumarkMixTrackPro.toggleShiftKey = function( NumarkMixTrackPro.shiftKey[deck - 1] ); }; + +NumarkMixTrackPro.mid = function(channel, control, value, status, group) { + // used as Mid or Filter if Shift* is on + if (isNaN(value)) { return; } + + const deck = script.deckFromGroup(group); + const _value = script.absoluteLin(value, 0, 1); + + if ( + (NumarkMixTrackPro.settings.quickFxActivator === "cue" && + NumarkMixTrackPro.isPflOn[deck - 1]) || + (NumarkMixTrackPro.settings.quickFxActivator === "shift" && + NumarkMixTrackPro.shiftKey[deck - 1]) || + (NumarkMixTrackPro.settings.quickFxActivator === "effect" && + NumarkMixTrackPro.isFxOn[deck - 1]) + ) { + // Filter, or the selected FX in Quick Effect Rack + // TODO: Add soft takeover? + engine.setParameter(`[QuickEffectRack1_${group}]`, "super1", _value); + } else { + // Mid + engine.setParameter( + `[EqualizerRack1_${group}_Effect1]`, + "parameter2", + _value + ); + } +}; + +NumarkMixTrackPro.fxSelectKnobPress = function( + channel, + control, + value, + status, + group +) { + // group [QuickEffectRack1_[Channel1]] or [QuickEffectRack1_[Channel2]] + // engine.setParameter(`[QuickEffectRack1_${group}]`, "super1_set_default"); + if (value === 127) { + script.triggerControl( + `[QuickEffectRack1_${group}]`, + "super1_set_default", + 100 + ); + NumarkMixTrackPro.fxKnobPressed = true; + } else { + NumarkMixTrackPro.fxKnobPressed = false; + } +}; + +NumarkMixTrackPro.fxSelectKnobRotate = function( + channel, + control, + value, + status, + group +) { + if (NumarkMixTrackPro.fxKnobPressed) { + if (value === 0x7f) { + script.triggerControl(group, "waveform_zoom_down", 100); + } else { + script.triggerControl(group, "waveform_zoom_up", 100); + } + } else { + // Select FX + const deck = script.deckFromGroup(group); + const fxGroup = `[EffectRack1_EffectUnit${deck}_Effect1]`; + if (value === 1) { + engine.setParameter(fxGroup, "effect_selector", -1); + } else { + engine.setParameter(fxGroup, "effect_selector", +1); + } + } +}; From 503de8075e0b05704d3977dcb9d452f60321089e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 5 Nov 2025 15:08:49 +0100 Subject: [PATCH 156/163] Use parented_ptr for library features to avoid new without delete. --- src/library/library.cpp | 19 +++++++------------ src/library/library.h | 12 ++++++------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/library/library.cpp b/src/library/library.cpp index b3021d7d2871..bd91b6e37ad4 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -71,12 +71,7 @@ Library::Library( m_pTrackCollectionManager(pTrackCollectionManager), m_pSidebarModel(make_parented(this)), m_pLibraryControl(make_parented(this)), - m_pLibraryWidget(nullptr), - m_pMixxxLibraryFeature(nullptr), - m_pAutoDJFeature(nullptr), - m_pPlaylistFeature(nullptr), - m_pCrateFeature(nullptr), - m_pAnalysisFeature(nullptr) { + m_pLibraryWidget(nullptr) { qRegisterMetaType("LibraryRemovalType"); m_pKeyNotation.reset( @@ -89,7 +84,7 @@ Library::Library( // TODO(rryan) -- turn this construction / adding of features into a static // method or something -- CreateDefaultLibrary - m_pMixxxLibraryFeature = new MixxxLibraryFeature( + m_pMixxxLibraryFeature = make_parented( this, m_pConfig); addFeature(m_pMixxxLibraryFeature); @@ -101,10 +96,10 @@ Library::Library( Qt::DirectConnection /* signal-to-signal */); #endif - m_pAutoDJFeature = new AutoDJFeature(this, m_pConfig, pPlayerManager); + m_pAutoDJFeature = make_parented(this, m_pConfig, pPlayerManager); addFeature(m_pAutoDJFeature); - m_pPlaylistFeature = new PlaylistFeature(this, UserSettingsPointer(m_pConfig)); + m_pPlaylistFeature = make_parented(this, UserSettingsPointer(m_pConfig)); addFeature(m_pPlaylistFeature); #ifdef __ENGINEPRIME__ connect(m_pPlaylistFeature, @@ -119,7 +114,7 @@ Library::Library( Qt::DirectConnection); #endif - m_pCrateFeature = new CrateFeature(this, m_pConfig); + m_pCrateFeature = make_parented(this, m_pConfig); addFeature(m_pCrateFeature); #ifdef __ENGINEPRIME__ connect(m_pCrateFeature, @@ -134,7 +129,7 @@ Library::Library( Qt::DirectConnection); #endif - m_pBrowseFeature = new BrowseFeature( + m_pBrowseFeature = make_parented( this, m_pConfig, pRecordingManager); connect(m_pBrowseFeature, &BrowseFeature::scanLibrary, @@ -154,7 +149,7 @@ Library::Library( addFeature(new SetlogFeature(this, UserSettingsPointer(m_pConfig))); - m_pAnalysisFeature = new AnalysisFeature(this, m_pConfig); + m_pAnalysisFeature = make_parented(this, m_pConfig); connect(m_pPlaylistFeature, &PlaylistFeature::analyzeTracks, m_pAnalysisFeature, diff --git a/src/library/library.h b/src/library/library.h index 5e3abf178a47..cecd26c1a4d3 100644 --- a/src/library/library.h +++ b/src/library/library.h @@ -195,12 +195,12 @@ class Library: public QObject { QList m_features; const static QString m_sTrackViewName; WLibrary* m_pLibraryWidget; - MixxxLibraryFeature* m_pMixxxLibraryFeature; - AutoDJFeature* m_pAutoDJFeature; - PlaylistFeature* m_pPlaylistFeature; - CrateFeature* m_pCrateFeature; - AnalysisFeature* m_pAnalysisFeature; - BrowseFeature* m_pBrowseFeature; + parented_ptr m_pMixxxLibraryFeature; + parented_ptr m_pAutoDJFeature; + parented_ptr m_pPlaylistFeature; + parented_ptr m_pCrateFeature; + parented_ptr m_pBrowseFeature; + parented_ptr m_pAnalysisFeature; QFont m_trackTableFont; int m_iTrackTableRowHeight; bool m_editMetadataSelectedClick; From 61a21594d8bc162d52b20400b7a6075faab14c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 5 Nov 2025 18:20:12 +0100 Subject: [PATCH 157/163] Replace a QScopedPointer with the nicer std::unique_ptr --- src/library/library.cpp | 7 +++---- src/library/library.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/library/library.cpp b/src/library/library.cpp index bd91b6e37ad4..cf86c4132186 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -71,12 +71,11 @@ Library::Library( m_pTrackCollectionManager(pTrackCollectionManager), m_pSidebarModel(make_parented(this)), m_pLibraryControl(make_parented(this)), - m_pLibraryWidget(nullptr) { + m_pLibraryWidget(nullptr), + m_pKeyNotation(std::make_unique( + mixxx::library::prefs::kKeyNotationConfigKey)) { qRegisterMetaType("LibraryRemovalType"); - m_pKeyNotation.reset( - new ControlObject(mixxx::library::prefs::kKeyNotationConfigKey)); - connect(m_pTrackCollectionManager, &TrackCollectionManager::libraryScanFinished, this, diff --git a/src/library/library.h b/src/library/library.h index cecd26c1a4d3..5ca62117992f 100644 --- a/src/library/library.h +++ b/src/library/library.h @@ -204,5 +204,5 @@ class Library: public QObject { QFont m_trackTableFont; int m_iTrackTableRowHeight; bool m_editMetadataSelectedClick; - QScopedPointer m_pKeyNotation; + std::unique_ptr m_pKeyNotation; }; From 4c8dc40e020347e53f8d773d8e83ffdcbbc5b098 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 19 Oct 2025 23:42:19 +0100 Subject: [PATCH 158/163] Revert "Disable QML to avoid undefined behaviour" This reverts commit c37ecda463e7895fdd26ce4cada86e4d83673b44. --- CMakeLists.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f75f7280d2ff..b2207af45e18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -319,14 +319,13 @@ endif() include(CMakeDependentOption) option(QT6 "Build with Qt6" ON) - -# Because of multiple concurrent definition of symbols caused by the rendergraph -# compile definition we need to disable QML by default. This avoids the risk of -# undefined behaviour in a stable build. -# See: https://github.com/mixxxdj/mixxx/issues/14766 -# Once this is fixed we can revert the commit introducing this. -option(QML "Build with QML" OFF) - +cmake_dependent_option( + QML + "Build with QML" + ON + "QT6" + OFF +) option(QOPENGL "Use QOpenGLWindow based widget instead of QGLWidget" ON) if(QOPENGL) From 2e4a37c7c2b2bd4081be691b290401c11da4efc1 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 12 Nov 2025 11:20:01 +0100 Subject: [PATCH 159/163] Track Info: swap ReplayGain and Date Added --- src/library/dlgtrackinfo.ui | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/library/dlgtrackinfo.ui b/src/library/dlgtrackinfo.ui index 63f6f25524a4..feac6baa41f3 100644 --- a/src/library/dlgtrackinfo.ui +++ b/src/library/dlgtrackinfo.ui @@ -564,14 +564,14 @@ - + - Date added: + ReplayGain: - + 75 @@ -609,14 +609,14 @@ - + - ReplayGain: + Date added: - + 75 From 09bc6ce4071bc9e599a770dad7a68da57e4ba40f Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 12 Nov 2025 11:40:06 +0100 Subject: [PATCH 160/163] Track Info: show file size --- src/library/dlgtrackinfo.cpp | 7 +++++++ src/library/dlgtrackinfo.ui | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/library/dlgtrackinfo.cpp b/src/library/dlgtrackinfo.cpp index 96389d5a7305..c1ddc55b983f 100644 --- a/src/library/dlgtrackinfo.cpp +++ b/src/library/dlgtrackinfo.cpp @@ -394,6 +394,13 @@ void DlgTrackInfo::replaceTrackRecord( mixxx::localDateTimeFromUtc( m_trackRecord.getDateAdded()))); + QFileInfo info(trackLocation); + if (info.exists() && info.isFile()) { + int size = info.size(); + QString sizeStr = QLocale().formattedDataSize(size); + txtFileSize->setText(sizeStr); + } + updateTrackMetadataFields(); } diff --git a/src/library/dlgtrackinfo.ui b/src/library/dlgtrackinfo.ui index feac6baa41f3..959885d783ab 100644 --- a/src/library/dlgtrackinfo.ui +++ b/src/library/dlgtrackinfo.ui @@ -632,6 +632,30 @@ + + + + Filesize: + + + + + + + + 75 + true + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + From e03b11121d0702f8e567cff34ad738030b81cebd Mon Sep 17 00:00:00 2001 From: vespadj Date: Sun, 26 Oct 2025 11:46:39 +0100 Subject: [PATCH 161/163] MixtrackPro: refactoring of jogWheel, touchWheel, Loop. Fix script.triggerControl when is better. Test ok! --- res/controllers/Numark Mixtrack Pro.midi.xml | 8 +- .../Numark-Mixtrack-Pro-scripts.js | 401 ++++++++++-------- 2 files changed, 221 insertions(+), 188 deletions(-) diff --git a/res/controllers/Numark Mixtrack Pro.midi.xml b/res/controllers/Numark Mixtrack Pro.midi.xml index 0c643236a02e..e8de79aeb326 100644 --- a/res/controllers/Numark Mixtrack Pro.midi.xml +++ b/res/controllers/Numark Mixtrack Pro.midi.xml @@ -2,14 +2,14 @@ Numark MixTrack Pro - Vespadj, Josh Patten, Matteo (matteo@magm3.com), James Ralston, and D. J. Freije (dario2004@gmail.com) + Matteo (matteo@magm3.com), James Ralston, and D. J. Freije (dario2004@gmail.com), Josh Patten, Vespadj version v2.5 (2025) https://mixxx.discourse.group/t/numark-mixtrack-pro-by-vespadj/32635 @@ -47,7 +47,7 @@ shift effect Active Quick Effect Super knob (filter is the default) on MID knob when - this modifiers is on and the relative LED is on. + this modifier is on and the relative LED is on. diff --git a/res/controllers/Numark-Mixtrack-Pro-scripts.js b/res/controllers/Numark-Mixtrack-Pro-scripts.js index b8a3423fc989..3c9fc1604ef9 100644 --- a/res/controllers/Numark-Mixtrack-Pro-scripts.js +++ b/res/controllers/Numark-Mixtrack-Pro-scripts.js @@ -140,8 +140,10 @@ NumarkMixTrackPro.init = function(id) { scratchMode: 0x48, manualLoop: 0x61, keylock: 0x51, - loopStartPosition: 0x53, - loopEndPosition: 0x54, + // eslint-disable-next-line camelcase + loop_start_position: 0x53, + // eslint-disable-next-line camelcase + loop_end_position: 0x54, reloopExit: 0x55, shiftKey: 0x59, hotCue1: 0x5a, @@ -159,8 +161,10 @@ NumarkMixTrackPro.init = function(id) { scratchMode: 0x50, manualLoop: 0x62, keylock: 0x52, - loopStartPosition: 0x56, - loopEndPosition: 0x57, + // eslint-disable-next-line camelcase + loop_start_position: 0x56, + // eslint-disable-next-line camelcase + loop_end_position: 0x57, reloopExit: 0x58, shiftKey: 0x5d, hotCue1: 0x5e, @@ -396,21 +400,6 @@ NumarkMixTrackPro.clipLED = function(value, note) { NumarkMixTrackPro.shutdown = function() { // called when the MIDI device is closed - - // First Remove event listeners - for (let i = 1; i < 2; i++) { - for (let x = 1; x < 4; x++) { - // TODO: Check - engine.makeConnection( - `[Channel${i}]`, - `hotcue_${x}_status`, // was _enabled - NumarkMixTrackPro.onHotCueChange, - true - ); - } - NumarkMixTrackPro.setLoopMode(i, false); - } - const lowestLED = 0x30; const highestLED = 0x73; for (let i = lowestLED; i <= highestLED; i++) { @@ -456,24 +445,26 @@ NumarkMixTrackPro.selectKnob = function( channel, control, value, - status, - group + // status, + // group ) { if (value > 63) { value = value - 128; } if (NumarkMixTrackPro.directoryMode) { + // [Playlist]SelectNextPlaylist and SelectPrevPlaylist are deprecaded + // but it respect LED on controller, [Library]MoveDown and MoveUp don't. if (value > 0) { for (let i = 0; i < value; i++) { - engine.setParameter(group, "SelectNextPlaylist", 1); + script.triggerControl("[Playlist]", "SelectNextPlaylist", 50); } } else { for (let i = 0; i < -value; i++) { - engine.setParameter(group, "SelectPrevPlaylist", 1); + script.triggerControl("[Playlist]", "SelectPrevPlaylist", 50); } } } else { - engine.setParameter(group, "SelectTrackKnob", value); + engine.setParameter("[Playlist]", "SelectTrackKnob", value); } }; @@ -487,14 +478,12 @@ NumarkMixTrackPro.LoadTrack = function( // Load the selected track in the corresponding deck only if the track is paused if (value && engine.getParameter(group, "play") !== 1) { - engine.setParameter(group, "LoadSelectedTrack", 1); + script.triggerControl(group, "LoadSelectedTrack", 50); // cargar el tema con el pitch en 0 engine.softTakeover(group, "rate", false); engine.setParameter(group, "rate", 0.5); engine.softTakeover(group, "rate", true); - } else { - engine.setParameter(group, "LoadSelectedTrack", 0); } }; @@ -599,143 +588,149 @@ NumarkMixTrackPro.playbutton = function( } }; +NumarkMixTrackPro.toggleManualLooping = function( + channel, + control, + value, + status, + group +) { + if (!value) { return; } -NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { const deck = script.deckFromGroup(group); - if (NumarkMixTrackPro.manualLoop[deck - 1]) { - if (!value) { - return; + if (NumarkMixTrackPro.shiftKey[deck - 1]) { + // If Shift is on, toggle quantize + if (engine.getParameter(group, "quantize")) { + engine.setParameter(group, "quantize", 0); + } else { + engine.setParameter(group, "quantize", 1); } - // Act like the Mixxx UI - engine.setParameter(group, "loop_in", status ? 1 : 0); - return; - } - - // Auto Loop: 1/2 loop size - const start = engine.getParameter(group, "loop_start_position"); - const end = engine.getParameter(group, "loop_end_position"); - if (start < 0 || end < 0) { - NumarkMixTrackPro.flashLED( - NumarkMixTrackPro.leds[deck].loopStartPosition, - 4 - ); - return; - } - if (value) { - const start = engine.getParameter(group, "loop_start_position"); - const end = engine.getParameter(group, "loop_end_position"); - const len = (end - start) / 2; - engine.setParameter(group, "loop_end_position", start + len); - NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopStartPosition, - true - ); + NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else { - NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopStartPosition, - false + NumarkMixTrackPro.setLoopMode( + deck, + !NumarkMixTrackPro.manualLoop[deck - 1] ); } }; -NumarkMixTrackPro.loopOut = function(channel, control, value, status, group) { - const deck = script.deckFromGroup(group); - +NumarkMixTrackPro.loopIn = function(channel, control, value, status, group) { if (!value) { return; } - if (NumarkMixTrackPro.manualLoop[deck - 1]) { - // Act like the Mixxx UI - engine.setParameter(group, "loop_out", status ? 1 : 0); - return; - } - - const isLoopActive = engine.getParameter(group, "loop_enabled"); - - // Set a 4 beat auto loop or exit the loop + const deck = script.deckFromGroup(group); - if (!isLoopActive) { - engine.setParameter(group, "beatloop_4", 1); + if (NumarkMixTrackPro.manualLoop[deck - 1]) { + // Manual Mode + script.triggerControl(group, "loop_in", 100); } else { - engine.setParameter(group, "beatloop_4", 0); + // Auto Mode + const loopActive = engine.getParameter(group, "loop_enabled"); + if (loopActive) { + script.triggerControl(group, "loop_halve", 1); + } else { + engine.setParameter(group, "beatloop_1_activate", 1); + } } }; -NumarkMixTrackPro.reLoop = function(channel, control, value, status, group) { +NumarkMixTrackPro.loopOut = function(channel, control, value, status, group) { + if (!value) { + return; + } + const deck = script.deckFromGroup(group); if (NumarkMixTrackPro.manualLoop[deck - 1]) { - // Act like the Mixxx UI (except for working delete) - if (!value) { - return; - } - if (NumarkMixTrackPro.shiftKey[deck - 1]) { - engine.setParameter(group, "reloop_exit", 0); - engine.setParameter(group, "loop_start_position", -1); - engine.setParameter(group, "loop_end_position", -1); - NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); + // Manual Mode: set LoopOut point + script.triggerControl(group, "loop_out", 100); + } else { + // Auto mode: loop of 4 beat (1 bar) + const isLoopActive = engine.getParameter(group, "loop_enabled"); + + if (!isLoopActive) { + engine.setParameter(group, "beatloop_4_activate", 1); } else { - engine.setParameter(group, "reloop_exit", status ? 1 : 0); + engine.setParameter(group, "loop_enabled", 0); } - return; } +}; - // Auto Loop: Double Loop Size - const start = engine.getParameter(group, "loop_start_position"); - const end = engine.getParameter(group, "loop_end_position"); - if (start < 0 || end < 0) { - NumarkMixTrackPro.flashLED(NumarkMixTrackPro.leds[deck].reloopExit, 4); - return; - } +NumarkMixTrackPro.reLoop = function(channel, control, value, status, group) { + if (!value) { return; } - if (value) { - const len = (end - start) * 2; - engine.setParameter(group, "loop_end_position", start + len); - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, true); + const deck = script.deckFromGroup(group); + + if (NumarkMixTrackPro.shiftKey[deck - 1]) { + // Shift: exit loop, reset Shift + script.triggerControl(group, "loop_remove", 50); + NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); + } else if (NumarkMixTrackPro.manualLoop[deck - 1]) { + // Manual mode: recall last loop or exit current loop + script.triggerControl(group, "reloop_toggle", 1); } else { - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].reloopExit, false); + // Auto mode: 2x + const loopActive = engine.getParameter(group, "loop_enabled"); + if (loopActive) { + script.triggerControl(group, "loop_double", 1); + } else { + // recall last loop + script.triggerControl(group, "reloop_toggle", 1); + } } }; NumarkMixTrackPro.setLoopMode = function(deck, manual) { NumarkMixTrackPro.manualLoop[deck - 1] = manual; - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].manualLoop, !manual); - engine.connectControl( - `[Channel${deck}]`, - "loop_start_position", - "NumarkMixTrackPro.onLoopChange", - !manual - ); - engine.connectControl( - `[Channel${deck}]`, - "loop_end_position", - "NumarkMixTrackPro.onLoopChange", - !manual - ); - engine.connectControl( - `[Channel${deck}]`, - "loop_enabled", - "NumarkMixTrackPro.onReloopExitChange", - !manual - ); - engine.connectControl( - `[Channel${deck}]`, - "loop_enabled", - "NumarkMixTrackPro.onReloopExitChangeAuto", - manual - ); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].manualLoop, manual); const group = `[Channel${deck}]`; + + if (NumarkMixTrackPro.connections === undefined) { + NumarkMixTrackPro.connections = {}; + } + + if (NumarkMixTrackPro.connections[deck] === undefined) { + NumarkMixTrackPro.connections[deck] = {}; + } + + for (const conn in NumarkMixTrackPro.connections[deck]) { + if (NumarkMixTrackPro.connections[deck][conn]) { + NumarkMixTrackPro.connections[deck][conn].disconnect(); + NumarkMixTrackPro.connections[deck][conn] = null; + } + } + + // Create if (manual) { + NumarkMixTrackPro.connections[deck].loopStart = engine.makeConnection( + group, + "loop_start_position", + NumarkMixTrackPro.onLoopChange + ); + + NumarkMixTrackPro.connections[deck].loopEnd = engine.makeConnection( + group, + "loop_end_position", + NumarkMixTrackPro.onLoopChange + ); + + NumarkMixTrackPro.connections[deck].loopEnabled = engine.makeConnection( + group, + "loop_enabled", + NumarkMixTrackPro.onReloopExitChange + ); + + // Update LED to the actual state NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopStartPosition, + NumarkMixTrackPro.leds[deck].loop_start_position, engine.getParameter(group, "loop_start_position") > -1 ); NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopEndPosition, + NumarkMixTrackPro.leds[deck].loop_end_position, engine.getParameter(group, "loop_end_position") > -1 ); NumarkMixTrackPro.setLED( @@ -743,12 +738,20 @@ NumarkMixTrackPro.setLoopMode = function(deck, manual) { engine.getParameter(group, "loop_enabled") ); } else { + // Auto Mode + NumarkMixTrackPro.connections[deck].loopEnabled = engine.makeConnection( + group, + "loop_enabled", + NumarkMixTrackPro.onReloopExitChangeAuto + ); + + // Update LED to Auto Mode NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopStartPosition, + NumarkMixTrackPro.leds[deck].loop_start_position, false ); NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopEndPosition, + NumarkMixTrackPro.leds[deck].loop_end_position, engine.getParameter(group, "loop_enabled") ); NumarkMixTrackPro.setLED( @@ -758,37 +761,6 @@ NumarkMixTrackPro.setLoopMode = function(deck, manual) { } }; -NumarkMixTrackPro.toggleManualLooping = function( - channel, - control, - value, - status, - group -) { - if (!value) { - return; - } - - const deck = script.deckFromGroup(group); - - if (NumarkMixTrackPro.shiftKey[deck - 1]) { - // activar o desactivar quantize - - if (engine.getParameter(group, "quantize")) { - engine.setParameter(group, "quantize", 0); - } else { - engine.setParameter(group, "quantize", 1); - } - - NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); - } else { - NumarkMixTrackPro.setLoopMode( - deck, - !NumarkMixTrackPro.manualLoop[deck - 1] - ); - } -}; - NumarkMixTrackPro.onLoopChange = function(value, group, key) { const deck = script.deckFromGroup(group); NumarkMixTrackPro.setLED( @@ -808,7 +780,7 @@ NumarkMixTrackPro.onReloopExitChange = function(value, group) { NumarkMixTrackPro.onReloopExitChangeAuto = function(value, group) { const deck = script.deckFromGroup(group); NumarkMixTrackPro.setLED( - NumarkMixTrackPro.leds[deck].loopEndPosition, + NumarkMixTrackPro.leds[deck].loop_end_position, value ); }; @@ -840,16 +812,69 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { let adjustedJog = parseFloat(value); // 1; 2; ...; 13 or 120; ...; 127 let posNeg = 1; if (adjustedJog > 63) { - // Counter-clockwise + // Counter-clockwise posNeg = -1; adjustedJog = value - 128; // -13 .. +13 } + // Convert to float (+/- 0.6...) + const gammaInputRange = 13; // Max jog speed + const maxOutFraction = 0.8; // Where on the curve it should peak; 0.5 is half-way + const sensitivity = 0.5; // Adjustment gamma + const gammaOutputRange = 2; // Max rate change + + const adjustedJogAdv = + posNeg * + gammaOutputRange * + Math.pow( + Math.abs(adjustedJog) / (gammaInputRange * maxOutFraction), + sensitivity + ); + + // Fast forward/rewind if beatjump_forward is pressed + if ( + NumarkMixTrackPro.isBeatJumpForwardOn[deck - 1] || + NumarkMixTrackPro.isBeatJumpBackwardOn[deck - 1] + ) { + // const x = parseFloat(value); + // console.log("x; adjustedJog; adjustedJogAdv", x, adjustedJog, adjustedJogAdv); + engine.setParameter(group, "beatjump", adjustedJog); + return; + } + + // Loop editing by Wheel + const loopActive = engine.getParameter(group, "loop_enabled"); + + if ( + NumarkMixTrackPro.settings.editLoopByWheelEnabled && + loopActive && + !NumarkMixTrackPro.scratchMode[deck - 1] && + NumarkMixTrackPro.touch[deck - 1] + ) { + if (NumarkMixTrackPro.loopEditIn[deck - 1] === -1) { + NumarkMixTrackPro.loopEditIn[deck - 1] = adjustedJog < 0 ? 0 : 1; + } + + if (NumarkMixTrackPro.loopEditIn[deck - 1] === 1) { + // begin a loop move + // loop_move_X... is very raw... + const x = engine.getParameter(group, "loop_start_position"); + const y = x + adjustedJog * 300; // 44200 / 300 = 147 parts per second + engine.setParameter(group, "loop_start_position", y); + return; + } + + if (NumarkMixTrackPro.loopEditIn[deck - 1] === 0) { + const scale = 1 + adjustedJog * 0.0009; + engine.setParameter(group, "loop_scale", scale); + return; + } + } if (engine.getParameter(group, "play")) { if ( NumarkMixTrackPro.scratchMode[deck - 1] && - posNeg === -1 && - !NumarkMixTrackPro.touch[deck - 1] + posNeg === -1 && + !NumarkMixTrackPro.touch[deck - 1] ) { if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); @@ -871,7 +896,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( 20, () => { - NumarkMixTrackPro.jogWheelStopScratch(); + NumarkMixTrackPro.jogWheelStopScratch(deck); }, true ); @@ -881,19 +906,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { engine.scratchTick(deck, adjustedJog); if (engine.getParameter(group, "play")) { - const gammaInputRange = 13; // Max jog speed - const maxOutFraction = 0.8; // Where on the curve it should peak; 0.5 is half-way - const sensitivity = 0.5; // Adjustment gamma - const gammaOutputRange = 2; // Max rate change - - adjustedJog = - posNeg * - gammaOutputRange * - Math.pow( - Math.abs(adjustedJog) / (gammaInputRange * maxOutFraction), - sensitivity - ); - engine.setParameter(group, "jog", adjustedJog); + engine.setParameter(group, "jog", adjustedJogAdv); } }; @@ -914,6 +927,7 @@ NumarkMixTrackPro.wheelTouch = function( if (!value) { // Untouch NumarkMixTrackPro.touch[deck - 1] = false; + NumarkMixTrackPro.loopEditIn[deck - 1] = -1; // paro el timer (si no existe da error mmmm) y arranco un nuevo timer. // Si en 20 milisegundos no se mueve el plato, desactiva el scratch @@ -932,14 +946,33 @@ NumarkMixTrackPro.wheelTouch = function( } else { NumarkMixTrackPro.touch[deck - 1] = true; - // if playing and scratch mode is disabled, do nothing on press + // if playing and scratch mode is disabled, do nothing on press if ( !NumarkMixTrackPro.scratchMode[deck - 1] && - engine.getParameter(group, "play") + engine.getParameter(group, "play") ) { return; } + // scratch disables braking, so stop if is braking to avoid re-play + if (NumarkMixTrackPro.settings.brakeEnabled) { + // Mixxx v.2.6+ required + if (engine.isBrakeActive(deck)) { + engine.setParameter(group, "play", 0); // Stop + } + + // TODO: little bug if engine.isSoftStartActive(deck), workaround: double-touch + // I don't understand why. + /* + if (engine.isSoftStartActive(deck)) { + // force exit from SoftStart + engine.setParameter(group, "play", 0); // Stop + // not work + // engine.setParameter(group, "play", 1); // Play + } + */ + } + if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); } @@ -960,7 +993,7 @@ NumarkMixTrackPro.toggleDirectoryMode = function( // https://manual.mixxx.org/latest/it/chapters/appendix/mixxx_controls.html#control-[Library]-focused_widget /* if (NumarkMixTrackPro.directoryMode) { - engine.setParameter('[Library]', 'MoveFocusBackward', 1); // [Shift+TAB]; [TAB]: MoveFocusForward + script.triggerControl('[Library]', 'MoveFocusBackward', 50); // [Shift+TAB]; [TAB]: MoveFocusForward } */ NumarkMixTrackPro.setLED( @@ -983,15 +1016,15 @@ NumarkMixTrackPro.onCentralKnobPress = function( ) { if (!value) { return; } - // DEPRECADED mode + // DEPRECADED mode but better if (NumarkMixTrackPro.directoryMode) { - engine.setParameter("[Playlist]", "ToggleSelectedSidebarItem", 1); + script.triggerControl("[Playlist]", "ToggleSelectedSidebarItem", 50); } else { - engine.setParameter("[Playlist]", "LoadSelectedIntoFirstStopped", 1); + script.triggerControl("[Playlist]", "LoadSelectedIntoFirstStopped", 50); } // New Mode: TODO: fix leds in toggleDirectoryMode - // engine.setParameter('[Library]', 'GoToItem', 1); + // script.triggerControl('[Library]', 'GoToItem', 50); }; NumarkMixTrackPro.toggleScratchMode = function( @@ -1037,10 +1070,11 @@ NumarkMixTrackPro.changeHotCue = function( // onHotCueChange called automatically if (NumarkMixTrackPro.shiftKey[deck - 1]) { if (engine.getParameter(group, `hotcue_${hotCue}_enabled`)) { - engine.setParameter(group, `hotcue_${hotCue}_clear`, 1); + script.triggerControl(group, `hotcue_${hotCue}_clear`, 50); } NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else { + // Press and realise button (no trigger) if (value) { engine.setParameter(group, `hotcue_${hotCue}_activate`, 1); } else { @@ -1107,7 +1141,6 @@ NumarkMixTrackPro.fxSelectKnobPress = function( group ) { // group [QuickEffectRack1_[Channel1]] or [QuickEffectRack1_[Channel2]] - // engine.setParameter(`[QuickEffectRack1_${group}]`, "super1_set_default"); if (value === 127) { script.triggerControl( `[QuickEffectRack1_${group}]`, From 3c6db1a493a29b216b314cfe256450062df0c73f Mon Sep 17 00:00:00 2001 From: vespadj Date: Fri, 21 Nov 2025 00:56:39 +0100 Subject: [PATCH 162/163] MixtrackPro: fix ledTimers, backspin inertia, settings Brake and SoftStart splitted --- res/controllers/Numark Mixtrack Pro.midi.xml | 60 ++- .../Numark-Mixtrack-Pro-scripts.js | 389 ++++++++---------- 2 files changed, 203 insertions(+), 246 deletions(-) diff --git a/res/controllers/Numark Mixtrack Pro.midi.xml b/res/controllers/Numark Mixtrack Pro.midi.xml index e8de79aeb326..217e9353e32f 100644 --- a/res/controllers/Numark Mixtrack Pro.midi.xml +++ b/res/controllers/Numark Mixtrack Pro.midi.xml @@ -3,19 +3,20 @@ Numark MixTrack Pro Matteo (matteo@magm3.com), James Ralston, and D. J. Freije (dario2004@gmail.com), Josh Patten, Vespadj - version v2.5 (2025) + version v2.5 - 2.6 (2026) https://mixxx.discourse.group/t/numark-mixtrack-pro-by-vespadj/32635 + numark_mixtrack_pro + @@ -52,6 +62,18 @@ + + + @@ -61,7 +83,7 @@ [Channel1] volume - [Channel1], volume + Mixer 0xB0 0x08 @@ -71,7 +93,7 @@ [Channel2] volume - [Channel2], volume + Mixer 0xB0 0x09 @@ -188,7 +210,7 @@ [Master] gain - [Master],gain + Mixer 0xB0 0x17 @@ -648,7 +670,6 @@ [QuickEffectRack1_[Channel2]] super1_set_default - was [EffectRack1_EffectUnit2_Effect1],clear 0x90 0x67 @@ -658,7 +679,6 @@ [Channel1] NumarkMixTrackPro.fxSelectKnobPress - was [EffectRack1_EffectUnit1_Effect1],clear 0x90 0x68 diff --git a/res/controllers/Numark-Mixtrack-Pro-scripts.js b/res/controllers/Numark-Mixtrack-Pro-scripts.js index 3c9fc1604ef9..68605b025e2e 100644 --- a/res/controllers/Numark-Mixtrack-Pro-scripts.js +++ b/res/controllers/Numark-Mixtrack-Pro-scripts.js @@ -3,6 +3,8 @@ // // 5/18/2011 - Changed by James Ralston // +// 05/26/2012 to 06/27/2012 - Changed by Darío José Freije +// // 3/11/2024 - Changed by Josh Patten // codespell:ignore patten // 2025-04-19 - engine.softTakeover("[Channel1]", "rate", true); by vespadj // - waveform_zoom _up _down: press hold and rotate FX Select Deck1 @@ -11,66 +13,12 @@ // - Fast forward/rewind: hold beatjump_forward + jogWheel (or beatjump_backward) // // Known Bugs: -// Mixxx complains about an undefined variable on 1st load of the mapping (ignore it, then restart Mixxx) -// Each slide/knob needs to be moved on Mixxx startup to match levels with the Mixxx UI -// -// 05/26/2012 to 06/27/2012 - Changed by Darío José Freije -// -// Almost all work like expected. Resume and Particularities: -// -// ************* Script now is Only for 1.11.0 and above ************* -// -// "Delete", aka "VIEW" and "TICK" buttons, used as [Shift]. -// -// Delete + Hotcues: Clear Hotcues (First press Delete, then Hotcue). -// Delete + Reloop: Clear Loop. -// Delete + Manual: Set Quantize ON (for best manual loop) or OFF. -// Delete + Sync: Set Pitch to Zero. -// -// Load track: Only if the track is paused. Put the pitch in 0 at load. -// -// Gain: The 3rd knob of the "effect" section is "Gain" (up to clip). -// -// Effect: Flanger. 1st and 2nd knob modify Depth and Delay. -// -// Cue: Don't set Cue accidentally at the end of the song (return to the latest cue). -// LED ON when stopped. LED OFF when playing. -// LED Blink at Beat time in the ultimates 30 seconds of song. -// -// Stutter: Adjust BeatGrid in the correct place (useful to sync well). -// LED Blink at each Beat of the grid. -// -// Sync: If the other deck is stopped, only sync tempo (not phase). -// LED Blink at Clip Gain (Peak indicator). -// -// Pitch: Up, Up; Down, Down. Pitch slide are inverted, to match with the screen (otherwise is very confusing). -// Soft-takeover to prevent sudden wide parameter changes when the on-screen control diverges from a hardware control. -// The control will have no effect until the position is close to that of the software, -// at which point it will take over and operate as usual. -// -// Auto Loop (LED ON): Active at program Start. -// "1 Bar" button: Active an Instant 4 beat Loop. Press again to exit loop. -// -// Scratch: -// In Stop mode, with Scratch OFF or ON: Scratch at touch, and Stop moving when the wheel stop moving. -// In Play mode, with Scratch OFF: Only Pitch bend. -// In Play mode, with Scratch ON: Scratch at touch and, in Backwards Stop Scratch when the wheel stop moving for 20ms -> BACKSPIN EFFECT!!!!. -// In Fordward Stop Scratch when the touch is released > Play Immediately (without breaks for well mix). -// Border of the wheels: Pitch Bend. +// - Touch the Jog Wheel during Soft Start is ignored. Work-around: double touch. // +// See Manual as reference - -// Global constants/variables -const ON = 0x7f; -/* -const OFF = 0x00; -const DOWN = 0x7f; -const FW = 0x01; // wheel forward -const RW = 0x7f; // wheel rewind -*/ - -/* eslint no-undef: "error" */ -function NumarkMixTrackPro() {} +// eslint-disable-next-line no-var +var NumarkMixTrackPro = {}; NumarkMixTrackPro.init = function(id) { // called when the MIDI device is opened & set up @@ -84,7 +32,8 @@ NumarkMixTrackPro.init = function(id) { NumarkMixTrackPro.shiftKey = [false, false]; // used as [Shift], aka "VIEW" and "TICK" buttons NumarkMixTrackPro.touch = [false, false]; NumarkMixTrackPro.scratchTimer = [-1, -1]; - NumarkMixTrackPro.fxKnobPressed = false; // TODO: to [0, 0] + NumarkMixTrackPro.scratchLast = [-1, -1]; + NumarkMixTrackPro.fxKnobPressed = [0, 0]; NumarkMixTrackPro.syncLastTimestamp = [0, 0]; NumarkMixTrackPro.loopEditIn = [-1, -1]; @@ -258,10 +207,12 @@ NumarkMixTrackPro.init = function(id) { // get and map const settingsOptions = [ - "brakeEnabled", "meanPitchBendBtns", "editLoopByWheelEnabled", + "brakeEnabled", + "softStartEnabled", "quickFxActivator", + "scratchSensibility", ]; settingsOptions.forEach((item) => { NumarkMixTrackPro.settings[item] = @@ -269,6 +220,15 @@ NumarkMixTrackPro.init = function(id) { }); }; +NumarkMixTrackPro.shutdown = function() { + // called when the MIDI device is closed + const lowestLED = 0x30; + const highestLED = 0x73; + for (let i = lowestLED; i <= highestLED; i++) { + NumarkMixTrackPro.setLED(i, false); // Turn off all the lights + } +}; + NumarkMixTrackPro.pitchBendBtns = function(group, value, isPlus) { switch (NumarkMixTrackPro.settings.meanPitchBendBtns) { case "beatjump": @@ -301,7 +261,7 @@ NumarkMixTrackPro.pitchBendBtns = function(group, value, isPlus) { break; default: - console.log( + console.error( "NumarkMixTrackPro.settings.meanPitchBendBtns", NumarkMixTrackPro.settings.meanPitchBendBtns ); @@ -345,109 +305,78 @@ NumarkMixTrackPro.pitchFader = function( engine.setParameter(group, "rate", newValue); }; -NumarkMixTrackPro.Channel1Clip = function(value) { - NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[1].sync); -}; - -NumarkMixTrackPro.Channel2Clip = function(value) { - NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[2].sync); -}; - -NumarkMixTrackPro.Stutter1Beat = function(value) { +NumarkMixTrackPro.setStutterBeat = function(deck, value) { const secondsBlink = 30; const secondsToEnd = - engine.getParameter("[Channel1]", "duration") * - (1 - engine.getParameter("[Channel1]", "playposition")); + engine.getParameter(`[Channel${deck}]`, "duration") * + (1 - engine.getParameter(`[Channel${deck}]`, "playposition")); if ( secondsToEnd < secondsBlink && secondsToEnd > 1 && - engine.getParameter("[Channel1]", "play") + engine.getParameter(`[Channel${deck}]`, "play") ) { // The song is going to end - - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1].Cue, value); + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].Cue, value); } - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[1].stutter, value); + + NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, value); +}; + +NumarkMixTrackPro.Stutter1Beat = function(value) { + NumarkMixTrackPro.setStutterBeat(1, value); }; NumarkMixTrackPro.Stutter2Beat = function(value) { - const secondsBlink = 30; - const secondsToEnd = - engine.getParameter("[Channel2]", "duration") * - (1 - engine.getParameter("[Channel2]", "playposition")); + NumarkMixTrackPro.setStutterBeat(2, value); +}; - if ( - secondsToEnd < secondsBlink && - secondsToEnd > 1 && - engine.getParameter("[Channel2]", "play") - ) { - // The song is going to end +NumarkMixTrackPro.ledTimers = NumarkMixTrackPro.ledTimers || {}; + +NumarkMixTrackPro.setLED = function(note, on) { + midi.sendShortMsg(0x90, note, on ? 0x64 : 0x00); +}; + +NumarkMixTrackPro.flashLED = function(note, times) { + const timers = NumarkMixTrackPro.ledTimers; - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2].Cue, value); + if (timers[note]) { + engine.stopTimer(timers[note].id); } - NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[2].stutter, value); + timers[note] = {counter: 0, times: times, state: false}; + + timers[note].id = engine.beginTimer(120, function() { + const obj = timers[note]; + if (!obj || obj.counter >= obj.times) { + if (obj) { engine.stopTimer(obj.id); } + delete timers[note]; + NumarkMixTrackPro.setLED(note, false); + return; + } + obj.counter++; + obj.state = !obj.state; + NumarkMixTrackPro.setLED(note, obj.state); + }); }; NumarkMixTrackPro.clipLED = function(value, note) { if (value > 0) { NumarkMixTrackPro.flashLED(note, 1); } else { - NumarkMixTrackPro.setLED(note, value); + NumarkMixTrackPro.setLED(note, false); } }; -NumarkMixTrackPro.shutdown = function() { - // called when the MIDI device is closed - const lowestLED = 0x30; - const highestLED = 0x73; - for (let i = lowestLED; i <= highestLED; i++) { - NumarkMixTrackPro.setLED(i, false); // Turn off all the lights - } -}; - -NumarkMixTrackPro.setLED = function(value, status) { - status = status ? 0x64 : 0x00; - midi.sendShortMsg(0x90, value, status); -}; - -NumarkMixTrackPro.flashLED = function(led, veces) { - const ndx = Math.random(); - const id = engine.beginTimer(120, NumarkMixTrackPro.doFlash(ndx, veces)); - NumarkMixTrackPro.ledTimers[ndx] = new NumarkMixTrackPro.LedTimer( - id, - led, - 0, - false - ); +NumarkMixTrackPro.Channel1Clip = function(value) { + NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[1].sync); }; -NumarkMixTrackPro.doFlash = function(ndx, veces) { - const ledTimer = NumarkMixTrackPro.ledTimers[ndx]; - - if (!ledTimer) { - return; - } - - if (ledTimer.count > veces) { - // how many times blink the button - engine.stopTimer(ledTimer.id); - delete NumarkMixTrackPro.ledTimers[ndx]; - } else { - ledTimer.count++; - ledTimer.state = !ledTimer.state; - NumarkMixTrackPro.setLED(ledTimer.led, ledTimer.state); - } +NumarkMixTrackPro.Channel2Clip = function(value) { + NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[2].sync); }; -NumarkMixTrackPro.selectKnob = function( - channel, - control, - value, - // status, - // group -) { +NumarkMixTrackPro.selectKnob = function(channel, control, value) { if (value > 63) { value = value - 128; } @@ -475,12 +404,10 @@ NumarkMixTrackPro.LoadTrack = function( status, group ) { - // Load the selected track in the corresponding deck only if the track is paused - - if (value && engine.getParameter(group, "play") !== 1) { + if (value) { script.triggerControl(group, "LoadSelectedTrack", 50); - // cargar el tema con el pitch en 0 + // reset rate/pitch to 0% engine.softTakeover(group, "rate", false); engine.setParameter(group, "rate", 0.5); engine.softTakeover(group, "rate", true); @@ -494,11 +421,22 @@ NumarkMixTrackPro.cuebutton = function( status, group ) { - // Don't set Cue accidentally at the end of the song - if (engine.getParameter(group, "playposition") <= 0.97) { - engine.setParameter(group, "cue_default", value ? 1 : 0); + const deck = script.deckFromGroup(group); + // Ignore during Brake or Soft Start + if ( + typeof engine.isBrakeActive === "function" && + (engine.isBrakeActive(deck) || engine.isSoftStartActive(deck)) && + value // ON + ) { + + return; + } + + // Don't set Cue at the end of the song + if (engine.getParameter(group, "playposition") > 0.97) { + engine.setParameter(group, "cue_goto", value ? 1 : 0); } else { - engine.setParameter(group, "cue_preview", value ? 1 : 0); + engine.setParameter(group, "cue_default", value ? 1 : 0); } }; @@ -530,7 +468,7 @@ NumarkMixTrackPro.beatsync = function(channel, control, value, status, group) { const syncLeader = engine.getParameter(group, "sync_leader"); const timestamp = Date.now(); - if (value === ON) { + if (value) { if (!syncLeader) { engine.setParameter(group, "sync_enabled", true); lastTimestamp.set(timestamp); @@ -550,36 +488,44 @@ NumarkMixTrackPro.beatsync = function(channel, control, value, status, group) { } }; -NumarkMixTrackPro.playbutton = function( - channel, - control, - value, - status, - group -) { +NumarkMixTrackPro.playbutton = function(channel, control, value, status, group) { if (!value) { + // (NoteOff, 0x00, button up) return; - } // (NoteOff, 0x00, button up) + } + const deck = script.deckFromGroup(group); - if (!NumarkMixTrackPro.settings.brakeEnabled) { - // Play/Pause standard - if (engine.getParameter(group, "play")) { - engine.setParameter(group, "play", 0); + if (typeof engine.isBrakeActive !== "function") { + // Legacy Mixxx v.2.5 + // Play/Pause standard + if (engine.getValue(group, "play")) { + engine.setValue(group, "play", 0); } else { - engine.setParameter(group, "play", 1); + engine.setValue(group, "play", 1); } } else { - // Brake and Soft Start if scratch led is on - // Mixxx v.2.6+ required - if (engine.getParameter(group, "play") && !engine.isBrakeActive(deck)) { - if (NumarkMixTrackPro.scratchMode[deck - 1]) { + // Mixxx v.2.6+ required + // Brake and Soft Start if scratch led is on and setting is enabled. + // Else Play/Pause standard + if (engine.getParameter(group, "play")) { + if ( + NumarkMixTrackPro.settings.brakeEnabled && + NumarkMixTrackPro.scratchMode[deck - 1] && + !engine.isScratching(deck) && + engine.getParameter(group, "play_latched") + ) { engine.brake(deck, true); } else { engine.setParameter(group, "play", 0); } } else { - if (NumarkMixTrackPro.scratchMode[deck - 1]) { + if ( + NumarkMixTrackPro.settings.softStartEnabled && + NumarkMixTrackPro.scratchMode[deck - 1] && + !engine.isScratching(deck) && + !engine.getParameter(group, "play_latched") + ) { engine.softStart(deck, true); } else { engine.setParameter(group, "play", 1); @@ -805,8 +751,8 @@ NumarkMixTrackPro.playFromCue = function( }; - NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { + // a.k.a. wheelTurn const deck = script.deckFromGroup(group); let adjustedJog = parseFloat(value); // 1; 2; ...; 13 or 120; ...; 127 @@ -858,7 +804,7 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { // begin a loop move // loop_move_X... is very raw... const x = engine.getParameter(group, "loop_start_position"); - const y = x + adjustedJog * 300; // 44200 / 300 = 147 parts per second + const y = x + adjustedJog * 300; // 44100 / 300 = 147 parts per second engine.setParameter(group, "loop_start_position", y); return; } @@ -870,49 +816,29 @@ NumarkMixTrackPro.jogWheel = function(channel, control, value, status, group) { } } - if (engine.getParameter(group, "play")) { - if ( - NumarkMixTrackPro.scratchMode[deck - 1] && - posNeg === -1 && - !NumarkMixTrackPro.touch[deck - 1] - ) { - if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { - engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); - } - NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( - 20, - () => { - NumarkMixTrackPro.jogWheelStopScratch(deck); - }, - true - ); + // Normal usage + if (engine.isScratching(deck)) { + engine.scratchTick(deck, adjustedJog); // Scratch! + if (posNeg === -1) { + // only in backspin save timestamp for inertia wheel + NumarkMixTrackPro.scratchLast[deck - 1] = Date.now(); } } else { - // stop scratching - if (!NumarkMixTrackPro.touch[deck - 1]) { - if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { - engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); - } - NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( - 20, - () => { - NumarkMixTrackPro.jogWheelStopScratch(deck); - }, - true - ); - } - } - - engine.scratchTick(deck, adjustedJog); - - if (engine.getParameter(group, "play")) { - engine.setParameter(group, "jog", adjustedJogAdv); + engine.setValue(group, "jog", adjustedJogAdv); // Pitch bend } }; NumarkMixTrackPro.jogWheelStopScratch = function(deck) { - NumarkMixTrackPro.scratchTimer[deck - 1] = -1; - engine.scratchDisable(deck); + // Inertia debounce: Compare timestamp of last wheel movement + if ( + Date.now() - NumarkMixTrackPro.scratchLast[deck - 1] > 20 || + !engine.isScratching(deck) + ) { + engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + NumarkMixTrackPro.scratchTimer[deck - 1] = -1; + NumarkMixTrackPro.scratchLast[deck - 1] = -1; + engine.scratchDisable(deck); + } }; NumarkMixTrackPro.wheelTouch = function( @@ -923,29 +849,31 @@ NumarkMixTrackPro.wheelTouch = function( group ) { const deck = script.deckFromGroup(group); + NumarkMixTrackPro.touch[deck - 1] = !!value; if (!value) { - // Untouch - NumarkMixTrackPro.touch[deck - 1] = false; + // Untouch! + // Reset loopEditIn NumarkMixTrackPro.loopEditIn[deck - 1] = -1; - // paro el timer (si no existe da error mmmm) y arranco un nuevo timer. - // Si en 20 milisegundos no se mueve el plato, desactiva el scratch + // Disable scratching / backspin after untouch and wheel inertia after + // Stop any previous timer if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + NumarkMixTrackPro.scratchTimer[deck - 1] = -1; } + // Start a timer NumarkMixTrackPro.scratchTimer[deck - 1] = engine.beginTimer( - 20, + 20, // (20 ms minimal resolution) () => { NumarkMixTrackPro.jogWheelStopScratch(deck); }, - true + false // non one-shot ); } else { - NumarkMixTrackPro.touch[deck - 1] = true; - + // Touch! // if playing and scratch mode is disabled, do nothing on press if ( !NumarkMixTrackPro.scratchMode[deck - 1] && @@ -955,16 +883,17 @@ NumarkMixTrackPro.wheelTouch = function( } // scratch disables braking, so stop if is braking to avoid re-play - if (NumarkMixTrackPro.settings.brakeEnabled) { + if (typeof engine.isBrakeActive === "function") { // Mixxx v.2.6+ required - if (engine.isBrakeActive(deck)) { + + if (engine.isBrakeActive(deck) && NumarkMixTrackPro.settings.brakeEnabled) { engine.setParameter(group, "play", 0); // Stop } // TODO: little bug if engine.isSoftStartActive(deck), workaround: double-touch // I don't understand why. /* - if (engine.isSoftStartActive(deck)) { + if (engine.isSoftStartActive(deck) && NumarkMixTrackPro.settings.softStartEnabled) { // force exit from SoftStart engine.setParameter(group, "play", 0); // Stop // not work @@ -973,12 +902,17 @@ NumarkMixTrackPro.wheelTouch = function( */ } + // Cancel timer if (NumarkMixTrackPro.scratchTimer[deck - 1] !== -1) { engine.stopTimer(NumarkMixTrackPro.scratchTimer[deck - 1]); + NumarkMixTrackPro.scratchTimer[deck - 1] = -1; } - // change the 600 value for sensibility - engine.scratchEnable(deck, 600, 33 + 1 / 3, 1.0 / 8, 1.0 / 8 / 32); + const sensibility = + NumarkMixTrackPro.settings.scratchSensibility || 600; + const alpha = 1.0 / 8; + const beta = alpha / 32; + engine.scratchEnable(deck, sensibility, 33 + 1 / 3, alpha, beta); } }; @@ -990,7 +924,7 @@ NumarkMixTrackPro.toggleDirectoryMode = function( // Toggle setting and light if (value) { NumarkMixTrackPro.directoryMode = !NumarkMixTrackPro.directoryMode; - // https://manual.mixxx.org/latest/it/chapters/appendix/mixxx_controls.html#control-[Library]-focused_widget + // https://manual.mixxx.org/latest/chapters/appendix/mixxx_controls.html#control-[Library]-focused_widget /* if (NumarkMixTrackPro.directoryMode) { script.triggerControl('[Library]', 'MoveFocusBackward', 50); // [Shift+TAB]; [TAB]: MoveFocusForward @@ -1010,9 +944,7 @@ NumarkMixTrackPro.toggleDirectoryMode = function( NumarkMixTrackPro.onCentralKnobPress = function( channel, control, - value, - // status, - // group + value ) { if (!value) { return; } @@ -1140,16 +1072,18 @@ NumarkMixTrackPro.fxSelectKnobPress = function( status, group ) { - // group [QuickEffectRack1_[Channel1]] or [QuickEffectRack1_[Channel2]] + const deck = script.deckFromGroup(group); + + // [QuickEffectRack1_[Channel1]] or [QuickEffectRack1_[Channel2]] if (value === 127) { script.triggerControl( `[QuickEffectRack1_${group}]`, "super1_set_default", 100 ); - NumarkMixTrackPro.fxKnobPressed = true; + NumarkMixTrackPro.fxKnobPressed[deck - 1] = true; } else { - NumarkMixTrackPro.fxKnobPressed = false; + NumarkMixTrackPro.fxKnobPressed[deck - 1] = false; } }; @@ -1160,11 +1094,14 @@ NumarkMixTrackPro.fxSelectKnobRotate = function( status, group ) { - if (NumarkMixTrackPro.fxKnobPressed) { - if (value === 0x7f) { - script.triggerControl(group, "waveform_zoom_down", 100); - } else { - script.triggerControl(group, "waveform_zoom_up", 100); + const deck = script.deckFromGroup(group); + if (NumarkMixTrackPro.fxKnobPressed[deck - 1]) { + if (deck === 1) { + if (value === 0x7f) { + script.triggerControl(group, "waveform_zoom_down", 100); + } else { + script.triggerControl(group, "waveform_zoom_up", 100); + } } } else { // Select FX From 8ad03c2cd90508a24aa7f58d6790199ce515ed82 Mon Sep 17 00:00:00 2001 From: vespadj Date: Thu, 16 Apr 2026 00:06:56 +0200 Subject: [PATCH 163/163] MixtrackPro: fix reviewer note --- .../Numark-Mixtrack-Pro-scripts.js | 95 ++++++------------- 1 file changed, 31 insertions(+), 64 deletions(-) diff --git a/res/controllers/Numark-Mixtrack-Pro-scripts.js b/res/controllers/Numark-Mixtrack-Pro-scripts.js index 68605b025e2e..8f135e688702 100644 --- a/res/controllers/Numark-Mixtrack-Pro-scripts.js +++ b/res/controllers/Numark-Mixtrack-Pro-scripts.js @@ -56,7 +56,6 @@ NumarkMixTrackPro.init = function(id) { NumarkMixTrackPro.isPflOn = [0, 0]; engine.makeConnection("[Channel1]", "pfl", (value) => { NumarkMixTrackPro.isPflOn[0] = value; - console.log("NumarkMixTrackPro.isPflOn[0]", NumarkMixTrackPro.isPflOn[0]); }); engine.makeConnection("[Channel2]", "pfl", (value) => { NumarkMixTrackPro.isPflOn[1] = value; @@ -127,13 +126,6 @@ NumarkMixTrackPro.init = function(id) { NumarkMixTrackPro.ledTimers = {}; - NumarkMixTrackPro.LedTimer = function(id, led, count, state) { - this.id = id; - this.led = led; - this.count = count; - this.state = state; - }; - // Turn off all the lights for (let i = 0x30; i <= 0x73; i++) { midi.sendShortMsg(0x90, i, 0x00); @@ -182,24 +174,24 @@ NumarkMixTrackPro.init = function(id) { engine.makeConnection( "[Channel1]", "peak_indicator", - NumarkMixTrackPro.Channel1Clip + NumarkMixTrackPro.clipLED ); engine.makeConnection( "[Channel2]", "peak_indicator", - NumarkMixTrackPro.Channel2Clip + NumarkMixTrackPro.clipLED ); // Stutter beat light engine.makeConnection( "[Channel1]", "beat_active", - NumarkMixTrackPro.Stutter1Beat + NumarkMixTrackPro.flashStutterLED ); engine.makeConnection( "[Channel2]", "beat_active", - NumarkMixTrackPro.Stutter2Beat + NumarkMixTrackPro.flashStutterLED ); // Settings @@ -305,32 +297,18 @@ NumarkMixTrackPro.pitchFader = function( engine.setParameter(group, "rate", newValue); }; -NumarkMixTrackPro.setStutterBeat = function(deck, value) { - const secondsBlink = 30; - const secondsToEnd = - engine.getParameter(`[Channel${deck}]`, "duration") * - (1 - engine.getParameter(`[Channel${deck}]`, "playposition")); - +NumarkMixTrackPro.flashStutterLED = function(value, group) { + const deck = script.deckFromGroup(group); if ( - secondsToEnd < secondsBlink && - secondsToEnd > 1 && - engine.getParameter(`[Channel${deck}]`, "play") + engine.getParameter(group, "end_of_track") && + engine.getParameter(group, "play") ) { - // The song is going to end NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].Cue, value); } NumarkMixTrackPro.setLED(NumarkMixTrackPro.leds[deck].stutter, value); }; -NumarkMixTrackPro.Stutter1Beat = function(value) { - NumarkMixTrackPro.setStutterBeat(1, value); -}; - -NumarkMixTrackPro.Stutter2Beat = function(value) { - NumarkMixTrackPro.setStutterBeat(2, value); -}; - NumarkMixTrackPro.ledTimers = NumarkMixTrackPro.ledTimers || {}; NumarkMixTrackPro.setLED = function(note, on) { @@ -360,7 +338,9 @@ NumarkMixTrackPro.flashLED = function(note, times) { }); }; -NumarkMixTrackPro.clipLED = function(value, note) { +NumarkMixTrackPro.clipLED = function(value, group) { + const deck = script.deckFromGroup(group); + const note = NumarkMixTrackPro.leds[deck].sync; if (value > 0) { NumarkMixTrackPro.flashLED(note, 1); } else { @@ -368,14 +348,6 @@ NumarkMixTrackPro.clipLED = function(value, note) { } }; -NumarkMixTrackPro.Channel1Clip = function(value) { - NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[1].sync); -}; - -NumarkMixTrackPro.Channel2Clip = function(value) { - NumarkMixTrackPro.clipLED(value, NumarkMixTrackPro.leds[2].sync); -}; - NumarkMixTrackPro.selectKnob = function(channel, control, value) { if (value > 63) { value = value - 128; @@ -407,10 +379,13 @@ NumarkMixTrackPro.LoadTrack = function( if (value) { script.triggerControl(group, "LoadSelectedTrack", 50); - // reset rate/pitch to 0% - engine.softTakeover(group, "rate", false); - engine.setParameter(group, "rate", 0.5); - engine.softTakeover(group, "rate", true); + // * Reset rate/pitch to 0% + // that can be set in: + // Preferences -> Decks -> Key and Speed options. + // Old code as reference, in case on particular custom needs: + // engine.softTakeover(group, "rate", false); + // engine.setParameter(group, "rate", 0.5); + // engine.softTakeover(group, "rate", true); } }; @@ -497,23 +472,19 @@ NumarkMixTrackPro.playbutton = function(channel, control, value, status, group) const deck = script.deckFromGroup(group); if (typeof engine.isBrakeActive !== "function") { - // Legacy Mixxx v.2.5 - // Play/Pause standard - if (engine.getValue(group, "play")) { - engine.setValue(group, "play", 0); - } else { - engine.setValue(group, "play", 1); - } + // Legacy Mixxx v.2.5 + // Play/Pause standard + script.toggleControl(group, "play"); } else { - // Mixxx v.2.6+ required - // Brake and Soft Start if scratch led is on and setting is enabled. - // Else Play/Pause standard + // Mixxx v.2.6+ required + // Brake and Soft Start if scratch led is on and setting is enabled. + // Else Play/Pause standard if (engine.getParameter(group, "play")) { if ( NumarkMixTrackPro.settings.brakeEnabled && - NumarkMixTrackPro.scratchMode[deck - 1] && - !engine.isScratching(deck) && - engine.getParameter(group, "play_latched") + NumarkMixTrackPro.scratchMode[deck - 1] && + !engine.isScratching(deck) && + engine.getParameter(group, "play_latched") ) { engine.brake(deck, true); } else { @@ -522,9 +493,9 @@ NumarkMixTrackPro.playbutton = function(channel, control, value, status, group) } else { if ( NumarkMixTrackPro.settings.softStartEnabled && - NumarkMixTrackPro.scratchMode[deck - 1] && - !engine.isScratching(deck) && - !engine.getParameter(group, "play_latched") + NumarkMixTrackPro.scratchMode[deck - 1] && + !engine.isScratching(deck) && + !engine.getParameter(group, "play_latched") ) { engine.softStart(deck, true); } else { @@ -547,11 +518,7 @@ NumarkMixTrackPro.toggleManualLooping = function( if (NumarkMixTrackPro.shiftKey[deck - 1]) { // If Shift is on, toggle quantize - if (engine.getParameter(group, "quantize")) { - engine.setParameter(group, "quantize", 0); - } else { - engine.setParameter(group, "quantize", 1); - } + script.toggleControl(group, "quantize"); NumarkMixTrackPro.toggleShiftKey(channel, control, value, status, group); } else {
  • |I(5&8~V=S8eeOl;1|((UwkR*x51K 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 delta 24820 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 z zF$~|2q~A$|5A-EvR<(#2WCO3ai;?fu5DgzMMw(ZUHg%5}xiTLfk(+LaT&|k$U)(r$ zMvOX+;rL#EF{Tg`42=R7KTo9m3R!4dDN={pVf%FzRs|DH@qA(Jhke2Rzliz2p+Rw-grjH!Y1^)f zEU()n?aLI|&txPd`isRC7Lr%IBtG;*hx$De%XDC&M~PT5<1w7q(PE9fgp^U|M80!J z327Rhi*5!ov~ofv|c&f8*B_d`e&{9SC$#CScwU2OSqHz}5RqWBbg z{Gd&IUXT610~d*{^Rf_JP8B81aip1eOO)m!J`iwFY^w`J$9@oBR$34VZ56u%k-#wb znb`dZ<^Qu@IQP_rljcC0*n2sW^d>8La^3lJD^E(oV#%GEPMo?&?zqmXrfwVDJars^x(fux>J}ZEf zxaZ=E7lv&&u0m;+^Rl?s7Zb*=J>q&)Ja##ml81e+~iaYx;j5ZrZ(~yOv?Yu+$ycsO2J1%~);6sM(k>bHo#0j2!Djsg= z3$uHUX!$`;6tzP<-9C+|xJrexU;SC}Z1zy7!?VO6sSio}$7Io#3|(;RAT#MA=kDJ+ z^MGH@`o$luUo7F!;LzfbtJW`8UfWgm*k5N-TwMZnKCZQax<0OuK;0%E4;n`fvQZiZ zQVc!;farw#80WC11;)7k60GwM_#F`8?r zQlJAaAPbquPG+Do;o6LI_p>zIH{;syuM`O*wjoI#m|lP>tZ)HyoK?9kg?p9JZAd%i+3WCh+#vUe0z z)IO+1C7a9fvC@yZ8Qd}JI`u!7&9GqwUMr0gLJ9R9TbZ$+Q^C`?&kh4J>A9K z^mRXbLFYv(#Z%Gmbka)jfd6!?>Ei6&6T^ygKu!5*A#%?x&AXPER3 zbGpfz>CjtkDVgaRZcaOF24kvSzrbu-s5i`o94s{0l3w(E;0l_iHpT|5iNN?mn5?*G zLJJJIwgRRUHty{1OvK%EiojOuPzpoWLb2I;1O=(xa?87$WDYzZi!xRSh5`42@Lo3R za-X|PhT}K5gA?Iks@|GmvKbs!n_Zt~PBrNhGtwhML&JhYhl~i)8*C1<-4QX?YK<{4 zTaZ3D8&Vq)8Xi8l3gf77&P#piEf7AjV0L%c!%9il)7(+Fh&82|j1E(h-iYc=cGr^C zx;|Bx*6Jq8p6{up7N|5gK|-u9&!>u)k3Slyasym4P!b5@mIDj^{b`7+u~PC1wbFtP n4F1ts84x63@DF`K BasePlaylistFeature - + New Playlist Nov seznam predvajanja @@ -160,7 +160,7 @@ - + Create New Playlist Ustvari nov seznam predvajanja @@ -190,113 +190,120 @@ Podvoji - - + + Import Playlist Uvozi seznam predvajanja - + Export Track Files Izvozi datoteke skladb - + Analyze entire Playlist Analiziraj celoten seznam predvajanja - + Enter new name for playlist: Vnesi novo ime seznama predvajanja: - + Duplicate Playlist Podvoji seznam predvajanja - - + + Enter name for new playlist: Vnesi ime seznama predvajanja: - - + + Export Playlist Izvozi seznam predvajanja - + Add to Auto DJ Queue (replace) Dodaj v zaporedje samodejnega DJ-a (zamenjaj) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Preimenuj seznam predvajanja - - + + Renaming Playlist Failed Napaka pri preimenovanju seznama predvajanja - - - + + + A playlist by that name already exists. Seznam predvajanja s tem imenom že obstaja. - - - + + + A playlist cannot have a blank name. Seznam predvajanja ne more biti brez imena. - + _copy //: Appendix to default name when duplicating a playlist _kopija - - - - - - + + + + + + Playlist Creation Failed Ustvarjanje seznama predvajanja je spodletelo - - + + An unknown error occurred while creating playlist: Neznana napaka pri ustvarjanju novega seznama predvajanja: - + Confirm Deletion Potrdite izbris - + Do you really want to delete playlist <b>%1</b>? Ali res želite izbrisati seznam predvajanja <b>%1</b>? - + M3U Playlist (*.m3u) M3U seznam predvajanja (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U seznam predvajanja (*.m3u);;M3U8 seznam predvajanja (*.m3u8);;PLS seznam predvajanja (*.pls);;z vejicami ločen tekst (*.csv);;berljiv tekst (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # št. - + Timestamp časovni žig @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ne morem naložiti skladbe. @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Izvajalec albuma - + Artist Izvajalec - + Bitrate Bitna hitrost - + BPM BPM - + Channels Kanali - + Color Barva - + Comment Komentar - + Composer Skladatelj - + Cover Art Naslovnica - + Date Added Datum dodajanja - + Last Played Nazadnje predvajano - + Duration Trajanje - + Type Vrsta - + Genre Zvrst - + Grouping Grupiranje - + Key Tonaliteta - + Location Lokacija - + Overview - + Pregled - + Preview Predposlušanje - + Rating Ocena - + ReplayGain ReplayGain - + Samplerate Frekvenca vzorčenja - + Played Predvajano - + Title Naslov - + Track # Št. skladbe - + Year Leto - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Razčlenitev slike ... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Računalnik" omogoča izbiranje, pregledovanje in nalaganje skladb iz map na vašem disku ali zunanjih naprav. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -3632,32 +3649,32 @@ trace - gornje + profilirna sporočila ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Funkcionalnost, ki jo ponuja to mapiranje kontrolerja, bo onemogočena, dokler težava ne bo razrešena. - + You can ignore this error for this session but you may experience erratic behavior. To napako lahko ignorirate za čas te seje, vendar lahko to povzroči nepričakovano obnašanje programa. - + Try to recover by resetting your controller. Poskusite odpraviti napako z restiranjem kontrolerja. - + Controller Mapping Error Napaka v mapiranju kontrolerja - + The mapping for your controller "%1" is not working properly. Mapiranje za kontroler "%1" ne deluje pravilno. - + The script code needs to be fixed. Kodo skripte je potrebno popraviti. @@ -3765,7 +3782,7 @@ trace - gornje + profilirna sporočila Uvozi zaboj - + Export Crate Izvozi zaboj @@ -3775,7 +3792,7 @@ trace - gornje + profilirna sporočila Odkleni - + An unknown error occurred while creating crate: Neznana napaka pri ustvarjanju zaboja: @@ -3801,17 +3818,17 @@ trace - gornje + profilirna sporočila Premineovanje zaboja ni uspelo - + Crate Creation Failed Ustvarjanje zaboja ni uspelo - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U seznam predvajanja (*.m3u);;M3U8 seznam predvajanja (*.m3u8);;PLS seznam predvajanja (*.pls);;z vejicami ločen tekst (*.csv);;berljiv tekst (*.txt) - + M3U Playlist (*.m3u) M3U seznam predvajanja (*.m3u) @@ -3937,12 +3954,12 @@ trace - gornje + profilirna sporočila Bivši sodelujoči - + Official Website Uradna spletna stran - + Donate Doniraj @@ -3998,7 +4015,7 @@ trace - gornje + profilirna sporočila - + Analyze Analiziraj @@ -4043,17 +4060,17 @@ trace - gornje + profilirna sporočila Za izbrano skladbo izvede prepoznavanje ritmične mreže, tonalitete in ReplayGain ojačitve. Za izbrane skladbe ne ustvari valovnih oblik, da se ohrani prostor na disku. - + Stop Analysis Ustavi analizo - + Analyzing %1% %2/%3 Analiziram %1% %2/%3 - + Analyzing %1/%2 Analiziram %1/%2 @@ -4493,37 +4510,37 @@ Večinoma ustrvarja bolj kakovostno ritmično mrežo, vendar ne deluje dobro s s Če mapiranje ne deluje, poskusite vklopiti napredne možnosti in ponovno preizkusite kontrolo. ali kliknite na Ponovno, da bi ponovili prepoznavanje Midi kontrole. - + Didn't get any midi messages. Please try again. Nisem dobil midi sporočila. Prosim poskusite ponovno. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Ne najdem mapiranja - prosim poskusite znova. Uporabite le eno kontrolo naenkrat. - + Successfully mapped control: Uspešno mapirana kontrola: - + <i>Ready to learn %1</i> <i>Pripravljen za učenje %1</i> - + Learning: %1. Now move a control on your controller. Učenje: %1. Zdaj premaknite kontrolo na vašem kontrolerju. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 Izbrana kontrola ne obstaja. <br>To je verjetno hrošč. Prijavite ga na sledilnik Mixxx hroščev.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>Poskusili ste z učenjem: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5229,114 +5246,114 @@ associated with each key. DlgPrefController - + Apply device settings? Potrdim nastavitve za napravo? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Vaše nastavitve morajo biti potrjene pred zagonom čarovnika za učenje. Potrdim nastavitve in nadaljujem? - + None Brez - + %1 by %2 %1 z %2 - + Mapping has been edited Mapiranje je bilo spremenjeno - + Always overwrite during this session Vedno prepiši medsejo - + Save As Shrani kot - + Overwrite Prepiši - + Save user mapping Shrani mapiranje uporabnika - + Enter the name for saving the mapping to the user folder. Vnesite ime za shranjevanje mapiranja v uporabnikovo mapo. - + Saving mapping failed Shranjevanje mapiranja ni uspelo - + A mapping cannot have a blank name and may not contain special characters. Mapiranje ne more biti brez imena, ime pa ne sme vsebovati posebnih znakov. - + A mapping file with that name already exists. Mapiranje s tem imenom že obstaja. - + Do you want to save the changes? Ali bi radi shranili spremembe? - + Troubleshooting Odpravlajnje težav - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. <font color='#BB0000'><b>Če boste uporabili to mapiranje, kontroler morda ne bo deloval pravilno. Izberite drugo mapiranje ali onemogočite kontroler.</b></font><br><br>To mapiranje je bilo ustvarjeno za novejši Mixxx pogon za kontrolerje in ga ni mogoče uporabiti v trenutni Mixxx namestitvi.<br>Vaša Mixxx namestitev uporablja pogon različice %1. To mapiranje potrebuje pogon različice >=%2.<br><br>Več podatkov o tem se nahaja na wiki strani <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Različice pogonov za kontrolerje</a>. - + Mapping already exists. Mapiranje že obstaja. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b> že obstaja v uporabnnikovi mapi z mapiranji. <br>Prepišem ali shranim pod novim imenom? - + Clear Input Mappings Počisti vhodno mapiranje - + Are you sure you want to clear all input mappings? Ste prepričani,d a želite počisititi vsa vhodna mapiranja? - + Clear Output Mappings Počisti izhodna mapiranja - + Are you sure you want to clear all output mappings? Ste prepričani, da želite počisititi vsa izhodna mapiranja? @@ -5667,6 +5684,16 @@ Potrdim nastavitve in nadaljujem? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6281,62 +6308,62 @@ Vedno lahko skladbe tudi povlečete in sputite, da podvojite nek predvajalnik. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Najmanjša velikost izbrane preobleke je večja od ločljivosti vašega zaslona. - + Allow screensaver to run Dovoli zagon ohranjevalniku zaslona - + Prevent screensaver from running Prepreči delovanje ohranjevalniku zaslona - + Prevent screensaver while playing Prepreči ohranjevalnik zaslona med predvajanjem - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Ta preobleka ne podpira barvnih shem - + Information Informacija - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7506,173 +7533,172 @@ Ciljna glasnost je približna in predpostavlja, da ostaneta predojačitev in izh DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Privzeto (dolg zamik) - + Experimental (no delay) Ekspermientalno (brez zamika) - + Disabled (short delay) Izklopljeno (kratek zamik) - + Soundcard Clock Ura zvočne kartice - + Network Clock Mrežna ura - + Direct monitor (recording and broadcasting only) Neposredni monitoring (samo pri snemanju in prenašanju) - + Disabled Izklopljeno - + Enabled Vklopljeno - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. Za vklop načrtovanja urnika v realnem času (trenutno izklopljeno) si oglejte %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. V %1 se nahaja seznam zvočnih kartic in kontrolerjev, ki so primerni za rabo z Mixxx. - + Mixxx DJ Hardware Guide Mixxx DJ vodnik po strojni opremi - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) samodejno (<= 1024 okvirjev/dobo) - + 2048 frames/period 2048 okvirjev/dobo - + 4096 frames/period 4096 okvirjev/dobo - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Mikrofonski vhodi so zamaknjeni v signalu za snemanje in prenašanje časovno zamaknjeni in ne ustrezajo temu kar slišite. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Izmerite latenco zvoka na krožni poti in jo vnesite zgoraj, za kompenzacijo latence mikrofona, da se poravna s časom mikrofona . - - + Refer to the Mixxx User Manual for details. Preverite Mixxx uporabniški priročnik za več podrobnosti. - + Configured latency has changed. Nastavljena latenca je bila spremenjena. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Ponovno izmerite latenco kroženja zvoka in jo vnesite zgoraj za kompenzacijo latence mikrofona in poravnavo časa mikrofona. - + Realtime scheduling is enabled. Načrtovanje urnika v realnem času je vklopljeno - + Main output only Zgolj glavni izhod - + Main and booth outputs Glavni in dodatni izhod - + %1 ms %1 ms - + Configuration error Napaka v konfiguraciji @@ -7690,131 +7716,131 @@ Ciljna glasnost je približna in predpostavlja, da ostaneta predojačitev in izh API knjižnica za zvok - + Sample Rate Frekvenca vzorčenja - + Audio Buffer Zvočni medpomnilnik - + Engine Clock Ura pogona - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Za didžejanje pred živo publiko uporabite uro zvočne kartice in najnižjo možno latenco. <br>Za oddajanje preko spleta uporabite uro omrežja. - + Main Mix Glavni miks - + Main Output Mode Način glavnega izhoda - + Microphone Monitor Mode Način monitoringa mikrofona - + Microphone Latency Compensation Kompenzacija latence mikrofona - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Števec premajhnega toka v medpomnilniku - + 0 0 - + Keylock/Pitch-Bending Engine Pogon za zaklepanja tonalitete/pregibanje višine - + Multi-Soundcard Synchronization Sinhronizacija več zvočnih kartic - + Output Izhod - + Input Vhod - + System Reported Latency Latenca, kot jo javlja sistem - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Povečajte medpomnilnik za zvok, če se števec za premajhen tok veča in je med predvajanjem slišati prasketanje. - + Main Output Delay Zamik glavnega izhoda - + Headphone Output Delay Zamik izhoda slušalk - + Booth Output Delay Zamik dodatnega izhoda - + Dual-threaded Stereo - + Hints and Diagnostics Namigi in diagnostika - + Downsize your audio buffer to improve Mixxx's responsiveness. Zmanjšajte medpomnilnik za zvok, da bi izboljšali odzivnost Mixxx. - + Query Devices Poizvej za napravami @@ -9374,27 +9400,27 @@ Večinoma ustrvarja bolj kakovostno ritmično mrežo, vendar ne deluje dobro s s EngineBuffer - + Soundtouch (faster) Soundtouch (hitreje) - + Rubberband (better) Rubberband (bolje) - + Rubberband R3 (near-hi-fi quality) Rubberband (skoraj hi-fi kakovost) - + Unknown, using Rubberband (better) Neznano, uporabljam rubberband (bolje) - + Unknown, using Soundtouch @@ -9609,15 +9635,15 @@ Večinoma ustrvarja bolj kakovostno ritmično mrežo, vendar ne deluje dobro s s LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Vklopljen je varni način - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9629,57 +9655,57 @@ Shown when VuMeter can not be displayed. Please keep OpenGL. - + activate aktiviraj - + toggle preklopi - + right desno - + left levo - + right small desno malo - + left small levo malo - + up gor - + down dol - + up small gor malo - + down small dol malo - + Shortcut Bližnjica @@ -9687,62 +9713,62 @@ OpenGL. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9752,22 +9778,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Uvozi seznam predvajanja - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Datoteke seznama predvajanja (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Prepišem datoteko? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9921,253 +9947,253 @@ Ali bi jo res radi prepisali? MixxxMainWindow - + Sound Device Busy Zvočna naprava je v rabi - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Ponovni poskus</b> po zaprtju drugih programov ali ponovne priključitve zvočne naprave - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Rekonfiguriraj</b> nastavitve zvočne naprave v Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Poišči <b>pomoč</b> z Mixxx Wiki - - - + + + <b>Exit</b> Mixxx. <b>Zapusti</b> Mixxx - + Retry Poskusi znova - + skin preobleka - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Mixxx meni je skrit in njegov prikaz se preklopi z enim pritiskom na <b>Alt</b> tipko.<br><br>Kliknite<b>%1</b> za potrditev.<br><br>Kliknite<b>%2</b>, če tega ne želite, ker denimo Mixxx ne uporabljate s tipkovnico.<br><br>Nastavitev lahko kadarkoli spremenite v Nastavitve -> Vmesnik<br> - + Ask me again - - + + Reconfigure Ponastavi - + Help Pomoč - - + + Exit Izhod - - + + Mixxx was unable to open all the configured sound devices. Mixxx ni mogel odpreti vseh zvočnih naprav - + Sound Device Error Napaka zvočne naprave - + <b>Retry</b> after fixing an issue <b>Ponoven poskus</b> po odpravi težave - + No Output Devices Ni izhodnih naprav - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx je bil konfiguriran brez zvočne naprave. Procesiranje zvoka bo onemogočeno, če ni konfigurirane izhodne naprave. - + <b>Continue</b> without any outputs. <b>Nadaljuj</b> brez izhodnih naprav. - + Continue Nadaljuj - + Load track to Deck %1 Naloži skladbo v predvajalnik %1 - + Deck %1 is currently playing a track. Predvajalnik %1 trenutno predvaja skladbo - + Are you sure you want to load a new track? Ali ste prepričani, da želite naložiti novo skladbo? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Za izbrano gramofonsko upravljanje ni izbrane vhodne naprave. Izberite najprej vhodno napravo v nastavitvah strojne opreme za zvok. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Za ta prehod ni izbrana nobena vhodna naprava. Najprej izberite vhodno napravo v nastavitvah strojne opreme za zvok. - + There is no input device selected for this microphone. Do you want to select an input device? Za ta mikrofon ni izbrane vhodne naprave. Ali bi radi izbrali vhodno napravo? - + There is no input device selected for this auxiliary. Do you want to select an input device? Za to pomožnos vodilo ni izbrane vhodne naprave. Ali bi radi izbrali vhodno napravo? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Napaka v probleki - + The selected skin cannot be loaded. Izbrane preobleke ni mogoče naložiti. - + OpenGL Direct Rendering OpenGL neposredno renderiranje - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Na vašem računalniku ni vklopljeno strojno pospešeno neposredno upodabljanje oz. direct rendering<br><br>To pomeni, da bo prikazovanje valovnih oblik počasno<br><b>in da lahko močno obremenjuje procesor</b>. Posodobite konfiguracijo i<br>n vklopite neposredno upodabljanje ali pa izklopite <br>prikaz valovnih oblik v nastavitvah Mixxx-a, tako da izberete <br>Prazno kot valovno obliko v razdelku Vmesnik. - - - + + + Confirm Exit Zapustim? - + A deck is currently playing. Exit Mixxx? Eden od predvajalnikov trenutno predvaja. Zapustim Mixxx? - + A sampler is currently playing. Exit Mixxx? Eden od vzorčevalnikov trenutno predvaja. Zapustim Mixxx? - + The preferences window is still open. Okno z nastavitvami je še vedno odprto. - + Discard any changes and exit Mixxx? Zavržem vse spremembe in zapustim Mixxx? @@ -10183,13 +10209,13 @@ Ali bi radi izbrali vhodno napravo? PlaylistFeature - + Lock Zakleni - - + + Playlists Seznami predvajanja @@ -10199,32 +10225,58 @@ Ali bi radi izbrali vhodno napravo? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Odkleni - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Seznami predvajanja so urejeni seznami skladb, ki omogočajo načrtovanje DJ setov. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Da bi obdržali energijo publike, bo morda potrebno preskočiti katero od vaših skladb ali dodati kakšno drugo. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Nekateri DJi ustvarijo sezname predvajanja še pred živim nastopom, spet drugi jih ustvarijo sproti. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Če med DJanjem uporabljate seznam predvajanja, bodite pozorni na odziv publike na vaš izbor glasbe. - + Create New Playlist Ustvari nov seznam predvajanja @@ -11884,7 +11936,7 @@ Namig: kompenzira "veveričji" ali "renčeč" glasOjačenje, ki bo dodano zvočnemu signalu. Večja, kot je vrednost, bolj bo zvok popačen. - + Passthrough Prehod @@ -12048,12 +12100,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12181,54 +12233,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Seznami predvajanja - + Folders Mape - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: Bere podatkovne baze, ki so bile izvožene za Pioneer CDJ / XDJ predvajalnike z uporabo Rekordbox načina izvažanja. <br/> Rekrodbox lahko izvaža le na USB ali SD naprave s FAT ali HFS datotečnim sistemom. <br/>Mixxx zna brati podatkovne baze s poljubne naprave, ki vsebuje mapi s podatkovno bazo (<tt>PIONEER</tt> in <tt>Contents</tt>).<br/>Podatkovne baze, ki so bile na zunanji nosilec premaknjene preko <br/><i>Preferences > Advanced > Database management ne bodo delovale</i>.<br/><br/>Berejo se naslednji podatki: - + Hot cues Hotcue iztočnice - + Loops (only the first loop is currently usable in Mixxx) Zanke (Mixx lahko trenutno uporablja le prvo zanko) - + Check for attached Rekordbox USB / SD devices (refresh) Išči priključene Rekordbox USB/SD nosilce (osveži) - + Beatgrids Rimitčne mreže - + Memory cues Pomnilniške iztočnice - + (loading) Rekordbox (nalaganje) Rekordbox @@ -15473,47 +15525,47 @@ Tega ni mogoče razveljaviti! WCueMenuPopup - + Cue number Številka iztočnice - + Cue position Položaj iztočnice - + Edit cue label Uredi oznako cue iztočnice - + Label... Oznaka... - + Delete this cue Izbriši to iztočnico - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size Levi klik: Uporabi staro velikost trenutne ritmične zanke za velikost zanke - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 Hotcue iztočnica #%1 @@ -15638,323 +15690,353 @@ Tega ni mogoče razveljaviti! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Ustvari &nov seznam predvajanja - + Create a new playlist Ustvari nov seznam predvajanja - + Ctrl+n Ctrl+n - + Create New &Crate Ustvari nov &zaboj - + Create a new crate Ustvari nov zaboj - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Prikaz - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Morda ni podprto v vseh preoblekah. - + Show Skin Settings Menu Prikaži nastavitve za preobleko - + Show the Skin Settings Menu of the currently selected Skin Prikaže menu z nastavitvami za trenutno preobleko. - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Prikaži mikrofonski razdelek - + Show the microphone section of the Mixxx interface. V vmesniku Mixxx prikaži razdelek za upravlljanje mikrofonov. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Prikaži razdelek za gramofonsko upravljanje - + Show the vinyl control section of the Mixxx interface. V vmesniku Mixxx prikaži razdelek za gramofonsko upravljanje. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Prikaži predvajalnik za predposlušanje - + Show the preview deck in the Mixxx interface. V Mixxx vmesniku prikaže predvajalnik za predposlušanje. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Prikaži naslovnico - + Show cover art in the Mixxx interface. V Mixxx vmesniku prikaže naslovnice. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Povečaj zbirko - + Maximize the track library to take up all the available screen space. Poveča zbirko skladb preko celega zaslona - + Space Menubar|View|Maximize Library - + Prostor - + &Full Screen &Cel zaslon - + Display Mixxx using the full screen Prikaže Mixxx preko celega zaslona - + &Options &Možnosti - + &Vinyl Control &Gramofonsko upravljanje - + Use timecoded vinyls on external turntables to control Mixxx Upravljanje Mixxx z uporabo časovno kodiranih vinilnih plošče na zunanjih gramofonih. - + Enable Vinyl Control &%1 Vklopi gramofonsko upravljanje &%1 - + &Record Mix &Snemaj miks - + Record your mix to a file Snema miks v datoteko. - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Vklopi o&ddajanje v živo - + Stream your mixes to a shoutcast or icecast server Prenašaj svoje mikse na Shoutcast ali Icecast strežnik - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Vklopi &bližnjice na tipkovnici - + Toggles keyboard shortcuts on or off Vklopi ali izklopi bližnjice na tipkovnici. - + Ctrl+` Ctrl+` - + &Preferences &Nastavitve - + Change Mixxx settings (e.g. playback, MIDI, controls) Spremeni Mixxx nastavitve (npr. predvajanje, MIDI, kontrole) - + &Developer &Razvijalec - + &Reload Skin &Naloži preobleko - + Reload the skin Ponovno naloži preobleko - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Razvojna &orodja - + Opens the developer tools dialog Odpre dialog razvojnih orodji - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket Stat.: &Eksperimentalno vedro - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Vklopi eksperimentalni način delovanja. Zbira statistiko v EXPERIMENT vedro za sledenje . - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket Stat.: &Osnovno vedro - + Enables base mode. Collects stats in the BASE tracking bucket. Vklopi bazični način delovanja. Statistiko zbira v osnovno vedro za sledenje. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled Vklopi raz&hroščevalnik - + Enables the debugger during skin parsing Med preverjanjem preobleke vklopi razhroščevalnik. - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Pomoč - + Show Keywheel menu title Prikaži kvintni krog @@ -15971,74 +16053,74 @@ Tega ni mogoče razveljaviti! Izvozi knjižnico v Engine DJ format - + Show keywheel tooltip text Prikaže kvintni krog - + F12 Menubar|View|Show Keywheel F12 - + &Community Support Podpora &skupnosti - + Get help with Mixxx Poiščite pomoč za Mixxx - + &User Manual &Uporabniška navodila - + Read the Mixxx user manual. Preberite navodila za rabo Mixxx - + &Keyboard Shortcuts &Bližnjice na tipkovnici - + Speed up your workflow with keyboard shortcuts. Pohitrite delo z rabo bližnjic. - + &Settings directory Mapa za na&stavitve - + Open the Mixxx user settings directory. Odpre mapo z nastavitvami za Mixxx. - + &Translate This Application Prevedi &to aplikacijo - + Help translate this application into your language. Pomagajte prevesti ta program v svoj jezik. - + &About O progr&amu - + About the application O programu @@ -16073,25 +16155,13 @@ Tega ni mogoče razveljaviti! WSearchLineEdit - - Clear input - Clear the search bar input field - Počisti vhod - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Iskanje - + Clear input Počisti vhod @@ -16102,93 +16172,87 @@ Tega ni mogoče razveljaviti! Iskanje... - + Clear the search bar input field Počisti vnos iskalnika - - Enter a string to search for - Tukaj vnesite iskalni niz + + Return + Vrni se - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Uporabite operatorje, kot so bpm:115-128, atrist:BooFar,-year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Za več informaciji glej Uporabniška navodila>Mixxx zbirka + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Bližnjica + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Fokus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts - Bližnjice + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - Vrni se + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Sproži iskanje pre iztekom časa za išči-ko-tipkaš ali po tem skoži na prikaz skladbe + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space - + Toggle search history Shows/hides the search history entries Preklopi zgodovino iskanj - + Delete or Backspace - - Delete query from history - Izbris poizvedbe iz zgodovine - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Zapusti iskanje + + Delete query from history + Izbris poizvedbe iz zgodovine @@ -16944,37 +17008,37 @@ Tega ni mogoče razveljaviti! WTrackTableView - + Confirm track hide Potrditev skritja skladbe - + Are you sure you want to hide the selected tracks? Ali res želite skriti izbrane skladbe? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Ali res želite odstraniti izbrane skladbe iz zaporedja Samodejnega DJ? - + Are you sure you want to remove the selected tracks from this crate? Ali res želite odstraniti izbrane skladbe iz tega zaboja? - + Are you sure you want to remove the selected tracks from this playlist? Ali res želite odstraniti izbrane skladbe s tega seznama? - + Don't ask again during this session Ne sprašuj med to sejo - + Confirm track removal Potrditev odstranitve skladb @@ -16995,52 +17059,52 @@ Tega ni mogoče razveljaviti! mixxx::CoreServices - + fonts pisave - + database podatkovna baza - + effects učinki - + audio interface zvočni vmesnik - + decks predvajalnikov - + library knjižnica - + Choose music library directory Izberi mapo glasbene zbirke - + controllers kontroler - + Cannot open database Ni možno odpreti baze podatkov. - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17053,68 +17117,78 @@ Pritisnite OK za izhod. mixxx::DlgLibraryExport - + Entire music library Celotna glasbena knjižnica - - Selected crates - Izbrani zabojniki + + Crates + + + + + Playlists + + + + + Selected crates/playlists + - + Browse Brskaj - + Export directory Izvozna mapa - + Database version Različica podatkovne baze - + Export Izvoz - + Cancel Prekliči - + Export Library to Engine DJ "Engine DJ" must not be translated &Izvozi knjižnico v Engine DJ - + Export Library To Izvoz knižnice v - + No Export Directory Chosen Za izvažanje ni izbrana mapa - + No export directory was chosen. Please choose a directory in order to export the music library. Nobena mapa ni bila izbrana za izvažanje. Izberite mapo, če želite izvoziti glasbeno knjižnico. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Podatkovna baza že obstaja v izbrani mapi. Izvožene mape bodo dodane v to bazo podatkov. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Podatkovna baza že obstaja v izbrani mapi, vendar se je pojavila težava ob njenem nalaganju. V tem primeru ni mogoče zagotoviti uspešnega izvoza. @@ -17135,7 +17209,7 @@ Pritisnite OK za izhod. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17145,22 +17219,22 @@ Pritisnite OK za izhod. mixxx::LibraryExporter - + Export Completed Izvoz je končan - - Exported %1 track(s) and %2 crate(s). - Izvoženo je bilo %1 skladb in %2 zabojnikov + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Izvoz ni uspel - + Exporting to Engine DJ... Izvažanje v Engine DJ... diff --git a/res/translations/mixxx_sq_AL.qm b/res/translations/mixxx_sq_AL.qm index bbe819290c6d0d3d8aba4205cce344fab07a01c1..d8bcf44004d31c4643c23c392110ae5aecacab8e 100644 GIT binary patch delta 13043 zcmbuF2UrwY*XPf@-PJjWIUu5d0xDv{F`<${P!uqLB2h&V6v3>mD5IicXcY`&#)ud& z>liUB<~U|BV9r_Ge^`K7p8b3nG~hQQOa84DKrfUm;(D{usv=<_q8`mKp|$(0y$1&kopHWKq2h`vL)R8rATh`6kJ7gc#FiZBZ&MUrA&#u-dQ4l58}E_L_rgXwr3D^iUoHN zb;07SUr21cS0w9sTw*^D&~%d66+!%h+qy_>{GO<5Q=j+WC=W zrn>3G8f1{n!*X^?5NFr6KgrWH#6nXf#>q&&;RumePm=HOCR$#ZcHJexr!&ze zK_s*NOoCr?=;L0Atx`p@f$b%p%_AW&m#9ZF2x;|fMncdiqGJj9XZIjsO);^`3nd1Xkgy?& zC>9fM#6%}+kZ>@bs22WiVbh@!_cs^GS|64;aHPbdFcQ9{QjQQaw^Gf+Z}hNXq3n`xOzS?HCH}?J2S0Fp&(WXZfCmgiDMyiR3mt zsN9%~Ft;44r2K`r?>4ILJ&xG@B&xOQ6EV}Q_GJ5846%u?$?lCGF{`gsw?Iy`&6ymV zeI-_76FIhkz1Fx(&X%+Owt}3`!%uv>O3s!uZ|f-Wdrzv5qhMWVA1!QItO|3$KT4=XV8UGJkB#NM0M(Dgd-%W2LM)63KKlc~h~+~}4KB+zL%-5WBFc)K%H zd=Wcqb%Y+bmJu5OGgWX$X-|{>a*_ZA9$lY1Za}4Y78G ztnGohkW?u1wy`6YlFT{}fdul3Sjg8qG>|v+W<55HBp$MY^$Nd1yiGY46;njqzXFTN zIz=?ao%Q#9M=a2dB}|1qPixHv^v4c9Y-fYy5V0*uT;GEY%J3leW(G_B9!acDDI4i@ ziMaX&8<~O6)AyQRsVbWsF0nCnLy7ZzHZJ}y8V+W+$c9*MKD*^)fF_(^#e1`ejd5fp72$p~OIc|u1Uag)#EH+@Yu7L$r$_8< z$r7UI8SI}4=x~;xWl#iD~N8k;`#_IWM@@q(>tOE z&3UDzZxK|_bKCNl;h2~6+8fh}lbPG?kH^IAxZUCAM3a4a{h+Qyi#AJqmdG3Et`Ku< z!<#fgrnmJoZ~C|yQNT^!{2<1C*pGYOHBBVm=qdL(2ctR^%Kg%>5U)6fcb$I;13uz? zg4M*Tb>z_8XOv-~qfhWD5m`hwjl1c zcuQh!3M6{>kr-SiF(#aw)@EZxd$#lSmRPjrgGlDRfN!_~qv~>)Z*=e`HscZB`o|5T zibjcJ!+60fq>``F`7WQ@h-t-q&$j)*2c zH_qS(cJ?H$|G|$r;HX=zG4W#uG4TXPe(Vxf-Xnyc$aP0h9K+9a%p}&mhs3^9_?ZuI z4;Qle*-YrhB?G^33&z!_}zBPtEycfybr^l!jRd?4y7N?!8biC9`o{(OQB@fK(K zmnm3qsGUgGArM5`+1*sazhvUZ?~nPHqww@oGx^uG)rbvU#>?`%6Z2Xnqo7H|qua^k z;=mp<;d~mg@_sVqk|bi+p2?KwA0SlSm1*8t?td!Nor2^%=Ew|7#t|zXAv4lTVx88> zj5Uz&G`Eu(Z=WQlH_K|&I0S!px|*zR(<8)!SIV3pLsXqTWv&e76h2JWY;8V7>LqL0 zWF0*AXIZNsH(?F)W$o^y!5`YmyaF?bon9jIz6&de3Y7&+S&CHink-;CBpS6t)~T>F z@m3>coh(W>rdZawo0+I^uEdisWZkT?knhA#lXdU+6OP7K)&m6)eaV$Yq+TPoDP7jP zUNd<5G+Cd(@~8@a%HrlBTDPk&8&ngeN1u1Hq4ie6(U!=D1|tD;J0eS?;l!GsmyMVR ze_5lWY|OriL_f#L#zvinE``g+myIOeYnE)HIL~d_#8ev-u~Zw`q_jvloFdu0eSL^F zxXZG?K-s=llC7>%L{!j3wze9Q=0I=R+QZ0s1CPr#3US0M9F^^Q1YM}tRd#IIP+~26 z%Z{thLWg7`c_S`6^`kw4cAD(WR*YZyhpcEeJn79(vMZMHzj({8W||HY?~o?D_cE4v zgEq1U#R42qj_lzYFGO)S*^}Wo;|D6))86^Sn%$JWq#|Oo+sfYdPa;armc6}dPZYdU z_W3cCGwr5a_bVLEl>)idj}T&`+sJD)4nc5M$ZO1i)Yf_ zOaqr-U^jWoPKSw&S}1R|2NHQ1DDUtRx-j^syj$!YVzqPRJ>#&0E?4Cdqw|T}uE_h2 zt3Xs7Ax|8RqN|6qJgMOgII>`Qs*V%gKPgY$f+GzIm8ZUAFwZ3UsLhe^7q=x2S|m4F zqkwBzTW*?Um^=-#D<4NG9N#QA)>cq`cLEq9j*`!7$z?` z*aOA+4f&3$6^TqIgXKH?@W8K&_HV$RgIFs{HL^ z?5O=)`8y@p!BzetJ(YO9X7bO|YGRxSiOE|f4$;ZWx?z0Pb%Ash;Av+Fa&ZG&1a06I z#Q$M$1*?+%NFnt?`H}C4);ft~(>4kYzGKn32@=V=b`{C(x(N>75JcJ*3JuQrA?0)x zny!KWFSOoS6^Yt@!9CnSbR^xhF(<=b^NGDMa}O;*1?cGLJ(NpNtTq3dRxrrWT@}!iE3pEcDIAktdc3 zeNC2&q=Q0VI1K7%D`$YBB@OmayBGkW1}TDeqjVuZ2ZZa$shH#N#Ex;whVmZLci+=7E8l^b(f&BIu+z3%OTX65T#4te*yZ zcX%tTKXHI)bD2n1XNR!<9KyLSN!TzK-GZP%VOtJbRi(+oj(5$S=3eifUHG*)|(mI-OS0r1TBXJMXf{rM>MpY9o zT{WZAV-~Ld(g{tFX(G9OUEyjQNOHg};YMC_Vz#4%+cEiw|3BUf_tGz+q--JFn+o&T ztrv=w@ZmRJ2@fkk621k(<7#qLdV7V(4s+47N*Bo{^bwxUMh3%92`^ehGBXzmFE#my zn(Ks*lb}nlj|gS8m%u8HDQH$4!mnPzBHt0zSs`0dN;E%JAzSwW`TuQig}!D*qAJZ4 z6)LEqrBfunkSi*B-N!)Dib@N9LEU3k*o)>kMI`Ggk=tb|?B_r-@^6Z|;@^*mWL@`* zM2@bgKMX1)!!736=dxn>yQ#zqLKUMGh!umn zC`PNW^B;8-V`lCq?p#AL{u`oX&1}UKQ-7pNwVNw4@4KV$_^6ov22n}#NHL?8Cv+f9 zF>|ITlF9_dJYVdufC&h^&7`Vqe#cA_PqKNB? zGgncix4x?=vILcG4vO>3G(^I5#l^td#P9EO6RNJph@ z*?uD9N{Pceie%fzD8&%cE<_~j`d%crd#iLR_YjWqn6mz_D4s*Dl?|pN;~Vxx*|6tD z6i(BWjV{F#S(TGG+FI$RDTJ}~AEa#IABiBQQ?_o@3kA>zWm`Es>Xk;ywxixc(leBv z9L7{5OBt+Cq1xV}>}oM;?A14A^cPrn zUoU0M#eu|bn3S=LAmA}ZW#7JAi6zce_Pu`+sp0MA%CY@V5_ey$9J{v}QTJQQ@z(E& z1>`9wpHUMt3{_4)-UhL#pK|&+yy~!F5}TweXMVzfRpu!d4@yO{yhXYEP(D%ZUdnYN z?w|p*LAh!4Phw9)lsoo)KwrjR`FjRb&(&IaWHJ_BmaQy2YPw8R=`}7cqoVp%d7NjX zRbEGVd>)SWw}#3yJJ%y4OIDtXZHi{$cI7qE7(A54^*Rw1O;bLVZzEEll{kEf@-Ai?D!I^Ht$N72ys_RDA}(|0Gvb#X2v6h`*`&JqSbF^o1&^ zAv|_R8`a>pGWe-5)o^wRlIfrtxg2T1R3FvYa2KK{Of~+y3yfu-Dt*!wVi)DAiHkkZ zjBIaGWhfjF#@nhgmf(!!4yw#^H&G;4me{w0YUTv&xF}CGXa7s$l@e5QK4XX5AFJkd z#)4%PRP%<&h}C_l%3dBzbYQP)!I+A~tOuwTX5z?Jq^TCQgGARfP%UYD0}EuT70qDn z8B0~UN3g-YrtPZL*PtwA4OMHh;D5T?sMe;I;)Y*T>x)a!_zhNVZ10Sn98hiC1LbsG zr`o(3Z<~HSquQzsLQu6)?Q+HamA5bupA|oSQ6Ou&pE1@@Emmy?Uy(QywBVm6zyJSK`*)YF)%uWbu2{ z6>IDvI#Hmu-fTdRy`9?jSrV~7j;rk|*&rCo)pl=wz`>pt$s1l)+oxkew;HMIeOW+k z=s7J{ zyZg068L&a^Iqn@ABu~};c#e0wq7Jwf59@fM4tyPsh1FCC^@BCEUMaD_tnO?D9SQEP z?(7&zJfO0=`_VhlsS*Hdx4yx`=0vJ@yx4=- zQdPYtt{91uPQ9n^5uzm>5i)lPoW_ap;TY#=SlQq zg!#un{N0z0^-a(dbRImpG_cUAi=%Sfk_W7t>ea zjoNJWt0s4d*YQ+;-2sn3Ynu97R!_nkSoOD^o53UMZ)el6u6F7ly|CUPFVtnp_*~dV z!}m5vopw$m-*kj{*P9yor_s>aIz2S1SXif16N&GSYmAS}h)o@?snu*ItnjF&UI)09 z+iFeyZqUtpk2MW_$Duvpp>f$&hODH#rjZ|1@BSD~qkIF3`X3rEH70EJR@0Fc6Ki@@ z6Wj=be4DHZ_dvGM@{J~V*YLUEboL!-hgZNINm^9xu@Cd zHwa# zWUYE6{K}kH+6w71;x6;Gm3y`$_Ux**s#OR?9;~f?4fh{S*EWc}L+s&Ht;?=+MCD?% zZIrjrqW9@-L&4zvrK3k*46q=9*U-XrZylRu_d6Qwqpba zym3JrR2}(9YbR|N2dr40q3!w^+GlO8jj9#~*R9bGd4!#IAnhcB4qX5T?d0DuPOaV& zo3<3mqWeo6FhM(|K6K?h*UqfT@nePZ+S&dl8)7@+wR74&BiaCkR%`F>L)br5sC{_sGG2aqYE933Lb+USXkTxJ-7d-2zCGzqY;t=Y|A7{BXBVB! zB8kLGx^kv6Voq0d<)-b&j}R{DDuj(gS(2u!G8NJINJCxiT5$3E47xf8(vjG>=^S#= z(mIf$tG5smY3!!+PEA28D@5mG?S$?@w$69XdldCeOwz?MCX&^fs|#4<1&ceT>)I`g zsBUA416NASY%7u_cGGp8gp_agWL=1*zzdryG483ZTMc;d%}QPOL5R{foOO{=ukiB= zABi77>!OYwMLsf1*I)J&FSt!RbOR>9lbIIilGCBJ+)kI~=z@C3NjEHH36!OkZaBw| zy9eurCnA+Qk)#`L+J?_&-N@fjZ2$2{H#!)i+#0EylJ^qj!BvT_dR^wtNW2>>Cz9O> z)y*>^9q9N`w~%3+hfcbMw|ApUczv1fw*&Eb#T2Vs(FO@ly(zji8)qZq(uw5Fp6Ir< z&|qQTb-%kEA?9h+9TIcO@47>0pvB)}b%h+Ftl=q=U7RhF*KeUadt(BA4OOhWJl&4i zSTEg`JvPL`7wfJzb|*3))Lk397(wLbTHW=UILo@jbvIHG#yxK8ZXZUT;F+kqa|fb5 zRYQ08=LZDAF1mYnp+w)C>WYy&a_@W)x+6QNdpNTb`mw`xrBw}R(sj_iy#{6Vp0E4r ziiy%TN=#p*` zO5erC3ngGpedtu|*i={FEf_m~G)&*K3|gPT^x>c2373(nhK&K+25smdzgR8)K*$4OU@x)?X~Y3ax6LUU|(6_I>Asxm~@=CVdC} zeOo)cXKke~ITA^9FGc_4CnPnmK>x1uA^43z{ZDmMoRqu7XGR0rM-s2W4V6D4c|Xbw zwiU|5UEDX=?p=qrtGB_S4_yA!afT+(B8jEHF}Rgj1k~2hHYkaB)%}LH7FGKZVQ7CI zztCb!>l(cJO+>RG*WgozKYaXY=vV?j^5UDJbNe)$#6Cmk-3W>vNrsS1?@%*G8A6^x z$x~+=!s_PZ#}Vrc-LpC&Ly9%@EV9PCyBI^yn>e}E=M53Hu0U4<4G|k*EUv+ZsA7Lq zn4X5%L|CuCpJCF-snEqYFAN#ME0Mr-mbmq!Ve0Avyuli6nEJL2D#8*&_Eju!RRcrL zZWzbOzJ?Xsqlq2#F|71WKx$gUu-UvEpU)Y#xNSquyx6d(L35Nf#fH5J?+{|18}^rM zLB$wvIPd`{b9ukvpwSa=z!MFJelZmh^WA7TIl&&v>1Md<0#VOW7;Y9|qH`w0ou=ba zvD!&AB#Y$rz8H!xA*b~!XLz{l5A=H$89p4viH=!r_<2kqUiY?97K4!CgMLGRr8TzJ zsM&D?#rI$A~I>VXp1%`mnz z;|QpwF?xVIF=l0qYf}v`ijErN<{=03sADuGY(i2syvR6U14P_8Pb6=&!Z>?cDKVP_ zlv?&aDsB$8?RS5g1&B5iDSkaZ`Q$4 zZm4OzRfFLz#ysP#&8Y|pR>s>;Ao(8dAC32-a6<)aj@rNH8!!?79W&L7cC4LFSW0z;=cjAr(_Vr&@!*9hrD1lNbg`)9qyb59` z1^!ohB&3?#``Z;%^iGl0_9j~jq%_>f)k@h#>bf(d)G8)^l~)k`E_@! zNL?wO22&#LA4$IWH-VD=dP37RelVW#jZQEh^0CQI3t*MA%Q9J&0$2a0M%(|_dQzfO zuq;A|P~*RLV)RUmk4~}epPU+-7H{q{!p2-W@L>JQ)Da_& zq#-m4W5;96XEc-&{(4H|nUXwoXy53#_!M*Fq#7=^IDs^bo{TvYFoWg)zprHI-=4Hg zGrmqYxBu)B4B<#Y7%~pRw z!-`VU0^f0@=Id?mb{m1lBNYKpmal2yUd;V$ZSj^qz(910&651q8wrY&TUM#Jzq z1)nAV@OQZxgHz&%CBzT6^@@)jXz>Nz-Ts3ylBl1k;r|s~ul(nTeN&PL{Zr)&&W;b{ zZS1KV7V@Xz{L^LqpQfV^iBJ98C>N&J>>xeO?)SB zW&<}64~HLv6^#@J~e=v>A^v;o}QF~&(WirE!U<9$2xfmbE??NzMJxt^~h-*Ez=n0|=--!C`Am*}FW`ZkG_(5XFF^Pyl_#6v*1u5P63S!}R>k&7Xr4nsz zMvD4Vh&dc0MHlR0`;#E{(8HO8(OP2NH_43fAYr!`(V|%-?0ZXWO2INCZ`@v6;(j*cCp@;{INQ}xN-r@*}LyC#k1(28w{pkHp zA}c*W;ut97*2yF;h9nvWo8^PoRVA|3)+DaNzRW2laa}nv!)2LXwMpDG2x1&X;${qV zq&JC2;)v|7%WU34=B`AEtogq(qj$(WK8M7Arx4ZA$!s1gk$IbM$p>NaGNb(@a@&=p zO1lEZ3L(|fNTPW&NVO7szBq?;-FriO!(=utl*l@`%klj%s>MBz9vc)mihEn0Z<{+5a6)Y@7=@y!R!hX+iZ11)@zcg3-DBJVUu7x@%yipJ+H?mKQ<`aObUd*Q@2Myr{-awlo$ie-KpZ$b`!8Y&C%QNpTU5A^ zuIzeG?4@}%-KcknX!r`5>C@@P=~QAJljx2eR_?c&?vI*Cyqy=7U&4yqe$vzS3Svn+ z>E$04#MPTHL5Qm-tZ!;IsFZM`cme&6pkZ5iMgsv ziOSltHqBEJXsnn=6NuQ{jCrhYM(puP=JC*uSnFS`!{HoAW;XM(b0C(mo&}G>%GY#b zAwSB9J1begP3dIjfn}_J_)X%iv)G{MQsP~MS@fJUMCP3=-sdB+u1PE*3wAtZI~y90 znZMf3MhKtaN;}A0S;|Iab|LmGi>3aIBv!K?OLw_UoSw7vOq^$YV&hgkCsKZwX$XzHej`<9-qi8ptvS*+5i`O|u7^RAvips~|Y-WGhAtB;I!CxQ#>_YpdL={)rMea!Kw~1Ye_JlQnF@1H{~C5k<&0!O4>&Yq`2w4>I^92d>rxrP$CIIs_o@`%EEv435mq>lC2&)wCD z-CxAn4Fs`6Ih>mxUPQLikn6UrBD$Eu4G~R=ZRyFa(moR1OypIUe?YQPi`!Se0vCOY z*WC=?{dF#PI24D0J939(t%xQb%9!W;l^a)8JF zhR9DY=JDaMmV_@nVeT|yO&0K>j}XPq-Q**qFJr)Ze8TQ)xSu!Ac>96aqaZ%@7$*F# zBhReBL{mKZJR^cyh^x$j&&)h$Z%<;K=E;0Bi7#hN~XsmnZ9jghGp~hxfpo+8@|yJe3lQB$UH9b z%}!p#GR<}Pj@vhhs+eS^{=*C3o`&7-=X<^DB6_XnMLQ1>SDxql{kFo+ck%uEP7t>m z$PdE=tL)Wmk`3in`PZ)9GJ3rxst#lv4PaMI3X?gs_WlT7D7C)8mNtFA6pY1+_ zSkOF~<^f0f+0SqUr!MewGqCq(wEU(QM1Mb+mxUtk4~*lFydgqkC;sS@3$fwJ{MBST z;?2GJ_vx5uV3I`EHWPdfYq00vXW+Vz<^20`xbVruf2_BGRovtiTlx}fe^)_)Q;A2E zDFoct%#7m{;)T&jJSHntd5OeIpDI)r9wG?cR%k!s2ObUz{h6bX#B+r)Zz8cpCU*8;MeG7I;;{P~MM{I!aHUa-lpaW}n*3CZrm>(#k(L3ESlLH0 z{y+xNmpzIJgZ@F0(MB<;BAs}jvx*GM0Pm|QGE(6mhV@lU9UTe(aYiw1mM8K4%M}X_ z41}ZEsmT2f9eW?7ShLiNxOEl9+UjuO8;2=2o5fh-+M|lSPq6oPGZiORq!4pms5q%P z2c_|l$X$vRXMS};7#^)SyCagg;k%-A9z5g4kBY078^4>VxQ2vQ@M{Ku;-wKBeYy~Py;i7yqJr4@ zZ9?;5dBhqe3GPA1h>f}|v@3#(f9xxCegj>IA1(BWDMJx@Q3#90LINtAg@|!mP&h6S z22Zpmx|JggANv;yi!nlClbi5RRzj+tLr1ufx*dD!^OunN5&of5Q{j(okwh^eGUKcS zb1jr+j^V;oV+O2cw~)0BN@uf9X5$KptixoP{ zwFwf|&p=+lR>(|BlgKu;lE~|)3Y+FUAog!l@F5rlmV-GUqUOIR!6)Dk@C%eM8vF_S z|Jg*?G?x?mIS5oB34I4vB33a5v;#MQNK7j32nCJviLN&h3N{TODlZmxjEo}ca#$$r ze3dBbl~8!3AIk8n!tNSX5Pq|S-M+YfqLomzxs15jLnujiBAWS4IK_7&8txNLRSkjt z=Z6WW6Re1N))dZLio;v|B=Wuug-hAV#CACdSNjJM3+*Xfn>2&yz*3pl>`t4&kH9!gs>wDXGNkH50zgtc@Gx$Q=AqX1teB(FX&Nl}LJPxZEsJkQVSl z)CE8yiSeShJvES;eHA?|?V6%3VkhwmDxb%qcVS1F`#keD5${4Co2ZS-MFK9?yu?doP+pOY0JK-XMlWP9#>_ zMhxGCCez6naloLKC`|IjL0$zYB43Due9)kZS}Kvb|B!hvRUA|}5$U^G9Q5KA(S#M^ z;C$?PY^uz`t;NCc9~8MzOi;jso{bXI8X#5-jSwfqmJkilo5iW-HpFa4h|_8!0qGtr zPRnjetnYGhdUq(GVagu5mIC*A|ye--`Pe1dD%n!HpVU6<7Em_$0)L`B&YEt}4ZiGhy#e&BTqT z4il|UmB?(~iW|=(o-5Xgn{otHIGN(kMQB3ZUoY?rHk(u(wiN`I?q4ZFRZ23i*+dae!-BD7F>Lp&jmW^JH zM!eQGh)6e6BCk_dyygK>M)wkL7PKN(y->Uxy@lAPcjEmimr*N@6z^xjDzYe=G-xA@dXKnb^BeCm_~`?sEAIUts{NPIExIk9gi#MkX1nm@0IZ?szwHXn*# zrb3CH{uC?f=AoHXSxJAzB3QjpvPhWK*LF(9Dij#AUnmtDJ`-J;s5I1u)l_e(w6@kj zIV)s7>Y%LB?E&tyL|JulTl5h$N=F~F#SVROU@^m^61iQb(s4etSol|2U$WB-iOlb- zL~gfF*=S4|vFmZlrVZg@=Qt=`>!M8;Fj3ipu;+WeDLwRm5wCt+*|EL}b-_1f*TDJ2 zs~k{vJqn2gXk|v^E4|G*^NGzJp!69LjZVlhnN5~TWC5LJMm&(nYuYM(N^xC-pGyDw z$IvlRDnna0C2HMR8NsR&%c`u5n2)Vmyh$0k<0W##0_DK1a6ln5WDfFCMlHg`-D8x| ziQtY?N^?y7G~zr&89TH&%&5IGVK(A&<)zBuZi|T?KT(c2zYnF^dF5EiEDg%BAG1(U z%vO$5B38tnRE|?a0-x-Z@V>0d<4Di@T~Vla#hZF;EB58gL2mU2gKP! z1 zto$eY4cfGh%Cpy2quA}IEVaaxKy#$>!U`=~lqq4jD| zK0f>hu?feOPqt1ZuK%fg7I_gt>7??x-5X-9>MEc6=OI5RlsV$D^7#muTh)5XmnFqW z*Y7D`*DOaZI8*th*Bqi2m6TtSAyKy$%3s@HE#@l^RhlIg$nA<$wHAaES?!X@oy%0U zu0mPfW~yp?qGY1=D!bT2#QVjn>?;ltnO4h8JSveD>{3ZV#nW0M^KT-N+r3t~RCL9??o^7P+@W%&Y#V1rciijq>`ns+Sqzd2NBJ_po$g_3Np6U&imV zkE_DIJtBI2R24O@kl2&2s;KWd@cl)q=u5+p99|fwidl*QQ!-V92k#&jb51q*0fNMp zzf}|BPa{3As+zDL!KkORYErFFXevEcO*^Y0CKjk>o%BF(ic!rvkB1etr^=&yxq?Muf^GLOI+;3tJf>pZ@nBg#dN2?BILK_=|s*2H$ zWuLQECC9H2RedLsyZu(3VIM8uU@Hb?FXSTIZ185{wdLeW@`KGL73o2b^Ru#Xu-@@*U!pAbLx`X zd2~&*>t3jvJPsw+t5EH_2{~o|u4>nJh!I{r)oyrTK`rm7TWi-~Ylo@bXM3U^xS%$B zDypLL*{$~N>_zw^bBe7*?yy7co4$*98(X#Csc!HGLF(?M7WpPw(10X$rqT&faEv-L4_hQSsb`$Og|azV=72xcb0=e^ z#~-WbA9@3`j8o75=76oRS1$CqbEk$VuUn}%7eP6j6{xpudyQf#%j=sERLpFnSzn>|Q<(g|_De31Ig7wlnCJ(<@&ssE{R20Kz9)ANPQtd$a3 z>*MNwE)PIO)I@#uHO$IStv;uK=Luif%kR`*zQe<5o@o>VveE5YFLT3ojqoypxaR_mK4J$l zBv(xp+ajXFuQau`8PVzZt+9WZNbFLv#-XYmvDqCo4)1?qs|1PMd4a}p3I@I$uW9go zF|mTQpL}o!tGumhd*}Eh7^w2~f7=&1G zLKE}yF+5+IW=I5nc&eUeNDL$Tt5`E+%y(GF2~B*tCt9*UC9>-2GGn7PLnp)BBI{^| z4_}A$JXNM^rbHI3(hN7_3l`Z~`heGbrb%@}yRA_xjoG4nJNIZZF2m*4h}2BG506;g zpqa79A5Siu%8cBi`MWQaH9K9i;$R-p!ylT}?XU$;hiLK}pn$nML$l*OCYE(Yv-@=s zVn|O-QEWLfr74=C!NqtK8>4A<6c2*vhp0K`H;w37H%)OY_DCR2$(ij)wL&ykhjbPpgiB(K#ncG}9~6nx0k=o3u?^r{!E&SB17gXSj8de^oPD;RW78|wiFSaX`pCNVN&?#ql@A(7W7ZQQm_1Uvb1USqLZ#i?x-z;f1I)t0n94X4u2OpWC<(1x+nb$aND?4_-)%e5FhP*-qQ`T35B~=>P9`m zO53{YrW*C||BH`~F5PwW{OpKr&eP5B z@RE1~Z{2+J0Tlg}+;odZC*tLRY~7;gkU;)9a24`1gKqU543ybb=HH8Dt|-#UPNPJ( zHXjY7UcNFTKTE_D1YJQf2AbMmw{;g*Y}~HfdK1n_KU258;S;3Xy>x{wk;K?u)S35K zyP%~$S|@RIL*2n0-|=j&s_t;@sd((sU3XH86}*bqo!L}IEOwRdY!SR(&-Ea5zpJ%G z*5;({lH*&{g|BqCavX_w&eq*p0&jQpp6=cOgzCM&bdOJ5AsV+&_bLp!)#Q%u-8R_d zLW5cN;j|~QiRpU&3k_qxp?ZZy5-~ygO6Ce;b&dK;GY{cynryvw=tQD6t@PEiVC6-F z^>ypOUl;o5>m8ngWF$%Nl#j;L?oIjzOCS;FB)wN^GO?Yr^xm~xh}F5E_nH3*ovb98 z2ir+x)y(Jg{!5W#|2U@a)n^WB_(Yj8HZms{N@Ou}^}VJdKbw9;A7ZJ~0*=Y-@1XBv z3wOM3g1+wvgxm`;`p7|V@w!BY%r|cOK_`wQiBRg}6)*50`mKKGWGMZZOZucKP+Bv0 z(2sU*imD}AKPDs(&BWIFu^cPzu}nX9IP$N<>-1yIJ8^zbpMDVLbGeRwTn~tH!xjDX zf;Ujk#WI^!($BaRiPrm7iR@|*{Q?tWd)H?AB@Fku6RlrzcOM>B-qinnI1bN&2I^ON z48ZvHGW6><&qJEzC6PCa((i1e#hXe$^#@xQ6Km(IKWa$?CnxKVo`n{F7^pAd5T&hB zB0GIXBCp?Ef9~dFyuGwqe`OYOgwzT8t3`H*fLHa`+&s}tY^}dO0dDW&8vTvh*h;6J z`kSfW&G3BH^mmUT=(o$)mz6=ZM|3`2Sh2M2B2#L6E>mGyt0d!}x#$Yut zfoQ(TQ0uz62eE$F4fcofVBhl%4f_|u<6SW{-CB-N+TGAC>;u}Z+2AMe2KbrSuiD^G zFdD1?*BQEnLo&Z!fzXi(H-qJ_FY)M^-y#7i;cdW+z_47Q8ad>r_UhuP2e$*=kra!4567MuvPxE26uBhV@sv zpwcZhZ2B2PJff|kU^0BX?G3}e71*-f^$kZdTA}1lF&tkD$u#e8xG)n|F=K_{Qsp(o z6>7uvZi&RMmKbiFdPsP!!ECrq_NZmv8}1pAb_g8|59}SVH`@%4iX+j%-eh?88={-- zV)z)0=(ac0@Efn)(7c^8ANm@}F_O4dg|XTfq~HhI8SSkrV?i~I_WL*BRh@}Or-6t8 z5B38#@Fh;=K-Yk+FkC`9AeEcDjHdvv8oX+mH-20UjE?EAaX2 ze~sNA!LdC0Y7Fi)8e8+(7`zWr(tVvV_cr+Jj47-J`%+nYn>Rg5L1{fnY!+M&97zdU6p{ek>qcLVU?AhzKacX)N9+^Kk zX7*T3RI{?ojm?Z%YoWEj#~QOfc;IPgZDZ~=OmOKc~k*T)#Gd|vX8~vL> z#?QyGw<))bzfXw7>)tRaqMH-zu*;e+{h}e=TCYQDdGE;h(n&lrw6Vct|>f%l;J;2l|6z5%xruKaf zp;Yc?YX9dPM9JAQ|9&8IrNY!P8zLunQ`AsTqHq4DSPvWY04q$f3y^VnM4A$|nvqH+ zsc_Jnc(u!>c{87*A+*Z0{5qas`S&rc$qYrRdc-7$+X_>DsT&@X-Y~7(jg|HsY1-0g z7E0~urb5I9diKGzs~vR0Fv3*S2Ip2Grb9UzV)hG6hnrd>L$op-Pq;_icev^J@I~+o zXHBQgwsVL@zcih;@ZG5Y@s!N>jV1EP;il6;8A!3LO;`Ivi$kB7u0HRL0y4#PJ#n_?zxNgT#AvF?rk{ zgbTHyru!qI6b(+9$_pX#+^(iq4KY)ABzdh+crh)8=f?Hom2wlNFkSZVahk$)<5si6+Y_5=3U5pg;DvW) zeiRDr<~amrOf1_ov5eiWvu9xi)A}{8MO`VCl4&?KqAnCgF*J-)Xry!$r^e2c690@{ zQ($o(zh8L&cZE{A!aLXAkK627;lmx7885m~9B!3J3Gh#eG?ZR~V{q$a z8iJ#dI8O#srO#t<)o}bv{O^-t()YtCiQ;je)c=O6<&~Hkmuw$ppOTuKkT}FXHOW3D zE-E=D-hOaWvI?^`^$o#!ZbLtAs-h$>tS9EbA1l04Vx&o$?5LYGq-APDC@QyoBW9!5 zd8H+!{_l3uWi_?rjTsE1(UkJvO+@dcn9(WH_iSo*QH4wHxzDU}?#G7QLBRAqb1zQk z*4bwU)M(MtJ1NYHBnEXF6Cqb-n zIE#WMmKONP~)DGzI?D^PjUoLs`$SXY25#`*&>Nl zY+;n7UQU>_Mg4~2`xHqYv670} BasePlaylistFeature - + New Playlist Luajlistë e Re @@ -160,7 +160,7 @@ - + Create New Playlist Krijo Luajlistë të Re @@ -190,113 +190,120 @@ Përsëdyte - - + + Import Playlist Importo Luajlistë - + Export Track Files Eksporto Kartela Pjesësh - + Analyze entire Playlist Analizo tërë Luajlistën - + Enter new name for playlist: Jepni emër të ri për luajlistën: - + Duplicate Playlist Përsëdyte Luajlistën - - + + Enter name for new playlist: Jepni emër për luajlistë të re: - - + + Export Playlist Eksporto Luajlistën - + Add to Auto DJ Queue (replace) Shtoje te Radhë Auto DJ-i (zëvendësoje) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Riemërtoni Luajlistën - - + + Renaming Playlist Failed Riemërtimi i Luajlistës Dështoi - - - + + + A playlist by that name already exists. Ka tashmë një luajlistë me atë emër. - - - + + + A playlist cannot have a blank name. Një luajlistë s’mund të ketë emër të zbrazët. - + _copy //: Appendix to default name when duplicating a playlist _kopje - - - - - - + + + + + + Playlist Creation Failed Krijimi i Luajlistës Dështoi - - + + An unknown error occurred while creating playlist: Ndodhi një gabim i panjohur teksa krijohej luajlista: - + Confirm Deletion Ripohoni Fshirjen - + Do you really want to delete playlist <b>%1</b>? Doni vërtet të fshihet luajlista <b>%1</b>? - + M3U Playlist (*.m3u) Luajlistë M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Luajlistë M3Ut (*.m3u);;Luajlistë M3U8 (*.m3u8);;Luajlistë PLS (*.pls);;Tekst CSV (*.csv);;Teskt i Lexueshëm (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Vulë kohore @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. S’u ngarkua dot pjesë. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Artist Albumi - + Artist Artist - + Bitrate - + Bitrate - + BPM BPM - + Channels Kanale - + Color Ngjyrë - + Comment Koment - + Composer Kompozitor - + Cover Art Art Kopertine - + Date Added Datë Shtimi - + Last Played Luajtur Së Fundi Më - + Duration Kohëzgjatje - + Type Lloj - + Genre Zhanër - + Grouping Grupim - + Key Çelës - + Location Vendndodhje - + + Overview + + + + Preview Paraparje - + Rating Vlerësim - + ReplayGain - + ReplayGain - + Samplerate Shpejtësi kampionizimi - + Played - + E Luajtur - + Title Titull - + Track # Pjesa # - + Year Vit - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Po sillet figurë… @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Shtoje te Lidhje të Shpejta - + Remove from Quick Links Hiqe nga Lidhje të Shpejta - + Add to Library Shtoje te Fonoteka - + Refresh directory tree Rifresko pemë drejtorish - + Quick Links Lidhje të Shpejta - - + + Devices Pajisje - + Removable Devices Pajisje të Heqshme - - + + Computer Kompjuter - + Music Directory Added U shtua Drejtori Muzike - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Shtuat një ose më tepër drejtori muzike. Pjesët në këto drejtori s’do të jenë të përdorshme, deri sa të riskanoni fonotekën tuaj. Do të donit të riskanohet tani? - + Scan Skanoje - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. “Kompjuter” ju lejon të lëvizni nëpër, të shihni dhe të ngarkoni pjesë nga dosje prej hard diskut tuaj dhe pajisjesh të jashtme. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -680,12 +702,12 @@ Bitrate - + Bitrate ReplayGain - + ReplayGain @@ -966,7 +988,7 @@ trace - Above + Profiling messages Deck %1 - + Kuverta %1 @@ -976,7 +998,7 @@ trace - Above + Profiling messages Preview Deck %1 - + Inspekto Kuvertën %1 @@ -1012,7 +1034,7 @@ trace - Above + Profiling messages Crossfader - + Kryqzbehësi @@ -1175,7 +1197,7 @@ trace - Above + Profiling messages Equalizers - + Barazuesit @@ -1200,52 +1222,52 @@ trace - Above + Profiling messages Cues - + Shenjat Cue button - + Butoni i Shenjës Set cue point - + Vë Pikën e Shenjës Go to cue point - + Shko tek Pika e Shenjës Go to cue point and play - + Shko tek Pika e Shenjës edhe Luaje Go to cue point and stop - + Shko tek Pika e Shenjës edhe Ndalo Preview from cue point - + Inspekto nga Pika e Shenjës Cue button (CDJ mode) - + Butoni i Shenjës (Moda CDJ) Stutter cue - + Belbëzo Shenjën Hotcues - + Shenjat e Shpejta @@ -1255,27 +1277,27 @@ trace - Above + Profiling messages Clear hotcue %1 - + Zbraz Shenjën e Shpejte %1 Set hotcue %1 - + Vë Shenjën e Shpejte %1 Jump to hotcue %1 - + Kërce tek Shenja e Shpejtë %1 Jump to hotcue %1 and stop - + Kërce tek Shenja e Shpejte %1 edhe Ndalo Jump to hotcue %1 and play - + Kërce tek Shenja e Shpejtë %1 edhe Luaje @@ -3622,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. Funksionet e dhëna nga ky përshoqërim kontrollori do të çaktivizohen, deri sa të jetë zgjidhur problemi. - + You can ignore this error for this session but you may experience erratic behavior. Mundeni ta shpërfillni këtë gabim për këtë sesion, por mund të hasni sjellje me gabime. - + Try to recover by resetting your controller. Provoni ta zgjidhni duke kthyer te parazgjedhjet kontrollorin tuaj. - + Controller Mapping Error Gabim Përshoqërimi Kontrollori - + The mapping for your controller "%1" is not working properly. Përshoqërimi për kontrollorin tuaj “%1” s’po funksionon si duhet. - + The script code needs to be fixed. Duhet ndrequr kodi i programthit. @@ -3755,7 +3777,7 @@ trace - Above + Profiling messages Importo Arkë - + Export Crate Eksporto Arkë @@ -3765,7 +3787,7 @@ trace - Above + Profiling messages Shkyçe - + An unknown error occurred while creating crate: Ndodhi një gabim i panjohur teksa krijohej arkë: @@ -3774,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate Riemërtoni Arkën - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3797,17 +3813,17 @@ trace - Above + Profiling messages Riemërtimi i Arkës Dështoi - + Crate Creation Failed Krijimi i Arkës Dështoi - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Luajlistë M3U (*.m3u);;Luajlistë M3U8 (*.m3u8);;Luajlistë PLS (*.pls);;Tekst CSV (*.csv);;Teskt i Lexueshëm (*.txt) - + M3U Playlist (*.m3u) Luajlistë M3U (*.m3u) @@ -3816,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Arkat janë një mënyrë e goditur për t’ju ndihmuar të sistemoni muzikën me të cilën doni të bëni DJ-in. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3927,12 +3949,12 @@ trace - Above + Profiling messages Kontribues të Dikurshëm - + Official Website Sajt Zyrtar - + Donate Dhuroni @@ -4454,37 +4476,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4523,17 +4545,17 @@ You tried to learn: %1,%2 - + Log Regjistër - + Search Kërko - + Stats Statistika @@ -4989,7 +5011,7 @@ Two source connections to the same server that have the same mountpoint can not Bitrate - + Bitrate @@ -5187,113 +5209,113 @@ ndihmëz rreth ngjyrës së përshoqëruar me secilin çelës. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5624,6 +5646,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6215,62 +6247,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run Lejoje ekrankursyesin të xhirojë - + Prevent screensaver from running Pengoje xhirimin e ekrankursyesit - + Prevent screensaver while playing Pengo ekrankursyesin, teksa luhet - + Disabled I çaktivizuar - + 2x MSAA 2x MSAA - + 4x MSAA 4x MSAA - + 8x MSAA 8x MSAA - + 16x MSAA 16x MSAA - + This skin does not support color schemes Kjo lëkrçe s’mbulon skema ngjyrash - + Information Hollësi - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. Mixxx-i duhet rinisuar, para se të hyjnë në fuqi rregullime për vendore të re, përshkallëzimi apo “multi-sampling”. @@ -7437,173 +7469,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Parazgjedhje (vonesë e gjatë) - + Experimental (no delay) Eksperimentale (pa vonesë) - + Disabled (short delay) E çaktivizuar (vonesë e shkurtër) - + Soundcard Clock Sahat i Kartës së Zërit - + Network Clock Sahat i Rrjetit - + Direct monitor (recording and broadcasting only) - + Disabled E çaktivizuar - + Enabled E aktivizuar - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 paraqet karta zëri dhe kontrollorë për të cilët mund të donit të shihnit mundësinë e përdorimit në Mixxx. - + Mixxx DJ Hardware Guide Udhërrëfyes Hardware-i DJ për Mixxx - + Information Hollësi - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) auto (<= 1024 kuadro/periudhë) - + 2048 frames/period 2048 kuadro/periudhë - + 4096 frames/period 4096 kuadro/periudhë - + Are you sure? Jeni i sigurt? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? Jeni i sigurt se doni të vazhdohet? - + No Jo - + Yes, I know what I am doing Po, e di se ç’po bëj - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. Për hollësi, shihni te Doracaku i Përdoruesit të Mixxx-it. - + Configured latency has changed. Vonesa e formësuar ka ndryshuar. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Gabim formësimi @@ -7621,131 +7652,131 @@ The loudness target is approximate and assumes track pregain and main output lev API Tingujsh - + Sample Rate Shpejtësi Kampionizimi - + Audio Buffer Buffer Audio - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Për raste publiku drejtpërsëdrejti dhe vonesën më të ulët, përdorni sahat të kartës së zërit.<br>Për transmetim pa publik drejtpërsëdrejti, përdor sahat rrjeti. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization Njëkohësim i Disa Kartave Zanore Njëherësh - + Output - + Input - + System Reported Latency Vonesë e Raportuar për Sistemin - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Ndihmëza dhe Diagnostikime - + Downsize your audio buffer to improve Mixxx's responsiveness. Që të përmirësoni shkallën e reagimit të Mixxx-it, zvogëloni buffer-in tuaj audio. - + Query Devices Kërko Për Pajisje @@ -8191,47 +8222,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Hardware Tingujsh - + Controllers Kontrollorë - + Library Fonotekë - + Interface Ndërfaqe - + Waveforms Valë - + Mixer Përzierës - + Auto DJ Auto DJ - + Decks - + Colors Ngjyra @@ -8266,47 +8297,47 @@ Select from different types of displays for the waveform, which differ primarily &Ok - + Effects Efekte - + Recording - + Beat Detection Pikasje Rrahjesh - + Key Detection Pikasje Çelësi - + Normalization Normalizim - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> <font color='#BB0000'><b>Disa faqe parapëlqimesh përmbajnë gabime. Që të aplikohen ndryshimet, së pari ndreqni problemet.</b></font> - + Vinyl Control Kontroll Vinili - + Live Broadcasting Transmetim i Drejtpërdrejtë - + Modplug Decoder @@ -9301,27 +9332,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9536,15 +9567,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9555,57 +9586,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut Shkurtore @@ -9613,37 +9644,37 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. Kjo, ose një drejtori mëmë gjendet tashmë në fonotekën tuaj. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies Kjo, ose një drejtori e paraqitur s’ekziston, ose s’kapet dot. Veprimi po ndërpritet, që të shmangen mospërputhje te fonoteka - - + + This directory can not be read. Kjo drejtori s’mund të lexohet. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies Ndodhi një gabim i panjohur. Po ndërpritet veprimi, për të shmangur mospërputhje fonoteke - + Can't add Directory to Library S’shtohet dot Drejtori te Fonotekë - + Could not add <b>%1</b> to your library. %2 @@ -9652,27 +9683,27 @@ Po ndërpritet veprimi, për të shmangur mospërputhje fonoteke %2 - + Can't remove Directory from Library S’hiqet dot Drejtori nga Fonoteka - + An unknown error occurred. Ndodhi një gabim i panjohur. - + This directory does not exist or is inaccessible. Kjo drejtori s’ekziston, ose s’lejon hyrje. - + Relink Directory Rilidhe Drejtorinë - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9684,22 +9715,22 @@ Po ndërpritet veprimi, për të shmangur mospërputhje fonoteke LibraryFeature - + Import Playlist Importo Luajlistë - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Kartela Luajlistë (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Të mbishkruhet Kartela? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9829,18 +9860,18 @@ Doni vërtet të mbishkruhet? MixxxLibraryFeature - + Missing Tracks Mungojnë Pjesë - + Hidden Tracks Pjesë të Fshehura - Export to Engine Prime + Export to Engine DJ @@ -9852,211 +9883,252 @@ Doni vërtet të mbishkruhet? MixxxMainWindow - + Sound Device Busy Pajisje Zanore e Zënë - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Riprovoni</b> pas mbylljes së veprimit tjetër, ose rilidhni një pajisje zanore - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Riformësoni</b> rregullime Mixxx-i pajisjeje zanore. - - + + Get <b>Help</b> from the Mixxx Wiki. Merrni <b>Ndihmë</b> që nga Wiki e Mixxx-it. - - - + + + <b>Exit</b> Mixxx. <b>Mbylleni</b> Mixxx-in. - + Retry Riprovo - + skin lëkurçe - + Allow Mixxx to hide the menu bar? Të lejohet Mixxx-i të fshehtë shtyllën e menuve? - + Hide Always show the menu bar? Fshihe - + Always show Shfaqe përherë - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Shtylla e menuve të Mixxx-it është e fshehur dhe mund të shfaqet/fshihet me një shtypje të vetme të tastit <b>Alt</b>.<br><br>Që të pajtoheni, klikoni mbi <b>%1</b>.<br><br>Që ta çaktivizoni, klikoni mbi <b>%2</b>, nëse, për shembull, s’e përdorni Mixxx-in me tastierë.<br><br>Këtë rregullim mund ta ndryshoni kurdo që nga Parapëlqime -> Ndërfaqe.<br> - + Ask me again Pyetmë sërish - - + + Reconfigure Riformësoje - + Help Ndihmë - - + + Exit Mbylle - - + + Mixxx was unable to open all the configured sound devices. Mixxx-i s’qe në gjendje të hapë krejt pajisjet zanore të formësuara. - + Sound Device Error Gabim Pajisjeje Zanore - + <b>Retry</b> after fixing an issue <b>Riprovoni</b> pas ndreqjes së një problemi - + No Output Devices S’ka Pajisje Në Dalje - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx-i qe dormësuar pa ndonjë pajisje zanore në dalje. Pa një pajisje në dalje të formësuar, përpunimi audio do të çaktivizohet. - + <b>Continue</b> without any outputs. <b>Vazhdo</b> pa ndonjë dalje. - + Continue Vazhdo - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? Jeni i sigurt se doni të ngarkohet një pjesë e re? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Për këtë kontroll vinili s’ka të përzgjedhur pajisje në hyrje. Ju lutemi, së pari përzgjidhni një pajisje në hyrje, që nga parapëlqimet për “hardware” tingujsh. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? Për këtë mikrofon s’është përzgjedhur ndonjë pajisje në hyrje. Doni të përzgjidhni një pajisje në hyrje? - + There is no input device selected for this auxiliary. Do you want to select an input device? Për këtë portë ndihmëse s’është përzgjedhur ndonjë pajisje në hyrje. Doni të përzgjidhni një pajisje në hyrje? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Gabim te kartelë lëkurçeje - + The selected skin cannot be loaded. Lëkurçja e përzgjedhur s’mund të ngarkohet. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Ripohoni Mbylljen - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. Dritarja e parapëlqimeve është ende e hapur. - + Discard any changes and exit Mixxx? Të hidhen tej ndryshimet dhe të dilet nga Mixxx-i? @@ -10072,13 +10144,13 @@ Doni të përzgjidhni një pajisje në hyrje? PlaylistFeature - + Lock Kyçe - - + + Playlists Luajlista @@ -10088,32 +10160,58 @@ Doni të përzgjidhni një pajisje në hyrje? Shkartise Luajlistën - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Shkyçe - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. Luajlistat janë lista të renditura pjesësh, që ju lejojnë të planifikoni seancat tuaja DJ. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. Që të mund të ruani energjinë e publikut tuaj, mund të jetë e nevojshme të anashkalohen ca pjesë te luajlista juaj e përgatitur, ose të shotni ca pjesë të tjera. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Disa DJ ndërtojnë luajlista para se të luajnë drejtpërsëdrejti, të tjerë parapëlqejnë t’i hartojnë ato aty në vend. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Kur përdoret një luajlistë gjatë një seance DJ drejpërsëdrejti, mos harroni t’i kushtoni përherë vëmendje mënyrës se si reagon publiku juaj ndaj muzikës që keni zgjedhur të luani. - + Create New Playlist Krijo Luajlistë të Re @@ -11604,7 +11702,7 @@ Fully right: end of the effect period - + Deck %1 Kuverta %1 @@ -11737,7 +11835,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11768,7 +11866,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11901,12 +11999,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12034,54 +12132,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Luajlista - + Folders Dosje - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12737,7 +12835,7 @@ may introduce a 'pumping' effect and/or distortion. Crossfader - + Kryqzbehësi @@ -15100,12 +15198,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks Po kalohen pjesë të fshehura - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Pjesët e përzgjedhura gjenden te luajlistat vijuese:%1Fshehja e tyre do t’i heqë prej këtyre luajlistave. Të vazhdohet? @@ -15323,47 +15421,47 @@ Kjo s’mund të zhbëhet! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15488,323 +15586,353 @@ Kjo s’mund të zhbëhet! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Krijoni Luajlistë të &Re - + Create a new playlist Krijoni një luajlistë të re - + Ctrl+n Ctrl+n - + Create New &Crate Krijo &Arkë të Re - + Create a new crate Krijoni një arkë të re - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Shihni - + Auto-hide menu bar Vetëfshihe shtyllën e menuve - + Auto-hide the main menu bar when it's not used. Vetëfshih shtyllën e menusë kryesore, kur s’është në përdorim. - + May not be supported on all skins. Mund të mos e mbulojnë krejt lëkurçet. - + Show Skin Settings Menu Shfaq Menu Rregullimesh Lëkurçeje - + Show the Skin Settings Menu of the currently selected Skin Shfaqni Menunë e Rregullimeve për Lëkurçen të Lëkurçes së përzgjedhur aktualsisht - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Shfaq Pjesën e Mikrofonit - + Show the microphone section of the Mixxx interface. Shfaq te ndërfaqja e Mixxx-it pjesën e mikrofonit. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Shfaq Pjesën Kontroll Vinili - + Show the vinyl control section of the Mixxx interface. Shfaq te ndërfaqja e Mixxx-it pjesën “kontrolli vinili”. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Shfaq Kopertinë - + Show cover art in the Mixxx interface. Shfaq kopertinë te ndërfaqja e Mixxx-it. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maksimizo Fonotekën - + Maximize the track library to take up all the available screen space. Maksimizoni fonotekën që të zërë krejt hapësirën e mundshme në ekran. - + Space Menubar|View|Maximize Library Tasti Hapësirë - + &Full Screen Sa &Krejt Ekrani - + Display Mixxx using the full screen Shfaqeni Mixxx-in duke përdorur krejt ekranin - + &Options &Mundësi - + &Vinyl Control &Kontroll Vinili - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 Aktivizo Kontroll Vinili &%1 - + &Record Mix &Incizoni Përzierjen - + Record your mix to a file Incizojeni në një kartelë përzierjen tuaj - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Aktivizo T&ransmetim të Drejtpërdrejtë - + Stream your mixes to a shoutcast or icecast server Transmetojini përzierjet tuaja te një shërbyes Shoutcast ose Icecast - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Aktivizo Shkurtore &Tastiere - + Toggles keyboard shortcuts on or off Aktivizoni ose çaktivizoni shkurtore tastiere - + Ctrl+` Ctrl+` - + &Preferences &Parapëlqime - + Change Mixxx settings (e.g. playback, MIDI, controls) Ndryshoni rregullimet e Mixxx-it (p.sh., për luajtjen, MIDI, kontrolle) - + &Developer &Zhvillues - + &Reload Skin &Ringarko Lëkurçe - + Reload the skin Ringarkoni lëkurçen - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools &Mjete Zhvilluesi - + Opens the developer tools dialog Bën hapjen e dialogut të mjeteve të zhvilluesit - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled &Diagnostikues i Aktivizuar - + Enables the debugger during skin parsing Aktivizon diagnostikuesin gjatë analizimit të lëkurçes - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Ndihmë - + Show Keywheel menu title @@ -15821,74 +15949,74 @@ Kjo s’mund të zhbëhet! Eksportojeni fonotekën në formatin Engine DJ - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel F12 - + &Community Support &Asistencë Nga Bashkësia - + Get help with Mixxx Merrni ndihmë për Mixxx-in - + &User Manual &Doracak Përdoruesi - + Read the Mixxx user manual. Lexoni doracakun e përdoruesit të Mixxx-it. - + &Keyboard Shortcuts Sh&kurtore Tastiere - + Speed up your workflow with keyboard shortcuts. Shpejtoni rrjedhën tuaj të punës përmes shkurtoresh tastiere. - + &Settings directory Drejtori &rregullimesh - + Open the Mixxx user settings directory. Hapni drejtorinë e rregullimeve të përdoruesit të Mixxx-it. - + &Translate This Application &Përktheni Këtë Aplikacion - + Help translate this application into your language. Ndihmoni të përkthehet ky aplikacion në gjuhën tuaj. - + &About &Mbi - + About the application Mbi aplikacionin @@ -15896,25 +16024,25 @@ Kjo s’mund të zhbëhet! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible Gati për luajtje, po analizohet… - - + + Loading track... Text on waveform overview when file is cached from source Po ngarkohet pjesë… - + Finalizing... Text on waveform overview during finalizing of waveform analysis Po përfundohet… @@ -15923,25 +16051,13 @@ Kjo s’mund të zhbëhet! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - - - - + Search noun - + Clear input @@ -15952,169 +16068,163 @@ Kjo s’mund të zhbëhet! - + Clear the search bar input field - - Enter a string to search for - Jepni një varg për të cilin të kërkohet + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Përdorni operatorë të tillë si bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - Për më tepër hollësi, shihni Doracak Përdoruesi > Fonotekë Mixxx-i + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - Shkurtore + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Fokus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts - Shkurtore + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space Ctrl+Space - + Toggle search history Shows/hides the search history entries Shfaq/fshih historik kërkimesh - + Delete or Backspace Tasti Delete ose Backspace - - Delete query from history - Fshije kërkesën nga historiku - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - Dil nga kërkimi + + Delete query from history + Fshije kërkesën nga historiku WSearchRelatedTracksMenu - + Search related Tracks - + Key Çelës - + harmonic with %1 - + BPM BPM - + between %1 and %2 mes %1 dhe %2 - + Artist Artist - + Album Artist Artist Albumi - + Composer Kompozitor - + Title Titull - + Album Album - + Grouping Grupim - + Year Vit - + Genre Zhanër - + Directory Drejtori - + &Search selected &Kërko për përzgjedhjen @@ -16122,625 +16232,625 @@ Kjo s’mund të zhbëhet! WTrackMenu - + Load to Nagrkoje te - + Deck - + Sampler - + Add to Playlist Shtoje te Luajlistë - + Crates Arka - + Metadata Tejtëdhëna - + Update external collections Përditëso koleksione të jashtëm - + Cover Art Art Kopertine - + Adjust BPM Përimto BPM-në - + Select Color Përzgjidhni Ngjyrë - - + + Analyze Analizo - - + + Delete Track Files Fshi Kartela Pjesësh - + Add to Auto DJ Queue (bottom) Shtoje te Radhë Auto DJ-i (në fund) - + Add to Auto DJ Queue (top) Shtoje te Radhë Auto DJ-i (në krye) - + Add to Auto DJ Queue (replace) Shtoje te Radhë Auto DJ-i (zëvendësoje) - + Preview Deck - + Remove Hiqe - + Remove from Playlist Hiqe nga Luajlistë - + Remove from Crate Hiqe nga Arkë - + Hide from Library Hiqe nga Fonotekë - + Unhide from Library Hiqi Fshehjen në Fonotekë - + Purge from Library Spastroje nga Fonoteka - + Move Track File(s) to Trash Shpjer Kartelë(a) Pjese(ësh) te Hedhurina - + Delete Files from Disk Fshiji Kartelat nga Disku - + Properties Veti - + Open in File Browser Hape në Shfletues Kartelash - + Select in Library Përzgjidhni në Fonotekë - + Import From File Tags Importo Nga Etiketa Kartelash - + Import From MusicBrainz Importo Nga MusicBrainz - + Export To File Tags Eksporto Te Etiketa Kartelash - + BPM and Beatgrid - + Play Count Numër Luajtjesh - + Rating Vlerësim - + Cue Point - - + + Hotcues - + Shenjat e Shpejta - + Intro - + Outro - + Key Çelës - + ReplayGain - + ReplayGain - + Waveform Valë - + Comment Koment - + All Krejt - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Kyçe BPM-në - + Unlock BPM Shkyçe BPM-në - + Double BPM Dyfishoje BPM-në - + Halve BPM Përgjysmoje BPM -në - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + Shift Beatgrid Half Beat - + Reanalyze Rianalizoje - + Reanalyze (constant BPM) Rianalizoje (BPM konstante) - + Reanalyze (variable BPM) Rianalizoje (BPM e ndryshueshme) - + Update ReplayGain from Deck Gain - + Deck %1 - + Kuverta %1 - + Importing metadata of %n track(s) from file tags Po importohen tejtëdhëna të %n pjese nga etiketa kartelePo importohen tejtëdhëna të %n pjesëve nga etiketa kartele - + Marking metadata of %n track(s) to be exported into file tags Po u vihet shenjë tejtëdhënave të %n pjese, që të eksportohen në etiketa kartelePo u vihet shenjë tejtëdhënave të %n pjesëve, që të eksportohen në etiketa kartele - - + + Create New Playlist Krijo Luajlistë të Re - + Enter name for new playlist: Jepni emër për luajlistë të re: - + New Playlist Luajlistë e Re - - - + + + Playlist Creation Failed Krijimi i Luajlistës Dështoi - + A playlist by that name already exists. Ka tashmë një luajlistë me atë emër. - + A playlist cannot have a blank name. Një luajlistë s’mund të ketë emër të zbrazët. - + An unknown error occurred while creating playlist: Ndodhi një gabim i panjohur teksa krijohej luajlista: - + Add to New Crate Shtoje në Arkë të Re - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) Po kyçet BPM-ja e %n pjesePo kyçen BPM-të e %n pjesëve - + Unlocking BPM of %n track(s) Po shkyçet BPM-ja e %n pjesePo shkyçen BPM-të e %n pjesëve - + Setting rating of %n track(s) Po vihet vlerësim i %n pjesePo vihen vlerësime të %n pjesëve - + Setting color of %n track(s) Po caktohet ngjyrë e %n pjesePo caktohet ngjyrë e %n pjesëve - + Resetting play count of %n track(s) Po zerohet numër luajtjesh e %n pjesePo zerohet numër luajtjesh e %n pjesëve - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) Po hiqet vlerësim i %n pjesePo hiqen vlerësime të %n pjesëve - + Clearing comment of %n track(s) Po spastrohet koment i %n pjesePo spastrohen komente të %n pjesëve - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? Të shpihen këto kartela te koshi i hedhurnave? - + Permanently delete these files from disk? Të fshihen përgjithnjë te disku këto kartela? - - + + This can not be undone! Kjo s’mund të zhbëhet! - + Cancel Anuloje - + Delete Files Fshiji Kartelat - + Okay OK - + Move Track File(s) to Trash? Të Shpihet te Hedhurina Kartela e Pjesës? - + Track Files Deleted U Fshinë Kartela Pjesësh - + Track Files Moved To Trash U Shpunë Te Hedhurina Kartela Pjesësh - + %1 track files were moved to trash and purged from the Mixxx database. U shpu te hedhurinat dhe u spastrua nga baza e të dhënave të Mixxx-it %1 kartelë pjese. - + %1 track files were deleted from disk and purged from the Mixxx database. U fshi nga disku dhe u spastrua nga baza e të dhënave të Mixxx-it %1 kartelë pjese. - + Track File Deleted U Fshi Kartelë Pjesësh - + Track file was deleted from disk and purged from the Mixxx database. U fshi nga disku dhe u spastrua nga baza e të dhënave të Mixxx-it kartelë pjese. - + The following %1 file(s) could not be deleted from disk S’u fshi dot nga disku %1 kartelë vijuese - + This track file could not be deleted from disk Kjo kartelë pjesësh s’u fshi dot nga disku - + Remaining Track File(s) Kartelë Pjese e Mbetur - + Close Mbylle - + Clear Reset metadata in right click track context menu in library Spastroji - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? Të shpihet kjo kartelë pjese te koshi i hedhurinave? - + Permanently delete this track file from disk? Të fshihet përgjithnjë te disku kjo kartelë pjese? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... Po hiqet nga disku %n kartelë pjese… - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. Shënim: nëse gjendeni nën pamjen Kompjuter, ose Incizim, duhet të klikoni sërish pamjen aktuale që të shihni ndryshimet. - + Track File Moved To Trash U Shpu Te Hedhurina Kartelë Pjese - + Track file was moved to trash and purged from the Mixxx database. U shpu te hedhurinat dhe u spastrua nga baza e të dhënave të Mixxx-it kartelë pjese. - + Don't show again during this session Mos e shfaq sërish gjatë këtij sesioni - + The following %1 file(s) could not be moved to trash S’u shpu dot te hedhurinat %1 kartelë vijuese - + This track file could not be moved to trash Kjo kartelë pjesësh s’u shou dot te hedhurinat - + Setting cover art of %n track(s) Po ujdiset kopertinë e %n pjesePo ujdisen kopertinat e %n pjesëve - + Reloading cover art of %n track(s) Po ringarkohet kopertinë e %n pjesePo ringarkohen kopertina të %n pjesëve @@ -16756,37 +16866,37 @@ Kjo s’mund të zhbëhet! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16794,37 +16904,37 @@ Kjo s’mund të zhbëhet! WTrackTableView - + Confirm track hide Ripohoni fshehje pjese - + Are you sure you want to hide the selected tracks? Jeni i sigurt se doni të kalohen të fshehura pjesët e përzgjedhura? - + Are you sure you want to remove the selected tracks from AutoDJ queue? Jeni i sigurt se doni të hiqen pjesët e përzgjedhura nga radha për AutoDJ? - + Are you sure you want to remove the selected tracks from this crate? Jeni i sigurt se doni të hiqen pjesët e përzgjedhura nga kjo arkë? - + Are you sure you want to remove the selected tracks from this playlist? Jeni i sigurt se doni të hiqen pjesët e përzgjedhura nga kjo luajlistë? - + Don't ask again during this session Mos pyet sërish gjatë këtij sesioni - + Confirm track removal Ripohoni heqje pjese @@ -16832,12 +16942,12 @@ Kjo s’mund të zhbëhet! WTrackTableViewHeader - + Show or hide columns. Shfaqni ose fshihni shtylla. - + Shuffle Tracks Shkartis Pjesët @@ -16845,52 +16955,52 @@ Kjo s’mund të zhbëhet! mixxx::CoreServices - + fonts shkronja - + database bazë të dhënash - + effects efekte - + audio interface ndërfaqe audio - + decks - + library fonotekë - + Choose music library directory Zgjidhni drejtori fonoteke - + controllers kontrollorë - + Cannot open database S’hapet dot bazë të dhënash - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16904,68 +17014,78 @@ Që të dilet, klikoni mbi OK. mixxx::DlgLibraryExport - + Entire music library Krejt fonotekën - - Selected crates - Arkat e përzgjedhura + + Crates + + + + + Playlists + + + + + Selected crates/playlists + - + Browse Shfletoni - + Export directory - + Database version Version baze të dhënash - + Export Eksportoje - + Cancel Anuloje - + Export Library to Engine DJ "Engine DJ" must not be translated Eksportoje Fonotekën si Engine DJ - + Export Library To Eksportoje Fonotekën Te - + No Export Directory Chosen S’u Përzgjodh Drejtori Eksportimi - + No export directory was chosen. Please choose a directory in order to export the music library. S’u zgjodh drejtori eksportimi. Që të eksportohet fonotekë, ju lutemi, përzgjidhni një drejtori. - + A database already exists in the chosen directory. Exported tracks will be added into this database. Ka tashmë një bazë të dhënash në drejtorinë e zgjedhur. Pjesët e eksportuara do të shtohen te kjo bazë të dhënash. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. Ka tashmë një bazë të dhënash në drejtorinë e zgjedhur, por pati një problem në ngarkimin e saj. Në këtë situatë, s’është e garantuar se eksportimi do të dalë me sukses. @@ -16986,7 +17106,7 @@ Që të dilet, klikoni mbi OK. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16997,23 +17117,23 @@ Që të dilet, klikoni mbi OK. mixxx::LibraryExporter - + Export Completed Eksportimi u Plotësua - - Exported %1 track(s) and %2 crate(s). - U eksportuan %1 pjesë dhe %2 arkë(a). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed Eksportimi Dështoi - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_sr.qm b/res/translations/mixxx_sr.qm index 7f2937af05ccaaeb2eb52e5b6fcc3238b1a50cf4..6541cd9d94161c24dceae404ecdd4aab2bf2f6df 100644 GIT binary patch delta 499 zcmXBQPe_w-90u_B`}n%z^-bGqmASn(Ei+piBuogKEMDx-K?r4sSUU!Z?9`?GadYqf zxmpBY%mlNb9YS}BUno?}Ll6Z+j4X&or|42=qZ*?ZJ$-J^^YDE8r+odR-0vdkxuZ&m zedao8NIl^Oon;@~N_iu!WB7)*qD%8M~G~!TTT-3l*Nzu zxTsjViBwVBQv`>VVWsG!(6uiT@=-1;VI=)RZfge$gW}-6Z6I@=)%{ImlB`~7ybzf)?c=)DgY*Kcwq7x0Ya^sag?`{IA^(w8`w)S3dk}>tFWUV| z^l|H>3kh@gMgDHDB9Ry6Ltb+fZynyo>`Sg42_qk1cV`vGCjaWxP}~se(Fh^?M#Q_? z2{RA)u44>^GS?k95d9!@=PJRt!ws#8c!?X`W?6(Mj{QJ#orhgMxGQKhifvrax$A)wq6Y z1Jf>18PEu`BcgWNtVq2R4R?S#CRYqex*pmQnNK|7`H9jqBjC*kytEeZ;%RhV8zATW N@-l*J=T=a*{Rg$ps)Yam delta 624 zcmZWmT}YE*6n@{w*DXK%$>mSWZMq-HxwTP*T_nq_q`(5Hyof2}R-}l98kBDSeRJ~< z368P4&>$s9FGOC^BoTrU1kznWzYwf$3cN9+8q$}Sb>Q&aJkN8UbI!Y;%E#Zzog!Yc zU|Qn{t3^q|}_c%hgXe`%b7?9%LnN^1Iv*Lc+T@5p6J=X&@M5$bR`j+PXK$;BM z9Q{t|-t(MeXo)uSj_}Xq&acPtCyM0zl)cUqere94qi@32C)(3nP=X zxVI5Q4$3pG*&a?}~aDMi=C!v5h18NCu0vu>-fM z({v8QF-n-OqPt7F%}X4SHcDEy5xzmmVl71-RhE1~-$Qa(D-io2{ZgCH;FQ&W9nPQ))7FFUXa|y>T zrj_n*pXh9Fb=AZzvoJdUqhy}Ha=ATlEmU(oaI@nddQtqf83vJdsw1$Yjwc?YBfgS_ L(q-E$Rt$dtL0iij diff --git a/res/translations/mixxx_sr.ts b/res/translations/mixxx_sr.ts index 23a45d6ee46c..1c51570fc1f0 100644 --- a/res/translations/mixxx_sr.ts +++ b/res/translations/mixxx_sr.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Уклони гајбицу из извора - + Auto DJ Самостални Диџеј - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Додај сандук у изворе @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Нови списак нумера - + Add to Auto DJ Queue (bottom) Додајте у ред самосталног диџеја (доле) - + Create New Playlist Састави листу песама - + Add to Auto DJ Queue (top) Додајте у ред самосталног диџеја (горе) - + Remove Уклони @@ -180,12 +180,12 @@ Преименуј - + Lock Закључај - + Duplicate Дуплирај @@ -206,24 +206,24 @@ Анализирај целу листу - + Enter new name for playlist: Ново име за листу песама: - + Duplicate Playlist Удвостручи списак нумера - - + + Enter name for new playlist: Ново име за листу песама: - + Export Playlist Извези списак нумера @@ -233,70 +233,77 @@ Додај на Ауто-Диџеј листу (рокада) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Преименуј списак нумера - - + + Renaming Playlist Failed Преименовање списка нумера није успело - - - + + + A playlist by that name already exists. Већ постоји списак нумера са овим називом. - - - + + + A playlist cannot have a blank name. Назив списка нумера не може бити празан. - + _copy //: Appendix to default name when duplicating a playlist _умножи - - - - - - + + + + + + Playlist Creation Failed Стварање списка нумера није успело - - + + An unknown error occurred while creating playlist: Дошло је до непознате грешке приликом стварања списка нумера: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) М3У листа (*.м3у) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) М3У списак нумера (*.m3u);;М3У8 списак нумера (*.m3u8);;ПЛС списак нумера (*.pls);;Текстуални ЦСВ (*.csv);;Читљив текст (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Временска ознака @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Не могу да учитам нумеру. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Албум - + Album Artist Извођач - + Artist Извођач - + Bitrate Проток - + BPM ТУМ - + Channels Број канала - + Color - + Comment Примедба - + Composer Састављач - + Cover Art Омот - + Date Added Додата - + Last Played - + Duration Трајање - + Type Врста - + Genre Жанр - + Grouping Груписање - + Key Кључ - + Location Место - + + Overview + + + + Preview Преглед - + Rating Оцена - + ReplayGain Ауто-ниво - + Samplerate - + Played Пуштено - + Title Наслов - + Track # Нумера бр. - + Year Година - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -546,67 +558,77 @@ BrowseFeature - + Add to Quick Links Додајте у брзе везе - + Remove from Quick Links Уклоните из брзих веза - + Add to Library Додај у Базу - + Refresh directory tree - + Quick Links Брзе везе - - + + Devices Уређаји - + Removable Devices Уклоњиви уређаји - - + + Computer Рачунар - + Music Directory Added Фолдер додат - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Додали сте неке фолдере у Базу. Песме у овим фолдерима нису доступне док не извршите упит у Базу. Да ли желите то сада? - + Scan Скен - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Рачунар" је место одакле можете приступити фолдерима на тврдом диску и спољној меморији. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -752,87 +774,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -842,27 +864,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1044,13 +1071,13 @@ trace - Above + Profiling messages - + Set to full volume Макс. ниво - + Set to zero volume Мин. ниво @@ -1075,13 +1102,13 @@ trace - Above + Profiling messages Цензура - + Headphone listen button Дугме за слушање слушалицама - + Mute button Пригуши @@ -1092,25 +1119,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Усмерење мешача (тј. лево, десно, на средини) - + Set mix orientation to left Микс на лево - + Set mix orientation to center Микс пола-пола - + Set mix orientation to right Микс на десно @@ -1151,22 +1178,22 @@ trace - Above + Profiling messages Дугме лупкања ТУМ-а - + Toggle quantize mode Окини режим квантизације - + One-time beat sync (tempo only) Моментално укачи (само) темпо - + One-time beat sync (phase only) Моментално укачи (само) фазу - + Toggle keylock mode Промените режим закључавања тастера @@ -1176,193 +1203,193 @@ trace - Above + Profiling messages Уједначавачи - + Vinyl Control Управљање плочом - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Окини режим наговештаја управљања плочом (ИСКЉ./ЈЕДАН/БИТАН) - + Toggle vinyl-control mode (ABS/REL/CONST) Окини режим управљања плочом (АБС/РЕЛ/КОНСТ) - + Pass through external audio into the internal mixer Екстерни сигнал у миксер - + Cues Наговештаји - + Cue button Дугме наговештаја - + Set cue point Подеси тачку наговештаја - + Go to cue point Скочи на маркер - + Go to cue point and play Пусти од маркера - + Go to cue point and stop Иди до тачке наговештаја и стани - + Preview from cue point Преслушај од маркера - + Cue button (CDJ mode) Маркер-дугме (ЦДЈ) - + Stutter cue "Муцајући" маркер - + Hotcues Битни наговештаји - + Set, preview from or jump to hotcue %1 Забележи/преслушај/скочи на брзи маркер %1 - + Clear hotcue %1 Очисти битни наговештај %1 - + Set hotcue %1 Забележи брзи маркер %1 - + Jump to hotcue %1 Скочи до битног наговештаја %1 - + Jump to hotcue %1 and stop Скочи до битног наговештаја „%1“ и стани - + Jump to hotcue %1 and play Пусти од брзог маркера %1 - + Preview from hotcue %1 Преслушај од брзог маркера %1 - - + + Hotcue %1 Битни наговештај %1 - + Looping Упетљавање - + Loop In button Дугме за упетљавање - + Loop Out button Дугме за распетљавање - + Loop Exit button Дугме за напуштање петље - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Помакни сегмент унапред за %1 - + Move loop backward by %1 beats Помакни сегмент уназад за %1 - + Create %1-beat loop Направи %1-тактну петљу - + Create temporary %1-beat loop roll Направи привремено %1-тактно правило петље @@ -1478,20 +1505,20 @@ trace - Above + Profiling messages - - + + Volume Fader Клизач нивоа - + Full Volume Макс. ниво - + Zero Volume Мин. ниво @@ -1507,7 +1534,7 @@ trace - Above + Profiling messages - + Mute Пригуши @@ -1518,7 +1545,7 @@ trace - Above + Profiling messages - + Headphone Listen Усмери у слушалице @@ -1539,25 +1566,25 @@ trace - Above + Profiling messages - + Orientation Панорама - + Orient Left Баци на лево - + Orient Center Стави у центар - + Orient Right Баци на десно @@ -1627,83 +1654,83 @@ trace - Above + Profiling messages Намести Битгрид ка десно - + Adjust Beatgrid Дотерај тактну мрежу - + Align beatgrid to current position Уклопи Битгрид са тренутном позицијом - + Adjust Beatgrid - Match Alignment Намести Битгрид - усклади позицију - + Adjust beatgrid to match another playing deck. Намести Битгрид да прати други дек - + Quantize Mode Магнетни режим - + Sync Синхро - + Beat Sync One-Shot Синхро. ритма моментално - + Sync Tempo One-Shot Синхро. темпа моментално - + Sync Phase One-Shot Синхро. фазе моментално - + Pitch control (does not affect tempo), center is original pitch Контрола фреквенције (без темпа), центар = оригинал - + Pitch Adjust Подеси фреквенцију - + Adjust pitch from speed slider pitch Фреквенција по клизачу за брзину - + Match musical key Паметно усклади тоналитет - + Match Key Усклади тоналитет - + Reset Key Основни тоналитет - + Resets key to original = Оригинални тоналитет @@ -1744,459 +1771,459 @@ trace - Above + Profiling messages Уједначавач ниских - + Toggle Vinyl Control Активна аналогна контрола - + Toggle Vinyl Control (ON/OFF) Прекидач аналогне контроле (укљ.-искљ.) - + Vinyl Control Mode Режим управљања плочом - + Vinyl Control Cueing Mode Режим аналогне припреме - + Vinyl Control Passthrough Бајпас аналогне контроле - + Vinyl Control Next Deck Аналогна контрола сл. дек - + Single deck mode - Switch vinyl control to next deck Јединствени дек - пребаци аналогну контролу на сл. дек - + Cue Наговештај - + Set Cue Маркер припреме - + Go-To Cue Иди на маркер - + Go-To Cue And Play Иди на маркер и пусти - + Go-To Cue And Stop Иди на маркер и стани - + Preview Cue Провери маркер - + Cue (CDJ Mode) Припрема (CDJ режим) - + Stutter Cue - + Go to cue point and play after release Иди на маркер и пусти по отпуштању - + Clear Hotcue %1 Ослободи брзи маркер %1 - + Set Hotcue %1 Постави брзи маркер %1 - + Jump To Hotcue %1 Скочи на брзи маркер %1 - + Jump To Hotcue %1 And Stop Скочи на брзи маркер %1 и стани - + Jump To Hotcue %1 And Play Скочи на брзи маркер %1 и пусти - + Preview Hotcue %1 Провери брзи маркер %1 - + Loop In Почетак понављања - + Loop Out Крај понављања - + Loop Exit Напусти петљу - + Reloop/Exit Loop Понављај/Настави - + Loop Halve Преполовљавање петље - + Loop Double Удвостручавање петље - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Макни понављ. +%1 откуцај/а - + Move Loop -%1 Beats Макни понављ. -%1 откуцај/а - + Loop %1 Beats Понављај %1 откуцај/а - + Loop Roll %1 Beats Клизно понављ. %1 откуцај/а - + Add to Auto DJ Queue (bottom) Додајте у ред самосталног диџеја (доле) - + Append the selected track to the Auto DJ Queue Додај одабир на крај Ауто-Диџеј листе - + Add to Auto DJ Queue (top) Додајте у ред самосталног диџеја (горе) - + Prepend selected track to the Auto DJ Queue Додај одабир на почетак Ауто-Диџеј листе - + Load Track Учитај одабир - + Load selected track Учитајте изабрану нумеру - + Load selected track and play Учитајте изабрану нумеру и пустите је - - + + Record Mix Снимај микс - + Toggle mix recording Снимање микса активно - + Effects Дејства - + Quick Effects Једноставни ефекти - + Deck %1 Quick Effect Super Knob Дек %1 - гл. пот. за ефекте - + Quick Effect Super Knob (control linked effect parameters) Главни потенциометар за ефекте (контрола повезаних параметара) - - + + Quick Effect Једноставан ефекат - + Clear Unit Уклони процесор - + Clear effect unit Уклони процесор из модула - + Toggle Unit Процесор активан - + Dry/Wet Суво-Ефекат - + Adjust the balance between the original (dry) and processed (wet) signal. Постави однос јачине сувог (чистог) сигнала и обрађеног сигнала (ефекта) - + Super Knob Гл. потенциометар - + Next Chain Сл. ланац - + Assign Додели - + Clear Уклони - + Clear the current effect Уклони одабрани ефекат - + Toggle Активација - + Toggle the current effect Прекидач за одабрани ефекат - + Next Даље - + Switch to next effect Одабери сл. ефекат у низу - + Previous Претходно - + Switch to the previous effect Одабери претх. ефекат у низу - + Next or Previous Следећи/претходни - + Switch to either next or previous effect Одабери или сл или претходни ефекат у низу - - + + Parameter Value Вредност параметра - - + + Microphone Ducking Strength Јачина компресије микрофона - + Microphone Ducking Mode Режим компресије микрофона - + Gain Појачање - + Gain knob Дугменце појачања - + Shuffle the content of the Auto DJ queue Промешај листу Ауто-Диџеј-а - + Skip the next track in the Auto DJ queue Прескочи следећу нумеру у Ауто-Диџеј листи - + Auto DJ Toggle Ауто ДиЏеј активан - + Toggle Auto DJ On/Off Прекидач Ауто-Диџеј-а, укљ./искљ. - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Увећај/смањи бирач нумера - + Maximize the track library to take up all the available screen space. Користи цео екран за одабир нумера - + Effect Rack Show/Hide Приказ ланца ефеката - + Show/hide the effect rack Прикажи или сакриј модул за ефекте - + Waveform Zoom Out Рашири осцилоскоп @@ -2211,103 +2238,103 @@ trace - Above + Profiling messages Појачање слушалица - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Брзина репродукције - + Playback speed control (Vinyl "Pitch" slider) Контрола брзине пуштања (аналогни "Pitch" клизач) - + Pitch (Musical key) Фрекв. (музикално) - + Increase Speed Увећај брзину - + Adjust speed faster (coarse) Подеси на брже (грубо) - + Increase Speed (Fine) Убрзај (фино) - + Adjust speed faster (fine) Подеси на брже (фино) - + Decrease Speed Смањи брзину - + Adjust speed slower (coarse) Подеси на спорије (грубо) - + Adjust speed slower (fine) Подеси на спорије (фино) - + Temporarily Increase Speed Моментално убрзање - + Temporarily increase speed (coarse) Моментално убрзање (грубо) - + Temporarily Increase Speed (Fine) Моментално убрзање (фино) - + Temporarily increase speed (fine) Моментално убрзање (фино) - + Temporarily Decrease Speed Моментално успорење - + Temporarily decrease speed (coarse) Моментално успорење (грубо) - + Temporarily Decrease Speed (Fine) Моментално успорење (фино) - + Temporarily decrease speed (fine) Моментално успорење (фино) @@ -2459,1059 +2486,1081 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) CUP (Скочи и пусти) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats Понављај одабране откуцаје - + Create a beat loop of selected beat size Активирај понављање са одређеним бројем откуцаја - + Loop Roll Selected Beats Клизно понављање одабраних откуцаја - + Create a rolling beat loop of selected beat size Активирај клизно понављање са одређеним бројем откуцаја - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position Укљ./искљ. понављање и врати на почетак понављања ако је прошао - + Reloop And Stop Понови па стани - + Enable loop, jump to Loop In point, and stop Активирај понављање, скочи на почетак понављања и заустави - + Halve the loop length Преполови дужину понављања - + Double the loop length Удвостручи дужину понављања - + Beat Jump / Loop Move Скок на откуцај / помак понављања - + Jump / Move Loop Forward %1 Beats Скочи / макни понављ. напред за %1 откуцај/а - + Jump / Move Loop Backward %1 Beats Скочи / макни понављ. назад за %1 откуцај/а - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats Скочи унапред %1 откуцај/а, или у случају понављања, помакни унапред %1 откуцај/а - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats Скочи уназад %1 откуцај/а, или у случају понављања, помакни уназад %1 откуцај/а - + Beat Jump / Loop Move Forward Selected Beats Прескочи откуцаје / помакни понављање одабиром - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats Прескочи број откуцаја у одабиру, или у случају понављања, помакни унапред исти број откуцаја - + Beat Jump / Loop Move Backward Selected Beats Врати уназад / помакни понављање по одабиру - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats Скочи на откуцај, или у случају понављања, помакни уназад, по дужини одабира - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up Нагоре - + Equivalent to pressing the UP key on the keyboard Исто што и тастер стрелице на горе - + Move down Надоле - + Equivalent to pressing the DOWN key on the keyboard Исто што и тастер стрелице на доле - + Move up/down Горе/доле - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys Вертикално померање потенциометра, као са тастерима стрелица - + Scroll Up Претходна страна - + Equivalent to pressing the PAGE UP key on the keyboard Исто што и тастер PAGE UP - + Scroll Down Следећа страна - + Equivalent to pressing the PAGE DOWN key on the keyboard Исто што и тастер PAGE DOWN - + Scroll up/down Навигација по странама - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys Груба навигација горе/доле употребом пот-а, исто се постиже тастерима PG UP/PG DN - + Move left Налево - + Equivalent to pressing the LEFT key on the keyboard Исто што и тастер стрелице на лево - + Move right Надесно - + Equivalent to pressing the RIGHT key on the keyboard Исто што и тастер стрелице на десно - + Move left/right Лево/десно - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys Померање лево/десно помоћу пот-а, исто се постиже тастерима стрелица лево/десно - + Move focus to right pane Пребаци се на десни сегмент - + Equivalent to pressing the TAB key on the keyboard Исто што и тастер TAB - + Move focus to left pane Пребаци се на леви сегмент - + Equivalent to pressing the SHIFT+TAB key on the keyboard Исто што и комбинација Shift+TAB - + Move focus to right/left pane Навигација кроз сегменте - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys Померање лево/десно кроз сегменте прозора помоћу пот-а, исто се постиже тастерима ТАВ/Shift+TAB - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item Скочи на одабрану ставку - + Choose the currently selected item and advance forward one pane if appropriate Маркирај одабрану ставку и пређи на одговарајући сегмент - + Load Track and Play - + Add to Auto DJ Queue (replace) Додај на Ауто-Диџеј листу (рокада) - + Replace Auto DJ Queue with selected tracks Нова Ауто-Диџеј листа од одабраних нумера - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing Укључи/искључи обраду сигнала - + Super Knob (control effects' Meta Knobs) Главни пот (контролише подесиве пот-е ефеката) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset Сл. меморисани ланац - + Previous Chain Претходни ланац - + Previous chain preset Претходни меморисани ланац - + Next/Previous Chain Сл./претх. меморисани ланац - + Next or previous chain preset Следећи или претходни меморисани ланац процесора - - + + Show Effect Parameters Приказ параметара ефекта - + Effect Unit Assignment - + Meta Knob Подесиви пот. - + Effect Meta Knob (control linked effect parameters) Подесиви пот. ефекта (за везивање параметара више ефеката) - + Meta Knob Mode Режим подесивог пот-а - + Set how linked effect parameters change when turning the Meta Knob. Подешавање реакције везаних пот-а - + Meta Knob Mode Invert Обрни ефекат подесивог пот-а - + Invert how linked effect parameters change when turning the Meta Knob. Наопако реаговање везаних пот-а - - + + Button Parameter Value - + Microphone / Auxiliary Микрофон / Екстерно - + Microphone On/Off Укљ/искљ микрофон - + Microphone on/off Микрофон укљ./искљ. - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Одабир режима компресије микрофона (искљ., аутоматски, ручно) - + Auxiliary On/Off Укљ. искљ. екстерно - + Auxiliary on/off Активација екстерног сигнала - + Auto DJ Самостални Диџеј - + Auto DJ Shuffle Ауто-Диџеј "шафл" - + Auto DJ Skip Next Ауто-Диџеј - прескочи следеће - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Ауто-Диџеј - постепено пређи на сл. - + Trigger the transition to the next track Окините прелаз на следећу нумеру - + User Interface Корисничко сучеље - + Samplers Show/Hide Приказ семплера - + Show/hide the sampler section Прикажи/сакриј одељак узорчника - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Приказ аналогне контроле - + Show/hide the vinyl control section Прикажи/сакриј одељак управљања плочом - + Preview Deck Show/Hide Приказ припремног дека - + Show/hide the preview deck Прикажи/сакриј дек прегледа - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Приказ индикатора аналогне контроле - + Show/hide spinning vinyl widget Прикажи/сакриј елемент окретања плоче - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Ширина осцилоскопа - + Waveform Zoom Ширина приказа звука - + Zoom waveform in Сузи осцилоскоп - + Waveform Zoom In Фокусирај осцилоскоп на мањи сегмент - + Zoom waveform out Фокусирај осцилоскоп на шири сегмент - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3626,33 +3675,33 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Покушајте да средите проблем ресетовањем контролера - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. Изворни код садржи грешке. @@ -3696,13 +3745,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Уклони - + Create New Crate Нова гајбица @@ -3712,132 +3761,132 @@ trace - Above + Profiling messages Преименуј - - + + Lock Закључај - + Export Crate as Playlist - + Export Track Files Направи фајл - + Duplicate Дуплирај - + Analyze entire Crate Анализирај целу гајбицу - + Auto DJ Track Source Селекција за Ауто-Диџеј-а - + Enter new name for crate: Унесите назив нове гајбице: - - + + Crates Гајбице - - + + Import Crate Увези гајбицу - + Export Crate Извези гајбицу - + Unlock Откључај - + An unknown error occurred while creating crate: Дошло је до непознате грешке приликом стварања гајбице: - + Rename Crate Преименуј гајбицу - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Нисам успео да преименујем гајбицу - + Crate Creation Failed Креирање гајбице неуспешно - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) М3У списак нумера (*.m3u);;М3У8 списак нумера (*.m3u8);;ПЛС списак нумера (*.pls);;Текстуални ЦСВ (*.csv);;Читљив текст (*.txt) - + M3U Playlist (*.m3u) М3У листа (*.м3у) - + Crates are a great way to help organize the music you want to DJ with. Гајбице су одличан начин за испомоћ приликом организовања музике са којом желите да радите у диџеју. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Гајбице вам омогућавају да организујете вашу музику онако како ви то хоћете! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Назив гајбице не може бити празан. - + A crate by that name already exists. Већ постоји гајбица са овим називом. @@ -3932,12 +3981,12 @@ trace - Above + Profiling messages Претходни доприносиоци - + Official Website - + Donate @@ -4059,72 +4108,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Секунде - + Auto DJ Fade Modes Full Intro + Outro: @@ -4155,82 +4204,82 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. Декови који се не користе за Ауто-Диџеј морају бити заустављени да би се омогућио рад Ауто-Диџеј-а. - + Repeat Понови - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. Један од декова мора бити заустављен да би се омогућио рад Ауто-Диџеј-а - + Enable - + Disable - + Displays the duration and number of selected tracks. Приказује укупну дужину и количину одабраних нумера. - - - + + + Auto DJ Самостални Диџеј - + Shuffle Измешај - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. Додаје произвољну нумеру из @@ -4485,40 +4534,40 @@ Often results in higher quality beatgrids, but will not do well on tracks that h детекцију дугметом "Покушај опет" - + Didn't get any midi messages. Please try again. Нема порука на видику. Покушајте опет. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Не могу да препознам поруку - покушајте опет. Да ли можда дирате више контрола одједном? - + Successfully mapped control: Успешно научена контрола: - + <i>Ready to learn %1</i> <i>Позорност за %1</i> - + Learning: %1. Now move a control on your controller. Учим: %1. Сада померите елемент на хардверу. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4559,17 +4608,17 @@ You tried to learn: %1,%2 Избаци у цсв - + Log Записник - + Search Нађи - + Stats Статистика @@ -5243,115 +5292,115 @@ associated with each key. DlgPrefController - + Apply device settings? Да применим подешавања уређаја? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Ваша подешавања морају бити примењена пре него што покренете чаробњака учења. Да применим подешавања и да наставим? - + None Ништа - + %1 by %2 %1 од %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Решавање проблема - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Уклони мапиране контроле - + Are you sure you want to clear all input mappings? Да ли заиста желите да уклоните све мапиране контроле? - + Clear Output Mappings Обриши мапиране контроле - + Are you sure you want to clear all output mappings? Да ли заисте желите да обришете све мапиране контроле? @@ -5365,105 +5414,105 @@ Apply settings and continue? Назив управљача - + Enabled Укључен - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Опис: - + Support: Подршка: - + Screens preview - + Input Mappings Мапирање улаза - - + + Search Нађи - - + + Add Додај - - + + Remove Уклони @@ -5478,22 +5527,22 @@ Apply settings and continue? Избори за контролере - + Load Mapping: - + Mapping Info - + Author: Аутор: - + Name: Назив: @@ -5503,28 +5552,28 @@ Apply settings and continue? Чаробњак учења (само МИДИ) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Очисти све - + Output Mappings Мапирање излаза @@ -5700,6 +5749,16 @@ MIDI учење, за одабрани контролер. Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6314,64 +6373,64 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Овај дизајн захтева резолуцију екрана која је већа од тренутне. - + Allow screensaver to run Дозволи штедњу екрана при раду - + Prevent screensaver from running Спречи штедњу екрана - + Prevent screensaver while playing Спречи гашење екрана при репродукцији - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Овај дизајн не подржава промену палете боја - + Information Обавештење - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7588,155 +7647,154 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Основно (дуги ехо) - + Experimental (no delay) Експериментално (без еха) - + Disabled (short delay) Угашено (кратак ехо) - + Soundcard Clock Клок звучног адаптера - + Network Clock Мрежни клок - + Direct monitor (recording and broadcasting only) Директни мониторинг (за снимање и емитовање) - + Disabled Неактивно - + Enabled Укључен - + Stereo Стерео - + Mono Моно - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Микрофонски сигнал у емисији и снимку није усаглашен са оним што чујете. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Измери мрежно кашњење и унеси га заједно са Микрофонском компензацијом да би усагласили микрофон. - - + Refer to the Mixxx User Manual for details. Консултујте Миксиксикс приручник за више информација. - + Configured latency has changed. Поставка компензације кашњења захтева корекцију. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Поново измери мрежно кашњење и унеси га заједно са Микрофонском @@ -7744,27 +7802,27 @@ The loudness target is approximate and assumes track pregain and main output lev микрофонски сигнал. - + Realtime scheduling is enabled. Активно је мерење у реалном времену. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Грешка подешавања @@ -7782,135 +7840,135 @@ The loudness target is approximate and assumes track pregain and main output lev АПИ звука - + Sample Rate Фрекв. узорковања - + Audio Buffer Звучна међу-меморија - + Engine Clock Референтни клок - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. Користите клок звучног адаптера за живе ситуације и смањено кашњење.<br>Користите мрежни клок за емитовање без активне публике. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode Мониторинг микрофона - + Microphone Latency Compensation Микрофонска компензација - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Број пражњења међу-меморије - + 0 0 - + Keylock/Pitch-Bending Engine Систем променљиве фреквенције - + Multi-Soundcard Synchronization Мулти-адаптерска синхронизација - + Output Излаз - + Input Улаз - + System Reported Latency Системско кашњење - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Увећајте звучну међу-меморију ако се бројач пражњења стално увећава, или чујете "пуцкетање" у репродукцији. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Савети и дијагностика - + Downsize your audio buffer to improve Mixxx's responsiveness. Смањите звучну међу-меморију за бржи одзив Микс-ове апаратуре. - + Query Devices Пропитај уређаје @@ -8065,27 +8123,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available ОпенГЛ није доступан - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -8098,250 +8157,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate Проток кадрова - - Displays which OpenGL version is supported by the current platform. - Прикажите које издање ОпенГЛ-а је подржано текућом платформом. + + OpenGL Status + - - Waveform - + + Displays which OpenGL version is supported by the current platform. + Прикажите које издање ОпенГЛ-а је подржано текућом платформом. - + Normalize waveform overview - + Average frame rate - + Visual gain Видно појачање - + Default zoom level Waveform zoom - + Displays the actual frame rate. Прикажите садашњи проток кадрова. - + Visual gain of the middle frequencies Видљиво појачање средњих учесталости - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds сек. - + Low Низак - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies Видљиво појачање високих учесталости - + Visual gain of the low frequencies Видљиво појачање ниских учесталости - + High Висок - + Global visual gain Опште видно појачање - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. Ускладите ниво увећавања преко свих приказа таласних облика. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8349,47 +8414,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Звучне компоненте - + Controllers Управљачи - + Library Библиотека - + Interface Сучеље - + Waveforms - + Mixer Мешач - + Auto DJ Самостални Диџеј - + Decks - + Colors @@ -8424,47 +8489,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Дејства - + Recording Снимање - + Beat Detection Откривање такта - + Key Detection - + Normalization Нормализација - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Управљање плочом - + Live Broadcasting Емитовање уживо - + Modplug Decoder @@ -8497,22 +8562,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Започни снимање - + Recording to file: - + Stop Recording Заустави снимање - + %1 MiB written in %2 @@ -8820,284 +8885,284 @@ This can not be undone! Сажетак - + Filetype: Врста датотеке: - + BPM: ТУМ: - + Location: Место: - + Bitrate: Проток бита: - + Comments - + BPM ТУМ - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Нумера бр. - + Album Artist Извођач - + Composer Састављач - + Title Наслов - + Grouping Груписање - + Key Кључ - + Year Година - + Artist Извођач - + Album Албум - + Genre Жанр - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM Удвостручи ТУМ - + Halve BPM Преполови ТУМ - + Clear BPM and Beatgrid Очисти ТУМ и тактну мрежу - + Move to the previous item. "Previous" button - + &Previous &Претходна - + Move to the next item. "Next" button - + &Next &Следећа - + Duration: Трајање: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Отвори у прегледнику датотека - + Samplerate: - + Track BPM: Прати ТУМ: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Лупни такт - + Hint: Use the Library Analyze view to run BPM detection. Савет: Користите преглед анализирања библиотеке да покренете откривање ТУМ-а. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Примени - + &Cancel &Откажи - + (no color) @@ -9254,7 +9319,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9456,27 +9521,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9620,38 +9685,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes ајТјунс - + Select your iTunes library Изаберите вашу ајТјунс библиотеку - + (loading) iTunes (учитавам) ајТјунс - + Use Default Library Користи основну библиотеку - + Choose Library... Изабери библиотеку... - + Error Loading iTunes Library Грешка учитавања ајТјунс библиотеке - + There was an error loading your iTunes library. Check the logs for details. @@ -9659,12 +9724,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9672,18 +9737,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9691,15 +9756,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9710,57 +9775,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate покрени - + toggle окини - + right десно - + left лево - + right small мали десни - + left small мали леви - + up горе - + down доле - + up small мало горе - + down small мало доле - + Shortcut Пречица @@ -9768,62 +9833,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9833,22 +9898,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Увезите списак нумера - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Спискови нумера (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9895,27 +9960,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9975,18 +10040,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Недостајуће нумере - + Hidden Tracks Скривене нумере - Export to Engine Prime + Export to Engine DJ @@ -9998,208 +10063,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Звучни уређај је заузет - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Покушајте поново</b> након што затворите други прог или поново прикључите звучни уређај - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Поново подесите</b> подешавања звучног уређаја Миксикса. - - + + Get <b>Help</b> from the Mixxx Wiki. Нађите <b>Помоћ</b> на Викију Миксикса. - - - + + + <b>Exit</b> Mixxx. <b>Изађите</b> из Миксикса. - + Retry Покушај поново - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Поново подеси - + Help Помоћ - - + + Exit Изађи - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices Нема излазних уређаја - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Миксикс је подешен без иједног излазног звучног уређаја. Обрада звука ће бити онемогућена без подешеног излазног уређаја. - + <b>Continue</b> without any outputs. <b>Наствите</b> без икаквих излаза. - + Continue Настави - + Load track to Deck %1 Учитај нумеру на носач %1 - + Deck %1 is currently playing a track. Носач %1 тренутно пушта нумеру. - + Are you sure you want to load a new track? Да ли сигурно желите да учитате нову нумеру? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Грешка у датотеци маске - + The selected skin cannot be loaded. Изабрана маска не може бити учитана. - + OpenGL Direct Rendering Посредно исцртавање ОпенГЛ-а - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Потврди излаз - + A deck is currently playing. Exit Mixxx? Носач тренутно пушта. Да изађем из Миксикса? - + A sampler is currently playing. Exit Mixxx? Узорчник тренутно пушта. Да изађем из Миксикса? - + The preferences window is still open. Прозор поставки је још увек отворен. - + Discard any changes and exit Mixxx? Да одбацим могуће измене и да напустим Миксикс? @@ -10215,13 +10321,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Закључај - - + + Playlists Списак нумера @@ -10231,32 +10337,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Откључај - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Неки диџеји изграде спискове нумера пре него ли обаве изведбу, а неки то раде у току саме представе. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Када користите списак нумера током живог ДиЏеј скупа, сетите се да увек обратите пажњу на то како ваша публика реагује на музику коју сте изабрали за пуштање. - + Create New Playlist Састави листу песама @@ -11747,7 +11879,7 @@ Fully right: end of the effect period - + Deck %1 Палуба %1 @@ -11880,7 +12012,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Пропуштање @@ -11911,7 +12043,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -12044,12 +12176,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -12084,42 +12216,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12177,54 +12309,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Списак нумера - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12359,19 +12491,19 @@ may introduce a 'pumping' effect and/or distortion. Закључај - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12783,7 +12915,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Вртење плоче @@ -12965,7 +13097,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Омот @@ -13201,197 +13333,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap Темпо и лупкање ТУМ-а - + Show/hide the spinning vinyl section. Прикажите/сакријте одељак окретања плоче. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Пусти - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13629,924 +13761,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Сачувај групу узорака - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Учитај групу узорака - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters Приказ параметара ефекта - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Гл. потенциометар - + Next Chain Сл. ланац - + Previous Chain Претходни ланац - + Next/Previous Chain Сл./претх. меморисани ланац - + Clear Уклони - + Clear the current effect. - + Toggle Активација - + Toggle the current effect. - + Next Даље - + Clear Unit Уклони процесор - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit Процесор активан - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Претходно - + Switch to the previous effect. - + Next or Previous Следећи/претходни - + Switch to either the next or previous effect. - + Meta Knob Подесиви пот. - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Дотерај тактну мрежу - + Adjust beatgrid so the closest beat is aligned with the current play position. Дотерајте тактну мрежу тако да је најближи такт поравнат са тренутним положајем пуштања. - - + + Adjust beatgrid to match another playing deck. Намести Битгрид да прати други дек - + If quantize is enabled, snaps to the nearest beat. Ако је омогућено куантизовање, пријања се на најближи такт. - + Quantize Квантизуј - + Toggles quantization. Окините квантизацију. - + Loops and cues snap to the nearest beat when quantization is enabled. Петље и наговештаји пријањају на најближи такт када је укључена квантизација. - + Reverse Уназад - + Reverses track playback during regular playback. Пустите траку уназад за време редовног пуштања. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Пусти/паузирај - + Jumps to the beginning of the track. Скочите на почетак нумере. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14681,33 +14821,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. Пустите или паузирајте нумеру. - + (while playing) (за време пуштања) @@ -14727,205 +14867,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (док је заустављена) - + Cue Наговештај - + Headphone Слушалице - + Mute Пригуши - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Ускладите са првим носачем (према бројевима) који пушта нумеру и има ТПМ. - + If no deck is playing, syncs to the first deck that has a BPM. Ако ниједан носач не пушта, ускладите са првим носачем који има ТПМ. - + Decks can't sync to samplers and samplers can only sync to decks. Носачи могу да се усклађују са узорчницима а узорчници могу само да се усклађују са носачима. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust Подеси фреквенцију - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix Снимај микс - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. Пуштање ће се наставити са места на коме би нумера била да није ушла у петљу. - + Loop Exit Напусти петљу - + Turns the current loop off. Искључите тренутну петљу. - + Slip Mode Режим мировања - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Када је радан, пуштање се наставља пригушено у позадини током петље, уназад, гребања итд. - + Once disabled, the audible playback will resume where the track would have been. Када га искључите, чујно пуштање ће се наставити са места на коме била нумера. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock Сат - + Displays the current time. Прикажите тренутно време. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14970,254 +15120,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Брзо премотај уназад - + Fast rewind through the track. Брзо премотавајте уназад по нумери. - + Fast Forward Брзо премотај унапред - + Fast forward through the track. Брзо премотавајте унапред по нумери. - + Jumps to the end of the track. Скочите на крај нумере. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Управљање тоном - + Pitch Rate Проток тона - + Displays the current playback rate of the track. Прикажите текући проток пуштања нумере. - + Repeat Понови - + When active the track will repeat if you go past the end or reverse before the start. Када ће активна нумера бити поновљена ако прођете крај или вратите уназад пре почетка. - + Eject Избаци - + Ejects track from the player. Избаците нумеру из програма. - + Hotcue Битан наговештај - + If hotcue is set, jumps to the hotcue. Ако је постављен битан наговештај, скочите на битни наговештај. - + If hotcue is not set, sets the hotcue to the current play position. Ако битан наговештај није подешен, поставите битан наговештај на тренутни положај пуштања. - + Vinyl Control Mode Режим управљања плочом - + Absolute mode - track position equals needle position and speed. Режим апсолутности — положај нумере изједначава положај и брзину игле. - + Relative mode - track speed equals needle speed regardless of needle position. Режим релативности — брзина нумере изједначава брзину игле без обзира на њен положај. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Режим сталности — брзина нумере изједначава последњу знану стабилну брзину без обзира на улаз игле. - + Vinyl Status Стање плоче - + Provides visual feedback for vinyl control status: Обезбедите видљиве повратне податке за стање управљања плочом: - + Green for control enabled. Зелено за укључено управљање. - + Blinking yellow for when the needle reaches the end of the record. Жуто трепћуће када игла стигне на крај снимка. - + Loop-In Marker Означавач упетљавања - + Loop-Out Marker Означавач отпетљавања - + Loop Halve Преполовљавање петље - + Halves the current loop's length by moving the end marker. Преполовите трајање тренутне петље померањем крајњег означавача. - + Deck immediately loops if past the new endpoint. Носач одмах прави петљу ако је прошао нову крајњу тачку. - + Loop Double Удвостручавање петље - + Doubles the current loop's length by moving the end marker. Удвостручите трајање тренутне петље померањем крајњег означавача. - + Beatloop Тактна петља - + Toggles the current loop on or off. Укључите или искључите тренутну петљу. - + Works only if Loop-In and Loop-Out marker are set. Ради само ако су постављени означавачи за упетљавање и отпетљавање. - + Vinyl Cueing Mode Режим наговештаја плоче - + Determines how cue points are treated in vinyl control Relative mode: Одредите како се поступа са тачкама наговештаја у релативном режиму управљања плочом: - + Off - Cue points ignored. Искљ. — Тачке наговештаја су занемарене. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Један наговештај — Ако отпустите иглу након тачке наговештаја, нумера ће се премотати до тачке наговештаја. - + Track Time Време нумере - + Track Duration Трајање нумере - + Displays the duration of the loaded track. Прикажите трајање учитане нумере. - + Information is loaded from the track's metadata tags. Податак се учитава из ознака метаподатака нумере. - + Track Artist Извођач нумере - + Displays the artist of the loaded track. Прикажите извођача учитане нумере. - + Track Title Наслов нумере - + Displays the title of the loaded track. Прикажите наслов учитане нумере. - + Track Album Албум нумере - + Displays the album name of the loaded track. Прикажите назив албума учитане нумере. - + Track Artist/Title Извођач/Наслов нумере - + Displays the artist and title of the loaded track. Прикажите извођача и наслов учитане нумере. @@ -15225,12 +15375,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15238,47 +15388,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15450,47 +15595,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15614,407 +15759,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... - - Export the library to the Engine Prime format + + Search for tracks in the current library view + + + + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist Направите нови списак нумера - + Ctrl+n - + Create New &Crate - + Create a new crate Направите нову гајбицу - + Ctrl+Shift+N Ктрл-Помак+Н - - + + &View Пре&глед - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Не може бити подржано на свим маскама. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ктрл+1 - + Show Microphone Section Прикажи одељак микрофона - + Show the microphone section of the Mixxx interface. Прикажите одељак микрофона у сучељу Миксикса. - + Ctrl+2 Menubar|View|Show Microphone Section Ктрл+2 - + Show Vinyl Control Section Прикажи одељак управљања плочом - + Show the vinyl control section of the Mixxx interface. Прикажите одељак управљања плочом у сучељу Миксикса. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ктрл+3 - + Show Preview Deck Прикажи носач прегледа - + Show the preview deck in the Mixxx interface. Прикажите носач прегледа у сучељу Миксикса. - + Ctrl+4 Menubar|View|Show Preview Deck Ктрл+4 - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. Користи цео екран за одабир нумера - + Space Menubar|View|Maximize Library - + &Full Screen &Цео екран - + Display Mixxx using the full screen Прикажите Миксикс користећи цео екран - + &Options &Опције - + &Vinyl Control &Управљање плочом - + Use timecoded vinyls on external turntables to control Mixxx Користите плоче са временским кодирањем на спољним грамофонима да управљате Миксиксом - + Enable Vinyl Control &%1 - + &Record Mix &Сними микс - + Record your mix to a file Снимите ваш микс у датотеку - + Ctrl+R Ктрл+Р - + Enable Live &Broadcasting Укључи емитовање &уживо - + Stream your mixes to a shoutcast or icecast server Пошаљите ток ваших радова на сервер шоуткаста или ајскаста - + Ctrl+L Ктрл+Л - + Enable &Keyboard Shortcuts Укључи пречице на &тастатури - + Toggles keyboard shortcuts on or off Укључите или искључите пречице тастатуре - + Ctrl+` Ктрл+` - + &Preferences &Поставке - + Change Mixxx settings (e.g. playback, MIDI, controls) Измените подешавања Миксикса (нпр. пуштање, МИДИ, управљања) - + &Developer - + &Reload Skin &Поново учитај маску - + Reload the skin Поново учитајте маску - + Ctrl+Shift+R Ктрл+Помак+Р - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help По&моћ - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Подршка заједнице - + Get help with Mixxx Потражите помоћ за Миксикс - + &User Manual &Корисничко упутство - + Read the Mixxx user manual. Прочитајте корисничко упутство Миксикса. - + &Keyboard Shortcuts - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Преведи овај програм - + Help translate this application into your language. Помозите у превођењу овог програма на наш језик насушни. - + &About &О програму - + About the application О самом програму @@ -16022,25 +16198,25 @@ This can not be undone! WOverview - + Passthrough Пропуштање - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -16049,25 +16225,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ктрл+Ф - - - + Search noun Нађи - + Clear input @@ -16078,169 +16242,163 @@ This can not be undone! Потражи... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Пречица + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ктрл+Ф + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Изађи - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Кључ - + harmonic with %1 - + BPM ТУМ - + between %1 and %2 - + Artist Извођач - + Album Artist Извођач - + Composer Састављач - + Title Наслов - + Album Албум - + Grouping Груписање - + Year Година - + Genre Жанр - + Directory - + &Search selected @@ -16248,599 +16406,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Носач - + Sampler Узорчник - + Add to Playlist Додај на списак нумера - + Crates Гајбице - + Metadata Мета-подаци - + Update external collections - + Cover Art Омот - + Adjust BPM - + Select Color - - + + Analyze Анализирај - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Додајте у ред самосталног диџеја (доле) - + Add to Auto DJ Queue (top) Додајте у ред самосталног диџеја (горе) - + Add to Auto DJ Queue (replace) Додај на Ауто-Диџеј листу (рокада) - + Preview Deck Носач прегледа - + Remove Уклони - + Remove from Playlist - + Remove from Crate - + Hide from Library Сакриј у библиотеци - + Unhide from Library Прикажи у библиотеци - + Purge from Library Избаци из библиотеке - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Својства - + Open in File Browser Отвори у прегледнику датотека - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Оцена - + Cue Point - + + Hotcues Битни наговештаји - + Intro - + Outro - + Key Кључ - + ReplayGain Ауто-ниво - + Waveform - + Comment Примедба - + All Све - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Закључај ТУМ - + Unlock BPM Откључај ТУМ - + Double BPM Удвостручи ТУМ - + Halve BPM Преполови ТУМ - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Палуба %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Састави листу песама - + Enter name for new playlist: Ново име за листу песама: - + New Playlist Нови списак нумера - - - + + + Playlist Creation Failed Стварање списка нумера није успело - + A playlist by that name already exists. Већ постоји списак нумера са овим називом. - + A playlist cannot have a blank name. Назив списка нумера не може бити празан. - + An unknown error occurred while creating playlist: Дошло је до непознате грешке приликом стварања списка нумера: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Откажи - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Затвори - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16856,37 +17040,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16894,37 +17078,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16932,60 +17116,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Прикажите или сакријте колоне. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Изаберите директоријум музичке библиотеке - + controllers - + Cannot open database Не могу да отворим базу података - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16999,67 +17188,78 @@ Click OK to exit. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Разгледај - + Export directory - + Database version - + Export - + Cancel Откажи - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -17080,7 +17280,7 @@ Click OK to exit. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17090,23 +17290,23 @@ Click OK to exit. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_sv.qm b/res/translations/mixxx_sv.qm index 77e7ddb9fd1f94703c4152cec0ef1cd0674dbdda..cd3b0cdd4d8ee800b355a6d6a78bfffea2501aa9 100644 GIT binary patch delta 8359 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 IQGnI|0WbjD3IG5A diff --git a/res/translations/mixxx_sv.ts b/res/translations/mixxx_sv.ts index 1d3e98d4d436..69b15a4b1bb4 100644 --- a/res/translations/mixxx_sv.ts +++ b/res/translations/mixxx_sv.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source Avlägsna back som låtkälla - + Auto DJ Auto DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source Lägg till back som låtkälla @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist Ny spellista @@ -160,7 +160,7 @@ - + Create New Playlist Skapa ny spellista @@ -190,113 +190,120 @@ Duplicera - - + + Import Playlist Importera spellista - + Export Track Files Exportera spår-filer - + Analyze entire Playlist Analysera hela spellistan - + Enter new name for playlist: Mata in ett nytt namn för spellistan: - + Duplicate Playlist Duplicera spellista - - + + Enter name for new playlist: Mata in ett namn för ny spellista: - - + + Export Playlist Exportera spellista - + Add to Auto DJ Queue (replace) Lägg till i Auto-DJ-kön (ersätt) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Byt namn på spellista - - + + Renaming Playlist Failed Namnbyte misslyckades - - - + + + A playlist by that name already exists. En spellista med det namnet finns redan. - - - + + + A playlist cannot have a blank name. En spellista kan inte vara utan namn. - + _copy //: Appendix to default name when duplicating a playlist _kopiera - - - - - - + + + + + + Playlist Creation Failed Spellistan gick inte att skapa - - + + An unknown error occurred while creating playlist: Ett okänt fel uppstod när spellistan skapades: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U-spellista (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U spellista (*.m3u);;M3U8 spellista (*.m3u8);;PLS spellista (*.pls);;Text CSV (*.csv);;Läsbar text (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Tidsstämpel @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kunde inte ladda in låt. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Album - + Album Artist Album-artist - + Artist Artist - + Bitrate Bithastighet - + BPM BPM - + Channels Kanaler - + Color Färg - + Comment Kommentar - + Composer Kompositör - + Cover Art Album-konst - + Date Added Datum tillagd - + Last Played Senast spelad - + Duration Varaktighet - + Type Typ - + Genre Genre - + Grouping Gruppindelning - + Key Tonart - + Location Plats - + + Overview + + + + Preview Förhandsgranska - + Rating Betyg - + ReplayGain Förstärkning av uppspelning - + Samplerate - + Played Spelad - + Title Titel - + Track # Låt # - + Year År - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Spara till Snabblänkar - + Remove from Quick Links Ta bort från Snabblänkar - + Add to Library Spara till bibliotek - + Refresh directory tree - + Quick Links Snabblänkar - - + + Devices Enheter - + Removable Devices Flyttbara enheter - - + + Computer Dator - + Music Directory Added Musik-mapp tillagd - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan Skanna - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -1046,13 +1068,13 @@ trace - Above + Profiling messages - + Set to full volume Ställ in full ljudstyrka - + Set to zero volume Ställ ljudstyrkan till noll @@ -1077,13 +1099,13 @@ trace - Above + Profiling messages Knapp baklänges-slinga (förhandslyssning) - + Headphone listen button Lyssna-knapp hörlur - + Mute button Tysta-knapp @@ -1094,25 +1116,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Mix-balans (t.ex. vänster, höger, i mitten) - + Set mix orientation to left Sätter mix-balansen åt vänster - + Set mix orientation to center Sätter mix-balansen i mitten - + Set mix orientation to right Sätter mix-balansen åt höger @@ -1153,22 +1175,22 @@ trace - Above + Profiling messages Knapp för att trumma BPM - + Toggle quantize mode Växla kvantiseringssätt - + One-time beat sync (tempo only) Engångs takt-sync (endast tempo) - + One-time beat sync (phase only) Engångs takt-sync (endast fas) - + Toggle keylock mode Växla sätt för tonhöjdslås @@ -1178,193 +1200,193 @@ trace - Above + Profiling messages Equalizers - + Vinyl Control Vinylstyrning - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Växla markeringssätt för vinylstyrning (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) Växla vinylstyrningssätt (ABS/REL/CONST) - + Pass through external audio into the internal mixer Passera genom externt ljud till den interna mixern - + Cues Markeringar - + Cue button Markeringsknapp - + Set cue point Ange markeringspunkt - + Go to cue point Hoppa till markeringspunkt - + Go to cue point and play Hoppa till markeringspunkt och spela - + Go to cue point and stop Hoppa till markeringspunkt och stoppa - + Preview from cue point Förhandslyssna från markeringspunkt - + Cue button (CDJ mode) Markeringsknapp (CDJ-metod) - + Stutter cue Ryckvis markering - + Hotcues Snabbmarkeringar - + Set, preview from or jump to hotcue %1 Sätt, förhandslyssna från eller hoppa till snabbmarkering %1 - + Clear hotcue %1 Ta bort snabbmarkering %1 - + Set hotcue %1 Sätt snabbmarkering %1 - + Jump to hotcue %1 Hoppa till snabbmarkering %1 - + Jump to hotcue %1 and stop Hoppa till snabbmarkering %1 och stoppa - + Jump to hotcue %1 and play Hoppa till snabbmarkering %1 och spela - + Preview from hotcue %1 Förhandslyssna från snabbmarkering %1 - - + + Hotcue %1 Snabbmarkering %1 - + Looping Slinga - + Loop In button Slinga in-knapp - + Loop Out button Slinga ut-knapp - + Loop Exit button Upprepa Avsluta-knappen - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Flytta slinga framåt med %1 taktslag - + Move loop backward by %1 beats Flytta slinga bakåt med %1 taktslag - + Create %1-beat loop Skapa en %1-taktslags-slinga - + Create temporary %1-beat loop roll Skapa en temporär %1-takts rullande slinga @@ -1480,20 +1502,20 @@ trace - Above + Profiling messages - - + + Volume Fader Volymfader - + Full Volume Full volym - + Zero Volume Noll volym @@ -1509,7 +1531,7 @@ trace - Above + Profiling messages - + Mute Tysta @@ -1520,7 +1542,7 @@ trace - Above + Profiling messages - + Headphone Listen Hörlurslyssning @@ -1541,25 +1563,25 @@ trace - Above + Profiling messages - + Orientation Balans - + Orient Left Balans till vänster - + Orient Center Balans i mitten - + Orient Right Balans till höger @@ -1629,82 +1651,82 @@ trace - Above + Profiling messages Justera taktmönstret åt höger - + Adjust Beatgrid Justera taktmönster - + Align beatgrid to current position Rikta in taktmönstret mot aktuell position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode Kvantiseringssätt - + Sync Sync - + Beat Sync One-Shot One-Shot takt-synkning - + Sync Tempo One-Shot One-Shot hastighets-synkning - + Sync Phase One-Shot One-Shot fas-synkning - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust Justera hastighet - + Adjust pitch from speed slider pitch - + Match musical key Matcha tonhöjden - + Match Key Matcha tonart - + Reset Key Återställ tonart - + Resets key to original Återställ tonart till original @@ -1745,451 +1767,451 @@ trace - Above + Profiling messages Bas-EQ - + Toggle Vinyl Control Växla vinylstyrning - + Toggle Vinyl Control (ON/OFF) Växla vinylstyrning (PÅ/AV) - + Vinyl Control Mode Vinylstyrningssätt - + Vinyl Control Cueing Mode Markeringssätt för vinylstyrning - + Vinyl Control Passthrough Vinylstyrning "släpp igenom" - + Vinyl Control Next Deck Vinylstyrning "nästa tallrik" - + Single deck mode - Switch vinyl control to next deck Entallriksmodus - växla vinylstyrning till nästa tallrik - + Cue Markering - + Set Cue Sätt markering - + Go-To Cue Gå till markering - + Go-To Cue And Play Gå till markering och spela - + Go-To Cue And Stop Gå till markering och stoppa - + Preview Cue Förhandslyssna markering - + Cue (CDJ Mode) Markering (CDJ-metod) - + Stutter Cue Ryckvis markering - + Go to cue point and play after release - + Clear Hotcue %1 Ta bort snabbmarkering %1 - + Set Hotcue %1 Sätt snabbmarkering %1 - + Jump To Hotcue %1 Hoppa till snabbmarkering %1 - + Jump To Hotcue %1 And Stop Hoppa till snabbmarkering %1 och stoppa - + Jump To Hotcue %1 And Play Hoppa till snabbmarkering %1 och spela - + Preview Hotcue %1 Förhandslyssna snabbmarkering %1 - + Loop In Slinga in - + Loop Out Slinga ut - + Loop Exit Avsluta slinga - + Reloop/Exit Loop Repetera/avsluta slinga - + Loop Halve Halv slinga - + Loop Double Dubbel slinga - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Förskjut slinga +%1 taktslag - + Move Loop -%1 Beats Förskjut slinga -%1 taktslag - + Loop %1 Beats Kretsa runt %1 taktslag - + Loop Roll %1 Beats Rullande slinga %1 taktslag - + Add to Auto DJ Queue (bottom) Spara till Auto DJ kö (sist) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Spara till Auto DJ kö (först) - + Prepend selected track to the Auto DJ Queue - + Load Track Ladda låt - + Load selected track Ladda valda låtar - + Load selected track and play Ladda utvald låt och spela - - + + Record Mix Spela in mix - + Toggle mix recording Mix-inspelning på/av - + Effects Effekter - + Quick Effects Snabbeffekter - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect Snabbeffekt - + Clear Unit Rensa enhet - + Clear effect unit Nollställ effektenheten - + Toggle Unit Växla enhet - + Dry/Wet Torrt/vått - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob Superknapp - + Next Chain Nästa kedja - + Assign Tilldela - + Clear Rensa - + Clear the current effect Nollställ aktuell effekt - + Toggle Växla - + Toggle the current effect Slå på/av aktuell effekt - + Next Nästa - + Switch to next effect Växla till nästa effekt - + Previous Bakåt - + Switch to the previous effect Växla till föregående effekt - + Next or Previous Nästa eller föregående - + Switch to either next or previous effect Växla till nästa eller föregående effekt - - + + Parameter Value Parameter-värde - - + + Microphone Ducking Strength Styrka mikrofonduckning - + Microphone Ducking Mode Mikrofonducknings-sätt - + Gain Förstärkning - + Gain knob Vred för ökning - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Växla Auto DJ - + Toggle Auto DJ On/Off Växla Auto-DJ på/av - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide Mixer visa/dölj - + Show or hide the mixer. Visa eller dölj mixern. - + Cover Art Show/Hide (Library) Omslagskonst visa/dölj (bibliotek) - + Show/hide cover art in the library Visa/dölj omslagskonst i biblioteket - + Library Maximize/Restore Bibliotek maximera/återställ - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide Effektrack visa/dölj - + Show/hide the effect rack Visa/dölj effektracket - + Waveform Zoom Out Vågform zooma ut @@ -2204,102 +2226,102 @@ trace - Above + Profiling messages Lyssningsnivå hörlur - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Uppspelningshastighet - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) Tonhöjd - + Increase Speed Öka hastighet - + Adjust speed faster (coarse) - + Increase Speed (Fine) Öka hastigheten (fin) - + Adjust speed faster (fine) - + Decrease Speed Sänk hastighet - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed Öka hastighet temporärt - + Temporarily increase speed (coarse) Öka hastigheten temporärt (grovt) - + Temporarily Increase Speed (Fine) Öka hastigheten temporärt (fint) - + Temporarily increase speed (fine) Öka hastigheten temporärt (fint) - + Temporarily Decrease Speed Minska hastighet temporärt - + Temporarily decrease speed (coarse) Sänk hastigheten temporärt (grovt) - + Temporarily Decrease Speed (Fine) Sänk hastigheten temporärt (fint) - + Temporarily decrease speed (fine) Sänk hastigheten temporärt (fint) @@ -2451,1053 +2473,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed Hastighet - + Decrease Speed (Fine) - + Pitch (Musical Key) Tonhöjd - + Increase Pitch Öka tonhöjd - + Increases the pitch by one semitone Ökar tonhöjden med en semiton - + Increase Pitch (Fine) Öka tonhöjd (fint) - + Increases the pitch by 10 cents - + Decrease Pitch Minska tonhöjd - + Decreases the pitch by one semitone Minskar tonhöjden med en semiton - + Decrease Pitch (Fine) Minska tonhöjd (fint) - + Decreases the pitch by 10 cents - + Keylock Tangentlås - + CUP (Cue + Play) CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker Aktivera %1 - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker Rensa %1 - + Clear the %1 [intro/outro marker Rensa %1 - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length Halvera looplängden - + Double the loop length Dubbla looplängden - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward Flytta loop framåt - + Loop Move Backward Flytta loop bakåt - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navigering - + Move up Flytta upp - + Equivalent to pressing the UP key on the keyboard Samma som att trycka UPP piltangenten på tangentbordet - + Move down Flytta ned - + Equivalent to pressing the DOWN key on the keyboard Samma som att trycka NER piltangenten på tangentbordet - + Move up/down Flytta upp/ner - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up Scrolla upp - + Equivalent to pressing the PAGE UP key on the keyboard Samma som att trycka SIDA UPP tangenten på tangentbordet - + Scroll Down Scrolla ner - + Equivalent to pressing the PAGE DOWN key on the keyboard Samma som att trycka SIDA NER tangenten på tangentbordet - + Scroll up/down Scrolla upp/ner - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left Flytta vänster - + Equivalent to pressing the LEFT key on the keyboard Samma som att trycka VÄNSTER piltangent på tangentbordet - + Move right Flytta höger - + Equivalent to pressing the RIGHT key on the keyboard Samma som att trycka HÖGER piltangent på tangentbordet - + Move left/right Flytta vänster/höger - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard Samma som att trycka TAB tangenten på tangentbordet - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard Samma som att trycka SHIFT + TAB tangenten på tangentbordet - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play Ladda låt och spela - + Add to Auto DJ Queue (replace) Lägg till i Auto-DJ-kön (ersätt) - + Replace Auto DJ Queue with selected tracks Ersätt Auto DJ-kön med valda låtar - + Select next search history Välj nästa sökhistorik - + Selects the next search history entry - + Select previous search history Välj föregående sökhistorik - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search Rensa sökning - + Clears the search query Rensar sökningen - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing Aktivera eller inaktivera effektbearbetning - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset Nästa kedjeförinställning - + Previous Chain Föregående kedja - + Previous chain preset Föregående kedjeförinställning - + Next/Previous Chain Nästa/föregående kedja - + Next or previous chain preset Nästa eller föregående kedjeförinställning - - + + Show Effect Parameters Visa effektparametrar - + Effect Unit Assignment - + Meta Knob Meta-ratt - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode Metaratts-läge - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value Knappparameter-värde - + Microphone / Auxiliary Mikrofon / Extraingång - + Microphone On/Off Mikrofon på/av - + Microphone on/off Mikrofon på/av - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Växla mikrofonducknings-sätt (AV, AUTO, MANUELL) - + Auxiliary On/Off Extraingång på/av - + Auxiliary on/off Extraingång på/av - + Auto DJ Auto DJ - + Auto DJ Shuffle Slumpvis Auto DJ - + Auto DJ Skip Next Auto DJ hoppa över nästa - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Auto DJ tona till nästa - + Trigger the transition to the next track Utlös övergången till nästa låt - + User Interface Användargränssnitt - + Samplers Show/Hide Visa/dölj samplare - + Show/hide the sampler section Visa/dölj samplar-delen - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting Starta/stoppa livesändning - + Stream your mix over the Internet. Streama din mix över internet. - + Start/stop recording your mix. Starta/stoppa inspelning av din mix. - - + + Samplers Samplare - + Vinyl Control Show/Hide Vinylstyrning visa/dölj - + Show/hide the vinyl control section Visa/dölj vinylstyrningssektionen - + Preview Deck Show/Hide Visa/dölj förhandslyssnings-tallrikar - + Show/hide the preview deck Visa/dölj förhandsgranskningstallriken - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Visa/dölj vinyl-snurra - + Show/hide spinning vinyl widget Visa/dölj vinylsnurrorna - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies Visa/dölj alla snurrisar - + Toggle Waveforms Växla vågformer - + Show/hide the scrolling waveforms. Visa/dölj de scrollande vågformerna. - + Waveform zoom Vågform zoom - + Waveform Zoom Vågform zoom - + Zoom waveform in Vågform zooma in - + Waveform Zoom In Vågform zooma in - + Zoom waveform out Vågform zooma ut - + Star Rating Up Stjärnbetyg upp - + Increase the track rating by one star Öka låtbetyget med en stjärna - + Star Rating Down Stjärnbetyg ner - + Decrease the track rating by one star Minska låtbetyget med en stjärna @@ -3612,32 +3644,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Försök att rädda situationen genom att återställa din styrenhet. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. Skriptkoden måste fixas. @@ -3745,7 +3777,7 @@ trace - Above + Profiling messages Importera back - + Export Crate Exportera back @@ -3755,7 +3787,7 @@ trace - Above + Profiling messages Lås upp - + An unknown error occurred while creating crate: Ett okänt fel uppstod vid skapandet av backen @@ -3764,12 +3796,6 @@ trace - Above + Profiling messages Rename Crate Döp om back - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3787,17 +3813,17 @@ trace - Above + Profiling messages Omdöpning av back misslyckades - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U spellista (*.m3u);;M3U8 spellista (*.m3u8);;PLS spellista (*.pls);;Text CSV (*.csv);;Läsbar text (*.txt) - + M3U Playlist (*.m3u) M3U-spellista (*.m3u) @@ -3806,6 +3832,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Backar är ett utmärkt sätt att hjälpa till att organisera den musik du vill mixa med. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3917,12 +3949,12 @@ trace - Above + Profiling messages Tidigare bidragsgivare - + Official Website Officiell webbplats - + Donate Donera @@ -4438,37 +4470,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Om länkningen inte fungerar, försök med att aktivera en av de avancerade optionerna nedan och försök använda styrenheten igen. Du kan också klicka på Försök igen för att låta Mixxx söka efter MIDI-styrenhet på nytt. - + Didn't get any midi messages. Please try again. Kunde inte ta emot några MIDI-meddelanden. Försök igen. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Kunde inte upptäcka någon länk -- försök igen. Tänk på att bara röra en styrfunktion åt gången. - + Successfully mapped control: Mappning av styrfunktion lyckades: - + <i>Ready to learn %1</i> <i>Redo att lära in %1</i> - + Learning: %1. Now move a control on your controller. Lära in: %1. Rör en knapp på din styrenhet. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4507,17 +4539,17 @@ You tried to learn: %1,%2 Dumpa till csv - + Log Logg - + Search Sök - + Stats Statistik @@ -5170,114 +5202,114 @@ associated with each key. DlgPrefController - + Apply device settings? Verkställ enhetsinställningar? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Dina inställningar måste verkställas innan läriin-guiden kan startas. Spara inställningarna och fortsätt? - + None Ingen - + %1 by %2 %1 av %2 - + Mapping has been edited Mappning har redigerats - + Always overwrite during this session - + Save As Spara som - + Overwrite Skriv över - + Save user mapping Spara användarmappning - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed Misslyckades med sparande av mappning - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. En mappningsfil med det namnet finns redan. - + Do you want to save the changes? Vill du spara ändringarna? - + Troubleshooting Felsökning - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. Mappning finns redan. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Rensa ingångs-länkningar - + Are you sure you want to clear all input mappings? Är du säker på att du vill rensa alla ingångs-länkningar? - + Clear Output Mappings Rensa utgångs-länkningar - + Are you sure you want to clear all output mappings? Är du säker på att du vill rensa alla utgångs-länkningar? @@ -5295,100 +5327,100 @@ Spara inställningarna och fortsätt? Aktiverad - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Beskrivning: - + Support: Hjälp: - + Screens preview - + Input Mappings Ingångs-länkningar - - + + Search Sök - - + + Add Lägg till - - + + Remove Ta bort @@ -5408,17 +5440,17 @@ Spara inställningarna och fortsätt? Ladda mappning: - + Mapping Info Mappningsinfo - + Author: Upphovsman: - + Name: Namn: @@ -5428,28 +5460,28 @@ Spara inställningarna och fortsätt? Lär in-guiden (endast MIDI) - + Data protocol: - + Mapping Files: Mappningsfiler: - + Mapping Settings - - + + Clear All Rensa allt - + Output Mappings Utgångs-länkningar @@ -5608,6 +5640,16 @@ Spara inställningarna och fortsätt? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6199,62 +6241,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Den minsta storleken för det valda skinnet är större än din skärmupplösning. - + Allow screensaver to run Tillåt skärmsläckare att starta - + Prevent screensaver from running Hindra skärmsläckare från att starta - + Prevent screensaver while playing Hindra skärmsläckare vid uppspelning - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Det här skinnet har inte stöd för färgscheman - + Information Information - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7421,173 +7463,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Standard (lång fördröjning) - + Experimental (no delay) Experimentell (ingen fördröjning) - + Disabled (short delay) Avstängd (kort fördröjning) - + Soundcard Clock Ljudkortsklocka - + Network Clock Nätverksklocka - + Direct monitor (recording and broadcasting only) - + Disabled Avstängd - + Enabled Aktiverad - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide Mixxx DJ hårdvaruguide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Konfigurationsfel @@ -7605,131 +7646,131 @@ The loudness target is approximate and assumes track pregain and main output lev Ljud-API - + Sample Rate Samplingsfrekvens - + Audio Buffer Ljudbuffert - + Engine Clock Motorklocka - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix Huvudmix - + Main Output Mode Huvudutgångsläge - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count Sammanräkning Buffer Underflow - + 0 0 - + Keylock/Pitch-Bending Engine Tonhöjds/pitch-bend rutin - + Multi-Soundcard Synchronization Synkronisering av flera ljudkort. - + Output Utgång - + Input Ingång - + System Reported Latency Systemets rapporterade latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Utvidga din audio-buffert om underströms-räknaren ökar på, eller om du hör smällar under uppspelning. - + Main Output Delay Huvudutgångs-fördröjning - + Headphone Output Delay Hörlursutgångs-fördröjning - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Tips och diagnostik - + Downsize your audio buffer to improve Mixxx's responsiveness. Minska din audio-buffert för Mixxx ska reagera snabbare. - + Query Devices Fråga enheter @@ -8175,47 +8216,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Ljudhårdvara - + Controllers Styrenheter - + Library Bibliotek - + Interface Gränssnitt - + Waveforms Vågformer - + Mixer Mixerbord - + Auto DJ Auto DJ - + Decks - + Colors Färger @@ -8250,47 +8291,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Effekter - + Recording Inspelning - + Beat Detection Takthittare - + Key Detection Tonartsfinnare - + Normalization Normalisering - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Vinylstyrning - + Live Broadcasting Livesändning - + Modplug Decoder Modplug-avkodare @@ -8646,284 +8687,284 @@ This can not be undone! Sammanfattning - + Filetype: Filtyp: - + BPM: BPM: - + Location: Plats: - + Bitrate: Bithastighet: - + Comments Kommentarer - + BPM BPM - + Sets the BPM to 75% of the current value. Ställer BPM till 75% av det aktuella värdet. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Ställer BPM till 50% av det aktuella värdet. - + Displays the BPM of the selected track. Visar BPM för den utvalda låten. - + Track # Låt # - + Album Artist Album-artist - + Composer Kompositör - + Title Titel - + Grouping Gruppindelning - + Key Tonart - + Year År - + Artist Artist - + Album Album - + Genre Genre - + ReplayGain: ReplayGain: - + Sets the BPM to 200% of the current value. Ställer BPM till 200% av det aktuella värdet. - + Double BPM Dubbel BPM - + Halve BPM Halva BPM - + Clear BPM and Beatgrid Rensa BPM och taktmönster - + Move to the previous item. "Previous" button Hoppa till föregående objekt. - + &Previous &Föregående - + Move to the next item. "Next" button Hoppa till nästa objekt. - + &Next &Nästa - + Duration: Speltid: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color Färg - + Date added: Datum tillagd: - + Open in File Browser Öppna i filhanteraren - + Samplerate: - + Track BPM: Låt BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo Anta konstant tempo - + Sets the BPM to 66% of the current value. Ställer BPM till 66% av det aktuella värdet. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Knacka i takt med musiken för att ställa in BPM till hastigheten du knackar med. - + Tap to Beat Trumma i takt - + Hint: Use the Library Analyze view to run BPM detection. Tips: använd Biblioteksanalysatorn för köra BPM-mätning. - + Save changes and close the window. "OK" button Spara ändringarna och stäng fönstret. - + &OK &OK - + Discard changes and close the window. "Cancel" button Ignorera ändringar och stäng fönstret. - + Save changes and keep the window open. "Apply" button Spara ändringar och hålla fönstret öppet. - + &Apply &Verkställ - + &Cancel &Avbryt - + (no color) @@ -9080,7 +9121,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9282,27 +9323,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (snabbare) - + Rubberband (better) Gummiband (bättre) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9517,15 +9558,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Felsäker modus aktiverad - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9537,57 +9578,57 @@ Shown when VuMeter can not be displayed. Please keep stöd. - + activate aktivera - + toggle växla - + right höger - + left vänster - + right small höger liten - + left small vänster liten - + up upp - + down ner - + up small upp liten - + down small ner liten - + Shortcut Genväg @@ -9595,62 +9636,62 @@ stöd. Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9660,22 +9701,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Importera spellista - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Spellistsfiler (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? Skriv över fil? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9722,27 +9763,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) hittades inte - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Vissa lysdioder eller andra indikatorer kanske inte fungerar korrekt. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Kontrollera att MixxxControl-namnen är rättstavade i länknings-filen (.xml) @@ -9803,18 +9844,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Saknade låtar - + Hidden Tracks Döljda låtar - Export to Engine Prime + Export to Engine DJ @@ -9826,210 +9867,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Ljudenheten är upptagen - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Försök igen</b> efter det andra programmet har stängts eller efter att en ljudenhet åter anslutits - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Konfigurera om</b> Mixxx ljudenhetsinställningar. - - + + Get <b>Help</b> from the Mixxx Wiki. Få <b>Hjälp</b> från Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Avsluta</b> Mixxx. - + Retry Försök igen - + skin skal - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Konfigurera om - + Help Hjälp - - + + Exit Avsluta - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error Ljudenhetsfel - + <b>Retry</b> after fixing an issue - + No Output Devices Inga utenheter - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx konfigurerades utan några enheter för ljudåtergivning. All ljudbehandling är deaktiverad när inga ljudutgångar är konfigurerade. - + <b>Continue</b> without any outputs. <b>Fortsätt</b> utan några utgångar. - + Continue Fortsätt - + Load track to Deck %1 Ladda låt till tallrik %1 - + Deck %1 is currently playing a track. Tallrik %1 spelar en låt just nu. - + Are you sure you want to load a new track? Är du säker på att du vill ladda en nytt låt? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Ingen enhet för ljudingång är utvald för den här vinylstyrningsenheten. Välj först en ingångsenhet i inställningarna för ljudhårdvara. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Ingen ingångsenhet utvald för den här genomgångsstyrenheten. Välj först ut en ingångsenhet i inställningarna för ljudhårdvara. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Fel hittat i skinn-filen - + The selected skin cannot be loaded. Kunde inte ladda in det utvalda skinnet. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Bekräfta avsluta - + A deck is currently playing. Exit Mixxx? En tallrik spelar fortfarande. Vill du avsluta Mixxx? - + A sampler is currently playing. Exit Mixxx? En samplare spelar fortfarande. Vill du avsluta Mixxx? - + The preferences window is still open. Inställningsfönstret är fortfarande öppnat. - + Discard any changes and exit Mixxx? Kassera eventuella ändringar och avsluta Mixxx? @@ -10045,13 +10127,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Lås - - + + Playlists Spellistor @@ -10061,32 +10143,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Lås upp - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. En del DJs sätter ihop spellistor innan de uppträder live, medan andra föredrar att sätte ihop dem spontant. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. On du använder en spellista vid ett live-DJ uppträdande, tänk på att kolla hur publiken reagerar på musiken du valt ut. - + Create New Playlist Skapa ny spellista @@ -10307,12 +10415,12 @@ Do you want to scan your library for cover files now? Button - + Knapp Switch - + Switch @@ -10845,7 +10953,7 @@ With width at zero, this allows for manually sweeping over the entire delay rang Decay - + Decay @@ -10901,7 +11009,7 @@ Higher values result in less attenuation of high frequencies. Kill Low - + Kill Low @@ -10936,7 +11044,7 @@ Higher values result in less attenuation of high frequencies. Kill Mid - + Kill Mid @@ -10957,7 +11065,7 @@ Higher values result in less attenuation of high frequencies. Kill High - + Kill High @@ -11346,12 +11454,12 @@ It is designed as a complement to the steep mixing equalizers. Gain 1 - + Gain 1 Gain for Filter 1 - + Gain för Filter 1 @@ -11381,12 +11489,12 @@ a higher Q affects a narrower band of frequencies. Gain 2 - + Gain 2 Gain for Filter 2 - + Gain för Filter 2 @@ -11577,7 +11685,7 @@ Fully right: end of the effect period - + Deck %1 Tallrik %1 @@ -11710,7 +11818,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11741,7 +11849,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11874,12 +11982,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11914,42 +12022,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12007,54 +12115,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists Spellistor - + Folders Mappar - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox (laddar) Rekordbox @@ -12613,7 +12721,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Vinylsnurra @@ -12795,7 +12903,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Album-konst @@ -13031,197 +13139,197 @@ may introduce a 'pumping' effect and/or distortion. När du trummar här, ändras BPM uppåt något. - + Adjust Beats Earlier Justera taktslag tidigare - + When tapped, moves the beatgrid left by a small amount. När du trummar här, flyttar sej taktmönstret åt vänster ett kort stycke. - + Adjust Beats Later Justera taktslag senare - + When tapped, moves the beatgrid right by a small amount. När du trummar här, flyttar sej taktmönstret åt höger ett kort stycke. - + Tempo and BPM Tap Trumma tempo och BPM - + Show/hide the spinning vinyl section. Visa/dölj sektionen med vinylsnurror. - + Keylock Tangentlås - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Spela - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration Inspelningslängd @@ -13459,926 +13567,932 @@ may introduce a 'pumping' effect and/or distortion. - - Revert last BPM/Beatgrid Change + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. - - Revert last BPM/Beatgrid Change of the loaded track. + + Revert last BPM/Beatgrid Change + + + + + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable Huvudmix aktivera - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active Auto-DJ är aktivt - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. Klicka för att växla mellan tid förflutet/återstående tid/både. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode Mixläge - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu Stilinställningar-meny - + Show/hide skin settings menu Visa/dölj stilinställningar-menyn - + Save Sampler Bank Spara samplar-uppsättning - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Ladda in samplar-uppsättning - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters Visa effektparametrar - + Enable Effect Aktivera effekt - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Superknapp - + Next Chain Nästa kedja - + Previous Chain Föregående kedja - + Next/Previous Chain Nästa/föregående kedja - + Clear Rensa - + Clear the current effect. Rensa nuvarande effekt. - + Toggle Växla - + Toggle the current effect. Växla nuvarande effekt. - + Next Nästa - + Clear Unit Rensa enhet - + Clear effect unit. Rensa effektenhet. - + Show/hide parameters for effects in this unit. Visa/dölj parametrar för effekter i denna enhet. - + Toggle Unit Växla enhet - + Enable or disable this whole effect unit. Aktivera eller inaktivera hela denna effektenhet. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit Tilldela effektenhet - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. Skickar hörlursljudet genom den här effekten. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Växla till nästa effekt. - + Previous Bakåt - + Switch to the previous effect. Växla till föregående effekt. - + Next or Previous Nästa eller föregående - + Switch to either the next or previous effect. Växla till antingen nästa eller föregående effekt. - + Meta Knob Meta-ratt - + Controls linked parameters of this effect Kontrollerar länkade parametrar på denna effekt - + Effect Focus Button Effektfokus-knapp - + Focuses this effect. Fokuserar denna effekt. - + Unfocuses this effect. Avfokuserar denna effekt. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Effektparameter - + Adjusts a parameter of the effect. Justerar en parameter av effekten. - + Inactive: parameter not linked Inaktiv: parameter inte länkad - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter Equalizerparameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Justera taktmönster - + Adjust beatgrid so the closest beat is aligned with the current play position. Justerar taktmönstret så att det närmaste taktslaget stämmer överens med den aktuella uppspelningspositionen. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. Hoppar till närmaste taktslag om kvantisering är aktiverad. - + Quantize Kvantisering - + Toggles quantization. Slår på/av kvantisering. - + Loops and cues snap to the nearest beat when quantization is enabled. Slingor och markeringar snäpper till närmaste taktslag när kvantisering är aktiverad. - + Reverse Baklänges - + Reverses track playback during regular playback. Spelar låten baklänges under vanlig uppspelning. - + Puts a track into reverse while being held (Censor). Spelar en låt baklänges så länge knappen trycks ned (censur) - + Playback continues where the track would have been if it had not been temporarily reversed. Uppspelningen fortsätter från den position den skulle varit om inte låten spelats baklänges tillfälligt. - - - + + + Play/Pause Spela/Paus - + Jumps to the beginning of the track. Hoppar till början av låten. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. Ökar tonhöjden med en semiton. - + Decreases the pitch by one semitone. Minskar tonhöjden med en semiton. - + Enable Vinyl Control Aktivera vinylkontroll - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Indikerar att ljudbufferten är för liten för att kunna bearbeta allt ljud korrekt. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating Stjärnbetyg - + Assign ratings to individual tracks by clicking the stars. @@ -14513,33 +14627,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Börjar spela från början av låten. - + Jumps to the beginning of the track and stops. Hoppa till början av låten och stoppa. - - + + Plays or pauses the track. Spelar eller pausar låten. - + (while playing) (vid uppspelning) @@ -14559,215 +14673,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (medan stoppad) - + Cue Markering - + Headphone Hörlur - + Mute Tysta - + Old Synchronize Äldre synkning - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Synkroniserar till den första tallriken (i nummerordning) som spelar en låt och har BPM-information. - + If no deck is playing, syncs to the first deck that has a BPM. Synkroniserar till tallriken som har en BPM, om någon tallrik spelar. - + Decks can't sync to samplers and samplers can only sync to decks. Tallrikar kan inte synkronisera till samplare och samplare kan endast synkronisera till tallrikar. - + Hold for at least a second to enable sync lock for this deck. Håll ner i minst en sekund för att aktivera Sync Lock för den här tallriken. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Tallrikar med Sync Lock spelar i samma tempo, och tallrikar som också har aktiverad kvantisering spelas alltid med samtidiga taktslag. - + Resets the key to the original track key. - + Speed Control Hastighetsstyrning - - - + + + Changes the track pitch independent of the tempo. Ändrar låtens tonhöjd oberoende av tempot. - + Increases the pitch by 10 cents. Ökar pitchen med 10 cents. - + Decreases the pitch by 10 cents. Minskar pitchen med 10 cents. - + Pitch Adjust Justera hastighet - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Spela in mix - + Toggle mix recording. Växla mixinspelning. - + Enable Live Broadcasting Aktivera livesändning - + Stream your mix over the Internet. Streama din mix över internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. inaktiverad, ansluter, ansluten, misslyckande. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. Uppspelningen fortsätter från den position den skulle ha varit om låten inte hade lagts in i slingan. - + Loop Exit Avsluta slinga - + Turns the current loop off. Stänger av aktuell slinga. - + Slip Mode Spela-vidare-sätt - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Uppspelningen fortsätter tyst samtidigt som du använder slingor, baklängesspelning, scratchning, o.s.v. när denna funktion är aktiverad. - + Once disabled, the audible playback will resume where the track would have been. Vid avstängning fortsätter uppspelningen från det ställe låten skulle ha varit. - + Track Key The musical key of a track Låtens tonart - + Displays the musical key of the loaded track. Visar den laddade låtens tonart. - + Clock Klocka - + Displays the current time. Visar aktuell tid. - + Audio Latency Usage Meter Ljudlatensanvändningsmätare - + Displays the fraction of latency used for audio processing. Visar hur stor del av latensen som används för ljudbehandlingen. - + A high value indicates that audible glitches are likely. Ett högt värde tyder på att hörbara störningar är troliga. - + Do not enable keylock, effects or additional decks in this situation. Aktivera inte tonhöjdslås, effekter eller ytterligare tallrikar i denna situation. - + Audio Latency Overload Indicator Indikator för ljudlatensöverbelastning @@ -14812,254 +14926,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Visar låtens aktuella tonart efter tonhöjdsändring. - + Fast Rewind Snabbspolning bakåt - + Fast rewind through the track. Spolar låten snabbt bakåt. - + Fast Forward Snabbspolning framåt - + Fast forward through the track. Spolar låten snabbt framåt. - + Jumps to the end of the track. Hoppar till slutet av låten. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control Tonhöjdsstyrning - + Pitch Rate Tonhöjdshastighet - + Displays the current playback rate of the track. Visar uppspelningshastigheten för spåret som spelas upp. - + Repeat Upprepa - + When active the track will repeat if you go past the end or reverse before the start. Om aktiverad repeteras låten om du fortsätter bortom slutet eller backar före början. - + Eject Mata ut - + Ejects track from the player. Matar ut låten från spelaren. - + Hotcue Snabbmarkering - + If hotcue is set, jumps to the hotcue. Hoppar till en snabbmarkering, om den existerar - + If hotcue is not set, sets the hotcue to the current play position. Sätter en snabbmarkering vid aktuell position, om ingen snabbmarkering existerar. - + Vinyl Control Mode Vinylstyrningssätt - + Absolute mode - track position equals needle position and speed. Absolut modus - låtpositionen är samma som nålpositionen och -hastigheten. - + Relative mode - track speed equals needle speed regardless of needle position. Relativ modus - låthastigheten är samma som nålhastigheten, oavsett av nålpositionen. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Konstant modus - låthastigheten är samma som den sist använda, jämna hastigheten, oavsett nålinformationen. - + Vinyl Status Vinylstatus - + Provides visual feedback for vinyl control status: Tillhandahåller visuell feed-back av vinylstyrning: - + Green for control enabled. Grönt för aktiverad styrenhet. - + Blinking yellow for when the needle reaches the end of the record. Blinkande gult när nålen når slutet av skivan. - + Loop-In Marker Loop-in-markering - + Loop-Out Marker Loop-out-markering - + Loop Halve Halv slinga - + Halves the current loop's length by moving the end marker. Halverar längden av den aktuella slingan genom att flytta slutmarkeringen. - + Deck immediately loops if past the new endpoint. Om bortom den nya slutpunkten hoppar tallriken genast tillbaks i slingan. - + Loop Double Dubbel slinga - + Doubles the current loop's length by moving the end marker. Dubblar längden av den aktuella slingan genom att flytta slutmarkeringen. - + Beatloop Taktslinga - + Toggles the current loop on or off. Slår på/av aktuell slinga - + Works only if Loop-In and Loop-Out marker are set. Fungerar bara om både loop-in- och loop-out-markeringar har satts. - + Vinyl Cueing Mode Vinylmarkeringssätt - + Determines how cue points are treated in vinyl control Relative mode: Bestämmer hur markeringspunkter behandlas i relativ modus för vinylstyrning: - + Off - Cue points ignored. Av - Markeringspunkter ignoreras. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Enkelmarkering - om du släpper ner nålen efter markeringen, kommer låten att hoppa till denna markering. - + Track Time Låtens tidsläge - + Track Duration Låtens speltid - + Displays the duration of the loaded track. Visar speltiden för den laddade låten. - + Information is loaded from the track's metadata tags. Informationen laddas från låtens metadatataggar. - + Track Artist Låtens artist - + Displays the artist of the loaded track. Visar artisten för den laddade låten. - + Track Title Låtens titel - + Displays the title of the loaded track. Visar titeln för den laddade låten. - + Track Album Låtens album - + Displays the album name of the loaded track. Visar albumnamnet för den laddade låten. - + Track Artist/Title Låtens artist/titel - + Displays the artist and title of the loaded track. Visar artisten och titeln för den laddade låten. @@ -15067,12 +15181,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks Döljer spår - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15287,47 +15401,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... Etikett... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15452,323 +15566,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Skapa &ny spellista - + Create a new playlist Skapa en ny spellista. - + Ctrl+n Ctrl+n - + Create New &Crate Skapa ny &back - + Create a new crate Skapa en ny back - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View &Vy - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Fungerar möjligen inte för alla skinn. - + Show Skin Settings Menu Visa stilinställningar-menyn - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section Visa mikrofonsektionen - + Show the microphone section of the Mixxx interface. Visa Mixxx mikrofonsektion. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section Visa vinylstyrningssektionen - + Show the vinyl control section of the Mixxx interface. Visa Mixxx sektion med vinylstyrning. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck Visa förlyssnings-tallrik - + Show the preview deck in the Mixxx interface. Visa Mixxx sektion med förlyssnings-tallrikar. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art Visa omslagskonst - + Show cover art in the Mixxx interface. Visar omslagskonst i Mixxx-gränssnittet. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library Maximera bibliotek - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library Mellanslag - + &Full Screen &Helskärm - + Display Mixxx using the full screen Visa Mixxx i helskärmsläge - + &Options &Optioner - + &Vinyl Control &Vinylstyrning - + Use timecoded vinyls on external turntables to control Mixxx Använd tidskodade skivor på externa skivspelare för att styra Mixxx. - + Enable Vinyl Control &%1 Aktivera vinylstyrning &%1 - + &Record Mix %Spela in Mix - + Record your mix to a file Spara din mix till en fil - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Aktivera livesä&ndning - + Stream your mixes to a shoutcast or icecast server Streama dina mixar till en shoutcast- eller icecast-server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts Aktivera tangentbords&genvägar - + Toggles keyboard shortcuts on or off Slår på/av tangentbordsgenvägar - + Ctrl+` Ctrl+` - + &Preferences &Inställningar - + Change Mixxx settings (e.g. playback, MIDI, controls) Ändra Mixxx inställningar (t.ex. återgivning, MIDI, styrenheter) - + &Developer &Utvecklare - + &Reload Skin &Ladda om skinnet - + Reload the skin Ladda om skinnet - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools Utvecklarverktyg - + Opens the developer tools dialog Öppnar dialogrutan för utvecklingsverktyg - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Hjälp - + Show Keywheel menu title @@ -15785,74 +15929,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel F12 - + &Community Support Hjälp från andra &användare - + Get help with Mixxx Få hjälp för Mixxx. - + &User Manual Br&uksanvisning - + Read the Mixxx user manual. Läs bruksanvisningen för Mixxx. - + &Keyboard Shortcuts & Tangentbordsgenvägar - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application Översä&tt denna applikation - + Help translate this application into your language. Hjälp oss att översätta det här programmet till ditt språk. - + &About &Om... - + About the application Om programmet @@ -15860,25 +16004,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible Redo att spela, analyserar... - - + + Loading track... Text on waveform overview when file is cached from source Laddar låt... - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15887,25 +16031,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Sök - + Clear input @@ -15916,169 +16048,163 @@ This can not be undone! Sök... - + Clear the search bar input field - - Enter a string to search for - Ange en sträng att söka efter + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Genväg + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Fokus + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts - Genvägar + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries Växla sökhistorik - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Avsluta sök + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks Sök relaterade låtar - + Key Nyckel - + harmonic with %1 - + BPM BPM - + between %1 and %2 mellan %1 och %2 - + Artist Artist - + Album Artist Album-artist - + Composer Kompositör - + Title Titel - + Album Album - + Grouping Gruppindelning - + Year År - + Genre Genre - + Directory - + &Search selected @@ -16086,620 +16212,625 @@ This can not be undone! WTrackMenu - + Load to Ladda till - + Deck Tallrik - + Sampler Samplare - + Add to Playlist Spara till spellistan. - + Crates Backar - + Metadata Metadata - + Update external collections Uppdatera externa samlingar - + Cover Art Album-konst - + Adjust BPM Justera BPM - + Select Color Välj färg - - + + Analyze Analysera - - + + Delete Track Files Ta bort låtfiler - + Add to Auto DJ Queue (bottom) Spara till Auto DJ kö (sist) - + Add to Auto DJ Queue (top) Spara till Auto DJ kö (först) - + Add to Auto DJ Queue (replace) Lägg till i Auto-DJ-kön (ersätt) - + Preview Deck Förlyssnings-tallrik - + Remove Ta bort - + Remove from Playlist Ta bort från spellista - + Remove from Crate - + Hide from Library Dölj från biblioteket - + Unhide from Library Ta fram från biblioteket - + Purge from Library Rensa från biblioteket - + Move Track File(s) to Trash - + Delete Files from Disk Ta bort filer från disk - + Properties Egenskaper - + Open in File Browser Öppna i filhanteraren - + Select in Library - + Import From File Tags Importera från filtaggar - + Import From MusicBrainz Importera från MusicBrainz - + Export To File Tags Exportera tlll filtaggar - + BPM and Beatgrid - + Play Count Antal spelningar - + Rating Betyg - + Cue Point - - + + Hotcues Snabbmarkeringar - + Intro Intro - + Outro Outro - + Key Nyckel - + ReplayGain Förstärkning av uppspelning - + Waveform Vågform - + Comment Kommentar - + All Alla - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Lås BPM - + Unlock BPM Lås upp BPM - + Double BPM Dubbel BPM - + Halve BPM Halva BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Tallrik %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Skapa ny spellista - + Enter name for new playlist: Mata in ett namn för ny spellista: - + New Playlist Ny spellista - - - + + + Playlist Creation Failed Spellistan gick inte att skapa - + A playlist by that name already exists. En spellista med det namnet finns redan. - + A playlist cannot have a blank name. En spellista kan inte vara utan namn. - + An unknown error occurred while creating playlist: Ett okänt fel uppstod när spellistan skapades: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? Ta bort dessa filer från disk permanent? - - + + This can not be undone! Detta kan inte ångras! - + Cancel Avbryt - + Delete Files Ta bort filer - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted Låtfiler borttagna - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Stäng - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16715,37 +16846,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16753,37 +16884,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal Bekräfta borttagning av låt @@ -16791,12 +16922,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Visa eller dölj kolumner. - + Shuffle Tracks @@ -16804,52 +16935,52 @@ This can not be undone! mixxx::CoreServices - + fonts fonter - + database databas - + effects effekter - + audio interface - + decks - + library bibliotek - + Choose music library directory Välj mapp för musikbibliotek - + controllers - + Cannot open database Kan inte öppna databasen - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16863,68 +16994,78 @@ Klicka på OK för att avsluta. mixxx::DlgLibraryExport - + Entire music library Hela musikbiblioteket - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Bläddra… - + Export directory - + Database version Databas-version - + Export Exportera - + Cancel Avbryt - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To Exportera bibliotek till - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16945,7 +17086,7 @@ Klicka på OK för att avsluta. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16955,23 +17096,23 @@ Klicka på OK för att avsluta. mixxx::LibraryExporter - + Export Completed Export slutförd - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed Export misslyckades - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_tr.qm b/res/translations/mixxx_tr.qm index cca8e4703fc04fa536b68d04c1fac7fb113da713..213bdd649b26c10acd197189543598d196f133eb 100644 GIT binary patch delta 7249 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 wHYx0&NCT0v43*GexXM&!*P$|pOQnIjrc5O% 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�TLhRlwzGwjfEfp?QJhFl`8US`?oDe8mYWR`c&Bj<$6tk!fTJ*R0Y>vl5`A2woK)?Lc8MKK1#|GV##ZTW~5|NKU_?fhq=I|F2K z=5VLkRkFC$5fH#sw)=bWM+{DLyXgI|s0 z6vJfK5~o5l>9X64KjEAq$R2iYiF#v(>>vI(k^F${Wgq<$oN^z^K7GeT+wRGm{}GCs zE=F#448PwumbdS66~$tOyyJovMB!8A-3=EBJ)g^M^V=c0Jdis`o54mh<%2q4K*w*4 zm5K5pgPf7oh;j8nBROH0e26d3ezQI0LyMeH+@{IB^zKdJhfU@Fosx*!PL|K^Qb(NX zh4+0hs(iI*0k^A@uTFvnr0((!O6+k%rhG#w{5?-A z-?GXRR=!f6u%Rcspb%#N#rR%Tn$acmB>>U zLc$}jVG?51o+hjol=M>C!pBQGf~fK9ZN zm%PZtDR>p*xsmcKQvCK?$ynD^FTb(^9sP0?(n(QB4i1cW-4&{JPf_t?Fm_qTxIIJB zDqV|WGg;B@&3D9$^G0&ACeP0}pJQ`;21r(%otbW+&O+lyPVISRM? zf!NBM3is*QN;`dX)`;z?aKGIZCzW3n6R(Cq13eU89#GM&bLnrL9tY zy|Mrkzfm;I0e8kIe%wLY-LX>fG;pzakug-x zxZr}3oY-3#h-(!J9l^Lzp`7vQBhhJ7#=AOY&~@@rj57WLk8H?;dNi6XH9p`J^~(4=vysP#DieMkiUWnIGN~LZ4?e8i z^9ARG1b1bM{Uf50+mxyHwnTF>m8Wi;N5v#Cmc22OlesBR4?$!UCNrv%82kGh$w}@i z^ZOLT7WONP^>JN^ex0B!`5X?_+9^v1oJH~}RKCxv!xj=p0pqR*kK5R;^8h5u4U9_L$6AAXn{lkAT2`Gu|4l z((k>G57s!TjNDqs7@exxpZpjS4l|NdB&bd{fsr+dV*I_4DkmJr^jjIKODUN6;w4o{ z4pi+ri}6&M>gmNYTu20~o=?OAyY^N$+L((A^N;Gm4b6yZeblbo-l6KAt7nbGK8(ks z)b7n3a8$}tj~Ry*Tl~(rdLZM)QEJ~QuW$kB$9RZW&!|GgI~J~<69&z2OVkTGV#1Qq z>P10#p43^rF7+ie6UNwWvU=nAGNjFGu5flTKK`oyVvPkZ>dB~IS*lU!(6M%h=BLRsaWh$hYy5EFlD3I4!|DM91pg#~a2YC2L&XBkkt6X@-u>M?G-UNIhLkG&VT#iDtxF7~P0Rnwc(rkyKV|W?5c^MjAAW zV;hL3tk$d_1urP%G@H&$L~=Q<**fqck;>FaPU5dQwF?3yC^fl`1?X?DIh(PS=w+Cu zq6oG`A2s*L4F9C4)>LZo-4`d#`-WEV|CbLnKNLN&^2Ln%CTm4iG9p}aZLcR?M3dWXWU+| zJ=W_uj`!`gxwwd;2}Rno?`?^y3N$nFrjeX{n{MA~Pt*q~y5y_fF`=0*r#Eb%k-M(ACB`kd z&G z3}S}<*IVVhcxI?sNNl1BXZnkrMp6J?&-(ARV4Tx1+?uHAe|LzTk2OS@3~doRwk2nJ L(z*rrrqTZatrx#t diff --git a/res/translations/mixxx_tr.ts b/res/translations/mixxx_tr.ts index af5b5cae04b4..6c87ee1e6c57 100644 --- a/res/translations/mixxx_tr.ts +++ b/res/translations/mixxx_tr.ts @@ -26,45 +26,45 @@ Enable Auto DJ - + Otomatik DJ'i Etkinleştir Disable Auto DJ - + Otomatik DJ'i Devre Dışı Bırak Clear Auto DJ Queue - + Otomatik DJ Listesini Sil - + Remove Crate as Track Source Kutuyu parça kaynağı olarak kaldır - + Auto DJ Otomatik DJ - + Confirmation Clear Onayı Kaldır - + Do you really want to remove all tracks from the Auto DJ queue? Gerçekten Otomatik DJ kuyruğundaki tüm parçaları kaldırmak istiyor musunuz? - + This can not be undone. Bu geri alınamaz. - + Add Crate as Track Source Kutuyu parça kaynağı olarak ekle @@ -149,28 +149,28 @@ BasePlaylistFeature - + New Playlist Yeni çalma listesi - + Add to Auto DJ Queue (bottom) Otomatik DJ kuyruğuna ekle (alta) - + Create New Playlist Yeni çalma listesi oluştur - + Add to Auto DJ Queue (top) Otomatik DJ kuyruğuna ekle (üste) - + Remove Kaldır @@ -180,12 +180,12 @@ Yeniden adlandır - + Lock Kilitle - + Duplicate Çoğalt @@ -206,24 +206,24 @@ Tüm çalma listesini analiz et - + Enter new name for playlist: Çalma listesini adlandır - + Duplicate Playlist Çalma Listesini Çoğalt - - + + Enter name for new playlist: Yeni çalma listesini adlandır - + Export Playlist Çalma listesini dışa aktar @@ -233,70 +233,77 @@ Otomatik DJ Kuyruğuna Ekle (değiştir) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Çalma listesini yeniden adlandır - - + + Renaming Playlist Failed Çalma listesi yeniden adlandırılamadı - - - + + + A playlist by that name already exists. Bu isimde bir çalma listesi zaten var. - - - + + + A playlist cannot have a blank name. Liste ismi boş bırakılamaz - + _copy //: Appendix to default name when duplicating a playlist _kopyala - - - - - - + + + + + + Playlist Creation Failed Çalma Listesi Oluşturulamadı - - + + An unknown error occurred while creating playlist: Çalma listesi oluşturulurken bilinmeyen bir hata oluştu: - + Confirm Deletion Silmeyi Onayla - + Do you really want to delete playlist <b>%1</b>? <b>%1</b> çalma listesini gerçekten silmek istiyor musunuz? - + M3U Playlist (*.m3u) M3U Çalma Listesi (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Çalma Listesi (*.m3u);;M3U8 Çalma Listesi (*.m3u8);;PLS Çalma Listesi (*.pls);;Metin CSV (*.csv);;Okunabilir Metin (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp Zaman Etiketi @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Parça aktarılamadı. @@ -325,137 +332,142 @@ BaseTrackTableModel - + Album Albüm - + Album Artist Albüm Sanatçısı - + Artist Sanatçı - + Bitrate Akış Hızı - + BPM BPM(Dakikalık Vuruş Sayısı) - + Channels Kanallar - + Color Renk - + Comment Yorum - + Composer Besteci - + Cover Art Albüm kapak resim - + Date Added Eklendiği Tarih - + Last Played Son Çalınan - + Duration Süre - + Type Tür - + Genre Tür - + Grouping Grupla - + Key Anahtar - + Location Konum - + + Overview + Genel Bakış + + + Preview Önizleme - + Rating Derecelendirme - + ReplayGain Yeniden kazan - + Samplerate Aynı oran - + Played Oynatılma Sayısı - + Title Başlık - + Track # Parça # - + Year Yıl - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk Resim getiriliyor... @@ -543,67 +555,77 @@ BrowseFeature - + Add to Quick Links Kısayollara Ekle - + Remove from Quick Links Kısayollardan Çıkar - + Add to Library Kitaplığa ekle - + Refresh directory tree Dizin ağacını yenile - + Quick Links Çabuk Ulaşım - - + + Devices Aygıtlar - + Removable Devices Çıkarılabilir Aygıtlar - - + + Computer Bilgisayar - + Music Directory Added Müzik dizini eklendi - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? Bir veya daha fazla müzik dizini eklediniz. Bu dizinlerdeki parçalar, müzik kitaplığınızı tekrar tarayana kadar çalmaya hazır olmayacaktır. Şimdi taramak istermisiniz ? - + Scan Tara - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. "Bilgisayar", sabit diskinizdeki ve harici aygıtlarınızdaki klasörlerdeki parçaları gezinmenizi, görüntülemenizi ve yüklemenizi sağlar. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -749,87 +771,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: Mixxx açık kaynaklı bir DJ yazılımıdır. Daha fazla bilgi için bkz.: - + Starts Mixxx in full-screen mode Mixxx'i tam ekran modunda başlat - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -839,27 +861,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1043,13 +1070,13 @@ trace - Above + Profiling messages - + Set to full volume Sesi sonuna kadar aç - + Set to zero volume Sesi sonuna kadar kapT @@ -1074,13 +1101,13 @@ trace - Above + Profiling messages Ters çevirme (Sansür) düğmesi - + Headphone listen button Kulaklıktan dinle düğmesi - + Mute button Ses sıfırlama düğmesi @@ -1091,25 +1118,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Karıştırma yönü (örn. sol, sağ, orta) - + Set mix orientation to left Mix yönünü sol olarak belirle - + Set mix orientation to center Mix yönünü mekez olarak belirle - + Set mix orientation to right Mix yönünü sağ olarak belirle @@ -1150,22 +1177,22 @@ trace - Above + Profiling messages BPM ayar düğmesi - + Toggle quantize mode Kuantize modunu değiştir - + One-time beat sync (tempo only) Bir defalık beat senkronizasyonu (sadece tempo) - + One-time beat sync (phase only) Bir defalık beat senkronizasyonu (sadece faz) - + Toggle keylock mode Tuş Kilitleme Moduna Geç @@ -1175,193 +1202,193 @@ trace - Above + Profiling messages Dengeleyiciler (Ekolayzerler) - + Vinyl Control Vinil Kontrolu - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues İşaretler - + Cue button İşaretleme düğmesi - + Set cue point İşaret noktası koy - + Go to cue point İşaretlenmiş noktaya git - + Go to cue point and play İşaretlenmiş noktaya git ve çal - + Go to cue point and stop İşaretlenmiş noktaya git ve durdur - + Preview from cue point İşaretlenmiş noktadan itibaren önizleme - + Cue button (CDJ mode) İşaretleme düğmesi (CDJ modu) - + Stutter cue Geçici başlama noktasını belirle - + Hotcues Önemli işaretler - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 %1 kısayolunu temizle - + Set hotcue %1 %1 kısayolunu ayarla - + Jump to hotcue %1 %1 kısayolu atla - + Jump to hotcue %1 and stop %1 hotcue git ve durdur - + Jump to hotcue %1 and play Kısayol %1'e atlayın ve oynayın - + Preview from hotcue %1 En düşük hotcue %1 önizleme - - + + Hotcue %1 Hotcue %1 - + Looping Döngü - + Loop In button Döngü giriş düğmesi - + Loop Out button Döngü çıkış düğmesi - + Loop Exit button Döngüden çıkıma düğmesi - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop %1 vuruşlu döngü oluştur - + Create temporary %1-beat loop roll @@ -1477,20 +1504,20 @@ trace - Above + Profiling messages - - + + Volume Fader Ses Düzeyi - + Full Volume Maksimum ses düzeyi - + Zero Volume Sıfır ses düzeyi @@ -1506,7 +1533,7 @@ trace - Above + Profiling messages - + Mute Ses kapatma @@ -1517,7 +1544,7 @@ trace - Above + Profiling messages - + Headphone Listen Kulaklık dinleme @@ -1538,25 +1565,25 @@ trace - Above + Profiling messages - + Orientation Yönelim - + Orient Left Sağ Yönlen - + Orient Center Merkeze Yönlen - + Orient Right Sağ Yönlen @@ -1626,82 +1653,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid Beatgrid'i ayarlayın - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode Kuantize modu - + Sync Eşitleme - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key Müzik anahtarını eşle - + Match Key Anahtarı eşle - + Reset Key Sıfırlama tuşu - + Resets key to original Anahtarı orijinale döndür @@ -1742,451 +1769,451 @@ trace - Above + Profiling messages Düşük EQ - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue Başlangıç noktası - + Set Cue Başlangıç Noktası belirle - + Go-To Cue Başlangıç noktasına git - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In Döngüye Gir - + Loop Out Döngüden Çık - + Loop Exit Döngüden Çık - + Reloop/Exit Loop Tekrar Döngü/Döngüden Çık - + Loop Halve Yarı Döngü - + Loop Double Çift Döngü - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Döngüyü +%1 Vuruş Kaydır - + Move Loop -%1 Beats Döngüyü -%1 Vuruş Kaydır - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Otomatik DJ kuyruğuna ekle (alta) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Otomatik DJ kuyruğuna ekle (üste) - + Prepend selected track to the Auto DJ Queue - + Load Track Parçayı yükle - + Load selected track Seçilmiş parçayı yükle - + Load selected track and play Seçilen parçayı yükle ve oynat - - + + Record Mix Mix kaydet - + Toggle mix recording - + Effects Efektler - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit Birimi Temizle - + Clear effect unit Efekt birmini temizle - + Toggle Unit - + Dry/Wet Kuru/Islak - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain Sonraki zincir - + Assign Ata - + Clear Temizle - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Sonraki - + Switch to next effect - + Previous Önceki - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value Parametre değeri - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2201,102 +2228,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2448,1041 +2475,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation Navigasyon - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) Otomatik DJ Kuyruğuna Ekle (değiştir) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Mikrofonu aç/kapa - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off Auxiliary Aç/Kapa - + Auxiliary on/off Auxiliary aç/kapa - + Auto DJ Otomatik DJ - + Auto DJ Shuffle Oto DJ karıştır - + Auto DJ Skip Next Oto DJ sonrakini atla - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Oto DJ sonrakine geçiş yap - + Trigger the transition to the next track - + User Interface Kullanıcı Arayüzü - + Samplers Show/Hide - + Show/hide the sampler section Oynatıcı Kısımlarını Görüntüle/Gizle - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide - + Show/hide the vinyl control section Vinyl kontrol seçeneklerini göster/gizle - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget Dönen vinyl eklentisini göster/gizle - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Dalga şekli büyüt - + Waveform Zoom Dalga Şekli Büyüt - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3599,32 +3648,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3668,13 +3717,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Kaldır - + Create New Crate Yeni kutu oluştur @@ -3684,132 +3733,132 @@ trace - Above + Profiling messages Yeniden adlandır - - + + Lock Kilitle - + Export Crate as Playlist - + Export Track Files Şarkı dosyalarını dışa aktar - + Duplicate Çoğalt - + Analyze entire Crate - + Auto DJ Track Source Oto DJ Parça Kaynağı - + Enter new name for crate: - - + + Crates Kutular - - + + Import Crate Dışardan Kutu Ekle - + Export Crate Kutuyu Dışarı Aktar - + Unlock Kilidi Kaldır - + An unknown error occurred while creating crate: Kutuyu oluştururken bilinmeyen bir hata oluştu: - + Rename Crate Kutuyu Yeniden İsimlendir - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Kutuyu Yeniden İsimlendirme Başarısız - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Çalma Listesi (*.m3u);;M3U8 Çalma Listesi (*.m3u8);;PLS Çalma Listesi (*.pls);;Metin CSV (*.csv);;Okunabilir Metin (*.txt) - + M3U Playlist (*.m3u) M3U Çalma Listesi (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Kutular DJ'lik yapmak istediğiniz müzikleri organize etmek için iyi bir yoldur. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Kutular müziklerinizi istediğiniz şekilde organize etmenizi sağlar - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Bir kutu boş bir isime sahip olamaz - + A crate by that name already exists. Bu adla oluşturulmuş bir müzik kutusu var @@ -3904,12 +3953,12 @@ trace - Above + Profiling messages - + Official Website - + Donate @@ -4028,72 +4077,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Atla - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Saniye - + Auto DJ Fade Modes Full Intro + Outro: @@ -4124,80 +4173,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat Tekrarla - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Otomatik DJ - + Shuffle Karıştır - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4420,37 +4469,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4489,17 +4538,17 @@ You tried to learn: %1,%2 - + Log - + Search Arama - + Stats İstatistikler @@ -4991,7 +5040,7 @@ Two source connections to the same server that have the same mountpoint can not Mount - + Mount @@ -5152,113 +5201,113 @@ associated with each key. DlgPrefController - + Apply device settings? Ayarlar uygulansın mı? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Hiçbiri - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Sorun giderme - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5271,105 +5320,105 @@ Apply settings and continue? Kontrol Cihazı Adı - + Enabled Etkinleştirildi - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Açıklama: - + Support: Destek: - + Screens preview - + Input Mappings - - + + Search Ara - - + + Add Ekle - - + + Remove Kaldır @@ -5384,22 +5433,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: Yaratıcı: - + Name: Adı: @@ -5409,28 +5458,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Hepsini temizle - + Output Mappings @@ -5590,6 +5639,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6181,62 +6240,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Bilgi - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7403,173 +7462,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled Engellenmiş - + Enabled Etkinleştirildi - + Stereo Stereo - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error @@ -7587,131 +7645,131 @@ The loudness target is approximate and assumes track pregain and main output lev - + Sample Rate - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds MS - + 20 ms 20 ms - + Buffer Underflow Count - + 0 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Çıkış - + Input Giriş - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices @@ -7866,27 +7924,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available OpenGL mevcut değil - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7899,250 +7958,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Düşük - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle Orta - + Global Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High Yüksek - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8150,47 +8215,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware - + Controllers Kontroller - + Library Kütüphane - + Interface - + Waveforms - + Mixer Karıştırıcı - + Auto DJ Otomatik DJ - + Decks - + Colors @@ -8225,47 +8290,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Efektler - + Recording Kayıtlar - + Beat Detection - + Key Detection - + Normalization Normalleştirme - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Vinil Kontrolu - + Live Broadcasting Canlı yayın - + Modplug Decoder @@ -8298,22 +8363,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Kayıda başla - + Recording to file: - + Stop Recording Kayıdı durdur - + %1 MiB written in %2 @@ -8621,284 +8686,284 @@ This can not be undone! Özet - + Filetype: Dosya türü: - + BPM: BPM: - + Location: Dizin: - + Bitrate: - + Comments Görüşler - + BPM BPM(Dakikalık Vuruş Sayısı) - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Parça # - + Album Artist Albüm Sanatçısı - + Composer Besteci - + Title Başlık - + Grouping Grupla - + Key Anahtar - + Year Yıl - + Artist Sanatçı - + Album Albüm - + Genre Tür - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM BPM'i ikiye katla - + Halve BPM - + Clear BPM and Beatgrid BPM ve Beatgrid Temizle - + Move to the previous item. "Previous" button - + &Previous &önceki - + Move to the next item. "Next" button - + &Next &sonraki - + Duration: Süre: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color Renk - + Date added: - + Open in File Browser Dosya Tarayıcıda Aç - + Samplerate: - + Track BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat - + Hint: Use the Library Analyze view to run BPM detection. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &uygula - + &Cancel - + (no color) @@ -9055,7 +9120,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9257,27 +9322,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9421,38 +9486,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes - + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Check the logs for details. @@ -9460,12 +9525,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9473,18 +9538,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9492,15 +9557,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9511,57 +9576,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right sağ - + left sol - + right small - + left small - + up yukarı - + down aşağı - + up small - + down small - + Shortcut Kısa yol @@ -9569,62 +9634,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9634,22 +9699,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Çalma listesini içe aktar - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Çalma Listesi Dosyaları (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9696,27 +9761,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9776,18 +9841,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Parça bulunamadı - + Hidden Tracks Saklı parçalar - Export to Engine Prime + Export to Engine DJ @@ -9799,208 +9864,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry Tekrar dene - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help Yardım - - + + Exit Çıkış - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? Yeni bir parça yüklemek istediğinize eminmisiniz? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10016,13 +10122,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Kilitle - - + + Playlists Çalma Listeleri @@ -10032,32 +10138,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Kilidi Kaldır - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Yeni çalma listesi oluştur @@ -11548,7 +11680,7 @@ Fully right: end of the effect period - + Deck %1 Dek %1 @@ -11681,7 +11813,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11712,7 +11844,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11845,12 +11977,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11885,42 +12017,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11978,54 +12110,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Çalma Listeleri - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12160,19 +12292,19 @@ may introduce a 'pumping' effect and/or distortion. Kilitle - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12584,7 +12716,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12766,7 +12898,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Albüm kapak resim @@ -13002,197 +13134,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Çal - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13430,924 +13562,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain Sonraki zincir - + Previous Chain - + Next/Previous Chain - + Clear Temizle - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Sonraki - + Clear Unit Birimi Temizle - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Önceki - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid Beatgrid'i ayarlayın - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse Tersine çal - + Reverses track playback during regular playback. Normal çalma esnasında parçayı tersine çalar. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause Çal/Duraklat - + Jumps to the beginning of the track. Parçanın başına atlar. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14482,33 +14622,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Parçanın başından çalmayı başlatır. - + Jumps to the beginning of the track and stops. Parçanın başına atlar ve durdurur. - - + + Plays or pauses the track. Parçayı başlatır veya duraklatır. - + (while playing) (çalma anında) @@ -14528,205 +14668,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (durma anında) - + Cue Başlangıç noktası - + Headphone Kulaklık - + Mute Ses kapatma - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Speed Control Hız kontrolü - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix Mix kaydet - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit Döngüden Çık - + Turns the current loop off. - + Slip Mode Uyku Modu - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock Saat - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14771,254 +14921,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind Hızlı geri al - + Fast rewind through the track. Parçayı hızlı geri sar - + Fast Forward Hızlı ileri al - + Fast forward through the track. Parçayı hızlı ileri sar - + Jumps to the end of the track. Parçanın sonuna atlar - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat Tekrarla - + When active the track will repeat if you go past the end or reverse before the start. - + Eject Çıkar - + Ejects track from the player. Parçayı oynatıcıdan çıkarın. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve Yarı Döngü - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double Çift Döngü - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album Albüm - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -15026,12 +15176,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15039,47 +15189,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15251,47 +15396,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15415,407 +15560,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... + + + + + Search for tracks in the current library view - - Export the library to the Engine Prime format + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist - + Ctrl+n - + Create New &Crate - + Create a new crate - + Ctrl+Shift+N - - + + &View &Görünüm - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl +1 - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl +2 - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl +3 - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl +4 - + Show Cover Art Kapak remini göster - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen &Tam ekran - + Display Mixxx using the full screen - + &Options &Seçenekler - + &Vinyl Control - + Use timecoded vinyls on external turntables to control Mixxx - + Enable Vinyl Control &%1 - + &Record Mix &Mix kaydet - + Record your mix to a file - + Ctrl+R Ctrl +R - + Enable Live &Broadcasting &Canlı Yayın'ı aç - + Stream your mixes to a shoutcast or icecast server - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts &Klavye kısayollarını aç - + Toggles keyboard shortcuts on or off - + Ctrl+` Ctrl+` - + &Preferences &Tercihler - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer &Geliştirici - + &Reload Skin &Kaplamayı yeniden yükle - + Reload the skin Kaplamayı yeniden yükle - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D Ctrl+Shift+D - + &Help &Yardım - + Show Keywheel menu title - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support &Topluluk Desteği - + Get help with Mixxx Mixxx'ten yardım alın. - + &User Manual &Kullanım Kılavuzu - + Read the Mixxx user manual. Mixxx kullanım kılavuzunu okuyun. - + &Keyboard Shortcuts &Klavye kısayolları - + Speed up your workflow with keyboard shortcuts. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application &Bu uygulamayı çevir - + Help translate this application into your language. Bu uygulamayı kendi dilinize çevirmeye yardımcı olun. - + &About &Hakkında - + About the application Uygulama Hakkında @@ -15823,25 +15999,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15850,25 +16026,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Girişi temizle - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun Arama - + Clear input Girişi temizle @@ -15879,169 +16043,163 @@ This can not be undone! Ara... - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Kısa yol + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Odak + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+Backspace + + Additional Shortcuts When Focused: + - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Aramayı kapat + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Anahtar - + harmonic with %1 - + BPM BPM(Dakikalık Vuruş Sayısı) - + between %1 and %2 - + Artist Sanatçı - + Album Artist Albüm Sanatçısı - + Composer Besteci - + Title Başlık - + Album Albüm - + Grouping Grupla - + Year Yıl - + Genre Tür - + Directory - + &Search selected @@ -16049,599 +16207,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck - + Sampler - + Add to Playlist Çalma Listesine Ekle - + Crates Kutular - + Metadata - + Update external collections - + Cover Art Albüm kapak resim - + Adjust BPM - + Select Color - - + + Analyze Analiz et - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Otomatik DJ kuyruğuna ekle (alta) - + Add to Auto DJ Queue (top) Otomatik DJ kuyruğuna ekle (üste) - + Add to Auto DJ Queue (replace) Otomatik DJ Kuyruğuna Ekle (değiştir) - + Preview Deck - + Remove Kaldır - + Remove from Playlist - + Remove from Crate - + Hide from Library Kütüphane'den gizle - + Unhide from Library Kütüphane'de göster - + Purge from Library Kütüphane'den kaldır - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Özellikler - + Open in File Browser Dosya Tarayıcıda Aç - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Derecelendirme - + Cue Point - + + Hotcues Önemli işaretler - + Intro - + Outro - + Key Anahtar - + ReplayGain Yeniden kazan - + Waveform - + Comment Yorum - + All Hepsi - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM BPM'yi Kilitle - + Unlock BPM BPM Kilidini Aç - + Double BPM BPM'i ikiye katla - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Dek %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Yeni çalma listesi oluştur - + Enter name for new playlist: Yeni çalma listesini adlandır - + New Playlist Yeni çalma listesi - - - + + + Playlist Creation Failed Çalma Listesi Oluşturulamadı - + A playlist by that name already exists. Bu isimde bir çalma listesi zaten var. - + A playlist cannot have a blank name. Liste ismi boş bırakılamaz - + An unknown error occurred while creating playlist: Çalma listesi oluşturulurken bilinmeyen bir hata oluştu: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Vazgeç - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Kapat - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16657,37 +16841,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16695,37 +16879,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16733,60 +16917,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Sütunları göster/gizle + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory - + controllers - + Cannot open database Veritabanı açılamadı - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16800,67 +16989,78 @@ Mixxx SQLite desteği ile QT gerektirir. Nasıl kurulacağını öğrenmek için mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Gözat - + Export directory - + Database version - + Export - + Cancel Vazgeç - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16881,7 +17081,7 @@ Mixxx SQLite desteği ile QT gerektirir. Nasıl kurulacağını öğrenmek için mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16891,23 +17091,23 @@ Mixxx SQLite desteği ile QT gerektirir. Nasıl kurulacağını öğrenmek için mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_uk.qm b/res/translations/mixxx_uk.qm index 0dcb7dafbef65a12a832a7ce7dc797c79ce7f938..994346417e5fadf9f63075b1ae75e9233c8dc521 100644 GIT binary patch delta 376 zcmWN~JxCh?7zW_)-dw%>_F@PKnx;d`K`8_T|8U4;1&gF8B88R=MS`Vb7Z*_kQJf?s zzP2?G6+!4=AwPFHlQT_F=n%-5LhEdoE)E4pX{KjqxduXEeh)< z+cCVQ-y$4I71j+;+uKnxo~iQGU!NHK)IbJ`wr2 zue?566}d>8kq46ssv$1)q)<$=-D89*_v*n^U8HfR=9WKoEmPGD*k3uM#nBw+N*60b zOFKgCFX!9_oJU-DN8!ve-=(_4x_chwJ%&9glzd$GBybUC$CC`5Z)(r3FGY++?fFhj zq#ogfH;w8KcD!*^t{C>kP;kr%pP`_X;gUZEtB)Oj0`@SU22!Z4aW@c$dB}F4ftsJY z4;!#Qa9ZDh{fljV1ZF?gU=q$3E(AAF@$)9Q8u|RP+Z|}SGpdSc@AOt;OXQWj7in&r Qo4w5f|6GolM_0%Ce+{;WT>t<8 delta 669 zcma)&UuaTs6vxj!SG{_>rjsB-8AT?9VI}m3*d#QiLIyF}g2r0tL_rkPL5sCo4?z)@ zoCPi{7!86HoZh?Z-)%~R2@fi0 zOP7c9U7nv&=WbmGXkJz43UL6_+b+#_yS$lKKXxnqdXW~iLnzj0Qya$0Q3~k>_|_@S zqpu$22i8f_jhbrDxP$LH0JaEczwH26c9WIQVErRWybI+Iw81-Y@v>;$VPmi&lV1qq zQa?$;09G%NN*~6?JjL`blwMF#zk&@X#dfY>HA{yK(^&mMMZ}hB9y7L|llkQl@lMbE(hcxH8j=tLJNUGql;-#Gq?0kbk5jIO;lc4M z$za4EjgNan(KN#IFa5?xwY9JC9nIdOo=BtHN!7kXx1A5 diff --git a/res/translations/mixxx_uk.ts b/res/translations/mixxx_uk.ts index ada9c4306e00..5ba30009eb07 100644 --- a/res/translations/mixxx_uk.ts +++ b/res/translations/mixxx_uk.ts @@ -39,32 +39,32 @@ - + Remove Crate as Track Source - + Auto DJ Авто-DJ - + Confirmation Clear - + Do you really want to remove all tracks from the Auto DJ queue? - + This can not be undone. - + Add Crate as Track Source @@ -147,28 +147,28 @@ BasePlaylistFeature - + New Playlist Новий Плейлист - + Add to Auto DJ Queue (bottom) Додати до черги Авто-DJ (знизу) - + Create New Playlist Створити новий список відтворення - + Add to Auto DJ Queue (top) Додати до черги Авто-DJ (наверх) - + Remove Видалити @@ -178,12 +178,12 @@ Переіменувати - + Lock Заблокувати - + Duplicate Дублювати @@ -204,24 +204,24 @@ Аналізувати весь список відтворення - + Enter new name for playlist: Введіть нове ім'я для списку відтворення: - + Duplicate Playlist Дублювати список відтворення - - + + Enter name for new playlist: Введіть ім'я для нового списку відтворення: - + Export Playlist Експортувати плейлист @@ -231,70 +231,77 @@ - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist Переіменування плейлиста - - + + Renaming Playlist Failed Перейменування плейлиста не вдалося - - - + + + A playlist by that name already exists. Плейлист з таким ім'ям вже існує. - - - + + + A playlist cannot have a blank name. Плейлист не може мати пусте ім'я - + _copy //: Appendix to default name when duplicating a playlist _копія - - - - - - + + + + + + Playlist Creation Failed Не вдалося створити плейлист - - + + An unknown error occurred while creating playlist: Виникла невідома помилка при створенні плейлиста: - + Confirm Deletion - + Do you really want to delete playlist <b>%1</b>? - + M3U Playlist (*.m3u) M3U список відтворення (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Плейлист (*.m3u);;M3U8 Плейлист (*.m3u8);;PLS Плейлист (*.pls);;Text CSV (*.csv);;Звичайний текст (*.txt) @@ -302,12 +309,12 @@ BaseSqlTableModel - + # No - + Timestamp Відмітка часу @@ -315,7 +322,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Неможливо завантажити трек @@ -323,137 +330,142 @@ BaseTrackTableModel - + Album Альбом - + Album Artist Виконавець альбому - + Artist Виконавець - + Bitrate Бітрейт - + BPM BPM - + Channels Канали - + Color - + Comment Примітка - + Composer Композитор - + Cover Art Обкладинки - + Date Added Дата додавання - + Last Played - + Duration Тривалість - + Type Тип - + Genre Стиль - + Grouping Групування - + Key Тональність - + Location Розташування: - + + Overview + + + + Preview Попередній перегляд - + Rating Рейтинг - + ReplayGain - + Samplerate - + Played Зіграно - + Title Назва - + Track # Композиція № - + Year Рік - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk @@ -541,67 +553,77 @@ BrowseFeature - + Add to Quick Links - + Remove from Quick Links - + Add to Library Додати до бібліотеки - + Refresh directory tree - + Quick Links Швидкі посилання - - + + Devices Пристрої - + Removable Devices Змінні пристрої - - + + Computer - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan Сканування - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -747,87 +769,87 @@ CmdlineArgs - + Mixxx is an open source DJ software. For more information, see: - + Starts Mixxx in full-screen mode - + Use a custom locale for loading translations. (e.g 'fr') - + Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - + Path the debug statistics time line is written to - + Causes Mixxx to display/log all of the controller data it receives and script functions it loads - + The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - + Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - + Top-level directory where Mixxx should look for settings. Default is: Каталог верхнього рівня, в якому Mixxx має шукати параметри. Типово: - + Starts Auto DJ when Mixxx is launched. - + Rescans the library when Mixxx is launched. - + Use legacy vu meter - + Use legacy spinny - + Loads experimental QML GUI instead of legacy QWidget skin - + Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - + [auto|always|never] Use colors on the console output. - + Sets the verbosity of command line logging. critical - Critical/Fatal only warning - Above + Warnings @@ -837,27 +859,32 @@ trace - Above + Profiling messages - + Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - + Sets the maximum file size of the mixxx.log file in bytes. Use -1 for unlimited. The default is 100 MB as 1e5 or 100000000. - + Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - + + Overrides the default application GUI style. Possible values: %1 + + + + Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - + Preview rendered controller screens in the Setting windows. @@ -1039,13 +1066,13 @@ trace - Above + Profiling messages - + Set to full volume - + Set to zero volume @@ -1070,13 +1097,13 @@ trace - Above + Profiling messages - + Headphone listen button - + Mute button @@ -1087,25 +1114,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1146,22 +1173,22 @@ trace - Above + Profiling messages - + Toggle quantize mode - + One-time beat sync (tempo only) - + One-time beat sync (phase only) - + Toggle keylock mode @@ -1171,193 +1198,193 @@ trace - Above + Profiling messages Еквалайзери - + Vinyl Control Контроль вінілу - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Toggle vinyl-control mode (ABS/REL/CONST) - + Pass through external audio into the internal mixer - + Cues - + Cue button - + Set cue point - + Go to cue point - + Go to cue point and play - + Go to cue point and stop - + Preview from cue point - + Cue button (CDJ mode) - + Stutter cue - + Hotcues - + Set, preview from or jump to hotcue %1 - + Clear hotcue %1 - + Set hotcue %1 - + Jump to hotcue %1 - + Jump to hotcue %1 and stop - + Jump to hotcue %1 and play - + Preview from hotcue %1 - - + + Hotcue %1 - + Looping - + Loop In button - + Loop Out button - + Loop Exit button - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 - + 16 - + 32 - + 64 - + Move loop forward by %1 beats - + Move loop backward by %1 beats - + Create %1-beat loop - + Create temporary %1-beat loop roll @@ -1473,20 +1500,20 @@ trace - Above + Profiling messages - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1502,7 +1529,7 @@ trace - Above + Profiling messages - + Mute @@ -1513,7 +1540,7 @@ trace - Above + Profiling messages - + Headphone Listen @@ -1534,25 +1561,25 @@ trace - Above + Profiling messages - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1622,82 +1649,82 @@ trace - Above + Profiling messages - + Adjust Beatgrid - + Align beatgrid to current position - + Adjust Beatgrid - Match Alignment - + Adjust beatgrid to match another playing deck. - + Quantize Mode - + Sync Синхр. - + Beat Sync One-Shot - + Sync Tempo One-Shot - + Sync Phase One-Shot - + Pitch control (does not affect tempo), center is original pitch - + Pitch Adjust - + Adjust pitch from speed slider pitch - + Match musical key - + Match Key - + Reset Key - + Resets key to original @@ -1738,451 +1765,451 @@ trace - Above + Profiling messages - + Toggle Vinyl Control - + Toggle Vinyl Control (ON/OFF) - + Vinyl Control Mode - + Vinyl Control Cueing Mode - + Vinyl Control Passthrough - + Vinyl Control Next Deck - + Single deck mode - Switch vinyl control to next deck - + Cue - + Set Cue - + Go-To Cue - + Go-To Cue And Play - + Go-To Cue And Stop - + Preview Cue - + Cue (CDJ Mode) - + Stutter Cue - + Go to cue point and play after release - + Clear Hotcue %1 - + Set Hotcue %1 - + Jump To Hotcue %1 - + Jump To Hotcue %1 And Stop - + Jump To Hotcue %1 And Play - + Preview Hotcue %1 - + Loop In - + Loop Out - + Loop Exit - + Reloop/Exit Loop - + Loop Halve - + Loop Double - + 1/32 - + 1/16 - + 1/8 - + 1/4 - + Move Loop +%1 Beats - + Move Loop -%1 Beats - + Loop %1 Beats - + Loop Roll %1 Beats - + Add to Auto DJ Queue (bottom) Додати до черги Авто-DJ (знизу) - + Append the selected track to the Auto DJ Queue - + Add to Auto DJ Queue (top) Додати до черги Авто-DJ (наверх) - + Prepend selected track to the Auto DJ Queue - + Load Track Завантажити трек - + Load selected track - + Load selected track and play - - + + Record Mix - + Toggle mix recording - + Effects Ефекти - + Quick Effects - + Deck %1 Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters) - - + + Quick Effect - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next Далі - + Switch to next effect - + Previous Попередній - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + Toggle Auto DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Waveform Zoom Out @@ -2197,102 +2224,102 @@ trace - Above + Profiling messages - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed - + Playback speed control (Vinyl "Pitch" slider) - + Pitch (Musical key) - + Increase Speed - + Adjust speed faster (coarse) - + Increase Speed (Fine) - + Adjust speed faster (fine) - + Decrease Speed - + Adjust speed slower (coarse) - + Adjust speed slower (fine) - + Temporarily Increase Speed - + Temporarily increase speed (coarse) - + Temporarily Increase Speed (Fine) - + Temporarily increase speed (fine) - + Temporarily Decrease Speed - + Temporarily decrease speed (coarse) - + Temporarily Decrease Speed (Fine) - + Temporarily decrease speed (fine) @@ -2444,1041 +2471,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - + + + Sort hotcues by position + + + + + + Sort hotcues by position (remove offsets) + + + + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off Мікрофон вмк/вимк - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ Авто-DJ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. - + Start/stop recording your mix. - - + + Samplers Семплери - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Toggle 4 Decks - + Switches between showing 2 decks and 4 decks. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3593,32 +3642,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. @@ -3662,13 +3711,13 @@ trace - Above + Profiling messages CrateFeature - + Remove Видалити - + Create New Crate @@ -3678,132 +3727,132 @@ trace - Above + Profiling messages Переіменувати - - + + Lock Заблокувати - + Export Crate as Playlist - + Export Track Files - + Duplicate Дублювати - + Analyze entire Crate - + Auto DJ Track Source - + Enter new name for crate: - - + + Crates Збірки - - + + Import Crate Імпортувати збірку - + Export Crate Експортувати збірку - + Unlock Розблокувати - + An unknown error occurred while creating crate: Виникла невідома помилка під час створення збірки: - + Rename Crate Переіменувати збірку - - - Export to Engine Prime - - - - + Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - + Confirm Deletion - - + + Renaming Crate Failed Перейменування збірки не вдалося - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Плейлист (*.m3u);;M3U8 Плейлист (*.m3u8);;PLS Плейлист (*.pls);;Text CSV (*.csv);;Звичайний текст (*.txt) - + M3U Playlist (*.m3u) M3U список відтворення (*.m3u) - + Crates are a great way to help organize the music you want to DJ with. Збірки - чудовий допоміжний засіб для організування музики для ді-джеінгу. - + + + Export to Engine DJ + + + + Crates let you organize your music however you'd like! Збірки дають змогу організовувати Вашу музику так, як Ви бажаєте! - + Do you really want to delete crate <b>%1</b>? - + A crate cannot have a blank name. Збірка повинна мати назву. - + A crate by that name already exists. Збірка з такою назвою вже існує. @@ -3898,12 +3947,12 @@ trace - Above + Profiling messages Попередні автори - + Official Website - + Donate @@ -4022,72 +4071,72 @@ trace - Above + Profiling messages DlgAutoDJ - + Skip Пропустити - + Random - + Fade - + Enable Auto DJ Shortcut: Shift+F12 - + Disable Auto DJ Shortcut: Shift+F12 - + Trigger the transition to the next track Shortcut: Shift+F11 - + Skip the next track in the Auto DJ queue Shortcut: Shift+F10 - + Shuffle the content of the Auto DJ queue Shortcut: Shift+F9 - + Repeat the playlist - + Determines the duration of the transition - + Seconds Секунди - + Auto DJ Fade Modes Full Intro + Outro: @@ -4118,80 +4167,80 @@ crossfader, so that the intro starts at full volume. - + Full Intro + Outro - + Fade At Outro Start - + Full Track - + Skip Silence - + Skip Silence Start Full Volume - + Decks not used for Auto DJ must be stopped to enable Auto DJ mode. - + Repeat - + Auto DJ requires two decks assigned to opposite sides of the crossfader. - + One deck must be stopped to enable Auto DJ mode. - + Enable - + Disable - + Displays the duration and number of selected tracks. - - - + + + Auto DJ Авто-DJ - + Shuffle Перемішати - + Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. @@ -4414,37 +4463,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + Didn't get any midi messages. Please try again. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Successfully mapped control: - + <i>Ready to learn %1</i> - + Learning: %1. Now move a control on your controller. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4483,17 +4532,17 @@ You tried to learn: %1,%2 - + Log - + Search - + Stats @@ -5146,113 +5195,113 @@ associated with each key. DlgPrefController - + Apply device settings? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? - + None Не призначено - + %1 by %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings - + Are you sure you want to clear all input mappings? - + Clear Output Mappings - + Are you sure you want to clear all output mappings? @@ -5265,105 +5314,105 @@ Apply settings and continue? - + Enabled Активовано - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Опис: - + Support: Підтримка: - + Screens preview - + Input Mappings - - + + Search - - + + Add Додати - - + + Remove Видалити @@ -5378,22 +5427,22 @@ Apply settings and continue? - + Load Mapping: - + Mapping Info - + Author: - + Name: @@ -5403,28 +5452,28 @@ Apply settings and continue? - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Очистити все - + Output Mappings @@ -5583,6 +5632,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6174,62 +6233,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes - + Information Інформація - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7396,173 +7455,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Гц - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Активовано - + Stereo Стерео - + Mono Моно - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 мс - + Configuration error Помилка конфігурації @@ -7580,131 +7638,131 @@ The loudness target is approximate and assumes track pregain and main output lev Звукове API - + Sample Rate Частота дискретизації - + Audio Buffer - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode Режим основного виходу - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds - + 20 ms - + Buffer Underflow Count - + 0 - + Keylock/Pitch-Bending Engine - + Multi-Soundcard Synchronization - + Output Вихід - + Input Вхід - + System Reported Latency - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics - + Downsize your audio buffer to improve Mixxx's responsiveness. - + Query Devices Пристрої, що надсилають запити @@ -7859,27 +7917,28 @@ The loudness target is approximate and assumes track pregain and main output lev - - 1/3rd of waveform viewer + + 1/3 of waveform viewer + options for "Text height limit" - - Full waveform viewer height + + Entire waveform viewer - + OpenGL not available OpenGL не доступно - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7892,250 +7951,256 @@ The loudness target is approximate and assumes track pregain and main output lev - + Frame rate - - Displays which OpenGL version is supported by the current platform. + + OpenGL Status - - Waveform + + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate - + Visual gain - + Default zoom level Waveform zoom - + Displays the actual frame rate. - + Visual gain of the middle frequencies - + End of track warning - - OpenGL status - - - - + This functionality requires waveform acceleration. - + Highlight the waveforms when the last seconds of a track remains. - + seconds - + Low Низька - + Show minute markers on waveform overview - + Use acceleration - + High details - + Middle - + Global - + Visual gain of the high frequencies - + Visual gain of the low frequencies - + High Висока - + Global visual gain - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Enabled - + The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - Waveform overview type - - - - + fps - + Synchronize zoom level across all waveform displays. - + Synchronize zoom level across all waveforms - + Play marker hints - + Beats until next marker - + Preferred font size - + Text height limit - + Time until next marker - + Placement - + pt - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library - + Beat grid opacity - + + Scrolling Waveforms + + + + + + Type + + + + Stereo coloration - + Set amount of opacity on beat grid lines. - + % % - + Play marker position - + Moves the play marker position on the waveforms to the left, right or center (default). - + + Overview Waveforms + + + + Clear Cached Waveforms @@ -8143,47 +8208,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Звукове обладнання - + Controllers Контролери - + Library Бібліотека - + Interface Інтерфейс - + Waveforms - + Mixer Мікшер - + Auto DJ Авто-DJ - + Decks - + Colors @@ -8218,47 +8283,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Ефекти - + Recording Запис - + Beat Detection Виявлення тактів - + Key Detection Виявлення тональності - + Normalization Нормалізація - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Контроль вінілу - + Live Broadcasting Пряма трансляція - + Modplug Decoder @@ -8291,22 +8356,22 @@ Select from different types of displays for the waveform, which differ primarily - + Start Recording Почати запис - + Recording to file: - + Stop Recording Зупинити запис - + %1 MiB written in %2 @@ -8614,284 +8679,284 @@ This can not be undone! Підсумок - + Filetype: - + BPM: BPM - + Location: - + Bitrate: - + Comments - + BPM BPM - + Sets the BPM to 75% of the current value. - + 3/4 BPM - + Sets the BPM to 50% of the current value. - + Displays the BPM of the selected track. - + Track # Композиція № - + Album Artist Виконавець альбому - + Composer Композитор - + Title Назва - + Grouping Групування - + Key Тональність - + Year Рік - + Artist Виконавець - + Album Альбом - + Genre Стиль - + ReplayGain: - + Sets the BPM to 200% of the current value. - + Double BPM - + Halve BPM Навпіл BPM - + Clear BPM and Beatgrid - + Move to the previous item. "Previous" button - + &Previous - + Move to the next item. "Next" button - + &Next - + Duration: Тривалість: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Відкрити в файловому менеджері - + Samplerate: - + Track BPM: Темп треку: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. - + 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. - + Tap to Beat Настукати ритм - + Hint: Use the Library Analyze view to run BPM detection. Порада: Використовуйте вигляд Аналіз Бібліотеки щоб запустити виявлення темпу. - + Save changes and close the window. "OK" button - + &OK - + Discard changes and close the window. "Cancel" button - + Save changes and keep the window open. "Apply" button - + &Apply &Застосувати - + &Cancel &Скасувати - + (no color) @@ -9048,7 +9113,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9250,27 +9315,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) - + Rubberband (better) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9414,38 +9479,38 @@ Often results in higher quality beatgrids, but will not do well on tracks that h ITunesFeature - - + + iTunes iTunes - + Select your iTunes library Виберіть свою бібліотеку ITunes - + (loading) iTunes (завантаження) iTunes - + Use Default Library Використовувати бібліотеку за замовчуванням - + Choose Library... Виберіть бібліотеку... - + Error Loading iTunes Library Помилка при завантаженні бібліотеки ITunes - + There was an error loading your iTunes library. Check the logs for details. @@ -9453,12 +9518,12 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerColorSetting - + Change color - + Choose a new color @@ -9466,18 +9531,18 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacyControllerFileSetting - + Browse... - - + + No file selected - + Select a file @@ -9485,15 +9550,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9504,57 +9569,57 @@ Shown when VuMeter can not be displayed. Please keep - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut Скорочення @@ -9562,62 +9627,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9627,22 +9692,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Імпортувати плейлист - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Файли Плейлистів (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9689,27 +9754,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) @@ -9769,18 +9834,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks - + Hidden Tracks - Export to Engine Prime + Export to Engine DJ @@ -9792,208 +9857,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Звуковий пристрій зайнятий - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Спробувати ще</b> після закриття інших програм або повторного підключення звукового пристрою - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Змінити</b> налаштування звукових пристроїв у Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Отримайте<b>Допомогу</b> від Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Вихід</b> з Mixxx. - + Retry Повторити - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Перенастроїти - + Help Допомога - - + + Exit Вихід - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue Продовжити - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Підтвердити Вихід - + A deck is currently playing. Exit Mixxx? Дека в даний час грає. Вийти з Mixxx? - + A sampler is currently playing. Exit Mixxx? Семплер зараз грає. Вийти з Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -10009,13 +10115,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Заблокувати - - + + Playlists Плейлисти @@ -10025,32 +10131,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Розблокувати - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Create New Playlist Створити новий список відтворення @@ -11541,7 +11673,7 @@ Fully right: end of the effect period - + Deck %1 @@ -11674,7 +11806,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough Пересилання @@ -11705,7 +11837,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11838,12 +11970,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11878,42 +12010,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -11971,54 +12103,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Плейлисти - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12153,19 +12285,19 @@ may introduce a 'pumping' effect and/or distortion. Заблокувати - - + + Confirm Deletion - + Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - + Deleting %1 playlists from <b>%2</b>.<br><br> %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak @@ -12577,7 +12709,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl @@ -12759,7 +12891,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Обкладинки @@ -12995,197 +13127,197 @@ may introduce a 'pumping' effect and/or distortion. - + Adjust Beats Earlier - + When tapped, moves the beatgrid left by a small amount. - + Adjust Beats Later - + When tapped, moves the beatgrid right by a small amount. - + Tempo and BPM Tap - + Show/hide the spinning vinyl section. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Грати - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock Постійна синхронізація - + Tap to sync the tempo to other playing tracks or the sync leader. Щоб сихнронізувати темп з іншими активними доріжками чи лідером синхронізації, натисніть один раз. - + Enable Sync Leader Лідер синхронізації - + When enabled, this device will serve as the sync leader for all other decks. Коли увімкнено, цей пристрій служитиме лідером синхронізації для всіх дек. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. Тоді коли в деку лідера синхронізації завантажено доріжку зі змінним темпом, інші синхронізовані пристрої адаптуватимуться під зміни темпу. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13423,924 +13555,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - + + + + Drag a Hotcue button here to continue playing after releasing the Hotcue. + + + + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - - Dragging with Shift key pressed will not start previewing the hotcue - - - - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Зберегти банк Семплера - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Завантажити банк Семплера - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next Далі - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous Попередній - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. - - + + Adjust Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. - - + + Adjust beatgrid to match another playing deck. - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse У зворотному напрямку - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - - + + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -14475,33 +14615,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - - + + Plays or pauses the track. - + (while playing) @@ -14521,205 +14661,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) - + Cue - + Headphone Навушники - + Mute - + Old Synchronize - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Hold for at least a second to enable sync lock for this deck. Щоб увімкнути постійну синхронізацію цієї деки, затисніть принаймні на секунду. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Деки з постійною синхронізацією гратимуть з однаковим темпом, а деки, для яких також увімкнено квантування, матимуть вирівняні такти. - + Resets the key to the original track key. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Opens a menu to clear hotcues or edit their labels and colors. - + + Drag this button onto a Play button while previewing to continue playback after release. + + + + + Dragging with Shift key pressed will not start previewing the hotcue. + + + + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting Жива трансляція - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. Вимикає поточний цикл. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key The musical key of a track - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -14764,254 +14914,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Track Time - + Track Duration Тривалість треку - + Displays the duration of the loaded track. Показує тривалість завантаженого треку. - + Information is loaded from the track's metadata tags. Інформація завантажена з мета-даних треку. - + Track Artist Виконавець треку. - + Displays the artist of the loaded track. Показує виконавеця завантаженого треку. - + Track Title Назва треку - + Displays the title of the loaded track. Показує назву завантаженого треку - + Track Album Альбом треку - + Displays the album name of the loaded track. Показує альбом завантаженого треку - + Track Artist/Title Виконавець/Заголовок треку - + Displays the artist and title of the loaded track. Показує виконавця/заголовок завантаженого треку @@ -15019,12 +15169,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15032,47 +15182,42 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackExportDlg - + Export finished - + Exporting %1 - - - Overwrite Existing File? - - - "%1" already exists, overwrite? + Replace Existing File? - - &Overwrite + + "%1" already exists, replace? - - Over&write All + + &Replace - - &Skip + + Apply to all files - Skip &All + &Skip - + Export Error @@ -15244,47 +15389,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15408,407 +15553,438 @@ This can not be undone! - - E&xport Library to Engine Prime + + Search in Current View... + + + + + Search for tracks in the current library view - - Export the library to the Engine Prime format + + Ctrl+f - + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist - + Create a new playlist Створює новий плейлист - + Ctrl+n - + Create New &Crate - + Create a new crate Створює нову збірку - + Ctrl+Shift+N - - + + &View &Вигляд - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings - + Show Microphone Section - + Show the microphone section of the Mixxx interface. - + Ctrl+2 Menubar|View|Show Microphone Section - + Show Vinyl Control Section - + Show the vinyl control section of the Mixxx interface. - + Ctrl+3 Menubar|View|Show Vinyl Control Section - + Show Preview Deck - + Show the preview deck in the Mixxx interface. - + Ctrl+4 Menubar|View|Show Preview Deck - + Show Cover Art - + Show cover art in the Mixxx interface. - + Ctrl+6 Menubar|View|Show Cover Art - + Maximize Library - + Maximize the track library to take up all the available screen space. - + Space Menubar|View|Maximize Library - + &Full Screen &На весь екран - + Display Mixxx using the full screen Відображення Mixxx у повноекранному режимі - + &Options &Опції - + &Vinyl Control &Контроль Вінілу - + Use timecoded vinyls on external turntables to control Mixxx Використання таймкод-платівок на зовнішньому програвачі для контролю Mixxx - + Enable Vinyl Control &%1 - + &Record Mix &Запис Міксу - + Record your mix to a file Записати Ваш мікс у файл - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting Трансляція наж&иво - + Stream your mixes to a shoutcast or icecast server Трансляцыя ваших міксів на Shoutcast або Icecast сервер - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts К&лавіатурні скорочення - + Toggles keyboard shortcuts on or off Увімкнути чи вимкнути клавіатурні скорочення - + Ctrl+` - + &Preferences &Параметри - + Change Mixxx settings (e.g. playback, MIDI, controls) - + &Developer - + &Reload Skin - + Reload the skin - + Ctrl+Shift+R - + Developer &Tools - + Opens the developer tools dialog - + Ctrl+Shift+T - + Stats: &Experiment Bucket - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Ctrl+Shift+E - + Stats: &Base Bucket - + Enables base mode. Collects stats in the BASE tracking bucket. - + Ctrl+Shift+B - + Deb&ugger Enabled - + Enables the debugger during skin parsing - + Ctrl+Shift+D - + &Help &Допомога - + Show Keywheel menu title Колесо тональностей - + + E&xport Library to Engine DJ + "Engine DJ" must not be translated + + + + + Export the library to the Engine DJ format + + + + Show keywheel tooltip text Показати колесо тональностей - + F12 Menubar|View|Show Keywheel - + &Community Support &Підтримка співтовариства - + Get help with Mixxx - + &User Manual &Керівництво користувача - + Read the Mixxx user manual. Читати інструкцію по Mixxx. - + &Keyboard Shortcuts К&лавіатурні скорочення - + Speed up your workflow with keyboard shortcuts. Працюйте ефективніше з клавіатурними скороченнями. - + &Settings directory Каталог параметр&ів - + Open the Mixxx user settings directory. Відкрити користувацький каталог параметрів Mixxx. - + &Translate This Application &Перекласти цю програму - + Help translate this application into your language. Домопогти перекладати цю програму на Вашу мову. - + &About &Про - + About the application Про цю програму @@ -15816,25 +15992,25 @@ This can not be undone! WOverview - + Passthrough Пересилання - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15843,25 +16019,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun - + Clear input @@ -15872,169 +16036,163 @@ This can not be undone! Пошук… - + Clear the search bar input field - - Enter a string to search for + + Return - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Скорочення + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus + + Focus/Select All (Search in 'Tracks' library view) - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts - Скорочення + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus + + Delete query from history WSearchRelatedTracksMenu - + Search related Tracks - + Key Тональність - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Виконавець - + Album Artist Виконавець альбому - + Composer Композитор - + Title Назва - + Album Альбом - + Grouping Групування - + Year Рік - + Genre Стиль - + Directory - + &Search selected @@ -16042,599 +16200,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Програвач - + Sampler - + Add to Playlist Додати до Плейлиста - + Crates Збірки - + Metadata - + Update external collections - + Cover Art Обкладинки - + Adjust BPM - + Select Color - - + + Analyze Аналізувати - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Додати до черги Авто-DJ (знизу) - + Add to Auto DJ Queue (top) Додати до черги Авто-DJ (наверх) - + Add to Auto DJ Queue (replace) - + Preview Deck - + Remove Видалити - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties - + Open in File Browser Відкрити в файловому менеджері - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Рейтинг - + Cue Point - + + Hotcues - + Intro - + Outro - + Key Тональність - + ReplayGain - + Waveform - + Comment Примітка - + All Все - + + Sort hotcues by position (remove offsets) + + + + + Sort hotcues by position + + + + Lock BPM Замкнути BPM - + Unlock BPM Розімкнути BPM - + Double BPM - + Halve BPM Навпіл BPM - + 2/3 BPM - + 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Створити новий список відтворення - + Enter name for new playlist: Введіть ім'я для нового списку відтворення: - + New Playlist Новий Плейлист - - - + + + Playlist Creation Failed Не вдалося створити плейлист - + A playlist by that name already exists. Плейлист з таким ім'ям вже існує. - + A playlist cannot have a blank name. Плейлист не може мати пусте ім'я - + An unknown error occurred while creating playlist: Виникла невідома помилка при створенні плейлиста: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + + Sorting hotcues of %n track(s) by position (remove offsets) + + + + + Sorting hotcues of %n track(s) by position + + + + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Скасувати - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16650,37 +16834,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16688,37 +16872,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16726,60 +16910,65 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Показати або приховати стовпці. + + + Shuffle Tracks + + mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Виберіть каталог музичної бібліотеки - + controllers - + Cannot open database Не вдається відкрити базу даних - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16793,67 +16982,78 @@ Mixxx необхідно QT з підтримкою SQLite. Будь ласка, mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Навігація - + Export directory - + Database version - + Export Експортувати - + Cancel Скасувати - - Export Library to Engine Prime + + Export Library to Engine DJ + "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16874,7 +17074,7 @@ Mixxx необхідно QT з підтримкою SQLite. Будь ласка, mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16884,23 +17084,23 @@ Mixxx необхідно QT з підтримкою SQLite. Будь ласка, mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_vi.qm b/res/translations/mixxx_vi.qm index 6b74dd3bbb04ea02b52917e61ef73101d992069e..7eb72f8ef68434ab2f1f4b924db22e23e7084820 100644 GIT binary patch delta 18060 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 delta 14063 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 Hch&y|l#9o3 diff --git a/res/translations/mixxx_vi.ts b/res/translations/mixxx_vi.ts index c79104cd9626..2203c32114fb 100644 --- a/res/translations/mixxx_vi.ts +++ b/res/translations/mixxx_vi.ts @@ -21,52 +21,53 @@ Crates - Thùng + Crates + Enable Auto DJ - + DJ Tự động Disable Auto DJ - + Tắt Tự động DJ Clear Auto DJ Queue - + Dọn hàng đợi Tự động DJ - + Remove Crate as Track Source - Loại bỏ thùng như theo dõi nguồn + Xoá Crate làm Nguồn track nhạc - + Auto DJ Tự động DJ - + Confirmation Clear - + Xác nhận Xoá - + Do you really want to remove all tracks from the Auto DJ queue? - + Bạn có muốn xoá mọi track nhạc khỏi hàng đợi Tự động DJ không? - + This can not be undone. - + Hành động này không thể quay lại được. - + Add Crate as Track Source - Thêm thùng như theo dõi nguồn + Thêm Crate làm Nguồn track nhạc @@ -81,20 +82,20 @@ Error loading Banshee database - Lỗi tải Banshee cơ sở dữ liệu + Lỗi tải Cơ sở dữ liệu Banshee Banshee database file not found at - Banshee cơ sở dữ liệu tập tin không tìm thấy tại + Không tìm thấy tệp Cơ sở dữ liệu Banshee tại There was an error loading your Banshee database at - Đã có lỗi tải của bạn cơ sở dữ liệu Banshee tại + Lỗi tải Cơ sở dữ liệu Banshee của bạn tại @@ -103,76 +104,76 @@ Add to Auto DJ Queue (bottom) - Thêm vào hàng đợi DJ tự động (phía dưới) + Thêm vào hàng đợi DJ tự động (dưới) Add to Auto DJ Queue (top) - Thêm vào hàng đợi DJ tự động (top) + Thêm vào hàng đợi DJ Tự động (trên) Add to Auto DJ Queue (replace) - + Thêm vào hàng đợi DJ Tự động (thay thế) Import as Playlist - + Nhập thành Playlist Import as Crate - + Nhập thành Crate Crate Creation Failed - + Tạo Crate không thành cộng. Could not create crate, it most likely already exists: - + Không tạo được Crate, có thể đã có sẵn Crate đó. Playlist Creation Failed - Sáng tạo danh sách phát đã thất bại + Tạo Playlist không thành công. An unknown error occurred while creating playlist: - Lỗi không biết xảy ra trong khi tạo danh sách chơi: + Lỗi vô định khi tạo Playlist: BasePlaylistFeature - + New Playlist - Danh sách chơi mới + Playlist mới Add to Auto DJ Queue (bottom) - Thêm vào hàng đợi DJ tự động (phía dưới) + Thêm vào hàng đợi DJ Tự động (dưới) - + Create New Playlist - Tạo danh sách chơi mới + Tạo Playlist mới Add to Auto DJ Queue (top) - Thêm vào hàng đợi DJ tự động (top) + Thêm vào hàng đợi DJ Tự động (trên) Remove - Loại bỏ + Xoá @@ -187,129 +188,136 @@ Duplicate - Bản sao + Tạo bản sao - - + + Import Playlist - Chuyển nhập danh sách phát + Nhập Playlist - + Export Track Files - + Xuất file Track nhạc - + Analyze entire Playlist - Phân tích toàn bộ danh sách phát + Phân tích toàn bộ Playlist - + Enter new name for playlist: - Nhập tên mới cho danh sách chơi: + Nhập tên mới cho Playlist: - + Duplicate Playlist - Lặp lại danh sách chơi + Tạo bản sao cho Playlist - - + + Enter name for new playlist: - Nhập tên cho danh sách phát mới: + Nhập tên cho Playlist mới: - - + + Export Playlist - Xuất chuyển danh sách chơi + Xuất Playlist - + Add to Auto DJ Queue (replace) + Thêm vào hàng chờ DJ Tự động (thay thế) + + + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. - + Rename Playlist - Đổi tên danh sách chơi + Đổi tên Playlist - - + + Renaming Playlist Failed - Đổi tên danh sách phát đã thất bại + Đổi tên Playlist thất bại - - - + + + A playlist by that name already exists. - Một danh sách tên đó đã tồn tại. + Đã có Playlist tồn tại có cùng tên. - - - + + + A playlist cannot have a blank name. - Một danh sách không thể có một tên trống. + Tên Playlist không được để trống. - + _copy //: Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed - Sáng tạo danh sách phát đã thất bại + Tạo Playlist thất bại. - - + + An unknown error occurred while creating playlist: - Lỗi không biết xảy ra trong khi tạo danh sách chơi: + Lỗi vô định khi tạo playlist: - + Confirm Deletion - + Xác nhận Xoá - + Do you really want to delete playlist <b>%1</b>? - + Bạn có muốn xoá Playlist <b>%1</b>? - + M3U Playlist (*.m3u) - + Playlist M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - M3U danh sách bài hát (*.m3u); M3U8 danh sách bài hát (*.m3u8); PLS danh sách bài hát (* .pls); Văn bản CSV (*.csv); Có thể đọc được văn bản (*.txt) + Playlist M3U (*.m3u); playlist M3U8 (*.m3u8); playlist PLS (* .pls); Văn bản CSV (*.csv); Văn bản dạng đọc (*.txt) BaseSqlTableModel - + # # - + Timestamp Dấu thời gian @@ -317,148 +325,153 @@ BaseTrackPlayerImpl - + Couldn't load track. - Không thể nạp theo dõi. + Không thể load track nhạc. BaseTrackTableModel - + Album Album - + Album Artist - Album nghệ sĩ + Nghệ sĩ của Album - + Artist Nghệ sĩ - + Bitrate Bitrate - + BPM BPM - + Channels Kênh - + Color - + Màu - + Comment Bình luận - + Composer Nhà soạn nhạc - + Cover Art - Bìa + Ảnh bìa - + Date Added Ngày thêm vào - + Last Played - + Lần cuối phát - + Duration - Thời gian + Độ dài - + Type Loại - + Genre Thể loại - + Grouping Nhóm - + Key - Chìa khóa + Khoá - + Location Vị trí - + + Overview + Tổng quan + + + Preview Xem trước - + Rating Đánh giá - + ReplayGain - + ReplayGain (Âm lượng Phát lại) - + Samplerate - + Samplerate - + Played - Chơi + Đã phát - + Title Tiêu đề - + Track # - Theo dõi # + STT Track # - + Year Năm - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk - + Đang tải hình ảnh ... @@ -466,12 +479,12 @@ Action failed - + Tác vụ thất bại Please enable at least one connection to use Live Broadcasting. - + Vui lòng bật ít nhất một kết nối để dùng Phát Trực tiếp. @@ -479,22 +492,22 @@ Can't use secure password storage: keychain access failed. - + Không thể dùng kho lưu trữ mật khẩu bảo mật: không truy cập được keychain. Secure password retrieval unsuccessful: keychain access failed. - + Không thể truy xuất mật khẩu bảo mật: không truy cập được keychain. Settings error - + Lỗi Cài đặt <b>Error with settings for '%1':</b><br> - + <b>Lỗi Cài đặt cho '%1':</b><br> @@ -502,7 +515,7 @@ Enabled - Kích hoạt + Bật @@ -512,96 +525,106 @@ Status - + Trạng thái Disconnected - + Đã ngắt kết nôi Connecting... - + Đang kết nối... Connected - + Đã kết nối Failed - + Thất bại Unknown - + Vô định BrowseFeature - + Add to Quick Links - Thêm vào liên kết nhanh + Thêm vào Liên kết Nhanh - + Remove from Quick Links - Loại bỏ từ liên kết nhanh + Xoá khỏi Liên kết Nhanh - + Add to Library - Thêm vào thư viện + Thêm vào Thư viện - + Refresh directory tree - + Làm mới Cây Thư mục - + Quick Links - Liên kết nhanh + Liên kết Nhanh - - + + Devices Thiết bị - + Removable Devices - Thiết bị di động + Thiết bị Di động - - + + Computer - + Máy tính - + Music Directory Added - Âm nhạc thư mục bổ sung + Đường dẫn nguồn Nhạc đã được thêm - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - Bạn đã thêm vào một hoặc nhiều thư mục âm nhạc. Các bài hát trong những thư mục này sẽ không có sẵn cho đến khi bạn tại thư viện của bạn. Bạn có muốn tại bây giờ không? + Bạn đã thêm vào một hoặc nhiều thư mục nhạc. Các bài nhạc trong những thư mục này sẽ không hiện cho dến khi bạn quét lại thư viện của bạn. Bạn có muốn quét bây giờ không? - + Scan Quét - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. + Mục "Máy tính" giúp tìm kiếm, xem trước và tải track nhạc từ các thư mục trong ổ cứng và thiết bị lưu trữ ngoài. + + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. @@ -635,7 +658,7 @@ Track # - Theo dõi # + STT Track # @@ -660,7 +683,7 @@ Duration - Thời gian + Độ dài @@ -1046,13 +1069,13 @@ trace - Above + Profiling messages - + Set to full volume Thiết lập để khối lượng đầy đủ - + Set to zero volume Thiết lập số không khối lượng @@ -1077,13 +1100,13 @@ trace - Above + Profiling messages Đảo ngược nút cuộn (kiểm duyệt) - + Headphone listen button Tai nghe nghe nút - + Mute button Nút tắt @@ -1094,25 +1117,25 @@ trace - Above + Profiling messages - + Mix orientation (e.g. left, right, center) Trộn định hướng (ví dụ: trái, phải, Trung tâm) - + Set mix orientation to left Thiết lập kết hợp định hướng bên trái - + Set mix orientation to center Thiết lập kết hợp định hướng đến Trung tâm - + Set mix orientation to right Thiết lập kết hợp định hướng sang phải @@ -1153,22 +1176,22 @@ trace - Above + Profiling messages BPM tap nút - + Toggle quantize mode Bật/tắt quantize chế độ - + One-time beat sync (tempo only) Một lần đánh bại đồng bộ (nhịp độ) - + One-time beat sync (phase only) Một lần đánh bại đồng bộ (chỉ giai đoạn) - + Toggle keylock mode Bật tắt chế độ khóa bàn phím @@ -1178,193 +1201,193 @@ trace - Above + Profiling messages Equalizers - + Vinyl Control Vinyl kiểm soát - + Toggle vinyl-control cueing mode (OFF/ONE/HOT) Bật tắt chế độ cueing vinyl kiểm soát (OFF/1/bể) - + Toggle vinyl-control mode (ABS/REL/CONST) Bật tắt chế độ kiểm soát vinyl (ABS/REL/XD) - + Pass through external audio into the internal mixer Đi qua âm thanh bên ngoài vào máy trộn nội bộ - + Cues Tín hiệu - + Cue button Cue nút - + Set cue point Thiết lập cue điểm - + Go to cue point Đi đến cue điểm - + Go to cue point and play Đi đến cue điểm và chơi - + Go to cue point and stop Đi để ghi chú vào điểm và ngừng - + Preview from cue point Xem trước từ cue điểm - + Cue button (CDJ mode) Cue nút (CDJ chế độ) - + Stutter cue Nói lắp cue - + Hotcues Hotcues - + Set, preview from or jump to hotcue %1 Thiết lập, xem trước từ hoặc nhảy để hotcue %1 - + Clear hotcue %1 Rõ ràng hotcue %1 - + Set hotcue %1 Thiết lập hotcue %1 - + Jump to hotcue %1 Chuyển đến hotcue %1 - + Jump to hotcue %1 and stop Chuyển đến hotcue %1 và dừng - + Jump to hotcue %1 and play Chuyển đến hotcue %1 và chơi - + Preview from hotcue %1 Xem trước từ hotcue %1 - - + + Hotcue %1 Hotcue %1 - + Looping Looping - + Loop In button Vòng lặp trong nút - + Loop Out button Vòng lặp trong nút - + Loop Exit button Vòng ra nút - + 1/2 1/2 - + 1 1 - + 2 2 - + 4 4 - + 8 8 - + 16 16 - + 32 32 - + 64 64 - + Move loop forward by %1 beats Di chuyển vòng về phía trước bởi %1 nhịp đập - + Move loop backward by %1 beats Di chuyển vòng quay trở lại bởi nhịp đập %1 - + Create %1-beat loop Tạo đánh bại %1 loop - + Create temporary %1-beat loop roll Tạo tạm thời đánh bại %1 vòng cuộn @@ -1480,20 +1503,20 @@ trace - Above + Profiling messages - - + + Volume Fader Khối lượng đổi - + Full Volume Khối lượng đầy đủ - + Zero Volume Khối lượng không @@ -1509,7 +1532,7 @@ trace - Above + Profiling messages - + Mute Tắt tiếng @@ -1520,7 +1543,7 @@ trace - Above + Profiling messages - + Headphone Listen Tai nghe nghe @@ -1541,25 +1564,25 @@ trace - Above + Profiling messages - + Orientation Định hướng - + Orient Left Định hướng trái - + Orient Center Trung tâm phương đông - + Orient Right Định hướng bên phải @@ -1629,82 +1652,82 @@ trace - Above + Profiling messages Điều chỉnh beatgrid ở bên phải - + Adjust Beatgrid Điều chỉnh Beatgrid - + Align beatgrid to current position Sắp xếp beatgrid đến vị trí hiện tại - + Adjust Beatgrid - Match Alignment Điều chỉnh Beatgrid - trận đấu liên kết - + Adjust beatgrid to match another playing deck. Điều chỉnh beatgrid để phù hợp với một sân chơi. - + Quantize Mode Quantize chế độ - + Sync Đồng bộ - + Beat Sync One-Shot Đánh bại đồng bộ một-shot - + Sync Tempo One-Shot Tiến độ đồng bộ một-shot - + Sync Phase One-Shot Giai đoạn đồng bộ một-shot - + Pitch control (does not affect tempo), center is original pitch Sân kiểm soát (không ảnh hưởng đến tiến độ), Trung tâm là ban đầu pitch - + Pitch Adjust Điều chỉnh pitch - + Adjust pitch from speed slider pitch Điều chỉnh pitch từ tốc độ trượt Sân - + Match musical key Phù hợp với âm nhạc khóa - + Match Key Phù hợp với phím - + Reset Key Thiết lập lại phím - + Resets key to original Đặt lại chìa khóa để ban đầu @@ -1745,451 +1768,451 @@ trace - Above + Profiling messages Thấp EQ - + Toggle Vinyl Control Bật tắt Vinyl kiểm soát - + Toggle Vinyl Control (ON/OFF) Bật tắt Vinyl kiểm soát (ON/OFF) - + Vinyl Control Mode Vinyl kiểm soát chế độ - + Vinyl Control Cueing Mode Vinyl kiểm soát Cueing chế độ - + Vinyl Control Passthrough Vinyl kiểm soát Passthrough - + Vinyl Control Next Deck Vinyl kiểm soát tiếp theo sàn - + Single deck mode - Switch vinyl control to next deck Chế độ tầng - chuyển đổi vinyl kiểm soát đến tầng tiếp theo - + Cue Cue - + Set Cue Thiết lập Cue - + Go-To Cue Go To Cue - + Go-To Cue And Play Go To Cue và chơi - + Go-To Cue And Stop Go To Cue và dừng - + Preview Cue Xem trước Cue - + Cue (CDJ Mode) Cue (CDJ chế độ) - + Stutter Cue Nói lắp Cue - + Go to cue point and play after release - + Clear Hotcue %1 Rõ ràng Hotcue %1 - + Set Hotcue %1 Thiết lập Hotcue %1 - + Jump To Hotcue %1 Chuyển đến Hotcue %1 - + Jump To Hotcue %1 And Stop Chuyển đến Hotcue %1 và dừng - + Jump To Hotcue %1 And Play Chuyển đến Hotcue %1 và chơi - + Preview Hotcue %1 Xem trước Hotcue %1 - + Loop In Vòng lặp trong - + Loop Out Vòng lặp trong - + Loop Exit Thoát khỏi vòng lặp - + Reloop/Exit Loop Reloop/thoát khỏi vòng lặp - + Loop Halve Loop giảm một nửa - + Loop Double Vòng lặp đôi - + 1/32 1/32 - + 1/16 1/16 - + 1/8 1/8 - + 1/4 1/4 - + Move Loop +%1 Beats Di chuyển vòng lặp + %1 nhịp đập - + Move Loop -%1 Beats Di chuyển vòng lặp-nhịp đập %1 - + Loop %1 Beats Nhịp đập vòng %1 - + Loop Roll %1 Beats Loop Roll %1 nhịp đập - + Add to Auto DJ Queue (bottom) Thêm vào hàng đợi DJ tự động (phía dưới) - + Append the selected track to the Auto DJ Queue Gắn tiếp theo dõi được chọn vào xếp hàng DJ tự động - + Add to Auto DJ Queue (top) Thêm vào hàng đợi DJ tự động (top) - + Prepend selected track to the Auto DJ Queue Thêm các ca khúc được chọn để xếp hàng DJ tự động - + Load Track Theo dõi tải - + Load selected track Tải được chọn theo dõi - + Load selected track and play Tải được chọn theo dõi và chơi - - + + Record Mix Ghi kết hợp - + Toggle mix recording Chuyển đổi kết hợp ghi âm - + Effects Hiệu ứng - + Quick Effects Tác dụng nhanh chóng - + Deck %1 Quick Effect Super Knob Sàn %1 có hiệu lực nhanh chóng siêu Knob - + Quick Effect Super Knob (control linked effect parameters) Nhanh chóng có hiệu lực Super Knob (điều khiển liên kết có hiệu lực tham số) - - + + Quick Effect Có hiệu lực nhanh chóng - + Clear Unit Rõ ràng đơn vị - + Clear effect unit Đơn vị có hiệu lực rõ ràng - + Toggle Unit Chuyển đổi đơn vị - + Dry/Wet Giặt/ướt - + Adjust the balance between the original (dry) and processed (wet) signal. Điều chỉnh sự cân bằng giữa bản gốc (khô) và xử lý tín hiệu (ướt). - + Super Knob Siêu Knob - + Next Chain Tiếp theo chuỗi - + Assign Chỉ định - + Clear Rõ ràng - + Clear the current effect Rõ ràng các hiệu ứng hiện tại - + Toggle Chuyển đổi - + Toggle the current effect Chuyển đổi có hiệu lực hiện tại - + Next Tiếp theo - + Switch to next effect Chuyển sang kế tiếp có hiệu lực - + Previous Trước đó - + Switch to the previous effect Chuyển đổi để có hiệu lực trước đó - + Next or Previous Kế tiếp hoặc trước đó - + Switch to either next or previous effect Chuyển sang kế tiếp hoặc trước đó có hiệu lực - - + + Parameter Value Giá trị tham số - - + + Microphone Ducking Strength Micro Ducking sức mạnh - + Microphone Ducking Mode Micro Ducking chế độ - + Gain Đạt được - + Gain knob Đạt được knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle Tự động bật/tắt DJ - + Toggle Auto DJ On/Off Chuyển đổi tự động DJ On/Off - + Show/hide the microphone & auxiliary section - + 4 Effect Units Show/Hide - + Switches between showing 2 and 4 effect units - + Mixer Show/Hide - + Show or hide the mixer. Hiện hoặc ẩn bộ trộn. - + Cover Art Show/Hide (Library) - + Show/hide cover art in the library - + Library Maximize/Restore Thư viện tối đa hóa/khôi phục lại - + Maximize the track library to take up all the available screen space. Tối đa hóa thư viện theo dõi để mất tất cả không gian màn hình có sẵn. - + Effect Rack Show/Hide Có hiệu lực Rack Hiển thị/ẩn - + Show/hide the effect rack Hiển thị/ẩn các rack có hiệu lực - + Waveform Zoom Out Dạng sóng thu nhỏ @@ -2204,102 +2227,102 @@ trace - Above + Profiling messages Tai nghe được - + Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + One-time beat sync tempo (and phase with quantize enabled) - + Playback Speed Tốc độ phát lại - + Playback speed control (Vinyl "Pitch" slider) Kiểm soát tốc độ phát lại (Vinyl "Cắm" trượt) - + Pitch (Musical key) Pitch (âm nhạc phím) - + Increase Speed Tăng tốc độ - + Adjust speed faster (coarse) Điều chỉnh tốc độ nhanh hơn (thô) - + Increase Speed (Fine) Tăng tốc độ (Mỹ) - + Adjust speed faster (fine) Điều chỉnh tốc độ nhanh hơn (Mỹ) - + Decrease Speed Giảm tốc độ - + Adjust speed slower (coarse) Điều chỉnh tốc độ chậm hơn (thô) - + Adjust speed slower (fine) Điều chỉnh tốc độ chậm hơn (Mỹ) - + Temporarily Increase Speed Tạm thời tăng tốc độ - + Temporarily increase speed (coarse) Tạm thời tăng tốc độ (thô) - + Temporarily Increase Speed (Fine) Tạm thời tăng tốc độ (Mỹ) - + Temporarily increase speed (fine) Tạm thời tăng tốc độ (Mỹ) - + Temporarily Decrease Speed Tạm thời giảm tốc độ - + Temporarily decrease speed (coarse) Tạm thời giảm tốc độ (thô) - + Temporarily Decrease Speed (Fine) Tạm thời giảm tốc độ (Mỹ) - + Temporarily decrease speed (fine) Tạm thời giảm tốc độ (Mỹ) @@ -2451,1053 +2474,1063 @@ trace - Above + Profiling messages - - + + Move Beatgrid Half a Beat + + + + + Adjust the beatgrid by exactly one half beat. Usable only for tracks with constant tempo. + + + + + Toggle the BPM/beatgrid lock - + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - + Sync / Sync Lock - + Internal Sync Leader - + Toggle Internal Sync Leader - - + + Internal Leader BPM - + Internal Leader BPM +1 - + Increase internal Leader BPM by 1 - + Internal Leader BPM -1 - + Decrease internal Leader BPM by 1 - + Internal Leader BPM +0.1 - + Increase internal Leader BPM by 0.1 - + Internal Leader BPM -0.1 - + Decrease internal Leader BPM by 0.1 - + Sync Leader - + Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - + Speed - + Decrease Speed (Fine) - + Pitch (Musical Key) - + Increase Pitch - + Increases the pitch by one semitone - + Increase Pitch (Fine) - + Increases the pitch by 10 cents - + Decrease Pitch - + Decreases the pitch by one semitone - + Decrease Pitch (Fine) - + Decreases the pitch by 10 cents - + Keylock - + CUP (Cue + Play) - + Shift cue points earlier - + Shift cue points 10 milliseconds earlier - + Shift cue points earlier (fine) - + Shift cue points 1 millisecond earlier - + Shift cue points later - + Shift cue points 10 milliseconds later - + Shift cue points later (fine) - + Shift cue points 1 millisecond later - - + + Sort hotcues by position - - + + Sort hotcues by position (remove offsets) - + Hotcues %1-%2 - + Intro / Outro Markers - + Intro Start Marker - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + intro start marker - + intro end marker - + outro start marker - + outro end marker - + Activate %1 [intro/outro marker - + Jump to or set the %1 [intro/outro marker - + Set %1 [intro/outro marker - + Set or jump to the %1 [intro/outro marker - + Clear %1 [intro/outro marker - + Clear the %1 [intro/outro marker - + if the track has no beats the unit is seconds - + Loop Selected Beats - + Create a beat loop of selected beat size - + Loop Roll Selected Beats - + Create a rolling beat loop of selected beat size - + Loop %1 Beats set from its end point - + Loop Roll %1 Beats set from its end point - + Create %1-beat loop with the current play position as loop end - + Create temporary %1-beat loop roll with the current play position as loop end - + Loop Beats - + Loop Roll Beats - + Go To Loop In - + Go to Loop In button - + Go To Loop Out - + Go to Loop Out button - + Toggle loop on/off and jump to Loop In point if loop is behind play position - + Reloop And Stop - + Enable loop, jump to Loop In point, and stop - + Halve the loop length - + Double the loop length - + Beat Jump / Loop Move - + Jump / Move Loop Forward %1 Beats - + Jump / Move Loop Backward %1 Beats - + Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Beat Jump / Loop Move Forward Selected Beats - + Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Beat Jump / Loop Move Backward Selected Beats - + Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Beat Jump - + Indicate which loop marker remain static when adjusting the size or is inherited from the current position - + Beat Jump / Loop Move Forward - + Beat Jump / Loop Move Backward - + Loop Move Forward - + Loop Move Backward - + Remove Temporary Loop - + Remove the temporary loop - + Navigation - + Move up - + Equivalent to pressing the UP key on the keyboard - + Move down - + Equivalent to pressing the DOWN key on the keyboard - + Move up/down - + Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Scroll Up - + Equivalent to pressing the PAGE UP key on the keyboard - + Scroll Down - + Equivalent to pressing the PAGE DOWN key on the keyboard - + Scroll up/down - + Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Move left - + Equivalent to pressing the LEFT key on the keyboard - + Move right - + Equivalent to pressing the RIGHT key on the keyboard - + Move left/right - + Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Move focus to right pane - + Equivalent to pressing the TAB key on the keyboard - + Move focus to left pane - + Equivalent to pressing the SHIFT+TAB key on the keyboard - + Move focus to right/left pane - + Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Sort focused column - + Sort the column of the cell that is currently focused, equivalent to clicking on its header - + Go to the currently selected item - + Choose the currently selected item and advance forward one pane if appropriate - + Load Track and Play - + Add to Auto DJ Queue (replace) - + Replace Auto DJ Queue with selected tracks - + Select next search history - + Selects the next search history entry - + Select previous search history - + Selects the previous search history entry - + Move selected search entry - + Moves the selected search history item into given direction and steps - + Clear search - + Clears the search query - - + + Select Next Color Available - + Select the next color in the color palette for the first selected track - - + + Select Previous Color Available - + Select the previous color in the color palette for the first selected track - + Deck %1 Quick Effect Enable Button - + Quick Effect Enable Button - + Enable or disable effect processing Kích hoạt hoặc vô hiệu hoá hiệu ứng xử lý - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset Tiếp theo chuỗi cài sẵn - + Previous Chain Chuỗi trước - + Previous chain preset Trước chuỗi cài sẵn - + Next/Previous Chain Kế tiếp/trước Chuỗi - + Next or previous chain preset Kế tiếp hoặc trước đó chuỗi cài sẵn - - + + Show Effect Parameters - + Effect Unit Assignment - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - - + + Button Parameter Value - + Microphone / Auxiliary Micro / phụ trợ - + Microphone On/Off Micro baät/taét - + Microphone on/off Micro baät/taét - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) Bật/tắt Micro ducking chế độ (OFF, tự động, hướng dẫn sử dụng) - + Auxiliary On/Off Liên minh baät/taét - + Auxiliary on/off Liên minh baät/taét - + Auto DJ Tự động DJ - + Auto DJ Shuffle Tự động DJ Shuffle - + Auto DJ Skip Next Tự động DJ bỏ qua tiếp theo - + Auto DJ Add Random Track - + Add a random track to the Auto DJ queue - + Auto DJ Fade To Next Tự động DJ phai để tiếp theo - + Trigger the transition to the next track Kích hoạt sự chuyển đổi sang bài hát kế tiếp - + User Interface Giao diện người dùng - + Samplers Show/Hide Samplers Hiển thị/ẩn - + Show/hide the sampler section Hiển thị/ẩn phần sampler - + Microphone && Auxiliary Show/Hide keep double & to prevent creation of keyboard accelerator - + Waveform Zoom Reset To Default - + Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - + Select the next color in the color palette for the loaded track. - + Select previous color in the color palette for the loaded track. - + Navigate Through Track Colors - + Select either next or previous color in the palette for the loaded track. - + Start/Stop Live Broadcasting - + Stream your mix over the Internet. Dòng hỗn hợp của bạn qua Internet. - + Start/stop recording your mix. - - + + Samplers - + Vinyl Control Show/Hide Vinyl kiểm soát Hiển thị/ẩn - + Show/hide the vinyl control section Hiển thị/ẩn phần kiểm soát vinyl - + Preview Deck Show/Hide Xem trước sàn Hiển thị/ẩn - + Show/hide the preview deck Hiển thị/ẩn tầng xem trước - + Toggle 4 Decks Bật tắt 4 sàn - + Switches between showing 2 decks and 4 decks. Thiết bị chuyển mạch giữa Hiển thị 2 sàn và 4 sàn. - + Cover Art Show/Hide (Decks) - + Show/hide cover art in the main decks - + Vinyl Spinner Show/Hide Vinyl Spinner Hiển thị/ẩn - + Show/hide spinning vinyl widget Hiển thị/ẩn quay vinyl Tiện ích - + Vinyl Spinners Show/Hide (All Decks) - + Show/Hide all spinnies - + Toggle Waveforms - + Show/hide the scrolling waveforms. - + Waveform zoom Thu phóng dạng sóng - + Waveform Zoom Thu phóng dạng sóng - + Zoom waveform in Phóng to dạng sóng - + Waveform Zoom In Dạng sóng phóng to - + Zoom waveform out Thu nhỏ dạng sóng - + Star Rating Up - + Increase the track rating by one star - + Star Rating Down - + Decrease the track rating by one star @@ -3612,32 +3645,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. - + You can ignore this error for this session but you may experience erratic behavior. - + Try to recover by resetting your controller. Cố gắng phục hồi bằng cách đặt lại trình điều khiển. - + Controller Mapping Error - + The mapping for your controller "%1" is not working properly. - + The script code needs to be fixed. Mã kịch bản cần phải được cố định. @@ -3745,7 +3778,7 @@ trace - Above + Profiling messages Nhập khẩu thùng - + Export Crate Xuất khẩu thùng @@ -3755,7 +3788,7 @@ trace - Above + Profiling messages Mở khóa - + An unknown error occurred while creating crate: Lỗi không biết xảy ra trong khi tạo thùng: @@ -3764,12 +3797,6 @@ trace - Above + Profiling messages Rename Crate Đổi tên thùng - - - - Export to Engine Prime - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. @@ -3787,17 +3814,17 @@ trace - Above + Profiling messages Đổi tên thùng thất bại - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U danh sách bài hát (*.m3u); M3U8 danh sách bài hát (*.m3u8); PLS danh sách bài hát (* .pls); Văn bản CSV (*.csv); Có thể đọc được văn bản (*.txt) - + M3U Playlist (*.m3u) M3U danh sách bài hát (*.m3u) @@ -3806,6 +3833,12 @@ trace - Above + Profiling messages Crates are a great way to help organize the music you want to DJ with. Thùng là một cách tuyệt vời để giúp tổ chức nhạc bạn muốn DJ với. + + + + Export to Engine DJ + + Crates let you organize your music however you'd like! @@ -3917,12 +3950,12 @@ trace - Above + Profiling messages Trong quá khứ những người đóng góp - + Official Website - + Donate @@ -4434,37 +4467,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h Nếu ánh xạ không làm việc cố gắng bật một tùy chọn nâng cao dưới đây và sau đó cố gắng kiểm soát một lần nữa. Hoặc bấm thử lại để redetect kiểm soát midi. - + Didn't get any midi messages. Please try again. Đã không nhận được bất kỳ tin nhắn midi. Xin vui lòng thử lại. - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. Không thể phát hiện một bản đồ--xin vui lòng thử lại. Hãy chắc chắn để chỉ liên lạc một điều khiển cùng một lúc. - + Successfully mapped control: Thành công lập bản đồ kiểm soát: - + <i>Ready to learn %1</i> <i>Sẵn sàng để tìm hiểu %1</i> - + Learning: %1. Now move a control on your controller. Học tập: %1. Bây giờ di chuyển một điều khiển trên bộ điều khiển của bạn. - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -4503,17 +4536,17 @@ You tried to learn: %1,%2 - + Log Đăng nhập - + Search Tìm - + Stats Số liệu thống kê @@ -5166,114 +5199,114 @@ associated with each key. DlgPrefController - + Apply device settings? Áp dụng thiết đặt? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? Cài đặt của bạn phải được áp dụng trước khi bắt đầu thuật sĩ học tập. Áp dụng thiết đặt và tiếp tục? - + None Không có - + %1 by %2 %1 bởi %2 - + Mapping has been edited - + Always overwrite during this session - + Save As - + Overwrite - + Save user mapping - + Enter the name for saving the mapping to the user folder. - + Saving mapping failed - + A mapping cannot have a blank name and may not contain special characters. - + A mapping file with that name already exists. - + Do you want to save the changes? - + Troubleshooting Giải đáp thắc mắc - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - + Mapping already exists. - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - + Clear Input Mappings Rõ ràng đầu vào ánh xạ - + Are you sure you want to clear all input mappings? Bạn có chắc bạn muốn xóa tất cả các ánh xạ đầu vào không? - + Clear Output Mappings Rõ ràng sản lượng ánh xạ - + Are you sure you want to clear all output mappings? Bạn có chắc bạn muốn xóa tất cả ra ánh xạ? @@ -5291,100 +5324,100 @@ Apply settings and continue? Kích hoạt - + Device Info - + Physical Interface: - + Vendor name: - + Product name: - + Vendor ID - + VID: - + Product ID - + PID: - + Serial number: - + USB interface number: - + HID Usage-Page: - + HID Usage: - + Description: Trò chơi mô tả: - + Support: Hỗ trợ: - + Screens preview - + Input Mappings Ánh xạ đầu vào - - + + Search Tìm - - + + Add Thêm - - + + Remove Loại bỏ @@ -5404,17 +5437,17 @@ Apply settings and continue? - + Mapping Info - + Author: Tác giả: - + Name: Tên: @@ -5424,28 +5457,28 @@ Apply settings and continue? Thuật sĩ học tập (MIDI chỉ) - + Data protocol: - + Mapping Files: - + Mapping Settings - - + + Clear All Xóa tất cả - + Output Mappings Ánh xạ đầu ra @@ -5604,6 +5637,16 @@ Apply settings and continue? Multi-Sampling + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6195,62 +6238,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. Kích thước tối thiểu của vẻ ngoài đã chọn là lớn hơn độ phân giải màn hình của bạn. - + Allow screensaver to run - + Prevent screensaver from running - + Prevent screensaver while playing - + Disabled - + 2x MSAA - + 4x MSAA - + 8x MSAA - + 16x MSAA - + This skin does not support color schemes Da này không hỗ trợ phối màu - + Information Thông tin - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. @@ -7417,173 +7460,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) Mặc định (dài sự chậm trễ) - + Experimental (no delay) Thử nghiệm (có sự chậm trễ) - + Disabled (short delay) Khuyết tật (sự chậm trễ ngắn) - + Soundcard Clock - + Network Clock - + Direct monitor (recording and broadcasting only) - + Disabled Khuyết tật - + Enabled Kích hoạt - + Stereo Âm thanh nổi - + Mono Mono - + To enable Realtime scheduling (currently disabled), see the %1. - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. - + Mixxx DJ Hardware Guide - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) - + 2048 frames/period - + 4096 frames/period - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + Main output only - + Main and booth outputs - + %1 ms %1 ms - + Configuration error Lỗi cấu hình @@ -7601,131 +7643,131 @@ The loudness target is approximate and assumes track pregain and main output lev Âm thanh API - + Sample Rate Tốc độ Lấy mẫu - + Audio Buffer Âm thanh bộ đệm - + Engine Clock - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Main Mix - + Main Output Mode - + Microphone Monitor Mode - + Microphone Latency Compensation - - - - + + + + ms milliseconds MS - + 20 ms 20 ms - + Buffer Underflow Count Bộ đệm Underflow tính - + 0 0 - + Keylock/Pitch-Bending Engine Khóa bàn phím/Pitch-uốn động cơ - + Multi-Soundcard Synchronization Đồng bộ hóa đa-Soundcard - + Output Đầu ra - + Input Đầu vào - + System Reported Latency Hệ thống báo cáo trễ - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. Phóng to đệm âm thanh của bạn nếu truy cập underflow đang gia tăng hoặc bạn nghe hiện ra trong khi phát lại. - + Main Output Delay - + Headphone Output Delay - + Booth Output Delay - + Dual-threaded Stereo - + Hints and Diagnostics Gợi ý và chẩn đoán - + Downsize your audio buffer to improve Mixxx's responsiveness. Giảm bớt đệm âm thanh của bạn để cải thiện để đáp ứng của Mixxx. - + Query Devices Thiết bị truy vấn @@ -8171,47 +8213,47 @@ Select from different types of displays for the waveform, which differ primarily DlgPreferences - + Sound Hardware Phần cứng âm thanh - + Controllers Bộ điều khiển - + Library Thư viện - + Interface Giao diện - + Waveforms - + Mixer Máy trộn - + Auto DJ Tự động DJ - + Decks - + Colors @@ -8246,47 +8288,47 @@ Select from different types of displays for the waveform, which differ primarily - + Effects Hiệu ứng - + Recording Ghi âm - + Beat Detection Đánh bại phát hiện - + Key Detection Phát hiện quan trọng - + Normalization Bình thường hóa - + <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - + Vinyl Control Vinyl kiểm soát - + Live Broadcasting Sống phát thanh truyền - + Modplug Decoder Bộ giải mã Modplug @@ -8642,284 +8684,284 @@ This can not be undone! Tóm tắt - + Filetype: Loại tệp: - + BPM: BPM: - + Location: Địa điểm: - + Bitrate: Tần số: - + Comments Ý kiến - + BPM BPM - + Sets the BPM to 75% of the current value. Thiết lập BPM đến 75% của giá trị hiện tại. - + 3/4 BPM 3/4 BPM - + Sets the BPM to 50% of the current value. Thiết lập BPM 50% của giá trị hiện tại. - + Displays the BPM of the selected track. Hiển thị BPM đường đã chọn. - + Track # Theo dõi # - + Album Artist Album nghệ sĩ - + Composer Nhà soạn nhạc - + Title Tiêu đề - + Grouping Nhóm - + Key Chìa khóa - + Year Năm - + Artist Nghệ sĩ - + Album Album - + Genre Thể loại - + ReplayGain: - + Sets the BPM to 200% of the current value. Thiết lập BPM 200% giá trị hiện tại. - + Double BPM Đôi BPM - + Halve BPM Giảm một nửa BPM - + Clear BPM and Beatgrid Rõ ràng BPM và Beatgrid - + Move to the previous item. "Previous" button Di chuyển đến mục trước. - + &Previous & Trước - + Move to the next item. "Next" button Di chuyển đến mục kế tiếp. - + &Next & Tiếp theo - + Duration: Thời gian: - + Import Metadata from MusicBrainz - + Re-Import Metadata from file - + Color - + Date added: - + Open in File Browser Mở trong trình duyệt tập tin - + Samplerate: - + Track BPM: Theo dõi BPM: - + Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Assume constant tempo - + Sets the BPM to 66% of the current value. Thiết lập BPM 66% của giá trị hiện tại. - + 2/3 BPM 2/3 BPM - + Sets the BPM to 150% of the current value. - + 3/2 BPM - + Sets the BPM to 133% of the current value. - + 4/3 BPM - + Tap with the beat to set the BPM to the speed you are tapping. Khai thác với nhịp đập để thiết lập BPM để tốc độ bạn đang khai thác. - + Tap to Beat Bấm vào để đánh bại - + Hint: Use the Library Analyze view to run BPM detection. Gợi ý: Sử dụng xem thư viện phân tích để chạy việc phát hiện BPM. - + Save changes and close the window. "OK" button Lưu thay đổi và đóng cửa sổ. - + &OK & OK - + Discard changes and close the window. "Cancel" button Bỏ các thay đổi và đóng cửa sổ. - + Save changes and keep the window open. "Apply" button Lưu thay đổi và giữ cho cửa sổ mở. - + &Apply & Áp dụng - + &Cancel & Hủy bỏ - + (no color) @@ -9076,7 +9118,7 @@ Often results in higher quality beatgrids, but will not do well on tracks that h - + (no color) @@ -9278,27 +9320,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (nhanh hơn) - + Rubberband (better) Dây Chun (tốt hơn) - + Rubberband R3 (near-hi-fi quality) - + Unknown, using Rubberband (better) - + Unknown, using Soundtouch @@ -9513,15 +9555,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. Chế độ an toàn được kích hoạt - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9532,57 +9574,57 @@ Shown when VuMeter can not be displayed. Please keep Không có hỗ trợ OpenGL. - + activate kích hoạt - + toggle chuyển đổi - + right quyền - + left trái - + right small ngay nhỏ - + left small còn nhỏ - + up lên - + down xuống - + up small mặc nhỏ - + down small xuống nhỏ - + Shortcut Lối tắt @@ -9590,62 +9632,62 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies - - + + This directory can not be read. - + An unknown error occurred. Aborting the operation to avoid library inconsistencies - + Can't add Directory to Library - + Could not add <b>%1</b> to your library. %2 - + Can't remove Directory from Library - + An unknown error occurred. - + This directory does not exist or is inaccessible. - + Relink Directory - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9655,22 +9697,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist Chuyển nhập danh sách phát - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Tệp danh sách chơi (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9717,27 +9759,27 @@ Do you really want to overwrite it? MidiController - + MixxxControl(s) not found MixxxControl(s) không tìm thấy - + One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - + * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - + Some LEDs or other feedback may not work correctly. Một số đèn LED hoặc thông tin phản hồi có thể không làm việc một cách chính xác. - + * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) * Kiểm tra xem các tên MixxxControl được viết đúng chính tả trong tập tin bản đồ (.xml) @@ -9798,18 +9840,18 @@ Do you really want to overwrite it? MixxxLibraryFeature - + Missing Tracks Thiếu bài nhạc - + Hidden Tracks Ẩn bài nhạc - Export to Engine Prime + Export to Engine DJ @@ -9821,210 +9863,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy Thiết bị âm thanh bận rộn - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Thử lại</b> sau khi đóng ứng dụng khác hoặc kết nối lại một thiết bị âm thanh - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Cấu hình lại</b> Cài đặt thiết bị âm thanh của Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Nhận được <b>Trợ giúp</b> từ Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Lối ra</b> Mixxx. - + Retry Thử lại - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Cấu hình lại - + Help Trợ giúp - - + + Exit Lối ra - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices Không có thiết bị đầu ra - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx được cấu hình mà không có bất kỳ thiết bị âm thanh đầu ra. Âm thanh xử lý sẽ bị vô hiệu hóa mà không có một thiết bị được cấu hình đầu ra. - + <b>Continue</b> without any outputs. <b>Tiếp tục</b> mà không có bất kỳ kết quả đầu ra. - + Continue Tiếp tục - + Load track to Deck %1 Tải ca khúc để boong %1 - + Deck %1 is currently playing a track. Sàn %1 đang phát một ca khúc. - + Are you sure you want to load a new track? Bạn có chắc bạn muốn tải một ca khúc mới không? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Có là không có thiết bị đầu vào, chọn này kiểm soát vinyl. Xin vui lòng chọn một thiết bị đầu vào trong ưa thích của phần cứng âm thanh đầu tiên. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Có là không có thiết bị đầu vào, chọn này kiểm soát passthrough. Xin vui lòng chọn một thiết bị đầu vào trong ưa thích của phần cứng âm thanh đầu tiên. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + + Scan took %1 + + + + + No changes detected. + + + + + + %1 tracks in total + + + + + %1 new tracks found + + + + + %1 moved tracks detected + + + + + %1 tracks are missing (%2 total) + + + + + %1 tracks have been rediscovered + + + + + Library scan finished + + + + Error in skin file Lỗi trong tệp vẻ ngoài - + The selected skin cannot be loaded. Vẻ ngoài đã chọn không thể được nạp. - + OpenGL Direct Rendering Trực tiếp OpenGL Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Xác nhận thoát - + A deck is currently playing. Exit Mixxx? Một sân hiện đang phát. Thoát khỏi Mixxx? - + A sampler is currently playing. Exit Mixxx? Một sampler hiện đang phát. Thoát khỏi Mixxx? - + The preferences window is still open. Cửa sổ tùy chọn là vẫn còn mở. - + Discard any changes and exit Mixxx? Loại bỏ bất kỳ thay đổi và thoát Mixxx? @@ -10040,13 +10123,13 @@ Do you want to select an input device? PlaylistFeature - + Lock Khóa - - + + Playlists Danh sách phát @@ -10056,32 +10139,58 @@ Do you want to select an input device? - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock Mở khóa - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Một số DJ xây dựng danh sách phát trước khi họ thực hiện trực tiếp, nhưng những người khác muốn xây dựng họ on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Khi sử dụng một danh sách trong bộ DJ sống, hãy nhớ luôn luôn chú ý chặt chẽ đến như thế nào đối tượng của bạn phản ứng với âm nhạc bạn đã chọn để chơi. - + Create New Playlist Tạo danh sách chơi mới @@ -11573,7 +11682,7 @@ Fully right: end of the effect period - + Deck %1 Sàn %1 @@ -11706,7 +11815,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Passthrough @@ -11737,7 +11846,7 @@ Hint: compensates "chipmunk" or "growling" voices - + Sampler %1 @@ -11870,12 +11979,12 @@ may introduce a 'pumping' effect and/or distortion. - + built-in - + missing @@ -11910,42 +12019,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12003,54 +12112,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox - + Playlists Danh sách phát - + Folders - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) - + Check for attached Rekordbox USB / SD devices (refresh) - + Beatgrids - + Memory cues - + (loading) Rekordbox @@ -12609,7 +12718,7 @@ may introduce a 'pumping' effect and/or distortion. - + Spinning Vinyl Quay Vinyl @@ -12791,7 +12900,7 @@ may introduce a 'pumping' effect and/or distortion. - + Cover Art Bìa @@ -13027,197 +13136,197 @@ may introduce a 'pumping' effect and/or distortion. Khi khai thác, điều chỉnh BPM trung bình lên bởi một số lượng nhỏ. - + Adjust Beats Earlier Điều chỉnh nhịp đập trước đó - + When tapped, moves the beatgrid left by a small amount. Khi khai thác, di chuyển beatgrid rời bởi một số lượng nhỏ. - + Adjust Beats Later Điều chỉnh nhịp đập sau - + When tapped, moves the beatgrid right by a small amount. Khi khai thác, di chuyển beatgrid ngay bởi một số lượng nhỏ. - + Tempo and BPM Tap Tiến độ và BPM Tap - + Show/hide the spinning vinyl section. Hiển thị/ẩn phần vinyl quay. - + Keylock - + Toggling keylock during playback may result in a momentary audio glitch. - + Toggle visibility of Loop Controls - + Toggle visibility of Beatjump Controls - + Toggle visibility of Rate Control - + Toggle visibility of Key Controls - + (while previewing) - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Is latching the playing state. - + Seeks the track to the cue point and stops. - + Play Chơi - + Plays track from the cue point. - + Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - + (This skin should be updated to use Sync Lock!) - + Enable Sync Lock - + Tap to sync the tempo to other playing tracks or the sync leader. - + Enable Sync Leader - + When enabled, this device will serve as the sync leader for all other decks. - + This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Tempo Range Display - + Displays the current range of the tempo slider. - + Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - + Delete selected hotcue. - + Track Comment - + Displays the comment tag of the loaded track. - + Opens separate artwork viewer. - + Effect Chain Preset Settings - + Show the effect chain settings menu for this unit. - + Select and configure a hardware device for this input - + Recording Duration @@ -13455,926 +13564,932 @@ may introduce a 'pumping' effect and/or distortion. - + + Adjust beatgrid by exactly one half beat. Usable only on +tracks with constant tempo. + + + + Revert last BPM/Beatgrid Change - + Revert last BPM/Beatgrid Change of the loaded track. - - + + Toggle the BPM/beatgrid lock - + Tempo and Rate Tap - + Tempo, Rate Tap and BPM Tap - + Shift cues earlier - - + + Shift cues imported from Serato or Rekordbox if they are slightly off time. - + Left click: shift 10 milliseconds earlier - + Right click: shift 1 millisecond earlier - + Shift cues later - + Left click: shift 10 milliseconds later - + Right click: shift 1 millisecond later - - + + Drag a Hotcue button here to continue playing after releasing the Hotcue. - + Hint: Change the default cue mode in Preferences -> Decks. - + Mutes the selected channel's audio in the main output. - + Main mix enable - + Hold or short click for latching to mix this input into the main output. - + If hotcue is a loop cue, toggles the loop and jumps to if the loop is behind the play position. - + If the play position is inside an active loop, stores the loop as loop cue. - + Drag this button onto another Hotcue button to move it there (change its index). If the other hotcue is set, the two are swapped. - + Expand/Collapse Samplers - + Toggle expanded samplers view. - + Displays the duration of the running recording. - + Auto DJ is active - + Red for when needle skip has been detected. - + Hot Cue - Track will seek to nearest previous hotcue point. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + If the track has no beats the unit is seconds. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatloop Anchor - + Define whether the loop is created and adjusted from its staring point or ending point. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Hint: Change the time format in Preferences -> Decks. - + Show/hide intro & outro markers and associated buttons. - + Intro Start Marker - - - - + + + + If marker is set, jumps to the marker. - - - - + + + + If marker is not set, sets the marker to the current play position. - - - - + + + + If marker is set, clears the marker. - + Intro End Marker - + Outro Start Marker - + Outro End Marker - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the main mix through this effect unit. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Stem Label - + Name of the stem stored in the stem file - + Text is displayed in the stem color stored in the stem file - + this stem color is also used for the waveform of this stem - + Stem Mute - + Toggle the stem mute/unmuted - + Stem Volume Knob - + Adjusts the volume of the stem - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank Lưu Sampler ngân hàng - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank Tải Sampler ngân hàng - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob Siêu Knob - + Next Chain Tiếp theo chuỗi - + Previous Chain Chuỗi trước - + Next/Previous Chain Kế tiếp/trước Chuỗi - + Clear Rõ ràng - + Clear the current effect. Rõ ràng các hiệu ứng hiện tại. - + Toggle Chuyển đổi - + Toggle the current effect. Chuyển đổi có hiệu lực hiện tại. - + Next Tiếp theo - + Clear Unit Rõ ràng đơn vị - + Clear effect unit. Đơn vị có hiệu lực rõ ràng. - + Show/hide parameters for effects in this unit. - + Toggle Unit Chuyển đổi đơn vị - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. Chuyển sang kế tiếp có hiệu lực. - + Previous Trước đó - + Switch to the previous effect. Chuyển đổi để có hiệu lực trước đó. - + Next or Previous Kế tiếp hoặc trước đó - + Switch to either the next or previous effect. Chuyển sang một trong hai tác dụng kế tiếp hoặc trước đó. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter Có hiệu lực tham số - + Adjusts a parameter of the effect. Điều chỉnh các thông số của hiệu lực. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill Bộ chỉnh âm tham số giết - - + + Holds the gain of the EQ to zero while active. Tổ chức đạt được của các EQ bằng không trong khi hoạt động. - + Quick Effect Super Knob Hiệu ứng nhanh siêu Knob - + Quick Effect Super Knob (control linked effect parameters). Nhanh chóng có hiệu lực Super Knob (kiểm soát tham số liên kết có hiệu lực). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. Gợi ý: Các thay đổi chế độ có hiệu lực nhanh chóng mặc định trong tuỳ chọn-> Equalizers. - + Equalizer Parameter Bộ chỉnh âm tham số - + Adjusts the gain of the EQ filter. Điều chỉnh độ lợi của các bộ lọc EQ. - + Hint: Change the default EQ mode in Preferences -> Equalizers. Gợi ý: Các thay đổi chế độ EQ mặc định trong tuỳ chọn-> Equalizers. - - + + Adjust Beatgrid Điều chỉnh Beatgrid - + Adjust beatgrid so the closest beat is aligned with the current play position. Điều chỉnh beatgrid để đánh bại gần nhất liên kết với vị trí chơi hiện tại. - - + + Adjust beatgrid to match another playing deck. Điều chỉnh beatgrid để phù hợp với một sân chơi. - + If quantize is enabled, snaps to the nearest beat. Nếu quantize được kích hoạt, snaps để đánh bại gần nhất. - + Quantize Quantize - + Toggles quantization. Bật tắt sự lượng tử hóa. - + Loops and cues snap to the nearest beat when quantization is enabled. Vòng và tín hiệu snap để đánh bại gần nhất khi sự lượng tử hóa được kích hoạt. - + Reverse Đảo ngược - + Reverses track playback during regular playback. Ảnh theo dõi phát lại trong khi phát lại thường xuyên. - + Puts a track into reverse while being held (Censor). Đặt một ca khúc vào đảo ngược trong khi được tổ chức (kiểm duyệt). - + Playback continues where the track would have been if it had not been temporarily reversed. Phát lại tiếp tục nơi đường sẽ có là nếu nó đã không được tạm thời đảo ngược. - - - + + + Play/Pause Phát/tạm dừng - + Jumps to the beginning of the track. Nhảy tới bắt đầu theo dõi. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. Đồng bộ tiến độ (BPM) và các giai đoạn của đường khác, nếu BPM được phát hiện trên cả hai. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. Đồng bộ tiến độ (BPM) của các ca khúc khác, nếu BPM được phát hiện trên cả hai. - + Sync and Reset Key Đồng bộ và thiết lập lại phím - + Increases the pitch by one semitone. Tăng sân một semitone. - + Decreases the pitch by one semitone. Giảm trong trận đấu bởi một semitone. - + Enable Vinyl Control Cho phép điều khiển Vinyl - + When disabled, the track is controlled by Mixxx playback controls. Khi tắt, theo dõi được điều khiển bởi Mixxx phát lại điều khiển. - + When enabled, the track responds to external vinyl control. Khi kích hoạt, theo dõi phản ứng để kiểm soát bên ngoài nhựa vinyl. - + Enable Passthrough Sử Passthrough - + Indicates that the audio buffer is too small to do all audio processing. Chỉ ra rằng các bộ đệm âm thanh quá nhỏ để làm tất cả âm thanh xử lý. - + Displays cover artwork of the loaded track. Hiển thị bao gồm các tác phẩm nghệ thuật của các ca khúc được nạp. - + Displays options for editing cover artwork. Hiển thị các tùy chọn để chỉnh sửa bìa. - + Star Rating Xếp hạng sao - + Assign ratings to individual tracks by clicking the stars. Gán xếp hạng cho bài hát riêng lẻ bằng cách nhấp vào các ngôi sao. @@ -14509,33 +14624,33 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + Prevents the pitch from changing when the rate changes. Ngăn chặn sân thay đổi khi tốc độ thay đổi. - + Changes the number of hotcue buttons displayed in the deck - + Starts playing from the beginning of the track. Bắt đầu phát từ sự khởi đầu của đường đua. - + Jumps to the beginning of the track and stops. Nhảy tới bắt đầu theo dõi và dừng lại. - - + + Plays or pauses the track. Phát hoặc tạm dừng theo dõi. - + (while playing) (trong khi chơi) @@ -14555,215 +14670,215 @@ Use this to change only the effected (wet) signal with EQ and filter effects. - + (while stopped) (trong khi dừng lại) - + Cue Cue - + Headphone Tai nghe - + Mute Tắt tiếng - + Old Synchronize Old đồng bộ hóa - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. Đồng bộ đến tầng đầu tiên (theo thứ tự số) mà đang phát một ca khúc và có một BPM. - + If no deck is playing, syncs to the first deck that has a BPM. Nếu không có Sân chơi, đồng bộ đến tầng đầu tiên có một BPM. - + Decks can't sync to samplers and samplers can only sync to decks. Sàn không thể đồng bộ để lấy mẫu và lấy mẫu có thể chỉ đồng bộ với sàn. - + Hold for at least a second to enable sync lock for this deck. Giữ cho một thứ hai để cho phép đồng bộ khóa cho boong này. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. Sàn với đồng bộ khóa sẽ chơi tất cả ở cùng một tiến độ, và sàn tàu cũng có quantize kích hoạt sẽ luôn luôn có nhịp đập của họ xếp hàng. - + Resets the key to the original track key. Đặt lại chìa khóa đến chính ca khúc ban đầu. - + Speed Control Kiểm soát tốc độ - - - + + + Changes the track pitch independent of the tempo. Thay đổi sân theo dõi độc lập tiến độ. - + Increases the pitch by 10 cents. Tăng sân 10 cent. - + Decreases the pitch by 10 cents. Làm giảm độ cao thấp của 10 cent. - + Pitch Adjust Điều chỉnh pitch - + Adjust the pitch in addition to the speed slider pitch. Điều chỉnh sân ngoài sân trượt tốc độ. - + Opens a menu to clear hotcues or edit their labels and colors. - + Drag this button onto a Play button while previewing to continue playback after release. - + Dragging with Shift key pressed will not start previewing the hotcue. - + Record Mix Ghi kết hợp - + Toggle mix recording. Chuyển đổi kết hợp ghi âm. - + Enable Live Broadcasting Kích hoạt tính năng sống phát sóng - + Stream your mix over the Internet. Dòng hỗn hợp của bạn qua Internet. - + Provides visual feedback for Live Broadcasting status: Cung cấp phản hồi thị giác cho Live phát thanh truyền tình trạng: - + disabled, connecting, connected, failure. vô hiệu hóa, kết nối, kết nối, thất bại. - + When enabled, the deck directly plays the audio arriving on the vinyl input. Khi kích hoạt, tầng trực tiếp phát âm thanh đến ngày vinyl đầu vào. - + Playback will resume where the track would have been if it had not entered the loop. Phát lại sẽ tiếp tục nơi đường sẽ có là nếu nó đã không nhập vào vòng lặp. - + Loop Exit Thoát khỏi vòng lặp - + Turns the current loop off. Tắt các vòng lặp hiện tại. - + Slip Mode Chế độ chống trượt - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. Khi hoạt động, phát lại tiếp tục tắt trong nền trong một đầu đảo ngược, vòng lặp, vv. - + Once disabled, the audible playback will resume where the track would have been. Sau khi vô hiệu hóa, phát lại âm thanh sẽ tiếp tục nơi đường sẽ có. - + Track Key The musical key of a track Theo dõi các phím - + Displays the musical key of the loaded track. Hiển thị phím âm nhạc của ca khúc được nạp. - + Clock Đồng hồ - + Displays the current time. Hiển thị thời gian hiện tại. - + Audio Latency Usage Meter Độ trễ âm thanh sử dụng đồng hồ - + Displays the fraction of latency used for audio processing. Hiển thị các phần của độ trễ được sử dụng để xử lý âm thanh. - + A high value indicates that audible glitches are likely. Một giá trị cao cho thấy rằng âm thanh ổn định có khả năng. - + Do not enable keylock, effects or additional decks in this situation. Không cho phép khóa bàn phím, hiệu ứng hoặc bổ sung sàn trong tình huống này. - + Audio Latency Overload Indicator Âm thanh độ trễ quá tải chỉ số @@ -14808,254 +14923,254 @@ Use this to change only the effected (wet) signal with EQ and filter effects.Hiển thị phím âm nhạc hiện tại theo dõi tải sau Sân chuyển. - + Fast Rewind Tua nhanh - + Fast rewind through the track. Tua lại nhanh thông qua đường. - + Fast Forward Tua đi - + Fast forward through the track. Nhanh chóng chuyển tiếp thông qua theo dõi. - + Jumps to the end of the track. Nhảy đến cuối đường. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. Sets sân cho một phím cho phép sự chuyển tiếp điều hòa từ các ca khúc khác. Yêu cầu một khoá được phát hiện trên cả hai sàn tham gia. - - - + + + Pitch Control Kiểm soát Sân - + Pitch Rate Tỷ lệ pitch - + Displays the current playback rate of the track. Hiển thị mức độ phát hiện tại theo dõi. - + Repeat Lặp lại - + When active the track will repeat if you go past the end or reverse before the start. Khi hoạt động theo dõi sẽ lặp lại nếu bạn đi qua cuối cùng hoặc ngược lại trước khi bắt đầu. - + Eject Đẩy ra - + Ejects track from the player. Đẩy ra theo dõi từ người chơi. - + Hotcue Hotcue - + If hotcue is set, jumps to the hotcue. Nếu hotcue được thiết lập, nhảy vào hotcue. - + If hotcue is not set, sets the hotcue to the current play position. Nếu hotcue không được thiết lập, đặt hotcue vị trí chơi hiện tại. - + Vinyl Control Mode Vinyl kiểm soát chế độ - + Absolute mode - track position equals needle position and speed. Chế độ tuyệt đối - theo dõi vị trí bằng kim vị trí và tốc độ. - + Relative mode - track speed equals needle speed regardless of needle position. Chế độ tương đối - theo dõi tốc độ bằng kim tốc độ bất kể vị trí kim. - + Constant mode - track speed equals last known-steady speed regardless of needle input. Chế độ liên tục - theo dõi tốc độ bằng cuối cùng được biết đến-tăng tốc độ bất kể kim đầu vào. - + Vinyl Status Tình trạng vinyl - + Provides visual feedback for vinyl control status: Cung cấp phản hồi thị giác cho vinyl kiểm soát tình trạng: - + Green for control enabled. Màu xanh lá cây để kiểm soát được kích hoạt. - + Blinking yellow for when the needle reaches the end of the record. Nhấp nháy màu vàng cho khi kim đạt đến sự kết thúc của kỷ lục. - + Loop-In Marker Vòng lặp trong điểm đánh dấu - + Loop-Out Marker - + Loop Halve Loop giảm một nửa - + Halves the current loop's length by moving the end marker. Halves vòng lặp hiện tại chiều dài bằng cách di chuyển các điểm đánh dấu kết thúc. - + Deck immediately loops if past the new endpoint. Boong ngay lập tức vòng nếu qua điểm cuối mới. - + Loop Double Vòng lặp đôi - + Doubles the current loop's length by moving the end marker. Tăng gấp đôi chiều dài của vòng lặp hiện tại bằng cách di chuyển các điểm đánh dấu kết thúc. - + Beatloop - + Toggles the current loop on or off. Bật tắt vòng lặp hiện tại hoặc tắt. - + Works only if Loop-In and Loop-Out marker are set. Chỉ khi vòng lặp trong các công trình và điểm đánh dấu Loop-Out được thiết lập. - + Vinyl Cueing Mode Vinyl Cueing chế độ - + Determines how cue points are treated in vinyl control Relative mode: Xác định cách cue điểm được điều trị trong vinyl kiểm soát tương đối chế độ: - + Off - Cue points ignored. Off - Cue điểm bỏ qua. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. Một Cue - nếu kim sẽ bị ngắt sau cue điểm, theo dõi sẽ tìm đến thời điểm cue. - + Track Time Theo dõi thời gian - + Track Duration Theo dõi thời gian - + Displays the duration of the loaded track. Hiển thị thời gian theo dõi được nạp. - + Information is loaded from the track's metadata tags. Thông tin được nạp từ thẻ siêu dữ liệu của con đường mòn. - + Track Artist Nghệ sĩ theo dõi - + Displays the artist of the loaded track. Hiển thị các nghệ sĩ theo dõi nạp. - + Track Title Theo dõi các tiêu đề - + Displays the title of the loaded track. Hiển thị tiêu đề của các ca khúc được nạp. - + Track Album Theo dõi Album - + Displays the album name of the loaded track. Hiển thị tên album theo dõi nạp. - + Track Artist/Title Theo dõi các nghệ sĩ/tiêu đề - + Displays the artist and title of the loaded track. Hiển thị các nghệ sĩ và tiêu đề của các ca khúc được nạp. @@ -15063,12 +15178,12 @@ Use this to change only the effected (wet) signal with EQ and filter effects. TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -15283,47 +15398,47 @@ This can not be undone! WCueMenuPopup - + Cue number - + Cue position - + Edit cue label - + Label... - + Delete this cue - + Toggle this cue type between normal cue and saved loop - + Left-click: Use the old size or the current beatloop size as the loop size - + Right-click: Use the current play position as loop end if it is after the cue - + Hotcue #%1 @@ -15448,323 +15563,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist Tạo & danh sách chơi mới - + Create a new playlist Tạo một danh sách mới - + Ctrl+n Ctrl + n - + Create New &Crate Tạo mới & thùng - + Create a new crate Tạo một thùng mới - + Ctrl+Shift+N Ctrl + Shift + N - - + + &View & Xem - + Auto-hide menu bar - + Auto-hide the main menu bar when it's not used. - + May not be supported on all skins. Có thể không được hỗ trợ trên tất cả da. - + Show Skin Settings Menu - + Show the Skin Settings Menu of the currently selected Skin - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl + 1 - + Show Microphone Section Hiển thị Micro phần - + Show the microphone section of the Mixxx interface. Hiển thị phần micro của giao diện Mixxx. - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl + 2 - + Show Vinyl Control Section Hiển thị Vinyl kiểm soát phần - + Show the vinyl control section of the Mixxx interface. Hiển thị phần vinyl kiểm soát của giao diện Mixxx. - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl + 3 - + Show Preview Deck Hiển thị xem trước sàn - + Show the preview deck in the Mixxx interface. Hiển thị xem trước sàn trong giao diện Mixxx. - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl + 4 - + Show Cover Art Bìa đĩa Hiển thị - + Show cover art in the Mixxx interface. Hiển thị nghệ thuật bao gồm trong giao diện Mixxx. - + Ctrl+6 Menubar|View|Show Cover Art Ctrl + 6 - + Maximize Library Tối đa hóa thư viện - + Maximize the track library to take up all the available screen space. Tối đa hóa thư viện theo dõi để mất tất cả không gian màn hình có sẵn. - + Space Menubar|View|Maximize Library - + &Full Screen & Toàn màn hình - + Display Mixxx using the full screen Hiển thị Mixxx bằng cách sử dụng toàn màn hình - + &Options & Tùy chọn - + &Vinyl Control & Vinyl kiểm soát - + Use timecoded vinyls on external turntables to control Mixxx Sử dụng timecoded vinyls trên bên ngoài xoay để kiểm soát Mixxx - + Enable Vinyl Control &%1 Kích hoạt tính năng Vinyl kiểm soát & %1 - + &Record Mix & Ghi kết hợp - + Record your mix to a file Ghi lại hỗn hợp của bạn vào một tập tin - + Ctrl+R Ctrl + R - + Enable Live &Broadcasting Sử sống & phát thanh truyền - + Stream your mixes to a shoutcast or icecast server Dòng hỗn hợp của bạn đến một máy chủ shoutcast hoặc icecast - + Ctrl+L Ctrl + L - + Enable &Keyboard Shortcuts Kích hoạt tính năng & phím tắt - + Toggles keyboard shortcuts on or off Chuyển phím tắt Baät hoaëc taét - + Ctrl+` Ctrl +' - + &Preferences & Sở thích - + Change Mixxx settings (e.g. playback, MIDI, controls) Thay đổi cài đặt Mixxx (ví dụ như các điều khiển phát lại, MIDI) - + &Developer & Phát triển - + &Reload Skin & Tải lại da - + Reload the skin Tải lại da - + Ctrl+Shift+R Ctrl + Shift + R - + Developer &Tools Công cụ phát triển & - + Opens the developer tools dialog Mở hộp thoại công cụ phát triển - + Ctrl+Shift+T Ctrl + Shift + T - + Stats: &Experiment Bucket Thống kê: & thử nghiệm Xô - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. Cho phép thử nghiệm chế độ. Thu thập số liệu thống kê trong thử nghiệm theo dõi thùng. - + Ctrl+Shift+E Ctrl + Shift + E - + Stats: &Base Bucket Thống kê: & căn cứ Xô - + Enables base mode. Collects stats in the BASE tracking bucket. Cho phép cơ sở chế độ. Thu thập số liệu thống kê căn cứ theo dõi Xô. - + Ctrl+Shift+B Ctrl + Shift + B - + Deb&ugger Enabled Deb & ugger đã bật - + Enables the debugger during skin parsing Cho phép trình gỡ lỗi trong da phân tích - + Ctrl+Shift+D Ctrl + Shift + D - + &Help & Trợ giúp - + Show Keywheel menu title @@ -15781,74 +15926,74 @@ This can not be undone! - + Show keywheel tooltip text - + F12 Menubar|View|Show Keywheel - + &Community Support & Hỗ trợ cộng đồng - + Get help with Mixxx Nhận trợ giúp với Mixxx - + &User Manual & Hướng dẫn sử dụng - + Read the Mixxx user manual. Đọc hướng dẫn sử dụng Mixxx. - + &Keyboard Shortcuts & Phím tắt - + Speed up your workflow with keyboard shortcuts. Tăng tốc độ công việc của bạn với phím tắt. - + &Settings directory - + Open the Mixxx user settings directory. - + &Translate This Application & Dịch ứng dụng này - + Help translate this application into your language. Giúp chúng tôi dịch ứng dụng này sang ngôn ngữ của bạn. - + &About & Giới thiệu - + About the application Về ứng dụng @@ -15856,25 +16001,25 @@ This can not be undone! WOverview - + Passthrough - + Ready to play, analyzing... Text on waveform overview when file is playable but no waveform is visible - - + + Loading track... Text on waveform overview when file is cached from source - + Finalizing... Text on waveform overview during finalizing of waveform analysis @@ -15883,25 +16028,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - Rõ ràng đầu vào - - - - Ctrl+F - Search|Focus - Ctrl + F - - - + Search noun Tìm - + Clear input Rõ ràng đầu vào @@ -15912,169 +16045,163 @@ This can not be undone! Tìm... - + Clear the search bar input field - - Enter a string to search for - Nhập một chuỗi tìm kiếm + + Return + - - Use operators like bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. - - For more information see User Manual > Mixxx Library + + Use operators like bpm:115-128, artist:BooFar, -year:1990. - Shortcut - Lối tắt + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl + F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - Tập trung + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace + + Additional Shortcuts When Focused: - Shortcuts + Trigger search before search-as-you-type timeout or focus tracks view afterwards - Return + Esc or Ctrl+Return - Trigger search before search-as-you-type timeout orjump to tracks view afterwards + Immediately trigger search and focus tracks view + Exit search bar and leave focus - + Ctrl+Space - + Toggle search history Shows/hides the search history entries - + Delete or Backspace - - Delete query from history + + in search history - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Tìm lối ra + + Delete query from history + WSearchRelatedTracksMenu - + Search related Tracks - + Key Chìa khóa - + harmonic with %1 - + BPM BPM - + between %1 and %2 - + Artist Nghệ sĩ - + Album Artist Album nghệ sĩ - + Composer Nhà soạn nhạc - + Title Tiêu đề - + Album Album - + Grouping Nhóm - + Year Năm - + Genre Thể loại - + Directory - + &Search selected @@ -16082,620 +16209,625 @@ This can not be undone! WTrackMenu - + Load to - + Deck Sàn - + Sampler Sampler - + Add to Playlist Thêm vào danh sách chơi - + Crates Thùng - + Metadata - + Update external collections - + Cover Art Bìa - + Adjust BPM - + Select Color - - + + Analyze Phân tích - - + + Delete Track Files - + Add to Auto DJ Queue (bottom) Thêm vào hàng đợi DJ tự động (phía dưới) - + Add to Auto DJ Queue (top) Thêm vào hàng đợi DJ tự động (top) - + Add to Auto DJ Queue (replace) - + Preview Deck Xem trước sàn - + Remove Loại bỏ - + Remove from Playlist - + Remove from Crate - + Hide from Library Ẩn từ thư viện - + Unhide from Library Bỏ ẩn từ thư viện - + Purge from Library Xoá khỏi thư viện - + Move Track File(s) to Trash - + Delete Files from Disk - + Properties Thuộc tính - + Open in File Browser Mở trong trình duyệt tập tin - + Select in Library - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + BPM and Beatgrid - + Play Count - + Rating Đánh giá - + Cue Point - - + + Hotcues Hotcues - + Intro - + Outro - + Key Chìa khóa - + ReplayGain - + Waveform - + Comment Bình luận - + All Tất cả - + Sort hotcues by position (remove offsets) - + Sort hotcues by position - + Lock BPM Khóa BPM - + Unlock BPM Mở khóa BPM - + Double BPM Đôi BPM - + Halve BPM Giảm một nửa BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + 4/3 BPM - + 3/2 BPM - + + Shift Beatgrid Half Beat + + + + Reanalyze - + Reanalyze (constant BPM) - + Reanalyze (variable BPM) - + Update ReplayGain from Deck Gain - + Deck %1 Sàn %1 - + Importing metadata of %n track(s) from file tags - + Marking metadata of %n track(s) to be exported into file tags - - + + Create New Playlist Tạo danh sách chơi mới - + Enter name for new playlist: Nhập tên cho danh sách phát mới: - + New Playlist Danh sách chơi mới - - - + + + Playlist Creation Failed Sáng tạo danh sách phát đã thất bại - + A playlist by that name already exists. Một danh sách tên đó đã tồn tại. - + A playlist cannot have a blank name. Một danh sách không thể có một tên trống. - + An unknown error occurred while creating playlist: Lỗi không biết xảy ra trong khi tạo danh sách chơi: - + Add to New Crate - + Scaling BPM of %n track(s) - + Undo BPM/beats change of %n track(s) - + Locking BPM of %n track(s) - + Unlocking BPM of %n track(s) - + Setting rating of %n track(s) - + Setting color of %n track(s) - + Resetting play count of %n track(s) - + Resetting beats of %n track(s) - + Clearing rating of %n track(s) - + Clearing comment of %n track(s) - + Removing main cue from %n track(s) - + Removing outro cue from %n track(s) - + Removing intro cue from %n track(s) - + Removing loop cues from %n track(s) - + Removing hot cues from %n track(s) - + Sorting hotcues of %n track(s) by position (remove offsets) - + Sorting hotcues of %n track(s) by position - + Resetting keys of %n track(s) - + Resetting replay gain of %n track(s) - + Resetting waveform of %n track(s) - + Resetting all performance metadata of %n track(s) - + Move these files to the trash bin? - + Permanently delete these files from disk? - - + + This can not be undone! - + Cancel Hủy bỏ - + Delete Files - + Okay - + Move Track File(s) to Trash? - + Track Files Deleted - + Track Files Moved To Trash - + %1 track files were moved to trash and purged from the Mixxx database. - + %1 track files were deleted from disk and purged from the Mixxx database. - + Track File Deleted - + Track file was deleted from disk and purged from the Mixxx database. - + The following %1 file(s) could not be deleted from disk - + This track file could not be deleted from disk - + Remaining Track File(s) - + Close Đóng - + Clear Reset metadata in right click track context menu in library - + Loops - + Clear BPM and Beatgrid - + Undo last BPM/beats change - + Move this track file to the trash bin? - + Permanently delete this track file from disk? - + All decks where these tracks are loaded will be stopped and the tracks will be ejected. - + All decks where this track is loaded will be stopped and the track will be ejected. - + Removing %n track file(s) from disk... - + Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - + Track File Moved To Trash - + Track file was moved to trash and purged from the Mixxx database. - + Don't show again during this session - + The following %1 file(s) could not be moved to trash - + This track file could not be moved to trash - + Setting cover art of %n track(s) - + Reloading cover art of %n track(s) @@ -16711,37 +16843,37 @@ This can not be undone! WTrackStemMenu - + Load for stem mixing - + Load pre-mixed stereo track - + Load the "%1" stem - + Load multiple stem into a stereo deck - + Select stems to load - + Release "CTRL" to load the current selection - + Use "CTRL" to select multiple stems @@ -16749,37 +16881,37 @@ This can not be undone! WTrackTableView - + Confirm track hide - + Are you sure you want to hide the selected tracks? - + Are you sure you want to remove the selected tracks from AutoDJ queue? - + Are you sure you want to remove the selected tracks from this crate? - + Are you sure you want to remove the selected tracks from this playlist? - + Don't ask again during this session - + Confirm track removal @@ -16787,12 +16919,12 @@ This can not be undone! WTrackTableViewHeader - + Show or hide columns. Hiện hoặc ẩn cột. - + Shuffle Tracks @@ -16800,52 +16932,52 @@ This can not be undone! mixxx::CoreServices - + fonts - + database - + effects - + audio interface - + decks - + library - + Choose music library directory Chọn âm nhạc thư viện thư mục - + controllers - + Cannot open database Không thể mở cơ sở dữ liệu - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -16859,68 +16991,78 @@ Nhấp vào OK để thoát. mixxx::DlgLibraryExport - + Entire music library - - Selected crates + + Crates + + + + + Playlists + + + + + Selected crates/playlists - + Browse Trình duyệt - + Export directory - + Database version - + Export - + Cancel Hủy bỏ - + Export Library to Engine DJ "Engine DJ" must not be translated - + Export Library To - + No Export Directory Chosen - + No export directory was chosen. Please choose a directory in order to export the music library. - + A database already exists in the chosen directory. Exported tracks will be added into this database. - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. @@ -16941,7 +17083,7 @@ Nhấp vào OK để thoát. mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -16951,23 +17093,23 @@ Nhấp vào OK để thoát. mixxx::LibraryExporter - + Export Completed - - Exported %1 track(s) and %2 crate(s). + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + Export Failed - - Exporting to Engine Prime... + + Exporting to Engine DJ... diff --git a/res/translations/mixxx_zh.qm b/res/translations/mixxx_zh.qm index 55e9463a73f2377bc129cd2d340ac3b694e7b800..231edd1d299d560350b41e4f6c5d3e8c62f8b41a 100644 GIT binary patch delta 24982 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 diff --git a/res/translations/mixxx_zh.ts b/res/translations/mixxx_zh.ts index 81cb9c7d4278..8fad9e39aa11 100644 --- a/res/translations/mixxx_zh.ts +++ b/res/translations/mixxx_zh.ts @@ -103,8 +103,7 @@ Add to Auto DJ Queue (bottom) - 將添加到自動 DJ 佇列 (底部) - + 添加到自自动 DJ 队列 (底部) @@ -151,7 +150,7 @@ BasePlaylistFeature - + New Playlist 新播放清單 @@ -162,7 +161,7 @@ - + Create New Playlist 創建新的播放清單 @@ -192,116 +191,123 @@ 複製 - - + + Import Playlist 輸入播放清單 - + Export Track Files 导出音轨文件 - + Analyze entire Playlist 分析整個播放清單 - + Enter new name for playlist: 为播放列表设置新的名称: - + Duplicate Playlist 重複播放清單 - - + + Enter name for new playlist: 輸入新播放清單名稱︰ - - + + Export Playlist 匯出播放清單 - + Add to Auto DJ Queue (replace) 加入自動 DJ 柱列 (取代) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist 重命名播放列表 - - + + Renaming Playlist Failed 重新命名播放清單失敗 - - - + + + A playlist by that name already exists. 使用该名称的播放列表已存在。 - - - + + + A playlist cannot have a blank name. 播放清單名稱不能為空白。 - + _copy //: Appendix to default name when duplicating a playlist _複製 - - - - - - + + + + + + Playlist Creation Failed 播放清單創建失敗 - - + + An unknown error occurred while creating playlist: 建立播放清單時發生未知的錯誤︰ - + Confirm Deletion 确认删除 - + Do you really want to delete playlist <b>%1</b>? 您真的要删除播放列表%1? - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可讀的文本 (*.txt) @@ -309,12 +315,12 @@ BaseSqlTableModel - + # # - + Timestamp 时间标记 @@ -322,7 +328,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 無法載入音軌 @@ -330,142 +336,142 @@ BaseTrackTableModel - + Album 专辑 - + Album Artist 专辑艺术家 - + Artist 歌手 - + Bitrate 位元速率 - + BPM BPM - + Channels 電視頻道 - + Color 颜色 - + Comment 备注 - + Composer 作曲家 - + Cover Art 封面 - + Date Added 加入日期 - + Last Played 最后播放 - + Duration 持續時間 - + Type 类型 - + Genre 體裁 - + Grouping 分组 - + Key 關鍵 - + Location 地點 - + Overview - + Preview 預覽 - + Rating 评分 - + ReplayGain 播放音量增益 - + Samplerate 采样率 - + Played 已播放 - + Title 標題 - + Track # 軌道 # - + Year 年份 - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk 獲取圖片中... @@ -614,6 +620,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. “我的电脑”可以让您从您的硬盘及外置设备中浏览、查看、载入音轨 + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -2454,7 +2470,7 @@ trace - Above + Profiling messages Tempo tap button - + 节奏敲击按钮 @@ -3638,32 +3654,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. 在問題解決之前,此控制器映射提供的功能將被禁用。 - + You can ignore this error for this session but you may experience erratic behavior. 您可以在此會話中忽略此錯誤,但可能會出現不穩定的行為。 - + Try to recover by resetting your controller. 嘗試恢復通過重置您的控制器。 - + Controller Mapping Error 控制器映射錯誤 - + The mapping for your controller "%1" is not working properly. 控制器“%1”的映射工作不正常。 - + The script code needs to be fixed. 脚本代码需要被修复。 @@ -3771,7 +3787,7 @@ trace - Above + Profiling messages 匯入箱 - + Export Crate 导出分类列表 @@ -3781,7 +3797,7 @@ trace - Above + Profiling messages 解鎖 - + An unknown error occurred while creating crate: 創建音樂箱時發生未知的錯誤︰ @@ -3807,17 +3823,17 @@ trace - Above + Profiling messages 重命名分类列表失败 - + Crate Creation Failed 建立音樂箱失敗 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可讀的文本 (*.txt) - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) @@ -3943,12 +3959,12 @@ trace - Above + Profiling messages 過去的貢獻者 - + Official Website 官方网站 - + Donate 捐献 @@ -4004,7 +4020,7 @@ trace - Above + Profiling messages - + Analyze 分析 @@ -4049,17 +4065,17 @@ trace - Above + Profiling messages 在選定的曲目上運行節拍、音調和增益檢測。選定的曲目不會生成波形,以節省磁碟空間。 - + Stop Analysis 停止分析 - + Analyzing %1% %2/%3 分析 %1% %2/%3 - + Analyzing %1/%2 分析 %1/%2 @@ -4476,37 +4492,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h 若映射不正确,请尝试启用下方的高级选项,然后重试。或者点击“重试”来重新检测 midi 控制器。 - + Didn't get any midi messages. Please try again. 未收到 midi 消息。请重试。 - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. 无法检测映射 - 请重试。请确保每次只操作一个控制器。 - + Successfully mapped control: 成功映射控制器: - + <i>Ready to learn %1</i> <i>现在可以学习 %1</i> - + Learning: %1. Now move a control on your controller. 正在学习:%1。现在请对控制器进行操作。 - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5209,114 +5225,114 @@ associated with each key. DlgPrefController - + Apply device settings? 應用設備設置嗎? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? 開始學習嚮導前,必須應用您的設置。 應用設置並繼續? - + None - + %1 by %2 %2 %1 - + Mapping has been edited 映射已编辑 - + Always overwrite during this session 在此会话期间始终覆盖 - + Save As 另存为 - + Overwrite 覆盖 - + Save user mapping 保存用户映射 - + Enter the name for saving the mapping to the user folder. 输入用于将映射保存到用户文件夹的名称。 - + Saving mapping failed 保存映射失败 - + A mapping cannot have a blank name and may not contain special characters. 映射不能具有空白名称,并且不能包含特殊字符。 - + A mapping file with that name already exists. 具有该名称的映射文件已存在。 - + Do you want to save the changes? 是否要保存更改? - + Troubleshooting 疑難排解 - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. 如果使用此映射,则控制器可能无法正常工作。请选择其他映射或禁用控制器。此映射专为较新的 Mixxx 控制器引擎而设计,不能用于您当前的 Mixxx 安装。您的 Mixxx 安装的 Controller Engine 版本为 %1。此映射需要 Controller Engine 版本 >= %2。有关更多信息,请访问有关 Controller Engine 版本的 wiki 页面。 - + Mapping already exists. 映射已存在。 - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b>已存在于用户映射文件夹中.<br>覆盖还是用新名称保存? - + Clear Input Mappings 清除输入映射 - + Are you sure you want to clear all input mappings? 你確定你想要清除所有輸入的映射? - + Clear Output Mappings 清除輸出映射 - + Are you sure you want to clear all output mappings? 你確定你想要清除所有輸出映射? @@ -5647,6 +5663,16 @@ Apply settings and continue? Multi-Sampling 多重采样 + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6255,62 +6281,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. 所選的外觀的最小大小大於您的螢幕解析度。 - + Allow screensaver to run 允许屏幕保护程序运行 - + Prevent screensaver from running 防止屏幕保护程序运行 - + Prevent screensaver while playing 播放时防止屏幕保护程序运行 - + Disabled 禁用 - + 2x MSAA 2倍采样抗锯齿 - + 4x MSAA 4倍采样抗锯齿 - + 8x MSAA 8倍采样抗锯齿 - + 16x MSAA 16倍采样抗锯齿 - + This skin does not support color schemes 這種皮膚不支援色彩配置 - + Information 資訊 - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. 在新的区域设置、缩放或多重采样设置生效之前,必须重新启动Mixxx。 @@ -7247,7 +7273,7 @@ and allows you to pitch adjust them for harmonic mixing. All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - + 所有设置都会在下一次轨道加载时生效。当前加载的轨迹不受影响。有关这些设置的说明,请参阅 %1 @@ -7486,173 +7512,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 赫兹 - + Default (long delay) 默认(长延时) - + Experimental (no delay) 试验(无延时) - + Disabled (short delay) 禁用 (短延時) - + Soundcard Clock 声卡时钟 - + Network Clock 网络时钟 - + Direct monitor (recording and broadcasting only) 直接监视器(仅限录制和广播) - + Disabled 已禁用 - + Enabled 啟用 - + Stereo 立体声 - + Mono 單聲道 - + To enable Realtime scheduling (currently disabled), see the %1. 要启用实时计划(当前已禁用),请参阅 %1。 - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 列出了您可能需要考虑使用 Mixxx 的声卡和控制器。 - + Mixxx DJ Hardware Guide Mixxx DJ 硬件指南 - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) 自动(<= 1024 帧/周期) - + 2048 frames/period 2048 帧/周期 - + 4096 frames/period 4096 帧/周期 - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. 与您听到的相比,麦克风输入在录音和广播信号中显得不合时宜。 - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 测量往返延迟,并在上方输入麦克风延迟补偿以对齐麦克风计时。 - - + Refer to the Mixxx User Manual for details. 細節請參考Mixxx 使用者操作手冊 - + Configured latency has changed. 配置的延迟已更改。 - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 重新测量往返延迟,并将其输入到麦克风延迟补偿上方,以调整麦克风定时。 - + Realtime scheduling is enabled. 已启用实时调度。 - + Main output only 仅主输出 - + Main and booth outputs 主输出和展位输出 - + %1 ms %1 ms - + Configuration error 配置錯誤 @@ -7670,131 +7695,131 @@ The loudness target is approximate and assumes track pregain and main output lev 聲音 API - + Sample Rate 采样率 - + Audio Buffer 音频缓冲 - + Engine Clock 引擎时钟 - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. 使用声卡时钟进行现场观众设置和最低延迟。1使用网络时钟进行没有现场观众的广播。 - + Main Mix 主混合 - + Main Output Mode 主输出模式 - + Microphone Monitor Mode 麦克风监听模式 - + Microphone Latency Compensation 麦克风延迟补偿 - - - - + + + + ms milliseconds 女士 - + 20 ms 為 20 毫秒 - + Buffer Underflow Count 緩衝區下溢計數 - + 0 0 - + Keylock/Pitch-Bending Engine 键盘锁 / 滑音引擎 - + Multi-Soundcard Synchronization 多音效卡同步 - + Output 輸出 - + Input 輸入 - + System Reported Latency 系統報告延遲 - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. 若下溢计数持续增加,或者您听到“啪啪”声,请增大您的音频缓冲区。 - + Main Output Delay 主输出延迟 - + Headphone Output Delay 耳机输出延迟 - + Booth Output Delay Booth输出延迟 - + Dual-threaded Stereo - + Hints and Diagnostics 提示和診斷 - + Downsize your audio buffer to improve Mixxx's responsiveness. 若需提升 Mixxx 的响应速度,请降低您的音频缓冲区大小。 - + Query Devices 查詢設備 @@ -9354,27 +9379,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (更快) - + Rubberband (better) 橡皮條 (更好) - + Rubberband R3 (near-hi-fi quality) 接近高保真质量 - + Unknown, using Rubberband (better) 未知,使用更好 - + Unknown, using Soundtouch 未知,使用 Soundtouch @@ -9589,15 +9614,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. 已启用安全模式 - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9609,57 +9634,57 @@ Shown when VuMeter can not be displayed. Please keep 支持。 - + activate 启用 - + toggle 切換 - + right - + left - + right small 右小 - + left small 左小 - + up 向上 - + down - + up small 小了 - + down small 下小 - + Shortcut 快捷方式 @@ -9667,37 +9692,37 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. 此目录或父目录已位于您的库中。 - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies 此目录或列出的目录不存在或无法访问。 中止操作以避免库不一致 - - + + This directory can not be read. 无法读取此目录。 - + An unknown error occurred. Aborting the operation to avoid library inconsistencies 发生未知错误。 中止操作以避免库不一致 - + Can't add Directory to Library 无法将目录添加到库 - + Could not add <b>%1</b> to your library. %2 @@ -9706,27 +9731,27 @@ Aborting the operation to avoid library inconsistencies %2 - + Can't remove Directory from Library 无法从库中删除目录 - + An unknown error occurred. 发生未知错误。 - + This directory does not exist or is inaccessible. 此目录不存在或无法访问。 - + Relink Directory 重新链接目录 - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9738,23 +9763,23 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist 輸入播放清單 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 播放清單檔 (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? 覆盖文件? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9905,251 +9930,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy 声音设备正忙 - + <b>Retry</b> after closing the other application or reconnecting a sound device 關閉其他應用程式或重新連接聲音設備後 <b>重試</b> - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>重新配置</b> Mixxx 声音设备。 - - + + Get <b>Help</b> from the Mixxx Wiki. 从 Mixxx Wiki 中获取<b>帮助</b>。 - - - + + + <b>Exit</b> Mixxx. <b>退出</b> Mixxx。 - + Retry 重试 - + skin 皮肤 - + Allow Mixxx to hide the menu bar? 允许 Mixxx 隐藏菜单栏? - + Hide Always show the menu bar? 隐藏 - + Always show 始终显示 - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Mixxx 菜单栏是隐藏的,只需按一下<b>Alt 键</b>钥匙。<br><br>点击<b>%1</b>同意。<br><br>点击<b>%2</b>以禁用它,例如,如果您不将 Mixxx 与键盘一起使用。<br><br>您可以随时在 Preferences -> Interface 中更改此设置。<br> - + Ask me again 再问我一次 - - + + Reconfigure 重新配置 - + Help 帮助 - - + + Exit 退出 - - + + Mixxx was unable to open all the configured sound devices. Mixxx 无法打开所有要打开的音频设备 - + Sound Device Error 音频设备错误 - + <b>Retry</b> after fixing an issue 修正错误后 <b> 重试 </b> - + No Output Devices 没有输出设备 - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx 的配置中没有任何输出设备,将会禁用音频处理操作。 - + <b>Continue</b> without any outputs. <b>繼續</b> 沒有任何產出。 - + Continue 继续 - + Load track to Deck %1 加载音轨到碟机 %1 - + Deck %1 is currently playing a track. 甲板 %1 當前播放的曲目。 - + Are you sure you want to load a new track? 你確定你想要載入一個新的軌道? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. 尚未选择用于唱盘控制的输入设备。 请在声音硬件的首选项中选择一个输入设备。 - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. 有是沒有為此直通控制項選擇的輸入的設備。 請先在聲音硬體首選項中選擇一種輸入的設備。 - + There is no input device selected for this microphone. Do you want to select an input device? 没有为此麦克风选择输入设备。是否要选择输入设备? - + There is no input device selected for this auxiliary. Do you want to select an input device? 没有为此辅助设备选择输入设备。是否要选择输入设备? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file 皮膚檔中的錯誤 - + The selected skin cannot be loaded. 無法載入所選的外觀。 - + OpenGL Direct Rendering OpenGL 直接繪製 - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. 您的计算机上未启用直接渲染。<br><br>这意味着波形显示将非常<br><b>速度慢,并且可能会严重占用您的 CPU</b>.要么更新您的<br>配置以启用直接渲染或禁用<br>波形将通过选择 Mixxx 首选项显示在<br>“空”作为“界面”部分的波形显示。 - - - + + + Confirm Exit 确认退出 - + A deck is currently playing. Exit Mixxx? 有唱机正在播放。确定退出 Mixxx 吗? - + A sampler is currently playing. Exit Mixxx? 當前現正播放採樣器。退出 Mixxx 嗎? - + The preferences window is still open. 首選項視窗是仍處於打開狀態。 - + Discard any changes and exit Mixxx? 放棄所有更改並退出 Mixxx? @@ -10165,13 +10190,13 @@ Do you want to select an input device? PlaylistFeature - + Lock 锁定 - - + + Playlists 播放列表 @@ -10181,32 +10206,58 @@ Do you want to select an input device? 随机播放播放列表 - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock 解鎖 - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. 播放列表是有序的曲目列表,允许您规划 DJ 集。 - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. 可能需要跳过您准备好的播放列表中的一些曲目或添加一些不同的曲目,以保持观众的活力。 - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. 一些DJ在他们表演之前创建播放列表,但其他人更倾向于即兴表演。 - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. 在在线 Dj 集中使用播放列表时,请时刻注意您的听众对所选音乐的反应。 - + Create New Playlist 創建新的播放清單 @@ -11865,7 +11916,7 @@ Hint: compensates "chipmunk" or "growling" voices 应用于音频信号的放大量。在更高的级别上,音频将更加分散。 - + Passthrough 直通 @@ -12035,12 +12086,12 @@ may introduce a 'pumping' effect and/or distortion. 各种 - + built-in - + missing @@ -12168,54 +12219,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists 播放列表 - + Folders 文件夹 - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: 读取使用 Rekordbox 导出模式为 Pioneer CDJ/XDJ 播放器导出的数据库。1Rekordbox 只能导出到具有 FAT 或 HFS 文件系统的 USB 或 SD 设备。2Mixxx 可以从包含数据库文件夹 (3先锋3和4内容4).5不支持已通过67高级>数据库管理>首选项7.89读取以下数据: - + Hot cues - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) Loops(目前只有第一个 Loop 在 Mixxx 中可用) - + Check for attached Rekordbox USB / SD devices (refresh) 检查连接的 Rekordbox USB/SD 设备(刷新) - + Beatgrids 节拍网格 - + Memory cues 记忆线索 - + (loading) Rekordbox (加载中)Rekordbox @@ -15140,7 +15191,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Beatloop - + 节拍循环 @@ -15459,47 +15510,47 @@ This can not be undone! WCueMenuPopup - + Cue number 提示编号 - + Cue position 提示位置 - + Edit cue label Edit cue label(编辑提示标签) - + Label... 标签 - + Delete this cue 删除此提示 - + Toggle this cue type between normal cue and saved loop 在正常提示点和保存的 Loop 之间切换此提示类型 - + Left-click: Use the old size or the current beatloop size as the loop size 左键单击:使用旧大小或当前 Beatloop 大小作为 Loop 大小 - + Right-click: Use the current play position as loop end if it is after the cue 右键点击:如果当前播放位置在 cue 之后,则将其用作 Loop 结束 - + Hotcue #%1 热提示 #%1 @@ -15624,323 +15675,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist 創建與新的播放清單 - + Create a new playlist 新建播放列表 - + Ctrl+n Ctrl n + - + Create New &Crate 創建新 & 箱 - + Create a new crate 創建一個新的箱子 - + Ctrl+Shift+N Ctrl + Shift + N - - + + &View 查看(&V) - + Auto-hide menu bar 自动隐藏菜单栏 - + Auto-hide the main menu bar when it's not used. 不使用主菜单栏时自动隐藏主菜单栏。 - + May not be supported on all skins. 并非所有皮肤均支持。 - + Show Skin Settings Menu 皮肤设置菜单 - + Show the Skin Settings Menu of the currently selected Skin 显示当前选定皮肤的皮肤设置菜单 - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl 1 + - + Show Microphone Section 顯示麥克風節 - + Show the microphone section of the Mixxx interface. 顯示 Mixxx 介面的麥克風部分。 - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section 显示唱盘控制界面 - + Show the vinyl control section of the Mixxx interface. 顯示 Mixxx 介面的乙烯基控制部分。 - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl 3 + - + Show Preview Deck 顯示預覽甲板 - + Show the preview deck in the Mixxx interface. 在 Mixxx 内显示显示预览用碟机。 - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art 显示封面 - + Show cover art in the Mixxx interface. 在 Mixxx 介面中顯示封面藝術。 - + Ctrl+6 Menubar|View|Show Cover Art Ctrl 6 + - + Maximize Library 最大化音乐库 - + Maximize the track library to take up all the available screen space. 最大化音樂庫以佔用所有可用的螢幕空間。 - + Space Menubar|View|Maximize Library 空間 - + &Full Screen 全屏(&F) - + Display Mixxx using the full screen 使用全螢幕的顯示 Mixxx - + &Options 选项(&O) - + &Vinyl Control 與乙烯基控制 - + Use timecoded vinyls on external turntables to control Mixxx 对外部转盘使用时间编码的唱盘控制,以便控制 Mixxx - + Enable Vinyl Control &%1 啟用乙烯控制 & %1 - + &Record Mix 與記錄組合 - + Record your mix to a file 記錄你組合到一個檔 - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting 啟用即時 & 廣播 - + Stream your mixes to a shoutcast or icecast server 将混音通过流输出到 shoutcast 或 icecast 服务器 - + Ctrl+L 按 Ctrl + L - + Enable &Keyboard Shortcuts 启用键快捷键(&K) - + Toggles keyboard shortcuts on or off 键盘快捷键开关 - + Ctrl+` 按 Ctrl +' - + &Preferences 首选项(&P) - + Change Mixxx settings (e.g. playback, MIDI, controls) 改變 Mixxx 的設置 (例如播放 MIDI,控制項) - + &Developer 與開發人員 - + &Reload Skin 重载皮肤(&R) - + Reload the skin 重新載入皮膚 - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools 开发者工具(&T) - + Opens the developer tools dialog 打開開發人員工具對話方塊 - + Ctrl+Shift+T Ctrl + Shift + T - + Stats: &Experiment Bucket 統計: & 實驗鬥 - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. 使實驗模式。收集統計實驗跟蹤存儲桶中。 - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket 統計: & 基地鬥 - + Enables base mode. Collects stats in the BASE tracking bucket. 启用基础模式。统计数据将会收集到基础跟踪桶中。 - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled 调试器已启用(&U) - + Enables the debugger during skin parsing 在皮膚分析過程中啟用調試器 - + Ctrl+Shift+D 按 Ctrl + Shift + D - + &Help 與説明 - + Show Keywheel menu title 显示 Keywheel @@ -15957,74 +16038,74 @@ This can not be undone! 将库导出为 Engine DJ 格式 - + Show keywheel tooltip text 显示 Keywheel - + F12 Menubar|View|Show Keywheel F12 - + &Community Support 社区帮助(&C) - + Get help with Mixxx 獲得 Mixxx 的説明 - + &User Manual 與使用者手冊 - + Read the Mixxx user manual. 閱讀 Mixxx 使用者手冊。 - + &Keyboard Shortcuts 键盘快捷键(&K) - + Speed up your workflow with keyboard shortcuts. 加快您的工作流使用鍵盤快速鍵。 - + &Settings directory &设置目录 - + Open the Mixxx user settings directory. 打开 Mixxx 用户设置目录。 - + &Translate This Application 翻译这个程序(&T) - + Help translate this application into your language. 幫忙翻譯成您的語言此應用程式。 - + &About 关于(&A) - + About the application 有關應用程式 @@ -16059,25 +16140,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - 清除輸入 - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun 搜索 - + Clear input 清除輸入 @@ -16088,93 +16157,87 @@ This can not be undone! 搜索... - + Clear the search bar input field 清除搜索栏输入字段 - - Enter a string to search for - 輸入要搜索的字串 + + Return + 返回 - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - 使用运算符,如 bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - 有关更多信息,请参阅 Mixxx Library >用户手册 + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - 快捷方式 + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - 焦點 + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl + 倒退鍵 + + Additional Shortcuts When Focused: + - Shortcuts - 快捷方式 + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - 返回 + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - 在键入时搜索超时之前触发搜索,或在之后跳转到轨道视图 + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl + 空格键 - + Toggle search history Shows/hides the search history entries 切换搜索历史记录 - + Delete or Backspace 删除或退格 - - Delete query from history - 从历史记录中删除查询 - - - - Esc - 按 esc 鍵 + + in search history + - - Exit search - Exit search bar and leave focus - 退出搜索 + + Delete query from history + 从历史记录中删除查询 @@ -16932,37 +16995,37 @@ This can not be undone! WTrackTableView - + Confirm track hide 确认轨道隐藏 - + Are you sure you want to hide the selected tracks? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from AutoDJ queue? 您确定要从 AutoDJ 队列中删除选定的曲目吗? - + Are you sure you want to remove the selected tracks from this crate? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from this playlist? 您确定要从此播放列表中删除选定的曲目吗? - + Don't ask again during this session 在此会话期间不要再次询问 - + Confirm track removal 确认轨道移除 @@ -16983,52 +17046,52 @@ This can not be undone! mixxx::CoreServices - + fonts 字体 - + database 数据库 - + effects 效果 - + audio interface 音频接口 - + decks 甲板 - + library 媒体库 - + Choose music library directory 選擇音樂庫目錄 - + controllers 控制器 - + Cannot open database 無法打開資料庫 - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17042,68 +17105,78 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::DlgLibraryExport - + Entire music library 整个音乐库 - - Selected crates - 选中的箱子 + + Crates + + + + + Playlists + - + + Selected crates/playlists + + + + Browse 流覽 - + Export directory 导出目录 - + Database version 数据库版本 - + Export 导出 - + Cancel 取消 - + Export Library to Engine DJ "Engine DJ" must not be translated 导出到 Engine DJ - + Export Library To 导出到 - + No Export Directory Chosen 未选择导出目录 - + No export directory was chosen. Please choose a directory in order to export the music library. 未选择导出目录。请选择一个目录以导出音乐库。 - + A database already exists in the chosen directory. Exported tracks will be added into this database. 所选目录中已存在数据库。导出的轨道将被添加到此数据库中。 - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. 所选目录中已存在数据库,但加载该数据库时出现问题。在这种情况下,不能保证导出成功。 @@ -17124,7 +17197,7 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17135,22 +17208,22 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::LibraryExporter - + Export Completed 导出已完成 - - Exported %1 track(s) and %2 crate(s). - 导出了 %1 个轨道和 %2 个板条箱。 + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed 导出失败 - + Exporting to Engine DJ... 正在导出到 Engine DJ.. diff --git a/res/translations/mixxx_zh_CN.qm b/res/translations/mixxx_zh_CN.qm index e6e5dfaf03c0eb80f42c63f711646bafa6f85695..0731f04add53203a20c0a8d06b2c30bb3ce35996 100644 GIT binary patch delta 23619 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 kqWzSY@+uZ64SB|e%1UL`BMim57!3XyZ`5 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 BasePlaylistFeature - + New Playlist 新的播放列表 @@ -160,7 +160,7 @@ - + Create New Playlist 创建新的播放列表 @@ -190,113 +190,120 @@ 复制 - - + + Import Playlist 导入播放列表 - + Export Track Files 导出音轨文件 - + Analyze entire Playlist 分析一整个播放列表 - + Enter new name for playlist: 为播放列表输入键入新的名称: - + Duplicate Playlist 复制播放列表 - - + + Enter name for new playlist: 为新的播放列表键入新的名称: - - + + Export Playlist 导出播放列表 - + Add to Auto DJ Queue (replace) 添加至自动 DJ 队列(替换) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist 重命名播放列表 - - + + Renaming Playlist Failed 重命名播放列表失败 - - - + + + A playlist by that name already exists. 使用该名称的播放列表已经存在。 - - - + + + A playlist cannot have a blank name. 播放列表名称不能为空。 - + _copy //: Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed 播放列表创建失败 - - + + An unknown error occurred while creating playlist: 创建播放列表时发生了一个未知错误: - + Confirm Deletion 删除前的确认 - + Do you really want to delete playlist <b>%1</b>? 您真的要删除播放列表<b>%1</b>吗? - + M3U Playlist (*.m3u) M3U 播放列表(*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放列表(*.m3u);;M3U8 播放列表(*.m3u8);;PLS 播放列表(*.pls);;CSV 文本(*.csv);;可读文本(*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp 时间戳 @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 无法加载音轨。 @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album 专辑 - + Album Artist 专辑艺人 - + Artist 艺人 - + Bitrate 比特率 - + BPM BPM - + Channels 通道 - + Color 颜色 - + Comment 备注 - + Composer 作曲家 - + Cover Art 封面图片 - + Date Added 加入日期 - + Last Played 最后播放 - + Duration 持续时间 - + Type 类型 - + Genre 流派 - + Grouping 分组 - + Key 调性 - + Location 位置 - + Overview - + Preview 预览 - + Rating 评分 - + ReplayGain 重放增益 - + Samplerate 采样率 - + Played 已播放 - + Title 标题 - + Track # 曲目 # - + Year 年份 - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk 獲取圖片中... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. “我的电脑”可以让您从您的硬盘及外置设备中浏览、查看与加载音轨。 + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -2448,7 +2465,7 @@ trace - Above + Profiling messages Tempo tap button - + 节奏敲击按钮 @@ -3632,32 +3649,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. 在問題解決之前,此控制器映射提供的功能將被禁用。 - + You can ignore this error for this session but you may experience erratic behavior. 您可以在此會話中忽略此錯誤,但可能會出現不穩定的行為。 - + Try to recover by resetting your controller. 请尝试重置控制器来恢复原先的状态。 - + Controller Mapping Error 控制器映射錯誤 - + The mapping for your controller "%1" is not working properly. 控制器“%1”的映射工作不正常。 - + The script code needs to be fixed. 脚本代码需要被修复。 @@ -3765,7 +3782,7 @@ trace - Above + Profiling messages 导入分类列表 - + Export Crate 导出分类列表 @@ -3775,7 +3792,7 @@ trace - Above + Profiling messages 解锁 - + An unknown error occurred while creating crate: 在创建分类列表时发生未知错误: @@ -3801,17 +3818,17 @@ trace - Above + Profiling messages 重命名分类列表失败 - + Crate Creation Failed 创建分类列表失败 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放列表(*.m3u);;M3U8 播放列表(*.m3u8);;PLS 播放列表(*.pls);;文本 CSV (*.csv);;可读文本(*.txt) - + M3U Playlist (*.m3u) M3U播放列表 (*.m3u) @@ -3937,12 +3954,12 @@ trace - Above + Profiling messages 早期贡献者 - + Official Website 官方网站 - + Donate 捐献 @@ -3998,7 +4015,7 @@ trace - Above + Profiling messages - + Analyze 分析 @@ -4043,17 +4060,17 @@ trace - Above + Profiling messages 对所选音轨进行节拍、音调和播放增益检测。为了节约磁盘空间,不会生成相应的波形文件。 - + Stop Analysis 停止分析 - + Analyzing %1% %2/%3 分析 %1% %2/%3 - + Analyzing %1/%2 分析 %1/%2 @@ -4470,37 +4487,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h 若映射不正确,请尝试启用下方的高级选项,然后重试。或者点击“重试”来重新检测 midi 控制器。 - + Didn't get any midi messages. Please try again. 未收到 midi 消息。请重试。 - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. 无法检测映射 - 请重试。请确保每次只操作一个控制器。 - + Successfully mapped control: 成功映射控制器: - + <i>Ready to learn %1</i> <i>现在可以学习 %1</i> - + Learning: %1. Now move a control on your controller. 正在学习:%1。现在请对控制器进行操作。 - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5203,114 +5220,114 @@ associated with each key. DlgPrefController - + Apply device settings? 应用设备设置吗? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? 在开始学习向导前,必须应用相关设置。 是否应用设置并继续? - + None - + %1 by %2 %1 / %2 - + Mapping has been edited 映射已编辑 - + Always overwrite during this session 在此会话期间始终覆盖 - + Save As 另存为 - + Overwrite 覆盖 - + Save user mapping 保存用户映射 - + Enter the name for saving the mapping to the user folder. 输入用于将映射保存到用户文件夹的名称。 - + Saving mapping failed 保存映射失败 - + A mapping cannot have a blank name and may not contain special characters. 映射不能具有空白名称,并且不能包含特殊字符。 - + A mapping file with that name already exists. 具有该名称的映射文件已存在。 - + Do you want to save the changes? 是否要保存更改? - + Troubleshooting 故障排除 - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. 如果使用此映射,则控制器可能无法正常工作。请选择其他映射或禁用控制器。此映射专为较新的 Mixxx 控制器引擎而设计,不能用于您当前的 Mixxx 安装。您的 Mixxx 安装的 Controller Engine 版本为 %1。此映射需要 Controller Engine 版本 >= %2。有关更多信息,请访问有关 Controller Engine 版本的 wiki 页面。 - + Mapping already exists. 映射已存在。 - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b>已存在于用户映射文件夹中.<br>覆盖还是用新名称保存? - + Clear Input Mappings 清除输入映射 - + Are you sure you want to clear all input mappings? 您确定要清除所有的输入映射吗? - + Clear Output Mappings 清除输出映射 - + Are you sure you want to clear all output mappings? 您确定要清除所有的输出映射吗? @@ -5641,6 +5658,16 @@ Apply settings and continue? Multi-Sampling 多重采样 + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6249,62 +6276,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. 您的屏幕分辨率太低,无法容纳所选皮肤的最小尺寸。 - + Allow screensaver to run 允许屏幕保护程序运行 - + Prevent screensaver from running 防止屏幕保护程序运行 - + Prevent screensaver while playing 播放时防止屏幕保护程序运行 - + Disabled 禁用 - + 2x MSAA 2倍采样抗锯齿 - + 4x MSAA 4倍采样抗锯齿 - + 8x MSAA 8倍采样抗锯齿 - + 16x MSAA 16倍采样抗锯齿 - + This skin does not support color schemes 该皮肤不支持色彩方案 - + Information 信息 - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. 在新的区域设置、缩放或多重采样设置生效之前,必须重新启动Mixxx。 @@ -7241,7 +7268,7 @@ and allows you to pitch adjust them for harmonic mixing. All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - + 所有设置都会在下一次轨道加载时生效。当前加载的轨迹不受影响。有关这些设置的说明,请参阅 %1 @@ -7480,173 +7507,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 赫兹 - + Default (long delay) 默认(长延迟) - + Experimental (no delay) 试验(无延迟) - + Disabled (short delay) 禁用(短延迟) - + Soundcard Clock 声卡时钟 - + Network Clock 网络时钟 - + Direct monitor (recording and broadcasting only) 直接监视器(仅限录制和广播) - + Disabled 禁用 - + Enabled 已启用 - + Stereo 立体声 - + Mono 启用 - + To enable Realtime scheduling (currently disabled), see the %1. 要启用实时计划(当前已禁用),请参阅 %1。 - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 列出了您可能需要考虑使用 Mixxx 的声卡和控制器。 - + Mixxx DJ Hardware Guide Mixxx DJ 硬件指南 - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) 自动(<= 1024 帧/周期) - + 2048 frames/period 2048 帧/周期 - + 4096 frames/period 4096 帧/周期 - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. 与您听到的相比,麦克风输入在录音和广播信号中显得不合时宜。 - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 测量往返延迟,并在上方输入麦克风延迟补偿以对齐麦克风计时。 - - + Refer to the Mixxx User Manual for details. 細節請參考Mixxx 使用者操作手冊 - + Configured latency has changed. 配置的延迟已更改。 - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 重新测量往返延迟,并将其输入到麦克风延迟补偿上方,以调整麦克风定时。 - + Realtime scheduling is enabled. 已启用实时调度。 - + Main output only 仅主输出 - + Main and booth outputs 主输出和展位输出 - + %1 ms %1 ms - + Configuration error 配置错误 @@ -7664,131 +7690,131 @@ The loudness target is approximate and assumes track pregain and main output lev 声音API - + Sample Rate 采样率 - + Audio Buffer 音频缓冲 - + Engine Clock 引擎时钟 - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. 使用声卡时钟进行现场观众设置和最低延迟。1使用网络时钟进行没有现场观众的广播。 - + Main Mix 主混合 - + Main Output Mode 主输出模式 - + Microphone Monitor Mode 麦克风监听模式 - + Microphone Latency Compensation 麦克风延迟补偿 - - - - + + + + ms milliseconds ms - + 20 ms 20 ms - + Buffer Underflow Count 缓冲区下溢计数 - + 0 0 - + Keylock/Pitch-Bending Engine 键盘锁 / 滑音引擎 - + Multi-Soundcard Synchronization 多声卡同步 - + Output 输出 - + Input 输入 - + System Reported Latency 系统报告的延迟 - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. 若下溢计数持续增加,或者您听到“啪啪”声,请增大您的音频缓冲区。 - + Main Output Delay 主输出延迟 - + Headphone Output Delay 耳机输出延迟 - + Booth Output Delay Booth输出延迟 - + Dual-threaded Stereo - + Hints and Diagnostics 提示与诊断 - + Downsize your audio buffer to improve Mixxx's responsiveness. 若需提升 Mixxx 的响应速度,请降低您的音频缓冲区大小。 - + Query Devices 查询设备 @@ -9347,27 +9373,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch(更快) - + Rubberband (better) Rubberband(更好) - + Rubberband R3 (near-hi-fi quality) 接近高保真质量 - + Unknown, using Rubberband (better) 未知,使用更好 - + Unknown, using Soundtouch 未知,使用 Soundtouch @@ -9582,15 +9608,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. 已启用安全模式 - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9602,57 +9628,57 @@ Shown when VuMeter can not be displayed. Please keep 支持。 - + activate 启用 - + toggle 切换 - + right - + left - + right small 右小 - + left small 左小 - + up - + down - + up small 上小 - + down small 下小 - + Shortcut 快捷键 @@ -9660,37 +9686,37 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. 此目录或父目录已位于您的库中。 - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies 此目录或列出的目录不存在或无法访问。 中止操作以避免库不一致 - - + + This directory can not be read. 无法读取此目录。 - + An unknown error occurred. Aborting the operation to avoid library inconsistencies 发生未知错误。 中止操作以避免库不一致 - + Can't add Directory to Library 无法将目录添加到库 - + Could not add <b>%1</b> to your library. %2 @@ -9699,27 +9725,27 @@ Aborting the operation to avoid library inconsistencies %2 - + Can't remove Directory from Library 无法从库中删除目录 - + An unknown error occurred. 发生未知错误。 - + This directory does not exist or is inaccessible. 此目录不存在或无法访问。 - + Relink Directory 重新链接目录 - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9731,22 +9757,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist 导入播放列表 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 播放列表文件(*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? 覆盖文件? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9897,251 +9923,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy 声音设备正忙 - + <b>Retry</b> after closing the other application or reconnecting a sound device 请关闭其他应用程序,或重新连接设备后<b>重试</b> - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>重新配置</b> Mixxx 声音设备。 - - + + Get <b>Help</b> from the Mixxx Wiki. 从 Mixxx Wiki 中获取<b>帮助</b>。 - - - + + + <b>Exit</b> Mixxx. <b>退出</b> Mixxx。 - + Retry 重试 - + skin 皮肤 - + Allow Mixxx to hide the menu bar? 允许 Mixxx 隐藏菜单栏? - + Hide Always show the menu bar? 隐藏 - + Always show 始终显示 - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Mixxx 菜单栏是隐藏的,只需按一下<b>Alt 键</b>钥匙。<br><br>点击<b>%1</b>同意。<br><br>点击<b>%2</b>以禁用它,例如,如果您不将 Mixxx 与键盘一起使用。<br><br>您可以随时在 Preferences -> Interface 中更改此设置。<br> - + Ask me again 再问我一次 - - + + Reconfigure 重新配置 - + Help 帮助 - - + + Exit 退出 - - + + Mixxx was unable to open all the configured sound devices. Mixxx 无法打开所有要打开的音频设备 - + Sound Device Error 音频设备错误 - + <b>Retry</b> after fixing an issue 修正错误后 <b> 重试 </b> - + No Output Devices 没有输出设备 - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx 的配置中没有任何输出设备,将会禁用音频处理操作。 - + <b>Continue</b> without any outputs. 确定在没有任何输出的情况下<b>继续</b>。 - + Continue 继续 - + Load track to Deck %1 加载音轨到碟机 %1 - + Deck %1 is currently playing a track. 碟机 %1 当前正在播放。 - + Are you sure you want to load a new track? 您确定要加载新音轨吗? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. 尚未选择用于唱盘控制的输入设备。 请在声音硬件的首选项中选择一个输入设备。 - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. 尚未选择用于唱盘控制的输入设备。 请在声音硬件的首选项中选择一个输入设备。 - + There is no input device selected for this microphone. Do you want to select an input device? 没有为此麦克风选择输入设备。是否要选择输入设备? - + There is no input device selected for this auxiliary. Do you want to select an input device? 没有为此辅助设备选择输入设备。是否要选择输入设备? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file 皮肤文件错误 - + The selected skin cannot be loaded. 无法加载所选皮肤。 - + OpenGL Direct Rendering OpenGL 直接渲染 - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. 您的计算机上未启用直接渲染。<br><br>这意味着波形显示将非常<br><b>速度慢,并且可能会严重占用您的 CPU</b>.要么更新您的<br>配置以启用直接渲染或禁用<br>波形将通过选择 Mixxx 首选项显示在<br>“空”作为“界面”部分的波形显示。 - - - + + + Confirm Exit 确认退出 - + A deck is currently playing. Exit Mixxx? 有唱机正在播放。确定退出 Mixxx 吗? - + A sampler is currently playing. Exit Mixxx? 有采样器正在播放。确定退出 Mixxx 吗? - + The preferences window is still open. 首选项窗口尚未关闭。 - + Discard any changes and exit Mixxx? 取消所作更改并退出 Mixxx 吗? @@ -10157,13 +10183,13 @@ Do you want to select an input device? PlaylistFeature - + Lock 锁定 - - + + Playlists 播放列表 @@ -10173,32 +10199,58 @@ Do you want to select an input device? 随机播放播放列表 - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock 解锁 - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. 播放列表是有序的曲目列表,允许您规划 DJ 集。 - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. 可能需要跳过您准备好的播放列表中的一些曲目或添加一些不同的曲目,以保持观众的活力。 - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. 一些DJ在他们表演之前创建播放列表,但其他人更倾向于即兴表演。 - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. 在在线 Dj 集中使用播放列表时,请时刻注意您的听众对所选音乐的反应。 - + Create New Playlist 新建播放列表 @@ -11838,7 +11890,7 @@ Hint: compensates "chipmunk" or "growling" voices Soft Clipping - + Soft Clipping @@ -11857,7 +11909,7 @@ Hint: compensates "chipmunk" or "growling" voices 应用于音频信号的放大量。在更高的级别上,音频将更加分散。 - + Passthrough 直通 @@ -12027,12 +12079,12 @@ may introduce a 'pumping' effect and/or distortion. 各种 - + built-in - + missing @@ -12160,54 +12212,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists 播放列表 - + Folders 文件夹 - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: 读取使用 Rekordbox 导出模式为 Pioneer CDJ/XDJ 播放器导出的数据库。1Rekordbox 只能导出到具有 FAT 或 HFS 文件系统的 USB 或 SD 设备。2Mixxx 可以从包含数据库文件夹 (3先锋3和4内容4).5不支持已通过67高级>数据库管理>首选项7.89读取以下数据: - + Hot cues - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) Loops(目前只有第一个 Loop 在 Mixxx 中可用) - + Check for attached Rekordbox USB / SD devices (refresh) 检查连接的 Rekordbox USB/SD 设备(刷新) - + Beatgrids 节拍网格 - + Memory cues 记忆线索 - + (loading) Rekordbox (加载中)Rekordbox @@ -15451,47 +15503,47 @@ This can not be undone! WCueMenuPopup - + Cue number 提示编号 - + Cue position 提示位置 - + Edit cue label Edit cue label(编辑提示标签) - + Label... 标签 - + Delete this cue 删除此提示 - + Toggle this cue type between normal cue and saved loop 在正常提示点和保存的 Loop 之间切换此提示类型 - + Left-click: Use the old size or the current beatloop size as the loop size 左键单击:使用旧大小或当前 Beatloop 大小作为 Loop 大小 - + Right-click: Use the current play position as loop end if it is after the cue 右键点击:如果当前播放位置在 cue 之后,则将其用作 Loop 结束 - + Hotcue #%1 热提示 #%1 @@ -15616,323 +15668,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist 新建播放列表(&N) - + Create a new playlist 新建播放列表 - + Ctrl+n Ctrl+N - + Create New &Crate 新建分类列表(&N) - + Create a new crate 创建新分类列表 - + Ctrl+Shift+N Ctrl+Shift+N - - + + &View 查看(&V) - + Auto-hide menu bar 自动隐藏菜单栏 - + Auto-hide the main menu bar when it's not used. 不使用主菜单栏时自动隐藏主菜单栏。 - + May not be supported on all skins. 并非所有皮肤均支持。 - + Show Skin Settings Menu 皮肤设置菜单 - + Show the Skin Settings Menu of the currently selected Skin 显示当前选定皮肤的皮肤设置菜单 - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl+1 - + Show Microphone Section 显示麦克风界面 - + Show the microphone section of the Mixxx interface. 在 Mixxx 内显示麦克风界面。 - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section 显示唱盘控制界面 - + Show the vinyl control section of the Mixxx interface. 在 Mixxx 内显示唱盘控制界面。 - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl+3 - + Show Preview Deck 显示预览用碟机 - + Show the preview deck in the Mixxx interface. 在 Mixxx 内显示显示预览用碟机。 - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art 显示封面 - + Show cover art in the Mixxx interface. 在 Mixxx 内显示封面。 - + Ctrl+6 Menubar|View|Show Cover Art Ctrl+6 - + Maximize Library 最大化音乐库 - + Maximize the track library to take up all the available screen space. 最大化音乐库以占用所有可用的屏幕空间。 - + Space Menubar|View|Maximize Library 空格键 - + &Full Screen 全屏(&F) - + Display Mixxx using the full screen 全屏模式显示 Mixxx - + &Options 选项(&O) - + &Vinyl Control 唱盘控制(&V) - + Use timecoded vinyls on external turntables to control Mixxx 对外部转盘使用时间编码的唱盘控制,以便控制 Mixxx - + Enable Vinyl Control &%1 启用Vinyl控制 &%1 - + &Record Mix 录制混音(&M) - + Record your mix to a file 将混音输出到文件 - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting 启用在线广播(&B) - + Stream your mixes to a shoutcast or icecast server 将混音通过流输出到 shoutcast 或 icecast 服务器 - + Ctrl+L Ctrl+L - + Enable &Keyboard Shortcuts 启用键快捷键(&K) - + Toggles keyboard shortcuts on or off 键盘快捷键开关 - + Ctrl+` Ctrl+` - + &Preferences 首选项(&P) - + Change Mixxx settings (e.g. playback, MIDI, controls) 改变 Mixxx 设定(回放、MIDI、控制器等) - + &Developer 开发者(&D) - + &Reload Skin 重载皮肤(&R) - + Reload the skin 重新载入皮肤 - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools 开发者工具(&T) - + Opens the developer tools dialog 打开开发者工具对话框 - + Ctrl+Shift+T Ctrl+Shift+T - + Stats: &Experiment Bucket 统计:实验桶(&E) - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. 启用实验模式。统计数据将会收集到实验跟踪桶中。 - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket 统计:基础桶(&B) - + Enables base mode. Collects stats in the BASE tracking bucket. 启用基础模式。统计数据将会收集到基础跟踪桶中。 - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled 调试器已启用(&U) - + Enables the debugger during skin parsing 在解析皮肤时启用调试器 - + Ctrl+Shift+D Ctrl+Shift+D - + &Help 帮助(&H) - + Show Keywheel menu title 显示 Keywheel @@ -15949,74 +16031,74 @@ This can not be undone! 将库导出为 Engine DJ 格式 - + Show keywheel tooltip text 显示 Keywheel - + F12 Menubar|View|Show Keywheel F12 - + &Community Support 社区帮助(&C) - + Get help with Mixxx 获取 Mixxx 帮助 - + &User Manual 用户手册(&U) - + Read the Mixxx user manual. 阅读Mixxx用户手册。 - + &Keyboard Shortcuts 键盘快捷键(&K) - + Speed up your workflow with keyboard shortcuts. 使用键盘快捷键提高你的效率。 - + &Settings directory &设置目录 - + Open the Mixxx user settings directory. 打开 Mixxx 用户设置目录。 - + &Translate This Application 翻译这个程序(&T) - + Help translate this application into your language. 帮助翻译此程序。 - + &About 关于(&A) - + About the application 关于此应用程序 @@ -16051,25 +16133,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - 清除输入 - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun 搜索 - + Clear input 清除输入 @@ -16080,93 +16150,87 @@ This can not be undone! 查找... - + Clear the search bar input field 清除搜索栏输入字段 - - Enter a string to search for - 输入要搜索的字符串 + + Return + 返回 - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - 使用运算符,如 bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - 有关更多信息,请参阅 Mixxx Library >用户手册 + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - 快捷键 + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - 焦点 + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl+退格键 + + Additional Shortcuts When Focused: + - Shortcuts - 快捷方式 + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - 返回 + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - 在键入时搜索超时之前触发搜索,或在之后跳转到轨道视图 + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl + 空格键 - + Toggle search history Shows/hides the search history entries 切换搜索历史记录 - + Delete or Backspace 删除或退格 - - Delete query from history - 从历史记录中删除查询 - - - - Esc - Esc + + in search history + - - Exit search - Exit search bar and leave focus - 退出查找 + + Delete query from history + 从历史记录中删除查询 @@ -16922,37 +16986,37 @@ This can not be undone! WTrackTableView - + Confirm track hide 确认轨道隐藏 - + Are you sure you want to hide the selected tracks? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from AutoDJ queue? 您确定要从 AutoDJ 队列中删除选定的曲目吗? - + Are you sure you want to remove the selected tracks from this crate? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from this playlist? 您确定要从此播放列表中删除选定的曲目吗? - + Don't ask again during this session 在此会话期间不要再次询问 - + Confirm track removal 确认轨道移除 @@ -16973,52 +17037,52 @@ This can not be undone! mixxx::CoreServices - + fonts 字体 - + database 数据库 - + effects 效果 - + audio interface 音频接口 - + decks 甲板 - + library 媒体库 - + Choose music library directory 选择音乐库目录 - + controllers 控制器 - + Cannot open database 无法打开数据库 - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17032,68 +17096,78 @@ Mixxx 需要 QT 支持 SQLite。请阅读 Qt SQL 驱动文档以了解相关构 mixxx::DlgLibraryExport - + Entire music library 整个音乐库 - - Selected crates - 选中的箱子 + + Crates + + + + + Playlists + - + + Selected crates/playlists + + + + Browse 浏览 - + Export directory 导出目录 - + Database version 数据库版本 - + Export 导出 - + Cancel 取消 - + Export Library to Engine DJ "Engine DJ" must not be translated 导出到 Engine DJ - + Export Library To 导出到 - + No Export Directory Chosen 未选择导出目录 - + No export directory was chosen. Please choose a directory in order to export the music library. 未选择导出目录。请选择一个目录以导出音乐库。 - + A database already exists in the chosen directory. Exported tracks will be added into this database. 所选目录中已存在数据库。导出的轨道将被添加到此数据库中。 - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. 所选目录中已存在数据库,但加载该数据库时出现问题。在这种情况下,不能保证导出成功。 @@ -17114,7 +17188,7 @@ Mixxx 需要 QT 支持 SQLite。请阅读 Qt SQL 驱动文档以了解相关构 mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17125,22 +17199,22 @@ Mixxx 需要 QT 支持 SQLite。请阅读 Qt SQL 驱动文档以了解相关构 mixxx::LibraryExporter - + Export Completed 导出已完成 - - Exported %1 track(s) and %2 crate(s). - 导出了 %1 个轨道和 %2 个板条箱。 + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed 导出失败 - + Exporting to Engine DJ... 正在导出到 Engine DJ.. diff --git a/res/translations/mixxx_zh_HK.qm b/res/translations/mixxx_zh_HK.qm index 3b59eb730932f76f2744405275cdc2a81e95aba4..028d3619dd3f41f1722d23d147eac9946bb7a729 100644 GIT binary patch delta 23683 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≪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 delta 24180 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 diff --git a/res/translations/mixxx_zh_HK.ts b/res/translations/mixxx_zh_HK.ts index 4a7cafd49a05..3e6afe942954 100644 --- a/res/translations/mixxx_zh_HK.ts +++ b/res/translations/mixxx_zh_HK.ts @@ -153,7 +153,7 @@ BasePlaylistFeature - + New Playlist 新的播放清單 @@ -165,7 +165,7 @@ - + Create New Playlist 建立新的播放清單 @@ -197,117 +197,124 @@ 複製 - - + + Import Playlist 輸入播放清單 - + Export Track Files 輸出音檔 - + Analyze entire Playlist 分析整個播放清單 - + Enter new name for playlist: 为播放列表设置新的名称: - + Duplicate Playlist 重複播放清單 - - + + Enter name for new playlist: 輸入新播放清單名稱︰ - - + + Export Playlist 匯出播放清單 - + Add to Auto DJ Queue (replace) 加入自動 DJ 柱列 (取代) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist 重命名播放列表 - - + + Renaming Playlist Failed 重新命名播放清單失敗 - - - + + + A playlist by that name already exists. 使用该名称的播放列表已存在。 - - - + + + A playlist cannot have a blank name. 播放清單名稱不能為空白。 - + _copy //: Appendix to default name when duplicating a playlist _複製 - - - - - - + + + + + + Playlist Creation Failed 播放清單創建失敗 - - + + An unknown error occurred while creating playlist: 建立播放清單時發生未知的錯誤︰ - + Confirm Deletion 确认删除 - + Do you really want to delete playlist <b>%1</b>? 您真的要删除播放列表%1? - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可讀的文本 (*.txt) @@ -315,12 +322,12 @@ BaseSqlTableModel - + # # - + Timestamp 时间标记 @@ -328,7 +335,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 無法載入音軌 @@ -336,142 +343,142 @@ BaseTrackTableModel - + Album 专辑 - + Album Artist 专辑艺术家 - + Artist 歌手 - + Bitrate 位元速率 - + BPM BPM - + Channels 電視頻道 - + Color 颜色 - + Comment 备注 - + Composer 作曲家 - + Cover Art 封面 - + Date Added 加入日期 - + Last Played 最后播放 - + Duration 持續時間 - + Type 类型 - + Genre 體裁 - + Grouping 分组 - + Key 關鍵 - + Location 地點 - + Overview - + Preview 預覽 - + Rating 评分 - + ReplayGain 播放音量增益 - + Samplerate 采样率 - + Played 已播放 - + Title 標題 - + Track # 軌道 # - + Year 年份 - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk 獲取圖片中... @@ -620,6 +627,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. “我的电脑”可以让您从您的硬盘及外置设备中浏览、查看、载入音轨 + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -2456,12 +2473,12 @@ trace - Above + Profiling messages Tempo Tap - + 节奏敲击 Tempo tap button - + 节奏敲击按钮 @@ -3645,32 +3662,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. 在問題解決之前,此控制器映射提供的功能將被禁用。 - + You can ignore this error for this session but you may experience erratic behavior. 您可以在此會話中忽略此錯誤,但可能會出現不穩定的行為。 - + Try to recover by resetting your controller. 嘗試恢復通過重置您的控制器。 - + Controller Mapping Error 控制器映射錯誤 - + The mapping for your controller "%1" is not working properly. 控制器“%1”的映射工作不正常。 - + The script code needs to be fixed. 脚本代码需要被修复。 @@ -3781,7 +3798,7 @@ trace - Above + Profiling messages 匯入箱 - + Export Crate 导出分类列表 @@ -3791,7 +3808,7 @@ trace - Above + Profiling messages 解鎖 - + An unknown error occurred while creating crate: 創建音樂箱時發生未知的錯誤︰ @@ -3817,17 +3834,17 @@ trace - Above + Profiling messages 重命名分类列表失败 - + Crate Creation Failed 建立音樂箱失敗 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可讀的文本 (*.txt) - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) @@ -3953,12 +3970,12 @@ trace - Above + Profiling messages 過去的貢獻者 - + Official Website 官方网站 - + Donate 捐献 @@ -4014,7 +4031,7 @@ trace - Above + Profiling messages - + Analyze 分析 @@ -4059,17 +4076,17 @@ trace - Above + Profiling messages 在選定的曲目上運行節拍、音調和增益檢測。選定的曲目不會生成波形,以節省磁碟空間。 - + Stop Analysis 停止分析 - + Analyzing %1% %2/%3 分析 %1% %2/%3 - + Analyzing %1/%2 分析 %1/%2 @@ -4486,37 +4503,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h 若映射不正确,请尝试启用下方的高级选项,然后重试。或者点击“重试”来重新检测 midi 控制器。 - + Didn't get any midi messages. Please try again. 未收到 midi 消息。请重试。 - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. 无法检测映射 - 请重试。请确保每次只操作一个控制器。 - + Successfully mapped control: 成功映射控制器: - + <i>Ready to learn %1</i> <i>现在可以学习 %1</i> - + Learning: %1. Now move a control on your controller. 正在学习:%1。现在请对控制器进行操作。 - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5219,114 +5236,114 @@ associated with each key. DlgPrefController - + Apply device settings? 應用設備設置嗎? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? 開始學習嚮導前,必須應用您的設置。 應用設置並繼續? - + None - + %1 by %2 %2 %1 - + Mapping has been edited 映射已编辑 - + Always overwrite during this session 在此会话期间始终覆盖 - + Save As 另存为 - + Overwrite 覆盖 - + Save user mapping 保存用户映射 - + Enter the name for saving the mapping to the user folder. 输入用于将映射保存到用户文件夹的名称。 - + Saving mapping failed 保存映射失败 - + A mapping cannot have a blank name and may not contain special characters. 映射不能具有空白名称,并且不能包含特殊字符。 - + A mapping file with that name already exists. 具有该名称的映射文件已存在。 - + Do you want to save the changes? 是否要保存更改? - + Troubleshooting 疑難排解 - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. 如果使用此映射,则控制器可能无法正常工作。请选择其他映射或禁用控制器。此映射专为较新的 Mixxx 控制器引擎而设计,不能用于您当前的 Mixxx 安装。您的 Mixxx 安装的 Controller Engine 版本为 %1。此映射需要 Controller Engine 版本 >= %2。有关更多信息,请访问有关 Controller Engine 版本的 wiki 页面。 - + Mapping already exists. 映射已存在。 - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b>已存在于用户映射文件夹中.<br>覆盖还是用新名称保存? - + Clear Input Mappings 清除输入映射 - + Are you sure you want to clear all input mappings? 你確定你想要清除所有輸入的映射? - + Clear Output Mappings 清除輸出映射 - + Are you sure you want to clear all output mappings? 你確定你想要清除所有輸出映射? @@ -5658,6 +5675,16 @@ Apply settings and continue? Multi-Sampling 多重采样 + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6266,62 +6293,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. 所選的外觀的最小大小大於您的螢幕解析度。 - + Allow screensaver to run 允许屏幕保护程序运行 - + Prevent screensaver from running 防止屏幕保护程序运行 - + Prevent screensaver while playing 播放时防止屏幕保护程序运行 - + Disabled 禁用 - + 2x MSAA 2倍采样抗锯齿 - + 4x MSAA 4倍采样抗锯齿 - + 8x MSAA 8倍采样抗锯齿 - + 16x MSAA 16倍采样抗锯齿 - + This skin does not support color schemes 這種皮膚不支援色彩配置 - + Information 資訊 - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. 在新的区域设置、缩放或多重采样设置生效之前,必须重新启动Mixxx。 @@ -7259,7 +7286,7 @@ and allows you to pitch adjust them for harmonic mixing. All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - + 所有设置都会在下一次轨道加载时生效。当前加载的轨迹不受影响。有关这些设置的说明,请参阅 %1 @@ -7498,173 +7525,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 赫兹 - + Default (long delay) 默认(长延时) - + Experimental (no delay) 试验(无延时) - + Disabled (short delay) 禁用 (短延時) - + Soundcard Clock 声卡时钟 - + Network Clock 网络时钟 - + Direct monitor (recording and broadcasting only) 直接监视器(仅限录制和广播) - + Disabled 已禁用 - + Enabled 啟用 - + Stereo 立体声 - + Mono 單聲道 - + To enable Realtime scheduling (currently disabled), see the %1. 要启用实时计划(当前已禁用),请参阅 %1。 - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 列出了您可能需要考虑使用 Mixxx 的声卡和控制器。 - + Mixxx DJ Hardware Guide Mixxx DJ 硬件指南 - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) 自动(<= 1024 帧/周期) - + 2048 frames/period 2048 帧/周期 - + 4096 frames/period 4096 帧/周期 - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. 与您听到的相比,麦克风输入在录音和广播信号中显得不合时宜。 - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 测量往返延迟,并在上方输入麦克风延迟补偿以对齐麦克风计时。 - - + Refer to the Mixxx User Manual for details. 細節請參考Mixxx 使用者操作手冊 - + Configured latency has changed. 配置的延迟已更改。 - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 重新测量往返延迟,并将其输入到麦克风延迟补偿上方,以调整麦克风定时。 - + Realtime scheduling is enabled. 已启用实时调度。 - + Main output only 仅主输出 - + Main and booth outputs 主输出和展位输出 - + %1 ms %1 ms - + Configuration error 配置錯誤 @@ -7682,131 +7708,131 @@ The loudness target is approximate and assumes track pregain and main output lev 聲音 API - + Sample Rate 采样率 - + Audio Buffer 音频缓冲 - + Engine Clock 引擎时钟 - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. 使用声卡时钟进行现场观众设置和最低延迟。1使用网络时钟进行没有现场观众的广播。 - + Main Mix 主混合 - + Main Output Mode 主输出模式 - + Microphone Monitor Mode 麦克风监听模式 - + Microphone Latency Compensation 麦克风延迟补偿 - - - - + + + + ms milliseconds 女士 - + 20 ms 為 20 毫秒 - + Buffer Underflow Count 緩衝區下溢計數 - + 0 0 - + Keylock/Pitch-Bending Engine 键盘锁 / 滑音引擎 - + Multi-Soundcard Synchronization 多音效卡同步 - + Output 輸出 - + Input 輸入 - + System Reported Latency 系統報告延遲 - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. 若下溢计数持续增加,或者您听到“啪啪”声,请增大您的音频缓冲区。 - + Main Output Delay 主输出延迟 - + Headphone Output Delay 耳机输出延迟 - + Booth Output Delay Booth输出延迟 - + Dual-threaded Stereo - + Hints and Diagnostics 提示和診斷 - + Downsize your audio buffer to improve Mixxx's responsiveness. 若需提升 Mixxx 的响应速度,请降低您的音频缓冲区大小。 - + Query Devices 查詢設備 @@ -9366,27 +9392,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (更快) - + Rubberband (better) 橡皮條 (更好) - + Rubberband R3 (near-hi-fi quality) 接近高保真质量 - + Unknown, using Rubberband (better) 未知,使用更好 - + Unknown, using Soundtouch 未知,使用 Soundtouch @@ -9601,15 +9627,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. 已启用安全模式 - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9621,57 +9647,57 @@ Shown when VuMeter can not be displayed. Please keep 支持。 - + activate 启用 - + toggle 切換 - + right - + left - + right small 右小 - + left small 左小 - + up 向上 - + down - + up small 小了 - + down small 下小 - + Shortcut 快捷方式 @@ -9679,37 +9705,37 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. 此目录或父目录已位于您的库中。 - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies 此目录或列出的目录不存在或无法访问。 中止操作以避免库不一致 - - + + This directory can not be read. 无法读取此目录。 - + An unknown error occurred. Aborting the operation to avoid library inconsistencies 发生未知错误。 中止操作以避免库不一致 - + Can't add Directory to Library 无法将目录添加到库 - + Could not add <b>%1</b> to your library. %2 @@ -9718,27 +9744,27 @@ Aborting the operation to avoid library inconsistencies %2 - + Can't remove Directory from Library 无法从库中删除目录 - + An unknown error occurred. 发生未知错误。 - + This directory does not exist or is inaccessible. 此目录不存在或无法访问。 - + Relink Directory 重新链接目录 - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9750,23 +9776,23 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist 輸入播放清單 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 播放清單檔 (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? 覆盖文件? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9917,251 +9943,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy 声音设备正忙 - + <b>Retry</b> after closing the other application or reconnecting a sound device 關閉其他應用程式或重新連接聲音設備後 <b>重試</b> - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>重新配置</b> Mixxx 声音设备。 - - + + Get <b>Help</b> from the Mixxx Wiki. 从 Mixxx Wiki 中获取<b>帮助</b>。 - - - + + + <b>Exit</b> Mixxx. <b>退出</b> Mixxx。 - + Retry 重试 - + skin 皮肤 - + Allow Mixxx to hide the menu bar? 允许 Mixxx 隐藏菜单栏? - + Hide Always show the menu bar? 隐藏 - + Always show 始终显示 - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Mixxx 菜单栏是隐藏的,只需按一下<b>Alt 键</b>钥匙。<br><br>点击<b>%1</b>同意。<br><br>点击<b>%2</b>以禁用它,例如,如果您不将 Mixxx 与键盘一起使用。<br><br>您可以随时在 Preferences -> Interface 中更改此设置。<br> - + Ask me again 再问我一次 - - + + Reconfigure 重新配置 - + Help 帮助 - - + + Exit 退出 - - + + Mixxx was unable to open all the configured sound devices. Mixxx 无法打开所有要打开的音频设备 - + Sound Device Error 音频设备错误 - + <b>Retry</b> after fixing an issue 修正错误后 <b> 重试 </b> - + No Output Devices 没有输出设备 - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx 的配置中没有任何输出设备,将会禁用音频处理操作。 - + <b>Continue</b> without any outputs. <b>繼續</b> 沒有任何產出。 - + Continue 继续 - + Load track to Deck %1 加载音轨到碟机 %1 - + Deck %1 is currently playing a track. 甲板 %1 當前播放的曲目。 - + Are you sure you want to load a new track? 你確定你想要載入一個新的軌道? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. 尚未选择用于唱盘控制的输入设备。 请在声音硬件的首选项中选择一个输入设备。 - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. 有是沒有為此直通控制項選擇的輸入的設備。 請先在聲音硬體首選項中選擇一種輸入的設備。 - + There is no input device selected for this microphone. Do you want to select an input device? 没有为此麦克风选择输入设备。是否要选择输入设备? - + There is no input device selected for this auxiliary. Do you want to select an input device? 没有为此辅助设备选择输入设备。是否要选择输入设备? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file 皮膚檔中的錯誤 - + The selected skin cannot be loaded. 無法載入所選的外觀。 - + OpenGL Direct Rendering OpenGL 直接繪製 - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. 您的计算机上未启用直接渲染。<br><br>这意味着波形显示将非常<br><b>速度慢,并且可能会严重占用您的 CPU</b>.要么更新您的<br>配置以启用直接渲染或禁用<br>波形将通过选择 Mixxx 首选项显示在<br>“空”作为“界面”部分的波形显示。 - - - + + + Confirm Exit 确认退出 - + A deck is currently playing. Exit Mixxx? 有唱机正在播放。确定退出 Mixxx 吗? - + A sampler is currently playing. Exit Mixxx? 當前現正播放採樣器。退出 Mixxx 嗎? - + The preferences window is still open. 首選項視窗是仍處於打開狀態。 - + Discard any changes and exit Mixxx? 放棄所有更改並退出 Mixxx? @@ -10177,14 +10203,14 @@ Do you want to select an input device? PlaylistFeature - + Lock - - + + Playlists 播放列表 @@ -10194,32 +10220,58 @@ Do you want to select an input device? 随机播放播放列表 - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock 解鎖 - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. 播放列表是有序的曲目列表,允许您规划 DJ 集。 - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. 可能需要跳过您准备好的播放列表中的一些曲目或添加一些不同的曲目,以保持观众的活力。 - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. 一些DJ在他们表演之前创建播放列表,但其他人更倾向于即兴表演。 - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. 在在线 Dj 集中使用播放列表时,请时刻注意您的听众对所选音乐的反应。 - + Create New Playlist 建立新的播放清單 @@ -11859,7 +11911,7 @@ Hint: compensates "chipmunk" or "growling" voices Soft Clipping - + Soft Clipping @@ -11878,7 +11930,7 @@ Hint: compensates "chipmunk" or "growling" voices 应用于音频信号的放大量。在更高的级别上,音频将更加分散。 - + Passthrough 直通 @@ -12048,12 +12100,12 @@ may introduce a 'pumping' effect and/or distortion. 各种 - + built-in - + missing @@ -12181,54 +12233,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists 播放列表 - + Folders 文件夹 - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: 读取使用 Rekordbox 导出模式为 Pioneer CDJ/XDJ 播放器导出的数据库。1Rekordbox 只能导出到具有 FAT 或 HFS 文件系统的 USB 或 SD 设备。2Mixxx 可以从包含数据库文件夹 (3先锋3和4内容4).5不支持已通过67高级>数据库管理>首选项7.89读取以下数据: - + Hot cues - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) Loops(目前只有第一个 Loop 在 Mixxx 中可用) - + Check for attached Rekordbox USB / SD devices (refresh) 检查连接的 Rekordbox USB/SD 设备(刷新) - + Beatgrids 节拍网格 - + Memory cues 记忆线索 - + (loading) Rekordbox (加载中)Rekordbox @@ -15155,7 +15207,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Beatloop - + 节拍循环 @@ -15474,47 +15526,47 @@ This can not be undone! WCueMenuPopup - + Cue number 提示编号 - + Cue position 提示位置 - + Edit cue label Edit cue label(编辑提示标签) - + Label... 标签 - + Delete this cue 删除此提示 - + Toggle this cue type between normal cue and saved loop 在正常提示点和保存的 Loop 之间切换此提示类型 - + Left-click: Use the old size or the current beatloop size as the loop size 左键单击:使用旧大小或当前 Beatloop 大小作为 Loop 大小 - + Right-click: Use the current play position as loop end if it is after the cue 右键点击:如果当前播放位置在 cue 之后,则将其用作 Loop 结束 - + Hotcue #%1 热提示 #%1 @@ -15639,323 +15691,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist 創建與新的播放清單 - + Create a new playlist 新建播放列表 - + Ctrl+n Ctrl n + - + Create New &Crate 創建新 & 箱 - + Create a new crate 創建一個新的箱子 - + Ctrl+Shift+N Ctrl + Shift + N - - + + &View 查看(&V) - + Auto-hide menu bar 自动隐藏菜单栏 - + Auto-hide the main menu bar when it's not used. 不使用主菜单栏时自动隐藏主菜单栏。 - + May not be supported on all skins. 并非所有皮肤均支持。 - + Show Skin Settings Menu 皮肤设置菜单 - + Show the Skin Settings Menu of the currently selected Skin 显示当前选定皮肤的皮肤设置菜单 - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl 1 + - + Show Microphone Section 顯示麥克風節 - + Show the microphone section of the Mixxx interface. 顯示 Mixxx 介面的麥克風部分。 - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl+2 - + Show Vinyl Control Section 显示唱盘控制界面 - + Show the vinyl control section of the Mixxx interface. 顯示 Mixxx 介面的乙烯基控制部分。 - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl 3 + - + Show Preview Deck 顯示預覽甲板 - + Show the preview deck in the Mixxx interface. 在 Mixxx 内显示显示预览用碟机。 - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl+4 - + Show Cover Art 显示封面 - + Show cover art in the Mixxx interface. 在 Mixxx 介面中顯示封面藝術。 - + Ctrl+6 Menubar|View|Show Cover Art Ctrl 6 + - + Maximize Library 最大化音乐库 - + Maximize the track library to take up all the available screen space. 最大化音樂庫以佔用所有可用的螢幕空間。 - + Space Menubar|View|Maximize Library 空間 - + &Full Screen 全屏(&F) - + Display Mixxx using the full screen 使用全螢幕的顯示 Mixxx - + &Options 选项(&O) - + &Vinyl Control 與乙烯基控制 - + Use timecoded vinyls on external turntables to control Mixxx 对外部转盘使用时间编码的唱盘控制,以便控制 Mixxx - + Enable Vinyl Control &%1 啟用乙烯控制 & %1 - + &Record Mix 與記錄組合 - + Record your mix to a file 記錄你組合到一個檔 - + Ctrl+R Ctrl+R - + Enable Live &Broadcasting 啟用即時 & 廣播 - + Stream your mixes to a shoutcast or icecast server 将混音通过流输出到 shoutcast 或 icecast 服务器 - + Ctrl+L 按 Ctrl + L - + Enable &Keyboard Shortcuts 启用键快捷键(&K) - + Toggles keyboard shortcuts on or off 键盘快捷键开关 - + Ctrl+` 按 Ctrl +' - + &Preferences 首选项(&P) - + Change Mixxx settings (e.g. playback, MIDI, controls) 改變 Mixxx 的設置 (例如播放 MIDI,控制項) - + &Developer 與開發人員 - + &Reload Skin 重载皮肤(&R) - + Reload the skin 重新載入皮膚 - + Ctrl+Shift+R Ctrl+Shift+R - + Developer &Tools 开发者工具(&T) - + Opens the developer tools dialog 打開開發人員工具對話方塊 - + Ctrl+Shift+T Ctrl + Shift + T - + Stats: &Experiment Bucket 統計: & 實驗鬥 - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. 使實驗模式。收集統計實驗跟蹤存儲桶中。 - + Ctrl+Shift+E Ctrl+Shift+E - + Stats: &Base Bucket 統計: & 基地鬥 - + Enables base mode. Collects stats in the BASE tracking bucket. 启用基础模式。统计数据将会收集到基础跟踪桶中。 - + Ctrl+Shift+B Ctrl+Shift+B - + Deb&ugger Enabled 调试器已启用(&U) - + Enables the debugger during skin parsing 在皮膚分析過程中啟用調試器 - + Ctrl+Shift+D 按 Ctrl + Shift + D - + &Help 與説明 - + Show Keywheel menu title 显示 Keywheel @@ -15972,74 +16054,74 @@ This can not be undone! 将库导出为 Engine DJ 格式 - + Show keywheel tooltip text 显示 Keywheel - + F12 Menubar|View|Show Keywheel F12 - + &Community Support 社区帮助(&C) - + Get help with Mixxx 獲得 Mixxx 的説明 - + &User Manual 與使用者手冊 - + Read the Mixxx user manual. 閱讀 Mixxx 使用者手冊。 - + &Keyboard Shortcuts 键盘快捷键(&K) - + Speed up your workflow with keyboard shortcuts. 加快您的工作流使用鍵盤快速鍵。 - + &Settings directory &设置目录 - + Open the Mixxx user settings directory. 打开 Mixxx 用户设置目录。 - + &Translate This Application 翻译这个程序(&T) - + Help translate this application into your language. 幫忙翻譯成您的語言此應用程式。 - + &About 关于(&A) - + About the application 有關應用程式 @@ -16074,25 +16156,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - 清除輸入 - - - - Ctrl+F - Search|Focus - Ctrl+F - - - + Search noun 搜索 - + Clear input 清除輸入 @@ -16103,93 +16173,87 @@ This can not be undone! 搜索... - + Clear the search bar input field 清除搜索栏输入字段 - - Enter a string to search for - 輸入要搜索的字串 + + Return + 返回 - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - 使用运算符,如 bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - 有关更多信息,请参阅 Mixxx Library >用户手册 + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - 快捷方式 + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl+F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - 焦點 + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl + 倒退鍵 + + Additional Shortcuts When Focused: + - Shortcuts - 快捷方式 + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - 返回 + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - 在键入时搜索超时之前触发搜索,或在之后跳转到轨道视图 + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl + 空格键 - + Toggle search history Shows/hides the search history entries 切换搜索历史记录 - + Delete or Backspace 删除或退格 - - Delete query from history - 从历史记录中删除查询 - - - - Esc - 按 esc 鍵 + + in search history + - - Exit search - Exit search bar and leave focus - 退出搜索 + + Delete query from history + 从历史记录中删除查询 @@ -16951,37 +17015,37 @@ This can not be undone! WTrackTableView - + Confirm track hide 确认轨道隐藏 - + Are you sure you want to hide the selected tracks? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from AutoDJ queue? 您确定要从 AutoDJ 队列中删除选定的曲目吗? - + Are you sure you want to remove the selected tracks from this crate? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from this playlist? 您确定要从此播放列表中删除选定的曲目吗? - + Don't ask again during this session 在此会话期间不要再次询问 - + Confirm track removal 确认轨道移除 @@ -17002,52 +17066,52 @@ This can not be undone! mixxx::CoreServices - + fonts 字体 - + database 数据库 - + effects 效果 - + audio interface 音频接口 - + decks 甲板 - + library 媒体库 - + Choose music library directory 選擇音樂庫目錄 - + controllers 控制器 - + Cannot open database 無法打開資料庫 - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17061,68 +17125,78 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::DlgLibraryExport - + Entire music library 整个音乐库 - - Selected crates - 选中的箱子 + + Crates + + + + + Playlists + - + + Selected crates/playlists + + + + Browse 流覽 - + Export directory 导出目录 - + Database version 数据库版本 - + Export 导出 - + Cancel 取消 - + Export Library to Engine DJ "Engine DJ" must not be translated 导出到 Engine DJ - + Export Library To 导出到 - + No Export Directory Chosen 未选择导出目录 - + No export directory was chosen. Please choose a directory in order to export the music library. 未选择导出目录。请选择一个目录以导出音乐库。 - + A database already exists in the chosen directory. Exported tracks will be added into this database. 所选目录中已存在数据库。导出的轨道将被添加到此数据库中。 - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. 所选目录中已存在数据库,但加载该数据库时出现问题。在这种情况下,不能保证导出成功。 @@ -17143,7 +17217,7 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17154,22 +17228,22 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::LibraryExporter - + Export Completed 导出已完成 - - Exported %1 track(s) and %2 crate(s). - 导出了 %1 个轨道和 %2 个板条箱。 + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed 导出失败 - + Exporting to Engine DJ... 正在导出到 Engine DJ.. diff --git a/res/translations/mixxx_zh_TW.qm b/res/translations/mixxx_zh_TW.qm index ca186820945bf0af8a7aa957ed3719e195a9f97e..a7c22a302364de197c5ec5ff23eebef3e9992164 100644 GIT binary patch delta 23443 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 P?a`}oi*BnmYgPXPfmnf? diff --git a/res/translations/mixxx_zh_TW.ts b/res/translations/mixxx_zh_TW.ts index 8a0a7659e3a3..1e26e430fae3 100644 --- a/res/translations/mixxx_zh_TW.ts +++ b/res/translations/mixxx_zh_TW.ts @@ -149,7 +149,7 @@ BasePlaylistFeature - + New Playlist 新增播放清單 @@ -160,7 +160,7 @@ - + Create New Playlist 建立新的播放清單 @@ -190,113 +190,120 @@ 複製 - - + + Import Playlist 匯入播放清單 - + Export Track Files 匯出曲目檔案 - + Analyze entire Playlist 分析整個播放清單 - + Enter new name for playlist: 輸入新播放清單名稱︰ - + Duplicate Playlist 重複播放清單 - - + + Enter name for new playlist: 輸入新播放清單名稱︰ - - + + Export Playlist 匯出播放清單 - + Add to Auto DJ Queue (replace) 加到自動 DJ 佇列(取代) - + + + Export to Engine DJ + "Engine DJ" is a product name and must not be translated. + + + + Rename Playlist 重新命名播放清單 - - + + Renaming Playlist Failed 重新命名播放清單失敗 - - - + + + A playlist by that name already exists. 該名稱的播放清單已存在。 - - - + + + A playlist cannot have a blank name. 播放清單不能為空白的名稱。 - + _copy //: Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed 播放清單建立失敗 - - + + An unknown error occurred while creating playlist: 建立播放清單時發生未知的錯誤︰ - + Confirm Deletion 確認删除 - + Do you really want to delete playlist <b>%1</b>? 您確定要刪除播放清單 <b>%1</b>嗎? - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可閱讀的文字 (*.txt) @@ -304,12 +311,12 @@ BaseSqlTableModel - + # # - + Timestamp 時間戳記 @@ -317,7 +324,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 無法載入曲目。 @@ -325,142 +332,142 @@ BaseTrackTableModel - + Album 專輯 - + Album Artist 專輯演出者 - + Artist 演出者 - + Bitrate 位元速率 - + BPM BPM - + Channels 電視頻道 - + Color 顏色 - + Comment 評論 - + Composer 作曲者 - + Cover Art 封面 - + Date Added 加入日期 - + Last Played 最後播放 - + Duration 持續時間 - + Type 類型 - + Genre 曲風 - + Grouping 分組 - + Key 音調 - + Location 位置 - + Overview - + Preview 預覽 - + Rating 評分 - + ReplayGain 重播增益 - + Samplerate 取樣率 - + Played 已播放 - + Title 標題 - + Track # 曲目 # - + Year 年份 - + Fetching image ... Tooltip text on the cover art column shown when the cover is read from disk 獲取圖片中... @@ -609,6 +616,16 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. 「電腦」可讓您從硬碟和外部裝置上的資料夾中導覽、檢視和載入曲目。 + + + It shows the data from the file tags, not track data from your Mixxx library like other track views. + + + + + If you load a track file from here, it will be added to your library. + + BrowseTableModel @@ -2443,12 +2460,12 @@ trace - Above + Profiling messages Tempo Tap - + 节奏敲击 Tempo tap button - + 节奏敲击按钮 @@ -3632,32 +3649,32 @@ trace - Above + Profiling messages ControllerScriptEngineBase - + The functionality provided by this controller mapping will be disabled until the issue has been resolved. 在問題解決之前,此控制器映射提供的功能將被禁用。 - + You can ignore this error for this session but you may experience erratic behavior. 您可以在此會話中忽略此錯誤,但可能會出現不穩定的行為。 - + Try to recover by resetting your controller. 嘗試恢復通過重置您的控制器。 - + Controller Mapping Error 控制器映射錯誤 - + The mapping for your controller "%1" is not working properly. 控制器“%1”的映射工作不正常。 - + The script code needs to be fixed. 腳本代碼需要修理。 @@ -3765,7 +3782,7 @@ trace - Above + Profiling messages 匯入箱 - + Export Crate 匯出音樂箱 @@ -3775,7 +3792,7 @@ trace - Above + Profiling messages 解鎖 - + An unknown error occurred while creating crate: 創建音樂箱時發生未知的錯誤︰ @@ -3801,17 +3818,17 @@ trace - Above + Profiling messages 音樂箱重新命名失敗 - + Crate Creation Failed 建立音樂箱失敗 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可讀的文本 (*.txt) - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) @@ -3937,12 +3954,12 @@ trace - Above + Profiling messages 過去的貢獻者 - + Official Website 官方网站 - + Donate 捐献 @@ -3998,7 +4015,7 @@ trace - Above + Profiling messages - + Analyze 分析 @@ -4043,17 +4060,17 @@ trace - Above + Profiling messages 在選定的曲目上運行節拍、音調和增益檢測。選定的曲目不會生成波形,以節省磁碟空間。 - + Stop Analysis 停止分析 - + Analyzing %1% %2/%3 分析 %1% %2/%3 - + Analyzing %1/%2 分析 %1/%2 @@ -4470,37 +4487,37 @@ Often results in higher quality beatgrids, but will not do well on tracks that h 如果映射不是工作嘗試啟用高級的選項下面,然後試著控制再一次。或按一下重試重新檢測 midi 控制。 - + Didn't get any midi messages. Please try again. 沒有得到任何的 midi 消息。 請再試一次。 - + Unable to detect a mapping -- please try again. Be sure to only touch one control at once. 無法檢測到的映射 — — 請再試一次。要確保只有一次觸摸一個控制項。 - + Successfully mapped control: 成功映射的控制項︰ - + <i>Ready to learn %1</i> <i>準備好要學習 %1</i> - + Learning: %1. Now move a control on your controller. 學習: %1。現在移動您的控制器上的一個控制項。 - + The selected control does not exist.<br>This likely a bug. Please report it on the Mixxx bug tracker.<br><a href='https://github.com/mixxxdj/mixxx/issues'>https://github.com/mixxxdj/mixxx/issues</a><br><br>You tried to learn: %1,%2 - + The control you clicked in Mixxx is not learnable. This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. @@ -5203,114 +5220,114 @@ associated with each key. DlgPrefController - + Apply device settings? 應用設備設置嗎? - + Your settings must be applied before starting the learning wizard. Apply settings and continue? 開始學習嚮導前,必須應用您的設置。 應用設置並繼續? - + None 沒有一個 - + %1 by %2 %2 %1 - + Mapping has been edited 映射已编辑 - + Always overwrite during this session 在此会话期间始终覆盖 - + Save As 另存为 - + Overwrite 覆盖 - + Save user mapping 保存用户映射 - + Enter the name for saving the mapping to the user folder. 输入用于将映射保存到用户文件夹的名称。 - + Saving mapping failed 保存映射失败 - + A mapping cannot have a blank name and may not contain special characters. 映射不能具有空白名称,并且不能包含特殊字符。 - + A mapping file with that name already exists. 具有该名称的映射文件已存在。 - + Do you want to save the changes? 是否要保存更改? - + Troubleshooting 疑難排解 - + <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. 如果使用此映射,则控制器可能无法正常工作。请选择其他映射或禁用控制器。此映射专为较新的 Mixxx 控制器引擎而设计,不能用于您当前的 Mixxx 安装。您的 Mixxx 安装的 Controller Engine 版本为 %1。此映射需要 Controller Engine 版本 >= %2。有关更多信息,请访问有关 Controller Engine 版本的 wiki 页面。 - + Mapping already exists. 映射已存在。 - + <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? <b>%1</b>已存在于用户映射文件夹中.<br>覆盖还是用新名称保存? - + Clear Input Mappings 清除輸入的映射 - + Are you sure you want to clear all input mappings? 你確定你想要清除所有輸入的映射? - + Clear Output Mappings 清除輸出映射 - + Are you sure you want to clear all output mappings? 你確定你想要清除所有輸出映射? @@ -5641,6 +5658,16 @@ Apply settings and continue? Multi-Sampling 多重采样 + + + Force 3D acceleration + + + + + If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. + + Start in full-screen mode @@ -6249,62 +6276,62 @@ You can always drag-and-drop tracks on screen to clone a deck. DlgPrefInterface - + The minimum size of the selected skin is bigger than your screen resolution. 所選的外觀的最小大小大於您的螢幕解析度。 - + Allow screensaver to run 允許螢幕保護程式執行 - + Prevent screensaver from running 在程式運行中防止螢幕保護程式 - + Prevent screensaver while playing 當播放歌曲時禁止螢幕保護程式 - + Disabled 禁用 - + 2x MSAA 2倍采样抗锯齿 - + 4x MSAA 4倍采样抗锯齿 - + 8x MSAA 8倍采样抗锯齿 - + 16x MSAA 16倍采样抗锯齿 - + This skin does not support color schemes 這種皮膚不支援色彩配置 - + Information 資訊 - + Mixxx must be restarted before the new locale, scaling or multi-sampling settings will take effect. 在新的区域设置、缩放或多重采样设置生效之前,必须重新启动Mixxx。 @@ -7234,7 +7261,7 @@ and allows you to pitch adjust them for harmonic mixing. All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - + 所有设置都会在下一次轨道加载时生效。当前加载的轨迹不受影响。有关这些设置的说明,请参阅 %1 @@ -7473,173 +7500,172 @@ The loudness target is approximate and assumes track pregain and main output lev DlgPrefSound - + %1 Hz %1 Hz - + Default (long delay) 預設 (長時間的延遲) - + Experimental (no delay) 實驗 (無延時) - + Disabled (short delay) 禁用 (短延時) - + Soundcard Clock 声卡时钟 - + Network Clock 网络时钟 - + Direct monitor (recording and broadcasting only) 直接监视器(仅限录制和广播) - + Disabled 已禁用 - + Enabled 啟用 - + Stereo 身歷聲 - + Mono 單聲道 - + To enable Realtime scheduling (currently disabled), see the %1. 要启用实时计划(当前已禁用),请参阅 %1。 - + The %1 lists sound cards and controllers you may want to consider for using Mixxx. %1 列出了您可能需要考虑使用 Mixxx 的声卡和控制器。 - + Mixxx DJ Hardware Guide Mixxx DJ 硬件指南 - + Information - + Mixxx must be restarted before the multi-threaded RubberBand setting change will take effect. - + auto (<= 1024 frames/period) 自动(<= 1024 帧/周期) - + 2048 frames/period 2048 帧/周期 - + 4096 frames/period 4096 帧/周期 - + Are you sure? - + Distribute stereo channels into mono channels for parallel processing will result in a loss of mono compatibility and a diffuse stereo image. It is not recommended during broadcasting or recording. - + Are you sure you wish to proceed? - + No - + Yes, I know what I am doing - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. 与您听到的相比,麦克风输入在录音和广播信号中显得不合时宜。 - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 测量往返延迟,并在上方输入麦克风延迟补偿以对齐麦克风计时。 - - + Refer to the Mixxx User Manual for details. 細節請參考Mixxx 使用者操作手冊 - + Configured latency has changed. 配置的延迟已更改。 - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. 重新测量往返延迟,并将其输入到麦克风延迟补偿上方,以调整麦克风定时。 - + Realtime scheduling is enabled. 已启用实时调度。 - + Main output only 仅主输出 - + Main and booth outputs 主输出和展位输出 - + %1 ms %1 ms - + Configuration error 配置錯誤 @@ -7657,131 +7683,131 @@ The loudness target is approximate and assumes track pregain and main output lev 聲音 API - + Sample Rate 採樣速率 - + Audio Buffer 音訊緩衝區 - + Engine Clock 引擎时钟 - + Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. 使用声卡时钟进行现场观众设置和最低延迟。1使用网络时钟进行没有现场观众的广播。 - + Main Mix 主混合 - + Main Output Mode 主输出模式 - + Microphone Monitor Mode 麦克风监听模式 - + Microphone Latency Compensation 麦克风延迟补偿 - - - - + + + + ms milliseconds 女士 - + 20 ms 為 20 毫秒 - + Buffer Underflow Count 緩衝區下溢計數 - + 0 0 - + Keylock/Pitch-Bending Engine 鑰匙鎖/瀝青彎曲的引擎 - + Multi-Soundcard Synchronization 多音效卡同步 - + Output 輸出 - + Input 輸入 - + System Reported Latency 系統報告延遲 - + Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. 如果增加下溢計數器或你聽到持久性有機污染物在播放過程中,放大你的音訊緩衝區。 - + Main Output Delay 主输出延迟 - + Headphone Output Delay 耳机输出延迟 - + Booth Output Delay Booth输出延迟 - + Dual-threaded Stereo - + Hints and Diagnostics 提示和診斷 - + Downsize your audio buffer to improve Mixxx's responsiveness. 縮減你的音訊緩衝區來提高 Mixxx 的回應能力。 - + Query Devices 查詢設備 @@ -9341,27 +9367,27 @@ Often results in higher quality beatgrids, but will not do well on tracks that h EngineBuffer - + Soundtouch (faster) Soundtouch (更快) - + Rubberband (better) 橡皮條 (更好) - + Rubberband R3 (near-hi-fi quality) 接近高保真质量 - + Unknown, using Rubberband (better) 未知,使用更好 - + Unknown, using Soundtouch 未知,使用 Soundtouch @@ -9576,15 +9602,15 @@ Often results in higher quality beatgrids, but will not do well on tracks that h LegacySkinParser - - + + Safe Mode Enabled Shown when Mixxx is running in safe mode. 啟用安全模式 - - + + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -9595,57 +9621,57 @@ Shown when VuMeter can not be displayed. Please keep 沒有 OpenGL 支援。 - + activate 啟動 - + toggle 切換 - + right 權利 - + left - + right small 右小 - + left small 左小 - + up 向上 - + down 向下 - + up small 小了 - + down small 下小 - + Shortcut 快捷方式 @@ -9653,37 +9679,37 @@ Shown when VuMeter can not be displayed. Please keep Library - + This or a parent directory is already in your library. 此目录或父目录已位于您的库中。 - + This or a listed directory does not exist or is inaccessible. Aborting the operation to avoid library inconsistencies 此目录或列出的目录不存在或无法访问。 中止操作以避免库不一致 - - + + This directory can not be read. 无法读取此目录。 - + An unknown error occurred. Aborting the operation to avoid library inconsistencies 发生未知错误。 中止操作以避免库不一致 - + Can't add Directory to Library 无法将目录添加到库 - + Could not add <b>%1</b> to your library. %2 @@ -9692,27 +9718,27 @@ Aborting the operation to avoid library inconsistencies %2 - + Can't remove Directory from Library 无法从库中删除目录 - + An unknown error occurred. 发生未知错误。 - + This directory does not exist or is inaccessible. 此目录不存在或无法访问。 - + Relink Directory 重新链接目录 - + Could not relink <b>%1</b> to <b>%2</b>. %3 @@ -9724,22 +9750,22 @@ Aborting the operation to avoid library inconsistencies LibraryFeature - + Import Playlist 匯入播放清單 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 播放清單檔 (*.m3u *.m3u8 *.pls *.csv) - + Overwrite File? 覆盖文件? - + A playlist file with the name "%1" already exists. The default "m3u" extension was added because none was specified. @@ -9889,251 +9915,251 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy 聲音設備忙 - + <b>Retry</b> after closing the other application or reconnecting a sound device 關閉其他應用程式或重新連接聲音設備後 <b>重試</b> - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>重新配置</b>Mixxx 的聲音設備設置。 - - + + Get <b>Help</b> from the Mixxx Wiki. 從 Mixxx Wiki 得到 <b>説明</b>。 - - - + + + <b>Exit</b> Mixxx. <b>退出</b>Mixxx。 - + Retry 重試 - + skin 皮肤 - + Allow Mixxx to hide the menu bar? 允许 Mixxx 隐藏菜单栏? - + Hide Always show the menu bar? 隐藏 - + Always show 始终显示 - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label Mixxx 菜单栏是隐藏的,只需按一下<b>Alt 键</b>钥匙。<br><br>点击<b>%1</b>同意。<br><br>点击<b>%2</b>以禁用它,例如,如果您不将 Mixxx 与键盘一起使用。<br><br>您可以随时在 Preferences -> Interface 中更改此设置。<br> - + Ask me again 再问我一次 - - + + Reconfigure 重新配置 - + Help 説明 - - + + Exit 退出 - - + + Mixxx was unable to open all the configured sound devices. Mixxx 無法打開所有設定好的聲音裝置。 - + Sound Device Error 聲音裝置錯誤 - + <b>Retry</b> after fixing an issue 修正错误后 <b> 重试 </b> - + No Output Devices 沒有輸出裝置 - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx 是沒有任何輸出聲音設備配置的。沒有已配置的輸出裝置,將禁用音訊處理。 - + <b>Continue</b> without any outputs. <b>繼續</b> 沒有任何產出。 - + Continue 繼續 - + Load track to Deck %1 負荷跟蹤到甲板 %1 - + Deck %1 is currently playing a track. 甲板 %1 當前播放的曲目。 - + Are you sure you want to load a new track? 你確定你想要載入一個新的軌道? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. 有是沒有為此乙烯基控制項選擇的輸入的設備。 請先在聲音硬體首選項中選擇一種輸入的設備。 - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. 有是沒有為此直通控制項選擇的輸入的設備。 請先在聲音硬體首選項中選擇一種輸入的設備。 - + There is no input device selected for this microphone. Do you want to select an input device? 没有为此麦克风选择输入设备。是否要选择输入设备? - + There is no input device selected for this auxiliary. Do you want to select an input device? 没有为此辅助设备选择输入设备。是否要选择输入设备? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file 皮膚檔中的錯誤 - + The selected skin cannot be loaded. 無法載入所選的外觀。 - + OpenGL Direct Rendering OpenGL 直接繪製 - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. 您的计算机上未启用直接渲染。<br><br>这意味着波形显示将非常<br><b>速度慢,并且可能会严重占用您的 CPU</b>.要么更新您的<br>配置以启用直接渲染或禁用<br>波形将通过选择 Mixxx 首选项显示在<br>“空”作为“界面”部分的波形显示。 - - - + + + Confirm Exit 確認退出 - + A deck is currently playing. Exit Mixxx? 當前現正播放的甲板。退出 Mixxx 嗎? - + A sampler is currently playing. Exit Mixxx? 當前現正播放採樣器。退出 Mixxx 嗎? - + The preferences window is still open. 首選項視窗是仍處於打開狀態。 - + Discard any changes and exit Mixxx? 放棄所有更改並退出 Mixxx? @@ -10149,13 +10175,13 @@ Do you want to select an input device? PlaylistFeature - + Lock - - + + Playlists 播放清單 @@ -10165,32 +10191,58 @@ Do you want to select an input device? 随机播放播放列表 - + + Unlock all playlists + + + + + Delete all unlocked playlists + + + + Unlock 解鎖 - + + + Confirm Deletion + + + + + Do you really want to delete all unlocked playlists? + + + + + Deleting %1 unlocked playlists.<br>This operation can not be undone! + + + + Playlists are ordered lists of tracks that allow you to plan your DJ sets. 播放列表是有序的曲目列表,允许您规划 DJ 集。 - + It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. 可能需要跳过您准备好的播放列表中的一些曲目或添加一些不同的曲目,以保持观众的活力。 - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. 一些 Dj 構建播放清單之前他們表演,但其他人則傾向建立他們的蒼蠅。 - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. 當在一個活的 DJ 集,使用播放清單記得總是密切關注你的聽眾對音樂的反應您已經選擇玩。 - + Create New Playlist 創建新的播放清單 @@ -11849,7 +11901,7 @@ Hint: compensates "chipmunk" or "growling" voices 应用于音频信号的放大量。在更高的级别上,音频将更加分散。 - + Passthrough 直通 @@ -12019,12 +12071,12 @@ may introduce a 'pumping' effect and/or distortion. 各种 - + built-in - + missing @@ -12152,54 +12204,54 @@ may introduce a 'pumping' effect and/or distortion. RekordboxFeature - - - + + + Rekordbox Rekordbox - + Playlists 播放清單 - + Folders 文件夹 - + Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: 读取使用 Rekordbox 导出模式为 Pioneer CDJ/XDJ 播放器导出的数据库。1Rekordbox 只能导出到具有 FAT 或 HFS 文件系统的 USB 或 SD 设备。2Mixxx 可以从包含数据库文件夹 (3先锋3和4内容4).5不支持已通过67高级>数据库管理>首选项7.89读取以下数据: - + Hot cues - + Hot cues - + Loops (only the first loop is currently usable in Mixxx) Loops(目前只有第一个 Loop 在 Mixxx 中可用) - + Check for attached Rekordbox USB / SD devices (refresh) 检查连接的 Rekordbox USB/SD 设备(刷新) - + Beatgrids 节拍网格 - + Memory cues 记忆线索 - + (loading) Rekordbox (加载中)Rekordbox @@ -15124,7 +15176,7 @@ Use this to change only the effected (wet) signal with EQ and filter effects. Beatloop - + 节拍循环 @@ -15443,47 +15495,47 @@ This can not be undone! WCueMenuPopup - + Cue number 提示编号 - + Cue position 提示位置 - + Edit cue label Edit cue label(编辑提示标签) - + Label... 标签 - + Delete this cue 删除此提示 - + Toggle this cue type between normal cue and saved loop 在正常提示点和保存的 Loop 之间切换此提示类型 - + Left-click: Use the old size or the current beatloop size as the loop size 左键单击:使用旧大小或当前 Beatloop 大小作为 Loop 大小 - + Right-click: Use the current play position as loop end if it is after the cue 右键点击:如果当前播放位置在 cue 之后,则将其用作 Loop 结束 - + Hotcue #%1 热提示 #%1 @@ -15608,323 +15660,353 @@ This can not be undone! + Search in Current View... + + + + + Search for tracks in the current library view + + + + + Ctrl+f + + + + + Search in Tracks Library... + + + + + Search in the internal track collection under "Tracks" in the library + + + + + Ctrl+Shift+F + + + + Create &New Playlist 創建與新的播放清單 - + Create a new playlist 創建一個新的播放清單 - + Ctrl+n Ctrl n + - + Create New &Crate 創建新 & 箱 - + Create a new crate 創建一個新的箱子 - + Ctrl+Shift+N Ctrl + Shift + N - - + + &View 與視圖 - + Auto-hide menu bar 自动隐藏菜单栏 - + Auto-hide the main menu bar when it's not used. 不使用主菜单栏时自动隐藏主菜单栏。 - + May not be supported on all skins. 在所有的皮膚上可能不支援。 - + Show Skin Settings Menu 皮肤设置菜单 - + Show the Skin Settings Menu of the currently selected Skin 显示当前选定皮肤的皮肤设置菜单 - + Ctrl+1 Menubar|View|Show Skin Settings Ctrl 1 + - + Show Microphone Section 顯示麥克風節 - + Show the microphone section of the Mixxx interface. 顯示 Mixxx 介面的麥克風部分。 - + Ctrl+2 Menubar|View|Show Microphone Section Ctrl 2 + - + Show Vinyl Control Section 顯示乙烯控制節 - + Show the vinyl control section of the Mixxx interface. 顯示 Mixxx 介面的乙烯基控制部分。 - + Ctrl+3 Menubar|View|Show Vinyl Control Section Ctrl 3 + - + Show Preview Deck 顯示預覽甲板 - + Show the preview deck in the Mixxx interface. 在 Mixxx 介面中顯示預覽甲板。 - + Ctrl+4 Menubar|View|Show Preview Deck Ctrl 4 + - + Show Cover Art 顯示封面藝術 - + Show cover art in the Mixxx interface. 在 Mixxx 介面中顯示封面藝術。 - + Ctrl+6 Menubar|View|Show Cover Art Ctrl 6 + - + Maximize Library 最大限度地庫 - + Maximize the track library to take up all the available screen space. 最大化音樂庫以佔用所有可用的螢幕空間。 - + Space Menubar|View|Maximize Library 空間 - + &Full Screen 與全螢幕 - + Display Mixxx using the full screen 使用全螢幕的顯示 Mixxx - + &Options 與選項 - + &Vinyl Control 與乙烯基控制 - + Use timecoded vinyls on external turntables to control Mixxx 在外部轉盤控制 Mixxx 上使用時間乙烯基 - + Enable Vinyl Control &%1 啟用乙烯控制 & %1 - + &Record Mix 與記錄組合 - + Record your mix to a file 記錄你組合到一個檔 - + Ctrl+R Ctrl + R - + Enable Live &Broadcasting 啟用即時 & 廣播 - + Stream your mixes to a shoutcast or icecast server 流到 shoutcast 或 icecast 伺服器你混合 - + Ctrl+L 按 Ctrl + L - + Enable &Keyboard Shortcuts 啟用與鍵盤快速鍵 - + Toggles keyboard shortcuts on or off 切換鍵盤快速鍵打開或關閉 - + Ctrl+` 按 Ctrl +' - + &Preferences 與首選項 - + Change Mixxx settings (e.g. playback, MIDI, controls) 改變 Mixxx 的設置 (例如播放 MIDI,控制項) - + &Developer 與開發人員 - + &Reload Skin & 重新載入皮膚 - + Reload the skin 重新載入皮膚 - + Ctrl+Shift+R Ctrl + Shift + R - + Developer &Tools 開發人員與工具 - + Opens the developer tools dialog 打開開發人員工具對話方塊 - + Ctrl+Shift+T Ctrl + Shift + T - + Stats: &Experiment Bucket 統計: & 實驗鬥 - + Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. 使實驗模式。收集統計實驗跟蹤存儲桶中。 - + Ctrl+Shift+E Ctrl + Shift + E - + Stats: &Base Bucket 統計: & 基地鬥 - + Enables base mode. Collects stats in the BASE tracking bucket. 啟用的基礎模式。收集統計基礎跟蹤桶內。 - + Ctrl+Shift+B Ctrl + Shift + B - + Deb&ugger Enabled Deb & ugger 啟用 - + Enables the debugger during skin parsing 在皮膚分析過程中啟用調試器 - + Ctrl+Shift+D 按 Ctrl + Shift + D - + &Help 與説明 - + Show Keywheel menu title 显示 Keywheel @@ -15941,74 +16023,74 @@ This can not be undone! 将库导出为 Engine DJ 格式 - + Show keywheel tooltip text 显示 Keywheel - + F12 Menubar|View|Show Keywheel F12 - + &Community Support 與社區的支援 - + Get help with Mixxx 獲得 Mixxx 的説明 - + &User Manual 與使用者手冊 - + Read the Mixxx user manual. 閱讀 Mixxx 使用者手冊。 - + &Keyboard Shortcuts 與鍵盤快速鍵 - + Speed up your workflow with keyboard shortcuts. 加快您的工作流使用鍵盤快速鍵。 - + &Settings directory &设置目录 - + Open the Mixxx user settings directory. 打开 Mixxx 用户设置目录。 - + &Translate This Application & 翻譯此應用程式 - + Help translate this application into your language. 幫忙翻譯成您的語言此應用程式。 - + &About & 約 - + About the application 有關應用程式 @@ -16043,25 +16125,13 @@ This can not be undone! WSearchLineEdit - - Clear input - Clear the search bar input field - 清除輸入 - - - - Ctrl+F - Search|Focus - Ctrl + F - - - + Search noun 搜索 - + Clear input 清除輸入 @@ -16072,93 +16142,87 @@ This can not be undone! 搜索... - + Clear the search bar input field 清除搜索栏输入字段 - - Enter a string to search for - 輸入要搜索的字串 + + Return + 返回 - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - 使用运算符,如 bpm:115-128, artist:BooFar, -year:1990 + + Enter a string to search for. + - - For more information see User Manual > Mixxx Library - 有关更多信息,请参阅 Mixxx Library >用户手册 + + Use operators like bpm:115-128, artist:BooFar, -year:1990. + - Shortcut - 快捷方式 + See User Manual > Mixxx Library for more information. + - - Ctrl+F - Ctrl + F + + Focus/Select All (Search in current view) + Give search bar input focus + - - Focus - Give search bar input focus - 焦點 + + Focus/Select All (Search in 'Tracks' library view) + - - - Ctrl+Backspace - Ctrl + 倒退鍵 + + Additional Shortcuts When Focused: + - Shortcuts - 快捷方式 + Trigger search before search-as-you-type timeout or focus tracks view afterwards + - Return - 返回 + Esc or Ctrl+Return + - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - 在键入时搜索超时之前触发搜索,或在之后跳转到轨道视图 + Immediately trigger search and focus tracks view + Exit search bar and leave focus + - + Ctrl+Space Ctrl + 空格键 - + Toggle search history Shows/hides the search history entries 切换搜索历史记录 - + Delete or Backspace 删除或退格 - - Delete query from history - 从历史记录中删除查询 - - - - Esc - 按 esc 鍵 + + in search history + - - Exit search - Exit search bar and leave focus - 退出搜索 + + Delete query from history + 从历史记录中删除查询 @@ -16914,37 +16978,37 @@ This can not be undone! WTrackTableView - + Confirm track hide 确认轨道隐藏 - + Are you sure you want to hide the selected tracks? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from AutoDJ queue? 您确定要从 AutoDJ 队列中删除选定的曲目吗? - + Are you sure you want to remove the selected tracks from this crate? 您确定要隐藏选定的轨道吗? - + Are you sure you want to remove the selected tracks from this playlist? 您确定要从此播放列表中删除选定的曲目吗? - + Don't ask again during this session 在此会话期间不要再次询问 - + Confirm track removal 确认轨道移除 @@ -16965,52 +17029,52 @@ This can not be undone! mixxx::CoreServices - + fonts 字体 - + database 数据库 - + effects 效果 - + audio interface 音频接口 - + decks 甲板 - + library 媒体库 - + Choose music library directory 選擇音樂庫目錄 - + controllers 控制器 - + Cannot open database 無法打開資料庫 - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -17024,68 +17088,78 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::DlgLibraryExport - + Entire music library 整个音乐库 - - Selected crates - 选中的箱子 + + Crates + + + + + Playlists + - + + Selected crates/playlists + + + + Browse 流覽 - + Export directory 导出目录 - + Database version 数据库版本 - + Export 导出 - + Cancel 取消 - + Export Library to Engine DJ "Engine DJ" must not be translated 导出到 Engine DJ - + Export Library To 导出到 - + No Export Directory Chosen 未选择导出目录 - + No export directory was chosen. Please choose a directory in order to export the music library. 未选择导出目录。请选择一个目录以导出音乐库。 - + A database already exists in the chosen directory. Exported tracks will be added into this database. 所选目录中已存在数据库。导出的轨道将被添加到此数据库中。 - + A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. 所选目录中已存在数据库,但加载该数据库时出现问题。在这种情况下,不能保证导出成功。 @@ -17106,7 +17180,7 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::EnginePrimeExportJob - + Failed to export track %1 - %2: %3 %1 is the artist %2 is the title and %3 is the original error message @@ -17117,22 +17191,22 @@ Mixxx 需要 qt 離散度與 SQLite 支援。請閱讀有關如何構建它的 mixxx::LibraryExporter - + Export Completed 导出已完成 - - Exported %1 track(s) and %2 crate(s). - 导出了 %1 个轨道和 %2 个板条箱。 + + Exported %1 track(s), %2 crate(s), and %3 playlist(s). + - + Export Failed 导出失败 - + Exporting to Engine DJ... 正在导出到 Engine DJ.. diff --git a/res/translations/source_copy_allow_list.tsv b/res/translations/source_copy_allow_list.tsv index b6c80b41dafd..a8062b987ba5 100644 --- a/res/translations/source_copy_allow_list.tsv +++ b/res/translations/source_copy_allow_list.tsv @@ -170,7 +170,7 @@ ca,de,el,en_CA,en_GB,es*,fr_CA,fr_CI,hu,it,nl,pt*,sl,sv Res * FPS: %0/%1 * \u276f * \u276e -de,hu,bs,cs,da,fr,hr,id,it,lb,ms,nb,nl,nn,oc,pl,ro,sk,sl,sv,vi,sq_AL Album +de,hu,bs,cs,da,fr,hr,id,it,lb,ms,nb,nl,nn,oc,pl,ro,sk,sl,sv,vi,sq_AL,pt* Album de,da,fr,lb,ms,nl,oc,sv Genre de,it,pl Bitrate: es,es_419,es_AR,es_CO,es_MX,ca,es_ES Error: @@ -183,26 +183,26 @@ hu,ca,de,et,fr,nb,pl,ro,sv,tr Port hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* A hu,pt,pt_PT,et,fi,nl,pl,pt_BR,ro,zh* Bb hu,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* B -hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* C -hu,fi,nl,pl,pt_BR,ro,sl,zh* Db +hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh*,pt C +hu,fi,nl,pl,pt_BR,ro,sl,zh*,pt Db hu,pt,pt_PT,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* D hu,et,fi,nl,pl,pt_BR,ro,sl,zh* Eb -hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* E -hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* F +hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh*,pt E +hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh*,pt F hu,et,fi,nl,pl,pt_BR,ro,sl,zh_CN F# hu,cs,de,et,fi,fr,nl,pl,pt_BR,ro,ru,sl,vi,zh* G -hu,et,fi,nl,pl,pt_BR,ro,sl,zh* Ab +hu,et,fi,nl,pl,pt_BR,ro,sl,zh*,pt Ab hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK Am -hu,et,fi,nl,pl,pt_BR,ro,zh* Bbm -hu,et,fi,nl,pl,pt_BR,ro,zh* Bm +hu,et,fi,nl,pl,pt_BR,ro,zh*,pt Bbm +hu,et,fi,nl,pl,pt_BR,ro,zh*,pt Bm hu,et,fi,nl,pl,pt_BR,ro,sl,vi,zh,zh_CN,zh_HK Cm -hu,et,fi,nl,pl,pt_BR,ro,sl,zh_CN C#m -hu,et,fi,nl,pl,pt_BR,ro,sl,zh* Dm -hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK Ebm -hu,de,et,fi,nl,pl,pt_BR,ro,sl,vi,zh* Em +hu,et,fi,nl,pl,pt_BR,ro,sl,zh_CN,pt C#m +hu,et,fi,nl,pl,pt_BR,ro,sl,zh*,pt Dm +hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK,pt Ebm +hu,de,et,fi,nl,pl,pt_BR,ro,sl,vi,zh*,pt Em hu,et,fi,nl,pl,pt_BR,ro,sl,zh_CN Fm -hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK F#m -hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK Gm +hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK,pt F#m +hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK,pt Gm hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK G#m * 10Hz * 10ms @@ -213,8 +213,8 @@ hu,et,fi,nl,pl,pt_BR,ro,sl,zh,zh_CN,zh_HK G#m hu,bs,de,eo,eu,fr,hr,it,lb,lt,lv,nb,nl,pt_PT,ro,sk,sv,vi Min hu,bs,de,eu,fr,hr,it,lb,nl,ro,sk,sv,vi Max pt,pt_BR,ca,de,fr,it,nl,pl,pt_PT,sl,sv Tremolo -pt_BR,da,de,id,it,nl,pt,ro Mixer -pt_BR,de,it,nl,pt_PT Reloop +pt_BR,da,de,id,it,nl,pt*,ro Mixer +pt_BR,de,it,nl,pt* Reloop de,es*,nl,pt_BR,vi Hotcues de,es* Hotcues %1-%2 nl,pl Hotcue index @@ -275,12 +275,12 @@ nl Intro start nl Type: nl Equalizer Plugin nl,sv,vi Reverb -nl Encoder +nl,it Encoder it,nl,pl,ro,vi Downsampling it,nl 32 bits float -nl Queen Mary Key Detector +nl,it Queen Mary Key Detector it Pitch -it,nl Hot cues +it,nl,zh* Hot cues it &File it,nl database sn Key @@ -329,12 +329,12 @@ fr Question fr Microphone fr %1 minutes fr,it Bypass Fr. -fr Gain 1 -fr Gain 2 +fr,sv Gain 1 +fr,sv Gain 2 fr,it,ru,es* Queen Mary University London fr,nl Distortion -fr Ratio (:1) -fr Ratio +fr,de Ratio (:1) +fr,de Ratio fr Variance fr &Options fr,nl Focus @@ -351,16 +351,16 @@ it Fine it Deck Equalizers it,nl,es* Lead-In it Frame rate -it,nl,pt_BR Caching +it,nl,pt* Caching it,nl skin -it decks +it,es* decks de Timer (Fallback) de,fr,it,nl,pl,sv,es* Outro de,nl Loops el,pt_BR Tool tips el,es*,eu,id,it,lb,nb,pt*,tr Scratching es*,fr,it,nl,pt*,sq_AL &Ok -es*,pt_BR Switch +es*,pt_BR,sv Switch es*,pt* Manual et,hr,it,tr,vi BPM Tap fr,it,nl,zh* pt @@ -371,7 +371,7 @@ nl Audio Buffer nl,sv OpenGL Direct Rendering nl,zh* Hard Clip nl,zh* Hard -sv (status text) +sv,de (status text) da Input de,nl Moog Filter de,fr,it,nl,pt*,ro,sv Phaser @@ -431,25 +431,37 @@ it legacy nl Waveform type es*,it,nl,zh* Knee (dBFS) es*,it,nl,zh* Knee -es*,nl Release +es*,nl,de Release it,nl Auto Makeup Gain it,nl Makeup it controllers nl &Reset nl Compressor -nl Release (ms) +nl,de Release (ms) it Tempo Tap zh* Soft Clipping zh* Hard Clipping es,es_419,es_AR,es_CO,es_ES,es_MX No -nl,sq_AL VID: +nl,sq_AL,es,es_419,es_AR,es_CO,es_ES,es_MX VID: nl Product ID -nl,sq_AL PID: +nl,sq_AL,es,es_419,es_AR,es_CO,es_ES,es_MX PID: nl Lossy nl Lossless nl Top -nl OpenGL Status +nl,de OpenGL Status nl Stem Label nl Stem Mute sq_AL Artist + Album -sq_AL Off +sq_AL,it Off +de Attack (ms) +de Attack +fr,it Ctrl+f +fr Ctrl+Shift+F +it Mixxx %1.%2 Development Team +it Okay +sv Decay +sv Kill Low +sv Kill Mid +sv Kill High +tr Mount +vi Samplerate From de57716ef419e353c56a2b8317f5ae34583ed67d Mon Sep 17 00:00:00 2001 From: Swiftb0y <12380386+Swiftb0y@users.noreply.github.com> Date: Thu, 26 Jun 2025 20:04:08 +0200 Subject: [PATCH 065/163] fix: broken CI due to deprecated `QCheckBox::checkStateChanged` --- src/preferences/dialog/dlgprefrecord.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/preferences/dialog/dlgprefrecord.cpp b/src/preferences/dialog/dlgprefrecord.cpp index 00814839cc61..02885df84315 100644 --- a/src/preferences/dialog/dlgprefrecord.cpp +++ b/src/preferences/dialog/dlgprefrecord.cpp @@ -126,7 +126,11 @@ DlgPrefRecord::DlgPrefRecord(QWidget* parent, UserSettingsPointer pConfig) &DlgPrefRecord::slotSliderCompression); connect(CheckBoxRecordCueFile, +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + &QCheckBox::checkStateChanged, +#else &QCheckBox::stateChanged, +#endif this, &DlgPrefRecord::slotToggleCueEnabled); } From d7db5dc621747d1fd5897da67c07626eae90aab3 Mon Sep 17 00:00:00 2001 From: "Antoine C." Date: Sun, 29 Jun 2025 19:17:47 +0000 Subject: [PATCH 066/163] fix(controller): correctly derigister player manager --- src/coreservices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreservices.cpp b/src/coreservices.cpp index aa7b311ec6f9..045f900a4367 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -865,8 +865,8 @@ void CoreServices::finalize() { mixxx::qml::QmlLibraryProxy::registerLibrary(nullptr); ControllerScriptEngineBase::registerTrackCollectionManager(nullptr); - ControllerScriptEngineBase::registerPlayerManager(nullptr); #endif + ControllerScriptEngineBase::registerPlayerManager(nullptr); // Stop all pending library operations qDebug() << t.elapsed(false).debugMillisWithUnit() << "stopping pending Library tasks"; From 1991f3ba341d1d91105a2d5ccf0774cffb3318d3 Mon Sep 17 00:00:00 2001 From: Sergey <5637569+fonsargo@users.noreply.github.com> Date: Thu, 10 Jul 2025 21:36:00 +0200 Subject: [PATCH 067/163] Rename constants + use time literals --- .../builtin/autogaincontroleffect.cpp | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/effects/backends/builtin/autogaincontroleffect.cpp b/src/effects/backends/builtin/autogaincontroleffect.cpp index d0f75621c21d..01d3ef72f2c2 100644 --- a/src/effects/backends/builtin/autogaincontroleffect.cpp +++ b/src/effects/backends/builtin/autogaincontroleffect.cpp @@ -3,12 +3,13 @@ #include "util/math.h" namespace { -constexpr double defaultAttackMs = 1; -constexpr double defaultReleaseMs = 500; -constexpr double defaultThresholdDB = -40; -constexpr double defaultTargetDB = -5; -constexpr double defaultGainDB = 20; -constexpr double defaultKneeDB = 10; +using namespace std::chrono_literals; +constexpr std::chrono::milliseconds kDefaultAttack = 1ms; +constexpr std::chrono::milliseconds kDefaultRelease = 500ms; +constexpr double kDefaultThresholdDB = -40; +constexpr double kDefaultTargetDB = -5; +constexpr double kDefaultGainDB = 20; +constexpr double kDefaultKneeDB = 10; double calculateBallistics(double paramMs, const mixxx::EngineParameters& engineParameters) { return exp(-1000.0 / (paramMs * engineParameters.sampleRate())); @@ -44,7 +45,7 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { threshold->setValueScaler(EffectManifestParameter::ValueScaler::Linear); threshold->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); threshold->setNeutralPointOnScale(0); - threshold->setRange(-70, defaultThresholdDB, 0); + threshold->setRange(-70, kDefaultThresholdDB, 0); EffectManifestParameterPointer target = pManifest->addParameter(); target->setId("target"); @@ -55,7 +56,7 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { target->setValueScaler(EffectManifestParameter::ValueScaler::Linear); target->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); target->setNeutralPointOnScale(0); - target->setRange(-20, defaultTargetDB, 10); + target->setRange(-20, kDefaultTargetDB, 10); EffectManifestParameterPointer gain = pManifest->addParameter(); gain->setId("gain"); @@ -66,7 +67,7 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { "the effect will apply")); gain->setValueScaler(EffectManifestParameter::ValueScaler::Linear); gain->setUnitsHint(EffectManifestParameter::UnitsHint::Decibel); - gain->setRange(1, defaultGainDB, 40); + gain->setRange(1, kDefaultGainDB, 40); EffectManifestParameterPointer knee = pManifest->addParameter(); knee->setId("knee"); @@ -79,7 +80,7 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { knee->setValueScaler(EffectManifestParameter::ValueScaler::Linear); knee->setUnitsHint(EffectManifestParameter::UnitsHint::Coefficient); knee->setNeutralPointOnScale(0); - knee->setRange(0.0, defaultKneeDB, 24); + knee->setRange(0.0, kDefaultKneeDB, 24); EffectManifestParameterPointer attack = pManifest->addParameter(); attack->setId("attack"); @@ -90,7 +91,7 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { "auto gain \nwill set in once the signal exceeds the threshold")); attack->setValueScaler(EffectManifestParameter::ValueScaler::Logarithmic); attack->setUnitsHint(EffectManifestParameter::UnitsHint::Millisecond); - attack->setRange(0, defaultAttackMs, 250); + attack->setRange(0, kDefaultAttack.count(), 250); EffectManifestParameterPointer release = pManifest->addParameter(); release->setId("release"); @@ -104,18 +105,18 @@ EffectManifestPointer AutoGainControlEffect::getManifest() { "may introduce a 'pumping' effect and/or distortion.")); release->setValueScaler(EffectManifestParameter::ValueScaler::Integral); release->setUnitsHint(EffectManifestParameter::UnitsHint::Millisecond); - release->setRange(0, defaultReleaseMs, 1500); + release->setRange(0, kDefaultRelease.count(), 1500); return pManifest; } void AutoGainControlGroupState::clear(const mixxx::EngineParameters& engineParameters) { state = CSAMPLE_ONE; - attackCoeff = calculateBallistics(defaultAttackMs, engineParameters); - releaseCoeff = calculateBallistics(defaultReleaseMs, engineParameters); + attackCoeff = calculateBallistics(kDefaultAttack.count(), engineParameters); + releaseCoeff = calculateBallistics(kDefaultRelease.count(), engineParameters); - previousAttackParamMs = defaultAttackMs; - previousReleaseParamMs = defaultReleaseMs; + previousAttackParamMs = kDefaultAttack.count(); + previousReleaseParamMs = kDefaultRelease.count(); previousSampleRate = engineParameters.sampleRate(); } From a7f3bbb0e9cdf9027ba1da23d82930976c504a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 18 Jul 2025 20:00:40 +0200 Subject: [PATCH 068/163] Update Translation template. Found 3235 source text(s) (10 new and 3225 already existing) --- res/translations/mixxx.ts | 435 +++++++++++++++++++++----------------- 1 file changed, 244 insertions(+), 191 deletions(-) diff --git a/res/translations/mixxx.ts b/res/translations/mixxx.ts index 56fd19245fe5..752dc57f3845 100644 --- a/res/translations/mixxx.ts +++ b/res/translations/mixxx.ts @@ -4740,122 +4740,128 @@ You tried to learn: %1,%2 DlgPrefBroadcast - + Icecast 2 - + Shoutcast 1 - + Icecast 1 - + MP3 - + Ogg Vorbis - + Opus - + AAC - + HE-AAC - + HE-AACv2 - + Automatic - + Mono - + Stereo - - - - + + + + Action failed - + You can't create more than %1 source connections. - + Source connection %1 - + + Settings for %1 + Settings for broadcast profile, %1 is the profile name placeholder + + + + At least one source connection is required. - + Are you sure you want to disconnect every active source connection? - - + + Confirmation required - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. - + Are you sure you want to delete '%1'? - + Renaming '%1' - + New name for '%1': - + Can't rename '%1' to '%2': name already in use @@ -6537,47 +6543,47 @@ and allows you to pitch adjust them for harmonic mixing. - + Choose a music directory - + Confirm Directory Removal - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Hide Tracks - + Delete Track Metadata - + Leave Tracks Unchanged - + Relink music directory to new location - + Select Library Font @@ -6626,262 +6632,267 @@ and allows you to pitch adjust them for harmonic mixing. - + Audio File Formats - + Track Table View - + Track Double-Click Action: - + BPM display precision: - + Session History - + Track duplicate distance - + When playing a track again log it to the session history only if more than N other tracks have been played in the meantime - + History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. - + Delete history playlist with less than N tracks - + Library Font: - + + Show scan summary dialog + + + + Grey out played tracks - + Track Search - + Enable search completions - + Enable search history keyboard shortcuts - + Percentage of pitch slider range for 'fuzzy' BPM search: - + This range will be used for the 'fuzzy' BPM search (~bpm:) via the search box, as well as for BPM search in Track context menu > Search related Tracks - + Preferred Cover Art Fetcher Resolution - + Fetch cover art from coverartarchive.com by using Import Metadata From Musicbrainz. - + Note: ">1200 px" can fetch up to very large cover arts. - + >1200 px (if available) - + 1200 px (if available) - + 500 px - + 250 px - + Settings Directory - + The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. - + Edit those files only if you know what you are doing and only while Mixxx is not running. - + Open Mixxx Settings Folder - + Library Row Height: - + Use relative paths for playlist export if possible - + ... - + px - + Synchronize library track metadata from/to file tags - + Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library - + Synchronize Serato track metadata from/to file tags (experimental) - + Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. - + Edit metadata after clicking selected track - + Search-as-you-type timeout: - + ms - + Load track to next available deck - + External Libraries - + You will need to restart Mixxx for these settings to take effect. - + Show Rhythmbox Library - + Track Metadata Synchronization / Playlists - + Add track to Auto DJ queue (bottom) - + Add track to Auto DJ queue (top) - + Ignore - + Show Banshee Library - + Show iTunes Library - + Show Traktor Library - + Show Rekordbox Library - + Show Serato Library - + All external libraries shown are write protected. @@ -7226,33 +7237,33 @@ and allows you to pitch adjust them for harmonic mixing. DlgPrefRecord - + Choose recordings directory - - + + Recordings directory invalid - + Recordings directory must be set to an existing directory. - + Recordings directory must be set to a directory. - + Recordings directory not writable - + You do not have write access to %1. Choose a recordings directory you have write access to. @@ -7270,43 +7281,55 @@ and allows you to pitch adjust them for harmonic mixing. - - + + This will include the filepath for each track in the CUE file. +This option makes the CUE file less portable and can reveal personal +information from filepaths (i.e. username) + + + + + Enable File Annotation in CUE file + + + + + Quality - + Tags - + Title - + Author - + Album - + Output File Format - + Compression - + Lossy @@ -7321,12 +7344,12 @@ and allows you to pitch adjust them for harmonic mixing. - + Compression Level - + Lossless @@ -7930,17 +7953,17 @@ The loudness target is approximate and assumes track pregain and main output lev - + OpenGL not available - + dropped frames - + Cached waveforms occupy %1 MiB on disk. @@ -7958,22 +7981,22 @@ The loudness target is approximate and assumes track pregain and main output lev - + OpenGL Status - + Displays which OpenGL version is supported by the current platform. - + Normalize waveform overview - + Average frame rate @@ -7989,7 +8012,7 @@ The loudness target is approximate and assumes track pregain and main output lev - + Displays the actual frame rate. @@ -8024,7 +8047,7 @@ The loudness target is approximate and assumes track pregain and main output lev - + Show minute markers on waveform overview @@ -8069,7 +8092,7 @@ The loudness target is approximate and assumes track pregain and main output lev - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. @@ -8136,22 +8159,22 @@ Select from different types of displays for the waveform, which differ primarily - + Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Enable waveform caching - + Generate waveforms when analyzing library @@ -8167,7 +8190,7 @@ Select from different types of displays for the waveform, which differ primarily - + Type @@ -8197,12 +8220,42 @@ Select from different types of displays for the waveform, which differ primarily - + + Stem + + + + + Channel opacity + + + + + Channel opacity (outline) + + + + + Main stem opacity + + + + + Outline stem opacity + + + + + Move channel to foreground when volume is adjusted + + + + Overview Waveforms - + Clear Cached Waveforms @@ -9859,249 +9912,249 @@ Do you really want to overwrite it? MixxxMainWindow - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + skin - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Do you want to select an input device? - + There is no input device selected for this auxiliary. Do you want to select an input device? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -11663,13 +11716,13 @@ Fully right: end of the effect period - + encoder failure - + Failed to apply the selected settings. @@ -12012,42 +12065,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12502,7 +12555,7 @@ may introduce a 'pumping' effect and/or distortion. SoftwareWaveformWidget - + Filtered From 695bb89810476ad6c93bd419fd903f7658c3bf75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 18 Jul 2025 20:08:45 +0200 Subject: [PATCH 069/163] Pull latest translations from https://www.transifex.com/mixxx-dj-software/mixxxdj/mixxx2-7/. Compile QM files out of TS files that are used by the localized app --- res/translations/mixxx_ca.qm | Bin 398938 -> 402193 bytes res/translations/mixxx_ca.ts | 471 +++++++++++++++++++--------------- res/translations/mixxx_fr.qm | Bin 510872 -> 513919 bytes res/translations/mixxx_fr.ts | 477 +++++++++++++++++++---------------- res/translations/mixxx_nl.qm | Bin 479003 -> 478973 bytes res/translations/mixxx_nl.ts | 437 ++++++++++++++++++-------------- 6 files changed, 772 insertions(+), 613 deletions(-) diff --git a/res/translations/mixxx_ca.qm b/res/translations/mixxx_ca.qm index 830d10f2d34d0aef2b8a1e444ca5354ef17c4c29..a339cfd0690d01af0e70bd09f157b6fa48703fff 100644 GIT binary patch delta 19784 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 P5gj+_f6jdw)29AE#9AyO delta 17890 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 diff --git a/res/translations/mixxx_ca.ts b/res/translations/mixxx_ca.ts index 5b55a2184c88..827eb20f6cde 100644 --- a/res/translations/mixxx_ca.ts +++ b/res/translations/mixxx_ca.ts @@ -4791,123 +4791,129 @@ Heu intentat aprendre: %1,%2 DlgPrefBroadcast - + Icecast 2 Icecast 2 - + Shoutcast 1 Shoutcast 1 - + Icecast 1 Icecast 1 - + MP3 MP3 - + Ogg Vorbis Ogg Vorbis - + Opus Opus - + AAC AAC - + HE-AAC HE-AAC - + HE-AACv2 HE-AACv2 - + Automatic Automàtic - + Mono Mono - + Stereo Estèreo - - - - + + + + Action failed La acció ha fallat - + You can't create more than %1 source connections. No podeu crear més de %1 connexions font. - + Source connection %1 Connexió font %1 - + + Settings for %1 + Settings for broadcast profile, %1 is the profile name placeholder + + + + At least one source connection is required. Es requereix com a mínim 1 connexió font. - + Are you sure you want to disconnect every active source connection? Segur que voleu desconnectar totes les connexions font actives? - - + + Confirmation required Es necessita confirmació - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. «%1» té el mateix punt de muntatge Icecast que «%2». No es poden activar simultàniament dues connexions font al mateix servidor que tinguin el mateix punt de muntatge. - + Are you sure you want to delete '%1'? Esteu segur de voler esborrar '%1'? - + Renaming '%1' Reanomenant '%1' - + New name for '%1': Nom nou per a '%1': - + Can't rename '%1' to '%2': name already in use No es pot canviar el nom de '%1' a '%2': Aquest nom ja existeix @@ -6608,47 +6614,47 @@ and allows you to pitch adjust them for harmonic mixing. - + Choose a music directory Selecciona una carpeta de música - + Confirm Directory Removal Confirma la supressió de la carpeta - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. El Mixxx no revisarà més la carpeta per trobar noves pistes. Que voleu fer amb les pistes d'aquesta carpeta i subcarpetes?<ul><li>Amaga totes les pistes d'aquesta carpeta i subcarpetes.</li><li>Esborra les metadades d'aquestes pistes del Mixxx de forma permanent.</li><li>Deixa les pistes sense canviar a la Biblioteca</li></ul>Si s'amaguen les pistes, les metadades seguiran disponibles en cas que les afegíssiu de nou. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. Metadades significa tots els detalls de la pista (artista, títol, comptador de reproducció, etc.) així com les graelles de rtime, les marques directes i els bucles. Aquesta acció només afecta a la biblioteca del Mixxx. Els fitxers del disc no es canviaran ni s'esborraran. - + Hide Tracks Amaga les pistes - + Delete Track Metadata Esborra les metadades de les pistes - + Leave Tracks Unchanged Deixa les pistes sense canviar - + Relink music directory to new location Corregeix la ubicació de la carpeta de música - + Select Library Font Selecciona el tipus de lletra de la Biblioteca @@ -6697,262 +6703,267 @@ and allows you to pitch adjust them for harmonic mixing. Torna a escanejar els directoris a l'inici - + Audio File Formats Formats de fitxer d'àudio - + Track Table View Vista de la taula de pistes - + Track Double-Click Action: Acció de doble clic en la pista: - + BPM display precision: Precisió visual del BPM - + Session History Historial de sessions - + Track duplicate distance Distància entre pistes duplicades - + When playing a track again log it to the session history only if more than N other tracks have been played in the meantime - + History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. - + Delete history playlist with less than N tracks Esborra els històrics de reproducció amb menys de N pistes - + Library Font: Tipus de lletra de la Biblioteca: - + + Show scan summary dialog + + + + Grey out played tracks - + Track Search - + Enable search completions Habilita les suggerències de cerca - + Enable search history keyboard shortcuts Habilita les tecles ràpides a l'històric de cerca - + Percentage of pitch slider range for 'fuzzy' BPM search: - + This range will be used for the 'fuzzy' BPM search (~bpm:) via the search box, as well as for BPM search in Track context menu > Search related Tracks - + Preferred Cover Art Fetcher Resolution Resolució preferida per recuperar portades - + Fetch cover art from coverartarchive.com by using Import Metadata From Musicbrainz. Recupera les portades de coverartarchive.com a l'importar les metadades des de Musicbrainz. - + Note: ">1200 px" can fetch up to very large cover arts. Nota: ">1200 px" pot recuperar portades molt grans - + >1200 px (if available) >1200 px (si està disponible) - + 1200 px (if available) 1200 px (si està disponible) - + 500 px 500 px - + 250 px 250 px - + Settings Directory Directori de les preferències - + The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. - + Edit those files only if you know what you are doing and only while Mixxx is not running. Editeu els fitxers només si sabeu el que feu i només quan el Mixxx no estigui en execució. - + Open Mixxx Settings Folder Obre la carpeta de preferencies d'usuari de Mixxx - + Library Row Height: Alçada entre línies de la Biblioteca: - + Use relative paths for playlist export if possible Utilitza rutes relatives a l'hora d'exportar la llista de reproducció si és possible - + ... ... - + px pix - + Synchronize library track metadata from/to file tags Sincronitza les metadades de les pistes de la biblioteca des de/cap a les etiquetes dels fitxers - + Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library - + Synchronize Serato track metadata from/to file tags (experimental) Sincronitza les metadades de pistes de Serato des de/cap a les etiquets de fitxer (experimental) - + Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. - + Edit metadata after clicking selected track Edita les metadades al fer clic en la pista seleccionada - + Search-as-you-type timeout: Temps d’espera a la cerca en escriure: - + ms ms - + Load track to next available deck Carrega la pista al proper plat disponible - + External Libraries Llibreries externes - + You will need to restart Mixxx for these settings to take effect. Cal que reinicieu el Mixxx per a activar els canvis realitzats. - + Show Rhythmbox Library Mostra la biblioteca del Rhythmbox - + Track Metadata Synchronization / Playlists - + Add track to Auto DJ queue (bottom) Afegeix la pista a la cua de DJ automàtic (final) - + Add track to Auto DJ queue (top) Afegeix la pista a la cua de DJ automàtic (inici) - + Ignore Ignora - + Show Banshee Library Mostra la biblioteca del Banshee - + Show iTunes Library Mostra la biblioteca de l'iTunes - + Show Traktor Library Mostra la biblioteca del Traktor - + Show Rekordbox Library Mostra la llibreria del Rekordbox - + Show Serato Library Mostra la llibreria de Serato - + All external libraries shown are write protected. Totes les llibreries externes estan protegides contra escriptura @@ -7298,33 +7309,33 @@ Per més informació sobre aquestes opcions, aneu a %1 DlgPrefRecord - + Choose recordings directory Seleccioneu la carpeta d'enregistraments - - + + Recordings directory invalid El directori de les gravacions és incorrecte. - + Recordings directory must be set to an existing directory. El directori de les gravacions ha de ser un directori existent. - + Recordings directory must be set to a directory. Cal informar el camp de directori de gravacions - + Recordings directory not writable No es pot escriure al directori de gravacions - + You do not have write access to %1. Choose a recordings directory you have write access to. No teniu permis d'escriptura a %1. Seleccioneu un directori de gravació on tingueu permís d'escriptura. @@ -7342,43 +7353,55 @@ Per més informació sobre aquestes opcions, aneu a %1 Navega… - - + + This will include the filepath for each track in the CUE file. +This option makes the CUE file less portable and can reveal personal +information from filepaths (i.e. username) + + + + + Enable File Annotation in CUE file + + + + + Quality Qualitat - + Tags Etiquetes - + Title Tí­tol - + Author Autor - + Album Àlbum - + Output File Format Format de fitxer de sortida - + Compression Compressió - + Lossy Amb pèrdues @@ -7393,12 +7416,12 @@ Per més informació sobre aquestes opcions, aneu a %1 Directori: - + Compression Level Nivell de compressió - + Lossless Sense pèrdues @@ -7616,12 +7639,12 @@ The loudness target is approximate and assumes track pregain and main output lev 2048 frames/period - + 2048 frames/periode 4096 frames/period - + 4096 frames/període @@ -8002,17 +8025,17 @@ The loudness target is approximate and assumes track pregain and main output lev - + OpenGL not available OpenGL no està disponible - + dropped frames fotogrames descartats - + Cached waveforms occupy %1 MiB on disk. La memòria cau dels gràfics d'ona ocupa %1 MiB en disc. @@ -8030,22 +8053,22 @@ The loudness target is approximate and assumes track pregain and main output lev Velocitat de fotogrames - + OpenGL Status - + Displays which OpenGL version is supported by the current platform. Mostra quina versió de OpenGL suporta la plataforma actual. - + Normalize waveform overview Anivella el gràfic d'ona en la vista de forma d'ona general - + Average frame rate Velocitat mitjana de fotogrames @@ -8061,7 +8084,7 @@ The loudness target is approximate and assumes track pregain and main output lev Nivell de zoom per defecte - + Displays the actual frame rate. Mostra la velocitat de fotogrames actual @@ -8096,7 +8119,7 @@ The loudness target is approximate and assumes track pregain and main output lev Greus - + Show minute markers on waveform overview @@ -8141,7 +8164,7 @@ The loudness target is approximate and assumes track pregain and main output lev Guany visual global - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. La forma d'ona general mostra la forma de l'ona de la pista sencera. @@ -8210,22 +8233,22 @@ Seleccioneu entre els diferents tipus de gràfics per a la forma d'ona loca - + Caching Memoria cau - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. El Mixxx emmagatzema a la memòria cau els gràfics d'ona de les vostres pistes a disc el primer cop que carregueu la pista en un plat. Això redueix el consum de CPU les posteriors vegades, però requereix espai addicional de disc. - + Enable waveform caching Habliita la memòria cau per a gràfics d'ona - + Generate waveforms when analyzing library Genera els gràfics d'ona a l'analitzar la biblioteca @@ -8241,7 +8264,7 @@ Seleccioneu entre els diferents tipus de gràfics per a la forma d'ona loca - + Type @@ -8271,12 +8294,42 @@ Seleccioneu entre els diferents tipus de gràfics per a la forma d'ona loca Mou el marcador de posició de reproducció de l'ona a l'esquerra, dreta o centre (per defecte). - + + Stem + + + + + Channel opacity + + + + + Channel opacity (outline) + + + + + Main stem opacity + + + + + Outline stem opacity + + + + + Move channel to foreground when volume is adjusted + + + + Overview Waveforms - + Clear Cached Waveforms Esborra la memòria cau dels gràfics d'ona @@ -9943,253 +9996,253 @@ Voleu sobreescriure aquesta llista? MixxxMainWindow - + Sound Device Busy El dispositiu de so està ocupat - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Torna-ho a provar</b> després de tancar l'altra aplicació o reconnectar el dispositiu d'àudio - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigura</b> les opcions del dispositiu d'àudio de Mixxx - - + + Get <b>Help</b> from the Mixxx Wiki. Obteniu <b>ajuda</b> a la Vikipèdia de Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Surt</b> del Mixxx. - + Retry Torna a provar - + skin Tema - + Allow Mixxx to hide the menu bar? - + Hide Always show the menu bar? - + Always show - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label - + Ask me again - - + + Reconfigure Reconfigura - + Help Ajuda - - + + Exit Surt - - + + Mixxx was unable to open all the configured sound devices. El Mixxx no ha pogut obrir tots els dispositius de so configurats. - + Sound Device Error Error del dispositiu de so - + <b>Retry</b> after fixing an issue <b>Reintenta</b> després de corregir el problema - + No Output Devices No hi ha cap dispositiu de sortida - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. S'ha configurat el Mixxx sense cap dispositiu de so de sortida, per la qual cosa s'inhabilitarà el processament d'àudio. - + <b>Continue</b> without any outputs. <b>Continua</b> sense cap sortida. - + Continue Continua - + Load track to Deck %1 Carrega la pista a la platina %1 - + Deck %1 is currently playing a track. La platina %1 està reproduint una pista. - + Are you sure you want to load a new track? Esteu segur de voler carregar una nova pista? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. No hi ha cap dispositiu d'entrada seleccionat per a aquest control de vinil. Si us plau, seleccioneu primer un dispositiu d'entrada a les preferències de Maquinari de so. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. No hi ha cap dispositiu d'entrada seleccionat per a aquest control de pas d'audio. Si us plau, seleccioneu primer un dispositiu d'entrada a les preferències de Maquinari de so. - + There is no input device selected for this microphone. Do you want to select an input device? No hi ha cap dispositiu d'entrada seleccionat per aquest micròfon. Volue seleccionar ara un dispositiu d'entrada? - + There is no input device selected for this auxiliary. Do you want to select an input device? No hi ha cap dispositiu d'entrada seleccionat per aquest auxiliar. Voleu seleccionar ara un dispositiu d'entrada? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Error en el fitxer d'aparença - + The selected skin cannot be loaded. No es pot carregar l'aparença seleccionada. - + OpenGL Direct Rendering OpenGL Renderització Directa - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. La Renderizació Directa no està habilitada a la vostra màquina.<br><br> Això significa que els gràfics forma d'ona seran molt <br><b>lents i poden fer servir molta CPU</b>. Prove de canviar la<br> configuració per habilitar la renderització directa, o desactiveu<br>els gràfics de forma d'ona a les preferències del Mixxx seleccionant<br>"Buit" al tipus de forma d'ona, en la secció de "Gràfics d'ona". - - - + + + Confirm Exit Confirma la sortida - + A deck is currently playing. Exit Mixxx? Un plat està reproduint encara. Voleu sortir del Mixxx? - + A sampler is currently playing. Exit Mixxx? Hi ha un reproductor de mostres que està reproduint. Segur que voleu sortir del Mixxx? - + The preferences window is still open. La finestra de preferències està oberta encara. - + Discard any changes and exit Mixxx? Descartar els canvis i sortir del Mixxx? @@ -11778,13 +11831,13 @@ Configureu un format diferent a les preferències La gravació amb OGG no està suportada. No s'ha pogut inicialitzar la llibreria OGG/Vorbis. - + encoder failure errada en el compressor - + Failed to apply the selected settings. No s'han pogut activar les opcions seleccionades @@ -12128,42 +12181,42 @@ may introduce a 'pumping' effect and/or distortion. - + Empty - + Simple - + Filtered - + HSV - + VSyncTest - + RGB - + Stacked - + Unknown @@ -12618,7 +12671,7 @@ may introduce a 'pumping' effect and/or distortion. SoftwareWaveformWidget - + Filtered Filtrat @@ -13502,7 +13555,7 @@ may introduce a 'pumping' effect and/or distortion. Shows the current volume for the right channel of the main output. - + Mostra el volum actual pel canal dret de la sortida mestra. @@ -13514,27 +13567,27 @@ may introduce a 'pumping' effect and/or distortion. Adjusts the main output gain. - + Ajusta el guany de la sortida mestra Determines the main output by fading between the left and right channels. - + Defineix la sortida mestra oscil·lant entre els canals esquerra i dret. Adjusts the left/right channel balance on the main output. - + Ajusta el balanç entre els canals esquerra/dret de la sortida mestra. Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - + Gradua la sortida d'auriculars entre la mescla principal i la monitorització (PFL o Escolta prèvia) If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - + Si s'activa, la mescla principal s'escolta en el canal dret, mentre la monitorització s'escolta en el canal esquerra. @@ -13569,7 +13622,7 @@ may introduce a 'pumping' effect and/or distortion. mix microphone input into the main output. - + mescla l'entrada de micròfon a la sortida mestra @@ -13595,47 +13648,47 @@ may introduce a 'pumping' effect and/or distortion. If keylock is disabled, pitch is also affected. - + Si el bloqueig de to està desactivat, també afecta al to Speed Up - + Accelera Raises the track playback speed (tempo). - + Incrementa la velocitat de la pista (tempo). Raises playback speed in small steps. - + Canvia la velocitat de reproducció en petits increments Slow Down - + Desaccelera Lowers the track playback speed (tempo). - + Redueix la velocitat de la pista (tempo). Lowers playback speed in small steps. - + Canvia la velocitat en petites reduccions Speed Up Temporarily (Nudge) - + Accelera temporalment (Nudge) Holds playback speed higher while active (tempo). - + Accelera la velocitat de reproducció mentre està actiu (tempo). diff --git a/res/translations/mixxx_fr.qm b/res/translations/mixxx_fr.qm index a5f5f92ba862333b0754bdf4db77d21b6699639a..99d8fc0a5386306a8897fc650a38548937fd9219 100644 GIT binary patch delta 27545 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Μ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 MR#zByQ5zuq4~oxu?f?J) delta 26153 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 It shows the data from the file tags, not track data from your Mixxx library like other track views. - + Il affiche les données des métadonnées de fichiers, et non les données de piste en provenance de votre bibliothèque Mixxx comme les autres vues de piste. If you load a track file from here, it will be added to your library. - + Si vous chargez un fichier de piste à partir d'ici, il sera ajouté à votre bibliothèque. @@ -3763,7 +3763,7 @@ trace : ci-dessus + messages de profilage Auto DJ Track Source - Auto DJ Source de piste + Auto DJ source de piste @@ -4107,7 +4107,7 @@ Raccourci : Maj + F12 Disable Auto DJ Shortcut: Shift+F12 - Désctiver Auto DJ + Désactiver Auto DJ Raccourci : Maj + F12 @@ -4200,13 +4200,13 @@ Joue le piste entièrement. Commence le fondu enchaîné à partir du nombre de secondes sélectionné avant la fin de la piste. Une durée de transition négative ajoute un silence entre les pistes. -Passe les silences : +Passer les silences : Joue la piste entièrement sauf les silences au début et à la fin. -Commencez le fondu enchaîné à partir du nombre de secondes sélectionné avant le +Commence le fondu enchaîné à partir du nombre de secondes sélectionné avant le dernier son. -Sauter silence démarrer volume maximum : -Identique à Passe les silences, mais en démarrant les transitions avec un +Passer les silences et démarrer au volume maximum : +Identique à Passer les silences, mais en démarrant les transitions avec un curseur de mixage centré, de sorte que l'intro démarre à plein volume. @@ -4227,12 +4227,12 @@ curseur de mixage centré, de sorte que l'intro démarre à plein volume. Skip Silence - Passe les silences + Passer les silences Skip Silence Start Full Volume - Sauter silence démarrer volume maximum + Passer les silences et démarrer au volume maximum @@ -4791,123 +4791,129 @@ Vous avez tenté d'assigner : %1,%2 DlgPrefBroadcast - + Icecast 2 Icecast 2 - + Shoutcast 1 Shoutcast 1 - + Icecast 1 Icecast 1 - + MP3 MP3 - + Ogg Vorbis Ogg Vorbis - + Opus Opus - + AAC AAC - + HE-AAC HE-AAC - + HE-AACv2 HE-AACv2 - + Automatic Automatique - + Mono Mono - + Stereo Stéréo - - - - + + + + Action failed Échec de l'action - + You can't create more than %1 source connections. Vous ne pouvez pas créer plus de %1 connexion de source. - + Source connection %1 Connexion source %1 - + + Settings for %1 + Settings for broadcast profile, %1 is the profile name placeholder + Réglages de %1 + + + At least one source connection is required. Au moins une connexion de source est requise. - + Are you sure you want to disconnect every active source connection? Êtes-vous sûr de vouloir déconnecter toutes les connections de source actives? - - + + Confirmation required Confirmation requise - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. '%1' a le même point de montage Icecast que '%2'. Deux de source de connexions vers le même serveur, ayant le même point de montage, ne peuvent pas être activé simultanément. - + Are you sure you want to delete '%1'? Êtes-vous sûr de vouloir effacer '%1' ? - + Renaming '%1' Renommage '%1' - + New name for '%1': Nouveau nom pour '%1' : - + Can't rename '%1' to '%2': name already in use Impossible de renommer '%1' en '%2' : nom déjà utilisé @@ -5691,12 +5697,12 @@ Appliquer les paramètres et continuer ? Force 3D acceleration - + Forcer l'accélération 3D If checked, Mixxx will always assume 3D acceleration is available. This may lead to pour performance if only CP-backed rendering is available.. - + Si cochée, Mixxx supposera que l'accélération 3D est toujours disponible. Cela peut entraîner une baisse des performances si le rendu disponible est basé uniquement sur le CPU. @@ -6615,47 +6621,47 @@ vous permettant ainsi d'ajuster la tonalité afin de produire une mixage ha L'élément n'est pas un répertoire ou un répertoire est manquant - + Choose a music directory Choisissez un répertoire de musique - + Confirm Directory Removal Confirmez la suppression du répertoire - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. Mixxx ne cherchera plus de nouvelles pistes dans ce répertoire. Que voulez-vous faire des pistes de ce répertoire et ses sous-répertoires<&nbsp>?<ul><li>Masquer toutes les pistes de ce répertoire et ses sous-répertoires.</li><li>Supprimer définitivement de Mixxx toutes les métadonnées de ces pistes.</li><li>Laisser ces pistes inchangées dans votre bibliothèque.</li></ul>Masquer des pistes enregistre leurs métadonnées au cas où vous les ajouteriez à nouveau dans le futur. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. Les métadonnées regroupent tous les détails de la piste (artiste, titre, nombre de lectures, etc...) ainsi que les grilles rythmiques, les repères rapides et les boucles. Ce choix n'affecte que la bibliothèque de Mixxx. Aucun fichier sur le disque ne sera modifié ou supprimé. - + Hide Tracks Masquer les pistes - + Delete Track Metadata Supprimer les métadonnées de la piste - + Leave Tracks Unchanged Ne pas modifier les pistes - + Relink music directory to new location Rattacher le répertoire musical à un autre emplacement - + Select Library Font Sélectionner la police pour la bibliothèque @@ -6704,262 +6710,267 @@ vous permettant ainsi d'ajuster la tonalité afin de produire une mixage ha Relire les répertoires au démarrage - + Audio File Formats Formats de fichiers audio - + Track Table View Vue table des pistes - + Track Double-Click Action: Action double-clic sur une piste : - + BPM display precision: Précision de l'affichage BPM : - + Session History Historique des sessions - + Track duplicate distance Distance pour doublon de piste - + When playing a track again log it to the session history only if more than N other tracks have been played in the meantime Lors de la nouvelle lecture d'une piste, enregistrez-la dans l'historique de la session uniquement si plus de N autres pistes ont été lues entre-temps. - + History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. La liste de lecture de l'historique avec moins de N pistes sera supprimée<br/><br/>Remarque : le nettoyage sera effectué au démarrage et à l'arrêt de Mixxx. - + Delete history playlist with less than N tracks Supprimer la liste de lecture de l'historique contenant moins de N pistes - + Library Font: Police pour la bibliothèque : - + + Show scan summary dialog + + + + Grey out played tracks Griser les pistes déjà jouées - + Track Search Recherche de piste - + Enable search completions Activer les complétions de recherche - + Enable search history keyboard shortcuts Activer les raccourcis clavier pour l'historique de recherche - + Percentage of pitch slider range for 'fuzzy' BPM search: Pourcentage de la plage du curseur de hauteur (pitch) pour la recherche « floue » de BPM : - + This range will be used for the 'fuzzy' BPM search (~bpm:) via the search box, as well as for BPM search in Track context menu > Search related Tracks Cette plage sera utilisée pour la recherche « floue » de BPM (~bpm:) via le champ de recherche, ainsi que pour la recherche de BPM dans le menu contextuel de la piste > Rechercher les pistes associées - + Preferred Cover Art Fetcher Resolution Résolution préférée du récupérateur de pochette d'album - + Fetch cover art from coverartarchive.com by using Import Metadata From Musicbrainz. Récupérer les pochettes d'album depuis coverartarchive.com en utilisant l'importation de métadonnées depuis Musicbrainz. - + Note: ">1200 px" can fetch up to very large cover arts. Note : ">1200 px" peut récupérer de très larges images de couverture - + >1200 px (if available) >1200 px (si disponible) - + 1200 px (if available) 1200 px (si disponible) - + 500 px 500 px - + 250 px 250 px - + Settings Directory Répertoire des paramètres - + The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. Le répertoire des paramètres Mixxx contient la base de données de la bibliothèque, divers fichiers de configuration, fichiers de journalisation, données d'analyse de piste, ainsi que des mappages de contrôleurs personnalisés. - + Edit those files only if you know what you are doing and only while Mixxx is not running. Modifier ces fichiers uniquement si vous savez ce que vous faites et uniquement lorsque Mixxx n'est pas en cours d'exécution. - + Open Mixxx Settings Folder Ouvrir le répertoire de paramètres Mixxx - + Library Row Height: Hauteur des lignes pour la bibliothèque : - + Use relative paths for playlist export if possible Utiliser si possible des chemins relatifs pour l'exportation de listes de lecture - + ... ... - + px px - + Synchronize library track metadata from/to file tags Synchroniser les métadonnées des pistes de la bibliothèque depuis/vers les tags de fichier - + Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library Écrire automatiquement les métadonnées des pistes modifiées de la bibliothèque dans les tags de fichier et réimportez les métadonnées des tags de fichier mises à jour dans la bibliothèque. - + Synchronize Serato track metadata from/to file tags (experimental) Synchroniser les métadonnées Serato des pistes depuis/vers les tags de fichier (expérimental) - + Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. Conserve la couleur de la piste, la grille rythmique, le verrouillage du BPM, les points de repère et les boucles synchronisés avec les tags de fichier SERATO_MARKERS/MARKERS2.<br/><br/>AVERTISSEMENT : l'activation de cette option active également la réimportation des métadonnées Serato après que les fichiers aient été modifiés en dehors de Mixxx. Lors de la réimportation, les métadonnées existantes dans Mixxx sont remplacées par les métadonnées trouvées dans les tags de fichier. Les métadonnées personnalisées non incluses dans les tags de fichier, comme les couleurs des boucles, sont perdues. - + Edit metadata after clicking selected track Éditer les métadonnées après avoir cliquer sur la piste sélectionnée - + Search-as-you-type timeout: Temporisation de la recherche en cours de frappe : - + ms ms - + Load track to next available deck Charger la piste sur la prochaine platine disponible - + External Libraries Bibliothèques externes - + You will need to restart Mixxx for these settings to take effect. Vous devez redémarrer Mixxx pour que ces paramètres prennent effet. - + Show Rhythmbox Library Afficher la Bibliothèque Rhythmbox - + Track Metadata Synchronization / Playlists Synchronisation des métadonnées de piste / listes de lecture - + Add track to Auto DJ queue (bottom) Ajouter la piste à la file d'attente Auto DJ (fin) - + Add track to Auto DJ queue (top) Ajouter la piste à la file d'attente Auto DJ (début) - + Ignore Pas d'effet - + Show Banshee Library Afficher la bibliothèqie Banshee - + Show iTunes Library Afficher la Bibliothèque iTunes - + Show Traktor Library Afficher la Bibliothèque Tracktor - + Show Rekordbox Library Afficher la Bibliothèque Rekordbox - + Show Serato Library Afficher la Bibliothèque Serato - + All external libraries shown are write protected. Toutes les bibliothèques externes affichées sont protégées en écriture. @@ -7304,33 +7315,33 @@ vous permettant ainsi d'ajuster la tonalité afin de produire une mixage ha DlgPrefRecord - + Choose recordings directory Sélectionnez le répertoire des enregistrements - - + + Recordings directory invalid Répertoire des enregistrements non valide - + Recordings directory must be set to an existing directory. Le répertoire des enregistrements doit être défini sur un répertoire existant. - + Recordings directory must be set to a directory. Le répertoire des enregistrements doit être défini sur un répertoire. - + Recordings directory not writable Répertoire des enregistrements non accessible en écriture - + You do not have write access to %1. Choose a recordings directory you have write access to. Vous n'avez pas d'accès en écriture à %1. Choisissez un répertoire d'enregistrements auquel vous avez accès en écriture. @@ -7348,43 +7359,55 @@ vous permettant ainsi d'ajuster la tonalité afin de produire une mixage ha Parcourir... - - + + This will include the filepath for each track in the CUE file. +This option makes the CUE file less portable and can reveal personal +information from filepaths (i.e. username) + + + + + Enable File Annotation in CUE file + + + + + Quality Qualité - + Tags Métadonnées - + Title Titre - + Author Auteur - + Album Album - + Output File Format Format de fichier de sortie - + Compression Compression - + Lossy Avec perte @@ -7399,12 +7422,12 @@ vous permettant ainsi d'ajuster la tonalité afin de produire une mixage ha Répertoire : - + Compression Level Niveau de compression - + Lossless Sans perte @@ -8010,17 +8033,17 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos Visualiseur de forme d'onde entier - + OpenGL not available OpenGL non disponible - + dropped frames images sautées - + Cached waveforms occupy %1 MiB on disk. La forme d'onde en cache occupe %1 MiB sur le disque. @@ -8038,22 +8061,22 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos Nombre d'images par seconde - + OpenGL Status Statut OpenGL - + Displays which OpenGL version is supported by the current platform. Affiche quelle version d'OpenGL est prise en charge sur la plateforme actuelle. - + Normalize waveform overview Normaliser la visualisation de la forme d'onde - + Average frame rate Taux moyen de fréquence d'images @@ -8069,7 +8092,7 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos Niveau de zoom par défaut - + Displays the actual frame rate. Affiche la vitesse de rafraîchissement courante. @@ -8104,7 +8127,7 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos Basse - + Show minute markers on waveform overview Afficher les marqueurs de minutes sur l'aperçu de la forme d'onde @@ -8149,7 +8172,7 @@ L'intensité sonore visée est approximatif et suppose que les gains d&apos Gain visuel général - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. L’aperçu de la forme d'onde montre l'enveloppe de la forme d'onde de la piste entière. @@ -8218,22 +8241,22 @@ Sélectionner depuis les différents types d'affichage de la forme d'o pt - + Caching Mise en cache - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. Mixxx met en cache les formes d'onde de vos pistes sur le disque la première fois que vous chargez une piste. Cela réduit l'utilisation du CPU lorsque vous êtes en cours de lecture en direct, mais requiert plus d'espace disque. - + Enable waveform caching Activer la mise en cache des formes d'onde. - + Generate waveforms when analyzing library Générer les formes d'onde lors de l'analyse de la bibliothèque @@ -8249,7 +8272,7 @@ Sélectionner depuis les différents types d'affichage de la forme d'o - + Type Type @@ -8279,12 +8302,42 @@ Sélectionner depuis les différents types d'affichage de la forme d'o Déplace la position du marqueur de lecture sur les formes d'onde vers la gauche, la droite ou le centre (par défaut). - + + Stem + + + + + Channel opacity + + + + + Channel opacity (outline) + + + + + Main stem opacity + + + + + Outline stem opacity + + + + + Move channel to foreground when volume is adjusted + + + + Overview Waveforms Aperçu des formes d'ondes - + Clear Cached Waveforms Effacer les formes d'onde en cache. @@ -9957,253 +10010,253 @@ Voulez-vous vraiment l'écraser ? MixxxMainWindow - + Sound Device Busy Carte son occupée - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Réessayer</b> après avoir fermé l'autre application ou avoir reconnecté le périphérique de son - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Reconfigurer</b> les options audio de Mixxx. - - + + Get <b>Help</b> from the Mixxx Wiki. Trouver <b>de l'aide</b> sur le Wiki Mixxx. - - - + + + <b>Exit</b> Mixxx. <b>Quitter</b> Mixxx. - + Retry Réessayer - + skin thème - + Allow Mixxx to hide the menu bar? Autoriser Mixxx à masquer la barre de menu ? - + Hide Always show the menu bar? Masquer - + Always show Toujours montrer - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label La barre de menu Mixxx est masquée et peut être basculée d'une simple pression sur le bouton <b>Alt</b>.<br><br>Clic <b>%1</b> pour accepter.<br><br>Clic <b>%2</b> pour désactiver, par exemple si vous n'utilisez pas Mixxx avec un clavier.<br><br>Vous pouvez modifier ce paramètre à tout moment dans Préférences --> Interface.<br> - + Ask me again Demandez-le moi encore - - + + Reconfigure Reconfigurer - + Help Aide - - + + Exit Quitter - - + + Mixxx was unable to open all the configured sound devices. Mixxx n'est pas parvenu à ouvrir tous les périphériques de son configurés. - + Sound Device Error Erreur de périphérique de son - + <b>Retry</b> after fixing an issue <b>Réessayer</b> après avoir solutionné un problème - + No Output Devices Aucun périphérique de sortie - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx a été configuré sans aucun périphérique de sortie audio. Sans périphérique de sortie configuré, le traitement du son sera désactivé . - + <b>Continue</b> without any outputs. <b>Continuer</b> sans aucune sortie. - + Continue Continuer - + Load track to Deck %1 Charger la piste sur la platine %1 - + Deck %1 is currently playing a track. La platine %1 est en cours de lecture d'une piste. - + Are you sure you want to load a new track? Êtes-vous certain de vouloir charger une nouvelle piste ? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Aucun périphérique d'entrée n'est sélectionné pour ce contrôle vinyle. Veuillez d'abord en sélectionner un dans les Préférences du matériel sonore. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Il n'y a aucun périphérique d'entrée sélectionné pour ce contrôle intermédiaire. Veuillez d'abord en sélectionner un dans les Préférences du matériel sonore. - + There is no input device selected for this microphone. Do you want to select an input device? Aucun périphérique d'entrée n'est sélectionné pour ce microphone. Voulez-vous sélectionner un périphérique d'entrée ? - + There is no input device selected for this auxiliary. Do you want to select an input device? Aucun périphérique d'entrée n'est sélectionné pour cet auxiliaire. Voulez-vous sélectionner un périphérique d'entrée ? - + Scan took %1 Le scan a pris %1 - + No changes detected. Aucun changement détecté. - - + + %1 tracks in total %1 pistes au total - + %1 new tracks found %1 nouvelles pistes trouvées - + %1 moved tracks detected %1 pistes déplacées détectées - + %1 tracks are missing (%2 total) %1 titres sont manquants (%2 au total) - + %1 tracks have been rediscovered %1 pistes ont été redécouvertes - + Library scan finished Analyse de la bibliothèque terminée - + Error in skin file Erreur dans le fichier du thème - + The selected skin cannot be loaded. Le thème sélectionné ne peut pas être chargé. - + OpenGL Direct Rendering Rendu Direct OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Le rendu direct n'est pas activé sur votre machine.<br><br> Cela signifie que l'affichage de la forme d'onde sera très<br><b>lent et risque de surcharger votre processeur</b>. Mettez à jour votre<br>configuration pour activer le rendu direct ou désactivez<br>les affichages de forme d'onde dans les préférences de Mixxx en sélectionnant<br>"Vide" comme affichage de forme d'onde dans la section "Interface". - - - + + + Confirm Exit Confirmer la fermeture - + A deck is currently playing. Exit Mixxx? Une platine est en cours de lecture. Quitter Mixxx ? - + A sampler is currently playing. Exit Mixxx? Un échantillonneur est en cours de lecture. Quitter Mixxx ? - + The preferences window is still open. La fenêtre de Préférences est déjà ouverte. - + Discard any changes and exit Mixxx? Abandonner toutes les modifications et quitter Mixxx ? @@ -10237,12 +10290,12 @@ Voulez-vous sélectionner un périphérique d'entrée ? Unlock all playlists - + Déverrouiller toutes les listes de lecture Delete all unlocked playlists - + Supprimer toutes les listes de lecture déverrouillées @@ -10253,17 +10306,17 @@ Voulez-vous sélectionner un périphérique d'entrée ? Confirm Deletion - + Confirmer la suppression Do you really want to delete all unlocked playlists? - + Voulez-vous vraiment supprimer toutes les listes de lecture déverrouillées ? Deleting %1 unlocked playlists.<br>This operation can not be undone! - + Suppression de %1 listes de lecture déverrouillées.<br>Cette opération est irréversible ! @@ -11799,13 +11852,13 @@ Complètement à droite : fin de la période d'effet L'enregistrement OGG n'est pas pris en charge. La bibliothèque OGG/Vorbis n'a pas pu être initialisée. - + encoder failure défaillance de l'encodeur - + Failed to apply the selected settings. Échec de l'application des paramètres sélectionnés. @@ -12157,42 +12210,42 @@ du signal d'entrée, des temps de relâchement courts peuvent introduire un Stem #%1 - + Empty Vide - + Simple Simple - + Filtered Filtré - + HSV HSV - + VSyncTest VSyncTest - + RGB RVB - + Stacked Empilé - + Unknown Inconnu @@ -12647,7 +12700,7 @@ du signal d'entrée, des temps de relâchement courts peuvent introduire un SoftwareWaveformWidget - + Filtered Filtré @@ -17141,17 +17194,17 @@ Cliquez sur OK pour sortir. Crates - + Bacs Playlists - + Listes de lecture Selected crates/playlists - + Bacs / Listes de lecture sélectionnés @@ -17244,7 +17297,7 @@ Cliquez sur OK pour sortir. Exported %1 track(s), %2 crate(s), and %3 playlist(s). - + %1 piste(s), %2 bac(s) et %3 listes de lecture ont été exportés diff --git a/res/translations/mixxx_nl.qm b/res/translations/mixxx_nl.qm index ae2ce14d4fff4f977f74a755d8261b8fd8938764..5c6e526f49e9c8aca77e7fb7a2c813184fd61d43 100644 GIT binary patch delta 17622 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 delta 17657 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 DlgPrefBroadcast - + Icecast 2 Icecast 2 - + Shoutcast 1 Shoutcast 1 - + Icecast 1 Icecast 1 - + MP3 MP3 - + Ogg Vorbis Ogg Vorbis - + Opus Opus - + AAC AAC - + HE-AAC HE-AAC - + HE-AACv2 HE-AACv2 - + Automatic Automatisch - + Mono Mono - + Stereo Stereo - - - - + + + + Action failed Actie mislukt - + You can't create more than %1 source connections. U kunt niet meer dan %1 bronverbindingen maken. - + Source connection %1 Bronverbinding %1 - + + Settings for %1 + Settings for broadcast profile, %1 is the profile name placeholder + + + + At least one source connection is required. Er is ten minste één bronverbinding vereist. - + Are you sure you want to disconnect every active source connection? Weet u zeker dat u elke actieve bronverbinding wilt verbreken? - - + + Confirmation required Bevestiging benodigd - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. '%1' heeft hetzelfde Icecast mountpoint als '%2'. Twee bronverbindingen met dezelfde server die hetzelfde mountpoint hebben, kunnen niet tegelijkertijd worden ingeschakeld. - + Are you sure you want to delete '%1'? Weet u zeker dat u '%1' wilt verwijderen? - + Renaming '%1' Hernoemen '%1' - + New name for '%1': Nieuwe naam voor '%1': - + Can't rename '%1' to '%2': name already in use Kan de naam van '%1' niet hernoemen naar '%2': naam is al in gebruik @@ -6615,47 +6621,47 @@ and allows you to pitch adjust them for harmonic mixing. Het item is geen map of ontbreekt. - + Choose a music directory Kies een muziek folder - + Confirm Directory Removal Bevestig het verwijderen van de map - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. Mixxx zal deze map niet langer observeren voor nieuwe Tracks. Wat wil je doen met de Tracks in deze map en submappen?<ul><li>Verberg alle Tracks uit deze map en submappen. </li><li>Verwijder permanent alle metadata van deze Tracks uit Mixxx.</li><li>Laat de Tracks ongemoeid in je Bibliotheek.</li></ul>Tracks verbergen zal wel de metadata blijven bewaren mocht je ze in de toekomst opnieuw willen toevoegen. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. Metadata betekent alle Trackdetails (Artiest, Titel, Afspeelteller, etc.) evenals Beatgrids, Hotcues en Loops. Deze keuze heeft alleen betrekking op de Mixxx-Bibliotheek. Er worden geen bestanden op schijf gewijzigd of verwijderd. - + Hide Tracks Verberg Tracks - + Delete Track Metadata Verwijder Metadata - + Leave Tracks Unchanged Laat Tracks ongewijzigd - + Relink music directory to new location Koppel de muziekmap opnieuw aan een nieuwe locatie - + Select Library Font Selecteer Bibliotheeklettertype @@ -6704,262 +6710,267 @@ and allows you to pitch adjust them for harmonic mixing. Herscan de bestandsmappen bij opstarten - + Audio File Formats Audiobestandsindelingen - + Track Table View Track tabel aanzicht - + Track Double-Click Action: Actie bij dubbel klik op Track - + BPM display precision: BPM detail weergave : - + Session History Sessie Geschiedenis - + Track duplicate distance Track komt dubbel voor - + When playing a track again log it to the session history only if more than N other tracks have been played in the meantime Wanneer een Track opnieuw wordt afgespeeld dan wordt deze enkel in de geschiedenis opgeslagen als er ondertussen meer dan N andere Tracks werden afgespeeld. - + History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. Geschiedenis afspeellijsten met minder dan N Tracks worden verwijderd<br/><br/>Opmerking: het opkuisen gebeurd tijdens het opstarten en afsluiten van Mixxx. - + Delete history playlist with less than N tracks Verwijder Geschiedenis afspeellijst als die minder dan N Tracks bevat - + Library Font: Lettertype Bibliotheek: - + + Show scan summary dialog + + + + Grey out played tracks Verduister gespeelde tracks in grijs. - + Track Search Zoek track - + Enable search completions Zoekterm vervolledigen toestaan - + Enable search history keyboard shortcuts Zoekgeschiedenis via toetsenbord-snelkoppelingen toestaan - + Percentage of pitch slider range for 'fuzzy' BPM search: Percentage van het bereik van de pitch glijder voor wazige BPM zoekfunctie: - + This range will be used for the 'fuzzy' BPM search (~bpm:) via the search box, as well as for BPM search in Track context menu > Search related Tracks Dit bereik zal zowel gebruikt worden in de wazige BPM zoekfunctie (`bpm) via het zoekvenster als voor de BPM zoekfunctie in het Track omgevingsmenu > en het Zoeken van Overeenkomstige Tracks - + Preferred Cover Art Fetcher Resolution Voorkeur resolutie bij zoeken naar Cover Art - + Fetch cover art from coverartarchive.com by using Import Metadata From Musicbrainz. Zoek Cover Art bij CcoverArtArchive.com door Metadata van Musicbrainz te importeren. - + Note: ">1200 px" can fetch up to very large cover arts. Opmerking: ">1200 px" kan leiden tot zeer grote Cover Art bestanden. - + >1200 px (if available) >1200 px (indien beschikbaar) - + 1200 px (if available) 1200 px (indien beschikbaar) - + 500 px 500 px - + 250 px 250 px - + Settings Directory Instellingen Map - + The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. De Mixxx instellingenmap bevat de Bibliotheek-database, verschillende configuratie-bestanden, log-bestanden, Track-analyses, als ook persoonlijke controller instellingen. - + Edit those files only if you know what you are doing and only while Mixxx is not running. Bewerk deze bestanden alleen als u weet wat u doet en alleen terwijl Mixxx niet actief is. - + Open Mixxx Settings Folder Open Mixxx-instellingenmap - + Library Row Height: Rijhoogte Bibliotheek: - + Use relative paths for playlist export if possible Gebruik indien mogelijk relatieve paden bij exporteren van afspeellijsten - + ... ... - + px px - + Synchronize library track metadata from/to file tags Synchroniseer Bibliotheek Track metadata van /naar tags in bestanden. - + Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library Automatisch de aangepaste Track-metadata vanuit de Bibliotheek naar de bestand-tags wegschrijven en de metadata opnieuw importeren vanuit de aangepaste bestanden naar de Bibliotheek. - + Synchronize Serato track metadata from/to file tags (experimental) Synchroniseer Serato Track metadata van/naar bestands-tags (experimenteel) - + Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. Houdt Track kleur, Beat Grid, BPM vergrendeling, Cue-Punten en Loops gesynchroniseerd met SERATO_MARKERS/MARKERS2 BestandsTags.<br/><br/>WAARSCHUWING: Activatie van deze optie activeert ook het her-importeren van de Serato metadata nadat bestanden nuiten Mixxx werden aangepast. Bij her-import wordt de bestaande metadata in Mixxx vervangen door de metadata die in de BestandsTags. Aangepaste metadata die niet in BestandsTags wordt opgeslagen, wordt verloren (bijv. Loop Kleuren) - + Edit metadata after clicking selected track Bewerk metadata nadat u op de geselecteerde Track hebt geklikt - + Search-as-you-type timeout: Zoeken-bij-typen timeout: - + ms ms - + Load track to next available deck Laad Track naar het volgende beschikbare Deck - + External Libraries Externe Bibliotheken - + You will need to restart Mixxx for these settings to take effect. U moet Mixxx opnieuw opstarten om deze instellingen te activeren. - + Show Rhythmbox Library Toon Rhythmbox Bibliotheek - + Track Metadata Synchronization / Playlists Track Metadata Synchronisatie / Afspeellijsten - + Add track to Auto DJ queue (bottom) Track toevoegen aan Auto-DJ wachtrij (onderaan) - + Add track to Auto DJ queue (top) Track toevoegen aan Auto-DJ wachtrij (bovenaan) - + Ignore Negeren - + Show Banshee Library Laat Banshee Bibliotheek zien - + Show iTunes Library Toon iTunes Bibliotheek - + Show Traktor Library Toon Traktor Bibliotheek - + Show Rekordbox Library Toon Rekordbox Bibliotheek - + Show Serato Library Toon Serato Bibliotheek - + All external libraries shown are write protected. Alle weergegeven externe bibliotheken zijn tegen schrijven beveiligd. @@ -7304,33 +7315,33 @@ and allows you to pitch adjust them for harmonic mixing. DlgPrefRecord - + Choose recordings directory Kies de Map voor Opnames - - + + Recordings directory invalid Map voor Opnames ongeldig - + Recordings directory must be set to an existing directory. De Map voor Opnames moet op een bestaande map worden ingesteld. - + Recordings directory must be set to a directory. De Map voor Opnames moet ingesteld zijn op een map. - + Recordings directory not writable Map voor Opnames is niet beschrijfbaar - + You do not have write access to %1. Choose a recordings directory you have write access to. U heeft geen schrijftoegang tot %1. Kies een Map voor Opnames waartoe u schrijftoegang hebt. @@ -7348,43 +7359,55 @@ and allows you to pitch adjust them for harmonic mixing. Zoeken... - - + + This will include the filepath for each track in the CUE file. +This option makes the CUE file less portable and can reveal personal +information from filepaths (i.e. username) + + + + + Enable File Annotation in CUE file + + + + + Quality Kwaliteit - + Tags Labels - + Title Titel - + Author Auteur - + Album Album - + Output File Format Bestandsindeling voor Uitvoer - + Compression Compressie - + Lossy @@ -7399,12 +7422,12 @@ and allows you to pitch adjust them for harmonic mixing. Map: - + Compression Level Compressie Niveau - + Lossless @@ -8010,17 +8033,17 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out volledige waveform weergave - + OpenGL not available OpenGL niet beschikbaar - + dropped frames verloren frames - + Cached waveforms occupy %1 MiB on disk. Waveforms in cache gebruiken %1 MiB op schijf @@ -8038,22 +8061,22 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out Framesnelheid - + OpenGL Status OpenGL Status - + Displays which OpenGL version is supported by the current platform. Geeft weer welke OpenGL-versie wordt ondersteund door het huidige platform. - + Normalize waveform overview Normaliseer Waveform-overzicht - + Average frame rate Gemiddelde framesnelheid @@ -8069,7 +8092,7 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out Standaard zoomniveau - + Displays the actual frame rate. Geeft de werkelijke framesnelheid weer. @@ -8104,7 +8127,7 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out Laag - + Show minute markers on waveform overview Toon minuut-aanduidingen in waveform overview @@ -8149,7 +8172,7 @@ Het DoelVolume is bij benadering en veronderstelt dat Track PreGain en Hoofd Out Globale visuele versterking - + The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. Het waveform overzicht toont de waveform omslag van de hele Track. @@ -8218,22 +8241,22 @@ Kies uit verschillende soorten weergaven voor de waveform, die voornamelijk vers pt - + Caching Caching - + Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. Mixxx buffert de waveforms van je Tracks in de cache op schijf wanneer een Track voor de eerste keer laadt. Dit vermindert het CPU-gebruik tijdens het live spelen, maar vereist extra schijfruimte. - + Enable waveform caching Schakel waveform caching in - + Generate waveforms when analyzing library Genereer waveforms bij het analyseren van de Bibliotheek @@ -8249,7 +8272,7 @@ Kies uit verschillende soorten weergaven voor de waveform, die voornamelijk vers - + Type Type @@ -8279,12 +8302,42 @@ Kies uit verschillende soorten weergaven voor de waveform, die voornamelijk vers Verplaatst de speelmarkeringspositie op de waveforms naar links, rechts of midden (standaard). - + + Stem + + + + + Channel opacity + + + + + Channel opacity (outline) + + + + + Main stem opacity + + + + + Outline stem opacity + + + + + Move channel to foreground when volume is adjusted + + + + Overview Waveforms Overzicht Waveform - + Clear Cached Waveforms Wis gebufferde Waveforms @@ -9824,7 +9877,7 @@ Wil je het echt overschrijven? It's taking Mixxx a minute to scan your music library, please wait... - Mixxx heeft ongeveer een minuut nodig om je muziekBibliotheek te scannen, even geduld... + Mixxx heeft even nodig om je muziekbibliotheek te scannen, even geduld... @@ -9957,253 +10010,253 @@ Wil je het echt overschrijven? MixxxMainWindow - + Sound Device Busy Geluisapparaat bezig - + <b>Retry</b> after closing the other application or reconnecting a sound device <b>Probeer opnieuw</b> na het afsluiten van de andere applicatie of het opnieuw aansluiten van een geluidsapparaat - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. <b>Configureer</b> opnieuw de Mixxx instellingen van het geluidsapparaat. - - + + Get <b>Help</b> from the Mixxx Wiki. <b>Hulp</b>zoeken in de Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. <b>Verlaat</b> Mixxx. - + Retry Probeer opnieuw - + skin skin - + Allow Mixxx to hide the menu bar? Mixxx toestaan om de menu balk te verbergen? - + Hide Always show the menu bar? Verberg - + Always show Altijd tonen - + The Mixxx menu bar is hidden and can be toggled with a single press of the <b>Alt</b> key.<br><br>Click <b>%1</b> to agree.<br><br>Click <b>%2</b> to disable that, for example if you don't use Mixxx with a keyboard.<br><br>You can change this setting any time in Preferences -> Interface.<br> Keep formatting tags <b> (bold text) and <br> (linebreak). %1 is the placeholder for the 'Always show' button label De Mixxx menu balk is verborgen en kan worden opgeroepen met een enkele druk op de <b>Alt</b> toets.<br><br>Click <b>%1</b> om akkoord te gaan.<br><br>Click <b>%2</b> om dit uit te schakelen, bijvoorbeeld wanneer u Mixxx niet met een toetsenbord gebruikt.<br><br>U kan deze instelling altijd wijzigen in de Voorkeuren -> Interface.<br> - + Ask me again Vraag mij opnieuw - - + + Reconfigure Opnieuw configureren - + Help Help - - + + Exit Afsluiten - - + + Mixxx was unable to open all the configured sound devices. Mixxx kon niet alle geconfigureerde geluidsapparaten openen. - + Sound Device Error Fout met geluidsapparaat - + <b>Retry</b> after fixing an issue <b>Probeer opnieuw</b> na het oplossen van een probleem - + No Output Devices Geen uitvoerapparaten - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. Mixxx is ingesteld zonder uitvoerapparaten voor geluid. Geluidsverwerking wordt uitgeschakeld zonder een geconfigureerd uitvoerapparaat. - + <b>Continue</b> without any outputs. <b>Ga door</b> zonder uitvoer. - + Continue Verdergaan - + Load track to Deck %1 Laad Track in deck %1 - + Deck %1 is currently playing a track. Deck %1 speelt momenteel een Track af. - + Are you sure you want to load a new track? Bent u zeker dat u een nieuwe Track wil laden? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. Er is geen invoerapparaat geselecteerd voor deze vinylbesturing. Selecteer eerst een invoerapparaat in de voorkeuren voor geluidshardware. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. Er is geen invoerapparaat geselecteerd voor dit Directe Doorvoerapparaat. Selecteer eerst een invoerapparaat in de voorkeuren voor geluidsapparatuur. - + There is no input device selected for this microphone. Do you want to select an input device? Er is geen invoerapparaat geselecteerd voor deze microfoon. Wilt u een invoerapparaat selecteren? - + There is no input device selected for this auxiliary. Do you want to select an input device? Er is geen invoerapparaat geselecteerd voor deze Auxiliary. Wilt u een invoerapparaat selecteren? - + Scan took %1 - + No changes detected. - - + + %1 tracks in total - + %1 new tracks found - + %1 moved tracks detected - + %1 tracks are missing (%2 total) - + %1 tracks have been rediscovered - + Library scan finished - + Error in skin file Fout in Skin-bestand - + The selected skin cannot be loaded. De geselecteerde Skin kan niet worden geladen. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. OpenGL Directe weergave-herberekening is niet ingeschakeld op uw computer.<br><br> Dit betekent dat de weergave van de golfvormen erg<br><b> traag zal zijn en uw CPU zwaar kan belasten</b>. Werk uw <br> configuratie bij om OpenGL Directe weergave-herberekening mogelijk te maken of schakel<br>de waveform weergaven uit in de Mixxx-voorkeuren door "Leeg" te selecteren<br> als de waveform weergave in het gedeelte "Interface". - - - + + + Confirm Exit Afsluiten bevestigen - + A deck is currently playing. Exit Mixxx? Er is momenteel een deck actief. Mixxx afsluiten? - + A sampler is currently playing. Exit Mixxx? Er is momenteel een sampler actief. Mixxx afsluiten? - + The preferences window is still open. Het scherm "Voorkeuren" staat nog open. - + Discard any changes and exit Mixxx? Wijzigingen negeren en Mixxx afsluiten? @@ -11800,13 +11853,13 @@ Volledig rechts: einde van de effectperiode OGG-opname wordt niet ondersteund. OGG/Vorbis-Bibliotheek kan niet worden geïnitialiseerd. - + encoder failure encoderfout - + Failed to apply the selected settings. Kan de geselecteerde instellingen niet toepassen. @@ -12157,42 +12210,42 @@ release tijd zorgen voor een pompend effect en/of een vervorming. Stem #%1 - + Empty Leeg - + Simple Eenvoudig - + Filtered Gefilterd - + HSV HSV - + VSyncTest VSyncTest - + RGB RGB - + Stacked Gestapeld - + Unknown Onbekend @@ -12647,7 +12700,7 @@ release tijd zorgen voor een pompend effect en/of een vervorming. SoftwareWaveformWidget - + Filtered Gefilterd From 43e8e6c69f9efa8187a997435b6d04fb27ad5068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 18 Jul 2025 20:44:11 +0200 Subject: [PATCH 070/163] remove no longer maintained fr_CA and fr_CI languages --- res/translations/mixxx_fr_CA.qm | Bin 386767 -> 0 bytes res/translations/mixxx_fr_CA.ts | 15817 ------------------------------ res/translations/mixxx_fr_CI.qm | Bin 386767 -> 0 bytes res/translations/mixxx_fr_CI.ts | 15817 ------------------------------ 4 files changed, 31634 deletions(-) delete mode 100644 res/translations/mixxx_fr_CA.qm delete mode 100644 res/translations/mixxx_fr_CA.ts delete mode 100644 res/translations/mixxx_fr_CI.qm delete mode 100644 res/translations/mixxx_fr_CI.ts diff --git a/res/translations/mixxx_fr_CA.qm b/res/translations/mixxx_fr_CA.qm deleted file mode 100644 index 4a5593abaaa33aa982868f42b73c53a4424d00f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386767 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 diff --git a/res/translations/mixxx_fr_CA.ts b/res/translations/mixxx_fr_CA.ts deleted file mode 100644 index 554ba3829e9b..000000000000 --- a/res/translations/mixxx_fr_CA.ts +++ /dev/null @@ -1,15817 +0,0 @@ - - - : - - - - The size of the file which has been stored during the current recording in megabytes (MB) - - - - - AnalysisFeature - - - Analyze - Analyse - - - - AutoDJFeature - - - Crates - Caisses - - - - Remove Crate as Track Source - Remove Crate as Track Source - - - - Auto DJ - Auto DJ - - - - Add Crate as Track Source - Add Crate as Track Source - - - - BansheeFeature - - - - Banshee - Banshee - - - - - Error loading Banshee database - Erreur lors du chargement de la base de données de Banshee - - - - Banshee database file not found at - - La base de données banshee n'est pas trouvée à - - - - There was an error loading your Banshee database at - - Une erreur s'est produite lors du chargement de votre base de données Banshee à partir de - - - - - BaseExternalLibraryFeature - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Import as Playlist - - - - - Import as Crate - Importer comme bac - - - - Crate Creation Failed - Crate Creation Failed - - - - Could not create crate, it most likely already exists: - Création de bac impossible, il existe probablement déjà : - - - - Playlist Creation Failed - La création de la liste de lecture a échoué - - - - An unknown error occurred while creating playlist: - Une erreur inconnue s'est produite lors de la création de la playlist: - - - - BasePlaylistFeature - - - New Playlist - Nouvelle playlist - - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - - Create New Playlist - Créer une nouvelle playlist - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Remove - Supprimer - - - - Rename - Renommer - - - - Lock - Verrouiller - - - - Duplicate - Dupliquer - - - - - Import Playlist - Importer une liste de lecture - - - - Export Track Files - Exporter les fichiers des pistes - - - - Analyze entire Playlist - Analyser l'entièreté de la playlist - - - - Enter new name for playlist: - Entrer le nouveau nom de la liste de lecture : - - - - Duplicate Playlist - Dupliquer la liste de lecture - - - - - Enter name for new playlist: - Entrez un nom pour la nouvelle playlist - - - - - Export Playlist - Exporter la liste de lecture - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Rename Playlist - Renommer la liste de lecture - - - - - Renaming Playlist Failed - Echec pour renommer la playlist - - - - - - A playlist by that name already exists. - Une liste de lecture du même nom exise déjà - - - - - - A playlist cannot have a blank name. - Une liste de lecture ne peut pas être sans nom. - - - - _copy - //: - Appendix to default name when duplicating a playlist - _copie - - - - - - - - - Playlist Creation Failed - La création de la liste de lecture a échoué - - - - - An unknown error occurred while creating playlist: - Une erreur inconnue s'est produite lors de la création de la playlist: - - - - Confirm Deletion - Confirmer la suppression - - - - Do you really want to delete playlist <b>%1</b>? - Voulez-vous vraiment supprimer la liste de lecture %1? - - - - M3U Playlist (*.m3u) - M3U Playlist (*.m3u) - - - - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Texte CSV (*.csv);;Texte lisible (*.txt) - - - - BaseSqlTableModel - - - # - # - - - - Timestamp - Horodatage - - - - BaseTrackPlayerImpl - - - Couldn't load track. - Impossible de charger la piste. - - - - BaseTrackTableModel - - - Album - Album - - - - Album Artist - Artiste de l'album - - - - Artist - Artiste - - - - Bitrate - Débit - - - - BPM - BPM - - - - Channels - Channels - - - - Color - Color - - - - Comment - Commentaire - - - - Composer - Compositeur - - - - Cover Art - Couverture - - - - Date Added - Ajouté au : - - - - Last Played - Last Played - - - - Duration - Durée - - - - Type - Type - - - - Genre - Genre - - - - Grouping - Regroupement - - - - Key - Clé - - - - Location - Emplacement - - - - Preview - Aperçu - - - - Rating - Note - - - - ReplayGain - ReplayGain - - - - Samplerate - Samplerate - - - - Played - Joué - - - - Title - Titre - - - - Track # - Piste n° - - - - Year - Année - - - - Fetching image ... - Tooltip text on the cover art column shown when the cover is read from disk - - - - - BroadcastManager - - - Action failed - Échec de l'action - - - - Please enable at least one connection to use Live Broadcasting. - Veuillez activer au moins une connexion pour utiliser la diffusion en direct. - - - - BroadcastProfile - - - Can't use secure password storage: keychain access failed. - Impossible d'utiliser le stockage de mot de passe sécurisé: échec d'accès au trousseau. - - - - Secure password retrieval unsuccessful: keychain access failed. - La récupération de mot de passe sécurisé a échoué: échec d'accès au trousseau. - - - - Settings error - Erreur de paramétrage - - - - <b>Error with settings for '%1':</b><br> - <b>Erreur avec les paramètres de'%1':</b><br> - - - - BroadcastSettingsModel - - - Enabled - Activé - - - - Name - Nom - - - - Status - État - - - - Disconnected - Déconnecté - - - - Connecting... - Connction... - - - - Connected - Connecté - - - - Failed - Echec - - - - Unknown - Inconnu(e) - - - - BrowseFeature - - - Add to Quick Links - Ajouter aux Raccourcis Rapides - - - - Remove from Quick Links - Enlever des liens rapides - - - - Add to Library - Ajouter à la bibliothèque - - - - Quick Links - Quick Links - - - - - Devices - Devices - - - - Removable Devices - Removable Devices - - - - - Computer - Computer - - - - Music Directory Added - Music Directory Added - - - - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - - - - Scan - Scan - - - - "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. - "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. - - - - BrowseTableModel - - - Preview - Aperçu - - - - Filename - Filename - - - - Artist - Artiste - - - - Title - Titre - - - - Album - Album - - - - Track # - Piste n° - - - - Year - Année - - - - Genre - Genre - - - - Composer - Compositeur - - - - Comment - Commentaire - - - - Duration - Durée - - - - BPM - BPM - - - - Key - Clé - - - - Type - Type - - - - Bitrate - Débit - - - - ReplayGain - ReplayGain - - - - Location - Emplacement - - - - Album Artist - Artiste de l'album - - - - Grouping - Regroupement - - - - File Modified - File Modified - - - - File Created - File Created - - - - Mixxx Library - Mixxx Library - - - - Could not load the following file because it is in use by Mixxx or another application. - Could not load the following file because it is in use by Mixxx or another application. - - - - BulkController - - - USB Controller - USB Controller - - - - CachingReaderWorker - - - The file '%1' could not be found. - The file '%1' could not be found. - - - - The file '%1' could not be loaded. - The file '%1' could not be loaded. - - - - The file '%1' is empty and could not be loaded. - The file '%1' is empty and could not be loaded. - - - - CmdlineArgs - - - Mixxx is an open source DJ software. For more information, see: - Mixxx is an open source DJ software. For more information, see: - - - - Starts Mixxx in full-screen mode - Starts Mixxx in full-screen mode - - - - Use a custom locale for loading translations. (e.g 'fr') - Use a custom locale for loading translations. (e.g 'fr') - - - - Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - Top-level directory where Mixxx should look for its resource files such as MIDI mappings, overriding the default installation location. - - - - Path the debug statistics time line is written to - Path the debug statistics time line is written to - - - - Causes Mixxx to display/log all of the controller data it receives and script functions it loads - Causes Mixxx to display/log all of the controller data it receives and script functions it loads - - - - The controller mapping will issue more aggressive warnings and errors when detecting misuse of controller APIs. New Controller Mappings should be developed with this option enabled! - Le mappage du contrôleur émettra des avertissements et des erreurs plus agressifs lors de la détection d'une utilisation abusive des API du contrôleur. Les nouveaux mappages de contrôleur devraient être développés avec cette option activée ! - - - - Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - Enables developer-mode. Includes extra log info, stats on performance, and a Developer tools menu. - - - - Top-level directory where Mixxx should look for settings. Default is: - Répertoire racine où Mixxx doit chercher les paramètres. -La valeur par défaut est: - - - - Use legacy vu meter - Utiliser le vu-mètre historique - - - - Use legacy spinny - - - - - Loads experimental QML GUI instead of legacy QWidget skin - Loads experimental QML GUI instead of legacy QWidget skin - - - - Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - Enables safe-mode. Disables OpenGL waveforms, and spinning vinyl widgets. Try this option if Mixxx is crashing on startup. - - - - [auto|always|never] Use colors on the console output. - [auto|always|never] Use colors on the console output. - - - - Sets the verbosity of command line logging. -critical - Critical/Fatal only -warning - Above + Warnings -info - Above + Informational messages -debug - Above + Debug/Developer messages -trace - Above + Profiling messages - Sets the verbosity of command line logging. -critical - Critical/Fatal only -warning - Above + Warnings -info - Above + Informational messages -debug - Above + Debug/Developer messages -trace - Above + Profiling messages - - - - Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - Sets the the logging level at which the log buffer is flushed to mixxx.log. <level> is one of the values defined at --log-level above. - - - - Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - Breaks (SIGINT) Mixxx, if a DEBUG_ASSERT evaluates to false. Under a debugger you can continue afterwards. - - - - Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - Load the specified music file(s) at start-up. Each file you specify will be loaded into the next virtual deck. - - - - ColorPaletteEditor - - - Remove Color - Remove Color - - - - Add Color - Add Color - - - - Name - Nom - - - - - Remove Palette - Remove Palette - - - - Color - Color - - - - Assign to Hotcue Number - Assign to Hotcue Number - - - - Edited - Edited - - - - Do you really want to remove the palette permanently? - Do you really want to remove the palette permanently? - - - - ControlDelegate - - - No control chosen. - No control chosen. - - - - ControlModel - - - Group - Group - - - - Item - Item - - - - Value - Value - - - - Parameter - Parameter - - - - Title - Titre - - - - Description - Description - - - - ControlPickerMenu - - - Headphone Output - Headphone Output - - - - - - Deck %1 - Deck %1 - - - - Sampler %1 - Sampler %1 - - - - Preview Deck %1 - Preview Deck %1 - - - - Microphone %1 - Microphone %1 - - - - Auxiliary %1 - Auxiliary %1 - - - - Reset to default - Reset to default - - - - Effect Rack %1 - Effect Rack %1 - - - - Parameter %1 - Parameter %1 - - - - Mixer - Mixer - - - - - Crossfader - Crossfader - - - - Headphone mix (pre/main) - Headphone mix (pre/main) - - - - Toggle headphone split cueing - Toggle headphone split cueing - - - - Headphone delay - Headphone delay - - - - Transport - Transport - - - - Strip-search through track - Strip-search through track - - - - Play button - Play button - - - - - Set to full volume - Set to full volume - - - - - Set to zero volume - Set to zero volume - - - - Stop button - Stop button - - - - Jump to start of track and play - Jump to start of track and play - - - - Jump to end of track - Jump to end of track - - - - Reverse roll (Censor) button - Reverse roll (Censor) button - - - - Headphone listen button - Headphone listen button - - - - - Mute button - Mute button - - - - Toggle repeat mode - Toggle repeat mode - - - - - Mix orientation (e.g. left, right, center) - Mix orientation (e.g. left, right, center) - - - - - Set mix orientation to left - Set mix orientation to left - - - - - Set mix orientation to center - Set mix orientation to center - - - - - Set mix orientation to right - Set mix orientation to right - - - - Toggle slip mode - Toggle slip mode - - - - BPM - BPM - - - - Increase BPM by 1 - Increase BPM by 1 - - - - Decrease BPM by 1 - Decrease BPM by 1 - - - - Increase BPM by 0.1 - Increase BPM by 0.1 - - - - Decrease BPM by 0.1 - Decrease BPM by 0.1 - - - - BPM tap button - BPM tap button - - - - Toggle quantize mode - Toggle quantize mode - - - - One-time beat sync (tempo only) - One-time beat sync (tempo only) - - - - One-time beat sync (phase only) - One-time beat sync (phase only) - - - - Toggle keylock mode - Toggle keylock mode - - - - Equalizers - Equalizers - - - - Vinyl Control - Vinyl Control - - - - Toggle vinyl-control cueing mode (OFF/ONE/HOT) - Toggle vinyl-control cueing mode (OFF/ONE/HOT) - - - - Toggle vinyl-control mode (ABS/REL/CONST) - Toggle vinyl-control mode (ABS/REL/CONST) - - - - Pass through external audio into the internal mixer - Pass through external audio into the internal mixer - - - - Cues - Cues - - - - Cue button - Cue button - - - - Set cue point - Set cue point - - - - Go to cue point - Go to cue point - - - - Go to cue point and play - Go to cue point and play - - - - Go to cue point and stop - Go to cue point and stop - - - - Preview from cue point - Preview from cue point - - - - Cue button (CDJ mode) - Cue button (CDJ mode) - - - - Stutter cue - Stutter cue - - - - Hotcues - Points de repère - - - - Set, preview from or jump to hotcue %1 - Set, preview from or jump to hotcue %1 - - - - Clear hotcue %1 - Clear hotcue %1 - - - - Set hotcue %1 - Set hotcue %1 - - - - Jump to hotcue %1 - Jump to hotcue %1 - - - - Jump to hotcue %1 and stop - Jump to hotcue %1 and stop - - - - Jump to hotcue %1 and play - Jump to hotcue %1 and play - - - - Preview from hotcue %1 - Preview from hotcue %1 - - - - - Hotcue %1 - Hotcue %1 - - - - Looping - Looping - - - - Loop In button - Loop In button - - - - Loop Out button - Loop Out button - - - - Loop Exit button - Loop Exit button - - - - 1/2 - 1/2 - - - - 1 - 1 - - - - 2 - 2 - - - - 4 - 4 - - - - 8 - 8 - - - - 16 - 16 - - - - 32 - 32 - - - - 64 - 64 - - - - Move loop forward by %1 beats - Move loop forward by %1 beats - - - - Move loop backward by %1 beats - Move loop backward by %1 beats - - - - Create %1-beat loop - Create %1-beat loop - - - - Create temporary %1-beat loop roll - Create temporary %1-beat loop roll - - - - Library - Library - - - - Slot %1 - Slot %1 - - - - Headphone Mix - Headphone Mix - - - - Headphone Split Cue - Headphone Split Cue - - - - Headphone Delay - Headphone Delay - - - - Play - Play - - - - Fast Rewind - Fast Rewind - - - - Fast Rewind button - Fast Rewind button - - - - Fast Forward - Fast Forward - - - - Fast Forward button - Fast Forward button - - - - Strip Search - Strip Search - - - - Play Reverse - Play Reverse - - - - Play Reverse button - Play Reverse button - - - - Reverse Roll (Censor) - Reverse Roll (Censor) - - - - Jump To Start - Jump To Start - - - - Jumps to start of track - Jumps to start of track - - - - Play From Start - Play From Start - - - - Stop - Stop - - - - Stop And Jump To Start - Stop And Jump To Start - - - - Stop playback and jump to start of track - Stop playback and jump to start of track - - - - Jump To End - Jump To End - - - - Volume - Volume - - - - - - Volume Fader - Volume Fader - - - - - Full Volume - Full Volume - - - - - Zero Volume - Zero Volume - - - - Track Gain - Track Gain - - - - Track Gain knob - Track Gain knob - - - - - Mute - Mute - - - - Eject - Eject - - - - - Headphone Listen - Headphone Listen - - - - Headphone listen (pfl) button - Headphone listen (pfl) button - - - - Repeat Mode - Repeat Mode - - - - Slip Mode - Slip Mode - - - - - Orientation - Orientation - - - - - Orient Left - Orient Left - - - - - Orient Center - Orient Center - - - - - Orient Right - Orient Right - - - - BPM +1 - BPM +1 - - - - BPM -1 - BPM -1 - - - - BPM +0.1 - BPM +0.1 - - - - BPM -0.1 - BPM -0.1 - - - - BPM Tap - BPM Tap - - - - Adjust Beatgrid Faster +.01 - Adjust Beatgrid Faster +.01 - - - - Increase track's average BPM by 0.01 - Increase track's average BPM by 0.01 - - - - Adjust Beatgrid Slower -.01 - Adjust Beatgrid Slower -.01 - - - - Decrease track's average BPM by 0.01 - Decrease track's average BPM by 0.01 - - - - Move Beatgrid Earlier - Move Beatgrid Earlier - - - - Adjust the beatgrid to the left - Adjust the beatgrid to the left - - - - Move Beatgrid Later - Move Beatgrid Later - - - - Adjust the beatgrid to the right - Adjust the beatgrid to the right - - - - Adjust Beatgrid - Adjust Beatgrid - - - - Align beatgrid to current position - Align beatgrid to current position - - - - Adjust Beatgrid - Match Alignment - Adjust Beatgrid - Match Alignment - - - - Adjust beatgrid to match another playing deck. - Adjust beatgrid to match another playing deck. - - - - Quantize Mode - Quantize Mode - - - - Sync - Sync - - - - Beat Sync One-Shot - Beat Sync One-Shot - - - - Sync Tempo One-Shot - Sync Tempo One-Shot - - - - Sync Phase One-Shot - Sync Phase One-Shot - - - - Pitch control (does not affect tempo), center is original pitch - Pitch control (does not affect tempo), center is original pitch - - - - Pitch Adjust - Pitch Adjust - - - - Adjust pitch from speed slider pitch - Adjust pitch from speed slider pitch - - - - Match musical key - Match musical key - - - - Match Key - Match Key - - - - Reset Key - Reset Key - - - - Resets key to original - Resets key to original - - - - High EQ - High EQ - - - - Mid EQ - Mid EQ - - - - - Main Output - Main Output - - - - Main Output Balance - Main Output Balance - - - - Main Output Delay - Main Output Delay - - - - Main Output Gain - Main Output Gain - - - - Low EQ - Low EQ - - - - Toggle Vinyl Control - Toggle Vinyl Control - - - - Toggle Vinyl Control (ON/OFF) - Toggle Vinyl Control (ON/OFF) - - - - Vinyl Control Mode - Vinyl Control Mode - - - - Vinyl Control Cueing Mode - Vinyl Control Cueing Mode - - - - Vinyl Control Passthrough - Vinyl Control Passthrough - - - - Vinyl Control Next Deck - Vinyl Control Next Deck - - - - Single deck mode - Switch vinyl control to next deck - Single deck mode - Switch vinyl control to next deck - - - - Cue - Cue - - - - Set Cue - Set Cue - - - - Go-To Cue - Go-To Cue - - - - Go-To Cue And Play - Go-To Cue And Play - - - - Go-To Cue And Stop - Go-To Cue And Stop - - - - Preview Cue - Preview Cue - - - - Cue (CDJ Mode) - Cue (CDJ Mode) - - - - Stutter Cue - Stutter Cue - - - - Go to cue point and play after release - Go to cue point and play after release - - - - Clear Hotcue %1 - Clear Hotcue %1 - - - - Set Hotcue %1 - Set Hotcue %1 - - - - Jump To Hotcue %1 - Jump To Hotcue %1 - - - - Jump To Hotcue %1 And Stop - Jump To Hotcue %1 And Stop - - - - Jump To Hotcue %1 And Play - Jump To Hotcue %1 And Play - - - - Preview Hotcue %1 - Preview Hotcue %1 - - - - Loop In - Loop In - - - - Loop Out - Loop Out - - - - Loop Exit - Loop Exit - - - - Reloop/Exit Loop - Reloop/Exit Loop - - - - Loop Halve - Loop Halve - - - - Loop Double - Loop Double - - - - 1/32 - 1/32 - - - - 1/16 - 1/16 - - - - 1/8 - 1/8 - - - - 1/4 - 1/4 - - - - Move Loop +%1 Beats - Move Loop +%1 Beats - - - - Move Loop -%1 Beats - Move Loop -%1 Beats - - - - Loop %1 Beats - Loop %1 Beats - - - - Loop Roll %1 Beats - Loop Roll %1 Beats - - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - Append the selected track to the Auto DJ Queue - Append the selected track to the Auto DJ Queue - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Prepend selected track to the Auto DJ Queue - Prepend selected track to the Auto DJ Queue - - - - Load Track - Load Track - - - - Load selected track - Load selected track - - - - Load selected track and play - Load selected track and play - - - - - Record Mix - Record Mix - - - - Toggle mix recording - Toggle mix recording - - - - Effects - Effets - - - - Quick Effects - Quick Effects - - - - Deck %1 Quick Effect Super Knob - Deck %1 Quick Effect Super Knob - - - - Quick Effect Super Knob (control linked effect parameters) - Quick Effect Super Knob (control linked effect parameters) - - - - - Quick Effect - Quick Effect - - - - Clear Unit - Clear Unit - - - - Clear effect unit - Clear effect unit - - - - Toggle Unit - Toggle Unit - - - - Dry/Wet - Dry/Wet - - - - Adjust the balance between the original (dry) and processed (wet) signal. - Adjust the balance between the original (dry) and processed (wet) signal. - - - - Super Knob - Super Knob - - - - Next Chain - Next Chain - - - - Assign - Assign - - - - Clear - Clear - - - - Clear the current effect - Clear the current effect - - - - Toggle - Toggle - - - - Toggle the current effect - Toggle the current effect - - - - Next - Next - - - - Switch to next effect - Switch to next effect - - - - Previous - Previous - - - - Switch to the previous effect - Switch to the previous effect - - - - Next or Previous - Next or Previous - - - - Switch to either next or previous effect - Switch to either next or previous effect - - - - - Parameter Value - Parameter Value - - - - - Microphone Ducking Strength - Microphone Ducking Strength - - - - Microphone Ducking Mode - Microphone Ducking Mode - - - - Gain - Gain - - - - Gain knob - Gain knob - - - - Shuffle the content of the Auto DJ queue - Shuffle the content of the Auto DJ queue - - - - Skip the next track in the Auto DJ queue - Skip the next track in the Auto DJ queue - - - - Auto DJ Toggle - Auto DJ Toggle - - - - Toggle Auto DJ On/Off - Toggle Auto DJ On/Off - - - - Microphone & Auxiliary Show/Hide - Microphone & Auxiliary Show/Hide - - - - Show/hide the microphone & auxiliary section - Show/hide the microphone & auxiliary section - - - - 4 Effect Units Show/Hide - 4 Effect Units Show/Hide - - - - Switches between showing 2 and 4 effect units - Switches between showing 2 and 4 effect units - - - - Mixer Show/Hide - Mixer Show/Hide - - - - Show or hide the mixer. - Show or hide the mixer. - - - - Cover Art Show/Hide (Library) - Cover Art Show/Hide (Library) - - - - Show/hide cover art in the library - Show/hide cover art in the library - - - - Library Maximize/Restore - Library Maximize/Restore - - - - Maximize the track library to take up all the available screen space. - Maximize the track library to take up all the available screen space. - - - - Effect Rack Show/Hide - Effect Rack Show/Hide - - - - Show/hide the effect rack - Show/hide the effect rack - - - - Waveform Zoom Out - Waveform Zoom Out - - - - Headphone Gain - Headphone Gain - - - - Headphone gain - Headphone gain - - - - Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - - - - One-time beat sync tempo (and phase with quantize enabled) - One-time beat sync tempo (and phase with quantize enabled) - - - - Playback Speed - Playback Speed - - - - Playback speed control (Vinyl "Pitch" slider) - Playback speed control (Vinyl "Pitch" slider) - - - - Pitch (Musical key) - Pitch (Musical key) - - - - Increase Speed - Increase Speed - - - - Adjust speed faster (coarse) - Adjust speed faster (coarse) - - - - Increase Speed (Fine) - Increase Speed (Fine) - - - - Adjust speed faster (fine) - Adjust speed faster (fine) - - - - Decrease Speed - Decrease Speed - - - - Adjust speed slower (coarse) - Adjust speed slower (coarse) - - - - Adjust speed slower (fine) - Adjust speed slower (fine) - - - - Temporarily Increase Speed - Temporarily Increase Speed - - - - Temporarily increase speed (coarse) - Temporarily increase speed (coarse) - - - - Temporarily Increase Speed (Fine) - Temporarily Increase Speed (Fine) - - - - Temporarily increase speed (fine) - Temporarily increase speed (fine) - - - - Temporarily Decrease Speed - Temporarily Decrease Speed - - - - Temporarily decrease speed (coarse) - Temporarily decrease speed (coarse) - - - - Temporarily Decrease Speed (Fine) - Temporarily Decrease Speed (Fine) - - - - Temporarily decrease speed (fine) - Temporarily decrease speed (fine) - - - - - Adjust %1 - Adjust %1 - - - - Effect Unit %1 - Effect Unit %1 - - - - Button Parameter %1 - Button Parameter %1 - - - - Skin - Skin - - - - Controller - Contrôleur - - - - Crossfader / Orientation - Crossfader / Orientation - - - - Main Output gain - Main Output gain - - - - Main Output balance - Main Output balance - - - - Main Output delay - Main Output delay - - - - Headphone - Headphone - - - - - Kill %1 - Kill %1 - - - - Eject or un-eject track, i.e. reload the last-ejected track (of any deck)<br>Double-press to reload the last replaced track. In empty decks it reloads the second-last ejected track. - - - - - BPM / Beatgrid - BPM / Beatgrid - - - - Move Beatgrid - - - - - Adjust the beatgrid to the left or right - - - - - Sync / Sync Lock - Sync / Sync Lock - - - - Internal Sync Leader - Internal Sync Leader - - - - Toggle Internal Sync Leader - Toggle Internal Sync Leader - - - - - Internal Leader BPM - Internal Leader BPM - - - - Internal Leader BPM +1 - Internal Leader BPM +1 - - - - Increase internal Leader BPM by 1 - Increase internal Leader BPM by 1 - - - - Internal Leader BPM -1 - Internal Leader BPM -1 - - - - Decrease internal Leader BPM by 1 - Decrease internal Leader BPM by 1 - - - - Internal Leader BPM +0.1 - Internal Leader BPM +0.1 - - - - Increase internal Leader BPM by 0.1 - Increase internal Leader BPM by 0.1 - - - - Internal Leader BPM -0.1 - Internal Leader BPM -0.1 - - - - Decrease internal Leader BPM by 0.1 - Decrease internal Leader BPM by 0.1 - - - - Sync Leader - Sync Leader - - - - Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - Sync mode 3-state toggle / indicator (Off, Soft Leader, Explicit Leader) - - - - Speed - Speed - - - - Decrease Speed (Fine) - Diminuer la vitesse (Fin) - - - - Pitch (Musical Key) - Pitch (Musical Key) - - - - Increase Pitch - Increase Pitch - - - - Increases the pitch by one semitone - Increases the pitch by one semitone - - - - Increase Pitch (Fine) - Increase Pitch (Fine) - - - - Increases the pitch by 10 cents - Increases the pitch by 10 cents - - - - Decrease Pitch - Decrease Pitch - - - - Decreases the pitch by one semitone - Decreases the pitch by one semitone - - - - Decrease Pitch (Fine) - Decrease Pitch (Fine) - - - - Decreases the pitch by 10 cents - Decreases the pitch by 10 cents - - - - Keylock - Keylock - - - - CUP (Cue + Play) - CUP (Cue + Play) - - - - Shift cue points earlier - Shift cue points earlier - - - - Shift cue points 10 milliseconds earlier - Shift cue points 10 milliseconds earlier - - - - Shift cue points earlier (fine) - Shift cue points earlier (fine) - - - - Shift cue points 1 millisecond earlier - Shift cue points 1 millisecond earlier - - - - Shift cue points later - Shift cue points later - - - - Shift cue points 10 milliseconds later - Shift cue points 10 milliseconds later - - - - Shift cue points later (fine) - Shift cue points later (fine) - - - - Shift cue points 1 millisecond later - Shift cue points 1 millisecond later - - - - Hotcues %1-%2 - Hotcues %1-%2 - - - - Intro / Outro Markers - Intro / Outro Markers - - - - Intro Start Marker - Intro Start Marker - - - - Intro End Marker - Intro End Marker - - - - Outro Start Marker - Outro Start Marker - - - - Outro End Marker - Outro End Marker - - - - intro start marker - intro start marker - - - - intro end marker - intro end marker - - - - outro start marker - outro start marker - - - - outro end marker - outro end marker - - - - Activate %1 - [intro/outro marker - Activate %1 - - - - Jump to or set the %1 - [intro/outro marker - Jump to or set the %1 - - - - Set %1 - [intro/outro marker - Set %1 - - - - Set or jump to the %1 - [intro/outro marker - Set or jump to the %1 - - - - Clear %1 - [intro/outro marker - Clear %1 - - - - Clear the %1 - [intro/outro marker - Clear the %1 - - - - Loop Selected Beats - Loop Selected Beats - - - - Create a beat loop of selected beat size - Create a beat loop of selected beat size - - - - Loop Roll Selected Beats - Loop Roll Selected Beats - - - - Create a rolling beat loop of selected beat size - Create a rolling beat loop of selected beat size - - - - Loop Beats - Loop Beats - - - - Loop Roll Beats - Loop Roll Beats - - - - Go To Loop In - Aller à l'entrée de boucle - - - - Go to Loop In button - Aller au bouton Entrée de Boucle - - - - Go To Loop Out - Aller à la Fin de Boucle - - - - Go to Loop Out button - Aller au bouton Fin de Boucle - - - - Toggle loop on/off and jump to Loop In point if loop is behind play position - Toggle loop on/off and jump to Loop In point if loop is behind play position - - - - Reloop And Stop - Reloop And Stop - - - - Enable loop, jump to Loop In point, and stop - Enable loop, jump to Loop In point, and stop - - - - Halve the loop length - Halve the loop length - - - - Double the loop length - Double the loop length - - - - Beat Jump / Loop Move - Beat Jump / Loop Move - - - - Jump / Move Loop Forward %1 Beats - Jump / Move Loop Forward %1 Beats - - - - Jump / Move Loop Backward %1 Beats - Jump / Move Loop Backward %1 Beats - - - - Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - - - - Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - - - - Beat Jump / Loop Move Forward Selected Beats - Beat Jump / Loop Move Forward Selected Beats - - - - Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - - - - Beat Jump / Loop Move Backward Selected Beats - Beat Jump / Loop Move Backward Selected Beats - - - - Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - - - - Beat Jump / Loop Move Forward - Beat Jump / Loop Move Forward - - - - Beat Jump / Loop Move Backward - Beat Jump / Loop Move Backward - - - - Loop Move Forward - Loop Move Forward - - - - Loop Move Backward - Loop Move Backward - - - - Remove Temporary Loop - - - - - Remove the temporary loop - - - - - Navigation - Navigation - - - - Move up - Move up - - - - Equivalent to pressing the UP key on the keyboard - Equivalent to pressing the UP key on the keyboard - - - - Move down - Move down - - - - Equivalent to pressing the DOWN key on the keyboard - Equivalent to pressing the DOWN key on the keyboard - - - - Move up/down - Move up/down - - - - Move vertically in either direction using a knob, as if pressing UP/DOWN keys - Move vertically in either direction using a knob, as if pressing UP/DOWN keys - - - - Scroll Up - Scroll Up - - - - Equivalent to pressing the PAGE UP key on the keyboard - Equivalent to pressing the PAGE UP key on the keyboard - - - - Scroll Down - Scroll Down - - - - Equivalent to pressing the PAGE DOWN key on the keyboard - Equivalent to pressing the PAGE DOWN key on the keyboard - - - - Scroll up/down - Scroll up/down - - - - Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - - - - Move left - Move left - - - - Equivalent to pressing the LEFT key on the keyboard - Equivalent to pressing the LEFT key on the keyboard - - - - Move right - Move right - - - - Equivalent to pressing the RIGHT key on the keyboard - Equivalent to pressing the RIGHT key on the keyboard - - - - Move left/right - Move left/right - - - - Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - - - - Move focus to right pane - Move focus to right pane - - - - Equivalent to pressing the TAB key on the keyboard - Equivalent to pressing the TAB key on the keyboard - - - - Move focus to left pane - Move focus to left pane - - - - Equivalent to pressing the SHIFT+TAB key on the keyboard - Equivalent to pressing the SHIFT+TAB key on the keyboard - - - - Move focus to right/left pane - Move focus to right/left pane - - - - Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - - - - Sort focused column - Trier la colonne sélectionnée - - - - Sort the column of the cell that is currently focused, equivalent to clicking on its header - Trier la colonne contenant la cellule sélectionnée, équivaut à cliquer sur l'en-tête - - - - Go to the currently selected item - Go to the currently selected item - - - - Choose the currently selected item and advance forward one pane if appropriate - Choose the currently selected item and advance forward one pane if appropriate - - - - Load Track and Play - Load Track and Play - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Replace Auto DJ Queue with selected tracks - Replace Auto DJ Queue with selected tracks - - - - Select next search history - Select next search history - - - - Selects the next search history entry - Selects the next search history entry - - - - Select previous search history - Select previous search history - - - - Selects the previous search history entry - Selects the previous search history entry - - - - Move selected search entry - Move selected search entry - - - - Moves the selected search history item into given direction and steps - Moves the selected search history item into given direction and steps - - - - Clear search - Clear search - - - - Clears the search query - Clears the search query - - - - Deck %1 Quick Effect Enable Button - Deck %1 Quick Effect Enable Button - - - - Quick Effect Enable Button - Quick Effect Enable Button - - - - Enable or disable effect processing - Enable or disable effect processing - - - - Super Knob (control effects' Meta Knobs) - Super Knob (control effects' Meta Knobs) - - - - Mix Mode Toggle - Mix Mode Toggle - - - - Toggle effect unit between D/W and D+W modes - Toggle effect unit between D/W and D+W modes - - - - Next chain preset - Next chain preset - - - - Previous Chain - Previous Chain - - - - Previous chain preset - Previous chain preset - - - - Next/Previous Chain - Next/Previous Chain - - - - Next or previous chain preset - Next or previous chain preset - - - - - Show Effect Parameters - Show Effect Parameters - - - - Effect Unit Assignment - Effect Unit Assignment - - - - Meta Knob - Meta Knob - - - - Effect Meta Knob (control linked effect parameters) - Effect Meta Knob (control linked effect parameters) - - - - Meta Knob Mode - Meta Knob Mode - - - - Set how linked effect parameters change when turning the Meta Knob. - Set how linked effect parameters change when turning the Meta Knob. - - - - Meta Knob Mode Invert - Meta Knob Mode Invert - - - - Invert how linked effect parameters change when turning the Meta Knob. - Invert how linked effect parameters change when turning the Meta Knob. - - - - - Button Parameter Value - Button Parameter Value - - - - Microphone / Auxiliary - Microphone / Auxiliary - - - - Microphone On/Off - Microphone On/Off - - - - Microphone on/off - Microphone on/off - - - - Toggle microphone ducking mode (OFF, AUTO, MANUAL) - Toggle microphone ducking mode (OFF, AUTO, MANUAL) - - - - Auxiliary On/Off - Auxiliary On/Off - - - - Auxiliary on/off - Auxiliary on/off - - - - Auto DJ - Auto DJ - - - - Auto DJ Shuffle - Auto DJ Shuffle - - - - Auto DJ Skip Next - Auto DJ Skip Next - - - - Auto DJ Add Random Track - Auto DJ Add Random Track - - - - Add a random track to the Auto DJ queue - Add a random track to the Auto DJ queue - - - - Auto DJ Fade To Next - Auto DJ Fade To Next - - - - Trigger the transition to the next track - Trigger the transition to the next track - - - - User Interface - User Interface - - - - Samplers Show/Hide - Samplers Show/Hide - - - - Show/hide the sampler section - Show/hide the sampler section - - - - Waveform Zoom Reset To Default - - - - - Reset the waveform zoom level to the default value selected in Preferences -> Waveforms - - - - - Start/Stop Live Broadcasting - Start/Stop Live Broadcasting - - - - Stream your mix over the Internet. - Stream your mix over the Internet. - - - - Start/stop recording your mix. - Start/stop recording your mix. - - - - - Samplers - Samplers - - - - Vinyl Control Show/Hide - Vinyl Control Show/Hide - - - - Show/hide the vinyl control section - Show/hide the vinyl control section - - - - Preview Deck Show/Hide - Preview Deck Show/Hide - - - - Show/hide the preview deck - Show/hide the preview deck - - - - Toggle 4 Decks - Toggle 4 Decks - - - - Switches between showing 2 decks and 4 decks. - Switches between showing 2 decks and 4 decks. - - - - Cover Art Show/Hide (Decks) - Cover Art Show/Hide (Decks) - - - - Show/hide cover art in the main decks - Show/hide cover art in the main decks - - - - Vinyl Spinner Show/Hide - Vinyl Spinner Show/Hide - - - - Show/hide spinning vinyl widget - Show/hide spinning vinyl widget - - - - Vinyl Spinners Show/Hide (All Decks) - Vinyl Spinners Show/Hide (All Decks) - - - - Show/Hide all spinnies - Show/Hide all spinnies - - - - Toggle Waveforms - Toggle Waveforms - - - - Show/hide the scrolling waveforms. - Show/hide the scrolling waveforms. - - - - Waveform zoom - Waveform zoom - - - - Waveform Zoom - Waveform Zoom - - - - Zoom waveform in - Zoom waveform in - - - - Waveform Zoom In - Waveform Zoom In - - - - Zoom waveform out - Zoom waveform out - - - - Star Rating Up - Star Rating Up - - - - Increase the track rating by one star - Increase the track rating by one star - - - - Star Rating Down - Star Rating Down - - - - Decrease the track rating by one star - Decrease the track rating by one star - - - - ControllerInputMappingTableModel - - - Channel - Channel - - - - Opcode - Opcode - - - - Control - Control - - - - Options - Options - - - - Action - Action - - - - Comment - Commentaire - - - - ControllerOutputMappingTableModel - - - Channel - Channel - - - - Opcode - Opcode - - - - Control - Control - - - - On Value - On Value - - - - Off Value - Off Value - - - - Action - Action - - - - On Range Min - On Range Min - - - - On Range Max - On Range Max - - - - Comment - Commentaire - - - - ControllerScriptEngineBase - - - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - - - - You can ignore this error for this session but you may experience erratic behavior. - You can ignore this error for this session but you may experience erratic behavior. - - - - Try to recover by resetting your controller. - Try to recover by resetting your controller. - - - - Controller Mapping Error - Controller Mapping Error - - - - The mapping for your controller "%1" is not working properly. - The mapping for your controller "%1" is not working properly. - - - - The script code needs to be fixed. - The script code needs to be fixed. - - - - ControllerScriptEngineLegacy - - - Controller Mapping File Problem - Controller Mapping File Problem - - - - The mapping for controller "%1" cannot be opened. - The mapping for controller "%1" cannot be opened. - - - - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - The functionality provided by this controller mapping will be disabled until the issue has been resolved. - - - - File: - File: - - - - Error: - Error: - - - - CoverArtCopyWorker - - - Error while copying the cover art to: %1 - Une erreur est survenue lors de la copie de la pochette d'album vers: %1 - - - - CrateFeature - - - Remove - Supprimer - - - - - Create New Crate - Create New Crate - - - - Rename - Renommer - - - - - Lock - Verrouiller - - - - Export Crate as Playlist - Export Crate as Playlist - - - - Export Track Files - Exporter les fichiers des pistes - - - - Duplicate - Dupliquer - - - - Analyze entire Crate - Analyze entire Crate - - - - Auto DJ Track Source - Auto DJ Track Source - - - - Enter new name for crate: - Enter new name for crate: - - - - - Crates - Caisses - - - - - Import Crate - Import Crate - - - - Export Crate - Export Crate - - - - Unlock - Unlock - - - - An unknown error occurred while creating crate: - An unknown error occurred while creating crate: - - - - Rename Crate - Rename Crate - - - - - Export to Engine Prime - Export to Engine Prime - - - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested tracks. - - - - Confirm Deletion - Confirmer la suppression - - - - - Renaming Crate Failed - Renaming Crate Failed - - - - Crate Creation Failed - Crate Creation Failed - - - - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Texte CSV (*.csv);;Texte lisible (*.txt) - - - - M3U Playlist (*.m3u) - M3U Playlist (*.m3u) - - - - Crates are a great way to help organize the music you want to DJ with. - Crates are a great way to help organize the music you want to DJ with. - - - - Crates let you organize your music however you'd like! - Crates let you organize your music however you'd like! - - - - Do you really want to delete crate <b>%1</b>? - Voulez-vous vraiment supprimer le bac %1? - - - - A crate cannot have a blank name. - A crate cannot have a blank name. - - - - A crate by that name already exists. - A crate by that name already exists. - - - - CrateFeatureHelper - - - New Crate - New Crate - - - - Create New Crate - Create New Crate - - - - - Enter name for new crate: - Enter name for new crate: - - - - - - Creating Crate Failed - Creating Crate Failed - - - - - A crate cannot have a blank name. - A crate cannot have a blank name. - - - - - A crate by that name already exists. - A crate by that name already exists. - - - - - An unknown error occurred while creating crate: - An unknown error occurred while creating crate: - - - - copy - //: - copy - - - - Duplicate Crate - Duplicate Crate - - - - - - Duplicating Crate Failed - Duplicating Crate Failed - - - - DlgAbout - - - Mixxx %1.%2 Development Team - Mixxx %1.%2 Development Team - - - - With contributions from: - Avec des contributions de : - - - - And special thanks to: - Et remerciements particuliers à: - - - - Past Developers - Anciens développeurs - - - - Past Contributors - Anciens contributeurs - - - - Official Website - Official Website - - - - Donate - Donate - - - - DlgAboutDlg - - - About Mixxx - à propos de Mixxx - - - - - - - Unknown - Inconnu(e) - - - - Date: - Date: - - - - Git Version: - Git Version: - - - - Qt Version: - - - - - Platform: - Platform: - - - - Credits - Crédits - - - - License - License - - - - DlgAnalysis - - - - - Analyze - Analyse - - - - Shows tracks added to the library within the last 7 days. - Shows tracks added to the library within the last 7 days. - - - - New - New - - - - Shows all tracks in the library. - Shows all tracks in the library. - - - - All - All - - - - Progress - Progress - - - - Selects all tracks in the table below. - Selects all tracks in the table below. - - - - Select All - Select All - - - - Runs beatgrid, key, and ReplayGain detection on the selected tracks. Does not generate waveforms for the selected tracks to save disk space. - Runs beatgrid, key, and ReplayGain detection on the selected tracks. Does not generate waveforms for the selected tracks to save disk space. - - - - Stop Analysis - Stop Analysis - - - - Analyzing %1% %2/%3 - Analyzing %1% %2/%3 - - - - Analyzing %1/%2 - Analyzing %1/%2 - - - - DlgAutoDJ - - - Skip - Skip - - - - Random - Random - - - - Fade - Fade - - - - Enable Auto DJ - -Shortcut: Shift+F12 - Enable Auto DJ - -Shortcut: Shift+F12 - - - - Disable Auto DJ - -Shortcut: Shift+F12 - Disable Auto DJ - -Shortcut: Shift+F12 - - - - Trigger the transition to the next track - -Shortcut: Shift+F11 - Trigger the transition to the next track - -Shortcut: Shift+F11 - - - - Skip the next track in the Auto DJ queue - -Shortcut: Shift+F10 - Skip the next track in the Auto DJ queue - -Shortcut: Shift+F10 - - - - Shuffle the content of the Auto DJ queue - -Shortcut: Shift+F9 - Shuffle the content of the Auto DJ queue - -Shortcut: Shift+F9 - - - - Repeat the playlist - Repeat the playlist - - - - Determines the duration of the transition - Determines the duration of the transition - - - - Seconds - Seconds - - - - Full Intro + Outro - Full Intro + Outro - - - - Fade At Outro Start - Fade At Outro Start - - - - Full Track - Full Track - - - - Skip Silence - Skip Silence - - - - Auto DJ Fade Modes - -Full Intro + Outro: -Play the full intro and outro. Use the intro or outro length as the -crossfade time, whichever is shorter. If no intro or outro are marked, -use the selected crossfade time. - -Fade At Outro Start: -Start crossfading at the outro start. If the outro is longer than the -intro, cut off the end of the outro. Use the intro or outro length as -the crossfade time, whichever is shorter. If no intro or outro are -marked, use the selected crossfade time. - -Full Track: -Play the whole track. Begin crossfading from the selected number of -seconds before the end of the track. A negative crossfade time adds -silence between tracks. - -Skip Silence: -Play the whole track except for silence at the beginning and end. -Begin crossfading from the selected number of seconds before the -last sound. - Auto DJ Fade Modes - -Full Intro + Outro: -Play the full intro and outro. Use the intro or outro length as the -crossfade time, whichever is shorter. If no intro or outro are marked, -use the selected crossfade time. - -Fade At Outro Start: -Start crossfading at the outro start. If the outro is longer than the -intro, cut off the end of the outro. Use the intro or outro length as -the crossfade time, whichever is shorter. If no intro or outro are -marked, use the selected crossfade time. - -Full Track: -Play the whole track. Begin crossfading from the selected number of -seconds before the end of the track. A negative crossfade time adds -silence between tracks. - -Skip Silence: -Play the whole track except for silence at the beginning and end. -Begin crossfading from the selected number of seconds before the -last sound. - - - - Repeat - Repeat - - - - Auto DJ requires two decks assigned to opposite sides of the crossfader. - Auto DJ nécessite deux platines affectées aux côtés opposés du curseur de mixage. - - - - One deck must be stopped to enable Auto DJ mode. - One deck must be stopped to enable Auto DJ mode. - - - - Decks 3 and 4 must be stopped to enable Auto DJ mode. - Decks 3 and 4 must be stopped to enable Auto DJ mode. - - - - Enable - Enable - - - - Disable - Disable - - - - Displays the duration and number of selected tracks. - Displays the duration and number of selected tracks. - - - - - - - Auto DJ - Auto DJ - - - - Shuffle - Shuffle - - - - Adds a random track from track sources (crates) to the Auto DJ queue. -If no track sources are configured, the track is added from the library instead. - Adds a random track from track sources (crates) to the Auto DJ queue. -If no track sources are configured, the track is added from the library instead. - - - - sec. - sec. - - - - DlgBeatsDlg - - - Enable BPM and Beat Detection - Enable BPM and Beat Detection - - - - Choose between different algorithms to detect beats. - Choose between different algorithms to detect beats. - - - - Beat Detection Preferences - Beat Detection Preferences - - - - When beat detection is enabled, Mixxx detects the beats per minute and beats of your tracks, -automatically shows a beat-grid for them, and allows you to synchronize tracks using their beat information. - When beat detection is enabled, Mixxx detects the beats per minute and beats of your tracks, -automatically shows a beat-grid for them, and allows you to synchronize tracks using their beat information. - - - - Enable fast beat detection. -If activated Mixxx only analyzes the first minute of a track for beat information. -This can speed up beat detection on slower computers but may result in lower quality beatgrids. - Enable fast beat detection. -If activated Mixxx only analyzes the first minute of a track for beat information. -This can speed up beat detection on slower computers but may result in lower quality beatgrids. - - - - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - - - - Re-analyze beatgrids imported from other DJ software - Re-analyze beatgrids imported from other DJ software - - - - Choose Analyzer - Choose Analyzer - - - - Analyzer Settings - Analyzer Settings - - - - Enable Fast Analysis (For slow computers, may be less accurate) - Enable Fast Analysis (For slow computers, may be less accurate) - - - - Assume constant tempo (Recommended) - Assume constant tempo (Recommended) - - - - e.g. from 3rd-party programs or Mixxx versions before 1.11. -(Not checked: Analyze only, if no beats exist.) - e.g. from 3rd-party programs or Mixxx versions before 1.11. -(Not checked: Analyze only, if no beats exist.) - - - - Re-analyze beats when settings change or beat detection data is outdated - Re-analyze beats when settings change or beat detection data is outdated - - - - DlgControllerLearning - - - Controller Learning Wizard - Controller Learning Wizard - - - - Learn - Learn - - - - Close - Close - - - - Choose Control... - Choose Control... - - - - Hints: If you're mapping a button or switch, only press or flip it once. For knobs and sliders, move the control in both directions for best results. Make sure to touch one control at a time. - Hints: If you're mapping a button or switch, only press or flip it once. For knobs and sliders, move the control in both directions for best results. Make sure to touch one control at a time. - - - - Cancel - Cancel - - - - Advanced MIDI Options - Advanced MIDI Options - - - - Switch mode interprets all messages for the control as button presses. - Switch mode interprets all messages for the control as button presses. - - - - Switch Mode - Switch Mode - - - - Ignores slider or knob movements until they are close to the internal value. This helps prevent unwanted extreme changes while mixing but can accidentally ignore intentional rapid movements. - Ignores slider or knob movements until they are close to the internal value. This helps prevent unwanted extreme changes while mixing but can accidentally ignore intentional rapid movements. - - - - Soft Takeover - Soft Takeover - - - - Reverses the direction of the control. - Reverses the direction of the control. - - - - Invert - Invert - - - - For jog wheels or infinite-scroll knobs. Interprets incoming messages in two's complement. - For jog wheels or infinite-scroll knobs. Interprets incoming messages in two's complement. - - - - Jog Wheel / Select Knob - Jog Wheel / Select Knob - - - - Retry - Retry - - - - Learn Another - Learn Another - - - - Done - Done - - - - Click anywhere in Mixxx or choose a control to learn - Click anywhere in Mixxx or choose a control to learn - - - - You can click on any button, slider, or knob in Mixxx to teach it that control. You can also type in the box to search for a control by name, or click the Choose Control button to select from a list. - You can click on any button, slider, or knob in Mixxx to teach it that control. You can also type in the box to search for a control by name, or click the Choose Control button to select from a list. - - - - Now test it out! - Now test it out! - - - - If you manipulate the control, you should see the Mixxx user interface respond the way you expect. - If you manipulate the control, you should see the Mixxx user interface respond the way you expect. - - - - Not quite right? - Not quite right? - - - - If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - - - - Didn't get any midi messages. Please try again. - Didn't get any midi messages. Please try again. - - - - Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - - - - Successfully mapped control: - Successfully mapped control: - - - - <i>Ready to learn %1</i> - <i>Ready to learn %1</i> - - - - Learning: %1. Now move a control on your controller. - Learning: %1. Now move a control on your controller. - - - - The control you clicked in Mixxx is not learnable. -This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. - -You tried to learn: %1,%2 - The control you clicked in Mixxx is not learnable. -This could be because you are either using an old skin and this control is no longer supported, or you clicked a control that provides visual feedback and can only be mapped to outputs like LEDs via scripts. - -You tried to learn: %1,%2 - - - - DlgCoverArtFullSize - - - Fetched Cover Art - Récupéré la pochette d'album - - - - DlgDeveloperTools - - - Developer Tools - Developer Tools - - - - Controls - Controls - - - - Dumps all ControlObject values to a csv-file saved in the settings path (e.g. ~/.mixxx) - Dumps all ControlObject values to a csv-file saved in the settings path (e.g. ~/.mixxx) - - - - Dump to csv - Dump to csv - - - - Log - Log - - - - Search - Search - - - - Stats - Stats - - - - DlgHidden - - - Hidden Tracks - Hidden Tracks - - - - Selects all tracks in the table below. - Selects all tracks in the table below. - - - - Select All - Select All - - - - Purge selected tracks from the library. - Purge selected tracks from the library. - - - - Purge - Purge - - - - Unhide selected tracks from the library. - Unhide selected tracks from the library. - - - - Unhide - Unhide - - - - Ctrl+S - Ctrl+S - - - - Purge selected tracks from the library and delete files from disk. - Purge selected tracks from the library and delete files from disk. - - - - Purge And Delete Files - Purge And Delete Files - - - - DlgKeywheel - - - Keywheel - Keywheel - - - - &Close - &Close - - - - DlgMissing - - - Missing Tracks - Missing Tracks - - - - Selects all tracks in the table below. - Selects all tracks in the table below. - - - - Select All - Select All - - - - Purge selected tracks from the library. - Purge selected tracks from the library. - - - - Purge - Purge - - - - DlgPrefAutoDJDlg - - - Duration after which a track is eligible for selection by Auto DJ again - Duration after which a track is eligible for selection by Auto DJ again - - - - hh:mm - hh:mm - - - - Minimum available tracks in Track Source - Minimum available tracks in Track Source - - - - Auto DJ Preferences - Auto DJ Preferences - - - - Re-queue Tracks - Re-queue Tracks - - - - This percentage of tracks are always available for selecting, regardless of when they were last played. - This percentage of tracks are always available for selecting, regardless of when they were last played. - - - - % - % - - - - - Uncheck, to ignore all played tracks. - Uncheck, to ignore all played tracks. - - - - Suspend track in Track Source from re-queue - Suspend track in Track Source from re-queue - - - - Suspension period for track selection - Suspension period for track selection - - - - Add Random Tracks - Add Random Tracks - - - - Enable random track addition to queue - Enable random track addition to queue - - - - Add random tracks from Track Source if the specified minimum tracks remain - Add random tracks from Track Source if the specified minimum tracks remain - - - - Minimum allowed tracks before addition - Minimum allowed tracks before addition - - - - Minimum number of tracks after which random tracks may be added - Minimum number of tracks after which random tracks may be added - - - - DlgPrefBroadcast - - - Icecast 2 - Icecast 2 - - - - Shoutcast 1 - Shoutcast 1 - - - - Icecast 1 - Icecast 1 - - - - MP3 - MP3 - - - - Ogg Vorbis - Ogg Vorbis - - - - Opus - Opus - - - - AAC - AAC - - - - HE-AAC - HE-AAC - - - - HE-AACv2 - HE-AACv2 - - - - Automatic - Automatic - - - - Mono - Mono - - - - Stereo - Stereo - - - - - - - Action failed - Échec de l'action - - - - You can't create more than %1 source connections. - You can't create more than %1 source connections. - - - - Source connection %1 - Source connection %1 - - - - At least one source connection is required. - At least one source connection is required. - - - - Are you sure you want to disconnect every active source connection? - Are you sure you want to disconnect every active source connection? - - - - - Confirmation required - Confirmation required - - - - '%1' has the same Icecast mountpoint as '%2'. -Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. - '%1' a le même point de montage Icecast que '%2'. -Deux de source de connexions vers le même serveur, ayant le même point de montage, ne peuvent pas être activé simultanément. - - - - Are you sure you want to delete '%1'? - Are you sure you want to delete '%1'? - - - - Renaming '%1' - Renaming '%1' - - - - New name for '%1': - New name for '%1': - - - - Can't rename '%1' to '%2': name already in use - Can't rename '%1' to '%2': name already in use - - - - DlgPrefBroadcastDlg - - - Live Broadcasting Preferences - Live Broadcasting Preferences - - - - Mixxx Icecast Testing - Mixxx Icecast Testing - - - - Public stream - Public stream - - - - http://www.mixxx.org - http://www.mixxx.org - - - - Stream name - Stream name - - - - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - - - - Live Broadcasting source connections - Live Broadcasting source connections - - - - Delete selected - Delete selected - - - - Create new connection - Create new connection - - - - Rename selected - Rename selected - - - - Disconnect all - Disconnect all - - - - Turn on Live Broadcasting when applying these settings - Turn on Live Broadcasting when applying these settings - - - - Settings for %1 - Settings for %1 - - - - Dynamically update Ogg Vorbis metadata. - Dynamically update Ogg Vorbis metadata. - - - - ICQ - ICQ - - - - AIM - AIM - - - - Website - Website - - - - Live mix - Live mix - - - - IRC - IRC - - - - Select a source connection above to edit its settings here - Select a source connection above to edit its settings here - - - - Password storage - Password storage - - - - Plain text - Plain text - - - - Secure storage (OS keychain) - Secure storage (OS keychain) - - - - Genre - Genre - - - - Use UTF-8 encoding for metadata. - Use UTF-8 encoding for metadata. - - - - Description - Description - - - - Encoding - Encoding - - - - Bitrate - Débit - - - - - Format - Format - - - - Channels - Channels - - - - Server connection - Server connection - - - - Type - Type - - - - Host - Host - - - - Login - Login - - - - Mount - Mount - - - - Port - Port - - - - Password - Password - - - - Stream info - Stream info - - - - Metadata - Metadata - - - - Use static artist and title. - Use static artist and title. - - - - Static title - Static title - - - - Static artist - Static artist - - - - Automatic reconnect - Automatic reconnect - - - - Time to wait before the first reconnection attempt is made. - Time to wait before the first reconnection attempt is made. - - - - - seconds - seconds - - - - Wait until first attempt - Wait until first attempt - - - - Reconnect period - Reconnect period - - - - Time to wait between two reconnection attempts. - Time to wait between two reconnection attempts. - - - - Limit number of reconnection attempts - Limit number of reconnection attempts - - - - Maximum retries - Maximum retries - - - - Reconnect if the connection to the streaming server is lost. - Reconnect if the connection to the streaming server is lost. - - - - Enable automatic reconnect - Enable automatic reconnect - - - - DlgPrefColors - - - - By hotcue number - By hotcue number - - - - Color - Color - - - - DlgPrefColorsDlg - - - Color Preferences - Color Preferences - - - - - Edit… - Edit… - - - - Track palette - Track palette - - - - Loop default color - Loop default color - - - - Hotcue palette - Hotcue palette - - - - Hotcue default color - Hotcue default color - - - - Replace… - Replace… - - - - DlgPrefController - - - Apply device settings? - Apply device settings? - - - - Your settings must be applied before starting the learning wizard. -Apply settings and continue? - Your settings must be applied before starting the learning wizard. -Apply settings and continue? - - - - None - None - - - - %1 by %2 - %1 by %2 - - - - No Name - No Name - - - - No Description - No Description - - - - No Author - No Author - - - - Mapping has been edited - Mapping has been edited - - - - Always overwrite during this session - Always overwrite during this session - - - - Save As - Save As - - - - Overwrite - Overwrite - - - - Save user mapping - Save user mapping - - - - Enter the name for saving the mapping to the user folder. - Enter the name for saving the mapping to the user folder. - - - - Saving mapping failed - Saving mapping failed - - - - A mapping cannot have a blank name and may not contain special characters. - A mapping cannot have a blank name and may not contain special characters. - - - - A mapping file with that name already exists. - A mapping file with that name already exists. - - - - missing - missing - - - - built-in - built-in - - - - Do you want to save the changes? - Do you want to save the changes? - - - - Troubleshooting - Troubleshooting - - - - <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - <font color='#BB0000'><b>If you use this mapping your controller may not work correctly. Please select another mapping or disable the controller.</b></font><br><br>This mapping was designed for a newer Mixxx Controller Engine and cannot be used on your current Mixxx installation.<br>Your Mixxx installation has Controller Engine version %1. This mapping requires a Controller Engine version >= %2.<br><br>For more information visit the wiki page on <a href='https://mixxx.org/wiki/doku.php/controller_engine_versions'>Controller Engine Versions</a>. - - - - Mapping already exists. - Mapping already exists. - - - - <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - <b>%1</b> already exists in user mapping folder.<br>Overwrite or save with a new name? - - - - Clear Input Mappings - Clear Input Mappings - - - - Are you sure you want to clear all input mappings? - Are you sure you want to clear all input mappings? - - - - Clear Output Mappings - Clear Output Mappings - - - - Are you sure you want to clear all output mappings? - Are you sure you want to clear all output mappings? - - - - DlgPrefControllerDlg - - - (device category goes here) - (device category goes here) - - - - Controller Name - Controller Name - - - - Enabled - Activé - - - - Description: - Description: - - - - Support: - Support: - - - - Input Mappings - Input Mappings - - - - - Search - Search - - - - - Add - Add - - - - - Remove - Supprimer - - - - Click to start the Controller Learning wizard. - Click to start the Controller Learning wizard. - - - - Controller Preferences - Controller Preferences - - - - Controller Setup - Controller Setup - - - - Load Mapping: - Load Mapping: - - - - Mapping Info - Mapping Info - - - - Author: - Author: - - - - Name: - Name: - - - - Learning Wizard (MIDI Only) - Learning Wizard (MIDI Only) - - - - Mapping Files: - Mapping Files: - - - - - Clear All - Clear All - - - - Output Mappings - Output Mappings - - - - DlgPrefControllers - - - Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the %1. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx. - Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the %1. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx. - - - - Mixxx DJ Hardware Guide - Mixxx DJ Hardware Guide - - - - MIDI Mapping File Format - MIDI Mapping File Format - - - - MIDI Scripting with Javascript - MIDI Scripting with Javascript - - - - DlgPrefControllersDlg - - - Controller Preferences - Controller Preferences - - - - Controllers - Controllers - - - - Mixxx did not detect any controllers. If you connected the controller while Mixxx was running you must restart Mixxx first. - Mixxx did not detect any controllers. If you connected the controller while Mixxx was running you must restart Mixxx first. - - - - Mappings - Mappings - - - - Open User Mapping Folder - Open User Mapping Folder - - - - Resources - Resources - - - - Controllers are physical devices that send MIDI or HID signals to your computer over a USB connection. These allow you to control Mixxx in a more hands-on way than a keyboard and mouse. Attached controllers that Mixxx recognizes are shown in the "Controllers" section in the sidebar. - Controllers are physical devices that send MIDI or HID signals to your computer over a USB connection. These allow you to control Mixxx in a more hands-on way than a keyboard and mouse. Attached controllers that Mixxx recognizes are shown in the "Controllers" section in the sidebar. - - - - You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. - You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. - - - - DlgPrefControlsDlg - - - Skin - Skin - - - - Tool tips - Tool tips - - - - Select from different color schemes of a skin if available. - Select from different color schemes of a skin if available. - - - - Color scheme - Color scheme - - - - Locales determine country and language specific settings. - Locales determine country and language specific settings. - - - - Locale - Locale - - - - Interface Preferences - Interface Preferences - - - - Skin selector - - - - - Miscellaneous - Miscellaneous - - - - HiDPI / Retina scaling - HiDPI / Retina scaling - - - - Change the size of text, buttons, and other items. - Change the size of text, buttons, and other items. - - - - Screen saver - Screen saver - - - - Start in full-screen mode - Start in full-screen mode - - - - Full-screen mode - Full-screen mode - - - - Off - Off - - - - Library only - Library only - - - - Library and Skin - Library and Skin - - - - DlgPrefDeck - - - Mixxx mode - Mixxx mode - - - - Mixxx mode (no blinking) - Mixxx mode (no blinking) - - - - Pioneer mode - Pioneer mode - - - - Denon mode - Denon mode - - - - Numark mode - Numark mode - - - - CUP mode - CUP mode - - - - mm:ss%1zz - Traditional - mm:ss%1zz - Traditional - - - - mm:ss - Traditional (Coarse) - mm:ss - Traditional (Coarse) - - - - s%1zz - Seconds - s%1zz - Seconds - - - - sss%1zz - Seconds (Long) - sss%1zz - Seconds (Long) - - - - s%1sss%2zz - Kiloseconds - s%1sss%2zz - Kiloseconds - - - - Intro start - Intro start - - - - Main cue - Main cue - - - - First sound (skip silence) - First sound (skip silence) - - - - Beginning of track - Beginning of track - - - - Reject - Rejeter - - - - Allow, but stop deck - Autoriser, mais arrêter la platine - - - - Allow, play from load point - Autoriser, jouer depuis le point de chargement - - - - 4% - 4% - - - - 6% (semitone) - 6% (semitone) - - - - 8% (Technics SL-1210) - 8% (Technics SL-1210) - - - - 10% - 10% - - - - 16% - 16% - - - - 24% - 24% - - - - 50% - 50% - - - - 90% - 90% - - - - DlgPrefDeckDlg - - - Deck Preferences - Deck Preferences - - - - Deck options - Deck options - - - - Cue mode - Cue mode - - - - Mixxx mode: -- Cue button while pause at cue point = preview -- Cue button while pause not at cue point = set cue point -- Cue button while playing = pause at cue point -Mixxx mode (no blinking): -- Same as Mixxx mode but with no blinking indicators -Pioneer mode: -- Same as Mixxx mode with a flashing play button -Denon mode: -- Cue button at cue point = preview -- Cue button not at cue point = pause at cue point -- Play = set cue point -Numark mode: -- Same as Denon mode, but without a flashing play button -CUP mode: -- Cue button while pause at cue point = play after release -- Cue button while pause not at cue point = set cue point and play after release -- Cue button while playing = go to cue point and play after release - - Mixxx mode: -- Cue button while pause at cue point = preview -- Cue button while pause not at cue point = set cue point -- Cue button while playing = pause at cue point -Mixxx mode (no blinking): -- Same as Mixxx mode but with no blinking indicators -Pioneer mode: -- Same as Mixxx mode with a flashing play button -Denon mode: -- Cue button at cue point = preview -- Cue button not at cue point = pause at cue point -- Play = set cue point -Numark mode: -- Same as Denon mode, but without a flashing play button -CUP mode: -- Cue button while pause at cue point = play after release -- Cue button while pause not at cue point = set cue point and play after release -- Cue button while playing = go to cue point and play after release - - - - - Track time display - Track time display - - - - Elapsed - Elapsed - - - - Remaining - Remaining - - - - Elapsed and Remaining - Elapsed and Remaining - - - - Time Format - Time Format - - - - Intro start - Intro start - - - - When the analyzer places the intro start point automatically, -it will place it at the main cue point if the main cue point has been set previously. -This may be helpful for upgrading to Mixxx 2.3 from earlier versions. - -If this option is disabled, the intro start point is automatically placed at the first sound. - When the analyzer places the intro start point automatically, -it will place it at the main cue point if the main cue point has been set previously. -This may be helpful for upgrading to Mixxx 2.3 from earlier versions. - -If this option is disabled, the intro start point is automatically placed at the first sound. - - - - Set intro start to main cue when analyzing tracks - Set intro start to main cue when analyzing tracks - - - - Track load point - Track load point - - - - Clone deck - Clone deck - - - - Loading a track, when deck is playing - Charger une piste, lorsque une platine est en cours de lecture - - - - Create a playing clone of the first playing deck by double-tapping a Load button on a controller or keyboard. -You can always drag-and-drop tracks on screen to clone a deck. - Create a playing clone of the first playing deck by double-tapping a Load button on a controller or keyboard. -You can always drag-and-drop tracks on screen to clone a deck. - - - - Double-press Load button to clone playing track - Double-press Load button to clone playing track - - - - Speed (Tempo) and Key (Pitch) options - Speed (Tempo) and Key (Pitch) options - - - - Permanent rate change when left-clicking - Permanent rate change when left-clicking - - - - - - - % - % - - - - Permanent rate change when right-clicking - Permanent rate change when right-clicking - - - - Reset on track load - Reset on track load - - - - Current key - Current key - - - - Temporary rate change when right-clicking - Temporary rate change when right-clicking - - - - Permanent - Permanent - - - - Value in milliseconds - Value in milliseconds - - - - Temporary - Temporary - - - - Sync mode (Dynamic tempo tracks) - - - - - Keylock mode - Keylock mode - - - - Ramping sensitivity - Ramping sensitivity - - - - Pitch bend behavior - Pitch bend behavior - - - - Original key - Original key - - - - Temporary rate change when left-clicking - Temporary rate change when left-clicking - - - - Speed/Tempo - Speed/Tempo - - - - Key/Pitch - Key/Pitch - - - - Adjustment buttons: - Adjustment buttons: - - - - Apply tempo changes from a soft-leading track (usually the leaving track in a transition) to the follower tracks. After the transition, the follower track will continue with the previous leader's very last tempo. Changes from explicit selected leaders are always applied. - - - - - Follow soft leader's tempo - - - - - Coarse - Coarse - - - - Fine - Fine - - - - Make the speed sliders work like those on DJ turntables and CDJs where moving downward increases the speed - Make the speed sliders work like those on DJ turntables and CDJs where moving downward increases the speed - - - - Down increases speed - Down increases speed - - - - Slider range - Slider range - - - - Adjusts the range of the speed (Vinyl "Pitch") slider. - Adjusts the range of the speed (Vinyl "Pitch") slider. - - - - Abrupt jump - Abrupt jump - - - - Smoothly adjusts deck speed when temporary change buttons are held down - Smoothly adjusts deck speed when temporary change buttons are held down - - - - Smooth ramping - Smooth ramping - - - - Keyunlock mode - Keyunlock mode - - - - Reset key - Reset key - - - - Keep key - Keep key - - - - The tempo of a previous soft leader track at the beginning of the transition is kept steady. After the transition, the follower track will maintain this original tempo. This technique serves as a workaround to avoid dynamic tempo changes, as seen during the outro of rubato-style tracks. For instance, it prevents the follower track from continuing with a slowed-down tempo of the soft leader. This corresponds to the behavior before Mixxx 2.4. Changes from explicit selected leaders are always applied. - - - - - Use steady tempo - - - - - DlgPrefEffectsDlg - - - Effects Preferences - Effects Preferences - - - - - Effect Chain Presets - Effect Chain Presets - - - - Drag and drop to rearrange lists and copy chains between lists. Create and edit chain presets in the effect units in the main window. Please refer the manual for further details. - Drag and drop to rearrange lists and copy chains between lists. Create and edit chain presets in the effect units in the main window. Please refer the manual for further details. - - - - Chain presets from these lists will be selectable in the given order in the main window and from controllers (depending on the controller mapping). - Chain presets from these lists will be selectable in the given order in the main window and from controllers (depending on the controller mapping). - - - - Effects in this chain preset: - Effects in this chain preset: - - - - effect 1 name - effect 1 name - - - - effect 2 name - effect 2 name - - - - effect 3 name - effect 3 name - - - - Import - Import - - - - Rename - Renommer - - - - Export - Export - - - - Delete - Delete - - - - Quick Effect Chain Presets - Quick Effect Chain Presets - - - - - Visible Effects - Visible Effects - - - - Drag and drop to rearrange lists and show or hide effects. - Drag and drop to rearrange lists and show or hide effects. - - - - Hidden Effects - Hidden Effects - - - - Effect load behavior - Effect load behavior - - - - Keep metaknob position - Keep metaknob position - - - - Reset metaknob to effect default - Reset metaknob to effect default - - - - Effect Info - Effect Info - - - - Version: - Version: - - - - Description: - Description: - - - - Author: - Author: - - - - Name: - Name: - - - - Type: - Type: - - - - DlgPrefInterface - - - The minimum size of the selected skin is bigger than your screen resolution. - The minimum size of the selected skin is bigger than your screen resolution. - - - - Allow screensaver to run - Allow screensaver to run - - - - Prevent screensaver from running - Prevent screensaver from running - - - - Prevent screensaver while playing - Prevent screensaver while playing - - - - This skin does not support color schemes - This skin does not support color schemes - - - - Information - Information - - - - Mixxx must be restarted before the new locale or scaling settings will take effect. - Mixxx must be restarted before the new locale or scaling settings will take effect. - - - - DlgPrefKeyDlg - - - Key Notation Format Settings - Key Notation Format Settings - - - - When key detection is enabled, Mixxx detects the musical key of your tracks -and allows you to pitch adjust them for harmonic mixing. - When key detection is enabled, Mixxx detects the musical key of your tracks -and allows you to pitch adjust them for harmonic mixing. - - - - Enable Key Detection - Enable Key Detection - - - - Choose Analyzer - Choose Analyzer - - - - Choose between different algorithms to detect keys. - Choose between different algorithms to detect keys. - - - - Analyzer Settings - Analyzer Settings - - - - Enable Fast Analysis (For slow computers, may be less accurate) - Enable Fast Analysis (For slow computers, may be less accurate) - - - - Re-analyze keys when settings change or 3rd-party keys are present - Re-analyze keys when settings change or 3rd-party keys are present - - - - Key Notation - Key Notation - - - - Lancelot - Lancelot - - - - Lancelot/Traditional - Lancelot/Traditional - - - - OpenKey - OpenKey - - - - OpenKey/Traditional - OpenKey/Traditional - - - - Traditional - Traditional - - - - Custom - Custom - - - - A - A - - - - Bb - Bb - - - - B - B - - - - C - C - - - - Db - Db - - - - D - D - - - - Eb - Eb - - - - E - E - - - - F - F - - - - F# - F# - - - - G - G - - - - Ab - Ab - - - - Am - Am - - - - Bbm - Bbm - - - - Bm - Bm - - - - Cm - Cm - - - - C#m - C#m - - - - Dm - Dm - - - - Ebm - Ebm - - - - Em - Em - - - - Fm - Fm - - - - F#m - F#m - - - - Gm - Gm - - - - G#m - G#m - - - - DlgPrefLibrary - - - See the manual for details - See the manual for details - - - - Music Directory Added - Music Directory Added - - - - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - - - - Scan - Scan - - - - Choose a music directory - Choose a music directory - - - - Confirm Directory Removal - Confirm Directory Removal - - - - Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - - - - Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - - - - Hide Tracks - Hide Tracks - - - - Delete Track Metadata - Delete Track Metadata - - - - Leave Tracks Unchanged - Leave Tracks Unchanged - - - - Relink music directory to new location - Relink music directory to new location - - - - Select Library Font - Select Library Font - - - - DlgPrefLibraryDlg - - - If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - - - - Remove - Supprimer - - - - Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - - - - Music Directories - Répertoires de music - - - - Add - Add - - - - If an existing music directory is moved, Mixxx doesn't know where to find the audio files in it. Choose Relink to select the music directory in its new location. <br/> This will re-establish the links to the audio files in the Mixxx library. - If an existing music directory is moved, Mixxx doesn't know where to find the audio files in it. Choose Relink to select the music directory in its new location. <br/> This will re-establish the links to the audio files in the Mixxx library. - - - - Relink - This will re-establish the links to the audio files in the Mixxx database if you move an music directory to a new location. - Relink - - - - Rescan directories on start-up - Relire les répertoires au démarrage - - - - Audio File Formats - Audio File Formats - - - - Track Metadata Synchronization - Track Metadata Synchronization - - - - Track Table View - Track Table View - - - - Track Double-Click Action: - Track Double-Click Action: - - - - BPM display precision: - Précision de l'affichage BPM: - - - - Session History - Historique des sessions - - - - Track duplicate distance - Track duplicate distance - - - - When playing a track again log it to the session history only if more than N other tracks have been played in the meantime - When playing a track again log it to the session history only if more than N other tracks have been played in the meantime - - - - History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. - History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx. - - - - Delete history playlist with less than N tracks - Delete history playlist with less than N tracks - - - - Miscellaneous - Miscellaneous - - - - Library Font: - Library Font: - - - - Enable search completions - Activer les complétions de recherche - - - - Enable search history keyboard shortcuts - Activer les raccourcis clavier pour l'historique de recherche - - - - Preferred Cover Art Fetcher Resolution - Résolution préférée du récupérateur de pochette d'album - - - - Fetch cover art from coverartarchive.com by using Import Metadata From Musicbrainz. - Récupérer les pochettes d'album depuis coverartarchive.com en utilisant l'importation de métadonnées depuis Musicbrainz. - - - - Note: ">1200 px" can fetch up to very large cover arts. - Note : ">1200 px" peut récupérer de très larges images de couverture - - - - >1200 px (if available) - >1200 px (si disponible) - - - - 1200 px (if available) - 1200 px (si disponible) - - - - 500 px - 500 px - - - - 250 px - 250 px - - - - Settings Directory - Répertoire des paramètres - - - - The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. - The Mixxx settings directory contains the library database, various configuration files, log files, track analysis data, as well as custom controller mappings. - - - - Edit those files only if you know what you are doing and only while Mixxx is not running. - Edit those files only if you know what you are doing and only while Mixxx is not running. - - - - Open Mixxx Settings Folder - Open Mixxx Settings Folder - - - - Library Row Height: - Library Row Height: - - - - Use relative paths for playlist export if possible - Use relative paths for playlist export if possible - - - - ... - ... - - - - px - px - - - - Synchronize library track metadata from/to file tags - Synchronize library track metadata from/to file tags - - - - Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library - Automatically write modified track metadata from the library into file tags and reimport metadata from updated file tags into the library - - - - Synchronize Serato track metadata from/to file tags (experimental) - Synchronize Serato track metadata from/to file tags (experimental) - - - - Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. - Keeps track color, beat grid, bpm lock, cue points, and loops synchronized with SERATO_MARKERS/MARKERS2 file tags.<br/><br/>WARNING: Enabling this option also enables the reimport of Serato metadata after files have been modified outside of Mixxx. On reimport existing metadata in Mixxx is replaced with the metadata found in file tags. Custom metadata not included in file tags like loop colors is lost. - - - - Edit metadata after clicking selected track - Edit metadata after clicking selected track - - - - Search-as-you-type timeout: - Search-as-you-type timeout: - - - - ms - ms - - - - Load track to next available deck - Load track to next available deck - - - - External Libraries - External Libraries - - - - You will need to restart Mixxx for these settings to take effect. - You will need to restart Mixxx for these settings to take effect. - - - - Show Rhythmbox Library - Show Rhythmbox Library - - - - Add track to Auto DJ queue (bottom) - Add track to Auto DJ queue (bottom) - - - - Add track to Auto DJ queue (top) - Add track to Auto DJ queue (top) - - - - Ignore - Ignore - - - - Show Banshee Library - Show Banshee Library - - - - Show iTunes Library - Show iTunes Library - - - - Show Traktor Library - Show Traktor Library - - - - Show Rekordbox Library - Show Rekordbox Library - - - - Show Serato Library - Show Serato Library - - - - All external libraries shown are write protected. - All external libraries shown are write protected. - - - - DlgPrefMixerDlg - - - Crossfader Preferences - Crossfader Preferences - - - - Crossfader Curve - Crossfader Curve - - - - Slow fade/Fast cut (additive) - Slow fade/Fast cut (additive) - - - - Constant power - Constant power - - - - Mixing - Mixing - - - - Scratching - Scratching - - - - Linear - Linear - - - - Logarithmic - Logarithmic - - - - Reverse crossfader (Hamster Style) - Reverse crossfader (Hamster Style) - - - - Deck Equalizers - Deck Equalizers - - - - Only allow EQ knobs to control EQ-specific effects - Only allow EQ knobs to control EQ-specific effects - - - - Uncheck to allow any effect to be loaded into the EQ knobs. - Uncheck to allow any effect to be loaded into the EQ knobs. - - - - Use the same EQ filter for all decks - Use the same EQ filter for all decks - - - - Uncheck to allow different decks to use different EQ effects. - Uncheck to allow different decks to use different EQ effects. - - - - Equalizer Plugin - Equalizer Plugin - - - - Quick Effect - Quick Effect - - - - Bypass EQ effect processing - Bypass EQ effect processing - - - - When checked, EQs are not processed, improving performance on slower computers. - When checked, EQs are not processed, improving performance on slower computers. - - - - Resets the equalizers to their default values when loading a track. - Resets the equalizers to their default values when loading a track. - - - - Reset equalizers on track load - Reset equalizers on track load - - - - Resets the deck gain to unity when loading a track. - Resets the deck gain to unity when loading a track. - - - - Reset gain on track load - Reset gain on track load - - - - Equalizer frequency Shelves - Plages de fréquences de l'égaliseur - - - - High EQ - High EQ - - - - - 16 Hz - 16 Hz - - - - - 20.05 kHz - 20.05 kHz - - - - Low EQ - Low EQ - - - - Main EQ - Main EQ - - - - Reset Parameter - Reset Parameter - - - - DlgPrefModplug - - - Modplug Preferences - Modplug Preferences - - - - Maximum Number of Mixing Channels: - Maximum Number of Mixing Channels: - - - - Show Advanced Settings - Show Advanced Settings - - - - - - Low - Low - - - - Reverb Delay: - Reverb Delay: - - - - - - High - High - - - - None - None - - - - Bass Expansion - Bass Expansion - - - - Bass Range: - Bass Range: - - - - 16 - 16 - - - - Front/Rear Delay: - Front/Rear Delay: - - - - Pro-Logic Surround - Pro-Logic Surround - - - - Full - Full - - - - Reverb - Réverbération - - - - Stereo separation - Stereo separation - - - - 10Hz - 10Hz - - - - 10ms - 10ms - - - - 256 - 256 - - - - 5ms - 5ms - - - - 100Hz - 100Hz - - - - 250ms - 250ms - - - - 50ms - 50ms - - - - Noise reduction - Noise reduction - - - - Hints - Hints - - - - Module files are decoded at once and kept in RAM to allow for seeking and smooth operation in Mixxx. About 10MB of RAM are required for 1 minute of audio. - Module files are decoded at once and kept in RAM to allow for seeking and smooth operation in Mixxx. About 10MB of RAM are required for 1 minute of audio. - - - - Decoding options for libmodplug, a software library for loading and rendering module files (MOD music, tracker music). - Decoding options for libmodplug, a software library for loading and rendering module files (MOD music, tracker music). - - - - Decoding Options - Decoding Options - - - - Resampling mode (interpolation) - Resampling mode (interpolation) - - - - Enable oversampling - Enable oversampling - - - - Nearest (very fast, extremely bad quality) - Nearest (very fast, extremely bad quality) - - - - Linear (fast, good quality) - Linear (fast, good quality) - - - - Cubic Spline (high quality) - Cubic Spline (high quality) - - - - 8-tap FIR (extremely high quality) - 8-tap FIR (extremely high quality) - - - - Memory limit for single track (MB) - Memory limit for single track (MB) - - - - All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the %1 - - - - DlgPrefRecord - - - Choose recordings directory - Choose recordings directory - - - - - Recordings directory invalid - Recordings directory invalid - - - - Recordings directory must be set to an existing directory. - Recordings directory must be set to an existing directory. - - - - Recordings directory must be set to a directory. - Recordings directory must be set to a directory. - - - - Recordings directory not writable - Recordings directory not writable - - - - You do not have write access to %1. Choose a recordings directory you have write access to. - You do not have write access to %1. Choose a recordings directory you have write access to. - - - - DlgPrefRecordDlg - - - Recording Preferences - Recording Preferences - - - - Browse... - Browse... - - - - - Quality - Quality - - - - Tags - Tags - - - - Title - Titre - - - - Author - Author - - - - Album - Album - - - - Output File Format - Output File Format - - - - Compression - Compression - - - - Lossy - Lossy - - - - Recording Files - Recording Files - - - - Directory: - Directory: - - - - Compression Level - Compression Level - - - - Lossless - Lossless - - - - Create a CUE file - Create a CUE file - - - - Split recordings at - Split recordings at - - - - DlgPrefReplayGain - - - %1 LUFS (adjust by %2 dB) - %1 LUFS (adjust by %2 dB) - - - - DlgPrefReplayGainDlg - - - Normalization Preferences - Normalization Preferences - - - - ReplayGain Loudness Normalization - ReplayGain Loudness Normalization - - - - Apply loudness normalization to loaded tracks. - Apply loudness normalization to loaded tracks. - - - - Apply ReplayGain - Apply ReplayGain - - - - -30 LUFS - -30 LUFS - - - - -6 LUFS - -6 LUFS - - - - When ReplayGain is enabled, adjust tracks lacking ReplayGain information by this amount. - When ReplayGain is enabled, adjust tracks lacking ReplayGain information by this amount. - - - - Initial boost without ReplayGain data - Initial boost without ReplayGain data - - - - ReplayGain targets a reference loudness of -18 LUFS (Loudness Units relative to Full Scale). You may increase it if you find Mixxx is too quiet or reduce it if you find that your tracks are clipping. You may also want to decrease the volume of unanalyzed tracks if you find they are often louder than ReplayGained tracks. For podcasting a loudness of -16 LUFS is recommended. - -The loudness target is approximate and assumes track pregain and main output level are unchanged. - - - - - For tracks with ReplayGain, adjust the target loudness to this LUFS value (Loudness Units relative to Full Scale). - For tracks with ReplayGain, adjust the target loudness to this LUFS value (Loudness Units relative to Full Scale). - - - - Target loudness - Target loudness - - - - -12 dB - -12 dB - - - - Analysis - Analysis - - - - ReplayGain 2.0 (ITU-R BS.1770) - ReplayGain 2.0 (ITU-R BS.1770) - - - - ReplayGain 1.0 - ReplayGain 1.0 - - - - Disabled - Disabled - - - - Re-analyze and override an existing value - Re-analyze and override an existing value - - - - When an unanalyzed track is playing, Mixxx will avoid an abrupt volume change by not applying a newly calculated ReplayGain value. - When an unanalyzed track is playing, Mixxx will avoid an abrupt volume change by not applying a newly calculated ReplayGain value. - - - - +12 dB - +12 dB - - - - Hints - Hints - - - - DlgPrefSound - - - %1 Hz - %1 Hz - - - - Default (long delay) - Default (long delay) - - - - Experimental (no delay) - Experimental (no delay) - - - - Disabled (short delay) - Disabled (short delay) - - - - Soundcard Clock - Soundcard Clock - - - - Network Clock - Network Clock - - - - Direct monitor (recording and broadcasting only) - Direct monitor (recording and broadcasting only) - - - - Disabled - Disabled - - - - Enabled - Activé - - - - Stereo - Stereo - - - - Mono - Mono - - - - To enable Realtime scheduling (currently disabled), see the %1. - To enable Realtime scheduling (currently disabled), see the %1. - - - - The %1 lists sound cards and controllers you may want to consider for using Mixxx. - The %1 lists sound cards and controllers you may want to consider for using Mixxx. - - - - Mixxx DJ Hardware Guide - Mixxx DJ Hardware Guide - - - - auto (<= 1024 frames/period) - - - - - 2048 frames/period - - - - - 4096 frames/period - - - - - Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - - - - Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - - - - Refer to the Mixxx User Manual for details. - Refer to the Mixxx User Manual for details. - - - - Configured latency has changed. - Configured latency has changed. - - - - Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - - - Realtime scheduling is enabled. - Realtime scheduling is enabled. - - - - Main output only - Main output only - - - - Main and booth outputs - Main and booth outputs - - - - %1 ms - %1 ms - - - - Configuration error - Configuration error - - - - DlgPrefSoundDlg - - - Sound Hardware Preferences - Sound Hardware Preferences - - - - Sound API - Sound API - - - - Sample Rate - Sample Rate - - - - Audio Buffer - Audio Buffer - - - - Engine Clock - Engine Clock - - - - Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - - - - Main Mix - Main Mix - - - - Main Output Mode - Main Output Mode - - - - Microphone Monitor Mode - Microphone Monitor Mode - - - - Microphone Latency Compensation - Microphone Latency Compensation - - - - - - - ms - milliseconds - ms - - - - 20 ms - 20 ms - - - - Buffer Underflow Count - Buffer Underflow Count - - - - 0 - 0 - - - - Keylock/Pitch-Bending Engine - Keylock/Pitch-Bending Engine - - - - Multi-Soundcard Synchronization - Multi-Soundcard Synchronization - - - - Output - Output - - - - Input - Input - - - - System Reported Latency - System Reported Latency - - - - Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - - - - Main Output Delay - Main Output Delay - - - - Headphone Output Delay - Headphone Output Delay - - - - Booth Output Delay - Booth Output Delay - - - - Hints and Diagnostics - Hints and Diagnostics - - - - Downsize your audio buffer to improve Mixxx's responsiveness. - Downsize your audio buffer to improve Mixxx's responsiveness. - - - - Query Devices - Query Devices - - - - DlgPrefSoundItem - - - Channel %1 - Channel %1 - - - - Channels %1 - %2 - Channels %1 - %2 - - - - Sound Item Preferences - Constructs new sound items inside the Sound Hardware Preferences, representing an AudioPath and SoundDevice - Sound Item Preferences - - - - Type (#) - Type (#) - - - - DlgPrefVinylDlg - - - Input - Input - - - - Vinyl Configuration - Vinyl Configuration - - - - Show Signal Quality in Skin - Show Signal Quality in Skin - - - - Vinyl Control Preferences - Vinyl Control Preferences - - - - Turntable Input Signal Boost - Turntable Input Signal Boost - - - - 0 dB - 0 dB - - - - 44 dB - 44 dB - - - - Vinyl Type - Vinyl Type - - - - Lead-In - Lead-In - - - - Deck 1 - Deck 1 - - - - Deck 2 - Deck 2 - - - - Deck 3 - Deck 3 - - - - Deck 4 - Deck 4 - - - - Signal Quality - Signal Quality - - - - http://www.xwax.co.uk - http://www.xwax.co.uk - - - - Powered by xwax - Powered by xwax - - - - Hints - Hints - - - - Select sound devices for Vinyl Control in the Sound Hardware pane. - Select sound devices for Vinyl Control in the Sound Hardware pane. - - - - DlgPrefWaveform - - - Filtered - Filtered - - - - HSV - HSV - - - - RGB - RGB - - - - OpenGL not available - OpenGL not available - - - - dropped frames - dropped frames - - - - Cached waveforms occupy %1 MiB on disk. - Cached waveforms occupy %1 MiB on disk. - - - - DlgPrefWaveformDlg - - - Waveform Preferences - Waveform Preferences - - - - Frame rate - Frame rate - - - - Displays which OpenGL version is supported by the current platform. - Displays which OpenGL version is supported by the current platform. - - - - Normalize waveform overview - Normalize waveform overview - - - - Average frame rate - Average frame rate - - - - Visual gain - Visual gain - - - - Default zoom level - Waveform zoom - Default zoom level - - - - Displays the actual frame rate. - Displays the actual frame rate. - - - - Visual gain of the middle frequencies - Visual gain of the middle frequencies - - - - End of track warning - Avertissement de fin de piste - - - - OpenGL status - OpenGL status - - - - Highlight the waveforms when the last seconds of a track remains. - Highlight the waveforms when the last seconds of a track remains. - - - - seconds - seconds - - - - Low - Low - - - - Middle - Middle - - - - Global - Global - - - - Visual gain of the high frequencies - Visual gain of the high frequencies - - - - Visual gain of the low frequencies - Visual gain of the low frequencies - - - - High - High - - - - Waveform type - Waveform type - - - - Global visual gain - Global visual gain - - - - The waveform overview shows the waveform envelope of the entire track. -Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - The waveform overview shows the waveform envelope of the entire track. -Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - - - - The waveform shows the waveform envelope of the track near the current playback position. -Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - The waveform shows the waveform envelope of the track near the current playback position. -Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - - - - Waveform overview type - Waveform overview type - - - - fps - fps - - - - Synchronize zoom level across all waveform displays. - Synchronize zoom level across all waveform displays. - - - - Synchronize zoom level across all waveforms - Synchronize zoom level across all waveforms - - - - Caching - Caching - - - - Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - - - - Enable waveform caching - Enable waveform caching - - - - Generate waveforms when analyzing library - Generate waveforms when analyzing library - - - - Beat grid opacity - Beat grid opacity - - - - Set amount of opacity on beat grid lines. - Set amount of opacity on beat grid lines. - - - - % - % - - - - Play marker position - Play marker position - - - - Moves the play marker position on the waveforms to the left, right or center (default). - Moves the play marker position on the waveforms to the left, right or center (default). - - - - Clear Cached Waveforms - Clear Cached Waveforms - - - - DlgPreferences - - - Sound Hardware - Sound Hardware - - - - Controllers - Controllers - - - - Library - Library - - - - Interface - Interface - - - - Waveforms - Waveforms - - - - Mixer - Mixer - - - - Auto DJ - Auto DJ - - - - Decks - Decks - - - - Colors - Colors - - - - &Help - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Help - - - - &Restore Defaults - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - - - - - &Apply - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Apply - - - - &Cancel - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Cancel - - - - &Ok - Preferences standard buttons: consider the other buttons to choose a unique Alt hotkey (&) - &Ok - - - - Effects - Effets - - - - Recording - Recording - - - - Beat Detection - Beat Detection - - - - Key Detection - Key Detection - - - - Normalization - Normalization - - - - <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - <font color='#BB0000'><b>Some preferences pages have errors. To apply the changes please first fix the issues.</b></font> - - - - Vinyl Control - Vinyl Control - - - - Live Broadcasting - Diffusion en direct - - - - Modplug Decoder - Modplug Decoder - - - - DlgPreferencesDlg - - - Preferences - Preferences - - - - 1 - 1 - - - - - TextLabel - TextLabel - - - - DlgRecording - - - Recordings - Recordings - - - - - Start Recording - Start Recording - - - - Recording to file: - Recording to file: - - - - Stop Recording - Stop Recording - - - - %1 MiB written in %2 - %1 MiB written in %2 - - - - DlgReplaceCueColor - - - Replace Hotcue Color - Replace Hotcue Color - - - - Replace cue color if … - Replace cue color if … - - - - Hotcue index - Hotcue index - - - - - is - is - - - - - is not - is not - - - - Current cue color - Current cue color - - - - If you don't specify any conditions, the colors of all cues in the library will be replaced. - If you don't specify any conditions, the colors of all cues in the library will be replaced. - - - - … by: - … by: - - - - New cue color - New cue color - - - - Selecting database rows... - Selecting database rows... - - - - No colors changed! - No colors changed! - - - - No cues matched the specified criteria. - No cues matched the specified criteria. - - - - Confirm Color Replacement - Confirm Color Replacement - - - - The colors of %1 cues in %2 tracks will be replaced. This change cannot be undone! Are you sure? - The colors of %1 cues in %2 tracks will be replaced. This change cannot be undone! Are you sure? - - - - DlgTagFetcher - - - MusicBrainz - MusicBrainz - - - - Select best possible match - Select best possible match - - - - - Track - Track - - - - - Year - Année - - - - Title - Titre - - - - - Artist - Artiste - - - - - Album - Album - - - - Album Artist - Artiste de l'album - - - - Fetching track data from the MusicBrainz database - Fetching track data from the MusicBrainz database - - - - Get API-Key - To be able to submit audio fingerprints to the MusicBrainz database, a free application programming interface key (API key) is required. - Get API-Key - - - - Submit - Submits audio fingerprints to the MusicBrainz database. - Submit - - - - New Column - New Column - - - - New Item - New Item - - - - Current Cover Art - Image de Couverture Courante - - - - Found Cover Art - Pochette d'Album Trouvée - - - - Apply Cover - Appliquer la Pochette - - - - The results are ready to be applied. - Les résultats sont prêts à être appliqués. - - - - Retry - Retry - - - - &Previous - &Previous - - - - &Next - &Next - - - - &Apply - &Apply - - - - &Close - &Close - - - - Original tags - Original tags - - - - %1 - %1 - - - - Could not find this track in the MusicBrainz database. - Impossible de trouver cette piste dans la base de données MusicBrainz. - - - - Suggested tags - Suggested tags - - - - The results are ready to be applied - Les résultats sont prêts à être appliqués - - - - Can't connect to %1: %2 - Impossible de se connecter à %1 : %2 - - - - Looking for cover art - Recherche de pochette d'album - - - - Cover art found, receiving image. - Pochette d'album trouvée, réception de l'image. - - - - Cover Art is not available for selected metadata - La pochette d'image n'est pas disponible pour les métadonnées sélectionnées - - - - Metadata & Cover Art applied - Métadonnées & Pochette d'Album appliquées - - - - Selected cover art applied - Pochette d'album sélectionnée appliquée - - - - Cover Art File Already Exists - La Pochette d'Album Existe Déjà - - - - File: %1 -Folder: %2 -Override existing file? -This can not be undone! - Fichier : %1 -Dossier : %2 -Écraser le fichier existant ? -Cette opération est irréversible ! - - - - DlgTrackExport - - - Export Tracks - Export Tracks - - - - Exporting Tracks - Exporting Tracks - - - - (status text) - (status text) - - - - &Cancel - &Cancel - - - - DlgTrackInfo - - - Track Editor - Track Editor - - - - Summary - Summary - - - - Filetype: - Filetype: - - - - BPM: - BPM: - - - - Location: - Location: - - - - Bitrate: - Bitrate: - - - - Comments - Comments - - - - BPM - BPM - - - - Sets the BPM to 75% of the current value. - Sets the BPM to 75% of the current value. - - - - 3/4 BPM - 3/4 BPM - - - - Sets the BPM to 50% of the current value. - Sets the BPM to 50% of the current value. - - - - Displays the BPM of the selected track. - Displays the BPM of the selected track. - - - - Track # - Piste n° - - - - Album Artist - Artiste de l'album - - - - Composer - Compositeur - - - - Title - Titre - - - - Grouping - Regroupement - - - - Key - Clé - - - - Year - Année - - - - Artist - Artiste - - - - Album - Album - - - - Genre - Genre - - - - ReplayGain: - ReplayGain: - - - - Sets the BPM to 200% of the current value. - Sets the BPM to 200% of the current value. - - - - Double BPM - Double BPM - - - - Halve BPM - Halve BPM - - - - Clear BPM and Beatgrid - Clear BPM and Beatgrid - - - - Move to the previous item. - "Previous" button - Move to the previous item. - - - - &Previous - &Previous - - - - Move to the next item. - "Next" button - Move to the next item. - - - - &Next - &Next - - - - Duration: - Duration: - - - - Import Metadata from MusicBrainz - Import Metadata from MusicBrainz - - - - Re-Import Metadata from file - Re-Import Metadata from file - - - - Color - Couleur - - - - Date added: - Date added: - - - - Open in File Browser - Open in File Browser - - - - Samplerate: - - - - - Track BPM: - Track BPM: - - - - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - Converts beats detected by the analyzer into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - - - - Assume constant tempo - Assume constant tempo - - - - Sets the BPM to 66% of the current value. - Sets the BPM to 66% of the current value. - - - - 2/3 BPM - 2/3 BPM - - - - Sets the BPM to 150% of the current value. - Sets the BPM to 150% of the current value. - - - - 3/2 BPM - 3/2 BPM - - - - Sets the BPM to 133% of the current value. - Sets the BPM to 133% of the current value. - - - - 4/3 BPM - 4/3 BPM - - - - Tap with the beat to set the BPM to the speed you are tapping. - Tap with the beat to set the BPM to the speed you are tapping. - - - - Tap to Beat - Tap to Beat - - - - Hint: Use the Library Analyze view to run BPM detection. - Hint: Use the Library Analyze view to run BPM detection. - - - - Save changes and close the window. - "OK" button - Save changes and close the window. - - - - &OK - &OK - - - - Discard changes and close the window. - "Cancel" button - Discard changes and close the window. - - - - Save changes and keep the window open. - "Apply" button - Save changes and keep the window open. - - - - &Apply - &Apply - - - - &Cancel - &Cancel - - - - (no color) - (pas de couleur) - - - - EffectChainPresetManager - - - Import effect chain preset - Import effect chain preset - - - - - Mixxx Effect Chain Presets - Mixxx Effect Chain Presets - - - - Error importing effect chain preset - Error importing effect chain preset - - - - Error importing effect chain preset "%1" - Error importing effect chain preset "%1" - - - - - imported - Importé - - - - duplicate - duplicate - - - - The effect chain imported from "%1" contains an effect that is not available: - The effect chain imported from "%1" contains an effect that is not available: - - - - If you load this chain preset, the unsupported effect will not be loaded with it. - If you load this chain preset, the unsupported effect will not be loaded with it. - - - - Export effect chain preset - Export effect chain preset - - - - Error exporting effect chain preset - Error exporting effect chain preset - - - - Could not save effect chain preset "%1" to file "%2". - Could not save effect chain preset "%1" to file "%2". - - - - Effect chain preset can not be renamed - La présélection de chaine d'effet ne peut pas être renommée - - - - Effect chain preset "%1" is read-only and can not be renamed. - Le préréglage de chaîne d'effet "%1" est en lecture seule et ne peut être renommé. - - - - Rename effect chain preset - Rename effect chain preset - - - - New name for effect chain preset - New name for effect chain preset - - - - - Effect chain preset name must not be empty. - Effect chain preset name must not be empty. - - - - - Invalid name "%1" - Nom "%1" invalide - - - - - An effect chain preset named "%1" already exists. - An effect chain preset named "%1" already exists. - - - - Error removing old effect chain preset - Error removing old effect chain preset - - - - Could not remove old effect chain preset "%1" - Could not remove old effect chain preset "%1" - - - - Effect chain preset can not be deleted - Le préréglage de chaîne d'effet ne peut être supprimé - - - - Effect chain preset "%1" is read-only and can not be deleted. - Le préréglage de chaîne d'effet "%1" est en lecture seule et ne peut être supprimé. - - - - Remove effect chain preset - Remove effect chain preset - - - - Are you sure you want to delete the effect chain preset "%1"? - Are you sure you want to delete the effect chain preset "%1"? - - - - Error deleting effect chain preset - Error deleting effect chain preset - - - - Could not delete effect chain preset "%1" - Could not delete effect chain preset "%1" - - - - Save preset for effect chain - Save preset for effect chain - - - - Name for new effect chain preset: - Name for new effect chain preset: - - - - Error saving effect chain preset - Error saving effect chain preset - - - - Could not save effect chain preset "%1" - Could not save effect chain preset "%1" - - - - EffectManifestTableModel - - - Type - Type - - - - Name - Nom - - - - EffectParameterSlotBase - - - No effect loaded. - No effect loaded. - - - - EffectsBackend - - - Built-In - Backend type for effects that are built into Mixxx. - Prédéfini - - - - Unknown - Backend type for effects were the backend is unknown. - Inconnu(e) - - - - EmptyWaveformWidget - - - Empty - Empty - - - - EngineBuffer - - - Soundtouch (faster) - Soundtouch (faster) - - - - Rubberband (better) - Rubberband (better) - - - - Rubberband R3 (near-hi-fi quality) - Rubberband R3 (qualité quasi-hi-fi) - - - - Unknown, using Rubberband (better) - Inconnu, utilisation de Rubberband (meilleure) - - - - ErrorDialogHandler - - - Fatal error - Fatal error - - - - Critical error - Critical error - - - - Warning - Warning - - - - Information - Information - - - - Question - Question - - - - FindOnWebMenuDiscogs - - - Artist - Artiste - - - - Artist + Title - Artiste + Titre - - - - Title - Titre - - - - Artist + Album - Artiste + Album - - - - Album - Album - - - - FindOnWebMenuLastfm - - - Artist - Artiste - - - - Artist + Title - Artiste + Titre - - - - Title - Titre - - - - Artist + Album - Artiste + Album - - - - Album - Album - - - - FindOnWebMenuSoundcloud - - - Artist - Artiste - - - - Artist + Title - Artiste + Titre - - - - Title - Titre - - - - Artist + Album - Artiste + Album - - - - Album - Album - - - - GLRGBWaveformWidget - - - RGB - RGB - - - - GLSLFilteredWaveformWidget - - - Filtered - Filtered - - - - GLSLRGBStackedWaveformWidget - - - RGB Stacked - RGB Stacked - - - - GLSLRGBWaveformWidget - - - RGB - RGB - - - - GLSimpleWaveformWidget - - - Simple - Simple - - - - GLVSyncTestWidget - - - VSyncTest - VSyncTest - - - - GLWaveformWidget - - - Filtered - Filtered - - - - HSVWaveformWidget - - - HSV - HSV - - - - ITunesFeature - - - - iTunes - iTunes - - - - Select your iTunes library - Select your iTunes library - - - - (loading) iTunes - (loading) iTunes - - - - Use Default Library - Use Default Library - - - - Choose Library... - Choose Library... - - - - Error Loading iTunes Library - Error Loading iTunes Library - - - - There was an error loading your iTunes library. Some of your iTunes tracks or playlists may not have loaded. - There was an error loading your iTunes library. Some of your iTunes tracks or playlists may not have loaded. - - - - LegacySkinParser - - - - Safe Mode Enabled - Shown when Mixxx is running in safe mode. - Safe Mode Enabled - - - - - No OpenGL -support. - Shown when Spinny can not be displayed. Please keep - unchanged ----------- -Shown when VuMeter can not be displayed. Please keep - unchanged - No OpenGL -support. - - - - activate - activate - - - - toggle - toggle - - - - right - right - - - - left - left - - - - right small - right small - - - - left small - left small - - - - up - up - - - - down - down - - - - up small - up small - - - - down small - down small - - - - Shortcut - Shortcut - - - - Library - - - Add Directory to Library - Add Directory to Library - - - - Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. - Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. - - - - LibraryFeature - - - Import Playlist - Importer une liste de lecture - - - - Playlist Files (*.m3u *.m3u8 *.pls *.csv) - Playlist Files (*.m3u *.m3u8 *.pls *.csv) - - - - Overwrite File? - Overwrite File? - - - - A playlist file with the name "%1" already exists. -The default "m3u" extension was added because none was specified. - -Do you really want to overwrite it? - A playlist file with the name "%1" already exists. -The default "m3u" extension was added because none was specified. - -Do you really want to overwrite it? - - - - LibraryScannerDlg - - - Library Scanner - Library Scanner - - - - It's taking Mixxx a minute to scan your music library, please wait... - It's taking Mixxx a minute to scan your music library, please wait... - - - - Cancel - Cancel - - - - Scanning: - Scanning: - - - - Scanning cover art (safe to cancel) - Scanning cover art (safe to cancel) - - - - LibraryTableModel - - - Sort items randomly - Sort items randomly - - - - MidiController - - - MIDI Controller - MIDI Controller - - - - MixxxControl(s) not found - MixxxControl(s) not found - - - - One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - One or more MixxxControls specified in the outputs section of the loaded mapping were invalid. - - - - * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - * Make sure the MixxxControls in question actually exist. Visit the manual for a complete list: - - - - Some LEDs or other feedback may not work correctly. - Some LEDs or other feedback may not work correctly. - - - - * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) - - * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) - - - - - MixxxDb - - - Click OK to exit. - Click OK to exit. - - - - Cannot upgrade database schema - Cannot upgrade database schema - - - - Unable to upgrade your database schema to version %1 - Unable to upgrade your database schema to version %1 - - - - For help with database issues consult: - For help with database issues consult: - - - - Your mixxxdb.sqlite file may be corrupt. - Your mixxxdb.sqlite file may be corrupt. - - - - Try renaming it and restarting Mixxx. - Try renaming it and restarting Mixxx. - - - - Your mixxxdb.sqlite file was created by a newer version of Mixxx and is incompatible. - Your mixxxdb.sqlite file was created by a newer version of Mixxx and is incompatible. - - - - The database schema file is invalid. - The database schema file is invalid. - - - - MixxxLibraryFeature - - - Missing Tracks - Missing Tracks - - - - Hidden Tracks - Hidden Tracks - - - - Export to Engine Prime - Export to Engine Prime - - - - Tracks - Tracks - - - - MixxxMainWindow - - - Sound Device Busy - Sound Device Busy - - - - <b>Retry</b> after closing the other application or reconnecting a sound device - <b>Retry</b> after closing the other application or reconnecting a sound device - - - - - - <b>Reconfigure</b> Mixxx's sound device settings. - <b>Reconfigure</b> Mixxx's sound device settings. - - - - - Get <b>Help</b> from the Mixxx Wiki. - Get <b>Help</b> from the Mixxx Wiki. - - - - - - <b>Exit</b> Mixxx. - <b>Exit</b> Mixxx. - - - - Retry - Retry - - - - skin - skin - - - - - Reconfigure - Reconfigure - - - - Help - Help - - - - - Exit - Exit - - - - - Mixxx was unable to open all the configured sound devices. - Mixxx was unable to open all the configured sound devices. - - - - Sound Device Error - Sound Device Error - - - - <b>Retry</b> after fixing an issue - <b>Retry</b> after fixing an issue - - - - No Output Devices - No Output Devices - - - - Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - - - - <b>Continue</b> without any outputs. - <b>Continue</b> without any outputs. - - - - Continue - Continue - - - - Load track to Deck %1 - Load track to Deck %1 - - - - Deck %1 is currently playing a track. - Deck %1 is currently playing a track. - - - - Are you sure you want to load a new track? - Are you sure you want to load a new track? - - - - There is no input device selected for this vinyl control. -Please select an input device in the sound hardware preferences first. - There is no input device selected for this vinyl control. -Please select an input device in the sound hardware preferences first. - - - - There is no input device selected for this passthrough control. -Please select an input device in the sound hardware preferences first. - There is no input device selected for this passthrough control. -Please select an input device in the sound hardware preferences first. - - - - There is no input device selected for this microphone. -Do you want to select an input device? - There is no input device selected for this microphone. -Do you want to select an input device? - - - - There is no input device selected for this auxiliary. -Do you want to select an input device? - There is no input device selected for this auxiliary. -Do you want to select an input device? - - - - Error in skin file - Error in skin file - - - - The selected skin cannot be loaded. - The selected skin cannot be loaded. - - - - OpenGL Direct Rendering - OpenGL Direct Rendering - - - - Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - - - - Confirm Exit - Confirm Exit - - - - A deck is currently playing. Exit Mixxx? - A deck is currently playing. Exit Mixxx? - - - - A sampler is currently playing. Exit Mixxx? - A sampler is currently playing. Exit Mixxx? - - - - The preferences window is still open. - The preferences window is still open. - - - - Discard any changes and exit Mixxx? - Discard any changes and exit Mixxx? - - - - MockNetworkReply - - - Operation canceled - Opération annulée - - - - PlaylistFeature - - - Lock - Verrouiller - - - - - Playlists - Playlists - - - - Unlock - Unlock - - - - Playlists are ordered lists of tracks that allow you to plan your DJ sets. - Playlists are ordered lists of tracks that allow you to plan your DJ sets. - - - - It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - It may be necessary to skip some tracks in your prepared playlist or add some different tracks in order to maintain the energy of your audience. - - - - Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - - - - When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - - - - Create New Playlist - Créer une nouvelle playlist - - - - QMessageBox - - - Upgrading Mixxx - Upgrading Mixxx - - - - Mixxx now supports displaying cover art. -Do you want to scan your library for cover files now? - Mixxx now supports displaying cover art. -Do you want to scan your library for cover files now? - - - - Scan - Scan - - - - Later - Later - - - - Upgrading Mixxx from v1.9.x/1.10.x. - Upgrading Mixxx from v1.9.x/1.10.x. - - - - Mixxx has a new and improved beat detector. - Mixxx has a new and improved beat detector. - - - - When you load tracks, Mixxx can re-analyze them and generate new, more accurate beatgrids. This will make automatic beatsync and looping more reliable. - When you load tracks, Mixxx can re-analyze them and generate new, more accurate beatgrids. This will make automatic beatsync and looping more reliable. - - - - This does not affect saved cues, hotcues, playlists, or crates. - This does not affect saved cues, hotcues, playlists, or crates. - - - - If you do not want Mixxx to re-analyze your tracks, choose "Keep Current Beatgrids". You can change this setting at any time from the "Beat Detection" section of the Preferences. - If you do not want Mixxx to re-analyze your tracks, choose "Keep Current Beatgrids". You can change this setting at any time from the "Beat Detection" section of the Preferences. - - - - Keep Current Beatgrids - Keep Current Beatgrids - - - - Generate New Beatgrids - Generate New Beatgrids - - - - QObject - - - Invalid - Invalid - - - - Note On - Note On - - - - Note Off - Note Off - - - - CC - CC - - - - Pitch Bend - Pitch Bend - - - - - Unknown (0x%1) - Unknown (0x%1) - - - - Normal - Normal - - - - Invert - Invert - - - - Rot64 - Rot64 - - - - Rot64Inv - Rot64Inv - - - - Rot64Fast - Rot64Fast - - - - Diff - Diff - - - - Button - Button - - - - Switch - Switch - - - - Spread64 - Spread64 - - - - HercJog - HercJog - - - - SelectKnob - SelectKnob - - - - SoftTakeover - SoftTakeover - - - - Script - Script - - - - 14-bit (LSB) - 14-bit (LSB) - - - - 14-bit (MSB) - 14-bit (MSB) - - - - Main - Main - - - - Booth - Booth - - - - Headphones - Headphones - - - - Left Bus - Left Bus - - - - Center Bus - Center Bus - - - - Right Bus - Right Bus - - - - Invalid Bus - Invalid Bus - - - - Deck - Deck - - - - Record/Broadcast - Record/Broadcast - - - - Vinyl Control - Vinyl Control - - - - Microphone - Microphone - - - - Auxiliary - Auxiliary - - - - - Unknown path type %1 - Unknown path type %1 - - - - Using Opus at samplerates other than 48 kHz is not supported by the Opus encoder. Please use 48000 Hz in "Sound Hardware" preferences or switch to a different encoding. - Using Opus at samplerates other than 48 kHz is not supported by the Opus encoder. Please use 48000 Hz in "Sound Hardware" preferences or switch to a different encoding. - - - - Encoder - Encoder - - - - Mixxx Needs Access to: %1 - Mixxx Needs Access to: %1 - - - - Your permission is required to access the following location: - -%1 - -After clicking OK, you will see a file picker. Please select '%2' to proceed or click Cancel if you don't want to grant Mixxx access and abort this action. - Your permission is required to access the following location: - -%1 - -After clicking OK, you will see a file picker. Please select '%2' to proceed or click Cancel if you don't want to grant Mixxx access and abort this action. - - - - You selected the wrong file. To grant Mixxx access, please select the file '%1'. If you do not want to continue, press Cancel. - You selected the wrong file. To grant Mixxx access, please select the file '%1'. If you do not want to continue, press Cancel. - - - - Upgrading old Mixxx settings - Upgrading old Mixxx settings - - - - Due to macOS sandboxing, Mixxx needs your permission to access your music library and settings from Mixxx versions before 2.3.0. After clicking OK, you will see a file selection dialog. - -To allow Mixxx to use your old library and settings, click the Open button in the file selection dialog. Mixxx will then move your old settings into the sandbox. This only needs to be done once. - -If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx will create a new music library and use default settings. - Due to macOS sandboxing, Mixxx needs your permission to access your music library and settings from Mixxx versions before 2.3.0. After clicking OK, you will see a file selection dialog. - -To allow Mixxx to use your old library and settings, click the Open button in the file selection dialog. Mixxx will then move your old settings into the sandbox. This only needs to be done once. - -If you do not want to grant Mixxx access, click Cancel on the file picker. Mixxx will create a new music library and use default settings. - - - - - Bit Depth - Bit Depth - - - - - Bitcrusher - Bitcrusher - - - - Adds noise by the reducing the bit depth and sample rate - Adds noise by the reducing the bit depth and sample rate - - - - The bit depth of the samples - The bit depth of the samples - - - - Downsampling - Downsampling - - - - Down - Down - - - - The sample rate to which the signal is downsampled - The sample rate to which the signal is downsampled - - - - - Echo - Echo - - - - - - - Time - Time - - - - - Ping Pong - Ping Pong - - - - - - - Send - Send - - - - How much of the signal to send into the delay buffer - How much of the signal to send into the delay buffer - - - - - - - Feedback - Feedback - - - - Stores the input signal in a temporary buffer and outputs it after a short time - Stores the input signal in a temporary buffer and outputs it after a short time - - - - - Delay time -1/8 - 2 beats if tempo is detected -1/8 - 2 seconds if no tempo is detected - Delay time -1/8 - 2 beats if tempo is detected -1/8 - 2 seconds if no tempo is detected - - - - Amount the echo fades each time it loops - Amount the echo fades each time it loops - - - - How much the echoed sound bounces between the left and right sides of the stereo field - How much the echoed sound bounces between the left and right sides of the stereo field - - - - - - - - - Quantize - Quantize - - - - Round the Time parameter to the nearest 1/4 beat. - Round the Time parameter to the nearest 1/4 beat. - - - - - - - - - - - - Triplets - Triplets - - - - When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - - - - - Filter - Filter - - - - Allows only high or low frequencies to play. - Allows only high or low frequencies to play. - - - - Low Pass Filter Cutoff - Low Pass Filter Cutoff - - - - - LPF - LPF - - - - - Corner frequency ratio of the low pass filter - Corner frequency ratio of the low pass filter - - - - Q - Q - - - - Resonance of the filters -Default: flat top - Resonance of the filters -Default: flat top - - - - High Pass Filter Cutoff - High Pass Filter Cutoff - - - - - HPF - HPF - - - - - Corner frequency ratio of the high pass filter - Corner frequency ratio of the high pass filter - - - - - - - Depth - Depth - - - - - Flanger - Flanger - - - - - Speed - Speed - - - - - Manual - Manuel - - - - Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - - - - Speed of the LFO (low frequency oscillator) -32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected -1/32 - 4 Hz if no tempo is detected - Speed of the LFO (low frequency oscillator) -32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected -1/32 - 4 Hz if no tempo is detected - - - - Delay amplitude of the LFO (low frequency oscillator) - Delay amplitude of the LFO (low frequency oscillator) - - - - Delay offset of the LFO (low frequency oscillator). -With width at zero, this allows for manually sweeping over the entire delay range. - Delay offset of the LFO (low frequency oscillator). -With width at zero, this allows for manually sweeping over the entire delay range. - - - - Regeneration - Regeneration - - - - Regen - Regen - - - - How much of the delay output is feed back into the input - How much of the delay output is feed back into the input - - - - - Intensity of the effect - Intensity of the effect - - - - - Divide rounded 1/2 beats of the Period parameter by 3. - Divide rounded 1/2 beats of the Period parameter by 3. - - - - - Mix - Mix - - - - - - - - - Width - Width - - - - Metronome - Metronome - - - - Adds a metronome click sound to the stream - Adds a metronome click sound to the stream - - - - BPM - BPM - - - - Set the beats per minute value of the click sound - Set the beats per minute value of the click sound - - - - Sync - Sync - - - - Synchronizes the BPM with the track if it can be retrieved - Synchronizes the BPM with the track if it can be retrieved - - - - - - - Period - Period - - - - - Autopan - Autopan - - - - Bounce the sound left and right across the stereo field - Bounce the sound left and right across the stereo field - - - - How fast the sound goes from one side to another -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - How fast the sound goes from one side to another -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - - - - Smoothing - Smoothing - - - - Smooth - Smooth - - - - How smoothly the signal goes from one side to the other - How smoothly the signal goes from one side to the other - - - - How far the signal goes to each side - How far the signal goes to each side - - - - Reverb - Réverbération - - - - Emulates the sound of the signal bouncing off the walls of a room - Emulates the sound of the signal bouncing off the walls of a room - - - - - Decay - Decay - - - - Lower decay values cause reverberations to fade out more quickly. - Lower decay values cause reverberations to fade out more quickly. - - - - Bandwidth of the low pass filter at the input. -Higher values result in less attenuation of high frequencies. - Bandwidth of the low pass filter at the input. -Higher values result in less attenuation of high frequencies. - - - - How much of the signal to send in to the effect - How much of the signal to send in to the effect - - - - Bandwidth - Bandwidth - - - - BW - BW - - - - - Damping - Damping - - - - Higher damping values cause high frequencies to decay more quickly than low frequencies. - Higher damping values cause high frequencies to decay more quickly than low frequencies. - - - - - - Low - Low - - - - - - Gain for Low Filter - Gain for Low Filter - - - - Kill Low - Kill Low - - - - Kill the Low Filter - Kill the Low Filter - - - - Mid - Mid - - - - Bessel4 LV-Mix Isolator - Bessel4 LV-Mix Isolator - - - - Bessel4 ISO - Bessel4 ISO - - - - A Bessel 4th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -24 dB/octave). - A Bessel 4th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -24 dB/octave). - - - - Gain for Mid Filter - Gain for Mid Filter - - - - Kill Mid - Kill Mid - - - - Kill the Mid Filter - Kill the Mid Filter - - - - High - High - - - - - Gain for High Filter - Gain for High Filter - - - - Kill High - Kill High - - - - Kill the High Filter - Kill the High Filter - - - - To adjust frequency shelves, go to Preferences -> Mixer. - - - - - Graphic Equalizer - Graphic Equalizer - - - - Graphic EQ - Graphic EQ - - - - An 8-band graphic equalizer based on biquad filters - An 8-band graphic equalizer based on biquad filters - - - - Gain for Band Filter %1 - Gain for Band Filter %1 - - - - Moog Ladder 4 Filter - Moog Ladder 4 Filter - - - - Moog Filter - Moog Filter - - - - A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation - A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation - - - - Res - Res - - - - - Resonance - Resonance - - - - Resonance of the filters. 4 = self oscillating - Resonance of the filters. 4 = self oscillating - - - - Gain for Low Filter (neutral at 1.0) - Gain for Low Filter (neutral at 1.0) - - - - Network stream - Network stream - - - - - Phaser - Phaser - - - - - Stereo - Stereo - - - - - Stages - Stages - - - - Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - - - - Period of the LFO (low frequency oscillator) -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - Period of the LFO (low frequency oscillator) -1/4 - 4 beats rounded to 1/2 beat if tempo is detected -1/4 - 4 seconds if no tempo is detected - - - - Controls how much of the output signal is looped - Controls how much of the output signal is looped - - - - - - - Range - Range - - - - Controls the frequency range across which the notches sweep. - Controls the frequency range across which the notches sweep. - - - - Number of stages - Number of stages - - - - Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - - - - %1 minutes - %1 minutes - - - - %1:%2 - %1:%2 - - - - Ctrl+t - Ctrl+t - - - - Ctrl+y - Ctrl+y - - - - Ctrl+u - Ctrl+u - - - - Ctrl+i - Ctrl+i - - - - Ctrl+o - Ctrl+o - - - - Ctrl+Shift+O - Ctrl+Shift+O - - - - Ctrl+, - Ctrl+, - - - - Ctrl+P - Ctrl+P - - - - Bessel8 LV-Mix Isolator - Bessel8 LV-Mix Isolator - - - - Bessel8 ISO - Bessel8 ISO - - - - A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave). - A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave). - - - - LinkwitzRiley8 Isolator - LinkwitzRiley8 Isolator - - - - LR8 ISO - LR8 ISO - - - - A Linkwitz-Riley 8th-order filter isolator (optimized crossover, constant phase shift, roll-off -48 dB/octave). - A Linkwitz-Riley 8th-order filter isolator (optimized crossover, constant phase shift, roll-off -48 dB/octave). - - - - Biquad Equalizer - Biquad Equalizer - - - - BQ EQ - BQ EQ - - - - A 3-band Equalizer with two biquad bell filters, a shelving high pass and kill switches. - A 3-band Equalizer with two biquad bell filters, a shelving high pass and kill switches. - - - - Device not found - Device not found - - - - Biquad Full Kill Equalizer - Biquad Full Kill Equalizer - - - - BQ EQ/ISO - BQ EQ/ISO - - - - A 3-band Equalizer that combines an Equalizer and an Isolator circuit to offer gentle slopes and full kill. - A 3-band Equalizer that combines an Equalizer and an Isolator circuit to offer gentle slopes and full kill. - - - - Loudness Contour - Loudness Contour - - - - - - Loudness - Loudness - - - - Amplifies low and high frequencies at low volumes to compensate for reduced sensitivity of the human ear. - Amplifies low and high frequencies at low volumes to compensate for reduced sensitivity of the human ear. - - - - Set the gain of the applied loudness contour - Set the gain of the applied loudness contour - - - - - Use Gain - Use Gain - - - - Follow Gain Knob - Follow Gain Knob - - - - This stream is online for testing purposes! - This stream is online for testing purposes! - - - - Live Mix - Live Mix - - - - - 16 bits - 16 bits - - - - - 24 bits - 24 bits - - - - - Bit depth - Bit depth - - - - - Bitrate Mode - Bitrate Mode - - - - 32 bits float - 32 bits float - - - - - - Balance - Balance - - - - Adjust the left/right balance and stereo width - Adjust the left/right balance and stereo width - - - - Adjust balance between left and right channels - Adjust balance between left and right channels - - - - - Mid/Side - Mid/Side - - - - Bypass Fr. - Bypass Fr. - - - - Bypass Frequency - Bypass Frequency - - - - Stereo Balance - Stereo Balance - - - - Adjust stereo width by changing balance between middle and side of the signal. -Fully left: mono -Fully right: only side ambiance -Center: does not change the original signal. - Adjust stereo width by changing balance between middle and side of the signal. -Fully left: mono -Fully right: only side ambiance -Center: does not change the original signal. - - - - Frequencies below this cutoff are not adjusted in the stereo field - Frequencies below this cutoff are not adjusted in the stereo field - - - - Parametric Equalizer - Parametric Equalizer - - - - Param EQ - Param EQ - - - - An gentle 2-band parametric equalizer based on biquad filters. -It is designed as a complement to the steep mixing equalizers. - An gentle 2-band parametric equalizer based on biquad filters. -It is designed as a complement to the steep mixing equalizers. - - - - - Gain 1 - Gain 1 - - - - Gain for Filter 1 - Gain for Filter 1 - - - - - Q 1 - Q 1 - - - - Controls the bandwidth of Filter 1. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - Controls the bandwidth of Filter 1. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - - - - - Center 1 - Center 1 - - - - Center frequency for Filter 1, from 100 Hz to 14 kHz - Center frequency for Filter 1, from 100 Hz to 14 kHz - - - - - Gain 2 - Gain 2 - - - - Gain for Filter 2 - Gain for Filter 2 - - - - - Q 2 - Q 2 - - - - Controls the bandwidth of Filter 2. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - Controls the bandwidth of Filter 2. -A lower Q affects a wider band of frequencies, -a higher Q affects a narrower band of frequencies. - - - - - Center 2 - Center 2 - - - - Center frequency for Filter 2, from 100 Hz to 14 kHz - Center frequency for Filter 2, from 100 Hz to 14 kHz - - - - - Tremolo - Tremolo - - - - Cycles the volume up and down - Cycles the volume up and down - - - - How much the effect changes the volume - How much the effect changes the volume - - - - - Rate - Rate - - - - Rate of the volume changes -4 beats - 1/8 beat if tempo is detected -1/4 Hz - 8 Hz if no tempo is detected - Rate of the volume changes -4 beats - 1/8 beat if tempo is detected -1/4 Hz - 8 Hz if no tempo is detected - - - - Width of the volume peak -10% - 90% of the effect period - Width of the volume peak -10% - 90% of the effect period - - - - Shape of the volume modulation wave -Fully left: Square wave -Fully right: Sine wave - Shape of the volume modulation wave -Fully left: Square wave -Fully right: Sine wave - - - - When the Quantize parameter is enabled, divide the effect period by 3. - When the Quantize parameter is enabled, divide the effect period by 3. - - - - - Waveform - Waveform - - - - - Phase - Phase - - - - Shifts the position of the volume peak within the period -Fully left: beginning of the effect period -Fully right: end of the effect period - Shifts the position of the volume peak within the period -Fully left: beginning of the effect period -Fully right: end of the effect period - - - - Round the Rate parameter to the nearest whole division of a beat. - Round the Rate parameter to the nearest whole division of a beat. - - - - Triplet - Triplet - - - - - Queen Mary University London - Queen Mary University London - - - - Queen Mary Tempo and Beat Tracker - Queen Mary Tempo and Beat Tracker - - - - Queen Mary Key Detector - Queen Mary Key Detector - - - - SoundTouch BPM Detector (Legacy) - SoundTouch BPM Detector (Legacy) - - - - Constrained VBR - Constrained VBR - - - - CBR - CBR - - - - Full VBR (bitrate ignored) - Full VBR (bitrate ignored) - - - - White Noise - White Noise - - - - Mix white noise with the input signal - Mix white noise with the input signal - - - - Dry/Wet - Dry/Wet - - - - Crossfade the noise with the dry signal - Crossfade the noise with the dry signal - - - - <html>Mixxx cannot record or stream in AAC or HE-AAC without the FDK-AAC encoder. In order to record or stream in AAC or AAC+, you need to download <b>libfdk-aac</b> and install it on your system. - <html>Mixxx cannot record or stream in AAC or HE-AAC without the FDK-AAC encoder. In order to record or stream in AAC or AAC+, you need to download <b>libfdk-aac</b> and install it on your system. - - - - The installed AAC encoding library does not support HE-AAC, only plain AAC. Configure a different encoding format in the preferences. - The installed AAC encoding library does not support HE-AAC, only plain AAC. Configure a different encoding format in the preferences. - - - - MP3 encoding is not supported. Lame could not be initialized - MP3 encoding is not supported. Lame could not be initialized - - - - OGG recording is not supported. OGG/Vorbis library could not be initialized. - OGG recording is not supported. OGG/Vorbis library could not be initialized. - - - - - encoder failure - encoder failure - - - - - Failed to apply the selected settings. - Failed to apply the selected settings. - - - - Deck %1 - Deck %1 - - - - Location - Emplacement - - - - - - Playlist Export Failed - Échec de l'exportation de liste de lecture - - - - - - - Could not create file - Impossible de créer le fichier - - - - Readable text Export Failed - Readable text Export Failed - - - - Playlist Export Has Special Characters - Playlist Export Has Special Characters - - - - Some file paths in the playlist have special characters. These file paths will be encoded as absolute path URLs. Please select the m3u8 format for better and lossless exporting. - Some file paths in the playlist have special characters. These file paths will be encoded as absolute path URLs. Please select the m3u8 format for better and lossless exporting. - - - - - Pitch Shift - Pitch Shift - - - - Raises or lowers the original pitch of a sound. - Raises or lowers the original pitch of a sound. - - - - - Pitch - Pitch - - - - The pitch shift applied to the sound. - The pitch shift applied to the sound. - - - - The range of the Pitch knob (0 - 2 octaves). - - - - - - - Semitones - - - - - Change the pitch in semitone steps instead of continuously. - - - - - - Formant - - - - - Preserve the resonant frequencies (formants) of the human vocal tract and other instruments. -Hint: compensates "chipmunk" or "growling" voices - - - - - - Distortion - - - - - Hard Clip - - - - - Hard - - - - - Switches between soft saturation and hard clipping. - - - - - Soft Clipping - - - - - Hard Clipping - - - - - - Drive - - - - - The amount of amplification applied to the audio signal. At higher levels the audio will be more distored. - - - - - Passthrough - Passerelle - - - - - Glitch - Interférence - - - - Periodically samples and repeats a small portion of audio to create a glitchy metallic sound. - Échantillonne périodiquement et répète une petite portion de l'audio pour créer un son métallique défectueux. - - - - Round the Time parameter to the nearest 1/8 beat. - - - - - When the Quantize parameter is enabled, divide rounded 1/8 beats of Time parameter by 3. - - - - - (empty) - - - - - QtHSVWaveformWidget - - - HSV - HSV - - - - QtRGBWaveformWidget - - - RGB - RGB - - - - QtSimpleWaveformWidget - - - Simple - Simple - - - - QtVSyncTestWidget - - - VSyncTest - VSyncTest - - - - QtWaveformWidget - - - Filtered - Filtered - - - - RGBWaveformWidget - - - RGB - RGB - - - - RecordingFeature - - - Recordings - Recordings - - - - RecordingManager - - - Low Disk Space Warning - Low Disk Space Warning - - - - There is less than 1 GiB of usable space in the recording folder - Il reste moins d'un gigaoctet d'espace disponible dans le dossier d'enregistrement - - - - Recording - Recording - - - - Could not create audio file for recording! - Could not create audio file for recording! - - - - Ensure there is enough free disk space and you have write permission for the Recordings folder. - Ensure there is enough free disk space and you have write permission for the Recordings folder. - - - - You can change the location of the Recordings folder in Preferences -> Recording. - You can change the location of the Recordings folder in Preferences -> Recording. - - - - RecordingsView - - - - Message shown to user when recording an audio file. %1 is the file path and %2 is the current size of the recording in megabytes (MB) - - - - - RekordboxFeature - - - - - Rekordbox - Rekordbox - - - - Playlists - Playlists - - - - Folders - Folders - - - - Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - Reads databases exported for Pioneer CDJ / XDJ players using the Rekordbox Export mode.<br/>Rekordbox can only export to USB or SD devices with a FAT or HFS file system.<br/>Mixxx can read a database from any device that contains the database folders (<tt>PIONEER</tt> and <tt>Contents</tt>).<br/>Not supported are Rekordbox databases that have been moved to an external device via<br/><i>Preferences > Advanced > Database management</i>.<br/><br/>The following data is read: - - - - Hot cues - Hot cues - - - - Loops (only the first loop is currently usable in Mixxx) - Loops (only the first loop is currently usable in Mixxx) - - - - Check for attached Rekordbox USB / SD devices (refresh) - Check for attached Rekordbox USB / SD devices (refresh) - - - - Beatgrids - Beatgrids - - - - Memory cues - Memory cues - - - - (loading) Rekordbox - (loading) Rekordbox - - - - RhythmboxFeature - - - - Rhythmbox - Rhythmbox - - - - SamplerBank - - - Mixxx Sampler Banks (*.xml) - Banques d'échantillon Mixxx (*.xml) - - - - Save Sampler Bank - Save Sampler Bank - - - - Error Saving Sampler Bank - Error Saving Sampler Bank - - - - Could not write the sampler bank to '%1'. - Could not write the sampler bank to '%1'. - - - - Load Sampler Bank - Load Sampler Bank - - - - Error Reading Sampler Bank - Error Reading Sampler Bank - - - - Could not open the sampler bank file '%1'. - Could not open the sampler bank file '%1'. - - - - SeratoFeature - - - - - Serato - Serato - - - - Reads the following from the Serato Music directory and removable devices: - Reads the following from the Serato Music directory and removable devices: - - - - Tracks - Tracks - - - - Crates - Caisses - - - - Check for Serato databases (refresh) - Check for Serato databases (refresh) - - - - (loading) Serato - (loading) Serato - - - - SetlogFeature - - - Join with previous (below) - Join with previous (below) - - - - Mark all tracks played) - - - - - Finish current and start new - Finish current and start new - - - - Lock all child playlists - - - - - Unlock all child playlists - - - - - Delete all unlocked child playlists - - - - - History - History - - - - Unlock - Unlock - - - - Lock - Verrouiller - - - - - Confirm Deletion - Confirmer la suppression - - - - Do you really want to delete all unlocked playlist from <b>%1</b>?<br><br> - %1 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - - - - - Deleting %1 playlists from <b>%2</b>.<br><br> - %1 is the number of playlists to be deleted %2 is the year <b> + </b> are used to make the text in between bold in the popup <br> is a linebreak - - - - - ShoutConnection - - - - Mixxx encountered a problem - Mixxx encountered a problem - - - - Could not allocate shout_t - Could not allocate shout_t - - - - Could not allocate shout_metadata_t - Could not allocate shout_metadata_t - - - - Error setting non-blocking mode: - Error setting non-blocking mode: - - - - Error setting tls mode: - Error setting tls mode: - - - - Error setting hostname! - Error setting hostname! - - - - Error setting port! - Error setting port! - - - - Error setting password! - Error setting password! - - - - Error setting mount! - Error setting mount! - - - - Error setting username! - Error setting username! - - - - Error setting stream name! - Error setting stream name! - - - - Error setting stream description! - Error setting stream description! - - - - Error setting stream genre! - Error setting stream genre! - - - - Error setting stream url! - Error setting stream url! - - - - Error setting stream IRC! - Error setting stream IRC! - - - - Error setting stream AIM! - Error setting stream AIM! - - - - Error setting stream ICQ! - Error setting stream ICQ! - - - - Error setting stream public! - Error setting stream public! - - - - Unknown stream encoding format! - Unknown stream encoding format! - - - - Use a libshout version with %1 enabled - Use a libshout version with %1 enabled - - - - Error setting stream encoding format! - Error setting stream encoding format! - - - - Broadcasting at 96 kHz with Ogg Vorbis is not currently supported. Please try a different sample rate or switch to a different encoding. - Broadcasting at 96 kHz with Ogg Vorbis is not currently supported. Please try a different sample rate or switch to a different encoding. - - - - See https://github.com/mixxxdj/mixxx/issues/5701 for more information. - - - - - Unsupported sample rate - Unsupported sample rate - - - - Error setting bitrate - Error setting bitrate - - - - Error: unknown server protocol! - Error: unknown server protocol! - - - - Error: Shoutcast only supports MP3 and AAC encoders - Error: Shoutcast only supports MP3 and AAC encoders - - - - Error setting protocol! - Error setting protocol! - - - - Network cache overflow - Network cache overflow - - - - Connection error - Connection error - - - - One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - - - - Connection message - Connection message - - - - <b>Message from Live Broadcasting connection '%1':</b><br> - <b>Message from Live Broadcasting connection '%1':</b><br> - - - - Lost connection to streaming server and %1 attempts to reconnect have failed. - Lost connection to streaming server and %1 attempts to reconnect have failed. - - - - Lost connection to streaming server. - Lost connection to streaming server. - - - - Please check your connection to the Internet. - Please check your connection to the Internet. - - - - Can't connect to streaming server - Can't connect to streaming server - - - - Please check your connection to the Internet and verify that your username and password are correct. - Please check your connection to the Internet and verify that your username and password are correct. - - - - SoftwareWaveformWidget - - - Filtered - Filtered - - - - SoundManager - - - - a device - a device - - - - An unknown error occurred - An unknown error occurred - - - - Two outputs cannot share channels on "%1" - Two outputs cannot share channels on "%1" - - - - Error opening "%1" - Error opening "%1" - - - - StatModel - - - Name - Nom - - - - Count - Count - - - - Type - Type - - - - Units - Units - - - - Sum - Sum - - - - Min - Min - - - - Max - Max - - - - Mean - Mean - - - - Variance - Variance - - - - Standard Deviation - Standard Deviation - - - - TagFetcher - - - Fingerprinting track - Fingerprinting track - - - - Identifying track through Acoustid - Identifying track through Acoustid - - - - Retrieving metadata from MusicBrainz - Retrieving metadata from MusicBrainz - - - - Tooltips - - - Reset to default value. - Reset to default value. - - - - Left-click - Left-click - - - - Right-click - Right-click - - - - Double-click - Double-click - - - - Scroll-wheel - Scroll-wheel - - - - Shift-key - Shift-key - - - - loop active - loop active - - - - loop inactive - loop inactive - - - - Effects within the chain must be enabled to hear them. - Effects within the chain must be enabled to hear them. - - - - Waveform Overview - Waveform Overview - - - - Use the mouse to scratch, spin-back or throw tracks. - Use the mouse to scratch, spin-back or throw tracks. - - - - Waveform Display - Waveform Display - - - - Shows the loaded track's waveform near the playback position. - Shows the loaded track's waveform near the playback position. - - - - Drag with mouse to make temporary pitch adjustments. - Drag with mouse to make temporary pitch adjustments. - - - - Scroll to change the waveform zoom level. - Scroll to change the waveform zoom level. - - - - Waveform Zoom Out - Waveform Zoom Out - - - - Waveform Zoom In - Waveform Zoom In - - - - Waveform Zoom - Waveform Zoom - - - - - Spinning Vinyl - Spinning Vinyl - - - - Rotates during playback and shows the position of a track. - Rotates during playback and shows the position of a track. - - - - Right click to show cover art of loaded track. - Right click to show cover art of loaded track. - - - - Gain - Gain - - - - Adjusts the pre-fader gain of the track (to avoid clipping). - Adjusts the pre-fader gain of the track (to avoid clipping). - - - - (too loud for the hardware and is being distorted). - (too loud for the hardware and is being distorted). - - - - Indicates when the signal on the channel is clipping, - Indicates when the signal on the channel is clipping, - - - - Channel Volume Meter - Channel Volume Meter - - - - Shows the current channel volume. - Shows the current channel volume. - - - - Microphone Volume Meter - Microphone Volume Meter - - - - Shows the current microphone volume. - Shows the current microphone volume. - - - - Auxiliary Volume Meter - Auxiliary Volume Meter - - - - Shows the current auxiliary volume. - Shows the current auxiliary volume. - - - - Auxiliary Peak Indicator - Auxiliary Peak Indicator - - - - Indicates when the signal on the auxiliary is clipping, - Indicates when the signal on the auxiliary is clipping, - - - - Volume Control - Volume Control - - - - Adjusts the volume of the selected channel. - Adjusts the volume of the selected channel. - - - - Booth Gain - Booth Gain - - - - Adjusts the booth output gain. - Adjusts the booth output gain. - - - - Crossfader - Crossfader - - - - Balance - Balance - - - - Headphone Volume - Headphone Volume - - - - Adjusts the headphone output volume. - Adjusts the headphone output volume. - - - - Headphone Gain - Headphone Gain - - - - Adjusts the headphone output gain. - Adjusts the headphone output gain. - - - - Headphone Mix - Headphone Mix - - - - Headphone Split Cue - Headphone Split Cue - - - - Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - - - - Microphone - Microphone - - - - Show/hide the Microphone section. - Show/hide the Microphone section. - - - - Sampler - Sampler - - - - Show/hide the Sampler section. - Show/hide the Sampler section. - - - - Vinyl Control - Vinyl Control - - - - Show/hide the Vinyl Control section. - Show/hide the Vinyl Control section. - - - - Preview Deck - Platine de pré-écoute - - - - Show/hide the Preview deck. - Show/hide the Preview deck. - - - - - - Cover Art - Couverture - - - - Show/hide Cover Art. - Show/hide Cover Art. - - - - Toggle 4 Decks - Toggle 4 Decks - - - - Switches between showing 2 decks and 4 decks. - Switches between showing 2 decks and 4 decks. - - - - Show Library - Show Library - - - - Show or hide the track library. - Show or hide the track library. - - - - Show Effects - Show Effects - - - - Show or hide the effects. - Show or hide the effects. - - - - Toggle Mixer - Toggle Mixer - - - - Show or hide the mixer. - Show or hide the mixer. - - - - Show/hide volume meters for channels and main output. - - - - - Microphone Volume - Microphone Volume - - - - Adjusts the microphone volume. - Adjusts the microphone volume. - - - - Microphone Gain - Microphone Gain - - - - Adjusts the pre-fader microphone gain. - Adjusts the pre-fader microphone gain. - - - - Auxiliary Gain - Auxiliary Gain - - - - Adjusts the pre-fader auxiliary gain. - Adjusts the pre-fader auxiliary gain. - - - - Microphone Talk-Over - Microphone Talk-Over - - - - Hold-to-talk or short click for latching to - Hold-to-talk or short click for latching to - - - - Microphone Talkover Mode - Microphone Talkover Mode - - - - Off: Do not reduce music volume - Off: Do not reduce music volume - - - - Manual: Reduce music volume by a fixed amount set by the Strength knob. - Manual: Reduce music volume by a fixed amount set by the Strength knob. - - - - Behavior depends on Microphone Talkover Mode: - Behavior depends on Microphone Talkover Mode: - - - - Off: Does nothing - Off: Does nothing - - - - Change the step-size in the Preferences -> Decks menu. - - - - - Raise Pitch - Raise Pitch - - - - Sets the pitch higher. - Sets the pitch higher. - - - - Sets the pitch higher in small steps. - Sets the pitch higher in small steps. - - - - Lower Pitch - Lower Pitch - - - - Sets the pitch lower. - Sets the pitch lower. - - - - Sets the pitch lower in small steps. - Sets the pitch lower in small steps. - - - - Raise Pitch Temporary (Nudge) - Raise Pitch Temporary (Nudge) - - - - Holds the pitch higher while active. - Holds the pitch higher while active. - - - - Holds the pitch higher (small amount) while active. - Holds the pitch higher (small amount) while active. - - - - Lower Pitch Temporary (Nudge) - Lower Pitch Temporary (Nudge) - - - - Holds the pitch lower while active. - Holds the pitch lower while active. - - - - Holds the pitch lower (small amount) while active. - Holds the pitch lower (small amount) while active. - - - - Low EQ - Low EQ - - - - Adjusts the gain of the low EQ filter. - Adjusts the gain of the low EQ filter. - - - - Mid EQ - Mid EQ - - - - Adjusts the gain of the mid EQ filter. - Adjusts the gain of the mid EQ filter. - - - - High EQ - High EQ - - - - Adjusts the gain of the high EQ filter. - Adjusts the gain of the high EQ filter. - - - - Hold-to-kill or short click for latching. - Hold-to-kill or short click for latching. - - - - High EQ Kill - High EQ Kill - - - - Holds the gain of the high EQ to zero while active. - Holds the gain of the high EQ to zero while active. - - - - Mid EQ Kill - Mid EQ Kill - - - - Holds the gain of the mid EQ to zero while active. - Holds the gain of the mid EQ to zero while active. - - - - Low EQ Kill - Low EQ Kill - - - - Holds the gain of the low EQ to zero while active. - Holds the gain of the low EQ to zero while active. - - - - Displays the tempo of the loaded track in BPM (beats per minute). - Displays the tempo of the loaded track in BPM (beats per minute). - - - - Tempo - Tempo - - - - Key - The musical key of a track - Clé - - - - BPM Tap - BPM Tap - - - - - When tapped repeatedly, adjusts the BPM to match the tapped BPM. - When tapped repeatedly, adjusts the BPM to match the tapped BPM. - - - - Adjust BPM Down - Adjust BPM Down - - - - When tapped, adjusts the average BPM down by a small amount. - When tapped, adjusts the average BPM down by a small amount. - - - - Adjust BPM Up - Adjust BPM Up - - - - When tapped, adjusts the average BPM up by a small amount. - When tapped, adjusts the average BPM up by a small amount. - - - - Adjust Beats Earlier - Adjust Beats Earlier - - - - When tapped, moves the beatgrid left by a small amount. - When tapped, moves the beatgrid left by a small amount. - - - - Adjust Beats Later - Adjust Beats Later - - - - When tapped, moves the beatgrid right by a small amount. - When tapped, moves the beatgrid right by a small amount. - - - - Tempo and BPM Tap - Tempo and BPM Tap - - - - Show/hide the spinning vinyl section. - Show/hide the spinning vinyl section. - - - - Keylock - Keylock - - - - Toggling keylock during playback may result in a momentary audio glitch. - Toggling keylock during playback may result in a momentary audio glitch. - - - - Toggle visibility of Loop Controls - Toggle visibility of Loop Controls - - - - Toggle visibility of Beatjump Controls - Toggle visibility of Beatjump Controls - - - - Toggle visibility of Rate Control - Toggle visibility of Rate Control - - - - Toggle visibility of Key Controls - Toggle visibility of Key Controls - - - - (while previewing) - (while previewing) - - - - Places a cue point at the current position on the waveform. - Places a cue point at the current position on the waveform. - - - - Stops track at cue point, OR go to cue point and play after release (CUP mode). - Stops track at cue point, OR go to cue point and play after release (CUP mode). - - - - Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - - - - Is latching the playing state. - Is latching the playing state. - - - - Seeks the track to the cue point and stops. - Seeks the track to the cue point and stops. - - - - Play - Play - - - - Plays track from the cue point. - Plays track from the cue point. - - - - Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - Sends the selected channel's audio to the headphone output, selected in Preferences -> Sound Hardware. - - - - (This skin should be updated to use Sync Lock!) - (This skin should be updated to use Sync Lock!) - - - - Enable Sync Lock - Enable Sync Lock - - - - Tap to sync the tempo to other playing tracks or the sync leader. - Tap to sync the tempo to other playing tracks or the sync leader. - - - - Enable Sync Leader - Enable Sync Leader - - - - When enabled, this device will serve as the sync leader for all other decks. - When enabled, this device will serve as the sync leader for all other decks. - - - - This is relevant when a dynamic tempo track is loaded to a sync leader deck.In that case, other synced devices will adopt the changing tempo. - - - - - Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - - - - Tempo Range Display - Tempo Range Display - - - - Displays the current range of the tempo slider. - Displays the current range of the tempo slider. - - - - Un-ejects when no track is loaded, i.e. reloads the track that was ejected last (of any deck). - - - - - Delete selected hotcue. - Delete selected hotcue. - - - - Track Comment - - - - - Displays the comment tag of the loaded track. - - - - - Opens separate artwork viewer. - Opens separate artwork viewer. - - - - Effect Chain Preset Settings - Effect Chain Preset Settings - - - - Show the effect chain settings menu for this unit. - Show the effect chain settings menu for this unit. - - - - Select and configure a hardware device for this input - Select and configure a hardware device for this input - - - - Recording Duration - Recording Duration - - - - Big Spinny/Cover Art - Big Spinny/Cover Art - - - - Show a big version of the Spinny or track cover art if enabled. - Show a big version of the Spinny or track cover art if enabled. - - - - Main Output Peak Indicator - Main Output Peak Indicator - - - - Indicates when the signal on the main output is clipping, - Indicates when the signal on the main output is clipping, - - - - Main Output L Peak Indicator - Main Output L Peak Indicator - - - - Indicates when the left signal on the main output is clipping, - Indicates when the left signal on the main output is clipping, - - - - Main Output R Peak Indicator - Main Output R Peak Indicator - - - - Indicates when the right signal on the main output is clipping, - Indicates when the right signal on the main output is clipping, - - - - Main Channel L Volume Meter - Main Channel L Volume Meter - - - - Shows the current volume for the left channel of the main output. - Shows the current volume for the left channel of the main output. - - - - Shows the current volume for the right channel of the main output. - Shows the current volume for the right channel of the main output. - - - - - Main Output Gain - Main Output Gain - - - - - Adjusts the main output gain. - Adjusts the main output gain. - - - - Determines the main output by fading between the left and right channels. - Determines the main output by fading between the left and right channels. - - - - Adjusts the left/right channel balance on the main output. - Adjusts the left/right channel balance on the main output. - - - - Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - Crossfades the headphone output between the main mix and cueing (PFL or Pre-Fader Listening) signal. - - - - If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - If activated, the main mix signal plays in the right channel, while the cueing signal plays in the left channel. - - - - Show/hide Cover Art of the selected track in the library. - Show/hide Cover Art of the selected track in the library. - - - - Show/hide the scrolling waveforms - Show/hide the scrolling waveforms - - - - Show/hide the beatgrid controls section - Show/hide the beatgrid controls section - - - - Hide all skin sections except the decks to have more screen space for the track library. - Hide all skin sections except the decks to have more screen space for the track library. - - - - Volume Meters - Volume Meters - - - - mix microphone input into the main output. - mix microphone input into the main output. - - - - Auto: Automatically reduce music volume when microphone volume rises above threshold. - Auto: Automatically reduce music volume when microphone volume rises above threshold. - - - - - Adjust the amount the music volume is reduced with the Strength knob. - Adjust the amount the music volume is reduced with the Strength knob. - - - - Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - Auto: Sets how much to reduce the music volume when the volume of active microphones rises above threshold. - - - - Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs. - - - - Shift cues earlier - Shift cues earlier - - - - - Shift cues imported from Serato or Rekordbox if they are slightly off time. - Shift cues imported from Serato or Rekordbox if they are slightly off time. - - - - Left click: shift 10 milliseconds earlier - Left click: shift 10 milliseconds earlier - - - - Right click: shift 1 millisecond earlier - Right click: shift 1 millisecond earlier - - - - Shift cues later - Shift cues later - - - - Left click: shift 10 milliseconds later - Left click: shift 10 milliseconds later - - - - Right click: shift 1 millisecond later - Right click: shift 1 millisecond later - - - - Mutes the selected channel's audio in the main output. - Mutes the selected channel's audio in the main output. - - - - Main mix enable - Main mix enable - - - - Hold or short click for latching to mix this input into the main output. - Hold or short click for latching to mix this input into the main output. - - - - Displays the duration of the running recording. - Displays the duration of the running recording. - - - - Auto DJ is active - Auto DJ is active - - - - Hot Cue - Track will seek to nearest previous hotcue point. - Hot Cue - Track will seek to nearest previous hotcue point. - - - - Sets the track Loop-In Marker to the current play position. - Sets the track Loop-In Marker to the current play position. - - - - Press and hold to move Loop-In Marker. - Press and hold to move Loop-In Marker. - - - - Jump to Loop-In Marker. - Jump to Loop-In Marker. - - - - Sets the track Loop-Out Marker to the current play position. - Sets the track Loop-Out Marker to the current play position. - - - - Press and hold to move Loop-Out Marker. - Press and hold to move Loop-Out Marker. - - - - Jump to Loop-Out Marker. - Jump to Loop-Out Marker. - - - - Beatloop Size - Beatloop Size - - - - Select the size of the loop in beats to set with the Beatloop button. - Select the size of the loop in beats to set with the Beatloop button. - - - - Changing this resizes the loop if the loop already matches this size. - Changing this resizes the loop if the loop already matches this size. - - - - Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - - - - Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - - - - Start a loop over the set number of beats. - Start a loop over the set number of beats. - - - - Temporarily enable a rolling loop over the set number of beats. - Temporarily enable a rolling loop over the set number of beats. - - - - Beatjump/Loop Move Size - Beatjump/Loop Move Size - - - - Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - - - - Beatjump Forward - Beatjump Forward - - - - Jump forward by the set number of beats. - Jump forward by the set number of beats. - - - - Move the loop forward by the set number of beats. - Move the loop forward by the set number of beats. - - - - Jump forward by 1 beat. - Jump forward by 1 beat. - - - - Move the loop forward by 1 beat. - Move the loop forward by 1 beat. - - - - Beatjump Backward - Beatjump Backward - - - - Jump backward by the set number of beats. - Jump backward by the set number of beats. - - - - Move the loop backward by the set number of beats. - Move the loop backward by the set number of beats. - - - - Jump backward by 1 beat. - Jump backward by 1 beat. - - - - Move the loop backward by 1 beat. - Move the loop backward by 1 beat. - - - - Reloop - Reloop - - - - If the loop is ahead of the current position, looping will start when the loop is reached. - If the loop is ahead of the current position, looping will start when the loop is reached. - - - - Works only if Loop-In and Loop-Out Marker are set. - Works only if Loop-In and Loop-Out Marker are set. - - - - Enable loop, jump to Loop-In Marker, and stop playback. - Enable loop, jump to Loop-In Marker, and stop playback. - - - - Displays the elapsed and/or remaining time of the track loaded. - Displays the elapsed and/or remaining time of the track loaded. - - - - Click to toggle between time elapsed/remaining time/both. - Click to toggle between time elapsed/remaining time/both. - - - - Hint: Change the time format in Preferences -> Decks. - Hint: Change the time format in Preferences -> Decks. - - - - Show/hide intro & outro markers and associated buttons. - Show/hide intro & outro markers and associated buttons. - - - - Intro Start Marker - Intro Start Marker - - - - - - - If marker is set, jumps to the marker. - If marker is set, jumps to the marker. - - - - - - - If marker is not set, sets the marker to the current play position. - If marker is not set, sets the marker to the current play position. - - - - - - - If marker is set, clears the marker. - If marker is set, clears the marker. - - - - Intro End Marker - Intro End Marker - - - - Outro Start Marker - Outro Start Marker - - - - Outro End Marker - Outro End Marker - - - - Mix - Mix - - - - Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - - - - D/W mode: Crossfade between dry and wet - D/W mode: Crossfade between dry and wet - - - - D+W mode: Add wet to dry - D+W mode: Add wet to dry - - - - Mix Mode - Mix Mode - - - - Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - - - - Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet -Use this to change the sound of the track with EQ and filter effects. - Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet -Use this to change the sound of the track with EQ and filter effects. - - - - Dry+Wet mode (flat dry line): Mix knob adds wet to dry -Use this to change only the effected (wet) signal with EQ and filter effects. - Dry+Wet mode (flat dry line): Mix knob adds wet to dry -Use this to change only the effected (wet) signal with EQ and filter effects. - - - - Route the main mix through this effect unit. - Route the main mix through this effect unit. - - - - Route the left crossfader bus through this effect unit. - Route the left crossfader bus through this effect unit. - - - - Route the right crossfader bus through this effect unit. - Route the right crossfader bus through this effect unit. - - - - Right side active: parameter moves with right half of Meta Knob turn - Right side active: parameter moves with right half of Meta Knob turn - - - - Skin Settings Menu - Skin Settings Menu - - - - Show/hide skin settings menu - Show/hide skin settings menu - - - - Save Sampler Bank - Save Sampler Bank - - - - Save the collection of samples loaded in the samplers. - Save the collection of samples loaded in the samplers. - - - - Load Sampler Bank - Load Sampler Bank - - - - Load a previously saved collection of samples into the samplers. - Load a previously saved collection of samples into the samplers. - - - - Show Effect Parameters - Show Effect Parameters - - - - Enable Effect - Enable Effect - - - - Meta Knob Link - Meta Knob Link - - - - Set how this parameter is linked to the effect's Meta Knob. - Set how this parameter is linked to the effect's Meta Knob. - - - - Meta Knob Link Inversion - Meta Knob Link Inversion - - - - Inverts the direction this parameter moves when turning the effect's Meta Knob. - Inverts the direction this parameter moves when turning the effect's Meta Knob. - - - - Super Knob - Super Knob - - - - Next Chain - Next Chain - - - - Previous Chain - Previous Chain - - - - Next/Previous Chain - Next/Previous Chain - - - - Clear - Clear - - - - Clear the current effect. - Clear the current effect. - - - - Toggle - Toggle - - - - Toggle the current effect. - Toggle the current effect. - - - - Next - Next - - - - Clear Unit - Clear Unit - - - - Clear effect unit. - Clear effect unit. - - - - Show/hide parameters for effects in this unit. - Show/hide parameters for effects in this unit. - - - - Toggle Unit - Toggle Unit - - - - Enable or disable this whole effect unit. - Enable or disable this whole effect unit. - - - - Controls the Meta Knob of all effects in this unit together. - Controls the Meta Knob of all effects in this unit together. - - - - Load next effect chain preset into this effect unit. - Load next effect chain preset into this effect unit. - - - - Load previous effect chain preset into this effect unit. - Load previous effect chain preset into this effect unit. - - - - Load next or previous effect chain preset into this effect unit. - Load next or previous effect chain preset into this effect unit. - - - - - - - - - - - - Assign Effect Unit - Assign Effect Unit - - - - Assign this effect unit to the channel output. - Assign this effect unit to the channel output. - - - - Route the headphone channel through this effect unit. - Route the headphone channel through this effect unit. - - - - Route this deck through the indicated effect unit. - Route this deck through the indicated effect unit. - - - - Route this sampler through the indicated effect unit. - Route this sampler through the indicated effect unit. - - - - Route this microphone through the indicated effect unit. - Route this microphone through the indicated effect unit. - - - - Route this auxiliary input through the indicated effect unit. - Route this auxiliary input through the indicated effect unit. - - - - The effect unit must also be assigned to a deck or other sound source to hear the effect. - The effect unit must also be assigned to a deck or other sound source to hear the effect. - - - - Switch to the next effect. - Switch to the next effect. - - - - Previous - Previous - - - - Switch to the previous effect. - Switch to the previous effect. - - - - Next or Previous - Next or Previous - - - - Switch to either the next or previous effect. - Switch to either the next or previous effect. - - - - Meta Knob - Meta Knob - - - - Controls linked parameters of this effect - Controls linked parameters of this effect - - - - Effect Focus Button - Effect Focus Button - - - - Focuses this effect. - Focuses this effect. - - - - Unfocuses this effect. - Unfocuses this effect. - - - - Refer to the web page on the Mixxx wiki for your controller for more information. - Refer to the web page on the Mixxx wiki for your controller for more information. - - - - Effect Parameter - Effect Parameter - - - - Adjusts a parameter of the effect. - Adjusts a parameter of the effect. - - - - Inactive: parameter not linked - Inactive: parameter not linked - - - - Active: parameter moves with Meta Knob - Active: parameter moves with Meta Knob - - - - Left side active: parameter moves with left half of Meta Knob turn - Left side active: parameter moves with left half of Meta Knob turn - - - - Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - - - - Equalizer Parameter Kill - Equalizer Parameter Kill - - - - - Holds the gain of the EQ to zero while active. - Holds the gain of the EQ to zero while active. - - - - Quick Effect Super Knob - Quick Effect Super Knob - - - - Quick Effect Super Knob (control linked effect parameters). - Quick Effect Super Knob (control linked effect parameters). - - - - Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - - - - Equalizer Parameter - Equalizer Parameter - - - - Adjusts the gain of the EQ filter. - Adjusts the gain of the EQ filter. - - - - Hint: Change the default EQ mode in Preferences -> Equalizers. - Hint: Change the default EQ mode in Preferences -> Equalizers. - - - - - Adjust Beatgrid - Adjust Beatgrid - - - - Adjust beatgrid so the closest beat is aligned with the current play position. - Adjust beatgrid so the closest beat is aligned with the current play position. - - - - - Adjust beatgrid to match another playing deck. - Adjust beatgrid to match another playing deck. - - - - If quantize is enabled, snaps to the nearest beat. - If quantize is enabled, snaps to the nearest beat. - - - - Quantize - Quantize - - - - Toggles quantization. - Toggles quantization. - - - - Loops and cues snap to the nearest beat when quantization is enabled. - Loops and cues snap to the nearest beat when quantization is enabled. - - - - Reverse - Reverse - - - - Reverses track playback during regular playback. - Reverses track playback during regular playback. - - - - Puts a track into reverse while being held (Censor). - Puts a track into reverse while being held (Censor). - - - - Playback continues where the track would have been if it had not been temporarily reversed. - Playback continues where the track would have been if it had not been temporarily reversed. - - - - - - Play/Pause - Play/Pause - - - - Jumps to the beginning of the track. - Jumps to the beginning of the track. - - - - Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - - - - Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - - - - Sync and Reset Key - Sync and Reset Key - - - - Increases the pitch by one semitone. - Increases the pitch by one semitone. - - - - Decreases the pitch by one semitone. - Decreases the pitch by one semitone. - - - - Enable Vinyl Control - Enable Vinyl Control - - - - When disabled, the track is controlled by Mixxx playback controls. - When disabled, the track is controlled by Mixxx playback controls. - - - - When enabled, the track responds to external vinyl control. - When enabled, the track responds to external vinyl control. - - - - Enable Passthrough - Enable Passthrough - - - - Indicates that the audio buffer is too small to do all audio processing. - Indicates that the audio buffer is too small to do all audio processing. - - - - Displays cover artwork of the loaded track. - Displays cover artwork of the loaded track. - - - - Displays options for editing cover artwork. - Displays options for editing cover artwork. - - - - Star Rating - Star Rating - - - - Assign ratings to individual tracks by clicking the stars. - Assign ratings to individual tracks by clicking the stars. - - - - Channel Peak Indicator - Channel Peak Indicator - - - - Drag this item to other decks/samplers, to crates and playlist or to external file manager. - Drag this item to other decks/samplers, to crates and playlist or to external file manager. - - - - Shows information about the track currently loaded in this deck. - Shows information about the track currently loaded in this deck. - - - - Left click to jump around in the track. - Left click to jump around in the track. - - - - Right click hotcues to edit their labels and colors. - Right click hotcues to edit their labels and colors. - - - - Right click anywhere else to show the time at that point. - Right click anywhere else to show the time at that point. - - - - Channel L Peak Indicator - Channel L Peak Indicator - - - - Indicates when the left signal on the channel is clipping, - Indicates when the left signal on the channel is clipping, - - - - Channel R Peak Indicator - Channel R Peak Indicator - - - - Indicates when the right signal on the channel is clipping, - Indicates when the right signal on the channel is clipping, - - - - Channel L Volume Meter - Channel L Volume Meter - - - - Shows the current channel volume for the left channel. - Shows the current channel volume for the left channel. - - - - Channel R Volume Meter - Channel R Volume Meter - - - - Shows the current channel volume for the right channel. - Shows the current channel volume for the right channel. - - - - Microphone Peak Indicator - Microphone Peak Indicator - - - - Indicates when the signal on the microphone is clipping, - Indicates when the signal on the microphone is clipping, - - - - Sampler Volume Meter - Sampler Volume Meter - - - - Shows the current sampler volume. - Shows the current sampler volume. - - - - Sampler Peak Indicator - Sampler Peak Indicator - - - - Indicates when the signal on the sampler is clipping, - Indicates when the signal on the sampler is clipping, - - - - Preview Deck Volume Meter - Preview Deck Volume Meter - - - - Shows the current Preview Deck volume. - Shows the current Preview Deck volume. - - - - Preview Deck Peak Indicator - Preview Deck Peak Indicator - - - - Indicates when the signal on the Preview Deck is clipping, - Indicates when the signal on the Preview Deck is clipping, - - - - Maximize Library - Maximize Library - - - - Microphone Talkover Ducking Strength - Microphone Talkover Ducking Strength - - - - Prevents the pitch from changing when the rate changes. - Prevents the pitch from changing when the rate changes. - - - - Changes the number of hotcue buttons displayed in the deck - Changes the number of hotcue buttons displayed in the deck - - - - Starts playing from the beginning of the track. - Starts playing from the beginning of the track. - - - - Jumps to the beginning of the track and stops. - Jumps to the beginning of the track and stops. - - - - - Plays or pauses the track. - Plays or pauses the track. - - - - (while playing) - (while playing) - - - - Opens the track properties editor - Opens the track properties editor - - - - Opens the track context menu. - Opens the track context menu. - - - - Main Channel R Volume Meter - - - - - (while stopped) - (while stopped) - - - - Cue - Cue - - - - Headphone - Headphone - - - - Mute - Mute - - - - Old Synchronize - Old Synchronize - - - - Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - - - - If no deck is playing, syncs to the first deck that has a BPM. - If no deck is playing, syncs to the first deck that has a BPM. - - - - Decks can't sync to samplers and samplers can only sync to decks. - Decks can't sync to samplers and samplers can only sync to decks. - - - - Hold for at least a second to enable sync lock for this deck. - Hold for at least a second to enable sync lock for this deck. - - - - Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - - - - Resets the key to the original track key. - Resets the key to the original track key. - - - - Speed Control - Speed Control - - - - - - Changes the track pitch independent of the tempo. - Changes the track pitch independent of the tempo. - - - - Increases the pitch by 10 cents. - Increases the pitch by 10 cents. - - - - Decreases the pitch by 10 cents. - Decreases the pitch by 10 cents. - - - - Pitch Adjust - Pitch Adjust - - - - Adjust the pitch in addition to the speed slider pitch. - Adjust the pitch in addition to the speed slider pitch. - - - - Opens a menu to clear hotcues or edit their labels and colors. - Opens a menu to clear hotcues or edit their labels and colors. - - - - Record Mix - Record Mix - - - - Toggle mix recording. - Toggle mix recording. - - - - Enable Live Broadcasting - Enable Live Broadcasting - - - - Stream your mix over the Internet. - Stream your mix over the Internet. - - - - Provides visual feedback for Live Broadcasting status: - Provides visual feedback for Live Broadcasting status: - - - - disabled, connecting, connected, failure. - disabled, connecting, connected, failure. - - - - When enabled, the deck directly plays the audio arriving on the vinyl input. - When enabled, the deck directly plays the audio arriving on the vinyl input. - - - - Blue for passthrough enabled. - Blue for passthrough enabled. - - - - Playback will resume where the track would have been if it had not entered the loop. - Playback will resume where the track would have been if it had not entered the loop. - - - - Loop Exit - Loop Exit - - - - Turns the current loop off. - Turns the current loop off. - - - - Slip Mode - Slip Mode - - - - When active, the playback continues muted in the background during a loop, reverse, scratch etc. - When active, the playback continues muted in the background during a loop, reverse, scratch etc. - - - - Once disabled, the audible playback will resume where the track would have been. - Once disabled, the audible playback will resume where the track would have been. - - - - Track Key - The musical key of a track - Track Key - - - - Displays the musical key of the loaded track. - Displays the musical key of the loaded track. - - - - Clock - Clock - - - - Displays the current time. - Displays the current time. - - - - Audio Latency Usage Meter - Audio Latency Usage Meter - - - - Displays the fraction of latency used for audio processing. - Displays the fraction of latency used for audio processing. - - - - A high value indicates that audible glitches are likely. - A high value indicates that audible glitches are likely. - - - - Do not enable keylock, effects or additional decks in this situation. - Do not enable keylock, effects or additional decks in this situation. - - - - Audio Latency Overload Indicator - Audio Latency Overload Indicator - - - - If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). - If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). - - - - Drop tracks from library, external file manager, or other decks/samplers here. - Drop tracks from library, external file manager, or other decks/samplers here. - - - - Change the crossfader curve in Preferences -> Crossfader - Change the crossfader curve in Preferences -> Crossfader - - - - Crossfader Orientation - Crossfader Orientation - - - - Set the channel's crossfader orientation. - Set the channel's crossfader orientation. - - - - Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - - - - Activate Vinyl Control from the Menu -> Options. - Activate Vinyl Control from the Menu -> Options. - - - - Displays the current musical key of the loaded track after pitch shifting. - Displays the current musical key of the loaded track after pitch shifting. - - - - Fast Rewind - Fast Rewind - - - - Fast rewind through the track. - Fast rewind through the track. - - - - Fast Forward - Fast Forward - - - - Fast forward through the track. - Fast forward through the track. - - - - Jumps to the end of the track. - Jumps to the end of the track. - - - - Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - - - - Pitch Control - Pitch Control - - - - Pitch Rate - Pitch Rate - - - - Displays the current playback rate of the track. - Displays the current playback rate of the track. - - - - Repeat - Repeat - - - - When active the track will repeat if you go past the end or reverse before the start. - When active the track will repeat if you go past the end or reverse before the start. - - - - Eject - Eject - - - - Ejects track from the player. - Ejects track from the player. - - - - Hotcue - Hotcue - - - - If hotcue is set, jumps to the hotcue. - If hotcue is set, jumps to the hotcue. - - - - If hotcue is not set, sets the hotcue to the current play position. - If hotcue is not set, sets the hotcue to the current play position. - - - - Vinyl Control Mode - Vinyl Control Mode - - - - Absolute mode - track position equals needle position and speed. - Absolute mode - track position equals needle position and speed. - - - - Relative mode - track speed equals needle speed regardless of needle position. - Relative mode - track speed equals needle speed regardless of needle position. - - - - Constant mode - track speed equals last known-steady speed regardless of needle input. - Constant mode - track speed equals last known-steady speed regardless of needle input. - - - - Vinyl Status - Vinyl Status - - - - Provides visual feedback for vinyl control status: - Provides visual feedback for vinyl control status: - - - - Green for control enabled. - Green for control enabled. - - - - Blinking yellow for when the needle reaches the end of the record. - Blinking yellow for when the needle reaches the end of the record. - - - - Loop-In Marker - Loop-In Marker - - - - Loop-Out Marker - Loop-Out Marker - - - - Loop Halve - Loop Halve - - - - Halves the current loop's length by moving the end marker. - Halves the current loop's length by moving the end marker. - - - - Deck immediately loops if past the new endpoint. - Deck immediately loops if past the new endpoint. - - - - Loop Double - Loop Double - - - - Doubles the current loop's length by moving the end marker. - Doubles the current loop's length by moving the end marker. - - - - Beatloop - Beatloop - - - - Toggles the current loop on or off. - Toggles the current loop on or off. - - - - Works only if Loop-In and Loop-Out marker are set. - Works only if Loop-In and Loop-Out marker are set. - - - - Hint: Change the default cue mode in Preferences -> Interface. - Hint: Change the default cue mode in Preferences -> Interface. - - - - Vinyl Cueing Mode - Vinyl Cueing Mode - - - - Determines how cue points are treated in vinyl control Relative mode: - Determines how cue points are treated in vinyl control Relative mode: - - - - Off - Cue points ignored. - Off - Cue points ignored. - - - - One Cue - If needle is dropped after the cue point, track will seek to that cue point. - One Cue - If needle is dropped after the cue point, track will seek to that cue point. - - - - Track Time - Track Time - - - - Track Duration - Track Duration - - - - Displays the duration of the loaded track. - Displays the duration of the loaded track. - - - - Information is loaded from the track's metadata tags. - Information is loaded from the track's metadata tags. - - - - Track Artist - Track Artist - - - - Displays the artist of the loaded track. - Displays the artist of the loaded track. - - - - Track Title - Track Title - - - - Displays the title of the loaded track. - Displays the title of the loaded track. - - - - Track Album - Track Album - - - - Displays the album name of the loaded track. - Displays the album name of the loaded track. - - - - Track Artist/Title - Track Artist/Title - - - - Displays the artist and title of the loaded track. - Displays the artist and title of the loaded track. - - - - TrackCollection - - - Hiding tracks - Hiding tracks - - - - The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? - The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? - - - - TrackExportDlg - - - Export finished - Export finished - - - - Exporting %1 - Exporting %1 - - - - Overwrite Existing File? - Overwrite Existing File? - - - - "%1" already exists, overwrite? - "%1" already exists, overwrite? - - - - &Overwrite - &Overwrite - - - - Over&write All - Over&write All - - - - &Skip - &Skip - - - - Skip &All - Skip &All - - - - Export Error - Export Error - - - - TrackExportWizard - - - Export Track Files To - Export Track Files To - - - - TrackExportWorker - - - - Export process was canceled - Export process was canceled - - - - Error removing file %1: %2. Stopping. - Error removing file %1: %2. Stopping. - - - - Error exporting track %1 to %2: %3. Stopping. - Error exporting track %1 to %2: %3. Stopping. - - - - Error exporting tracks - Error exporting tracks - - - - TraktorFeature - - - - Traktor - Traktor - - - - (loading) Traktor - (loading) Traktor - - - - Error Loading Traktor Library - Error Loading Traktor Library - - - - There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. - There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. - - - - VSyncThread - - - Timer (Fallback) - Timer (Fallback) - - - - MESA vblank_mode = 1 - MESA vblank_mode = 1 - - - - Wait for Video sync - Wait for Video sync - - - - Sync Control - Sync Control - - - - Free + 1 ms (for benchmark only) - Free + 1 ms (for benchmark only) - - - - WBattery - - - Time until charged: %1 - Time until charged: %1 - - - - Time left: %1 - Time left: %1 - - - - Battery fully charged. - Battery fully charged. - - - - WColorPicker - - - No color - No color - - - - Custom color - Custom color - - - - WCoverArtMenu - - - Choose new cover - change cover art location - Choose new cover - - - - Clear cover - clears the set cover art -- does not touch files on disk - Clear cover - - - - Reload from file/folder - reload cover art from file metadata or folder - Reload from file/folder - - - - Image Files - Image Files - - - - Change Cover Art - Change Cover Art - - - - Cover Art File Already Exists - La Pochette d'Album Existe Déjà - - - - File: %1 -Folder: %2 -Override existing file? -This can not be undone! - Fichier : %1 -Dossier : %2 -Écraser le fichier existant ? -Cette opération est irréversible ! - - - - WCueMenuPopup - - - Cue number - Cue number - - - - Cue position - Cue position - - - - Edit cue label - Edit cue label - - - - Label... - Label... - - - - Delete this cue - Delete this cue - - - - Hotcue #%1 - Hotcue #%1 - - - - WEffectChainPresetButton - - - Update Preset - Update Preset - - - - Rename Preset - - - - - Save As New Preset... - Save As New Preset... - - - - Save snapshot - Save snapshot - - - - WEffectName - - - %1: %2 - %1 = effect name; %2 = effect description - %1: %2 - - - - No effect loaded. - Aucun effet chargé. - - - - WEffectParameterNameBase - - - No effect loaded. - Aucun effet chargé. - - - - WEffectSelector - - - No effect loaded. - No effect loaded. - - - - WFindOnWebMenu - - - Find on Web - Find on Web - - - - WMainMenuBar - - - &File - &File - - - - Load Track to Deck &%1 - Load Track to Deck &%1 - - - - Loads a track in deck %1 - Loads a track in deck %1 - - - - Open - Open - - - - &Exit - &Exit - - - - Quits Mixxx - Quits Mixxx - - - - Ctrl+q - Ctrl+q - - - - &Library - &Library - - - - &Rescan Library - &Rescan Library - - - - Rescans library folders for changes to tracks. - Rescans library folders for changes to tracks. - - - - Ctrl+Shift+L - Ctrl+Shift+L - - - - E&xport Library to Engine Prime - E&xport Library to Engine Prime - - - - Export the library to the Engine Prime format - Export the library to the Engine Prime format - - - - Create &New Playlist - Create &New Playlist - - - - Create a new playlist - Create a new playlist - - - - Ctrl+n - Ctrl+n - - - - Create New &Crate - Create New &Crate - - - - Create a new crate - Create a new crate - - - - Ctrl+Shift+N - Ctrl+Shift+N - - - - - &View - &View - - - - May not be supported on all skins. - May not be supported on all skins. - - - - Show Skin Settings Menu - Show Skin Settings Menu - - - - Show the Skin Settings Menu of the currently selected Skin - Show the Skin Settings Menu of the currently selected Skin - - - - Ctrl+1 - Menubar|View|Show Skin Settings - Ctrl+1 - - - - Show Microphone Section - Show Microphone Section - - - - Show the microphone section of the Mixxx interface. - Show the microphone section of the Mixxx interface. - - - - Ctrl+2 - Menubar|View|Show Microphone Section - Ctrl+2 - - - - Show Vinyl Control Section - Show Vinyl Control Section - - - - Show the vinyl control section of the Mixxx interface. - Show the vinyl control section of the Mixxx interface. - - - - Ctrl+3 - Menubar|View|Show Vinyl Control Section - Ctrl+3 - - - - Show Preview Deck - Show Preview Deck - - - - Show the preview deck in the Mixxx interface. - Show the preview deck in the Mixxx interface. - - - - Ctrl+4 - Menubar|View|Show Preview Deck - Ctrl+4 - - - - Show Cover Art - Show Cover Art - - - - Show cover art in the Mixxx interface. - Show cover art in the Mixxx interface. - - - - Ctrl+6 - Menubar|View|Show Cover Art - Ctrl+6 - - - - Maximize Library - Maximize Library - - - - Maximize the track library to take up all the available screen space. - Maximize the track library to take up all the available screen space. - - - - Space - Menubar|View|Maximize Library - Space - - - - &Full Screen - &Full Screen - - - - Display Mixxx using the full screen - Display Mixxx using the full screen - - - - &Options - &Options - - - - &Vinyl Control - &Vinyl Control - - - - Use timecoded vinyls on external turntables to control Mixxx - Use timecoded vinyls on external turntables to control Mixxx - - - - Enable Vinyl Control &%1 - Enable Vinyl Control &%1 - - - - &Record Mix - &Record Mix - - - - Record your mix to a file - Record your mix to a file - - - - Ctrl+R - Ctrl+R - - - - Enable Live &Broadcasting - Enable Live &Broadcasting - - - - Stream your mixes to a shoutcast or icecast server - Stream your mixes to a shoutcast or icecast server - - - - Ctrl+L - Ctrl+L - - - - Enable &Keyboard Shortcuts - Enable &Keyboard Shortcuts - - - - Toggles keyboard shortcuts on or off - Toggles keyboard shortcuts on or off - - - - Ctrl+` - Ctrl+` - - - - &Preferences - &Preferences - - - - Change Mixxx settings (e.g. playback, MIDI, controls) - Change Mixxx settings (e.g. playback, MIDI, controls) - - - - &Developer - &Developer - - - - &Reload Skin - &Reload Skin - - - - Reload the skin - Reload the skin - - - - Ctrl+Shift+R - Ctrl+Shift+R - - - - Developer &Tools - Developer &Tools - - - - Opens the developer tools dialog - Opens the developer tools dialog - - - - Ctrl+Shift+T - Ctrl+Shift+T - - - - Stats: &Experiment Bucket - Stats: &Experiment Bucket - - - - Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - - - - Ctrl+Shift+E - Ctrl+Shift+E - - - - Stats: &Base Bucket - Stats: &Base Bucket - - - - Enables base mode. Collects stats in the BASE tracking bucket. - Enables base mode. Collects stats in the BASE tracking bucket. - - - - Ctrl+Shift+B - Ctrl+Shift+B - - - - Deb&ugger Enabled - Deb&ugger Enabled - - - - Enables the debugger during skin parsing - Enables the debugger during skin parsing - - - - Ctrl+Shift+D - Ctrl+Shift+D - - - - &Help - &Help - - - - Show Keywheel - menu title - Show Keywheel - - - - Show keywheel - tooltip text - Show keywheel - - - - F12 - Menubar|View|Show Keywheel - F12 - - - - &Community Support - &Community Support - - - - Get help with Mixxx - Get help with Mixxx - - - - &User Manual - &User Manual - - - - Read the Mixxx user manual. - Read the Mixxx user manual. - - - - &Keyboard Shortcuts - &Keyboard Shortcuts - - - - Speed up your workflow with keyboard shortcuts. - Speed up your workflow with keyboard shortcuts. - - - - &Settings directory - - - - - Open the Mixxx user settings directory. - - - - - &Translate This Application - &Translate This Application - - - - Help translate this application into your language. - Help translate this application into your language. - - - - &About - &About - - - - About the application - About the application - - - - WOverview - - - Passthrough - Passthrough - - - - Ready to play, analyzing... - Text on waveform overview when file is playable but no waveform is visible - Ready to play, analyzing... - - - - - Loading track... - Text on waveform overview when file is cached from source - Loading track... - - - - Finalizing... - Text on waveform overview during finalizing of waveform analysis - Finalizing... - - - - WSearchLineEdit - - - Clear input - Clear the search bar input field - Clear input - - - - Ctrl+F - Search|Focus - Ctrl+F - - - - Search - noun - Search - - - - Clear input - Clear input - - - - Search... - Shown in the library search bar when it is empty. - Search... - - - - Clear the search bar input field - Clear the search bar input field - - - - Enter a string to search for - Enter a string to search for - - - - Use operators like bpm:115-128, artist:BooFar, -year:1990 - Use operators like bpm:115-128, artist:BooFar, -year:1990 - - - - For more information see User Manual > Mixxx Library - For more information see User Manual > Mixxx Library - - - - Shortcut - Shortcut - - - - Ctrl+F - Ctrl+F - - - - Focus - Give search bar input focus - Focus - - - - - Ctrl+Backspace - Ctrl+Backspace - - - - Shortcuts - Shortcuts - - - - Return - Retour arrière - - - - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - Trigger search before search-as-you-type timeout orjump to tracks view afterwards - - - - Ctrl+Space - Ctrl+Space - - - - Toggle search history - Shows/hides the search history entries - Toggle search history - - - - Delete or Backspace - Delete or Backspace - - - - Delete query from history - Delete query from history - - - - Esc - Esc - - - - Exit search - Exit search bar and leave focus - Exit search - - - - WSearchRelatedTracksMenu - - - Search related Tracks - Search related Tracks - - - - Key - Clé - - - - harmonic with %1 - harmonic with %1 - - - - BPM - BPM - - - - between %1 and %2 - between %1 and %2 - - - - Artist - Artiste - - - - Album Artist - Artiste de l'album - - - - Composer - Compositeur - - - - Title - Titre - - - - Album - Album - - - - Grouping - Regroupement - - - - Year - Année - - - - Genre - Genre - - - - Directory - Directory - - - - WTrackMenu - - - Load to - Load to - - - - Deck - Deck - - - - Sampler - Sampler - - - - Add to Playlist - Add to Playlist - - - - Crates - Caisses - - - - Metadata - Metadata - - - - Update external collections - Update external collections - - - - Cover Art - Couverture - - - - Adjust BPM - Adjust BPM - - - - Select Color - Select Color - - - - Reset - Reset metadata in right click track context menu in library - Reset - - - - - Analyze - Analyse - - - - - Delete Track Files - Delete Track Files - - - - Add to Auto DJ Queue (bottom) - Ajouter à la file d'attente de l'auto-dj (en dernier) - - - - Add to Auto DJ Queue (top) - Ajouter à la file d'attente de l'auto-dj (en premier) - - - - Add to Auto DJ Queue (replace) - Add to Auto DJ Queue (replace) - - - - Preview Deck - Platine de pré-écoute - - - - Remove - Supprimer - - - - Remove from Playlist - Remove from Playlist - - - - Remove from Crate - Remove from Crate - - - - Hide from Library - Hide from Library - - - - Unhide from Library - Unhide from Library - - - - Purge from Library - Purge from Library - - - - Move Track File(s) to Trash - - - - - Delete Files from Disk - Delete Files from Disk - - - - Properties - Properties - - - - Open in File Browser - Open in File Browser - - - - Select in Library - Select in Library - - - - Import From File Tags - Import From File Tags - - - - Import From MusicBrainz - Import From MusicBrainz - - - - Export To File Tags - Export To File Tags - - - - BPM and Beatgrid - BPM and Beatgrid - - - - Play Count - Play Count - - - - Rating - Note - - - - Cue Point - Cue Point - - - - Hotcues - Points de repère - - - - Intro - Intro - - - - Outro - Outro - - - - Key - Clé - - - - ReplayGain - ReplayGain - - - - Waveform - Waveform - - - - Comment - Commentaire - - - - All - All - - - - Lock BPM - Lock BPM - - - - Unlock BPM - Unlock BPM - - - - Double BPM - Double BPM - - - - Halve BPM - Halve BPM - - - - 2/3 BPM - 2/3 BPM - - - - 3/4 BPM - 3/4 BPM - - - - 4/3 BPM - 4/3 BPM - - - - 3/2 BPM - 3/2 BPM - - - - Reset BPM - Reset BPM - - - - Reanalyze - Reanalyze - - - - Reanalyze (constant BPM) - Réanalyser (BPM constant) - - - - Reanalyze (variable BPM) - Réanalyser (BPM variable) - - - - Update ReplayGain from Deck Gain - Update ReplayGain from Deck Gain - - - - Deck %1 - Deck %1 - - - - Sampler %1 - Sampler %1 - - - - Importing metadata of %n track(s) from file tags - - - - - Marking metadata of %n track(s) to be exported into file tags - - - - - - Create New Playlist - Créer une nouvelle playlist - - - - Enter name for new playlist: - Entrez un nom pour la nouvelle playlist - - - - New Playlist - Nouvelle playlist - - - - - - Playlist Creation Failed - La création de la liste de lecture a échoué - - - - A playlist by that name already exists. - Une playlist utilise déjà ce nom - - - - A playlist cannot have a blank name. - Une liste de lecture ne peut pas être sans nom. - - - - An unknown error occurred while creating playlist: - Une erreur inconnue s'est produite à la création de la liste de lecture : - - - - Add to New Crate - Add to New Crate - - - - Scaling BPM of %n track(s) - - - - - Locking BPM of %n track(s) - - - - - Unlocking BPM of %n track(s) - - - - - Setting color of %n track(s) - - - - - Resetting play count of %n track(s) - - - - - Resetting beats of %n track(s) - - - - - Clearing rating of %n track(s) - - - - - Clearing comment of %n track(s) - - - - - Removing main cue from %n track(s) - - - - - Removing outro cue from %n track(s) - - - - - Removing intro cue from %n track(s) - - - - - Removing loop cues from %n track(s) - - - - - Removing hot cues from %n track(s) - - - - - Resetting keys of %n track(s) - - - - - Resetting replay gain of %n track(s) - - - - - Resetting waveform of %n track(s) - - - - - Resetting all performance metadata of %n track(s) - - - - - Permanently delete these files from disk? - Permanently delete these files from disk? - - - - - This can not be undone! - This can not be undone! - - - - Stop the deck and move this track file to the trash bin? - - - - - Stop the deck and permanently delete this track file from disk? - Stop the deck and permanently delete this track file from disk? - - - - Cancel - Annuler - - - - Delete Files - Delete Files - - - - Okay - - - - - Move Track File(s) to Trash? - - - - - Track Files Deleted - Track Files Deleted - - - - Track Files Moved To Trash - - - - - %1 track files were moved to trash and purged from the Mixxx database. - - - - - %1 track files were deleted from disk and purged from the Mixxx database. - %1 track files were deleted from disk and purged from the Mixxx database. - - - - Track File Deleted - Fichier de la piste supprimée - - - - Track file was deleted from disk and purged from the Mixxx database. - Track file was deleted from disk and purged from the Mixxx database. - - - - The following %1 file(s) could not be deleted from disk - The following %1 file(s) could not be deleted from disk - - - - This track file could not be deleted from disk - This track file could not be deleted from disk - - - - Remaining Track File(s) - Remaining Track File(s) - - - - Close - Fermer - - - - Loops - Boucles - - - - Removing %n track file(s) from disk... - - - - - Note: if you are in the Computer or Recording view you need to click the current view again to see changes. - - - - - Track File Moved To Trash - - - - - Track file was moved to trash and purged from the Mixxx database. - - - - - The following %1 file(s) could not be moved to trash - - - - - This track file could not be moved to trash - - - - - Setting cover art of %n track(s) - - - - - Reloading cover art of %n track(s) - - - - - WTrackTableView - - - Confirm track hide - Confirm track hide - - - - Are you sure you want to hide the selected tracks? - Are you sure you want to hide the selected tracks? - - - - Are you sure you want to remove the selected tracks from AutoDJ queue? - Are you sure you want to remove the selected tracks from AutoDJ queue? - - - - Are you sure you want to remove the selected tracks from this crate? - Are you sure you want to remove the selected tracks from this crate? - - - - Are you sure you want to remove the selected tracks from this playlist? - Are you sure you want to remove the selected tracks from this playlist? - - - - Don't ask again during this session - - - - - Confirm track removal - Confirm track removal - - - - WTrackTableViewHeader - - - Show or hide columns. - Show or hide columns. - - - - WaveformWidgetFactory - - - legacy - - - - - allshader::FilteredWaveformWidget - - - Filtered - Filtered - - - - allshader::HSVWaveformWidget - - - HSV - HSV - - - - allshader::LRRGBWaveformWidget - - - RGB L/R - - - - - allshader::RGBWaveformWidget - - - RGB - RGB - - - - allshader::SimpleWaveformWidget - - - Simple - Simple - - - - mixxx::CoreServices - - - fonts - fonts - - - - database - database - - - - effects - effects - - - - audio interface - audio interface - - - - decks - decks - - - - library - library - - - - Choose music library directory - Choose music library directory - - - - controllers - controllers - - - - Cannot open database - Cannot open database - - - - Unable to establish a database connection. -Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. - -Click OK to exit. - Unable to establish a database connection. -Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. - -Click OK to exit. - - - - mixxx::DlgLibraryExport - - - Entire music library - Entire music library - - - - Selected crates - Selected crates - - - - Browse - Browse - - - - Export directory - Export directory - - - - Database version - Database version - - - - Export - Export - - - - Cancel - Cancel - - - - Export Library to Engine Prime - Export Library to Engine Prime - - - - Export Library To - Export Library To - - - - No Export Directory Chosen - No Export Directory Chosen - - - - No export directory was chosen. Please choose a directory in order to export the music library. - No export directory was chosen. Please choose a directory in order to export the music library. - - - - A database already exists in the chosen directory. Exported tracks will be added into this database. - A database already exists in the chosen directory. Exported tracks will be added into this database. - - - - A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - A database already exists in the chosen directory, but there was a problem loading it. Export is not guaranteed to succeed in this situation. - - - - mixxx::DlgTrackMetadataExport - - - Export Modified Track Metadata - Export Modified Track Metadata - - - - Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - - - - mixxx::LibraryExporter - - - Export Completed - Export Completed - - - - Exported %1 track(s) and %2 crate(s). - Exported %1 track(s) and %2 crate(s). - - - - Export Failed - Export Failed - - - - Export failed: %1 - Export failed: %1 - - - - Exporting to Engine Prime... - Exporting to Engine Prime... - - - - mixxx::TaskMonitor - - - Abort - Abort - - - - mixxx::hid::DeviceCategory - - - HID Interface %1: - HID Interface %1: - - - - Generic HID Pointer - Generic HID Pointer - - - - Generic HID Mouse - Generic HID Mouse - - - - Generic HID Joystick - Generic HID Joystick - - - - Generic HID Game Pad - Generic HID Game Pad - - - - Generic HID Keyboard - Generic HID Keyboard - - - - Generic HID Keypad - Generic HID Keypad - - - - Generic HID Multi-axis Controller - Generic HID Multi-axis Controller - - - - Unknown HID Desktop Device: - Unknown HID Desktop Device: - - - - Apple HID Infrared Control - Apple HID Infrared Control - - - - Unknown Apple HID Device: - Unknown Apple HID Device: - - - - Unknown HID Device: - Unknown HID Device: - - - - mixxx::network::WebTask - - - No network access - No network access - - - - The Network request has not been started - La demande de réseau n'a pas été lancée - - - - mixxx::qml::QmlVisibleEffectsModel - - - No effect loaded. - Aucun effet chargé. - - - \ No newline at end of file diff --git a/res/translations/mixxx_fr_CI.qm b/res/translations/mixxx_fr_CI.qm deleted file mode 100644 index bd528815c5d4dceccf529cdbc836f420027d5a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386767 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

    nD% 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