Skip to content

Key detection and pitch shifting. #47

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 182 commits into from
Dec 6, 2013
Merged

Key detection and pitch shifting. #47

merged 182 commits into from
Dec 6, 2013

Conversation

rryan
Copy link
Member

@rryan rryan commented Jul 14, 2013

This branch adds basic key detection and pitch shifting to Mixxx. It also switches to using librubberband for tempo and pitch shifting instead of libsoundtouch which to my ear is a huge sound quality win in exchange for a moderate CPU increase.

Features / Improvements:

  • librubberband for tempo and pitch shifting.
  • Key analysis via our VAMP plugin support. Currently uses the Queen Mary Key Detector but libkeyfinder could easily be added.
  • User notation preferences so users can switch according to their preferences.
  • Global dominant key and the full list of track key changes are saved in the database.
  • Key syncing based on the Circle of Fifths.
  • Key display widgets.
  • Support for display and parsing of OpenKey, Lancelot, and Traditional notations.
  • No more mutex locks in the scalers.

Thanks to @ktec for writing the initial version of the preferences (forked from DlgPrefBeats) and Varun Jewalikar for writing the initial key analyser to use the VAMP plugin. Note that this branch is forked from Keith's features_key_preferences branch but I reverted everything but AnalyserKey and DlgPrefKey.

@esbrandt -- I will revert the res/skins change before merge.

ktec and others added 30 commits March 18, 2012 01:19
…rack bpm rather than just whats in the id3 tag
…u can see how many tracks are matched by the filters
This line and the following will be ignored --------------

removed:
  mixxx/lib/replaygain/replaygain_analysis.c
  mixxx/lib/replaygain/replaygain_analysis.h
  mixxx/res/images/library/ic_library_setlog.png
  mixxx/res/images/library/ic_library_setlog_current.png
  mixxx/src/analysergainvamp.cpp
  mixxx/src/analysergainvamp.h
  mixxx/vamp-plugins/plugins/replaygain.cpp
  mixxx/vamp-plugins/plugins/replaygain.h
added:
  mixxx/lib/replaygain/replaygain.cpp
  mixxx/lib/replaygain/replaygain.h
  mixxx/res/controllers/common-hid-packet-parser.js
  mixxx/res/images/library/ic_library_history.png
  mixxx/res/images/library/ic_library_history_current.png
  mixxx/res/keyboard/cs_CZ.kbd.cfg
  mixxx/res/keyboard/da_DK.kbd.cfg
  mixxx/res/keyboard/de_DE.kbd.cfg
  mixxx/res/keyboard/el_GR.kbd.cfg
  mixxx/res/keyboard/es_ES.kbd.cfg
  mixxx/res/keyboard/fi_FI.kbd.cfg
  mixxx/res/keyboard/fr_FR.kbd.cfg
  mixxx/res/keyboard/it_IT.kbd.cfg
  mixxx/res/keyboard/ru_RU.kbd.cfg
  mixxx/res/skins/Deere1280x1024-SXGA/CHANGELOG.txt
  mixxx/res/skins/Deere1280x800-WXGA/CHANGELOG.txt
  mixxx/res/skins/Deere1440x900-WXGA+/CHANGELOG.txt
  mixxx/res/skins/Deere1920x1080-FullHD/CHANGELOG.txt
  mixxx/res/skins/Deere1920x1200-WUXGA/CHANGELOG.txt
  mixxx/res/skins/LateNight1280x1024-SXGA/CHANGELOG.txt
  mixxx/res/skins/LateNight1280x800-WXGA/CHANGELOG.txt
  mixxx/res/skins/LateNight1366x768-WXGA/CHANGELOG.txt
  mixxx/res/skins/LateNightBlues1280x1024-SXGA/CHANGELOG.txt
  mixxx/res/skins/LateNightBlues1280x800-WXGA/CHANGELOG.txt
  mixxx/res/skins/LateNightBlues1366x768-WXGA/CHANGELOG.txt
  mixxx/res/skins/Outline1024x600-Netbook/CHANGELOG.txt
  mixxx/res/skins/Outline1024x768-XGA/CHANGELOG.txt
  mixxx/res/skins/Outline800x480-WVGA/CHANGELOG.txt
  mixxx/res/skins/Phoney1600x1200-UXGA/CHANGELOG.txt
  mixxx/res/skins/Phoney1680x1050-WSXGA/CHANGELOG.txt
  mixxx/res/skins/PhoneyDark1600x1200-UXGA/CHANGELOG.txt
  mixxx/res/skins/PhoneyDark1680x1050-WSXGA/CHANGELOG.txt
  mixxx/res/skins/Shade1024x600-Netbook/CHANGELOG.txt
  mixxx/res/skins/Shade1024x768-XGA/CHANGELOG.txt
  mixxx/res/skins/ShadeDark1024x600-Netbook/CHANGELOG.txt
  mixxx/res/skins/ShadeDark1024x768-XGA/CHANGELOG.txt
  mixxx/res/translations/mixxx/te.po
  mixxx/res/translations/mixxx_te.qm
  mixxx/res/translations/mixxx_te.ts
  mixxx/src/controllers/hid/hidblacklist.h
  mixxx/src/library/baseexternallibraryfeature.cpp
  mixxx/src/library/baseexternallibraryfeature.h
  mixxx/src/shoutcast/
  mixxx/src/shoutcast/defs_shoutcast.h
  mixxx/src/skin/tooltips.cpp
  mixxx/src/skin/tooltips.h
  mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
  mixxx/src/waveform/renderers/qtwaveformrendererfilteredsignal.h
  mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
  mixxx/src/waveform/renderers/qtwaveformrenderersimplesignal.h
  mixxx/src/waveform/renderers/waveformmarkset.cpp
  mixxx/src/waveform/renderers/waveformmarkset.h
  mixxx/src/waveform/renderers/waveformrenderersignalbase.cpp
  mixxx/src/waveform/renderers/waveformrenderersignalbase.h
  mixxx/src/waveform/widgets/qtsimplewaveformwidget.cpp
  mixxx/src/waveform/widgets/qtsimplewaveformwidget.h
  mixxx/src/waveform/widgets/qtwaveformwidget.cpp
  mixxx/src/waveform/widgets/qtwaveformwidget.h
renamed:
  mixxx/res/controllers/Eks Otus.cntrlr.xml => mixxx/res/controllers/EKS Otus.cntrlr.xml
  mixxx/res/keyboard/Standard.kbd.cfg => mixxx/res/keyboard/en_US.kbd.cfg
modified:
  mixxx/build/debian/mixxx.install
  mixxx/build/depends.py
  mixxx/build/features.py
  mixxx/build/nsis/Mixxx.nsi
  mixxx/lib/hidapi-0.7.0/linux/hid-libusb.c
  mixxx/lib/vamp-2.3/src/vamp-hostsdk/PluginLoader.cpp
  mixxx/res/controllers/EKS Otus.js
  mixxx/res/images/templates/ic_template_library_and_preferences.svg
  mixxx/res/mixxx.qrc
  mixxx/res/skins/Deere1280x1024-SXGA/skin.xml
  mixxx/res/skins/Deere1280x800-WXGA/skin.xml
  mixxx/res/skins/Deere1440x900-WXGA+/skin.xml
  mixxx/res/skins/Deere1920x1080-FullHD/skin.xml
  mixxx/res/skins/Deere1920x1200-WUXGA/skin.xml
  mixxx/res/skins/LateNight1280x1024-SXGA/skin.xml
  mixxx/res/skins/LateNight1280x800-WXGA/skin.xml
  mixxx/res/skins/LateNight1366x768-WXGA/skin.xml
  mixxx/res/skins/LateNightBlues1280x1024-SXGA/skin.xml
  mixxx/res/skins/LateNightBlues1280x800-WXGA/skin.xml
  mixxx/res/skins/LateNightBlues1366x768-WXGA/skin.xml
  mixxx/res/skins/Outline1024x600-Netbook/skin.xml
  mixxx/res/skins/Outline1024x768-XGA/skin.xml
  mixxx/res/skins/Outline800x480-WVGA/skin.xml
  mixxx/res/skins/Phoney1600x1200-UXGA/skin.xml
  mixxx/res/skins/Phoney1680x1050-WSXGA/skin.xml
  mixxx/res/skins/PhoneyDark1600x1200-UXGA/skin.xml
  mixxx/res/skins/PhoneyDark1680x1050-WSXGA/skin.xml
  mixxx/res/skins/Shade1024x600-Netbook/skin.xml
  mixxx/res/skins/Shade1024x768-XGA/skin.xml
  mixxx/res/skins/ShadeDark1024x600-Netbook/skin.xml
  mixxx/res/skins/ShadeDark1024x768-XGA/skin.xml
  mixxx/res/translations/mixxx.ts
  mixxx/res/translations/mixxx/ar.po
  mixxx/res/translations/mixxx/ast.po
  mixxx/res/translations/mixxx/bg.po
  mixxx/res/translations/mixxx/br.po
  mixxx/res/translations/mixxx/bs.po
  mixxx/res/translations/mixxx/ca.po
  mixxx/res/translations/mixxx/cs.po
  mixxx/res/translations/mixxx/da.po
  mixxx/res/translations/mixxx/de.po
  mixxx/res/translations/mixxx/el.po
  mixxx/res/translations/mixxx/en_GB.po
  mixxx/res/translations/mixxx/eo.po
  mixxx/res/translations/mixxx/es.po
  mixxx/res/translations/mixxx/et.po
  mixxx/res/translations/mixxx/eu.po
  mixxx/res/translations/mixxx/fi.po
  mixxx/res/translations/mixxx/fr.po
  mixxx/res/translations/mixxx/ga.po
  mixxx/res/translations/mixxx/gl.po
  mixxx/res/translations/mixxx/he.po
  mixxx/res/translations/mixxx/hu.po
  mixxx/res/translations/mixxx/hy.po
  mixxx/res/translations/mixxx/ia.po
  mixxx/res/translations/mixxx/id.po
  mixxx/res/translations/mixxx/is.po
  mixxx/res/translations/mixxx/it.po
  mixxx/res/translations/mixxx/ja.po
  mixxx/res/translations/mixxx/lb.po
  mixxx/res/translations/mixxx/mixxx.pot
  mixxx/res/translations/mixxx/ml.po
  mixxx/res/translations/mixxx/mn.po
  mixxx/res/translations/mixxx/mr.po
  mixxx/res/translations/mixxx/ms.po
  mixxx/res/translations/mixxx/nb.po
  mixxx/res/translations/mixxx/nl.po
  mixxx/res/translations/mixxx/nn.po
  mixxx/res/translations/mixxx/oc.po
  mixxx/res/translations/mixxx/pl.po
  mixxx/res/translations/mixxx/pt.po
  mixxx/res/translations/mixxx/pt_BR.po
  mixxx/res/translations/mixxx/ro.po
  mixxx/res/translations/mixxx/ru.po
  mixxx/res/translations/mixxx/sl.po
  mixxx/res/translations/mixxx/sr.po
  mixxx/res/translations/mixxx/sv.po
  mixxx/res/translations/mixxx/tr.po
  mixxx/res/translations/mixxx/uk.po
  mixxx/res/translations/mixxx/uz.po
  mixxx/res/translations/mixxx/zh_CN.po
  mixxx/res/translations/mixxx/zh_TW.po
  mixxx/res/translations/mixxx_ar.qm
  mixxx/res/translations/mixxx_ar.ts
  mixxx/res/translations/mixxx_ast.qm
  mixxx/res/translations/mixxx_ast.ts
  mixxx/res/translations/mixxx_bg.qm
  mixxx/res/translations/mixxx_bg.ts
  mixxx/res/translations/mixxx_br.qm
  mixxx/res/translations/mixxx_br.ts
  mixxx/res/translations/mixxx_bs.qm
  mixxx/res/translations/mixxx_bs.ts
  mixxx/res/translations/mixxx_ca.qm
  mixxx/res/translations/mixxx_ca.ts
  mixxx/res/translations/mixxx_cs.qm
  mixxx/res/translations/mixxx_cs.ts
  mixxx/res/translations/mixxx_da.qm
  mixxx/res/translations/mixxx_da.ts
  mixxx/res/translations/mixxx_de.qm
  mixxx/res/translations/mixxx_de.ts
  mixxx/res/translations/mixxx_el.qm
  mixxx/res/translations/mixxx_el.ts
  mixxx/res/translations/mixxx_en_GB.qm
  mixxx/res/translations/mixxx_en_GB.ts
  mixxx/res/translations/mixxx_eo.qm
  mixxx/res/translations/mixxx_eo.ts
  mixxx/res/translations/mixxx_es.qm
  mixxx/res/translations/mixxx_es.ts
  mixxx/res/translations/mixxx_et.qm
  mixxx/res/translations/mixxx_et.ts
  mixxx/res/translations/mixxx_eu.qm
  mixxx/res/translations/mixxx_eu.ts
  mixxx/res/translations/mixxx_fi.qm
  mixxx/res/translations/mixxx_fi.ts
  mixxx/res/translations/mixxx_fr.qm
  mixxx/res/translations/mixxx_fr.ts
  mixxx/res/translations/mixxx_ga.qm
  mixxx/res/translations/mixxx_ga.ts
  mixxx/res/translations/mixxx_gl.qm
  mixxx/res/translations/mixxx_gl.ts
  mixxx/res/translations/mixxx_he.qm
  mixxx/res/translations/mixxx_he.ts
  mixxx/res/translations/mixxx_hu.qm
  mixxx/res/translations/mixxx_hu.ts
  mixxx/res/translations/mixxx_hy.ts
  mixxx/res/translations/mixxx_ia.qm
  mixxx/res/translations/mixxx_ia.ts
  mixxx/res/translations/mixxx_id.qm
  mixxx/res/translations/mixxx_id.ts
  mixxx/res/translations/mixxx_is.qm
  mixxx/res/translations/mixxx_is.ts
  mixxx/res/translations/mixxx_it.qm
  mixxx/res/translations/mixxx_it.ts
  mixxx/res/translations/mixxx_ja.qm
  mixxx/res/translations/mixxx_ja.ts
  mixxx/res/translations/mixxx_lb.qm
  mixxx/res/translations/mixxx_lb.ts
  mixxx/res/translations/mixxx_ml.qm
  mixxx/res/translations/mixxx_ml.ts
  mixxx/res/translations/mixxx_mn.qm
  mixxx/res/translations/mixxx_mn.ts
  mixxx/res/translations/mixxx_mr.qm
  mixxx/res/translations/mixxx_mr.ts
  mixxx/res/translations/mixxx_ms.qm
  mixxx/res/translations/mixxx_ms.ts
  mixxx/res/translations/mixxx_nb.qm
  mixxx/res/translations/mixxx_nb.ts
  mixxx/res/translations/mixxx_nl.qm
  mixxx/res/translations/mixxx_nl.ts
  mixxx/res/translations/mixxx_nn.qm
  mixxx/res/translations/mixxx_nn.ts
  mixxx/res/translations/mixxx_oc.qm
  mixxx/res/translations/mixxx_oc.ts
  mixxx/res/translations/mixxx_pl.qm
  mixxx/res/translations/mixxx_pl.ts
  mixxx/res/translations/mixxx_pt.qm
  mixxx/res/translations/mixxx_pt.ts
  mixxx/res/translations/mixxx_pt_BR.qm
  mixxx/res/translations/mixxx_pt_BR.ts
  mixxx/res/translations/mixxx_ro.qm
  mixxx/res/translations/mixxx_ro.ts
  mixxx/res/translations/mixxx_ru.qm
  mixxx/res/translations/mixxx_ru.ts
  mixxx/res/translations/mixxx_sl.qm
  mixxx/res/translations/mixxx_sl.ts
  mixxx/res/translations/mixxx_sr.qm
  mixxx/res/translations/mixxx_sr.ts
  mixxx/res/translations/mixxx_sv.qm
  mixxx/res/translations/mixxx_sv.ts
  mixxx/res/translations/mixxx_tr.qm
  mixxx/res/translations/mixxx_tr.ts
  mixxx/res/translations/mixxx_uk.qm
  mixxx/res/translations/mixxx_uk.ts
  mixxx/res/translations/mixxx_uz.qm
  mixxx/res/translations/mixxx_uz.ts
  mixxx/res/translations/mixxx_zh_CN.qm
  mixxx/res/translations/mixxx_zh_CN.ts
  mixxx/res/translations/mixxx_zh_TW.ts
  mixxx/src/analyser.h
  mixxx/src/analyserbeats.cpp
  mixxx/src/analyserbeats.h
  mixxx/src/analyserbpm.cpp
  mixxx/src/analyserbpm.h
  mixxx/src/analyserqueue.cpp
  mixxx/src/analyserqueue.h
  mixxx/src/analyserrg.cpp
  mixxx/src/analyserrg.h
  mixxx/src/analyserwaveform.cpp
  mixxx/src/analyserwaveform.h
  mixxx/src/basetrackplayer.cpp
  mixxx/src/configobject.cpp
  mixxx/src/configobject.h
  mixxx/src/controllers/dlgcontrollerlearning.cpp
  mixxx/src/controllers/hid/hidcontroller.cpp
  mixxx/src/controllers/hid/hidcontroller.h
  mixxx/src/controllers/hid/hidenumerator.cpp
  mixxx/src/dlgautodj.cpp
  mixxx/src/dlgautodj.ui
  mixxx/src/dlgprefbeats.cpp
  mixxx/src/dlgprefbeatsdlg.ui
  mixxx/src/dlgprefcontrols.cpp
  mixxx/src/dlgprefcontrols.h
  mixxx/src/dlgprefcontrolsdlg.ui
  mixxx/src/dlgprefcrossfaderdlg.ui
  mixxx/src/dlgprefeqdlg.ui
  mixxx/src/dlgprefplaylist.cpp
  mixxx/src/dlgprefplaylistdlg.ui
  mixxx/src/dlgprefrecord.cpp
  mixxx/src/dlgprefreplaygaindlg.ui
  mixxx/src/dlgprefshoutcast.cpp
  mixxx/src/dlgprefshoutcastdlg.ui
  mixxx/src/dlgprefsounditem.cpp
  mixxx/src/dlgprefsounditem.h
  mixxx/src/dlgprepare.ui
  mixxx/src/dlgtrackinfo.cpp
  mixxx/src/dlgtrackinfo.ui
  mixxx/src/engine/cuecontrol.cpp
  mixxx/src/engine/cuecontrol.h
  mixxx/src/engine/engineshoutcast.cpp
  mixxx/src/engine/engineshoutcast.h
  mixxx/src/errordialoghandler.cpp
  mixxx/src/errordialoghandler.h
  mixxx/src/library/baseplaylistfeature.cpp
  mixxx/src/library/basesqltablemodel.cpp
  mixxx/src/library/basesqltablemodel.h
  mixxx/src/library/browse/browsefeature.cpp
  mixxx/src/library/browse/browsefeature.h
  mixxx/src/library/browse/browsethread.cpp
  mixxx/src/library/cratetablemodel.cpp
  mixxx/src/library/cratetablemodel.h
  mixxx/src/library/dao/analysisdao.cpp
  mixxx/src/library/dao/analysisdao.h
  mixxx/src/library/dao/cratedao.cpp
  mixxx/src/library/dao/libraryhashdao.cpp
  mixxx/src/library/dao/playlistdao.cpp
  mixxx/src/library/dao/playlistdao.h
  mixxx/src/library/dao/trackdao.cpp
  mixxx/src/library/dao/trackdao.h
  mixxx/src/library/itunes/itunesfeature.cpp
  mixxx/src/library/itunes/itunesfeature.h
  mixxx/src/library/itunes/itunesplaylistmodel.cpp
  mixxx/src/library/itunes/itunestrackmodel.cpp
  mixxx/src/library/library.cpp
  mixxx/src/library/libraryscanner.cpp
  mixxx/src/library/libraryscanner.h
  mixxx/src/library/librarytablemodel.cpp
  mixxx/src/library/librarytablemodel.h
  mixxx/src/library/missingtablemodel.cpp
  mixxx/src/library/missingtablemodel.h
  mixxx/src/library/playlisttablemodel.cpp
  mixxx/src/library/playlisttablemodel.h
  mixxx/src/library/proxytrackmodel.cpp
  mixxx/src/library/proxytrackmodel.h
  mixxx/src/library/queryutil.h
  mixxx/src/library/rhythmbox/rhythmboxfeature.cpp
  mixxx/src/library/rhythmbox/rhythmboxfeature.h
  mixxx/src/library/schemamanager.cpp
  mixxx/src/library/setlogfeature.cpp
  mixxx/src/library/stardelegate.h
  mixxx/src/library/trackcollection.cpp
  mixxx/src/library/trackcollection.h
  mixxx/src/library/trackmodel.h
  mixxx/src/library/traktor/traktorfeature.cpp
  mixxx/src/library/traktor/traktorfeature.h
  mixxx/src/library/treeitem.cpp
  mixxx/src/library/treeitem.h
  mixxx/src/mixxx.cpp
  mixxx/src/mixxxkeyboard.cpp
  mixxx/src/mixxxkeyboard.h
  mixxx/src/playerinfo.cpp
  mixxx/src/playerinfo.h
  mixxx/src/recording/defs_recording.h
  mixxx/src/recording/encodermp3.cpp
  mixxx/src/recording/enginerecord.cpp
  mixxx/src/recording/enginerecord.h
  mixxx/src/recording/recordingmanager.cpp
  mixxx/src/recording/recordingmanager.h
  mixxx/src/skin/legacyskinparser.cpp
  mixxx/src/skin/legacyskinparser.h
  mixxx/src/soundmanager.cpp
  mixxx/src/soundmanager.h
  mixxx/src/track/beatgrid.cpp
  mixxx/src/track/beatgrid.h
  mixxx/src/track/beatmap.cpp
  mixxx/src/track/beatmap.h
  mixxx/src/track/beats.h
  mixxx/src/trackinfoobject.cpp
  mixxx/src/trackinfoobject.h
  mixxx/src/vamp/vampanalyser.cpp
  mixxx/src/waveform/renderers/glslwaveformrenderersignal.cpp
  mixxx/src/waveform/renderers/glslwaveformrenderersignal.h
  mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
  mixxx/src/waveform/renderers/glwaveformrendererfilteredsignal.h
  mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
  mixxx/src/waveform/renderers/glwaveformrenderersimplesignal.h
  mixxx/src/waveform/renderers/waveformmark.cpp
  mixxx/src/waveform/renderers/waveformmark.h
  mixxx/src/waveform/renderers/waveformrenderbeat.cpp
  mixxx/src/waveform/renderers/waveformrenderbeat.h
  mixxx/src/waveform/renderers/waveformrendererendoftrack.cpp
  mixxx/src/waveform/renderers/waveformrendererfilteredsignal.cpp
  mixxx/src/waveform/renderers/waveformrendererfilteredsignal.h
  mixxx/src/waveform/renderers/waveformrendermark.cpp
  mixxx/src/waveform/renderers/waveformrendermark.h
  mixxx/src/waveform/renderers/waveformwidgetrenderer.cpp
  mixxx/src/waveform/renderers/waveformwidgetrenderer.h
  mixxx/src/waveform/waveform.cpp
  mixxx/src/waveform/waveform.h
  mixxx/src/waveform/waveformfactory.cpp
  mixxx/src/waveform/waveformfactory.h
  mixxx/src/waveform/waveformwidgetfactory.cpp
  mixxx/src/waveform/widgets/glsimplewaveformwidget.cpp
  mixxx/src/waveform/widgets/glsimplewaveformwidget.h
  mixxx/src/waveform/widgets/glslwaveformwidget.cpp
  mixxx/src/waveform/widgets/glslwaveformwidget.h
  mixxx/src/waveform/widgets/glwaveformwidget.cpp
  mixxx/src/waveform/widgets/softwarewaveformwidget.cpp
  mixxx/src/waveform/widgets/softwarewaveformwidget.h
  mixxx/src/waveform/widgets/waveformwidgettype.h
  mixxx/src/widget/wlibrarytableview.cpp
  mixxx/src/widget/woverview.cpp
  mixxx/src/widget/woverview.h
  mixxx/src/widget/wslidercomposed.h
  mixxx/src/widget/wspinny.cpp
  mixxx/src/widget/wstatuslight.cpp
  mixxx/src/widget/wtracktableview.cpp
  mixxx/src/widget/wtracktableview.h
  mixxx/src/widget/wwaveformviewer.cpp
  mixxx/vamp-plugins/SConscript
  mixxx/vamp-plugins/libmain.cpp
  mixxx/res/controllers/EKS Otus.cntrlr.xml
unknown:
  mixxx/.sconf_temp/
  mixxx/.sconsign.dblite
  mixxx/Mixxx/
  mixxx/cache/
  mixxx/config.log
  mixxx/lin32_build/
  mixxx/mixxx
  mixxx/output.txt
  mixxx/lib/vamp-2.3/src/vamp-sdk/PluginAdapter.os
  mixxx/lib/vamp-2.3/src/vamp-sdk/RealTime.os
  mixxx/res/qrc_mixxx.cc
pending merges:
  RJ Ryan 2012-05-24 [merge] Merging from lp:~mixxxdevelopers/mixxx/trunk_translations. Upda...
    Launchpad Translation... 2012-05-20 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-18 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-17 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-16 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-15 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-14 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-13 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-12 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-11 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-10 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-09 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-08 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-07 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-06 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-05 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-04 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-03 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-02 Launchpad automatic translations update.
    Launchpad Translation... 2012-05-01 Launchpad automatic translations update.
    Launchpad Translation... 2012-04-30 Launchpad automatic translations update.
    RJ Ryan 2012-05-24 Fix improper use of MultiByteToWideChar and WideCharToMultiByte in ...
    RJ Ryan 2012-05-24 Revert all debug output I added to debug the VAMP plugin on Windows...
    RJ Ryan 2012-05-24 Revert noisy plugin-path debug output.
    RJ Ryan 2012-05-24 Fix usage of MultiByteToWideChar in VAMP PluginLoader to include an...
    RJ Ryan 2012-05-23 Getting closer to a Windows VAMP plugin fix.
    RJ Ryan 2012-05-23 Getting closer to a Windows VAMP plugin fix.
    vrince 2012-05-23 [merge] Merge from trunk
    RJ Ryan 2012-05-23 Disable some debug console stuff I was trying.
    vrince 2012-05-23 Add WaveformMarkSet in order to generalize WaveformMark skin extract...
    RJ Ryan 2012-05-23 Disable DEBUGCONSOLE ifdef.
    RJ Ryan 2012-05-23 Add Max Linke's patch to put delegateForColumn in BSTM. Fixes Bug #...
    RJ Ryan 2012-05-22 Remove UNICODE definition. Write stdout/stderr/cerr/cout to file on...
    RJ Ryan 2012-05-22 Sigh. Adding excessive logging to PluginLoader. Will revert later.
    Daniel Schürmann 2012-05-22 check if track exists without cache, fix bug #974640
    RJ Ryan 2012-05-22 Try to fix Windows VAMP plugin loading by defining UNICODE.
    RJ Ryan 2012-05-22 Add windows debug output to VAMP plugin detection.
    RJ Ryan 2012-05-22 Use Int32_t instead of int32_t.
    RJ Ryan 2012-05-20 Fix BPM lock checkbox inconsistent behavior. Fixes Bug #1002051
    RJ Ryan 2012-05-20 Check BPM-lock for selection to decide whether to allow the clear-b...
    RJ Ryan 2012-05-20 Do not save waveforms immediately after generating them since the t...
    RJ Ryan 2012-05-20 Remove Qt::WA_ForceUpdatesDisabled from WWaveformViewer. Fixes Bug ...
    RJ Ryan 2012-05-20 Don't set StarDelegate as the delegate for every single cell. Inste...
    RJ Ryan 2012-05-20 [merge] Merging from lp:~hile/mixxx/hidscripts
    Ilkka Tuohela 2012-05-20 Imported latest fixes to hidscripts
    Ilkka Tuohela 2012-05-20 Imported latest fixes to hidscripts
    Ilkka Tuohela 2012-05-20 Imported latest fixes to hidscripts
    Ilkka Tuohela 2012-05-18 Minor fixes for LED control
    Ilkka Tuohela 2012-05-18 Imported latest big API changes
    Ilkka Tuohela 2012-05-18 Renamed field add functions, fix sparse bitVector index parsing
    Ilkka Tuohela 2012-05-18 Imported common-hid-packet-parser.js and latest Otus HID updates
    Daniel Schürmann 2012-05-20 fixed recording folder, Bug #925663
    RJ Ryan 2012-05-19 Update blacklisting logic and add comments.
    RJ Ryan 2012-05-19 [merge] Merging from lp:~hile/mixxx/hidblacklist.
    Ilkka Tuohela 2012-05-16 Imported HID blacklist patch proposal
    RJ Ryan 2012-05-19 Fix build. Mea culpa.
    RJ Ryan 2012-05-18 Fix widget names for translation.
    RJ Ryan 2012-05-18 [merge] Merging from lp:~vrince/mixxx/waveform-2.0_pure-gl
    vrince 2012-05-16 Change defaul zoom to 3 (33%)
    vrince 2012-05-16 Add DefaulMark support (see example in <visual> of Deere1280x800 skin)
    vrince 2012-05-16 Waveform interactive zoom in accessible everywhere in the waveform v...
    vrince 2012-05-15 Some comments
    vrince 2012-05-13 Add central waveform axe (and 'AxesColor' in skin) in all waveform r...
    vrince 2012-05-12 [merge] Merged from trunk
    vrince 2012-05-11 Disable end of track display for track shorter than end of track tri...
    vrince 2012-05-11 Add support for alignment in software signal renderer (and fix globa...
    vrince 2012-05-10 Use of visual gain in every waveform renderer (and add overall and p...
    vrince 2012-05-08 Update software signal renderer with lst signal base
    vrince 2012-05-08 Add QtSimpleWaveform and QtWaveformRendererSimpleSignal (move conten...
    vrince 2012-05-08 Add support for alignment in GLWaveformRendererFilteredSignal
    vrince 2012-05-08 Add new waveform widget QtWaveformWidget
    vrince 2012-05-08 Add WaveformRendererSignalBase to avoid duplicated code
    vrince 2012-05-07 [merge] Merge from trunk
    vrince 2012-05-07 Integrate test version with pure gl with triangles
    vrince 2012-05-03 introduce pure opengl signal render based on triangles (from old tes...
    Owen Williams 2012-05-16 Protect against NULL trackpointer when load fails
    Daniel Schürmann 2012-05-16 two more __OSX__->__APPLE__
    Daniel Schürmann 2012-05-16 __OSX__->__APPLE__, fix bug #999560
    Daniel Schürmann 2012-05-16 redo changes from mixxxdj#3157, which where lost in mixxxdj#3159
    Daniel Schürmann 2012-05-16 Add to Auto-DJ Top with empty Auto-DJ, fix bug #982652
    Daniel Schürmann 2012-05-15 fixed shortcuts for eject and LoadSelectedTrack, a partial...
    Daniel Schürmann 2012-05-15 [merge] fixed missing shortcuts in tooltips, bug #696058
    Daniel Schürmann 2012-05-15 fixed missing shortcuts in tooltips, bug #696058
    RJ Ryan 2012-05-15 Fix Windows build.
    RJ Ryan 2012-05-15 Set shoutcast stream public based on stream_public preference. Fixe...
    Daniel Schürmann 2012-05-15 fix *.kbd.cfg location
    RJ Ryan 2012-05-14 Forgot return value.
    RJ Ryan 2012-05-14 If QLocale::uiLanguages() has English as the first language then do...
    RJ Ryan 2012-05-14 [merge] Merge from lp:mixxx/1.10
    RJ Ryan 2012-05-14 Typo
    Daniel Schürmann 2012-05-14 additional keyboard layouts added
    Daniel Schürmann 2012-05-14 Load keyboard mappings based on actual keyboard layout, fi...
    RJ Ryan 2012-05-14 Delete AnalyserGainVamp and ReplayGain from libmixxxminimal.
    RJ Ryan 2012-05-14 Disable AnalyserGainVamp and use the built-in RG analyser for all a...
    RJ Ryan 2012-05-14 [merge] Merging from lp:mixxx/1.10.
    RJ Ryan 2012-05-14 Add vittorio's C++ and class-ified conversion of ReplayGain analyse...
    Daniel Schürmann 2012-05-14 removed absolute path when loading lame, fix bug #920191
    Daniel Schürmann 2012-05-14 hide smb songs from Rhythmbox library
    Bill Good 2012-05-13 Fixed SoundManager from filtering input devices with only 1 channel
    Bill Good 2012-05-13 Fixed DlgPrefSoundItem to only show devices with sufficient channels
    Bill Good 2012-05-13 Added unistd.h include for sleep(3) on non-Windows
    Daniel Schürmann 2012-05-14 removed absolute path when loading lame, fix bug #920191
    RJ Ryan 2012-05-14 Update translation templates.:
    RJ Ryan 2012-05-14 Fix spelling of coarse in MIDI learning.
    Daniel Schürmann 2012-05-14 hide smb songs from Rhythmbox library
    jus 2012-05-14 Update translation template
    Daniel Schürmann 2012-05-13 eject played track on end of Auto-DJ playlist, fix bug mixxxdj#99...
    RJ Ryan 2012-05-12 Rework ErrorDialogHandler to be a little cleaner and not Q_ASSERT.
    RJ Ryan 2012-05-12 [merge] Merging from lp:mixxx/1.10
    RJ Ryan 2012-05-12 Do not use display strings to store/communicate shoutcast preferenc...
    RJ Ryan 2012-05-11 Fix deadlock in BrowseThread. Fixes Bug #955179
    Daniel Schürmann 2012-05-12 fixed outline skin kill buttons
    Sean M. Pappalardo 2012-05-12 Prevent HIDAPI from bailing out on non-critical libusb e...
    RJ Ryan 2012-05-12 Add patch from mutil to allow customization of Browse section Quick...
    Owen Williams 2012-05-11 Make sure analyzers are cleaned up before we requeue a track
    RJ Ryan 2012-05-11 Fix deadlock in BrowseThread. Fixes Bug #955179
    RJ Ryan 2012-05-11 Add /usr/lib/mixxx to install directories in Debian packaging scripts.
    Owen Williams 2012-05-11 Make track analysis interruptable so loaded tracks always get...
    RJ Ryan 2012-05-11 Use SoundSource samplerate instead of TrackInfoObject samplerate in...
    RJ Ryan 2012-05-11 Add daschuer's patch to allow enabling/disabling of iTunes/Traktor/...
    RJ Ryan 2012-05-11 Add daschuer's patch to allow importing external-library playlists ...
    RJ Ryan 2012-05-10 Add Tom Gascoigne's patch to add a locale preference option, allowi...
    RJ Ryan 2012-05-10 Change WStatusLight behavior so that PathBack is not drawn on every...
    RJ Ryan 2012-05-10 Use a CO instead of COTM in SoundManager.
    Daniel Schürmann 2012-05-10 fix bug #900255 losing keyboard release events
    RJ Ryan 2012-05-10 Add path from mutil to show help text when clicking the main browse...
    RJ Ryan 2012-05-09 Set SoundManager status to disconnected if we fail to open a device...
    RJ Ryan 2012-05-09 Forgot to create CO for SoundManager.
    RJ Ryan 2012-05-09 Add patch from Maxime Bochon to suggest a filename based on the pla...
    RJ Ryan 2012-05-09 Add [SoundManager],status [Recording],status and [Shoutcast],status...
    jus <https://launchpa... 2012-05-09 Update translation template
    jus <https://launchpa... 2012-05-09 Small tooltips fixes (Typo, Double space, Capitali...
    RJ Ryan 2012-05-08 Remove Q_ASSERT on query failure and another Q_ASSERT on rollback.
    RJ Ryan 2012-05-08 Fix iTunes scanner so it doesn't run with the main thread database ...
    RJ Ryan 2012-05-08 Close DB connection on shutdown in AnalyserWaveform.
    RJ Ryan 2012-05-08 Add connectionName to debug output.
    RJ Ryan 2012-05-08 Don't clone the QSqlDatabase in AnalysisDao.
    RJ Ryan 2012-05-08 Convert all transactions to use ScopedTransaction so should never b...
    RJ Ryan 2012-05-08 Add missing rollback and delete unused SQL statement.
    RJ Ryan 2012-05-08 Fix typo.
    RJ Ryan 2012-05-08 Prioritize tracks that are loaded when choosing the next track to a...
    RJ Ryan 2012-05-08 Fix typo.
    RJ Ryan 2012-05-08 Update translation templates so LP translators can start work on to...
    RJ Ryan 2012-05-08 Wordsmith and de-duplicate tooltips.
    jus 2012-05-08 Adds a selectable Tracks File Path display in the now less high track e...
    RJ Ryan 2012-05-08 [merge] Merging from lp:~mixxxdevelopers/mixxx/1.11-skins
    jus 2012-05-08 [merge] Merge from trunk
    jus 2012-05-08 [merge] Merge from trunk
    jus 2012-05-08 Oops, fix copypasta error
    jus 2012-05-08 [merge] Merge from trunk
    jus 2012-05-08 Make "orientation" TooltipID more unambiguous
    jus 2012-05-08 Removed individual Tooltip text in all skin.xml. Tooltip now use a Tool...
    jus 2012-05-08 Add bpm_tap_visual_bpm TooltipId to tooltips.cpp . This is a special ca...
    jus 2012-05-08 Unify heading word capitalization for displayed tooltips in tooltips.cpp
    jus 2012-05-08 Add track_duration, track_album, text , TooltipId`s to tooltips.cpp
    jus 2012-05-08 Fix spelling in tooltips.cpp
    jus 2012-05-08 [merge] Merge from trunk
    jus 2012-05-06 Revert last commit, cause the crossfaders ALT+H shortcut is already tak...
    jus 2012-05-06 Added shortcuts to switch the crossfader from left to right channel in ...
    jus 2012-05-06 [merge] Merge from trunk
    jus 2012-05-05 Add tooltips for all buttons in dlgprepare.ui
    jus 2012-05-05 Add tooltips for ramping pitchbend in dlgprefcontrolsdlg.ui
    jus 2012-05-04 Align the call to action button to the right like in all other preferen...
    jus 2012-05-04 Unify wording, use "Reset to Defaults" accross all preferences panes ( ...
    jus 2012-05-04 Clean up Preferences->Interface widget, fix lp:992144
    jus 2012-05-04 [merge] Merge from trunk
    jus 2012-05-04 Apply styles to spinbox in AutoDJ tab in all skin.xml
    jus 2012-05-04 Made QSpinbox in dlgautodj.ui frameless and remove its fixed size. Need...
    jus 2012-05-04 Added QSpinbox to the existing workaround to support legacy color styli...
    jus 2012-05-04 Fix mini tooltips typo in all skin.xml
    jus 2012-05-03 [merge] Merge from trunk
    jus 2012-05-03 Fix typo in recordings preferences
    jus 2012-05-03 Update icons for the renamed History feature (was Set Log)
    jus 2012-05-02 [merge] Merge from trunk
    jus 2012-05-01 Update tooltips & use of EmitOnPressAndRelease for bpm_tab in Phoney(Da...
    jus 2012-05-01 Fix spacing in some skin.xml
    jus 2012-05-01 Added element missed in the previous copypasta fest in Deere1440x900-WX...
    jus 2012-05-01 Update tooltips & use of EmitOnPressAndRelease for bpm_tab with Outline...
    jus 2012-05-01 Bump target Mixxx version to 1.11 in skin.xml & CHANGELOG.txt
    jus 2012-05-01 Deere skin family: Move changelog from skin.xml to separate CHANGELOG.t...
    jus 2012-05-01 Shade skin family: Move changelog from skin.xml to separate CHANGELOG.t...
    jus 2012-05-01 PhoneyDark skin family: Move changelog from skin.xml to separate CHANGE...
    jus 2012-05-01 Phoney skin family: Move changelog from skin.xml to separate CHANGELOG....
    jus 2012-05-01 Outline skin family: Move changelog from skin.xml to separate CHANGELOG...
    jus 2012-05-01 LateNightBlues skin family: Move changelog from skin.xml to separate CH...
    jus 2012-05-01 LateNight skin family: Move changelog from skin.xml to separate CHANGEL...
    jus 2012-05-01 Deere skin family: Move changelog from skin.xml to separate CHANGELOG.t...
    jus 2012-05-01 Support <Mark> (Hot)Cue and <MarkRange> Loop marker in waveform <Overvi...
    RJ Ryan 2012-05-08 Add patch from mutil to add right-click 'Open in file browser' cont...
    RJ Ryan 2012-05-08 Don't short-circuit Analyser::initialise calls.
    RJ Ryan 2012-05-08 Revert r3103.
    Sean M. Pappalardo 2012-05-08 Write beat detection defaults to config file on startup ...
    Sean M. Pappalardo 2012-05-08 Fixed waveforms again after r3101
    RJ Ryan 2012-05-08 Add waveform analyser to prepare-analyser-queue so that waveforms w...
    RJ Ryan 2012-05-08 Don't run the analyser-queue on tracks for which no analyser wants ...
    RJ Ryan 2012-05-08 [merge] Merging from lp:mixxx/1.10
    RJ Ryan 2012-05-08 Fix integer overflow when using 4GB recording splits. Fixes Bug mixxxdj#95...
    RJ Ryan 2012-05-07 Fix deletion order in DlgAutoDJ to fix header-state saving for the ...
    RJ Ryan 2012-05-07 Move tooltips out of skins and into src/skin/tooltips.cpp. Add Tool...
    RJ Ryan 2012-05-07 Re-work Beats::findBeats to not append to a QList<double>. Instead,...
    Owen Williams 2012-05-06 Add vinylcontrol_enabled to midi learning (lp:#995658)
    RJ Ryan 2012-05-06 [merge] Merging from lp:mixxx/1.10
    RJ Ryan 2012-05-06 Remove Q_ASSERT on angle in WSpinny and gracefully handle the error...
@rryan
Copy link
Member Author

rryan commented Dec 5, 2013

Enabling and disabling keylock now adjusts the pitch so that the effective key does not change. This results in the pitch slider jumping around a lot (which will screw up MIDI controllers if soft-takeover is not enabled). Maybe this could become a preference option at some point? I also reverted the skin changes.

@rryan
Copy link
Member Author

rryan commented Dec 5, 2013

Playing with this new behavior, I realize that I often do this:

  • Load a track.
  • Change the rate to beatmatch it to the other deck.
  • Realize it sounds bad with the pitch changed.
  • Enable keylock to return it to its natural pitch.

My expectation built up from all previous Mixxx versions has been that hitting keylock returns the track to its natural pitch. The new behavior actually locks the track at the pitch I didn't want.

The new required series of steps (if I only discover I don't want the pitch after beatsyncing):

  • Load a track.
  • Change the rate to beatmatch it to the other deck.
  • Realize it sounds bad with the pitch changed.
  • Enable keylock to make the pitch independent of the speed slider. (pitch stays the same)
  • Right-click the pitch knob/fader (whichever UI element we end up with) to return the pitch to 0.

@daschuer
Copy link
Member

daschuer commented Dec 5, 2013

If the key detector returns the number 13.0 there's no way to know if that's 12.0 plus a 100 cent shift. And 12 to 13 crosses the major/minor barrier so information is corrupted.

The key detector must not return 13.0 in this case. It is 1 again.

Key Name         Key value  Cents from Tonic C 
INVALID          0          -     
C_MAJOR          1          0
D_FLAT_MAJOR     2          100
B_MAJOR          12         1100
B_MAJOR +100                           <- invalid its a C_MAJOR
B_MAJOR +49      12.49      1149
B_MAJOR +51                            <- invalid its a C_MAJOR -49 
B_MAJOR +90                            <- invalid its a C_MAJOR -10 
C_MAJOR -49      0.51       1159 
C_MINOR          13         0
C_MINOR -10      12.90      1190
C_Minor -49      12.51      1159 

In this example it wraps at 12.49. We may consider to wrap at 12.99. Its only a case of definition.
We have to be sure, that the chord is not changes by the concert pitch.
Of course you can play C_MINOR notes on an instrument with a concert pitch of A440 - 100 cents -> A415.
But If we translate this to the Mixxx world with A440, it becomes a B_MINOR track.

The question I have is whether the extra resolution in the QM key detector is actually meaningfully predictive of the song's actual concert pitch. If it is then we might want to hack up the QM plugin to expose what it "thinks" the concert pitch of the song is.

Yes that is really the "jumping point" and an interesting question. If we look at how the key detection work, it should be meaningful because the track chroma is turned on the chroma of a reference chord to find a Maximum. The initial tuning value changes the start angel, thats all.

@daschuer
Copy link
Member

daschuer commented Dec 5, 2013

Thank you @cpill0789

While [tONaRT] key detection is robust across different musical genres etc., the algo-
rithm expects the input signal to be homogenous, i.e. to contain only one key without
(too much) modulations. The standard pitch detection has an accuracy of app. 1-2Hz
at 440Hz

It looks like [tONaRT] could be a nice addition in future version of Mixxx, but it is not a FOSS library :-(

OK, here is what I have learned from our discussion:

  1. If we assume a constant concert pitch of a track (this should be the case if the guitar player does not use the fender to much) it seams to be reasonable to store a single global concert pitch independent from the keys.
    This keeps the stored data small and seems to be a good compromise
  2. Finally it is up to RJ to deside what is the best way to user all the pitch value in the code. I would like a floating point representation.
  3. the QM 33 cent resolution is to big to detect the concert pitch. A Key of e.g 1.33 could be more a hind that the track is not western music or totally off pitch.

@danlin
Copy link
Contributor

danlin commented Dec 5, 2013

some side information:
you talk about [tONaRt] as i know Mixed in Key use this Lib (with some cloud Addons to faster detect stuff)

http://www.djtechtools.com/2012/01/26/key-detection-software-showdown-2012-edition/

and Rapid Evolution is now Open Source! (good key detection)
https://github.com/djqualia/RapidEvolution3?source=cc

@ywwg
Copy link
Member

ywwg commented Dec 5, 2013

Does anyone know what traktor or serato do when keylock is pushed? I definitely have had cases where I want the pitch to stay the same when switching from vinyl style to keylock, but I can't because the slider isn't at zero. But I also understand not wanting to lose the beatmatch. A tuning knob would fix the problem for sure but adding yet another knob is hard to justify.

Maybe instead of a preference we can have a separate CO, key_maintain -- which holds the current pitch instead of resetting to natural pitch? This is harder for users to configure, I guess.

So all of the options I see:

  1. Keep current behavior, do not support going from vinyl-style to keylock and maintaining pitch
  2. Always maintain pitch, do not support returning to natural pitch without losing beatmatch
  3. A new preference to choose from the above options
  4. A new bindable CO that allows second behavior (could be attached to long-press perhaps?)
  5. The second behavior plus a new tuning knob so the pitch can be reset to natural if the users wishes it.

@rryan
Copy link
Member Author

rryan commented Dec 5, 2013

Ok, I think we're all agreed on storing concert_pitch as a float alongside the detected key!

My main question now is whether this should be part of the key detection result.

Some key detectors may not detect concert pitch (such as keyfinder and QM keydetect) but some do (such as tonart). Also, there may be some standalone concert pitch detector out there. To make matters more complicated, all key detectors we've seen also take a concert pitch as an input to allow compensating for a known different-than-A440 concert pitch.

So I think it's safe to say these are separate analysis processes. This makes me think we should add a totally separate analysis result for concert pitch and not store it in the key detection results protocol buffer.

For example, we may want to let the user manually enter the concert pitch before running the key detector. This would be awkward if that user-entered concert pitch data was stored in an empty key detection result proto. When the key detector finishes, would we merge it with the existing key detection proto or replace it?

So, I'll leave concert pitch detection/manual-entry and compensation for a future project. Sound good?

@rryan
Copy link
Member Author

rryan commented Dec 5, 2013

RE: Owen -- lets go with the current behavior and see if anyone complains in beta testing. We can add a preference option and manual COs if requested. I just want to avoid adding complexity before it's been requested by a user :).

@cpill0789
Copy link
Member

@rryan: sounds good to me.

@daschuer
Copy link
Member

daschuer commented Dec 5, 2013

I also support the idea of an independent concert_pitch.

It should be limited to +- 50 cents of A440 (the Mixxx concert pitch) to avoid changing keys by concert pitch.

Use cases:

  1. improve the key detection by tune it to a known concert pitch (e.g. Boston Symphony Orchestra ;-))
  2. It should be easy changeable after you have made two tracks fit by ear
  3. It should be set by detection result of concert pitch detectors, but lockable to avoid results from ear.

For me all that is not required for a merge, but the merged version should be able to support it later.

Conflicts:
	src/library/dao/trackdao.cpp
@rryan
Copy link
Member Author

rryan commented Dec 6, 2013

Ugh, adding a preference option probably means adding an "Engine" or "Tempo / Pitch Control" preference tab. The setting doesn't really fit in any existing tab.

Since the branch is stable and doesn't require any more data model changes I'm going to merge it. UI issues and preference options can be fixed in master.

I filed a bug for the preference option: https://bugs.launchpad.net/mixxx/+bug/1258560

Thanks for all the comments! (we just barely made it to centi-thread)

rryan added a commit that referenced this pull request Dec 6, 2013
Key detection and pitch shifting.
@rryan rryan merged commit 7b90777 into mixxxdj:master Dec 6, 2013
@ywwg
Copy link
Member

ywwg commented Dec 6, 2013

hooray!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants