<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Mixxx</title><link href="//mixxx.acolombier.dev/" rel="alternate"></link><link href="//mixxx.acolombier.dev/feed.xml" rel="self"></link><id>//mixxx.acolombier.dev/</id><updated>2026-02-24T16:19:24+01:00</updated><entry><title>Google Summer of Code 2026, Up-Mixxx your skills with Google</title><link href="//mixxx.acolombier.dev/news/2026-02-24-mixxx-accepted-for-gsoc-2026" rel="alternate"></link><published>2026-02-24T16:19:24+01:00</published><updated>2026-02-24T16:19:24+01:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2026-02-24:/news/2026-02-24-mixxx-accepted-for-gsoc-2026</id><summary type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2026/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2026&lt;/a&gt;, a global program focused on bringing new contributors into open source software development. This is a great opportunity for us to attract new contributors, as they will receive a stipend sponsored by Google.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We're very proud to announce that Mixxx has been accepted again this year as a &lt;a href="https://summerofcode.withgoogle.com/programs/2025/organizations/mixxx"&gt;mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2026&lt;/a&gt;, a global program focused on bringing new contributors into open source software development. This means we are ready to welcome candidates and guide them with their first step^s in open source software and through the process of developing a sound proposal. We then devote all our energy to supporting the selected and accepted candidates, hoping their proposals will be successful. Again this is a great opportunity for us to attract new contributors, as they will receive a stipend sponsored by Google.
More info about past GSoC projects can be found in other &lt;a href="https://mixxx.org/news/"&gt;News-posts&lt;/a&gt;, eg. about the 2025 project of Anmol:  &lt;a href="https://mixxx.org/news/2025-10-27-gsoc2025-demucs-to-onnx-dhunstack/"&gt;Converting Demucs v4 (Hybrid Transformer) AI model to ONNX format&lt;/a&gt;.
We look forward to welcome you and discuss possible projects together.&lt;/p&gt;
&lt;h2&gt;How Does GSoC Work?&lt;/h2&gt;
&lt;p&gt;Google Summer of Code is a program that enables students to work on open-source projects over the summer, typically lasting between 3 to 12 weeks. Participants are matched with mentoring organizations like Mixxx, where they collaborate on various projects under the guidance of experienced mentors. For more information, check out the &lt;a href="https://google.github.io/gsocguides/student/"&gt;Google Summer of Code Contributor Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contributors will gain hands-on experience by working on an open-source project used by DJs worldwide. This will enhance their skills in software development, collaboration, and project management, which are highly valuable in the professional live. They are supported by experienced mentors and a community of developers and DJs who will help to get the right things done and are ready to clear out any obstacles when they arise.&lt;/p&gt;
&lt;h2&gt;How to Get Involved?&lt;/h2&gt;
&lt;p&gt;You will find the &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSOC-2026-Ideas"&gt;GSoC 2026 Project Ideas for Mixxx&lt;/a&gt; in our wiki, but your own ideas are also more than welcome. Taking a look at our &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsocadvice"&gt;GSoC advice page&lt;/a&gt; is recommended if you're planning to apply, on this page you can find out how to get accepted as a candidate. The best way to get started is to participate in the Mixxx community, so have a look at our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and consider making a small code contribution to show that you're able to familiarize yourself with our codebase.&lt;/p&gt;
&lt;p&gt;You could also help us, even if you are not a GSoC candidate yourself. Simply print out a &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;flyer&lt;/a&gt; and post it on the bulletin board of your local university.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;&lt;img alt="gsoc-flyer-thumbnail" src="////mixxx.acolombier.dev/images/news/gsoc-flyer-thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in past projects, take a look at the blog posts of
&lt;a href="https://mixxx.org/news/2025-10-27-gsoc2025-demucs-to-onnx-dhunstack/"&gt;Anmol Mishra&lt;/a&gt;, &lt;a href="https://mixxx.org/news/2025-08-13-gsoc2025-report-antoniogiordano/"&gt;Antonio Giordano&lt;/a&gt;, &lt;a href="https://mixxx.org/news/2025-08-04-gsoc-2025-report-armaan-chowfin/"&gt;Armaan Chowfin&lt;/a&gt;, their work still needs some fine tuning and adaptation before it can be integrated in the Mixxx-codebase.
The work of &lt;a href="https://mixxx.org/news/2024-08-26-stem-mixing/"&gt;Antoine Colombier&lt;/a&gt;, &lt;a href="https://mixxx.org/news/2024-08-24-gsoc-project-report-daniel-fernandes/"&gt;Daniel Fernandes&lt;/a&gt;, &lt;a href="https://mixxx.org/news/2022-09-08-gsoc-final-blog-david-chocholaty"&gt;David Chocholatý&lt;/a&gt; and &lt;a href="https://mixxx.org/news/2022-09-26-gsoc-final-blog-fatih-emre-yildiz"&gt;Fatih Emre YILDIZ&lt;/a&gt; has been successfully integrated into Mixxx.&lt;/p&gt;
&lt;p&gt;The official application period will start on &lt;strong&gt;March 16th&lt;/strong&gt; and ends on &lt;strong&gt;March 31th&lt;/strong&gt;, so have your applications ready in time. Potential GSoC contributors should start discussing their application ideas on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip&lt;/a&gt; now. Just start a new topic in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream. Please understand that we only engage with potential contributors via the respective channels in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream on Zulip or via the official GSoC application process.&lt;/p&gt;
&lt;p&gt;Join us in improving Mixxx and contributing to &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;free&lt;/a&gt; DJing worldwide!&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2026"></category></entry><entry><title>Mixxx 2.5.4 Released</title><link href="//mixxx.acolombier.dev/news/2025-12-14-mixxx-2_5_4-released" rel="alternate"></link><published>2025-12-14T22:54:46+01:00</published><updated>2025-12-14T22:54:46+01:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2025-12-14:/news/2025-12-14-mixxx-2_5_4-released</id><summary type="html">&lt;h4&gt;Mixxx 2.5.4 Release Announcement: bundling improvements at the end of the year.&lt;/h4&gt;
&lt;p&gt;We're proud to share our early Christmas present with you: Mixxx version 2.5.4, a new stable release of Mixxx.
This version bundles corrections, improvements and fixes for the issues you reported.&lt;br&gt;
We'd like to …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx 2.5.4 Release Announcement: bundling improvements at the end of the year.&lt;/h4&gt;
&lt;p&gt;We're proud to share our early Christmas present with you: Mixxx version 2.5.4, a new stable release of Mixxx.
This version bundles corrections, improvements and fixes for the issues you reported.&lt;br&gt;
We'd like to emphasize the importance of reporting issues and bugs and testing nightly builds of the &lt;a href="https://mixxx.org/download/#beta"&gt;beta (bugfix)&lt;/a&gt; and &lt;a href="https://mixxx.org/download/#testing"&gt;alpha (development)&lt;/a&gt; versions. This quality control ensures Mixxx continues to improve and ensures stress-free end-of-year sets for every Mixxx-DJ and Mixxx-broadcaster.
Thank you for bookmarking our &lt;a href="https://github.com/mixxxdj/mixxx/issues"&gt;github&lt;/a&gt;, &lt;a href="https://mixxx.discourse.group/"&gt;forum&lt;/a&gt; and &lt;a href="https://mixxx.zulipchat.com/"&gt;zulip&lt;/a&gt;.&lt;br&gt;
If you want to join our test-panels, leave a note in the appropriate zulip-topic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mixxx.zulipchat.com/#narrow/channel/267968-testing/topic/group.3A.20macOS_testers"&gt;if you are on macOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mixxx.zulipchat.com/#narrow/channel/267968-testing/topic/group.3A.20.20linux_testers"&gt;if you are on linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mixxx.zulipchat.com/#narrow/channel/267968-testing/topic/group.3A.20windows_testers"&gt;if you are on windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A lot of new users have found their way to Mixxx, all sharing the same passion for music in all forms: tango, techno, experimental electronic, merengue, dubstep, ... For every specific genre DJs are searching for an optimized controller mapping, adapted Auto DJ transitions or effects. Others are still searching their way in the silent darkness, you can help them by sharing your Mixxx experience, your illuminating fire can lead them to Mixxx.&lt;br&gt;
We welcome all users, we want you to DJ your own way.&lt;/p&gt;
&lt;p&gt;Have a nice Mixxx.&lt;/p&gt;
&lt;h4&gt;Highlights: important fixes in 2.5.4&lt;/h4&gt;
&lt;p&gt;Some examples of improvements and fixes, more fixes have been included to keep everything stable, up and running, and as they were required by operating system updates or Qt improvements.
The complete changelog can be found &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.5.4/CHANGELOG.md"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h5&gt;Controller Mappings&lt;/h5&gt;
&lt;p&gt;Mappings were improved and updated for Korg Kaoss DJ, Numark-NS6II, Pioneer DJ CDJ, Reloop Beatmix 2/4, Traktor S4Mk3.&lt;/p&gt;
&lt;h5&gt;Library&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Playlists: polish code for moving selected Tracks &lt;a href="https://github.com/mixxxdj/mixxx/pull/15454"&gt;#15454&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: disable all modifying actions when locked &lt;a href="https://github.com/mixxxdj/mixxx/pull/15456"&gt;#15456&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: improve performance when activating a playlist &lt;a href="https://github.com/mixxxdj/mixxx/pull/15465"&gt;#15465&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track view header: avoid narrow columns after restoring header with hidden columns
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15331"&gt;#15331&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10325"&gt;#10325&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Computer: fix "Refresh directory tree" action &lt;a href="https://github.com/mixxxdj/mixxx/pull/15301"&gt;#15301&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library scanner: make Cancel button work again
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15320"&gt;#15320&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14940"&gt;#14940&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library scanner: fix an issue when verifying remaining tracks &lt;a href="https://github.com/mixxxdj/mixxx/pull/15346"&gt;#15346&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Preferences&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Library: reset library font/row height when closing without apply &lt;a href="https://github.com/mixxxdj/mixxx/pull/15455"&gt;#15455&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Decks: fix Restore Defaults for rate slider direction and track time display
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15443"&gt;#15443&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15444"&gt;#15444&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sound Hardware: don't allow closing preferences with faulty Sound Hardware config
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14576"&gt;#14576&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/6077"&gt;#6077&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Target support&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Update macOS (Intel) runner for building Mixxx to macOS Sequoia 15 &lt;a href="https://github.com/mixxxdj/mixxx/pull/15391"&gt;#15391&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Welcome Ubuntu 26.04 LTS Resolute Raccoon &lt;a href="https://github.com/mixxxdj/mixxx/pull/15588"&gt;#15588&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;debian_buildenv.sh: assert for bash
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15274"&gt;#15274&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15273"&gt;#15273&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;debian_buildenv.sh: use /etc/os-release instead of the obsolete /etc/lsb-release &lt;a href="https://github.com/mixxxdj/mixxx/pull/15298"&gt;#15298&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;debian_buildenv.sh: fix for Ubuntu Noble (24.10) &lt;a href="https://github.com/mixxxdj/mixxx/pull/15292"&gt;#15292&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support building with Qt 6.10: Add Qt6::GuiPrivate
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15502"&gt;#15502&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15485"&gt;#15485&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Touchscreen on Windows 11: disable touch -&amp;gt; mouse event translation
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15547"&gt;#15547&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15546"&gt;#15546&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Misc&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Cover Art: Fix a rare issue causing an infinite loop and high CPU load when fetching a cover art from metadata failed unexpectedly
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15451"&gt;#15451&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15199"&gt;#15199&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Network Clock: fix writing wrong number of silence after a long underrun &lt;a href="https://github.com/mixxxdj/mixxx/pull/15400"&gt;#15400&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Menu bar: fix showing/hiding via Alt
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15352"&gt;#15352&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15350"&gt;#15350&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15396"&gt;#15396&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15385"&gt;#15385&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SoundSourceFFmpeg: Fix opening files with non ASCII characters
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/15700"&gt;#15700&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/15681"&gt;#15681&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.5.4"></category><category term="release announcement"></category></entry><entry><title>Mixxx Zulip Chat Exceeds 3,000 Members</title><link href="//mixxx.acolombier.dev/news/2025-11-17-zulip-3000_members" rel="alternate"></link><published>2025-11-17T11:42:04+01:00</published><updated>2025-11-17T11:42:04+01:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2025-11-17:/news/2025-11-17-zulip-3000_members</id><summary type="html">&lt;h4&gt;Mixxx Zulip Chat Exceeds 3,000 Members&lt;/h4&gt;
&lt;p&gt;Since moving our community discussions from our mailing list to &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt; in 2018, we have never looked back.
This month, for the first time, we have more than 3,000 registered users in our Mixxx Zulip community!&lt;/p&gt;
&lt;p&gt;We now exchange around 4,000 …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx Zulip Chat Exceeds 3,000 Members&lt;/h4&gt;
&lt;p&gt;Since moving our community discussions from our mailing list to &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt; in 2018, we have never looked back.
This month, for the first time, we have more than 3,000 registered users in our Mixxx Zulip community!&lt;/p&gt;
&lt;p&gt;We now exchange around 4,000 messages every month, something a mailing list could never handle effectively. The community continues to grow steadily, both in users and in activity, with over 60 individuals actively participating in discussions every month.&lt;/p&gt;
&lt;p&gt;Zulip has become a solid foundation of our community: a place where developers, translators, designers, and testers meet and collaborate.&lt;/p&gt;
&lt;h3&gt;Moving to Zulip&lt;/h3&gt;
&lt;p&gt;Before Zulip, we used Mailman for our mailing list and an IRC channel for instant messages for years, but we ran into several challenges:
- Cluttered threading and confusing message flow
- No shared cloud storage for files and images
- No video chat&lt;/p&gt;
&lt;p&gt;As the project and number of contributors grew, we needed a platform that could keep conversations organized and accessible to everyone.&lt;/p&gt;
&lt;p&gt;Zulip, which was open-sourced in 2015, was very promising and convinced us after a short evaluation period.
Its unique thread system was the ideal solution to replace structured email threads and instant chat rooms.&lt;/p&gt;
&lt;p&gt;Whenever a topic drifts, we can split it into a new thread, so conversations stay focused and are easy to follow.
This approach makes it possible to collaborate asynchronously across time zones without missing important context.
No need to hang around in chat rooms to avoid missing an important conversation.&lt;/p&gt;
&lt;p&gt;Thanks to Zulip, it’s now much easier to stay up to date. Our team collaboration and community engagement have both
improved significantly. Zulip works particularly well for open-source projects where many topics run in parallel, and where structure and focus are key to success.&lt;/p&gt;
&lt;p&gt;In addition to the web interface, Zulip has also a nice mobile app for Android or iOS.
It has recently received a major update, a full Flutter rewrite with fast natively compiled code.
This allows us to stay in touch easily while commuting or when away from a desktop.&lt;/p&gt;
&lt;p&gt;We enjoy unique features, like the time widget, which is always showing local time, the poll widget for fast decision making, and the pronouns field that helps people address others correctly when the gender associated with their name isn’t clear.&lt;/p&gt;
&lt;p&gt;New contributors might be sceptical of using a niche FOSS tool like Zulip. But we got feedback that they later consider it as one of the best tool for managing communication across projects. The growing number of members confirms this.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The introduction of Zulip was the right move for us. If you are in the same situation and still using a mailing list or chat rooms, give &lt;a href="https://zulip.com"&gt;Zulip&lt;/a&gt; a try.
You can self-host or use Zulip’s hosted service, and you don’t depend on a single provider for all your services.&lt;/p&gt;
&lt;p&gt;If you'd like to join us on Zulip, create an account and say hello at &lt;a href="https://mixxx.zulipchat.com/#narrow/channel/109123-introduce-yourself"&gt;introduce-yourself&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Thanks&lt;/h3&gt;
&lt;p&gt;Finally, we’d like to thank the Zulip contributors and organization for building and hosting our community instance.
Your work makes open collaboration possible for the now &amp;gt; 3,000 Mixxx contributors around the world at no cost.&lt;/p&gt;</content><category term="news"></category><category term="zulip"></category></entry><entry><title>GSOC 2025 - Converting Demucs v4 (Hybrid Transformer) AI model to ONNX format</title><link href="//mixxx.acolombier.dev/news/2025-10-27-gsoc2025-demucs-to-onnx-dhunstack" rel="alternate"></link><published>2025-10-27T07:50:04+01:00</published><updated>2025-10-27T07:50:04+01:00</updated><author><name>Anmol Mishra</name></author><id>tag:mixxx.acolombier.dev,2025-10-27:/news/2025-10-27-gsoc2025-demucs-to-onnx-dhunstack</id><summary type="html">&lt;p&gt;Imagine loading any track in Mixxx and instantly isolating the vocals, drums, bass, or instruments &lt;strong&gt;live&lt;/strong&gt;, in real time. This is the vision behind our &lt;a href="https://summerofcode.withgoogle.com/programs/2025/projects/lRQpeA7K"&gt;Google Summer of Code&lt;/a&gt; 2025 project: "Converting Demucs v4 (Hybrid Transformer) AI model to ONNX format".&lt;/p&gt;
&lt;p&gt;Mixxx 2.6 will support playback of &lt;a href="https://www.stems-music.com/"&gt;stem files …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Imagine loading any track in Mixxx and instantly isolating the vocals, drums, bass, or instruments &lt;strong&gt;live&lt;/strong&gt;, in real time. This is the vision behind our &lt;a href="https://summerofcode.withgoogle.com/programs/2025/projects/lRQpeA7K"&gt;Google Summer of Code&lt;/a&gt; 2025 project: "Converting Demucs v4 (Hybrid Transformer) AI model to ONNX format".&lt;/p&gt;
&lt;p&gt;Mixxx 2.6 will support playback of &lt;a href="https://www.stems-music.com/"&gt;stem files&lt;/a&gt; containing separate channels for different instruments. These stems can come from the original studio recordings (or DAW exports), or be generated using modern AI-based stem separation tools when the original stems aren’t available.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/adefossez/demucs"&gt;Demucs v4&lt;/a&gt; is a state-of-the-art open-source music stem separation model developed by Alexandre Défossez &lt;a href="#references"&gt;[1]&lt;/a&gt;. It uses deep neural networks to "unmix" songs into separate instrument tracks - such as vocals, drums, bass, and others - by learning patterns from thousands of examples of how these instruments sound in isolation. While it provides exceptional quality in separating songs into stems, it is currently implemented in Python and therefore cannot be used directly in C++ applications or run efficiently on hardware accelerators.&lt;/p&gt;
&lt;p&gt;This project is a step towards supporting real-time stem separation within Mixxx, by exporting the Python-based Demucs model to &lt;a href="https://onnx.ai/"&gt;ONNX&lt;/a&gt; - the &lt;em&gt;Open Neural Network Exchange&lt;/em&gt; format.  ONNX is an open standard for representing machine learning models, allowing them to run on many platforms and hardware accelerators through compatible runtimes such as &lt;strong&gt;&lt;a href="https://onnxruntime.ai/"&gt;ONNX Runtime (ORT)&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The key contributions of this project are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preparing the Demucs code for ONNX export by rewriting non-exportable operations&lt;/li&gt;
&lt;li&gt;Validating all the modified parts with numerical tests to ensure export of existing model weights without the need for retraining.&lt;/li&gt;
&lt;li&gt;Scripts for exporting ONNX and ORT compatible formats of the model.&lt;/li&gt;
&lt;li&gt;Example scripts for deployment of ONNX model with C++ using ONNX Runtime.&lt;/li&gt;
&lt;li&gt;Benchmarking the exported model for performance and separation quality.&lt;/li&gt;
&lt;li&gt;Upstream PR with our modifications to the Demucs repository&lt;/li&gt;
&lt;li&gt;&lt;a href="https://conference.audio.dev/session/2025/converting-source-separation-models-to-onnx-for-real-time-usage-in-dj-software/"&gt;Conference talk&lt;/a&gt; to be delivered at the ADC 2025&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Source separation models are typically developed using Python-based libraries such as PyTorch or TensorFlow, which require a Python runtime to execute machine learning models. This dependency can make it challenging to use these models in environments where Python is not available or practical, such as audio plugins, which are often written in C++. To address this, ONNX (Open Neural Network Exchange) has become a widely adopted representation format, enabling language-independent deployment of machine learning models.&lt;/p&gt;
&lt;p&gt;While both PyTorch and TensorFlow provide straightforward ONNX export for simple models, complex audio models like Demucs often present significant hurdles. This is primarily due to their use of complex tensors and custom implementations of operations like Short-time Fourier Transform (&lt;a href="https://en.wikipedia.org/wiki/Short-time_Fourier_transform"&gt;STFT&lt;/a&gt;) and Inverse Short-time Fourier Transform (&lt;a href="https://en.wikipedia.org/wiki/Short-time_Fourier_transform#Inverse_STFT"&gt;ISTFT&lt;/a&gt;), which are not natively supported by ONNX. As a result, previous attempts to export Demucs to ONNX have typically bypassed these operations, requiring developers to reimplement STFT/ISTFT in every target language, a process that is both error prone and time consuming.&lt;/p&gt;
&lt;p&gt;In this project, we successfully exported Demucs v4 as a fully self-contained ONNX model, by rewriting the STFT and ISTFT operations to be ONNX compatible. This means the model can be used directly in any language that supports ONNX, greatly simplifying integration for audio developers and enabling broader adoption of source separation technology.&lt;/p&gt;
&lt;p&gt;A key part of our approach was to diagnose and address each export issue step by step, developing custom numerical tests to ensure that our ONNX-compatible replacements matched the original PyTorch calculations as closely as possible. This was crucial, as retraining the model was not a viable option: Demucs was originally trained on a large private dataset over weeks using multiple GPUs, and reproducing those results without the dataset and computational resources would be extremely difficult. We verified the rewritten layers against the original PyTorch implementation to ensure equivalence (mean squared error(MSE) &amp;lt; 1e-4). By focusing on numerical fidelity, we ensured that the exported model retained the high performance of the original, without the need for retraining.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Understanding the Math Behind Audio&lt;/h2&gt;
&lt;p&gt;Before diving into transforms and neural networks, it helps to review how audio is represented mathematically and why &lt;strong&gt;complex numbers&lt;/strong&gt; and &lt;strong&gt;Fourier transforms&lt;/strong&gt; are so central to signal processing.&lt;/p&gt;
&lt;h4&gt;Real Numbers (Time-Domain Audio)&lt;/h4&gt;
&lt;p&gt;Digital audio is simply a sequence of &lt;strong&gt;real numbers&lt;/strong&gt; — samples taken at regular time intervals.&lt;/p&gt;
&lt;p&gt;Example: a 44.1 kHz stereo track stores &lt;strong&gt;44,100 real values per second per channel&lt;/strong&gt;.&lt;br&gt;
Each value (e.g. &lt;code&gt;0.25&lt;/code&gt;, &lt;code&gt;-0.67&lt;/code&gt;) represents instantaneous amplitude (air pressure or voltage).&lt;/p&gt;
&lt;h4&gt;Complex Numbers (Frequency Representation)&lt;/h4&gt;
&lt;p&gt;To analyze frequencies, we extend real numbers to &lt;strong&gt;complex numbers&lt;/strong&gt;.
A &lt;strong&gt;complex number&lt;/strong&gt; represents both &lt;em&gt;amplitude&lt;/em&gt; and &lt;em&gt;phase&lt;/em&gt; of a frequency - like a small arrow (vector) that encodes how strong a frequency is and how it’s shifted in time.&lt;br&gt;
In audio processing, complex numbers appear when converting sound waves into their frequency components using the &lt;strong&gt;Fourier Transform&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="math"&gt;$$
z = a + bi
$$&lt;/div&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="math"&gt;\(a\)&lt;/span&gt;: real part, &lt;span class="math"&gt;\(b\)&lt;/span&gt;: imaginary part, &lt;span class="math"&gt;\(i^2 = -1\)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Complex numbers are often represented in &lt;strong&gt;polar form&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="math"&gt;$$
z = r e^{i\theta}
$$&lt;/div&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="math"&gt;\(r = \sqrt{a^2 + b^2}\)&lt;/span&gt; (magnitude)  &lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(\theta = {atan2}(b, a)\)&lt;/span&gt; (phase angle)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Conversions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="math"&gt;\(r = \sqrt{a^2 + b^2}\)&lt;/span&gt;, &lt;span class="math"&gt;\(\theta = \operatorname{atan2}(b, a)\)&lt;/span&gt;, &lt;span class="math"&gt;\(a = r \cos\theta\)&lt;/span&gt;, &lt;span class="math"&gt;\(b = r \sin\theta\)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In signal processing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Magnitude&lt;/em&gt; → strength of each frequency component.  &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Phase&lt;/em&gt; → timing/offset of that frequency’s oscillation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Complex numbers allow us to represent &lt;strong&gt;both amplitude and phase&lt;/strong&gt;, making them perfect for describing sound in the &lt;strong&gt;frequency domain&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;From Time to Frequency: FFT, STFT, and ISTFT&lt;/h2&gt;
&lt;h4&gt;Fourier Transform (FT)&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;Fourier Transform&lt;/strong&gt; expresses a signal as a sum of sine and cosine waves of different frequencies.&lt;/p&gt;
&lt;p&gt;For digital (sampled) signals, we use the &lt;strong&gt;Discrete Fourier Transform (DFT)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="math"&gt;$$
X[k] = \sum_{n=0}^{N-1} x[n] \, e^{-2\pi i \frac{kn}{N}}
$$&lt;/div&gt;
&lt;p&gt;Its inverse reconstructs the signal:&lt;/p&gt;
&lt;div class="math"&gt;$$
x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \, e^{2\pi i \frac{kn}{N}}
$$&lt;/div&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="math"&gt;\(x[n]\)&lt;/span&gt; is the time-domain signal (length &lt;span class="math"&gt;\(N\)&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(X[k]\)&lt;/span&gt; is the frequency-domain representation (DFT coefficients)&lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(n\)&lt;/span&gt; is the time index, &lt;span class="math"&gt;\(k\)&lt;/span&gt; is the frequency bin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, with a 4-sample input:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Input:&lt;/strong&gt; &lt;span class="math"&gt;\([1, 2, 3, 4]\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DFT:&lt;/strong&gt; &lt;span class="math"&gt;\([10, -2+2i, -2, -2-2i]\)&lt;/span&gt;  (frequency components)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDFT:&lt;/strong&gt; Reconstructs the original signal from its DFT.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Short-Time Fourier Transform (STFT)&lt;/h4&gt;
&lt;p&gt;A single DFT gives the &lt;em&gt;overall&lt;/em&gt; frequency content but ignores &lt;em&gt;when&lt;/em&gt; things happen. To capture &lt;strong&gt;time-varying&lt;/strong&gt; frequency information, we use the &lt;strong&gt;Short-Time Fourier Transform&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Split the signal into short, overlapping frames (e.g. 2048 samples).  &lt;/li&gt;
&lt;li&gt;Apply a &lt;strong&gt;window&lt;/strong&gt; (Hann/Hamming) to each frame.  &lt;/li&gt;
&lt;li&gt;Compute the FFT of each windowed frame.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mathematically:&lt;/p&gt;
&lt;p&gt;&lt;span class="math"&gt;\(X(m,\omega) = \sum_n x[n] \, w[n - m] \, e^{-j \omega n}\)&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="math"&gt;\(m\)&lt;/span&gt;: frame index (time)  &lt;/li&gt;
&lt;li&gt;&lt;span class="math"&gt;\(\omega\)&lt;/span&gt;: frequency bin  &lt;/li&gt;
&lt;li&gt;Output: &lt;strong&gt;complex spectrogram&lt;/strong&gt; showing how frequency content evolves over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A spectrogram is a 2-D matrix (time × frequency) of complex values - often visualized by plotting magnitude in dB.&lt;/p&gt;
&lt;h4&gt;Inverse STFT (ISTFT)&lt;/h4&gt;
&lt;p&gt;To go back to the time domain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Compute &lt;strong&gt;inverse FFT&lt;/strong&gt; for each frame.  &lt;/li&gt;
&lt;li&gt;Multiply by a synthesis window if required.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlap-add&lt;/strong&gt; frames to reconstruct the waveform.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Errors here cause audible artifacts (clicks, smearing, or phase shifts).&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Understanding HTDemucs and the Challenges with ONNX Export&lt;/h2&gt;
&lt;p&gt;To understand the export process, it’s important to look closely at how &lt;strong&gt;HTDemucs (Hybrid Transformer Demucs)&lt;/strong&gt; is structured, and why its architecture introduces challenges when converting to the &lt;strong&gt;ONNX&lt;/strong&gt; format.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HTDemucs architecture overview" src="////mixxx.acolombier.dev/images/news/demucs-to-onnx/htdemucs.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1. Architecture of the HTDemucs model (source: &lt;a href="https://github.com/facebookresearch/demucs"&gt;facebookresearch/demucs&lt;/a&gt;, licensed under &lt;a href="https://github.com/facebookresearch/demucs/blob/main/LICENSE"&gt;MIT License&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;HTDemucs Explained&lt;/h4&gt;
&lt;p&gt;Unlike text-based AI models like Open AI's GPT that learn language patterns, &lt;strong&gt;Demucs&lt;/strong&gt; is an audio model trained to recognize patterns in sound waves. It doesn’t understand lyrics or meaning - instead, it detects subtle spectral and temporal cues that distinguish instruments, like how the human ear can separate a singer from the drums.&lt;/p&gt;
&lt;p&gt;Hybrid Transformer(HT) Demucs or Demucs v4 is a &lt;em&gt;hybrid&lt;/em&gt; model - it combines two parallel processing branches:&lt;/p&gt;
&lt;h5&gt;&lt;strong&gt;Time-Domain Branch&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Operates directly on the raw waveform (real-valued input).  &lt;/li&gt;
&lt;li&gt;Uses temporal convolutions and Transformer blocks to learn how each instrument evolves over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;strong&gt;Time-Frequency Domain Branch&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Operates on the signal’s &lt;strong&gt;spectrogram&lt;/strong&gt;, obtained by applying a &lt;strong&gt;Short-Time Fourier Transform (STFT)&lt;/strong&gt;.  &lt;/li&gt;
&lt;li&gt;The STFT produces a &lt;strong&gt;complex-valued&lt;/strong&gt; tensor, representing both magnitude and phase across time and frequency.  &lt;/li&gt;
&lt;li&gt;The model immediately converts this to a &lt;strong&gt;magnitude spectrogram&lt;/strong&gt;, a purely &lt;strong&gt;real-valued&lt;/strong&gt; representation, which is then processed by convolutional and Transformer layers.&lt;/li&gt;
&lt;li&gt;At the end of this branch, an &lt;strong&gt;Inverse STFT (ISTFT)&lt;/strong&gt; is applied to reconstruct the real-valued waveform.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These two branches are then &lt;strong&gt;fused&lt;/strong&gt; to produce the final stem-separated outputs (vocals, drums, bass, and others).&lt;/p&gt;
&lt;h4&gt;The ONNX Export Problem&lt;/h4&gt;
&lt;p&gt;The key difficulty in exporting HTDemucs lies in ONNX’s lack of support for complex tensors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;time-domain branch&lt;/strong&gt;, all operations are real-valued and export cleanly to ONNX.  &lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;time-frequency branch&lt;/strong&gt;, two specific operations, &lt;strong&gt;STFT&lt;/strong&gt; and &lt;strong&gt;ISTFT&lt;/strong&gt;, involve complex numbers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest of the model (all convolutional, transformer, and linear layers) operates purely on &lt;strong&gt;real numbers&lt;/strong&gt;, and therefore poses &lt;strong&gt;no export issue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;ONNX, as of current opset versions, does not fully support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complex-valued tensors as native types - &lt;a href="https://github.com/pytorch/pytorch/issues/126972"&gt;PyTorch Issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Complex FFT operations (&lt;code&gt;torch.stft&lt;/code&gt;, &lt;code&gt;torch.istft&lt;/code&gt;) from PyTorch - &lt;a href="https://github.com/pytorch/pytorch/issues/65666"&gt;PyTorch Issue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, a direct &lt;code&gt;torch.onnx.export()&lt;/code&gt; call on HTDemucs fails, since the exporter encounters unsupported complex operations.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Our Solution&lt;/h2&gt;
&lt;h4&gt;Real-Valued STFT and ISTFT Rewrites&lt;/h4&gt;
&lt;p&gt;Because complex tensors appear only in the STFT and ISTFT stages, we reimplemented these operations using pairs of real-valued tensors that store the sine and cosine components separately.&lt;br&gt;
Mathematically, this represents the same information as complex numbers (real + imaginary parts), but it avoids using complex datatypes that ONNX does not support.&lt;/p&gt;
&lt;h5&gt;1. &lt;strong&gt;STFT Rewrite&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Instead of using &lt;code&gt;torch.stft()&lt;/code&gt;, we expressed the Fourier transform as a set of &lt;strong&gt;1-D convolutions&lt;/strong&gt; with precomputed sine and cosine kernels.&lt;/p&gt;
&lt;p&gt;This allows us to compute:
&lt;span class="math"&gt;\(\text{Re}(X) = x * \cos(\omega)\)&lt;/span&gt;, &lt;span class="math"&gt;\(\text{Im}(X) = -x * \sin(\omega)\)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Thus, we can store the &lt;strong&gt;real and imaginary parts&lt;/strong&gt; as separate real-valued tensors, fully ONNX-compatible.&lt;/p&gt;
&lt;h5&gt;2. &lt;strong&gt;ISTFT Rewrite&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Similarly, for inverse reconstruction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The original ISTFT combines complex values through real + imaginary synthesis.&lt;/li&gt;
&lt;li&gt;We reconstructed the time-domain signal by performing the same series of &lt;strong&gt;overlap-add&lt;/strong&gt; and &lt;strong&gt;cosine/sine inverse convolutions&lt;/strong&gt;, again using only real-valued tensors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By carefully ensuring numerical equivalence to PyTorch’s implementation, we achieved perfect parity (MSE &amp;lt; 1e-4) between the original and rewritten layers.&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;Final Export&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;only&lt;/strong&gt; problematic parts were the &lt;strong&gt;STFT&lt;/strong&gt; and &lt;strong&gt;ISTFT&lt;/strong&gt; layers, and once these were rewritten with real-valued math, the model exported &lt;strong&gt;fully and cleanly&lt;/strong&gt; to ONNX — no retraining required.&lt;/p&gt;
&lt;p&gt;This approach made it possible to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preserve the original model weights.  &lt;/li&gt;
&lt;li&gt;Ensure perfect numerical equivalence.  &lt;/li&gt;
&lt;li&gt;Achieve seamless ONNX export compatible with &lt;strong&gt;ONNX Runtime (ORT)&lt;/strong&gt; and &lt;strong&gt;C++ deployment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Unified Benchmarking: Timing and SI-SDR&lt;/h4&gt;
&lt;p&gt;To evaluate the exported ONNX model, we developed benchmarking scripts for both PyTorch and ONNX/ORT backends. Key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Separation Backend:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PyTorch: Runs separation using the original Demucs model.&lt;/li&gt;
&lt;li&gt;ONNX: Runs separation by invoking the ONNX CLI tool via subprocess, matching the workflow of the provided example scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timing:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The script records detailed timing for each track, printing and saving the results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SI-SDR Evaluation:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Computes the SI-SDR (Scale-Invariant Signal-to-Distortion Ratio) for each separated track using the &lt;code&gt;torchmetrics&lt;/code&gt; library.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Results are saved in timestamped folders, with timing and SI-SDR metrics output to JSON files named according to the backend (e.g., &lt;code&gt;benchmark_results_cpp.json&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;How to Run the Benchmark&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Download &lt;a href="https://sigsep.github.io/datasets/musdb.html"&gt;MusDB&lt;/a&gt; dataset following the instructions in documentation&lt;/li&gt;
&lt;li&gt;For C++ benchmarking, ensure the CLI tool is built and ONNX model has been exported.&lt;/li&gt;
&lt;li&gt;Run the benchmark script:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;python benchmark-pytorch.py/benchmark-cpp-onnx.py --musdb-root /path/to/musdb-hq/&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Review the JSON results for timing and SI-SDR metrics.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Benchmark Results&lt;/h2&gt;
&lt;p&gt;The quality of the model is expected to be equal or slightly worse when exported to ONNX. While there are plenty of ways of measuring the benchmarks models (another blog post incoming), we've chosen to measure our models with &lt;code&gt;SI-SDR&lt;/code&gt; metric, Scale Invariant Signal To Distortion Ratio, on the MusDB dataset. This is the standard metric on which researchers report their source separation model's performance.&lt;/p&gt;
&lt;p&gt;We conducted comprehensive benchmarking on both CPU and GPU platforms, evaluating 50 tracks from the MusDB test dataset (approximately 3.46 hours of audio).&lt;/p&gt;
&lt;h4&gt;CPU Performance Comparison&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;PyTorch Model&lt;/th&gt;
&lt;th&gt;C++ ONNX Model&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Processing Time&lt;/td&gt;
&lt;td&gt;5,380.35 sec&lt;/td&gt;
&lt;td&gt;4,415.30 sec&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17.94% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processing Time for 1 min input&lt;/td&gt;
&lt;td&gt;25.89 sec&lt;/td&gt;
&lt;td&gt;21.24 sec&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17.94% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;GPU Performance Comparison&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;PyTorch Model (GPU)&lt;/th&gt;
&lt;th&gt;Python ONNXRuntime (GPU)&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Processing Time&lt;/td&gt;
&lt;td&gt;354.13 sec&lt;/td&gt;
&lt;td&gt;386.40 sec&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.35% slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processing Time for 1 min input&lt;/td&gt;
&lt;td&gt;1.70 sec&lt;/td&gt;
&lt;td&gt;1.86 sec&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.35% slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Audio Quality Results&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stem&lt;/th&gt;
&lt;th&gt;PyTorch Model (dB)&lt;/th&gt;
&lt;th&gt;ONNX Model (C++) (dB)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;drums.wav&lt;/td&gt;
&lt;td&gt;9.46&lt;/td&gt;
&lt;td&gt;9.47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bass.wav&lt;/td&gt;
&lt;td&gt;7.76&lt;/td&gt;
&lt;td&gt;7.77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;other.wav&lt;/td&gt;
&lt;td&gt;4.69&lt;/td&gt;
&lt;td&gt;4.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vocals.wav&lt;/td&gt;
&lt;td&gt;7.84&lt;/td&gt;
&lt;td&gt;7.83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.44&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.43&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Table: SI-SDR (dB) comparison for each stem and overall, using torchmetrics. Results are shown for the native PyTorch model and the exported ONNX model running in C++. Higher SI-SDR values indicate better separation quality (less distortion).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Typical high-performing models achieve around &lt;strong&gt;7–9 dB&lt;/strong&gt; on vocals in the &lt;a href="https://sigsep.github.io/datasets/musdb.html"&gt;MusDB&lt;/a&gt; benchmark - with 0 dB meaning no separation improvement over the original mixture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU Performance&lt;/strong&gt;: The C++ ONNX model delivers significant performance improvements (17.94% faster) while maintaining equivalent audio quality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU Performance&lt;/strong&gt;: PyTorch maintains a performance advantage on GPU (8.35% faster), likely due to optimized CUDA implementations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio Quality&lt;/strong&gt;: Both implementations produce nearly identical separation quality across all stems (&amp;lt; 0.1 dB difference)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have a running platform independent high quality ONNX Demucs model that can utilize hardware acceleration and be deployed with C++, we plan to integrate this into Mixxx DJ for future.
We've prepared example scripts for running the exported Demucs model, which can be used following the instructions documented in our READMEs.&lt;/p&gt;
&lt;h2&gt;Plans for future integration into Mixxx&lt;/h2&gt;
&lt;p&gt;Here's a list of all the PRs that document our incremental changes towards exporting Demucs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;PR Status&lt;/th&gt;
&lt;th&gt;PR Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ONNX Computation Path&lt;/td&gt;
&lt;td&gt;Merged&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/1"&gt;PR #1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STFT Rewrite&lt;/td&gt;
&lt;td&gt;Merged&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/3"&gt;PR #2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inverse STFT Rewrite&lt;/td&gt;
&lt;td&gt;Merged&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/4"&gt;PR #4&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ONNX Export Scripts&lt;/td&gt;
&lt;td&gt;Merged&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/5"&gt;PR #5&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI for model export&lt;/td&gt;
&lt;td&gt;Merged&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/6"&gt;PR #6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Example C++ Scripts&lt;/td&gt;
&lt;td&gt;In Review&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/7"&gt;PR #7&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Benchmarking Scripts&lt;/td&gt;
&lt;td&gt;In Review&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/demucs/pull/9"&gt;PR #9&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We've raised a PR with all our Demucs modifications to the upstream here - &lt;a href="https://github.com/adefossez/demucs/pull/10"&gt;Demucs PR Link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A talk will be presented on this project at the &lt;a href="https://conference.audio.dev/session/2025/converting-source-separation-models-to-onnx-for-real-time-usage-in-dj-software/"&gt;Audio Developers Conference 2025&lt;/a&gt; in Bristol.&lt;/p&gt;
&lt;p&gt;Finally, we've created this &lt;a href="https://github.com/mixxxdj/mixxx/issues/15495"&gt;EPIC&lt;/a&gt; to track all issues related to merging Demucs to Mixxx. Feel free to join the discussion and get involved with supporting real time stems separation inside Mixxx.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🙏 Acknowledgements&lt;/h2&gt;
&lt;p&gt;This project would not have been possible without the extraordinary support and mentorship of &lt;a href="https://github.com/JoergAtGithub"&gt;&lt;strong&gt;Jörg&lt;/strong&gt;&lt;/a&gt;, whose guidance, thoughtful reviews, and timely feedback shaped the project from start to finish. His expertise and encouragement were invaluable throughout every stage.&lt;/p&gt;
&lt;p&gt;A huge thank you also to &lt;a href="https://github.com/acolombier"&gt;&lt;strong&gt;Antoine&lt;/strong&gt;&lt;/a&gt;, who not only mentored me during the project but also integrated the exported ONNX model into his open-source tool &lt;a href="https://github.com/acolombier/stemgen"&gt;&lt;strong&gt;Stemgen&lt;/strong&gt;&lt;/a&gt;, deploying it using &lt;strong&gt;Rust&lt;/strong&gt; and &lt;strong&gt;ONNX Runtime&lt;/strong&gt;. Seeing the model already being used in a real-world application is deeply rewarding.&lt;/p&gt;
&lt;p&gt;Finally, I would like to thank the entire &lt;strong&gt;Mixxx community&lt;/strong&gt; and &lt;strong&gt;Google Summer of Code&lt;/strong&gt; program for providing me the opportunity to undertake this challenging endeavour and the right environment to support its successful completion.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] A. Défossez, “Hybrid Transformers for Music Source Separation,” &lt;em&gt;arXiv preprint arXiv:2211.08553&lt;/em&gt;, 2022.&lt;br&gt;
Available: &lt;a href="https://arxiv.org/abs/2211.08553"&gt;https://arxiv.org/abs/2211.08553&lt;/a&gt;&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2025"></category><category term="stems"></category></entry><entry><title>Mixxx 2.5.3 Released</title><link href="//mixxx.acolombier.dev/news/2025-09-03-mixxx-2_5_3-released" rel="alternate"></link><published>2025-09-03T01:00:35+02:00</published><updated>2025-09-03T01:00:35+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2025-09-03:/news/2025-09-03-mixxx-2_5_3-released</id><summary type="html">&lt;h4&gt;Mixxx 2.5.3 Release Announcement: Back to School, back to DVS.&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new stable release of Mixxx: version 2.5.3, this version not only contains updates and fixes for some issues reported by users, but it also contains improvements to the Digital Vinyl System …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx 2.5.3 Release Announcement: Back to School, back to DVS.&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new stable release of Mixxx: version 2.5.3, this version not only contains updates and fixes for some issues reported by users, but it also contains improvements to the Digital Vinyl System (DVS) support. These improvements are the result of some bright new insights of developers spinning the wheel instead of sunbathing.
Since these improvements drastically improve the vinyl experience, we have chosen to backport &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; it to the 2.5 series instead of integrating it in future alpha &amp;amp; beta versions.&lt;/p&gt;
&lt;p&gt;Have a nice Mixxx.&lt;/p&gt;
&lt;h4&gt;Digital Vinyl System - Timecode System.&lt;/h4&gt;
&lt;p&gt;An introduction to Digital Vinyl Systems and timecode can be found in &lt;a href="https://www.digitaldjtips.com/a-beginners-guide-to-digital-vinyl-systems/"&gt;this article on the site of Digital DJ Tips&lt;/a&gt;, and in our own news archive: &lt;a href="////mixxx.acolombier.dev/news/2021-11-21-dvs-internals-pt1"&gt;How Does Timecode Vinyl Actually Work? (Pt. 1)&lt;/a&gt;, &lt;a href="////mixxx.acolombier.dev/news/2021-12-22-dvs-internals-pt2"&gt;How Does Timecode Vinyl Actually Work? (Pt. 2)&lt;/a&gt; and &lt;a href="////mixxx.acolombier.dev/news/2025-08-27-dvs-internals-pt3"&gt;How Does Timecode Vinyl Actually Work? (Pt. 3)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mixxx plays the song by following the signal on the timecode media, which gets internally converted to actual timeframes. So the DJ controls the playback of the digital music by manipulating vinyl or CDs.&lt;/p&gt;
&lt;p&gt;In order to create a vinyl-like feeling, the song needs to follow the signal as closely as possible (low latency, fast responsiveness) for e.g. scratching or backspins. There is no 'standard' signal - each manufacturer uses its own code. One thing all manufacturers have in common is that the code is modulated onto a sine wave. The code is used for absolute positions e.g. after needle drops, but it is not suitable to handle pitch (e.g. the playback speed) or playback direction. For this the sine wave needs to be processed by a filter that detects phase differences and converts it into pitch information.&lt;/p&gt;
&lt;p&gt;Mixxx has integrated the &lt;a href="https://xwax.org/overview.html"&gt;xwax&lt;/a&gt; library for timecode support, which uses an &lt;a href="https://en.wikipedia.org/wiki/Alpha_beta_filter"&gt;Alpha-Beta Filter&lt;/a&gt; for pitch detection. This filter provides a good feeling during scratching, but isn't able to provide a stable pitch during normal playback.
In &lt;a href="https://github.com/mixxxdj/mixxx/pull/15194"&gt;PR #15194&lt;/a&gt; developers have replaced the Alpha-Beta Filter with a more advanced &lt;a href="https://en.wikipedia.org/wiki/Kalman_filter"&gt;Kalman-Filter&lt;/a&gt; equivalent.&lt;/p&gt;
&lt;p&gt;Kalman-Filters have many application as GPS navigation and weather forecast models. In Mixxx the Kalman-Filter uses a &lt;a href="https://en.wikipedia.org/wiki/Probability"&gt;probabilistic&lt;/a&gt; model of the vinyl movements to predict the velocity, very similar to the Alpha-Beta Filter. This predicted speed is compared with the noisy crackling input signal. The deviation &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; is fed back into the filter and slightly alters its internal state for the next prediction.&lt;/p&gt;
&lt;p&gt;If the vinyl is, say, spinning at 33 1/3 r/min, that value is used as the initial assumption on which the next prediction is based. If the next measurement returns 40 r/min, the value is not fully trusted, because such a high acceleration is unlikely. This measurement will be used with a low trust. However, if the following measurements detect 40 r/min as well, the filter gradually adjusts to approximate 40 r/min in further predictions.&lt;/p&gt;
&lt;p&gt;By using this model, Mixxx is able to properly and more accurately represent e.g. the pitch control slider on the turntable or CD-player.&lt;/p&gt;
&lt;p&gt;Another improvement has been made to the measurements which are fed to the Kalman filter &lt;a href="https://github.com/mixxxdj/mixxx/pull/15217"&gt;PR #15217&lt;/a&gt;. The current model only takes rough measurements of the position on the sine wave. Furthermore these measurements work on the assumption to always be correct. A new check was added to detect if measurements were skipped or larger than assumed. This improves backspins where the deviation of estimation and measurement suddenly become very high.&lt;/p&gt;
&lt;p&gt;These changes are major improvements for all DVS users. Too good to wait for Mixxx 2.6.&lt;br&gt;
Get all Mixxx-ed up and join our &lt;a href="////mixxx.acolombier.dev/get-involved/"&gt;testing-force&lt;/a&gt; for more upcoming features.&lt;/p&gt;
&lt;h4&gt;Controller Mappings&lt;/h4&gt;
&lt;p&gt;Mappings were updated for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Icon P1-Nano MIDI 1&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S4 Mk3&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S3&lt;/li&gt;
&lt;li&gt;Numark NS6II&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.5.3 Changelog&lt;/h4&gt;
&lt;p&gt;More fixes have been included to keep everything stable, up and running.
The complete changelog can be found &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.5.3/CHANGELOG.md"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Back porting is integrating new work into previous releases in order to let those releases profit from the new development.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The Deviation in Kalman filters is called &lt;a href="https://en.wikipedia.org/wiki/Innovation_(signal_processing)"&gt;Innovation&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="news"></category><category term="2.5.3"></category><category term="release announcement"></category></entry><entry><title>How Does Timecode Vinyl Actually Work? (Pt. 3)</title><link href="//mixxx.acolombier.dev/news/2025-08-27-dvs-internals-pt3" rel="alternate"></link><published>2025-08-27T11:54:12+02:00</published><updated>2025-08-27T11:54:12+02:00</updated><author><name>Jan Claußen</name></author><id>tag:mixxx.acolombier.dev,2025-08-27:/news/2025-08-27-dvs-internals-pt3</id><summary type="html">&lt;p&gt;Since its release in 2011, the &lt;strong&gt;Traktor Control Vinyl MK2&lt;/strong&gt; has sparked
curiosity among digital DJs and audio developers alike. Its timecode format
stands apart from Serato’s, which we explored in the previous posts. With the
MK2 system, Native Instruments introduced a more advanced timecode that boosts
resolution and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since its release in 2011, the &lt;strong&gt;Traktor Control Vinyl MK2&lt;/strong&gt; has sparked
curiosity among digital DJs and audio developers alike. Its timecode format
stands apart from Serato’s, which we explored in the previous posts. With the
MK2 system, Native Instruments introduced a more advanced timecode that boosts
resolution and accuracy by applying advanced cryptographic techniques.&lt;/p&gt;
&lt;p&gt;In this post, we’ll break down how it works at a basic level and how Mixxx is processing the signal.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Recap: How Serato Timecode Works&lt;/h2&gt;
&lt;p&gt;Serato’s timecode is built around a
&lt;a href="https://en.wikipedia.org/wiki/Linear-feedback_shift_register"&gt;Linear Feedback Shift Register&lt;/a&gt;,
modulated onto a 1 kHz carrier using
&lt;a href="https://en.wikipedia.org/wiki/Amplitude_modulation"&gt;amplitude modulation (AM)&lt;/a&gt; - a legacy
technique from radio transmission.&lt;/p&gt;
&lt;p&gt;The demodulation process is relatively simple: when one stereo channel crosses
the x-axis, the other hits a peak. If that peak exceeds a certain threshold,
the system reads it as a &lt;strong&gt;1&lt;/strong&gt;, if not, it’s a &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Serato Timecode Signal" src="////mixxx.acolombier.dev/images/news/serato-control-cd.svg"&gt;&lt;/p&gt;
&lt;p&gt;We covered this in more detail in
&lt;a href="////mixxx.acolombier.dev/news/2021-11-21-dvs-internals-pt1"&gt;DVS Internals Pt. 1&lt;/a&gt;
and &lt;a href="////mixxx.acolombier.dev/news/2021-12-22-dvs-internals-pt2"&gt;Pt. 2&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Traktor MK2 Signal&lt;/h2&gt;
&lt;p&gt;Below is a signal that resembles what you’ll find on the Traktor MK2
Control vinyl/CD, which has been specifically generated for this blog post by
using a &lt;a href="https://de.wikipedia.org/wiki/Raised-Cosine-Filter"&gt;Raised-Cosine Filter&lt;/a&gt; to
modulate a random sequence onto the carrier.&lt;/p&gt;
&lt;p&gt;The carrier wave operates at &lt;strong&gt;2500 Hz&lt;/strong&gt;, a significant increase from Serato’s
&lt;strong&gt;1000 Hz&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Advantage:&lt;/strong&gt; The higher carrier frequency allows for 2.5× greater resolution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Offset-modulated Signal" src="////mixxx.acolombier.dev/images/news/traktor-mk2-signal.svg"&gt;&lt;/p&gt;
&lt;p&gt;Upon inspection, this waveform clearly doesn’t use amplitude modulation - the
amplitude remains constant. Instead, it appears to be &lt;strong&gt;offset-modulated&lt;/strong&gt;,
where the signal is shifted vertically from the x-axis. This is a non-standard
technique not commonly used in typical modulation schemes.&lt;/p&gt;
&lt;p&gt;On the original vinyl version (not shown here due to copyright), the offset
can be so large that the signal floats entirely above the x-axis for multiple
cycles - making zero-crossing detection impossible.&lt;/p&gt;
&lt;p&gt;Even when that doesn’t happen, the offset causes the time interval &lt;span class="math"&gt;\(\Delta t\)&lt;/span&gt;
between zero-crossings to become irregular, introducing audible pitch flutter.&lt;/p&gt;
&lt;p&gt;To decode the signal, we must solve:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How to filter the signal to enable pitch detection&lt;/li&gt;
&lt;li&gt;How to demodulate this non-standard modulation&lt;/li&gt;
&lt;li&gt;How to decipher the code that is modulated onto the carrier&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;Pitch Detection&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you're unfamiliar with pitch detection in DVS systems, revisit
&lt;a href="////mixxx.acolombier.dev/news/2021-11-21-dvs-internals-pt1"&gt;DVS Internals Pt. 1&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Our goal is to produce a signal that oscillates evenly around the x-axis. This
filtered waveform can then be processed by the existing pitch detection algorithm.&lt;/p&gt;
&lt;p&gt;A simple discrete derivative operation achieves this:&lt;/p&gt;
&lt;div class="math"&gt;$$
y[n] = x[n] - x[n-1] \tag{1}
$$&lt;/div&gt;
&lt;p&gt;&lt;span class="math"&gt;\(\text{where:}\)&lt;/span&gt;&lt;br&gt;
&lt;span class="math"&gt;\(\text{- x[n]: Input sample}\)&lt;/span&gt;&lt;br&gt;
&lt;span class="math"&gt;\(\text{- x[n-1]: Delayed input sample}\)&lt;/span&gt;&lt;br&gt;
&lt;span class="math"&gt;\(\text{- y[n]: Difference of both values}\)&lt;/span&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;p&gt;When applied to the offset-modulated signal, we get:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Traktor MK2 signal with derivative" src="////mixxx.acolombier.dev/images/news/traktor-mk2-signal-with-derivative.svg"&gt;&lt;/p&gt;
&lt;p&gt;The resulting waveform oscillates cleanly around zero, which is ideal for
analysis. It also makes it easier to pinpoint the half-cycle peaks needed for
bit detection.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Demodulation Techniques&lt;/h2&gt;
&lt;p&gt;To extract bits from the signal, we detect the zero-crossings and sample the
amplitude of the sinusoid at those moments.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Traktor MK2 signal with
zero-crossings" src="////mixxx.acolombier.dev/images/news/traktor-mk2-signal-with-zero-crossings.svg"&gt;&lt;/p&gt;
&lt;p&gt;You may notice that the derivative’s zero-crossings don’t align perfectly with
the original peaks. That’s due to a delay introduced by the filter. Smoothing
the signal first, then compensating for the delay (e.g., by selecting
&lt;span class="math"&gt;\(x[n-3]\)&lt;/span&gt;), yields better results.&lt;/p&gt;
&lt;p&gt;For greater accuracy, one could analyze the phase response &lt;span class="math"&gt;\(\phi(\omega)\)&lt;/span&gt;,
which shows how filter delay varies with input frequency - but for this use case,
a fixed delay works well enough.&lt;/p&gt;
&lt;p&gt;The filtered signal can cross the x-axis in two directions-positive to
negative or vice versa. Based on the direction, we determine which half-cycle
contains the encoded bit. In this example we only use the upper half-cycle for
decoding, but you can also decode the signal from the lower half-cycle.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Traktor MK2 signal with readings" src="////mixxx.acolombier.dev/images/news/traktor-mk2-signal-with-readings.svg"&gt;&lt;/p&gt;
&lt;p&gt;Demodulation is then as simple as applying a threshold: amplitudes above it
are &lt;strong&gt;1&lt;/strong&gt;, and below it are &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Traktor MK2 signal with timecodes" src="////mixxx.acolombier.dev/images/news/traktor-mk2-signal-with-timecodes.svg"&gt;&lt;/p&gt;
&lt;p&gt;On actual vinyl, the physical behavior of the needle causes the offset to
decay over time, because the needle slowly drifts back to the middle. This decay complicates bit extraction.&lt;/p&gt;
&lt;p&gt;To compensate, we analyze the &lt;strong&gt;slope&lt;/strong&gt; between subsequent readings by
reusing the derivative equation in &lt;span class="math"&gt;\(\text{(1)}\)&lt;/span&gt;.&lt;/p&gt;
&lt;div class="math"&gt;$$slope[n] = reading[n] - reading[n-1]$$&lt;/div&gt;
&lt;p&gt;&lt;span class="math"&gt;\(\text{where:}\)&lt;/span&gt;&lt;br&gt;
&lt;span class="math"&gt;\(\text{- x[n]: Current reading}\)&lt;/span&gt;&lt;br&gt;
&lt;span class="math"&gt;\(\text{- x[n-1]: Last reading}\)&lt;/span&gt;&lt;br&gt;
&lt;span class="math"&gt;\(\text{- y[n]: Difference of both values}\)&lt;/span&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;p&gt;We then decode a positive slope to toggle the bit to &lt;strong&gt;1&lt;/strong&gt; and a negative
slope to toggle the bit to &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Traktor MK2 signal with indicated slope" src="////mixxx.acolombier.dev/images/news/traktor-mk2-signal-with-slope.png"&gt;&lt;/p&gt;
&lt;p&gt;This method helps isolate the encoded signal from the floating zero line
caused by mechanical drift.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Code&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A deeper explanation of LFSRs can be found in &lt;a href="////mixxx.acolombier.dev/news/2021-12-22-dvs-internals-pt2"&gt;DVS Internals Pt. 2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interestingly, the Traktor MK2 system also uses a &lt;a href="https://en.wikipedia.org/wiki/Linear-feedback_shift_register"&gt;Linear Feedback Shift Register&lt;/a&gt; - but with different properties. While Serato’s LFSR has a
&lt;strong&gt;20-bit&lt;/strong&gt; length, Traktor’s uses a &lt;strong&gt;110-bit&lt;/strong&gt; register with a minimum
run length of two symbols. The generator polynomial of the LFSR was found
by using the &lt;a href="https://en.wikipedia.org/wiki/Berlekamp%E2%80%93Massey_algorithm"&gt;Berlekamp-Massey algorithm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The number of unique states an LFSR can generate is:&lt;/p&gt;
&lt;div class="math"&gt;$$n_{max} = 2^m -1$$&lt;/div&gt;
&lt;p&gt;Hence for the Serato timecode&lt;/p&gt;
&lt;div class="math"&gt;$$n_{serato} = 2^{20} -1 = 1\,048\,575$$&lt;/div&gt;
&lt;p&gt;and for the Traktor MK2 timecode&lt;/p&gt;
&lt;div class="math"&gt;$$n_{mk2} = 2^{110} -1 = 1.298 \cdot 10^{33} = 1\,298\,074\,214\,633\,706\,907\,132\,624\,082\,305\,023$$&lt;/div&gt;
&lt;p&gt;That’s an astronomically high number-far beyond what’s required for this
application.&lt;/p&gt;
&lt;p&gt;But how many states are actually needed? With a 2500 Hz carrier, you get 2500 bits per second.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;For 12 minutes of timecode:&lt;/p&gt;
&lt;div class="math"&gt;$$12 \text{ min} \cdot 60  = 720 \text{ s}$$&lt;/div&gt;
&lt;div class="math"&gt;$$720 \text{ s} \cdot 2500 \text{ states/s} = 1\,800\,000 \text{ states}$$&lt;/div&gt;
&lt;p&gt;which exceeds the maximum state range of Serato’s 20-bit LFSR by far.&lt;/p&gt;
&lt;p&gt;However, a downside appears: each 110-bit state must be stored in 128 bits (4
× 32-bit integers).&lt;/p&gt;
&lt;p&gt;So for the A-side with 12 minutes:&lt;/p&gt;
&lt;div class="math"&gt;$$1\,800\,000 \text{ states} \cdot 128 \text{ bit} = 230\,400\,000 \text{ bit} = 28\,800\,000 \text{ byte} = 27.46 \text{ MB}$$&lt;/div&gt;
&lt;p&gt;And for a 25-minute CD:&lt;/p&gt;
&lt;div class="math"&gt;$$4\,500\,000 \text{ states} \cdot 128 \text{ bit} = 576\,000\,000 \text{ bit} = 72\,000\,000 \text{ byte} = 68.66 \text{ MB}$$&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disadvantage:&lt;/strong&gt; The memory footprint is large - even a single side of timecode can exceed 27 MB.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This makes storing a full lookup table impractical in production software.&lt;/p&gt;
&lt;p&gt;It's important to point out that the current implementation is naive, because it treats the
Traktor MK2 code as if it were Serato code. Since Mark Hills designed the xwax
library, which is used by vinyl control in Mixxx, for exactly this style of
timecode, changes would have to be made to make the decoder more modular.&lt;/p&gt;
&lt;p&gt;Nonetheless, the current technique works and it represents the current state
of the decoder in Mixxx.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Fortunately, there are mathematical methods to reduce the memory requirements.
This requires diving deeper into the crypthographic theory.&lt;/p&gt;
&lt;p&gt;First tests show that this can possibly be achieved by applying a fixed tap
pattern (e.g. every 5th bit) to a 110-bit LFSR window - a form of structured
decimation or undersampling. This collapses the sequence into a 22-bit
&lt;a href="https://en.wikipedia.org/wiki/Gold_code"&gt;Gold code&lt;/a&gt;, whose two sequences alternate.
The implementation of this technique is far more complex and not completed
yet.&lt;/p&gt;
&lt;p&gt;We’ll explore those strategies in the next part of this series.&lt;/p&gt;</content><category term="news"></category><category term="traktor"></category><category term="timecode"></category><category term="dvs"></category><category term="vinyl control"></category></entry><entry><title>GSoC 2025 - Multi-Genre &amp; Autocompletion Support Implementation</title><link href="//mixxx.acolombier.dev/news/2025-08-13-gsoc2025-report-AntonioGiordano" rel="alternate"></link><published>2025-08-13T14:05:26+02:00</published><updated>2025-08-13T14:05:26+02:00</updated><author><name>Antonio Giordano</name></author><id>tag:mixxx.acolombier.dev,2025-08-13:/news/2025-08-13-gsoc2025-report-AntonioGiordano</id><summary type="html">&lt;p&gt;Hello everyone! I'm &lt;strong&gt;Antonio Giordano&lt;/strong&gt;, and I'm excited to share the results of my &lt;strong&gt;Google Summer of Code 2025&lt;/strong&gt; work on Mixxx. We've introduced &lt;strong&gt;true multi-genre support&lt;/strong&gt; with smart autocompletion, a cleaner editing experience, and tools to migrate your existing library without breaking your flow.&lt;/p&gt;
&lt;h3&gt;Project Vision &amp;amp; Evolution&lt;/h3&gt;
&lt;p&gt;Our goal …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello everyone! I'm &lt;strong&gt;Antonio Giordano&lt;/strong&gt;, and I'm excited to share the results of my &lt;strong&gt;Google Summer of Code 2025&lt;/strong&gt; work on Mixxx. We've introduced &lt;strong&gt;true multi-genre support&lt;/strong&gt; with smart autocompletion, a cleaner editing experience, and tools to migrate your existing library without breaking your flow.&lt;/p&gt;
&lt;h3&gt;Project Vision &amp;amp; Evolution&lt;/h3&gt;
&lt;p&gt;Our goal was to give DJs flexible, reliable control over genres beyond a single free-text field. In earlier versions, you could type multiple genres (e.g., &lt;code&gt;Dance/Electronic/House&lt;/code&gt;), but Mixxx treated that as &lt;strong&gt;plain text&lt;/strong&gt;. It couldn't understand or manage individual tags.&lt;/p&gt;
&lt;p&gt;To get this right, we started with a &lt;strong&gt;solid multi-genre foundation&lt;/strong&gt; that's fast, consistent, and future-friendly. This foundation paves the way for richer features like hierarchical genres.&lt;/p&gt;
&lt;h3&gt;What's New&lt;/h3&gt;
&lt;h4&gt;Single-Track Genre Editing (Chip UI + Autocomplete)&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;Track Properties&lt;/strong&gt; dialog now shows genres as compact &lt;strong&gt;chips&lt;/strong&gt; with a white &lt;strong&gt;x&lt;/strong&gt; to remove, plus &lt;strong&gt;autocomplete&lt;/strong&gt; to add existing genres quickly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clean look &amp;amp; feel:&lt;/strong&gt; compact chips, thin scrollbar, readable contrast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autocomplete:&lt;/strong&gt; type a few letters and pick from existing genres.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No more long strings:&lt;/strong&gt; add/remove individual genres directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always consistent:&lt;/strong&gt; the track table shows human-readable names everywhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you type a genre that doesn't exist yet, Mixxx keeps it as a literal. You can map it later using the Orphan Genres tool (see below).&lt;/p&gt;
&lt;h4&gt;Multi-Track Editing (Experimental)&lt;/h4&gt;
&lt;p&gt;You can now edit genres across multiple tracks in one go (experimental):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Common view:&lt;/strong&gt; shows the &lt;strong&gt;intersection&lt;/strong&gt; of genres shared by all selected tracks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch operations:&lt;/strong&gt; add or remove genres for the whole selection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safe by design:&lt;/strong&gt; unique per-track genres are preserved.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;A Smarter Library: Tree, Counts, and Drag &amp;amp; Drop&lt;/h4&gt;
&lt;p&gt;Genres now live in a &lt;strong&gt;tree&lt;/strong&gt;. Each node shows &lt;strong&gt;track count&lt;/strong&gt; and &lt;strong&gt;total duration&lt;/strong&gt;. When you select a track, the genres it belongs to become &lt;strong&gt;bold&lt;/strong&gt; in the tree crate-like ergonomics for quick navigation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Drag &amp;amp; drop:&lt;/strong&gt; drag tracks from the Tracklist onto a genre to assign it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick menu:&lt;/strong&gt; right-click a track then &lt;strong&gt;Genres&lt;/strong&gt; to (de)select on the fly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rename safely:&lt;/strong&gt; renaming a genre changes the &lt;strong&gt;name&lt;/strong&gt;, not the ID, so tracks keep their associations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Clean Migration: "Orphan Genres"&lt;/h4&gt;
&lt;p&gt;If your library contains free-text genres, Mixxx detects &lt;strong&gt;orphans&lt;/strong&gt; and helps you clean them up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click the &lt;strong&gt;root&lt;/strong&gt; of the genre tree then &lt;strong&gt;Edit Orphan Genres&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; a new genre or &lt;strong&gt;Link&lt;/strong&gt; a string to an existing one.&lt;/li&gt;
&lt;li&gt;Multi-word strings appear as both a full string &lt;em&gt;and&lt;/em&gt; individual tokens; add the full string first if you want to keep it as a single genre.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Why This Matters for DJs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One free-text field. No understanding of individual genres.&lt;/li&gt;
&lt;li&gt;No autocomplete.&lt;/li&gt;
&lt;li&gt;Editing meant retyping a whole string.&lt;/li&gt;
&lt;li&gt;Inconsistent naming ("Electronic" vs "electronic").&lt;/li&gt;
&lt;li&gt;No real bulk editing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;True multi-genre:&lt;/strong&gt; each tag is a first-class citizen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autocomplete:&lt;/strong&gt; fast, consistent tagging.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual editing:&lt;/strong&gt; add/remove with chips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bulk-friendly:&lt;/strong&gt; multi-track editor (experimental) for common operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Library-aware:&lt;/strong&gt; a genre tree with counts, duration, and drag &amp;amp; drop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backwards-compatible:&lt;/strong&gt; your library keeps working; migrate at your pace.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to Use It&lt;/h3&gt;
&lt;h4&gt;Single Track&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Right-click a track, &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Genre&lt;/strong&gt;, start typing and pick from autocomplete.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;x&lt;/strong&gt; to remove a tag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OK&lt;/strong&gt; or &lt;strong&gt;Apply&lt;/strong&gt; to save.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Multi Track (Experimental)&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Select multiple tracks then right-click then &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;See the &lt;strong&gt;common&lt;/strong&gt; genres across the selection.&lt;/li&gt;
&lt;li&gt;Add or remove tags in bulk.&lt;/li&gt;
&lt;li&gt;Save: Mixxx preserves track-specific genres.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Clean Up Old Text Tags&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the genre tree, right-click the &lt;strong&gt;root&lt;/strong&gt; then &lt;strong&gt;Edit Orphan Genres&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; new genres or &lt;strong&gt;Link&lt;/strong&gt; strings to existing ones.&lt;/li&gt;
&lt;li&gt;Repeat as needed, your sets keep running.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Under the Hood (Brief)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stable IDs&lt;/strong&gt; for genres and a fast &lt;strong&gt;join table&lt;/strong&gt; (&lt;code&gt;genre_tracks&lt;/code&gt;) so filtering and counts are snappy.&lt;/li&gt;
&lt;li&gt;A central &lt;strong&gt;Genre DAO&lt;/strong&gt; (data access layer) that maps between IDs and names and normalizes raw data.&lt;/li&gt;
&lt;li&gt;The UI always shows &lt;strong&gt;human-friendly names&lt;/strong&gt;; the storage format stays robust behind the scenes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Demo video (quick tour)&lt;/h3&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="46gCxOuhvPg"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=46gCxOuhvPg"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;em&gt;This short video bundles all demos: single-track tag chips, multi-track bulk edit, the Genre Tree with drag-and-drop and &lt;/em&gt;&lt;em&gt;F2&lt;/em&gt;&lt;em&gt; rename, and the &lt;/em&gt;&lt;em&gt;Edit Orphan Genres&lt;/em&gt;&lt;em&gt; flow&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;What's Next&lt;/h3&gt;
&lt;p&gt;This foundation unlocks a lot of potential. Based on community input, we're exploring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;full hierarchical&lt;/strong&gt; genre tree with multi-level editing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuzzy autocomplete&lt;/strong&gt; to handle typos gracefully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt; that also matches genre names.&lt;/li&gt;
&lt;li&gt;Smarter &lt;strong&gt;import/export&lt;/strong&gt; of genre structures (share your taxonomy).&lt;/li&gt;
&lt;li&gt;Better &lt;strong&gt;metadata export&lt;/strong&gt; across formats for multi-genre fields.&lt;/li&gt;
&lt;li&gt;Optional &lt;strong&gt;auto-conversion&lt;/strong&gt; of known strings to stable IDs on import.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Thank You&lt;/h3&gt;
&lt;p&gt;Huge thanks to the Mixxx mentors and community for guidance, reviews, and real-world feedback. This is a big step forward, and we'll keep refining it together.
Please try it and tell us what works for you.&lt;/p&gt;
&lt;h3&gt;Learn More&lt;/h3&gt;
&lt;p&gt;For comprehensive project details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/14897"&gt;Complete Project Documentation&lt;/a&gt;&lt;/strong&gt;: Full development journey, technical decisions, and lessons learned&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://summerofcode.withgoogle.com/programs/2025/projects/sHcUR4s0"&gt;GSoC Project Page&lt;/a&gt;&lt;/strong&gt;: Official Google Summer of Code project details&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Feedback &amp;amp; Support:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Report issues on GitHub, share ideas on the forums, or chat with us on Zulip. We'd love to hear about your experience with the new genre features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Report Issues&lt;/strong&gt;: &lt;a href="https://github.com/mixxxdj/mixxx/issues"&gt;GitHub Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share Feedback&lt;/strong&gt;: &lt;a href="https://mixxx.discourse.group"&gt;Community Forums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Join Discussion&lt;/strong&gt;: &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip Chat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature Requests&lt;/strong&gt;: Help shape future enhancements!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Happy mixing!&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Antonio Giordano&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;GSoC 2025 Contributor&lt;/em&gt;&lt;/p&gt;</content><category term="news"></category><category term="GSoC2025"></category><category term="features"></category><category term="library"></category><category term="metadata"></category><category term="genres"></category><category term="multitrack"></category></entry><entry><title>Announcing the new shape of Mixxx 3.0 - take part in the future of Open Source DJing</title><link href="//mixxx.acolombier.dev/news/2025-08-06-qml-project" rel="alternate"></link><published>2025-08-06T16:50:59+02:00</published><updated>2025-08-06T16:50:59+02:00</updated><author><name>Antoine Colombier</name></author><id>tag:mixxx.acolombier.dev,2025-08-06:/news/2025-08-06-qml-project</id><summary type="html">&lt;p&gt;We are thrilled to announce an exciting new chapter in the evolution of Mixxx. We are embarking on a comprehensive redesign of the Mixxx user interface, transitioning from QWidget to &lt;a href="https://en.wikipedia.org/wiki/QML"&gt;QML&lt;/a&gt;. This significant update aims to enhance customization, improve performance, and ensure better accessibility for a variety of hardware, including …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are thrilled to announce an exciting new chapter in the evolution of Mixxx. We are embarking on a comprehensive redesign of the Mixxx user interface, transitioning from QWidget to &lt;a href="https://en.wikipedia.org/wiki/QML"&gt;QML&lt;/a&gt;. This significant update aims to enhance customization, improve performance, and ensure better accessibility for a variety of hardware, including tablets and touchscreen laptops, but also to users with vision deficiency thanks to &lt;a href="https://doc.qt.io/qt-6/accessible-qtquick.html"&gt;built-in capabilities of QML&lt;/a&gt;. Further details on the original proposal can be found &lt;a href="https://github.com/mixxxdj/proposals/blob/main/proposals/2024-11-16_qml_interface.md"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is a preview of the current look we have designed during the proposal. Of course, as always with design work, the final version will likely look a little different, but this helps as a general guideline and goal to something we like, and hopefully you will to!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_overview_live.svg"&gt;
&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_library_split_button.svg"&gt;
&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_waveform_overview_customization.png"&gt;&lt;/p&gt;
&lt;h2&gt;Why We Are Redesigning Mixxx&lt;/h2&gt;
&lt;p&gt;The current user interface of Mixxx has served us well, but as technology evolves, so must we. The shift to QML will simplify customization and maintenance, allowing us to focus more on innovative features and less on upkeep. This transition will also enable us to phase out our homemade theme system, streamlining our development process.&lt;/p&gt;
&lt;h2&gt;Key Features of the New Design&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Modernized Library and Waveform Views&lt;/strong&gt;: We are introducing a fresh look for the Library and Waveform views, making them more intuitive and user-friendly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_overlays_playlist.svg"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhanced Support for Lightweight Platforms&lt;/strong&gt;: The new design will be optimized for tablets, smartphones, and touchscreen laptops, ensuring a seamless experience across all devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved Search Capabilities&lt;/strong&gt;: The new search experience will offer better usability of advanced search options, making it easier to find and manage your tracks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_overlays_search.svg"&gt;
&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_overlays_search3.svg"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Interactive Settings and Preferences&lt;/strong&gt;: We are introducing more interactive settings for audio routing, controllers, and waveforms, providing a more dynamic and user-friendly experience.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_setting_audio_routing_advanced.svg"&gt;
&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_setting_controller_overview.svg"&gt;
&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_setting_controller_pointnclick.svg"&gt;
&lt;img alt="Preview" src="https://raw.githubusercontent.com/mixxxdj/proposals/main/proposals/contents/2024-11-16_qml_interface_setting_waveform.svg"&gt;&lt;/p&gt;
&lt;h2&gt;Get Involved&lt;/h2&gt;
&lt;p&gt;We are calling on developers and testers to join us in this exciting journey. Whether you are a seasoned developer or a passionate DJ looking to contribute, there are many ways you can help us.&lt;/p&gt;
&lt;p&gt;This significant project offers a fantastic opportunity to make a substantial impact from the ground up. By helping implement the new QML interface, fixing bugs, and adding features, you can shape the future of a widely-used DJ software. Your Qt/QML expertise will be crucial in this transition.
Whether you're beefing up your portfolio or just want to give back to the open-source community, contributing to Mixxx is a great way to truly make a difference!&lt;/p&gt;
&lt;h2&gt;For Developers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code Contributions&lt;/strong&gt;: Help us implement the new QML interface, fix bugs, and add new features. Your expertise in Qt/QML will be invaluable as we transition to this new technology.&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Contributing to Mixxx enhances your coding skills and connects you with a vibrant community, providing real-world impact and career opportunities. Many contributors have advanced their careers through Mixxx, gaining valuable experience and recognition. Join us to collaborate with passionate developers and open doors to exciting tech industry opportunities.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review and Feedback&lt;/strong&gt;: Review our code, provide feedback, and suggest improvements. Collaboration is key to our success, and your insights will help shape the future of Mixxx.
  Code review is currently our biggest struggle and your help could be a real success factor for the project!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;For Testers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Beta Testing&lt;/strong&gt;: Join our beta testing program to try out the new features and provide feedback. Your input will help us identify and fix issues, ensuring a smooth and stable release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Experience Feedback&lt;/strong&gt;: Share your thoughts on the new design and user experience. Your feedback will help us refine and improve the interface, making it more intuitive and user-friendly.&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Heads up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We especially want to gather feedback from the visually impaired and blind communities to ensure that the next generation of Mixxx is the most accessible it has ever been!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to Get Started&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Join our community&lt;/strong&gt;: Connect with us on our chat platform &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt;. Stay updated on the latest developments and contribute to discussions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check out the progress&lt;/strong&gt;: Check out our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and more precisely &lt;a href="https://github.com/orgs/mixxxdj/projects/3/views/1"&gt;the QML project&lt;/a&gt;. You can also help us testing the &lt;a href="https://github.com/mixxxdj/mixxx/pulls?q=is%3Aopen+is%3Apr+milestone%3A3.0-beta+draft%3Afalse"&gt;ready merge requests&lt;/a&gt;, or even help with review in case you are familiar with QML!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Follow us on our socials&lt;/strong&gt;: We have committed to increase our presence on &lt;a href="https://www.youtube.com/@mixxxdj"&gt;YouTube&lt;/a&gt; and provide regular updates on &lt;a href="https://floss.social/@mixxx"&gt;Mastodon&lt;/a&gt; and &lt;a href="https://bsky.app/profile/mixxx.bsky.social"&gt;Bluesky&lt;/a&gt;. Follow us and help us reaching out to more contributor to make this project successful.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Closing Thoughts&lt;/h2&gt;
&lt;p&gt;The future of Mixxx is bright, and we are excited to have you on board. Together, we can create the best DJ software experience for our community. Join us in this journey and help us shape the future of Mixxx and DJing!&lt;/p&gt;
&lt;p&gt;Stay tuned for more updates and happy mixxxing!&lt;/p&gt;</content><category term="news"></category><category term="community"></category><category term="contribute"></category><category term="development"></category><category term="announcement"></category></entry><entry><title>GSOC 2025 Work Product - Resampling Options for Mixxx</title><link href="//mixxx.acolombier.dev/news/2025-08-04-gsoc-2025-report-armaan-chowfin" rel="alternate"></link><published>2025-08-04T17:42:53+02:00</published><updated>2025-08-04T17:42:53+02:00</updated><author><name>Armaan Chowfin</name></author><id>tag:mixxx.acolombier.dev,2025-08-04:/news/2025-08-04-gsoc-2025-report-armaan-chowfin</id><summary type="html">&lt;p&gt;Presenting the latest additions to Mixxx:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/9328"&gt;issue#9328&lt;/a&gt;: Additional interpolation options for scratching&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10611"&gt;issue#10611&lt;/a&gt;: Custom output samplerates for recording and broadcast&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The scratching engine now supports a sinc-based resampler with three quality settings, and the original linear resampler is now twice as fast. Additionally, outbound audio is resampled before …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Presenting the latest additions to Mixxx:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/9328"&gt;issue#9328&lt;/a&gt;: Additional interpolation options for scratching&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10611"&gt;issue#10611&lt;/a&gt;: Custom output samplerates for recording and broadcast&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The scratching engine now supports a sinc-based resampler with three quality settings, and the original linear resampler is now twice as fast. Additionally, outbound audio is resampled before encoding for recording or streaming. This can improve compatibility with limited or fixed-rate sound cards.&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;Mixxx uses the &lt;code&gt;SoundTouch&lt;/code&gt; and &lt;code&gt;RubberBand&lt;/code&gt; time-stretching libraries for resampling during a keyLock operation. However, these libraries are unsuitable for scratching due to the fast changing tempo and pitch. Currently a faster, handcrafted linear interpolation algorithm is used - but there have been reports of suboptimal audio quality.  &lt;/p&gt;
&lt;p&gt;Digital Signal Processing (DSP) theory tells us that linear interpolation is not ideal, and that a sinc-based resampler will always return interpolated values identical to the original analog signal, under certain theoretical constraints. However, practical implementations of sinc resampling are computationally heavy and generally unsuitable for low-latency realtime software such as Mixxx. Therefore...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One objective of this GSoC project was to explore the feasibility of using sinc interpolation for scratching. To this end, the &lt;code&gt;libsamplerate&lt;/code&gt; and &lt;code&gt;libzita&lt;/code&gt; resample latencies were evaluated.&lt;/li&gt;
&lt;li&gt;Another focus was to investigate and improve the performance of the current linear resampler. Here, we observed that the &lt;code&gt;libsamplerate&lt;/code&gt; linear interpolator outperformed our own, &lt;em&gt;reducing per-buffer resample latency from 20µs to 10µs.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Theoretical Foundations&lt;/h4&gt;
&lt;p&gt;Although much of the work during GSOC involved integrating external C and C++ libraries into Mixxx, understanding the interpolation algorithms requires an overview of some foundational ideas in DSP.&lt;/p&gt;
&lt;h4&gt;Keywords&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Periodic Sampling:&lt;/strong&gt; The process of generating a digital audio representation from an analog signal by recording amplitude at uniform intervals. The length of the time interval is termed the sample-period (its reciprocal - the &lt;strong&gt;sampling rate&lt;/strong&gt; - is more commonly used while describing digital audio). Analog audio is usually sampled at rates of 44.1KHz, 48Khz or 96Khz, ensuring the Nyquist criterion is met for frequencies in the audible range for humans &lt;code&gt;[20Hz - 20kHz]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time and Frequency Domain:&lt;/strong&gt; Two representations of the same signal. The time domain representation describes how signal amplitude changes with time, and the frequency representation describes the spectral content of the signal. All DSP operations have a time-domain and frequency domain effect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nyquist Frequency:&lt;/strong&gt;  A digital signal contains all frequencies up to the Nyquist frequency, which is half the sample-rate (f&lt;sub&gt;s&lt;/sub&gt;/2). All spectral components below this frequency can be reproduced exactly during signal reconstruction. Frequencies above cannot be represented and must be removed before sampling to not cause aliasing noise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Digital Filter:&lt;/strong&gt;  Filtering refers to a process whereby a time-domain signal is processed to cause a change in that signal's spectral content. A filter allows certain frequencies to "pass", and attenuates the rest. In digital form, the differential equations describing analog filters are replaced by discrete-time equivalents, which are implemented as convolution sums or, in block form, as matrix multiplications. Filters are of two kinds: Finite Impulse Response (FIR) and Infinite Impulse Response (IIR),and may be implemented in software, programmable chips, or dedicated ICs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impulse Response:&lt;/strong&gt; The impulse response of a filter is its time-domain output when a unit impulse is applied as input. It encapsulates the behaviour of the filter, and may be a finite or infinite sequence depending on the filter type. For FIR filters, the impulse response is treated as the set of filter coefficients which is convolved with the input to generate the time-domain output. In practice, a very short rectangular wave is used as input, since it contains all frequencies.&lt;/p&gt;
&lt;h5&gt;Analog-to-Digital and Digital-to-Analog&lt;/h5&gt;
&lt;div style="border: 1px solid white; padding: 16px; margin-bottom: 24px; border-radius: 6px; line-height: 1.6;"&gt;
  &lt;strong&gt;Summary:&lt;/strong&gt;
  &lt;ul style="margin-top: 8px; margin-bottom: 0; padding-left: 16px;"&gt;
    &lt;li&gt;Every digital signal has a time-domain representation (sample sequence) and frequency-domain representation (replicated spectrum).
    &lt;li&gt;Filters implemented in hardware are called analog filters, those implemented in software are called digital filters.
    &lt;li&gt;In theory, ADC performs periodic sampling by multiplying an analog input signal with a unit impulse train.
    &lt;li&gt;In theory, DAC performs signal reconstruction by applying an analog Low-Pass Filter to the sample sequence. This is implemented via a continuous-time convolution&lt;/li&gt;
    &lt;li&gt;In theory, DAC signal reconstruction will be perfect if the original analog signal was Low-Pass filtered to lower than the Nyquist Frequency before ADC sampling.
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;An analog signal is a continuous-time, continuous-amplitude function. The &lt;strong&gt;Fourier theorem&lt;/strong&gt; states that any analog signal can be viewed as the infinite sum of time-domain sinusoid components of varying frequency and amplitude. The set of components gives the &lt;em&gt;spectrum&lt;/em&gt; of the signal. A signal's continuous spectrum is generally represented by an Amplitude-Frequency graph.&lt;/p&gt;
&lt;p&gt;Its digital counterpart is a discrete-time sequence formed by &lt;strong&gt;sampling&lt;/strong&gt; the analog amplitude at uniform time intervals, called sample-periods. In the time domain, sampling is represented as multiplying an analog signal with an impluse train. In practice, time-domain sampling is performed by electrical circuits in an Analog to Digital converter (ADC).&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight:bold;"&gt;Periodic Sampling in the Time Domain&lt;/h5&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 53%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sampling-analog-digital.jpeg" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; Mathematical Impulse-Train Sampling&lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="width: 46%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sample-and-hold-circuit.png" alt="Periodic Sampling 2" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; ADC Sample-and-Hold Circuit&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In the frequency domain, &lt;em&gt;sampling with any frequency f&lt;sub&gt;s&lt;/sub&gt; always creates replicas of the spectrum of the original signal, centered at integer multiples of f&lt;sub&gt;s&lt;/sub&gt;&lt;/em&gt;. In the figures below, the left-hand side polygon represents the assumed spectrum of the time-domain signal in Figure 1. Its highest frequency component is B hz, and the range &lt;code&gt;[-B, B]&lt;/code&gt; is referred to as the &lt;strong&gt;baseband&lt;/strong&gt; of the analog signal.&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight:bold;"&gt;Periodic Sampling in the Frequency Domain&lt;/h5&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 49%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-spectral-replication-no-overlap.png" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Spectral replication without overlap.&lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="width: 49%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-spectral-replication-with-overlap.png" alt="Periodic Sampling 2" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; Spectral replication with overlap&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The purpose of sampling an analog signal is to create a representation that can be stored and manipulated by digital computers.&lt;/em&gt; However, these digital representations are only valuable if they can eventually be perceived in the real world. The process of converting a sampled signal back into a continuous-time analog signal is called &lt;strong&gt;signal reconstruction&lt;/strong&gt;. Depending on the relative values of B and f&lt;sub&gt;s&lt;/sub&gt;, the spectral replicas created during sampling may overlap in the baseband, resulting in additive distortion. This phenomenon is termed &lt;strong&gt;aliasing&lt;/strong&gt; and is perceived only on signal reconstruction.&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight: bold;"&gt;Aliasing in the Time Domain&lt;/h5&gt;
  &lt;div style="width: 70%; margin: 0 auto;"&gt;
    &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-time-domain-aliasing.jpeg" alt="aliasing in time domain" style="width: 100%; height: auto;"&gt;
    &lt;p style="font-size: small; margin-top: 5px;"&gt;
      &lt;strong&gt;Figure 5:&lt;/strong&gt; When a sine wave is sampled below the Nyquist rate, multiple analog sinusoids can fit the same set of samples. The figure shows two possible original signals that are consistent with the sampled data.
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;!-- Reconstructing via LPF will only return the signal with spectral content within [-fs/2, fs/2] --&gt;

&lt;p&gt;In theory, signal reconstruction is performed by applying an analog low-pass filter to the input sample sequence, to eliminate the spectral replications that were created during sampling. This leaves only the spectral components in the baseband. If f&lt;sub&gt;s&lt;/sub&gt; &amp;gt; 2B as in Figure 3, the baseband spectral component after sampling still represents the original spectrum. This criterion is formalized by the &lt;strong&gt;Shannon-Nyquist sampling theorem&lt;/strong&gt;, which states that an analog signal must be sampled at at least twice the frequency (called Nyquist rate) of its highest-frequency component to ensure no aliasing upon signal reconstruction.&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight:bold;"&gt;Low Pass Filter in the Frequency Domain&lt;/h5&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 50%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-lpf-no-alias.png" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; Ideal Low pass (Brick Wall) filter, no aliasing. The reconstruction low pass filter in the DAC assumes that the input meets the Nyquist criterion.&lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="width: 50%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-lpf-alias.png" alt="Periodic Sampling 2" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; Failure to meet Nyquist criterion results in aliasing.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If f&lt;sub&gt;s&lt;/sub&gt; &amp;lt; 2B as in Figure 4, implying that the original signal has some higher-than &lt;code&gt;Nyquist Rate/2&lt;/code&gt; components, filtering would yield in a distorted baseband due to the "folding-back" of higher frequency sinusoid components. Therefore it is important to pass the analog signal through an analog low-pass filter before it is sampled by the ADC to restrict its frequency content.&lt;/p&gt;
&lt;p&gt;The principle behind signal reconstruction is the &lt;strong&gt;continuous-time convolution&lt;/strong&gt; process. Here, the impulse response h(t) of a &lt;strong&gt;First-Order Hold (FOH)&lt;/strong&gt; filter stays stationary while the sampled sequence x&lt;sub&gt;flipped&lt;/sub&gt; slides over it. While the FOH filter reconstructs an analog signal, it is clearly an approximation. In fact, the impulse response for perfect reconstruction can be derived mathematically, and it &lt;em&gt;turns out to be a sinc function.&lt;/em&gt;&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight:bold;"&gt;Signal Reconstruction via continuous-time convolution&lt;/h5&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 70%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-continuous-convolution.jpeg" alt="convolution" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; Convolving an input sample sequence with the continuous-time impulse response of a FOH filter. At each time step nT, (where T is the sample-period) the sample x&lt;sub&gt;flipped&lt;/sub&gt;(n) scales the triangular impulse response h(t-nT). The reconstructed signal y(n) is the sum of all such shifted, scaled responses. DACs implement FOH filter in their circuits.
    &lt;/div&gt;
    &lt;div style="width: 30%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sinc-continuous.jpeg" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt; Sinc reconstruction kernel. In theory, convolving this function with a sample sequence implements a brick-wall filter.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;!-- In practice, we use N-taps of the sinc function, which implement a near-brick wall filter as N increases --&gt;

&lt;p&gt;To conclude:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Convolving a sample sequence with a continuous normalized sinc function is equivalent to applying a brick wall filter over its spectrum. In the time domain, this process results in reconstruction of the analog signal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h5&gt;Sample Rate Conversion&lt;/h5&gt;
&lt;p&gt;It is often necessary to change the sample-rate f&lt;sub&gt;s&lt;/sub&gt; of previously sampled analog audio. Re-recording from the source is quite impractical, and this has led to the development of software-based techniques to modify the sample-rate of digital audio.&lt;/p&gt;
&lt;p&gt;Digital sample-rate conversion should be simple: Implement the DAC convolution on the digital samples to "recreate" the analog signal in software, and then implement an operation analogous to ADC sampling in software at the desired sample-rate.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; &lt;em&gt;Discrete-time convolution generates a discrete output sequence.&lt;/em&gt; While discrete-time convolution is the natural digital analogue to the continuous-time DAC convolution, its output is not continuous, and so cannot be sampled at arbitrary time instances.&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight:bold;"&gt;Discrete-Time Convolution&lt;/h5&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 70%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-discrete-conv-1.png" alt="convolution" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt; Convolving a 5-tap impulse response h(k) of an averaging filter with a digital signal x(nT), where T is the sample-period. Outputs y(n) are obtained by sliding the input sequence over the stationary coefficients.
    &lt;/div&gt;
    &lt;div style="width: 30%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sinc-coeffs.jpeg" alt="sinc coeffs" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt; 9-tap and 19-tap sinc impulse responses h(k) of a lowpass filter.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Model the original analog signal as a weighted sum of ideal, infinite, time-shifted sinc kernels, each centered on a known sample. This is effectively a snapshot of the DAC continuous-time convolution.&lt;/p&gt;
&lt;p&gt;In theory, the continuous signal is reconstructed using an infinite number of sinc kernels:&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 60%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sinc-inf.jpeg" alt="convolution" style="width: 100%; height: auto;"&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;but in practice, sinc algorithms approximate using a truncated window:&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;div style="display: flex; justify-content: center; gap: 20px;"&gt;
    &lt;div style="width: 60%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sinc-trunc.jpeg" alt="convolution" style="width: 100%; height: auto;"&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This windowed sinc interpolation algorithm can generate samples of the analog signal at arbitrary time instances. Resampling then reduces to generating a series of sample-values corresponding to a different set of time-stamps than the original. In Figure 11 below, the interpolated amplitude is the signed sum of the amplitudes of the 5 sincs at t = 0.2T.&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;h5 style="margin-bottom: 10px; font-size: 1.8rem; font-weight: bold;"&gt;Sinc Interpolation&lt;/h5&gt;
  &lt;div style="width: 70%; margin: 0 auto;"&gt;
    &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-sinc-interpolation-sample-rate-conversion.jpeg" alt="sample-rate conversion" style="width: 100%; height: auto;"&gt;
    &lt;p style="font-size: small; margin-top: 5px;"&gt;
      &lt;strong&gt;Figure 11: Resampling via sinc interplolation.&lt;/strong&gt; Here, a N=5 tap window around t = 0 is chosen to interpolate the sample amplitude at point-of-interest t = 0.2T. Each sinc function is centered on a sample in the symmetrical size 2T window around t = 0, and scaled by its corresponding sample amplitude.
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;For a given point-of-interest in time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the time is an exact integer multiple of the original sample period, each sinc function evaluates to zero except the one centered at that point, which evaluates to 1. This ensures that the reconstructed signal (weighted sum) perfectly matches the original sample value — there is no interference from neighboring sinc functions.&lt;/li&gt;
&lt;li&gt;For other, arbitrary times, the sinc interpolation algorithm first chooses the known sample at the integer multiple of the sample period closest to the point of interest. It then selects a finite set (typically
N=2M+1 taps) of nearby samples, scales the corresponding sincs, and computes a sum at the point of interest.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Interpolation libraries such as &lt;code&gt;libzita&lt;/code&gt; and &lt;code&gt;libsamplerate&lt;/code&gt; precompute sinc values in a high-resolution lookup table of fractional sample-period offsets to speed up computations. However, these are still far more computationally expensive than a linear interpolator, which uses only two adjacent samples and computes a simple weighted average based on the fractional offset.&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;Audio Engineering in Practice&lt;/h4&gt;
&lt;p&gt;While the section on theoretical foundations gives important intuitions on the correctness and meaning of certain digital audio procedures, developing high-performance implementations are an engineering problem, constrained by the design of digital audio hardware and processing software.&lt;/p&gt;
&lt;h5&gt;Keywords:&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Audio Encoding:&lt;/strong&gt;&lt;br&gt;
Digital computers quantize analog amplitudes using fixed-precision floats during sampling. To distribute a digital record, it is compressed (lossy or lossless) using well-known algorithms that effectively wrap the float sample-sequence in headers.  MP3, WAV, AAC are some standard audio encoding formats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audio Frame:&lt;/strong&gt;&lt;br&gt;
Sample sequences are treated as a series of logical &lt;em&gt;frames&lt;/em&gt; for multichannel audio. An audio frame is an array containing &lt;code&gt;k&lt;/code&gt; copies of the current sample value, where &lt;code&gt;k&lt;/code&gt; is the number of output channels (mono:1, stereo:2).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audio Interface:&lt;/strong&gt;&lt;br&gt;
A gateway for audio to enter or exit a processing system. The human ear is a biological audio interface. The ADC and DAC are technological/physical audio interfaces.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample Rate:&lt;/strong&gt;&lt;br&gt;
For a digital record, its sample rate in Hz defines how many frames make up one second of the track. The DAC sample-rate specifies how many outbound frames must be consumed per second of real-world (wall-clock) time during playback to avoid buffer underruns. Common rates are 44.1KHz, 48Khz or 96Khz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audio Buffer:&lt;/strong&gt;&lt;br&gt;
Audio frames, i.e. float arrays are transported to various parts of the audio processing stack in units of audio buffers. DSP libraries often expect multi-channel audio buffers to be interleaved - i.e. each frame with &lt;code&gt;k&lt;/code&gt; floats is placed adjacently to build the audio buffer.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Buffer Underrun:&lt;/strong&gt;&lt;br&gt;
An audio distortion that may be observed during playback. During playback, the role of audio processing software is to prepare a certain amount of frames per unit time - decided by the DAC sample-rate. Delays in preparing the required number of frames results in intervals of silence, observed as audio pops and cracks.&lt;/p&gt;
&lt;h5&gt;The Mixxx Audio-Playback Stack&lt;/h5&gt;
&lt;p&gt;The Mixxx audio playback stack consists of components in Mixxx userspace that interact with the Linux audio subsystem using the PortAudio API. PortAudio interfaces with JACK - a low-latency linux sound server that mixes audio buffers from multiple sources. This enables DJs to design more involved workflows - for example running Mixxx decks into a live effects generator before playback. JACK interfaces with the DMA-based ALSA driver in the kernel, which finally triggers audio-buffer writes from RAM to the DAC FIFO during playback.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While JACK is essential to allow multiple real-time applications to talk to each other, a DJ performing a basic set will use Mixxx as her standalone audio source. PortAudio can also interface directly with the ALSA backend - causing Mixxx to be the sole owner of the soundcard. This provides a minor latency improvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;The Need for Sample-Rate Conversion&lt;/h5&gt;
&lt;p&gt;Input audio must be resampled in two cases:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When there is a sample-rate mismatch between the input track and the DAC sample-rate:&lt;/strong&gt;&lt;br&gt;
While buffer underruns occur due to DAC starvation regardless of the buffer contents, this audio distortion arises when the DAC receives the wrong sequence of frames in its FIFO.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If a 96kHz record is played back on a DAC operating at 48 kHz without resampling, only 48k input frames are processed each second—meaning less than a full second of the outbound audio is played back per second. This results in an unintended slowdown.&lt;/li&gt;
&lt;li&gt;Conversely, if the DAC sample rate exceeds the input sample rate, more than one second of the original recording is heard every second, creating the perception of sped-up and pitch-shifted playback.&lt;/li&gt;
&lt;/ul&gt;
&lt;section style="margin-top: 2rem;"&gt;
  &lt;h5 style="text-align: center; margin-bottom: 10px; font-size: 1.8rem; font-weight: bold;"&gt;
    Unintended tempo ramping
  &lt;/h5&gt;
  &lt;div style="display: flex; gap: 1.2rem; align-items: flex-start; flex-wrap: nowrap; justify-content: center; margin-top: 1rem;"&gt;
    &lt;figure style="display: flex; flex-direction: column; align-items: center;"&gt;
      &lt;audio controls style="width: 224px;"&gt;
        &lt;source src="////mixxx.acolombier.dev/audio/96in_96out_base-10s.mp3" type="audio/mp3"&gt;
        Your browser does not support the audio element.
      &lt;/audio&gt;
      &lt;figcaption style="font-size: small; margin-top: 5px; font-weight: normal;"&gt;
        &lt;strong&gt;Base (96kHz input, 96kHz DAC)&lt;/strong&gt;
      &lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style="display: flex; flex-direction: column; align-items: center;"&gt;
      &lt;audio controls style="width: 224px;"&gt;
        &lt;source src="////mixxx.acolombier.dev/audio/96in_192out_speedup-10s.mp3" type="audio/mp3"&gt;
        Your browser does not support the audio element.
      &lt;/audio&gt;
      &lt;figcaption style="font-size: small; margin-top: 5px; font-weight: normal;"&gt;
        &lt;strong&gt;Speedup (96kHz input, 192kHz DAC)&lt;/strong&gt;
      &lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style="display: flex; flex-direction: column; align-items: center;"&gt;
      &lt;audio controls style="width: 224px;"&gt;
        &lt;source src="////mixxx.acolombier.dev/audio/96in_48out_slowdown-10s.mp3" type="audio/mp3"&gt;
        Your browser does not support the audio element.
      &lt;/audio&gt;
      &lt;figcaption style="font-size: small; margin-top: 5px; font-weight: normal;"&gt;
        &lt;strong&gt;Slowdown (96kHz input, 48kHz DAC)&lt;/strong&gt;
      &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;
&lt;/section&gt;

&lt;p&gt;In these scenarios, resampling is a corrective procedure that transforms audio sampled at the input sampling rate to match the DAC’s expected output rate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When there is tempo change induced by the user:&lt;/strong&gt;&lt;br&gt;
For a record sampled at 96kHz with a DAC also at 96kHz, scaling tempo by a factor of 3 means we want to pass 3x the frames to the DAC on each callback than we would during standard playback.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Without resampling, writing 3x frames per callback in an attempt to increase tempo would overfill the Mixxx-ALSA buffers. In the worst case, the excess frames would be dropped. Either way, the DAC would still consume only 96k frames per second instead of the entire 3 * 96k — nullifying the intended tempo increase.&lt;/li&gt;
&lt;li&gt;For accurate tempo-ramping, we must represent a longer amount of track duration using less frames, while ensuring that there are enough remaining frames for accurate reconstruction. That is, every second, we need to represent 3 * 96k frames using 96k frames only. This corresponds to an downsample, where we decrease the number of frames per second of input audio, i.e. decrease its sample rate.&lt;/li&gt;
&lt;li&gt;Conversely, upsampling is used when decreasing track tempo, by increasing its sample rate. Here, interpolation is used to generate frames at non-integer multiples of the sample-period.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Mechanics of resampling in Mixxx&lt;/h5&gt;
&lt;p&gt;The Linux kernel can perform sample-rate conversion if required, using ALSA's internal resampler if necessary. Depending on kernel configuration, the resample could use linear or sinc-based interpolation provided by &lt;code&gt;PipeWire&lt;/code&gt; or &lt;code&gt;ALSA&lt;/code&gt;. The primary use case for such in-kernel resampling is to playback audio using &lt;code&gt;aplay&lt;/code&gt; or &lt;code&gt;ffplay&lt;/code&gt; via commandline.&lt;/p&gt;
&lt;p&gt;Mixxx performs real-time manipulation of audio: live mixing, tempo changes, effects, scratching, and more. In fact, due to the low-latency requirement of these workflows, it is necessary to avoid the in-kernel resample. Therefore, Mixxx performs sample-rate conversion in userspace using a variety of external interpolation libraries.&lt;/p&gt;
&lt;p&gt;Mixxx provides an abstract &lt;code&gt;EngineBufferScale&lt;/code&gt; class, which is subclassed to implement resamplers using various time-stretching libraries. &lt;code&gt;EngineBufferScaleST&lt;/code&gt;, &lt;code&gt;EngineBufferScaleRubberband&lt;/code&gt;, &lt;code&gt;EngineBufferScaleSRC&lt;/code&gt;, &lt;code&gt;EngineBufferScaleZita&lt;/code&gt; implement resamplers that use the &lt;a href="https://www.surina.net/soundtouch/"&gt;SoundTouch&lt;/a&gt;, &lt;a href="https://breakfastquay.com/rubberband/"&gt;Rubberband&lt;/a&gt;, &lt;a href="https://libsndfile.github.io/libsamplerate/"&gt;SampleRate&lt;/a&gt; and &lt;a href="https://kokkinizita.linuxaudio.org/linuxaudio/zita-resampler/resampler.html"&gt;libzita-resampler&lt;/a&gt; library APIs respectively.&lt;/p&gt;
&lt;p&gt;During a live DJ set where the end result is an audio output, the resampling step happens in the player - between the soundsource and the engine. The exact flow is as follows, where T is the rack sample-rate and E is the Engine (DAC) sample-rate:  &lt;/p&gt;
&lt;p&gt;i. Sound source (T)&lt;br&gt;
ii. Read ahead manager (T)&lt;br&gt;
iii. Resample #1 (T -&amp;gt; E): &lt;code&gt;scaleBuffer()&lt;/code&gt;&lt;br&gt;
iv. Engine buffer (E)&lt;br&gt;
v. Engine mixer (E)  &lt;/p&gt;
&lt;p&gt;With the new additions from this GSOC project, additional resampling occurs in the sidechains during recording and broadcast, where R is the recording/broadcast sample-rate:&lt;/p&gt;
&lt;p&gt;vi. Sidechain (E)&lt;br&gt;
vii. Record/Broadcast (E)&lt;br&gt;
viii. Resample #2 (E -&amp;gt; R): &lt;code&gt;scaleBufferOneShot()&lt;/code&gt;&lt;br&gt;
ix. Encoding (R): &lt;code&gt;encodeBuffer()&lt;/code&gt;  &lt;/p&gt;
&lt;!-- Mixxx exposes two important parameters in the *Sound Hardware Preferences* panel:

- **Sample Rate (Hz)**: Determines the DAC sample rate, i.e., how frequently audio frames are converted to analog signals.
- **Audio Buffer (ms)**: Specifies the total buffer duration, indirectly determining the size of ALSA’s ring buffer.

*Mixxx Sound Hardware Preferences*
![Mixxx Sound Hardware Preferences]({static}/images/news/mixxx-sound-hw-prefs.png)

These parameters together influence the quality of output sound by defining the size in frames of the ALSA ring-buffer for the selected sample-rate:

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Ring Buffer Size = (Audio Buffer in s) * (Sample Rate in Hz)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



##### Mixxx Buffering Hierarchy
As audio frames move from Mixxx to the speakers, they pass through three distinct buffering levels:

**Mixxx Buffer** (userspace, heap):  
   Holds outbound frames from the track, possibly post-processing or effects.  
   This buffer is typically larger and acts as the staging area for frames handed off to ALSA.

**ALSA Ring Buffer** (kernel-managed, DMA-mapped):  
   A circular buffer of configurable size (in frames), subdivided into **periods**. Mixxx writes to this buffer in chunks, while the DMA engine drains it in `period_size` frames - a value negotiated between Mixxx and the audio-card driver at initialization. Usually, `period_size = Ring Buffer Size / 2`[^1]. Each time a period is emptied, ALSA triggers a software interrupt which is handled by a userspace callback in a high-priority Mixxx thread. This callback prepares frames and refills the ring-buffer.

**DAC FIFO** (hardware-level):  
   A small first-in-first-out queue that is read at the **DAC sample rate**, typically 44.1 kHz, 48 kHz, or 96kHz. This hardware buffer feeds the analog reconstruction circuitry with upstream frames. For instance, a 96kHz DAC consumes one frame every 1/96k s (≈10.4 us), totaling 96000 frames per second.

*Mixxx, ALSA, DAC buffers*
![Mixxx Buffering Hierarchy]({static}/images/news/mixxx-buffer-heirarchy.jpeg)

 While technically, only `period_size` frames are written to the DAC between callbacks via DMA, Mixxx prepares `Ring Buffer Size` frames in that duration. We can therefore simplify our model by noting that on average, `Ring Buffer Size` frames are written to the DAC every callback.

##### Buffer Underruns
From the `period_size` we compute `period_time = period_size / DAC Sample Rate`. This defines a hard real-time deadline for the userspace audio callback: it must prepare at least `period_size` frames within `period_time` to avoid starving the DAC’s hardware FIFO. This relation also confirms that large ring-buffers and lower DAC sample-rates reduce CPU pressure.

Whether this constraint is met depends on several factors - such as the complexity of audio processing in the real-time thread, OS scheduling latency, memory pressure, etc. Since general-purpose kernels do not provide any real-time guarantees, short `period_time` values can occasionally cause the callback to miss its deadline. The result is a **buffer underrun**, heard as a pop or glitch in playback—unacceptable in live DJ performance.

Unlike typical audio players, Mixxx performs real-time manipulation of audio—mixing, tempo changes, effects, scratching, and more - making the callback workload heavier. This demands low-latency implementations of all audio processing workflows to avoid underruns without compromising quality. --&gt;

&lt;hr&gt;
&lt;h4&gt;Emulated Vinyl Scratching&lt;/h4&gt;
&lt;p&gt;This GSOC project was derived from reports suggesting sub-par audio quality during scratching. In audio-enginieering terms, scratching simply amounts to a short-duration tempo change. As discussed in the previous section, this requires a sample-rate conversion, i.e. a resample.&lt;/p&gt;
&lt;p&gt;A scratch can triggered by spinning the jog wheels of a MIDI controller. The architecture of Mixx ensures that the associated change in tempo ratio is made available to the resampler between DAC callbacks at the earliest. Mixxx acts on buffer chunks, for example 20 ms. The scratch control command is taken into account between these buffers. To have a steady tempo without clicks and pops, a ramp is applied. For example, if a user changes tempo from 1x to 2x, one additional buffer is used to slowly change the tempo from 1x to 2x.&lt;/p&gt;
&lt;p&gt;The scratch control command directs the chosen resampler to adjust the quantity of input frames it requests from the Read-Ahead Manager and then interpolate to the desired output frame count. This emulates scratching - i.e. playback of high/low-frequency output due to sudden tempo change. Our empirical tests have revealed the following per-buffer resample latencies for each resampler:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Resampler&lt;/th&gt;&lt;th&gt;Per-Buffer Latency&lt;/th&gt;
&lt;tr&gt;&lt;td&gt;SampleRate Linear&lt;/td&gt;&lt;td&gt;10 µs&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;Handcrafted Linear&lt;/td&gt;&lt;td&gt;20 µs&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;SampleRate Fastest Sinc&lt;/td&gt;&lt;td&gt;57 µs&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;SampleRate Highest-Quality Sinc&lt;/td&gt;&lt;td&gt;448 µs&lt;/td&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4&gt;Contributions&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/15081"&gt;mixxxPR#15081&lt;/a&gt;: Custom samplerates setting for recording.&lt;/strong&gt;&lt;br&gt;
Status: &lt;em&gt;Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR introduces an improved user experience in the recording preferences page. No more error messages for incompatible formats. The GUI maintains the necessary format+sample-rate invariants. This PR also introduces &lt;code&gt;libsamplerate&lt;/code&gt; to the build system along with a base resampler class using the libsamplerate &lt;code&gt;src_process&lt;/code&gt; API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Files&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/7bf99bed4fac98b6b64b5d3170e5b867c402504a/src/preferences/dialog/dlgprefrecord.cpp"&gt;dlgprefrecording.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/7bf99bed4fac98b6b64b5d3170e5b867c402504a/src/engine/sidechain/enginerecord.cpp"&gt;enginerecord.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/7bf99bed4fac98b6b64b5d3170e5b867c402504a/src/recording/recordingmanager.cpp"&gt;recordingmanager.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;GUI Changes&lt;/strong&gt;&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;div style="display: flex; flex-direction: column; align-items: center; gap: 20px;"&gt;
    &lt;div style="width: 80%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-recording-prefs-before.png" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="width: 80%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-recording-prefs-after.png" alt="Periodic Sampling 2" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/15160"&gt;mixxxPR#15160&lt;/a&gt;: Custom samplerates setting for broadcasting.&lt;/strong&gt;
Status: &lt;em&gt;Unmerged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR allows users to choose custom samplerates for each broadcast profile, independently of the engine samplerate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Files&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/6cfcecd461de3c6b5a86a8cafcfb334f5b382493/src/preferences/dialog/dlgprefbroadcast.cpp"&gt;dlgprefbroadcast.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/6cfcecd461de3c6b5a86a8cafcfb334f5b382493/src/engine/sidechain/shoutconnection.cpp"&gt;shoutconnection.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/6cfcecd461de3c6b5a86a8cafcfb334f5b382493/src/preferences/broadcastprofile.cpp"&gt;broadcastprofile.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users can now pick custom samplerates for both recording and broadcasting, independent of the engine samplerate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GUI Changes&lt;/strong&gt;&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;div style="display: flex; flex-direction: column; align-items: center; gap: 20px;"&gt;
    &lt;div style="width: 80%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-broadcast-prefs-before.png" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="width: 80%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-broacast-prefs-after.png" alt="Periodic Sampling 2" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/15005"&gt;mixxxPR#15005&lt;/a&gt;: Support for low-latency scratching using the libsamplerate callback API&lt;/strong&gt;
Status: &lt;em&gt;Unmerged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR implements a resampler class using the libsamplerate Callback API. We observed a reduction in per-buffer resampling latency from 20us to 10us - a 2x improvement over the handcrafted linear interpolator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Files&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/ede79a2cbae107b557126905e246e6fac011b647/src/engine/enginebuffer.cpp"&gt;enginebuffer.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/ede79a2cbae107b557126905e246e6fac011b647/src/engine/enginemixer.cpp"&gt;enginemixer.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/ede79a2cbae107b557126905e246e6fac011b647/src/engine/bufferscalers/enginebufferscalesr.cpp"&gt;enginebufferscalesrc.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/ede79a2cbae107b557126905e246e6fac011b647/src/preferences/dialog/dlgprefsound.cpp"&gt;dlgprefsound.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;GUI Changes&lt;/strong&gt;&lt;/p&gt;
&lt;div style="text-align: center; margin-bottom: 30px;"&gt;
  &lt;div style="display: flex; flex-direction: column; align-items: center; gap: 20px;"&gt;
    &lt;div style="width: 80%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-scratching-engine-prefs-before.png" alt="Periodic Sampling 1" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="width: 80%;"&gt;
      &lt;img src="////mixxx.acolombier.dev/images/news/mixxx-scratching-engine-prefs-after.png" alt="Periodic Sampling 2" style="width: 100%; height: auto;"&gt;
      &lt;p style="font-size: small; margin-top: 5px;"&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h4&gt;Future Work&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Benchmarking the latency and CPU usage of the various resamplers during scratching.&lt;/li&gt;
&lt;li&gt;Creating a test-suite for various scratching patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Acknowledgements&lt;/h4&gt;
&lt;p&gt;I thank Daniel Schürmann, Evelynne Veys, Ronny, and Jörg Wartenberg, who have spent considerable time reviewing my PRs and offering assistance anytime I needed it.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2025"></category></entry><entry><title>Mixxx 2.5.2 Released</title><link href="//mixxx.acolombier.dev/news/2025-06-13-mixxx-2_5_2-released" rel="alternate"></link><published>2025-06-13T17:53:30+02:00</published><updated>2025-06-13T17:53:30+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2025-06-13:/news/2025-06-13-mixxx-2_5_2-released</id><summary type="html">&lt;h4&gt;Mixxx 2.5.2 Release Announcement&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new stable release of Mixxx: version 2.5.2, this version contains updates and fixes for some issues reported by users. We'd like to thank all users for giving feedback as we would like to emphasise once again the …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx 2.5.2 Release Announcement&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new stable release of Mixxx: version 2.5.2, this version contains updates and fixes for some issues reported by users. We'd like to thank all users for giving feedback as we would like to emphasise once again the importance of testing.&lt;br&gt;
Please join our &lt;a href="https://mixxx.org/get-involved/"&gt;testing-force&lt;/a&gt;.&lt;br&gt;
This update also contains updates to controller-mappings and improvements in the building procedures.&lt;br&gt;
Have a nice Mixxx.&lt;/p&gt;
&lt;h4&gt;Important updates and fixes in 2.5.2&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The Midi wizard kept on waiting for a button press.&lt;/li&gt;
&lt;li&gt;An issue with the detection of the keyboard layout on linux prevented the functionality of some shortcuts.&lt;/li&gt;
&lt;li&gt;There was an issue sorting tracks while browsing files in 'computer'.&lt;/li&gt;
&lt;li&gt;Another track then intended was loaded when a symlink was dragged and dropped.&lt;/li&gt;
&lt;li&gt;Some skins were missing the loop-control anchor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.5.2 Changelog&lt;/h4&gt;
&lt;p&gt;The complete changelog can be found &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.5.2/CHANGELOG.md"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Controller Mappings&lt;/h3&gt;
&lt;p&gt;Mappings were updated for Denon MC7000, DJ TechTools MIDI Fighter Twister, Hercules DJControl Inpulse 500, Numark Mixtrack Platinium FX, Traktor S2 MK3, Traktor S4 MK2 and Traktor S4 MK3.&lt;/p&gt;
&lt;h3&gt;Library&lt;/h3&gt;
&lt;p&gt;Fixes for playlist export (when name contains a dot), loading the wrong track via drag and drop when using symlinks, byte order in hotcue comments imported from rekordbox, keyboard mappings with non-ASCII characters on Linux, Browse feature (enable initial sorting during population)&lt;/p&gt;
&lt;h3&gt;Controller Backend&lt;/h3&gt;
&lt;p&gt;Updates the Control picker (allow to learn MIDI Aux/Mic enable controls), Make &lt;code&gt;[Main],headSplit&lt;/code&gt; CO persistent across restart, fix MIDI Controller button learning, fix learning with "No Mapping" selected, Unit tests for engine.beginTimer.&lt;/p&gt;
&lt;h3&gt;Target support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fix building with:&lt;ul&gt;
&lt;li&gt;a CMake multi-config setup&lt;/li&gt;
&lt;li&gt;with gcc &amp;gt;= 14 with LTO and clang &amp;gt;= 19 (fpclassify)&lt;/li&gt;
&lt;li&gt;gcc &lt;code&gt;-Warray-bounds=&lt;/code&gt; in fidlib by using a flexible member&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Added:&lt;ul&gt;
&lt;li&gt;Linux Mint Codenames to debian_buildenv.sh&lt;/li&gt;
&lt;li&gt;hidden &lt;code&gt;[Config],notify_max_dbg_time&lt;/code&gt; setting to reduce warnings in developer mode&lt;/li&gt;
&lt;li&gt;Detect arch and fail early if not supported when installing buildenv&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Misc&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added and updated:&lt;ul&gt;
&lt;li&gt;Vinyl Control: Reduce sticker drift&lt;/li&gt;
&lt;li&gt;Fix infinite number of pop ups of the "No Vinyl|Mic|Aux|Passthrough input configured" dialog&lt;/li&gt;
&lt;li&gt;Reduce CPU usage with Trace log messages&lt;/li&gt;
&lt;li&gt;Fix adjust Gain after adopting it as ReplayGain only in requesting player&lt;/li&gt;
&lt;li&gt;Skins: add loop anchor toggle to Deere, Shade, Tango&lt;/li&gt;
&lt;li&gt;Sound Hardware preferences: add manual link for Mic monitoring modes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.5.2"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.6 beta Released</title><link href="//mixxx.acolombier.dev/news/2025-05-11-mixxx-2_6_beta-released" rel="alternate"></link><published>2025-05-11T22:17:07+02:00</published><updated>2025-05-11T22:17:07+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2025-05-11:/news/2025-05-11-mixxx-2_6_beta-released</id><summary type="html">&lt;h4&gt;Mixxx 2.6 beta Release Announcement&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new beta release of Mixxx, version 2.6.
This is a beta release containing a lot of new features, we offer this release in order to get it tested by the most possible users.
We look forward to the …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx 2.6 beta Release Announcement&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new beta release of Mixxx, version 2.6.
This is a beta release containing a lot of new features, we offer this release in order to get it tested by the most possible users.
We look forward to the feedback of all users.&lt;/p&gt;
&lt;p&gt;Mixxx needs testers for the new 2.6 beta release.
If you would like to contribute to your favorite DJ program (translate, add a mapping, add a feature, test) &lt;a href="https://mixxx.org/get-involved/"&gt;Get Involved&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy Mixxx 2.6 beta&lt;/p&gt;
&lt;h4&gt;STEMS STEMS STEMS&lt;/h4&gt;
&lt;p&gt;To explain what STEMS are all about, we take a sentence from the introduction of this post, a regular text and convert it to a STEMS-text.
In this example we extract 4 TEXT-STEMS that represent each a particular part of that sentence that only result in the original text when they are combined they result.&lt;/p&gt;
&lt;p&gt;In the Text stems example here you can play with the mute and effect buttons.
With the MUTE button you can make the Channel disappear, with the Effect button you can add an effect to the Channel.
To see the original text each Channel needs to be un-muted and without effect.&lt;/p&gt;
&lt;div class="stemdemo"&gt;
  &lt;style&gt;
    .channel {
      margin-bottom: 10px;
    }
    .stemdemo {
      padding:1em;
      border:1px #555 solid;
      border-radius:8px;
      margin: 1em;
    }
    .channel button {
      margin-right: 10px;
    }
    .channel button:hover, .channel button:active {
      border-color: unset;
    }
    .channel button[state='true'] {
      color: var(--accent-color-hover);
    }
    #output {
      font-family: monospace;
      white-space: pre-wrap;
      font-size: 28px;
      background-color: black;
      padding: 0.5em;
    }
    .c1 { color: #009E73; }
    .c2 { color: #D55E00; }
    .c3 { color: #CC79A7; }
    .c4 { color: #56B4E9; }

    #output.c1_mute .c1 { opacity: 0.2; }
    #output.c2_mute .c2 { opacity: 0.2; }
    #output.c3_mute .c3 { opacity: 0.2; }
    #output.c4_mute .c4 { opacity: 0.2; }

    #output.c1_fx .c1 { filter: blur(2.5px); }
    #output.c2_fx .c2 { filter: blur(2.5px); }
    #output.c3_fx .c3 { filter: blur(2.5px); }
    #output.c4_fx .c4 { filter: blur(2.5px); }

    #output span { transition: all 500ms ease; }
  &lt;/style&gt;

  &lt;div class="channel" data-channel="1"&gt;
    &lt;button class="mute"&gt;Mute&lt;/button&gt;
    &lt;button class="fx"&gt;Effect&lt;/button&gt;
    Channel&amp;nbsp;1&amp;nbsp;Consonants&amp;nbsp;+&amp;nbsp;punctuation
  &lt;/div&gt;
  &lt;div class="channel" data-channel="2"&gt;
    &lt;button class="mute"&gt;Mute&lt;/button&gt;
    &lt;button class="fx"&gt;Effect&lt;/button&gt;
    Channel&amp;nbsp;2&amp;nbsp;All&amp;nbsp;'a'
  &lt;/div&gt;
  &lt;div class="channel" data-channel="3"&gt;
    &lt;button class="mute"&gt;Mute&lt;/button&gt;
    &lt;button class="fx"&gt;Effect&lt;/button&gt;
    Channel&amp;nbsp;3&amp;nbsp;All&amp;nbsp;'e'
  &lt;/div&gt;
  &lt;div class="channel" data-channel="4"&gt;
    &lt;button class="mute"&gt;Mute&lt;/button&gt;
    &lt;button class="fx"&gt;Effect&lt;/button&gt;
    Channel&amp;nbsp;4&amp;nbsp;other&amp;nbsp;vowels
  &lt;/div&gt;

  &lt;div id="output"&gt;&lt;/div&gt;

  &lt;script&gt;
    const baseText = "Mixxx needs testers for the new 2.6 beta release.";

    function getCharChannel(char) {
      const lower = char.toLowerCase();
      if (lower === 'a') return 2;
      if (lower === 'e') return 3;
      if (/[aeiou]/.test(lower)) return 4;
      return 1;
    }

    const canvas = document.getElementById('output');

    document.querySelectorAll('div.channel button').forEach(
      b =&gt; b.addEventListener("click",
        function toggle() {
          const state = this.getAttribute("state") !== "true";
          const channel = this.parentElement.getAttribute("data-channel")
          if (state) {
            canvas.classList.add(`c${channel}_${this.className}`);
          } else {
            canvas.classList.remove(`c${channel}_${this.className}`);
          }
          this.setAttribute("state", state);
        }
      )
    );

    canvas.innerHTML = '';
    for (let i = 0; i &lt; baseText.length; i++) {
      const char = baseText[i];
      const channel = getCharChannel(char);

      canvas.innerHTML += `&lt;span class="c${channel}"&gt;${char}&lt;/span&gt;`;
    }
  &lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Wouldn't it be nice if we could do this tricks with music?
This possibility exists and is called STEMS. Stems are audiotracks that contain 4 stems-tracks: Drums, Bass, Melody (or other) and Vocals (or Vox).&lt;/p&gt;
&lt;h4&gt;STEMS in Mixxx&lt;/h4&gt;
&lt;p&gt;With Mixxx starting with this 2.6 beta release you can control the Volume and Effects for each of these Stem-tracks independently.
At the moment you need to create the STEM-Tracks with 3rd party tools, but once added to the Mixxx-library you can control them like
- create an a cappela: Play Drums, Bass and Other "Normal" + mute the Vocals
- create a drum pattern: Play Drums normally, mute Bass, Other and Vocals
- remix a track: set the volume of the Drums on 100%, the bass on 90%, the other on 50% and the vocals on 60%
- add effects to the vocal only: set the volume of all stems to a value of your choice + add reverb effect only to the vocals.&lt;/p&gt;
&lt;p&gt;Mixxx wouldn't be Mixxx if these controls weren't available for your controller, so they are.
To control the Stems you need for each channel, depending on your choice
- 4 buttons if you want to use the 'mute' functions
- 4 encoders to control the Volume
- 4 buttons to activate the effect
- 4 encoders to control the effect level.&lt;/p&gt;
&lt;p&gt;Find more info about Stems in Mixxx in &lt;a href="https://mixxx.org/news/2024-08-26-stem-mixing/"&gt;Antoine Colombier's GSoC Article&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="oEJuvVFSbnE"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=oEJuvVFSbnE"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h4&gt;CUES CUES CUES&lt;/h4&gt;
&lt;p&gt;What if you wanted to add an extra cue, that logically should be between the 2nd and 3rd cue you created? In 2.6 beta this problem is solved. You can move a cue to another position without the need to re-create the cue. It's also possible to rearrange all cues according to their position in the track.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Drop a hotcue on another position" src="////mixxx.acolombier.dev/images/news/Mixxx_2_6_beta_drop_hotcue_on_other_position.gif"&gt;&lt;/p&gt;
&lt;p&gt;You can also use a menu action to re-order the hot cues according to their position in the track.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Drop a hotcue on another position" src="////mixxx.acolombier.dev/images/news/Mixxx_2_6_beta_menu_reorder_hotcues.gif"&gt;&lt;/p&gt;
&lt;p&gt;Before, cues played as long as you pressed them, to continue the playing you needed to press the play button. That's now possible with only a mouse: click and hold the cue, drag &amp;amp; drop it on the play button and ... tada, the track keeps playing.&lt;/p&gt;
&lt;h4&gt;2.6 beta Changelog&lt;/h4&gt;
&lt;p&gt;The complete changelog can be found &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.6-beta/CHANGELOG.md"&gt;here&lt;/a&gt;
This is a selection of the changes and new features.&lt;/p&gt;
&lt;h3&gt;STEM file support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A lot of changes needed to be made to introduce STEM support.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Library&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add color coding for Key column&lt;/li&gt;
&lt;li&gt;Add Key Color Palettes&lt;/li&gt;
&lt;li&gt;Add overview column with small waveform&lt;/li&gt;
&lt;li&gt;Search: add BPM lock filter &lt;code&gt;bpm:locked&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Waveforms&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Simplify waveform combobox in preferences&lt;/li&gt;
&lt;li&gt;Add minute markers on horizontal waveform overview&lt;/li&gt;
&lt;li&gt;Rendergraph: Add rendergraph library and use if for waveform rendering&lt;/li&gt;
&lt;li&gt;Improve apperrance of marks on the waveforms&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Controller Mappings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mappings were updated for Behringer DDM4000 &amp;amp; BCR2000, Herrcules DJ Control Starlight, Numark Mixtrack 3, Traktor S3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Controller Backend&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add screen renderer to support controllers with a screen&lt;/li&gt;
&lt;li&gt;Settings: Add a file and color controller setting types&lt;/li&gt;
&lt;li&gt;Allow to enable MIDI Through Port in non-developer sessions&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Engine&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fix: sync rate using the current BPM instead of the file one&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Preferences&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mixer: Show 'real' crossfader configuration&lt;/li&gt;
&lt;li&gt;Mixer: Fix crossader graph&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Skins&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Allow swapping hotcues via dragging and dropping hotcue buttons&lt;/li&gt;
&lt;li&gt;Add controls to order Hotcues by position in the track&lt;/li&gt;
&lt;li&gt;Drop Hotcue onto Play button to latch &lt;code&gt;play&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Always show tooltips if Ctrl key is pressed&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;a lot of updates, please take a look at the changelog.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Misc Refactorings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;a lot of updates, please take a look at the changelog.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.6 beta"></category><category term="release announcement start  CI"></category></entry><entry><title>Mixxx 2.5.1 Released</title><link href="//mixxx.acolombier.dev/news/2025-04-27-mixxx-2_5_1-released" rel="alternate"></link><published>2025-04-27T12:43:25+02:00</published><updated>2025-04-27T12:43:25+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2025-04-27:/news/2025-04-27-mixxx-2_5_1-released</id><summary type="html">&lt;h4&gt;Mixxx 2.5.1 Release Announcement&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new stable release of Mixxx, version 2.5.1.
It is recommended that all users update to this new version.
Thanks to your feedback, this release contains a lot of improvements, fixes, new and improved controller-mappings.
We would like …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx 2.5.1 Release Announcement&lt;/h4&gt;
&lt;p&gt;We're proud to announce a new stable release of Mixxx, version 2.5.1.
It is recommended that all users update to this new version.
Thanks to your feedback, this release contains a lot of improvements, fixes, new and improved controller-mappings.
We would like to emphasize the importance of testing new versions. You don't have to be a programmer to contribute to Mixxx. Translating, testing new features and checking for possible regression is just as important.
If you would like to contribute to your favorite DJ program, click on &lt;a href="https://mixxx.org/get-involved/"&gt;contribute&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy Mixxx&lt;/p&gt;
&lt;h4&gt;2.5.1 Changelog&lt;/h4&gt;
&lt;p&gt;The complete changelog can be found &lt;a href="https://github.com/mixxxdj/mixxx/milestone/45"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Controller Mappings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Behringer DDM4000 &amp;amp; BCR2000: Update mappings to 2.5
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14232"&gt;#14232&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14349"&gt;#14349&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DJ TechTools MIDI Fighter Spectra: Add controller mapping
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14559"&gt;#14559&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hercules DJControl Inpulse 300: add toneplay, slicer, and beatmatch functionalities
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14051"&gt;#14051&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14057"&gt;#14057&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hercules DJControl Inpulse 500: New mapping
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14491"&gt;#14491&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14510"&gt;#14510&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hercules DJ Console Mk1: Fix pitch bend buttons &lt;a href="https://github.com/mixxxdj/mixxx/pull/14447"&gt;#14447&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;M-Vave SMC-Mixer: Add controller mapping
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14411"&gt;#14411&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14448"&gt;#14448&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14457"&gt;#14457&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14458"&gt;#14458&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;M-Vave SMK-25 II: Piano keyboard mapping
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14412"&gt;#14412&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14484"&gt;#14484&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Numark Mixtrack Platinum: Fix VU Meters &lt;a href="https://github.com/mixxxdj/mixxx/pull/14575"&gt;#14575&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Numark NS6II: New mapping &lt;a href="https://github.com/mixxxdj/mixxx/pull/11075"&gt;#11075&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Numark Platinum FX: New mapping &lt;a href="https://github.com/mixxxdj/mixxx/pull/12872"&gt;#12872&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pioneer-DDJ-SB3: Fixes slip mode and adds missing knob controls &lt;a href="https://github.com/mixxxdj/mixxx/pull/11307"&gt;#11307&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reloop Digital Jockey 2 IE: New mapping
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/4614"&gt;#4614&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14328"&gt;#14328&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S4mk3: Set 4 decks, avoid CO warnings for decks 3/4, eg. VU meter
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14249"&gt;#14249&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S4mk3: Smooth xfader curve for Const Power mode
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14305"&gt;#14305&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14329"&gt;#14329&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14103"&gt;#14103&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S4mk3: stop wheel led blinking when track is over/stopped
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14028"&gt;#14028&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13995"&gt;#13995&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S3: Use pitch absolute mode as described in the manual &lt;a href="https://github.com/mixxxdj/mixxx/pull/14123"&gt;#14123&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stanton SCS.1m/d; Keith McMillen QuNeo; EKS Otus: use &lt;code&gt;playposition&lt;/code&gt; instead of non-existent &lt;code&gt;visual_playposition&lt;/code&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14609"&gt;#14609&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14603"&gt;#14603&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Controller Backend&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Controllers: Avoid timer warning on button release &lt;a href="https://github.com/mixxxdj/mixxx/pull/14323"&gt;#14323&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller preferences: Fix notify of pending changes when closing preferences &lt;a href="https://github.com/mixxxdj/mixxx/pull/14234"&gt;#14234&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14220"&gt;#14220&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller preferences: Fix broken overwrite dialog ('Save as..' not working) &lt;a href="https://github.com/mixxxdj/mixxx/pull/14263"&gt;#14263&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller preferences: Don't break support link texts &lt;a href="https://github.com/mixxxdj/mixxx/pull/14079"&gt;#14079&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller preferences: Fix wrong mapping change confirmation request caused by MidiController::makeInputHandler()
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14281"&gt;#14281&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14280"&gt;#14280&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14292"&gt;#14292&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller mapping info: Fix cropped description text
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14332"&gt;#14332&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14117"&gt;#14117&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI controller learning: Make control box search usable &lt;a href="https://github.com/mixxxdj/mixxx/pull/14260"&gt;#14260&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI controller learning: Don't reload mapping after learn &lt;a href="https://github.com/mixxxdj/mixxx/pull/14253"&gt;#14253&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI controller learning: Correct skin control for mic/aux section &lt;a href="https://github.com/mixxxdj/mixxx/pull/14221"&gt;#14221&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI controller learning: Add more cue controls for samplers
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14419"&gt;#14419&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI controller learning: Continue after the maximum learning time is over &lt;a href="https://github.com/mixxxdj/mixxx/pull/14429"&gt;#14429&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow &lt;code&gt;midino&lt;/code&gt; 0 in `MidiController::makeInputHandler()
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14266"&gt;#14266&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14265"&gt;#14265&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix: provide &lt;code&gt;incomingData&lt;/code&gt; to MIDI sysex mappings
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14368"&gt;#14368&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13133"&gt;#13133&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix log spam when using Midi for light mapping
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14326"&gt;#14326&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14327"&gt;#14327&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14333"&gt;#14333&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14338"&gt;#14338&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14371"&gt;#14371&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix for &lt;code&gt;TypeError&lt;/code&gt; in &lt;code&gt;midi-components-0.0.js&lt;/code&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14203"&gt;#14203&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14197"&gt;#14197&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix crash due to concurrent access in MidiController &lt;a href="https://github.com/mixxxdj/mixxx/pull/14159"&gt;#14159&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Skins&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Deere/LateNight (64 samplers): Bring back library in regular view
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14101"&gt;#14101&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14097"&gt;#14097&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14700"&gt;#14700&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix crash when hiding waveforms in Deere
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14170"&gt;#14170&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Waveform Overview: Abort play pos dragging if cursor is released outside the valid area
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13741"&gt;#13741&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13732"&gt;#13732&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Waveform Overview: Also render analysis progress when triggered by track menu or analysis feature &lt;a href="https://github.com/mixxxdj/mixxx/pull/14150"&gt;#14150&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Don't show 'menubar hide' dialog when switching skins &lt;a href="https://github.com/mixxxdj/mixxx/pull/14254"&gt;#14254&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Key Wheel: Move to View menu and make it a floating tool window
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14256"&gt;#14256&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14239"&gt;#14239&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Center effect parameter names &lt;a href="https://github.com/mixxxdj/mixxx/pull/14598"&gt;#14598&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track menu: highlight row when hovering checkbox
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14636"&gt;#14636&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14680"&gt;#14680&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Library&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add Ctrl+Shift+C to copy the content of the selected cell(s) (The Mxxx 2.4 behaviour of Ctrl+C).
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14114"&gt;#14114&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14065"&gt;#14065&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix MusicBrainz lookup on Windows and macOS &lt;a href="https://github.com/mixxxdj/mixxx/pull/14216"&gt;#14216&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library scanner: Update cached 'missing' flag when file is redicovered
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14250"&gt;#14250&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hidden Tracks: Allow 'load to' via track context manu &lt;a href="https://github.com/mixxxdj/mixxx/pull/14077"&gt;#14077&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update to libdjinterop 0.24.3 - support for Engine 4.1/4.2
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14172"&gt;#14172&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14289"&gt;#14289&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix writing metadata via symlink &lt;a href="https://github.com/mixxxdj/mixxx/pull/13711"&gt;#13711&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library menu: change "Engine DJ Prime" to "Engine DJ"
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14248"&gt;#14248&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14682"&gt;#14682&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix file extension handling during playlist export &lt;a href="https://github.com/mixxxdj/mixxx/pull/14381"&gt;#14381&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix manual key metadata editing in track properties dialog
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14022"&gt;#14022&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14400"&gt;#14400&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14295"&gt;#14295&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14294"&gt;#14294&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;History: Don't allow joining with locked previous playlist
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14401"&gt;#14401&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14399"&gt;#14399&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track info dialog: fixed cover label (max) size &lt;a href="https://github.com/mixxxdj/mixxx/pull/14418"&gt;#14418&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track Menu: Reset &lt;code&gt;eject&lt;/code&gt; after moving track file to trash &lt;a href="https://github.com/mixxxdj/mixxx/pull/14402"&gt;#14402&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix AutoDJ "Remove Crate" action
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14426"&gt;#14426&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14425"&gt;#14425&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix scrolling issue with coverart columns visible
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13719"&gt;#13719&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14631"&gt;#14631&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Developer Tools: multi-word search, no Tab navigation in controls table &lt;a href="https://github.com/mixxxdj/mixxx/pull/14474"&gt;#14474&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Analyze feature: respect New / All selection when searching
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14660"&gt;#14660&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14659"&gt;#14659&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stop populating Computer library feature when Mixxx should close &lt;a href="https://github.com/mixxxdj/mixxx/pull/14573"&gt;#14573&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tracks: apply played/missing text color also to selected tracks &lt;a href="https://github.com/mixxxdj/mixxx/pull/13583"&gt;#13583&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tracks: &lt;code&gt;show_track_menu&lt;/code&gt; at index position &lt;a href="https://github.com/mixxxdj/mixxx/pull/14385"&gt;#14385&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search related menu: improve checkbox click UX &lt;a href="https://github.com/mixxxdj/mixxx/pull/14637"&gt;#14637&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avoid false missing tracks due to db inconsistency
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14615"&gt;#14615&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14513"&gt;#14513&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix automatic trimming of search bar text
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14497"&gt;#14497&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14486"&gt;#14486&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avoid crash after removing Quick Link
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14556"&gt;#14556&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/8270"&gt;#8270&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other Fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enable R3 time-stretching with Rubberband 4.0.0 API version numbers &lt;a href="https://github.com/mixxxdj/mixxx/pull/14100"&gt;#14100&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Preferences Effects: add Hide/Unhide (move) buttons to Effects tab &lt;a href="https://github.com/mixxxdj/mixxx/pull/13329"&gt;#13329&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Preferences Effects: left/right key in effect lists trigger hide/unhide &lt;a href="https://github.com/mixxxdj/mixxx/pull/14205"&gt;#14205&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix beat sync in Flanger effect &lt;a href="https://github.com/mixxxdj/mixxx/pull/14351"&gt;#14351&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Apply talkover ducking after main effects to allow using a compressor effect
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13844"&gt;#13844&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12451"&gt;#12451&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix sporadic deadlocks when closing Mixxx or changing sound devices
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14208"&gt;#14208&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14055"&gt;#14055&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PositionScratchController: Fix loop wrap-around case &lt;a href="https://github.com/mixxxdj/mixxx/pull/14379"&gt;#14379&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow seeking to a hotcue during waveform scratching
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14357"&gt;#14357&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13981"&gt;#13981&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reset saved loop when toggling off after switching cue type
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14661"&gt;#14661&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14657"&gt;#14657&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix leaks from fid_design()
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14567"&gt;#14567&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/9470"&gt;#9470&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Allow to build with git "showSignature = true"
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14115"&gt;#14115&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12997"&gt;#12997&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support building with Qt 6.8/6.9
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14080"&gt;#14080&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/14071"&gt;#14071&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14200"&gt;#14200&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14204"&gt;#14204&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14440"&gt;#14440&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14518"&gt;#14518&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Welcome Ubuntu Plucky Puffin; Good bye Mantic Minotaur
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14148"&gt;#14148&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14158"&gt;#14158&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add more translations to Linux desktop file
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14153"&gt;#14153&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14169"&gt;#14169&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debian: recommend qt6-translations-l10n &lt;a href="https://github.com/mixxxdj/mixxx/pull/14147"&gt;#14147&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update FindFFTW3.cmake to not find version 2
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13937"&gt;#13937&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13931"&gt;#13931&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow building without tests-tools via new CMake options BUILD_TESTING and BUILD_BENCH
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/14269"&gt;#14269&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix and improve "missing env" error message &lt;a href="https://github.com/mixxxdj/mixxx/pull/14321"&gt;#14321&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Qt 6.8: Ensure Mixxx uses "windowsvista" Qt style on Windows &lt;a href="https://github.com/mixxxdj/mixxx/pull/14228"&gt;#14228&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Raise macOS target version to 11 (Qt 6.5 requirement). &lt;a href="https://github.com/mixxxdj/mixxx/pull/14440"&gt;#14440&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fail early when building on WSL &lt;a href="https://github.com/mixxxdj/mixxx/pull/14481"&gt;#14481&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remove useless udev rule &lt;a href="https://github.com/mixxxdj/mixxx/pull/14630"&gt;#14630&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Handle new " / " from taglib 2.0
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12854"&gt;#12854&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12790"&gt;#12790&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.5.1"></category><category term="release announcement"></category></entry><entry><title>Demand for cooperation in an AI-Research Project</title><link href="//mixxx.acolombier.dev/news/2025-04-01-Mixxx_cooperation_AIResearch" rel="alternate"></link><published>2025-04-01T01:12:32+02:00</published><updated>2025-04-01T01:12:32+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2025-04-01:/news/2025-04-01-Mixxx_cooperation_AIResearch</id><summary type="html">&lt;h4&gt;Mixxx has been asked to cooperate in an AI-Research Project 'Observe &amp;amp; Serve the Audience'.&lt;/h4&gt;
&lt;p&gt;Mixxx has been contacted by a joint research project between a university and a major AI company with the question if Mixxx wants to cooperate by asking DJs to help them. On benevolent behalf of all …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Mixxx has been asked to cooperate in an AI-Research Project 'Observe &amp;amp; Serve the Audience'.&lt;/h4&gt;
&lt;p&gt;Mixxx has been contacted by a joint research project between a university and a major AI company with the question if Mixxx wants to cooperate by asking DJs to help them. On benevolent behalf of all our users, Mixxx agreed.
The research project wants to improve the detection of human sentiments, more particularly individuals located in a crowd.
As most of the project is still under embargo, we can only give a small description:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are looking for ~25 DJs that want to participate in the research project by installing the research gear on their gigs.&lt;/li&gt;
&lt;li&gt;The DJs would receive a computer with two heat-detecting cameras, one regular camera and a HQ microphone.&lt;/li&gt;
&lt;li&gt;The cameras need to be pointed at the public.&lt;/li&gt;
&lt;li&gt;Observing the audience, DJs would get some on-screen demands to play cheerful / sad / uptempo or slow music, the cameras will observe emotions.&lt;/li&gt;
&lt;li&gt;At some point, the system can even demand to play a complete other genre than the public wants (to detect disappointment and happiness).&lt;/li&gt;
&lt;li&gt;DJs will have to install the research gear at least five times.&lt;/li&gt;
&lt;li&gt;DJs will be rewarded for their cooperation. How is not communicated to us.&lt;/li&gt;
&lt;li&gt;The Public needs to be warned that their emotions can be recorded for research.&lt;/li&gt;
&lt;li&gt;Audience members agree to have their likeness and appearance recorded and analyzed for the purpose of generating updated models.&lt;/li&gt;
&lt;li&gt;Audience members agree to be replicated and replaced as deemed necessary by the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the research works out well, Mixxx will have the possibility to integrate the results in a new feature, with which Mixxx could predict the best records to play at the moment.&lt;/p&gt;
&lt;h4&gt;Appeal&lt;/h4&gt;
&lt;p&gt;We insisted on keeping the coordinates of our users/DJs private during the selection, so if you want to cooperate with this research, please send us a message on our Zulip chat. We will create a dedicated topic under #General.
The researchers will contact you through our Zulip as well. The research program is looking for ~25 DJs, preferably of different countries (max 2 per country).&lt;/p&gt;</content><category term="news"></category><category term="AI"></category><category term="cooperation research project."></category></entry><entry><title>Google Summer of Code 2025, Get Googled, Get Mixxx-ed, Get Involved</title><link href="//mixxx.acolombier.dev/news/2025-03-05-mixxx-accepted-for-gsoc-2025" rel="alternate"></link><published>2025-03-05T12:30:00+01:00</published><updated>2025-03-05T12:30:00+01:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2025-03-05:/news/2025-03-05-mixxx-accepted-for-gsoc-2025</id><summary type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2025/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2025&lt;/a&gt;, a global program focused on bringing new contributors into open source software development. This is a great opportunity for us to attract new contributors, as they will receive a stipend sponsored by Google.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last year Antoine created the &lt;a href="https://mixxx.org/news/2024-08-26-stem-mixing/"&gt;STEM mixing support&lt;/a&gt; and Daniel gave us the &lt;a href="https://mixxx.org/news/2024-08-24-gsoc-project-report-daniel-fernandes/"&gt;Harmonic Mixing Enhancements&lt;/a&gt; as projects of GSoc 2024.This year Mixxx is accepted again as a &lt;a href="https://summerofcode.withgoogle.com/programs/2025/organizations/mixxx"&gt;mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2025&lt;/a&gt;, a global program focused on bringing new contributors into open source software development. Again this is a great opportunity for us to attract new contributors, as they will receive a stipend sponsored by Google.&lt;/p&gt;
&lt;h2&gt;How Does GSoC Work?&lt;/h2&gt;
&lt;p&gt;Google Summer of Code is a program that enables students to work on open-source projects over the summer, typically lasting between 3 to 12 weeks. Participants are matched with mentoring organizations like Mixxx, where they collaborate on various projects under the guidance of experienced mentors. For more information, check out the &lt;a href="https://google.github.io/gsocguides/student/"&gt;Google Summer of Code Contributor Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contributors will gain hands-on experience by working on an open-source project used by DJs worldwide. This will enhance their skills in software development, collaboration, and project management, which are highly valuable in the professional live. They are supported by experienced mentors and a community of developers and DJs who will help to get the right things done and are ready to clear out any obstacles when they arise.&lt;/p&gt;
&lt;h2&gt;How to Get Involved?&lt;/h2&gt;
&lt;p&gt;You will find the &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSOC-2025-Ideas"&gt;GSoC 2025 Project Ideas for Mixxx&lt;/a&gt; in our wiki, but your own ideas are also more than welcome. Taking a look at our &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsocadvice"&gt;GSoC advice page&lt;/a&gt; is recommended if you're planning to apply. The best way to get started is to participate in the Mixxx community, so have a look at our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and consider making a small code contribution to show that you're able to familiarize yourself with our codebase.&lt;/p&gt;
&lt;p&gt;You could also help us, even if you are not a GSoC candidate yourself. Simply print out a &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;flyer&lt;/a&gt; and post it on the bulletin board of your local university.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;&lt;img alt="gsoc-flyer-thumbnail" src="////mixxx.acolombier.dev/images/news/gsoc-flyer-thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in past projects, take a look at the blog posts of &lt;a href="https://mixxx.org/news/2024-08-26-stem-mixing/"&gt;Antoine Colombier&lt;/a&gt;, &lt;a href="https://mixxx.org/news/2024-08-24-gsoc-project-report-daniel-fernandes/"&gt;Daniel Fernandes&lt;/a&gt;, &lt;a href="https://mixxx.org/news/2022-09-08-gsoc-final-blog-david-chocholaty"&gt;David Chocholatý&lt;/a&gt; and &lt;a href="https://mixxx.org/news/2022-09-26-gsoc-final-blog-fatih-emre-yildiz"&gt;Fatih Emre YILDIZ&lt;/a&gt;. Their work has been successfully integrated into Mixxx.&lt;/p&gt;
&lt;p&gt;The official application period will start on &lt;strong&gt;March 24th&lt;/strong&gt; and ends on &lt;strong&gt;April 8th&lt;/strong&gt;, so have your applications ready in time. Potential GSoC contributors should start discussing their application ideas on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip&lt;/a&gt; now. Just start a new topic in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream. Please understand that we only engage with potential contributors via the respective channels in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream on Zulip or via the official GSoC application process.&lt;/p&gt;
&lt;p&gt;Join us in improving Mixxx and contributing to &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;free&lt;/a&gt; DJing worldwide!&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2025"></category></entry><entry><title>Mixxx 2.5 Released</title><link href="//mixxx.acolombier.dev/news/2024-12-24-mixxx-2_5-released" rel="alternate"></link><published>2024-12-24T15:25:19+01:00</published><updated>2024-12-24T15:25:19+01:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2024-12-24:/news/2024-12-24-mixxx-2_5-released</id><summary type="html">&lt;h4&gt;All I want for DJ-ing is ...&lt;/h4&gt;
&lt;p&gt;Home alone? Scrooged? The sound of music? Die hard?
Change plans: this year you will be having something better to do than watching old Christmas movies.&lt;/p&gt;
&lt;p&gt;Mixxx is now your secret "Santa comin' to town", our elves had "good hearts with the burning desire …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;All I want for DJ-ing is ...&lt;/h4&gt;
&lt;p&gt;Home alone? Scrooged? The sound of music? Die hard?
Change plans: this year you will be having something better to do than watching old Christmas movies.&lt;/p&gt;
&lt;p&gt;Mixxx is now your secret "Santa comin' to town", our elves had "good hearts with the burning desire to work hard",
to get you "Rockin' around the Christmas tree at the party hop" with "something mighty sweet to see".
"For the present, look high, not low": Mixxx's "presents 'neath the tree"&lt;/p&gt;
&lt;h4&gt;So this is the last goodbye ...&lt;/h4&gt;
&lt;p&gt;Important: OS-Support.
macOS versions earlier than 11 can have a "Last Christmas".
Windows versions earlier than version 10 build 1809 can be "Driving home for Christmas".
For Ubuntu versions earlier than 22.04 "Christmas Will Break Your Heart".&lt;/p&gt;
&lt;p&gt;By stepping over from Qt5 to Qt6 Mixxx is forced to increase the minimum system requirements to match those mandated by Qt.
That's why the support has been dropped for macOS earlier than 11, Windows versions earlier then version 10 build 1889 and Ubuntu earlier then 22.04.&lt;/p&gt;
&lt;h4&gt;Let's cheer for the elves&lt;/h4&gt;
&lt;p&gt;Ho Ho Ho, our sleigh is filled with many shiny presents:&lt;/p&gt;
&lt;p&gt;A red box filled with improvements to waveforms: 'SlipMode waveform' gives you visual aid while scratchin':&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="6VRz48Ler9o"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=6VRz48Ler9o"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The 'beats until next marker' helps you to never miss the break:&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="uYCXhKeJVFo"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=uYCXhKeJVFo"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The GL ES support makes the waveforms run smooth:&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="5VJBuUR_cn8"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=5VJBuUR_cn8"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;With a nice yellow bow around it, the new Skin &amp;amp; Interface features: the menubar can be hidden,
reworked toggles (fullscreen, cue popup, vinyl control), improved tooltips, improved controls and checks (AutoDJ,
effects), new command line interface options...&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="qMRcJvntboE"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=qMRcJvntboE"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Our engine became a V8 sleigh: undo function for BPM/beats, beatloop anchor, rate tap button...&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="7XKGodjiTNg"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=7XKGodjiTNg"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;"Rudolph, the Red-Nosed Reindeer" will sound much better with the compressor and glitch effects and the improved backend, which now supports also native Audio Unit (AU) effect plugins on macOS.&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="klOjBuZm0Qg"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=klOjBuZm0Qg"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Your "Jingles" and "Bells" can be sorted and found easier with the new library features: Cut, Copy and Paste in tracklists:&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="2qPXCCaGVGI"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=2qPXCCaGVGI"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Tracks can be moved with Alt+Up/Down/PgUp/PgDn:&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="MVvEP18a0xw"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=MVvEP18a0xw"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;With a summary containing the number of tracks and the total duration added to the name of crates, playlists and historylists makes it easy to find the right list:&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="0HtpOOIpjaM"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=0HtpOOIpjaM"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The searchengine received new BPM filters, an 'OR'-operator, new import possibilities, custom track colors for missing or played tracks...&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="qfnH7jWw0iY"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=qfnH7jWw0iY"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;"Santa Tell Me" what's new in preferences: some improved layout, the fetching of the soundcard's sample rate is fixed, a new setting for 'first hotcue', multiple options can be selected in the MIDI input editor.&lt;/p&gt;
&lt;p&gt;Many "Days Of Christmas" full of improved Controller Mappings for Denon MC7000, Numark Scratch, Pioneer DDJ-FLX4, Traktor Kontrol S4 MK3 and MIDI for light.&lt;/p&gt;
&lt;p&gt;A Controller Backend as a "Fairytale of New York" to map your controller: sysex, deck's track menu, support for bulk devices. We also dropped the lodash dependency.&lt;/p&gt;
&lt;p&gt;Qt5 will Be Home For Christmas because Mixxx is using &lt;a href="https://www.qt.io/product/qt6"&gt;Qt6&lt;/a&gt; now, a lot of work has been put in study, preparation, testing, upgrading procedures, adapting routines, dialogs, widgets, libraries. Upgrading to Qt6 wasn't just sitting "underneath the Mistletoe" but now Mixxx is in "Winter Wonderland". "Thank you Santa" Developers!&lt;/p&gt;
&lt;p&gt;So many rafactorings have been made, improvements of the code by progressive insight, because of new possibilities in C++ and Qt, because of studies in acoustics, user experiences...
The list is too long to write or make a selection here, it would be failing all contributors, you can find the complete list further in this announcement, full of "Christmas Lights".&lt;/p&gt;
&lt;h4&gt;So this is Christmas&lt;/h4&gt;
&lt;p&gt;"Baby, It's Cold Outside", so our present will be lots of fun exploring this new version. You'll need quiet some time to get used to all new features, discover the real possibilities,
to get some adapted workflow with new handles. Mixxx whishes you a "Wonderful Christmas Time".&lt;/p&gt;
&lt;p&gt;Mic drop, "Light the Candles All Around the World"&lt;/p&gt;
&lt;h4&gt;... and a happy 2.5&lt;/h4&gt;
&lt;p&gt;Start using your brand new toy, grab it from the &lt;a href="https://mixxx.org/download/"&gt;Download page&lt;/a&gt;.
Unwrap your gift, &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.5.0/CHANGELOG.md"&gt;the complete changelog 2.5.0&lt;/a&gt;
Here some sparkles:&lt;/p&gt;
&lt;h5&gt;Modernized Platform: Update to Qt6&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Mixxx is now using Qt6, offering improved performance and enhanced compatibility with modern systems.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11863"&gt;#11863&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11892"&gt;#11892&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Build system defaults to Qt6. Qt5 build support will be dropped with Mixxx 2.6
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11934"&gt;#11934&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Drop support for macOS versions earlier than 11&lt;/li&gt;
&lt;li&gt;Drop support for Windows versions earlier than Windows 10 build 1809&lt;/li&gt;
&lt;li&gt;Drop support for Ubuntu versions earlier than 22.04&lt;/li&gt;
&lt;li&gt;Require a C++20 compiler&lt;/li&gt;
&lt;li&gt;Support GCC 14
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13504"&gt;#13504&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13467"&gt;#13467&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DlgAbout: Add Qt version to the dialog &lt;a href="https://github.com/mixxxdj/mixxx/pull/11862"&gt;#11862&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Engine&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Beats: allow undoing the last BPM/beats change &lt;a href="https://github.com/mixxxdj/mixxx/pull/12954"&gt;#12954&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12774"&gt;#12774&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10138"&gt;#10138&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13339"&gt;#13339&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add beatloop anchor to set and adjust loop from either start or end
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12745"&gt;#12745&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13241"&gt;#13241&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add Rate Tap button &lt;a href="https://github.com/mixxxdj/mixxx/pull/12104"&gt;#12104&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Store/restore regular loop when toggling rolling loops
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12475"&gt;#12475&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/8947"&gt;#8947&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Looping/Beatjump: use seconds if track has no beats
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12961"&gt;#12961&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11124"&gt;#11124&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Skins / Interface&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Toggle the menubar with single Alt key press (auto hide)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11526"&gt;#11526&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13301"&gt;#13301&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow to edit track title and artist directly within the decks via a delayed double-click
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11755"&gt;#11755&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13930"&gt;#13930&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add type toggle to cue popup &lt;a href="https://github.com/mixxxdj/mixxx/pull/13215"&gt;#13215&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Effect Meta Knob: draws arc from default meta position
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12638"&gt;#12638&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12634"&gt;#12634&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Command line interface: Add option &lt;code&gt;--start-autodj&lt;/code&gt; to start Auto DJ immediately after Mixxx start.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13017"&gt;#13017&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10189"&gt;#10189&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Effects&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Add Compressor effect &lt;a href="https://github.com/mixxxdj/mixxx/pull/12523"&gt;#12523&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;add Glitch effect &lt;a href="https://github.com/mixxxdj/mixxx/pull/11329"&gt;#11329&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add backend for Audio Unit (AU) plugins on macOS
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12112"&gt;#12112&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13938"&gt;#13938&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Library&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Shortkeys Cut, Copy, Paste for track list management
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12020"&gt;#12020&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13361"&gt;#13361&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13364"&gt;#13364&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13958"&gt;#13958&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13100"&gt;#13100&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: move tracks with Alt + Up/Down/PageUp/PageDown/Home/End
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13092"&gt;#13092&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10826"&gt;#10826&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13098"&gt;#13098&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search: Add special BPM filters
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12072"&gt;#12072&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/8191"&gt;#8191&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search: Add "OR" search operator
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12061"&gt;#12061&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/8881"&gt;#8881&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search: Add 'type' filter
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13338"&gt;#13338&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search: Add 'id' filter &lt;a href="https://github.com/mixxxdj/mixxx/pull/13694"&gt;#13694&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search related Tracks menu: Allow to use multiple filters at once
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12213"&gt;#12213&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12211"&gt;#12211&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add multi-track property editor / batch tag editor
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12548"&gt;#12548&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/9023"&gt;#9023&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13299"&gt;#13299&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13609"&gt;#13609&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13597"&gt;#13597&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13631"&gt;#13631&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Computer feature: add sidebar action "Refresh directory tree" &lt;a href="https://github.com/mixxxdj/mixxx/pull/12908"&gt;#12908&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add 'Shuffle playlist' sidebar action
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12498"&gt;#12498&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/6988"&gt;#6988&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tracks: Custom color for missing tracks &lt;a href="https://github.com/mixxxdj/mixxx/pull/12895"&gt;#12895&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tracks: Custom text color for played tracks (qss)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12744"&gt;#12744&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/5911"&gt;#5911&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12912"&gt;#12912&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13538"&gt;#13538&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Preferences&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Decks: Add load point option 'First hotcue'
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12869"&gt;#12869&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12740"&gt;#12740&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI Input editor: allow selecting multiple Options &lt;a href="https://github.com/mixxxdj/mixxx/pull/12348"&gt;#12348&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Controller Mappings&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Denon MC7000: Add optional jog wheel acceleration to the controller mapping &lt;a href="https://github.com/mixxxdj/mixxx/pull/4684"&gt;#4684&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Denon MC7000: Unify parameter button logic and add customizable modes &lt;a href="https://github.com/mixxxdj/mixxx/pull/13589"&gt;#13589&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Denon MC7000: Add sampler options to mapping settings &lt;a href="https://github.com/mixxxdj/mixxx/pull/13950"&gt;#13950&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI for light: Implement new Active deck heuristic &lt;a href="https://github.com/mixxxdj/mixxx/pull/13513"&gt;#13513&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIDI for light: Add settings GUI &lt;a href="https://github.com/mixxxdj/mixxx/pull/13721"&gt;#13721&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Numark Scratch: Add controller settings  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13404"&gt;#13404&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pioneer DDJ-FLX4: Mapping improvements &lt;a href="https://github.com/mixxxdj/mixxx/pull/12842"&gt;#12842&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S4 MK3: Add setting definition for  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12995"&gt;#12995&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S4 MK3: Software mixer support and default pad layout customisation &lt;a href="https://github.com/mixxxdj/mixxx/pull/13059"&gt;#13059&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S4 Mk3: Rework jogwheel speed compute and motorized platter &lt;a href="https://github.com/mixxxdj/mixxx/pull/13393"&gt;#13393&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S4 Mk3: Revert QuickEffect preset offset &lt;a href="https://github.com/mixxxdj/mixxx/pull/13997"&gt;#13997&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol S4 Mk3: Correct wheel timestamp wrap-around &lt;a href="https://github.com/mixxxdj/mixxx/pull/14016"&gt;#14016&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Waveforms&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Visualize slip mode position by splitting waveform (RGB GLSL only)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13002"&gt;#13002&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13256"&gt;#13256&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10063"&gt;#10063&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Show beats and time until next marker in the waveform
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12994"&gt;#12994&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13311"&gt;#13311&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13953"&gt;#13953&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13314"&gt;#13314&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow changing the waveform overview type without reloading the skin
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13273"&gt;#13273&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Overview: Update immediately, when the normalize option or global gain changed
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13634"&gt;#13634&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Quoted Christmas songs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All I want for Christmas (Mariah Carey)&lt;/li&gt;
&lt;li&gt;Baby, It's Cold Outside (Ella Fitzgerald &amp;amp; Louis Armstrong)&lt;/li&gt;
&lt;li&gt;Cheer for the Elves (Gwen Stefani)&lt;/li&gt;
&lt;li&gt;Christmas Lights (Coldplay)&lt;/li&gt;
&lt;li&gt;Christmas Present (Andy Williams)&lt;/li&gt;
&lt;li&gt;Christmas Will Break Your Heart (LCD Soundsystem)&lt;/li&gt;
&lt;li&gt;Driving home for Christmas (Chris Rea)&lt;/li&gt;
&lt;li&gt;Fairytale of New York (The Pogues &amp;amp; Kirsty MacColl)&lt;/li&gt;
&lt;li&gt;Feliz Navidad (José Feliciano)&lt;/li&gt;
&lt;li&gt;Happy New Year (Abba)&lt;/li&gt;
&lt;li&gt;Have yourself a merry little Christmas (Frank Sinatra)&lt;/li&gt;
&lt;li&gt;I'll be home on Christmas day (Blue Blot)&lt;/li&gt;
&lt;li&gt;I'll Be Home For Christmas (Bing Crosby)&lt;/li&gt;
&lt;li&gt;Jingle Bells (version Diana Krall / version Johnny Cash )&lt;/li&gt;
&lt;li&gt;Last Christmas (Wham)&lt;/li&gt;
&lt;li&gt;Let it snow! Let it snow! Let it snow! (Dean Martin)&lt;/li&gt;
&lt;li&gt;Light the Candles All Around the World (traditional)&lt;/li&gt;
&lt;li&gt;Player’s Ball (Christmas Radio Mix, Outkast)&lt;/li&gt;
&lt;li&gt;Presents for Christmas (Solomon Burke)&lt;/li&gt;
&lt;li&gt;Rockin' Around the Christmas Tree (Brenda Lee)&lt;/li&gt;
&lt;li&gt;Rudolph, the Red-Nosed Reindeer (The Ray Conniff Singers)&lt;/li&gt;
&lt;li&gt;Santa Clause is Coming to Town (version Bruce Springsteen)&lt;/li&gt;
&lt;li&gt;Santa Tell Me’ (Ariana Grande)&lt;/li&gt;
&lt;li&gt;Sleigh Ride (The Ronettes)&lt;/li&gt;
&lt;li&gt;So this is Christmas (John Lennon)&lt;/li&gt;
&lt;li&gt;Thank You Santa (Phineas and Ferb)&lt;/li&gt;
&lt;li&gt;The Twelve Days of Christmas (traditional)&lt;/li&gt;
&lt;li&gt;Underneath the Mistletoe (Kelly Clarkson)&lt;/li&gt;
&lt;li&gt;Winter Wonderland (Bing Crosby)&lt;/li&gt;
&lt;li&gt;Wonderful Christmas Time (Paul McCartney)&lt;/li&gt;
&lt;li&gt;8 Days Of Christmas (Destiny's Child)&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.5"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.4.2 Release Announcement</title><link href="//mixxx.acolombier.dev/news/2024-11-27-mixxx-2-4-2-released" rel="alternate"></link><published>2024-11-27T07:56:41+01:00</published><updated>2024-11-27T07:56:41+01:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2024-11-27:/news/2024-11-27-mixxx-2-4-2-released</id><summary type="html">&lt;h4&gt;Winter and Summer are coming&lt;/h4&gt;
&lt;p&gt;Contrasts.
As the leaves fall and the first snowflakes start drifting down in the North, while the southern skies start warming up
with summer sun, we are thrilled to finally release Mixxx 2.4.2! "Finally" because a bit later than planned, perfection
can take …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Winter and Summer are coming&lt;/h4&gt;
&lt;p&gt;Contrasts.
As the leaves fall and the first snowflakes start drifting down in the North, while the southern skies start warming up
with summer sun, we are thrilled to finally release Mixxx 2.4.2! "Finally" because a bit later than planned, perfection
can take some time. So we are proud to present you this release, a major bugfix-release for the 2.4 series before
stepping over to a new number.
Don't be scared, development won't hibernate.&lt;/p&gt;
&lt;h4&gt;Testing and translating&lt;/h4&gt;
&lt;p&gt;A special thank you to everyone who takes the time to test alpha and beta versions, to who report issues and proposals and to those
who propose features and improvements. Your feedback is invaluable.
A lot of new users and contributors have joined our community the past months, we'd like to welcome them all, spin it up,
your energy and fresh ideas have already left a mark.
Everybody can contribute to Mixxx. Did you find an error on the website, an incomplete subject in the manual, an error in translation?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mixxx.org/get-involved/"&gt;Contribute&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Treasure hunt&lt;/h4&gt;
&lt;p&gt;When you dive into the code to add a feature or when you are looking for a function when you want to customize a mapping,
you can discover small little snippets, real pearls, the intensive work of someone to make a function smoother, to let an algorithm
work some milliseconds faster, to offer a conversion of a value to another without having to write it all over again.
For all these little snippets, for all these forgotten pearls: thank you to all who ever contributed.&lt;/p&gt;
&lt;h4&gt;What's in the 2.4.2-bag?&lt;/h4&gt;
&lt;p&gt;All new and shiny: &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.4/CHANGELOG.md"&gt;the complete changelog 2.4.2&lt;/a&gt;
This new stable release can be downloaded from the &lt;a href="https://mixxx.org/download/"&gt;Download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Problems that were solved:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handle not supported files when dragging to waveforms and spinnies
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13208"&gt;#13208&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13271"&gt;#13271&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13275"&gt;#13275&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix Sqlite 3.45 builds by using only single quotes for SQL strings
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13247"&gt;#13247&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13257"&gt;#13257&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LateNight: Use default colors for sampler overviews (like main decks)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13274"&gt;#13274&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library: Allow to drop files to decks with unsupported or no file extensions
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13209"&gt;#13209&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13204"&gt;#13204&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update build environment with libdjinterop 0.21.0
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13288"&gt;#13288&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Move to GitHub workflow runner macos-12
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13296"&gt;#13296&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13248"&gt;#13248&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recording: with empty config, save default split size immediately
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13304"&gt;#13304&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow to drop files with supported MIME type regardless off the file extensions
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13209"&gt;#13209&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13204"&gt;#13204&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add support for Ubuntu Oracular Oriole and remove Lunar Lobster
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13348"&gt;#13348&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recordbox: Fix string decoding issues
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13293"&gt;#13293&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13291"&gt;#13291&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mixer preferences: Don't update EQs/QuickEffects while applying
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13333"&gt;#13333&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hardware preferences: Fix UX when applying config with missing/busy devices
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13312"&gt;#13312&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix minor 64 bit CPU performance issue
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13355"&gt;#13355&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix clicks at loop-out when looping into lead-in
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13294"&gt;#13294&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix wrong pitch value on startup, caused by &lt;code&gt;components.Pot&lt;/code&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11814"&gt;#11814&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13463"&gt;#13463&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Engine Prime: Fix build-failure
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13397"&gt;#13397&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Engine Prime: Friendlier error message if export fails
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13524"&gt;#13524&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;macOs: Fix Keyboard shortcuts by not catching num key modifier
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13481"&gt;#13481&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13305"&gt;#13305&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Skins: fix time display to allow AM/PM
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13430"&gt;#13430&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13421"&gt;#13421&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix detection last sound if track does not end with silence.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13545"&gt;#13545&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13449"&gt;#13449&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remove false positive critical warning related to library columns
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13165"&gt;#13165&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13164"&gt;#13164&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix reading metadata for files with wrong extensions
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13218"&gt;#13218&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13205"&gt;#13205&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;History: remove purged tracks, auto-remove empty playlists
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13579"&gt;#13579&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13578"&gt;#13578&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Synchronize AutoDJ next deck with top track in queue
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12909"&gt;#12909&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/8956"&gt;#8956&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: Update play duration and bold state in sidebar when dragging tracks into the playlist table
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13591"&gt;#13591&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13590"&gt;#13590&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13575"&gt;#13575&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: Keep correct track selection (# position) when sorting
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13103"&gt;#13103&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track file export: Various fixes
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13610"&gt;#13610&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller engine: Unify/improve logging, expand error dialog's Details box
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13626"&gt;#13626&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix quantization in the effect engine (metronome effect)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13636"&gt;#13636&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13733"&gt;#13733&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Musicbrainz: Improved messages
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13672"&gt;#13672&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13673"&gt;#13673&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix ReplayGain detection in case of short tracks
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13680"&gt;#13680&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13676"&gt;#13676&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13702"&gt;#13702&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13703"&gt;#13703&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track menu: Avoid crash and UX issues with track nullptr
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13685"&gt;#13685&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Disable Properties shortcut in Computer feature views
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13698"&gt;#13698&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Overview waveform: Add tooltip info about left-click dragging
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13739"&gt;#13739&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make &lt;code&gt;hotcue_focus_color_next&lt;/code&gt;/&lt;code&gt;_prev&lt;/code&gt; COs &lt;code&gt;ControlPushButton&lt;/code&gt;s to allow direct mappings
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13764"&gt;#13764&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scaled svg cache to speed up drawing in hidpi mode
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13679"&gt;#13679&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update to libdjinterop 0.22.1 for Enigine Prime 4.0.1 support
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13790"&gt;#13790&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HID: Avoid repeated error messages from hid_write()/hid_read() in case of errors
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13692"&gt;#13692&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13660"&gt;#13660&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix unnecessary painting with covers in library
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13715"&gt;#13715&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Updated Controller Mappings: Denon MC7000, Korg Kaoss DJ, Novation Dicer, Novation Launchpad X, Numark PartyMix and Scratch, Pioneer DDJ-400 and DDJ-FLX4, Reloop Beatmix 2/4, Mixage MK1 and MK2, Sony SIXAXIS&lt;/p&gt;</content><category term="news"></category><category term="2.4"></category><category term="2.4.2"></category><category term="release announcement"></category></entry><entry><title>GSoC 2024: Adding STEM mixing support</title><link href="//mixxx.acolombier.dev/news/2024-08-26-STEM-Mixing" rel="alternate"></link><published>2024-08-26T12:00:00+02:00</published><updated>2024-08-26T12:00:00+02:00</updated><author><name>Antoine Colombier</name></author><id>tag:mixxx.acolombier.dev,2024-08-26:/news/2024-08-26-STEM-Mixing</id><summary type="html">&lt;p&gt;Disclaimer: &lt;em&gt;The blog post primarily serves as the documentation for the &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code&lt;/a&gt; 2024 project: "Multi channel mixing support (STEMS)".&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Explore New Creative Horizons with Mixxx's Latest Feature: Stem Mixing&lt;/h2&gt;
&lt;p&gt;We're excited to bring a powerful new feature to Mixxx: Stem Mixing. While the concept of stems — separate …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Disclaimer: &lt;em&gt;The blog post primarily serves as the documentation for the &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code&lt;/a&gt; 2024 project: "Multi channel mixing support (STEMS)".&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Explore New Creative Horizons with Mixxx's Latest Feature: Stem Mixing&lt;/h2&gt;
&lt;p&gt;We're excited to bring a powerful new feature to Mixxx: Stem Mixing. While the concept of stems — separate audio tracks for different elements of a song — has been a staple in digital audio workstations (DAWs) for years, it’s now making its way into live DJing. Typically, a song is divided into stems like drums, bassline, harmony, and vocals. In a DAW, these individual tracks allow producers to have granular control during the production process.&lt;/p&gt;
&lt;p&gt;Now, with Stem Mixing in Mixxx, you can take that same level of control into your DJ sets. Built on top of &lt;a href="https://www.stems-music.com"&gt;Native Instrument' Open Specification&lt;/a&gt; This feature enables you to isolate and manipulate these elements in real-time, allowing for live remixing, mashups, and creative edits on the fly. Whether you’re blending two tracks together or creating entirely new soundscapes, Stem Mixing offers a new dimension of flexibility and creativity for your performances.&lt;/p&gt;
&lt;p&gt;Mixxx now supports Native Instruments stem files, the current public specification for this format. Whether you're an amateur DJ eager to experiment with new techniques or a professional looking to enhance your performances, Stem Mixing in Mixxx offers powerful new capabilities to elevate your mixes.&lt;/p&gt;
&lt;p&gt;For example, it becomes piece of cake to mixxx the vocals of track with another instrumental version.
&lt;a href="////mixxx.acolombier.dev/images/news/stem_mixing.png"&gt;&lt;img alt="Stem Mixxing" src="////mixxx.acolombier.dev/images/news/stem_mixing.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is also possible to load a single stem or set of them into sampler.
&lt;a href="////mixxx.acolombier.dev/images/news/stem_sampler_loading.png"&gt;&lt;img alt="Stem Mixxing" src="////mixxx.acolombier.dev/images/news/stem_sampler_loading.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Coupled with saved loop, it makes it pretty trivial to isolate that catchy voice line or a great saxophone sample!
&lt;a href="////mixxx.acolombier.dev/images/news/stem_sample_with_saved_loop.png"&gt;&lt;img alt="Stem Mixxing" src="////mixxx.acolombier.dev/images/news/stem_sample_with_saved_loop.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please note that although we worked on improving the engine performance, stem mixing is still very resource-greedy, so do make sure your machine has enough CPU power to perform live stems mixing.&lt;/p&gt;
&lt;h2&gt;Empowering open standards&lt;/h2&gt;
&lt;p&gt;Over the past few years, many DJing solutions have introduced their own proprietary standards for stems. While most of these formats can be reverse-engineered with relative ease, we wanted to support and encourage the open-source approach introduced by Native Instruments. We've extended the scope of that standard in Mixxx, allowing for more flexibility in audio formats. Unlike the original specification, which only supported AAC and ALAC, Mixxx now supports a broader range of codecs. These include all the formats already compatible with Mixxx, such as AIFF, MP3, Opus, WAV, and WV. The only requirement is to use the same codec across all stems, keep the sample rate consistent parameter and use stereo.&lt;/p&gt;
&lt;p&gt;However, there are still some issues and limitations with the current standard, such as the lack of internationalization for labels. Rather than creating &lt;a href="https://imgs.xkcd.com/comics/standards_2x.png"&gt;yet another standard&lt;/a&gt;, we would prefer to contribute to improving the existing open specification from Native Instruments. If you are part of the NI team and are open to collaboration, we would love to help refine and expand this standard. Please feel free to &lt;a href="https://mixxx.org/contact/"&gt;get in touch&lt;/a&gt; with us.&lt;/p&gt;
&lt;h2&gt;Paving the Way for AI-Generated Stems&lt;/h2&gt;
&lt;p&gt;The introduction of Stem Mixing in Mixxx is just the beginning of a revolutionary journey in DJing technology. This feature not only enhances your current capabilities but also sets the stage for future innovations, particularly in the realm of AI-generated stems. The Mixxx community is actively exploring ways to integrate artificial intelligence to create stems on the fly, pushing the boundaries of what’s possible in live DJ performances.&lt;/p&gt;
&lt;p&gt;Competitors like Virtual DJ and Algoriddim’s djay Pro AI have already implemented AI-driven stem separation, allowing DJs to extract individual elements from any track in real-time. These advancements highlight the potential and ambition we have for Mixxx. Our goal is to provide DJs with the most cutting-edge tools to unlock new levels of creativity and performance.&lt;/p&gt;
&lt;p&gt;Imagine being able to instantly isolate vocals, drums, or other components from any track in your library, regardless of its original format. This capability would not only streamline the preparation process but also open up endless possibilities for live remixing and mashups. As the Mixxx community continues to develop and refine AI-driven features, we are committed to bringing these powerful tools to our users, ensuring that Mixxx remains at the forefront of DJing technology.&lt;/p&gt;
&lt;p&gt;However, there is still a long journey for it to be ready, especially because of the challenge with supporting hardware acceleration, needed to perform stem separation in real-time. This topic is currently very active and hotly debated in our community chat on Zulip. If you are interested in contributing to this effort or just want to stay updated on the latest developments, we invite you to &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109171-development/topic/stem.20separation/near/439520527"&gt;join the discussion&lt;/a&gt;. Your input and enthusiasm can help shape the future of Mixxx.&lt;/p&gt;
&lt;h2&gt;How to quickly get started&lt;/h2&gt;
&lt;p&gt;Currently, Mixxx does not yet support generating stems on the fly. However, there are ongoing discussions about enabling real-time stem creation or adding functionality to generate stem tracks directly within Mixxx.&lt;/p&gt;
&lt;p&gt;For now, you will need to create the NI stem files yourself. Fortunately, there are several ways to do this. If you're an audio producer, you can build the stems directly. Native Instruments provides &lt;a href="https://www.stems-music.com/stem-creator-tool/"&gt;a tool&lt;/a&gt; for generating Stem files from a pre-mastered track along with the four stems that compose it. Note that while Native Instruments allows exporting unmastered stems with embedded mastering (limiter and compressor) applied on the fly, Mixxx does not yet support this feature. For better results in Mixxx, it is recommended to export your stems pre-mastered and disable the embedded mastering option.&lt;/p&gt;
&lt;p&gt;If you would like to convert your existing library, there are various options available online, often built around Meta's &lt;a href="https://github.com/facebookresearch/demucs"&gt;demucs&lt;/a&gt; model. Unfortunately, many of these projects have licensing issues or significant limitations. While developing the stem feature, I created &lt;a href="https://github.com/acolombier/stemgen"&gt;a small command-line tool for generating stem tracks&lt;/a&gt;. It currently works on Linux and should also function with Linux containers on other platforms. I plan to continue maintaining it, with future goals of developing a more complete solution with a user interface and native support for Mac and Windows.&lt;/p&gt;
&lt;h3&gt;Generate stems from stereo tracks using stemgen and Docker&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; is a platform that allows you to run applications in isolation from your system. Note that &lt;a href="https://hub.docker.com/r/aclmb/stemgen"&gt;stemgen&lt;/a&gt; is available only as a Linux container. Linux containers are the default on Mac and Linux, but you will need to enable them on Windows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Step 1: Download the Container&lt;/h4&gt;
&lt;p&gt;First, you’ll need to download the stemgen container to your machine. Open your terminal and run the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;aclmb/stemgen:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Please note that this container includes PyTorch for running Meta's model, as well as NVIDIA's CUDA libraries for GPU support. As a result, the container is quite large, so ensure you have at least 4 GiB of free space on your machine.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Info:&lt;/strong&gt;&lt;br&gt;
If you are using a Linux machine with an NVIDIA graphics card, make sure to install the &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html"&gt;NVIDIA container toolkit&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Step 2: Run the Stem Generation Process&lt;/h4&gt;
&lt;p&gt;Once the container is downloaded, you can generate the stem file with the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/path/to/music/folder/:/path/to/music/folder/&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;--rm&lt;span class="w"&gt; &lt;/span&gt;aclmb/stemgen:latest&lt;span class="w"&gt; &lt;/span&gt;stemgen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/path/to/music/folder/My Music - Title.ext&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/path/to/music/folder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;If you are using the NVIDIA container toolkit, you can add the &lt;code&gt;--gpus all&lt;/code&gt; option after &lt;code&gt;--rm&lt;/code&gt; like this:&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/path/to/music/folder/:/path/to/music/folder/&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;--rm&lt;span class="w"&gt; &lt;/span&gt;--gpus&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;aclmb/stemgen:latest&lt;span class="w"&gt; &lt;/span&gt;stemgen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/path/to/music/folder/My Music - Title.ext&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/path/to/music/folder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;
You can customize the generated stem file using various command-line options. To see a list of available options, run the following command:
&lt;code&gt;sh
docker run -it --rm aclmb/stemgen:latest stemgen --help&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Step 3: Enjoy Your New Stem File&lt;/h4&gt;
&lt;p&gt;That’s it! You should now have a file named &lt;code&gt;/path/to/music/folder/My Music - Title.stem.mp4&lt;/code&gt; on your machine, ready to be played in Mixxx. If you encounter any issues, feel free to &lt;a href="https://github.com/acolombier/stemgen/discussions/categories/q-a"&gt;start a new discussion on the project&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What features are supported already?&lt;/h2&gt;
&lt;p&gt;Here is a table that summarize the new stem features. Note that you may find more details and also get involved with the work in the &lt;a href="https://github.com/mixxxdj/mixxx/issues/13116"&gt;Github epic&lt;/a&gt; dedicated to stem mixing.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File   support&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Releasing in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13044"&gt;PR #13044&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engine support&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Releasing in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13070"&gt;PR #13070&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multithreaded scaling&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Releasing in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13143"&gt;PR #13143&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analyser support&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Releasing in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13106"&gt;PR #13106&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gain control&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Releasing in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13086"&gt;PR #13086&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick FX&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Releasing in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13123"&gt;PR #13123&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loading as sampler&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Scheduled in 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13268"&gt;PR #13268&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Scheduled for 2.6&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13537"&gt;PR #13537&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deck splitting&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Planned&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;&lt;code&gt;Releasing&lt;/code&gt; implies that the PR is merged, &lt;code&gt;Scheduled&lt;/code&gt; implies work in progress, near completion and &lt;code&gt;Planned&lt;/code&gt; implies that this still left to do.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you wish to try the stem capabilities before the 2.6 beta gets released, you may &lt;a href="https://github.com/mixxxdj/mixxx?tab=readme-ov-file#building-mixxx"&gt;build Mixxx&lt;/a&gt; using the CMake option &lt;code&gt;FFMPEG&lt;/code&gt; and &lt;code&gt;STEM&lt;/code&gt;.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2024"></category><category term="stems"></category></entry><entry><title>GSoC 2024 Project Report - Harmonic Mixing Enhancements</title><link href="//mixxx.acolombier.dev/news/2024-08-24-gsoc-project-report-daniel-fernandes" rel="alternate"></link><published>2024-08-24T07:50:11+02:00</published><updated>2024-08-24T07:50:11+02:00</updated><author><name>Daniel Fernandes</name></author><id>tag:mixxx.acolombier.dev,2024-08-24:/news/2024-08-24-gsoc-project-report-daniel-fernandes</id><summary type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome to the GSoC report for the Harmonic Mixing Enhancements project, which aims to make finding compatible tracks a breeze with these new features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Color coding the Key column of the track list.&lt;/li&gt;
&lt;li&gt;New Track Similarity Column, which uses the Key and BPM to compute how well two tracks …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome to the GSoC report for the Harmonic Mixing Enhancements project, which aims to make finding compatible tracks a breeze with these new features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Color coding the Key column of the track list.&lt;/li&gt;
&lt;li&gt;New Track Similarity Column, which uses the Key and BPM to compute how well two tracks work together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In this post, I will share what this process has been like, the current state of things, and where you can try the merged features out.&lt;/p&gt;
&lt;h2&gt;Project Planning&lt;/h2&gt;
&lt;p&gt;We used Zulip to get feedback and find use cases from the community to better understand the needs of Mixxx' users, which was important for solving some open questions. We particularly wanted to find clarity for the Track Similarity Column. After some discussion I drafted a design doc which gave us a concrete plan to improve on and made it easier to decide the finishing details.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/proposals/pull/5"&gt;mixxxdj/proposals#5&lt;/a&gt; (draft)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Color Coding the Key Column&lt;/h2&gt;
&lt;p&gt;In this part, we color the key column such that, keys that work well together have similar colors. We also wanted to provide alternative color palettes, for accessibility and personal preference.&lt;/p&gt;
&lt;p&gt;We started with designing how the key colors will be shown. It was a bit tricky, because the tracks also have their own 'Color' property, so we had to make sure that these colors don't clash.&lt;/p&gt;
&lt;p&gt;Using feedback from the community, we iterated over a few designs, finding out what looked best but also met our needs. Here are some of these iterations:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Key Column Design Iterations" src="////mixxx.acolombier.dev/images/news/mixxx-track-key-colors-design-iterations.png"&gt;&lt;/p&gt;
&lt;p&gt;And here's how the final design looks in the app:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Key Column Design Iterations" src="////mixxx.acolombier.dev/images/news/mixxx-track-key-colors-screenshot.png"&gt;&lt;/p&gt;
&lt;p&gt;This design preserves the readability of the text, while being a subtle hint for compatibility without interfering much with the track color.&lt;/p&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;KeyDelegate&lt;/code&gt; was created to override the default behavior for the key column. It retrieves the Key Color to draw a recentangle to the left of the text.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;Mixxx Key Color Palette&lt;/em&gt; was also created, based on the colors from the Mixxx Keywheel.&lt;/p&gt;
&lt;p&gt;To allow users to turn the feature off, a checkbox was added to toggle the Key colors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13390"&gt;mixxx#13390&lt;/a&gt; (merged)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13475"&gt;mixxx#13475&lt;/a&gt; (bugfix, merged)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Key Color Palettes&lt;/h2&gt;
&lt;p&gt;We added several color palettes for the key column that you can choose from. This includes palettes from third party software, so you can keep using the colors you're used to, as well as accessible color palettes optimized for the three broad types of color blindness: &lt;a href="https://davidmathlogic.com/colorblind/#%232626D9-%237582D7-%23A7C2DD-%23B8E0E0-%23A7DDC2-%2375D782-%2326D926-%230DA522-%2302783D-%23006666-%23023D78-%230D22A5"&gt;Protanopia&lt;/a&gt; (red-blind), &lt;a href="https://davidmathlogic.com/colorblind/#%23D92626-%23D77582-%23DDA7C2-%23E0B8E0-%23C2A7DD-%238275D7-%232626D9-%23220DA5-%233D0278-%23660066-%2378023D-%23A50D22"&gt;Deuteranopia&lt;/a&gt; (green-blind), and &lt;a href="https://davidmathlogic.com/colorblind/#%2326D926-%2382D775-%23C2DDA7-%23E0E0B8-%23DDC2A7-%23D78275-%23D92626-%23A5220D-%23783D02-%23666600-%233D7802-%2322A50D"&gt;Tritanopia&lt;/a&gt; (blue-blind).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Accessible Key Colors" src="////mixxx.acolombier.dev/images/news/accessible_key_colors.png"&gt;&lt;/p&gt;
&lt;p&gt;We used 1/3 of hues for each palette, changing the hue vertically and changing the brightness and saturation horizontally when the colors are arranged in a circle. This ensures that every region on the circle has a distinct color, and that the change in colors is nearly uniform.&lt;/p&gt;
&lt;p&gt;You can find the code written to generate these palettes &lt;a href="https://svelte.dev/repl/b65bda7e6a53487880a08726bfb2da7e?version=4.2.18"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We have tested that these work well in simulators. However, we are not done until we get feedback / confirmation from the users who would benefit from these palettes. If that's you, please reach out!&lt;/p&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;The color palettes were added along with a dropdown to choose between them. Translation support was also added for all palette names.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13497"&gt;mixxx#13497&lt;/a&gt; (merged)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13571"&gt;mixxx#13571&lt;/a&gt; (bugfix, merged)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Where to try it out&lt;/h3&gt;
&lt;p&gt;The Key Colors feature is available in the &lt;a href="https://mixxx.org/download/#testing"&gt;Alpha versions&lt;/a&gt; of Mixxx. We would greatly appreciate any testing, and if you find bugs, please do let us know in the GitHub Issues.&lt;/p&gt;
&lt;h2&gt;Track Similarity [WIP]&lt;/h2&gt;
&lt;p&gt;You've probably noticed that in your collection there are pairs of tracks, with seemingly incompatible keys and different BPMs, that still work beautifully when played together, without the need for Keylock. This is possible, because when we sync the tempo of both tracks, the pitch of one track is shifted relative to the other in just the right way, that they both end up in similar keys.&lt;/p&gt;
&lt;p&gt;Wouldn't it be cool if Mixxx could show you exactly which tracks work nicely this way? As a first step to making that happen, we needed a method for computing such similarity between two tracks.&lt;/p&gt;
&lt;p&gt;I decided to prototype the algorithm in Python, and then port it into C++ for Mixxx. Fortunately, Mixxx stores all its data in an SQLite file, so I was able to export my library with the sqlite CLI tool and test the prototype on it.&lt;/p&gt;
&lt;p&gt;I iterated on the prototype by testing out the results in Mixxx, and making notes so I can understand what to tweak. The final version of the algorithm that I settled on, can be found as a &lt;a href="https://gist.github.com/danferns/bb1c3ca326df64320ddb1da1afe72e5f"&gt;Jupyter notebook&lt;/a&gt;. It takes in the Key and BPM of two tracks, and outputs a single similarity value for how well the tracks will work.&lt;/p&gt;
&lt;p&gt;With the algorithm settled on, it was time to port it to Mixxx.&lt;/p&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;The function &lt;code&gt;trackSimilarity()&lt;/code&gt; was implemented in &lt;code&gt;KeyUtils&lt;/code&gt;. Some helper functions were added, including &lt;code&gt;trackSyncPitchDifference()&lt;/code&gt; which returns the pitch difference between two tracks, when they're played at the same BPM.&lt;/p&gt;
&lt;p&gt;To test that it's working, the similarity of each track is computed against a "dummy" track in C Major at 100BPM and is displayed as a tooltip on the Key column. The output from the prototype and the C++ implementation in Mixxx are identical.&lt;/p&gt;
&lt;p&gt;This feature is behind a CMake flag as it is currently still in development.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/13563"&gt;mixxx#13563&lt;/a&gt; (WIP, not merged)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;After finishing the Similarity Algorithm, the output needs to be used in a new "Similarity Column". For this, a system for determining the target track to be used is needed. More details on the rules for choosing the target track are discussed in the proposal PR.&lt;/p&gt;
&lt;p&gt;For the Key Colors feature, we need to color the Key label on the decks, disable the Key Palette setting if Key Colors are disabled, and have the key column update when also clicking "Apply" on the preferences and not just after closing the preferences window.&lt;/p&gt;
&lt;h2&gt;My experience and the things I learnt&lt;/h2&gt;
&lt;p&gt;It was the Mixxx manual that introduced me to Harmonic Mixing a few years ago, and it got me excited about DJing. Since then, I started thinking about ideas like Track Similarity, but I never thought I'd get to actually work on making them real! I'm truly grateful for this experience.&lt;/p&gt;
&lt;p&gt;Mixxx was the first real world C++ project I worked on, and I learnt a lot of things that will help me for years to come. I learnt how to make project plans, and keep myself on track. It was specially helpful to break tasks down into smaller tasks, and make "mini-deadlines" for each of them. I learnt to brainstorm with others, and saw how ideas can evolve. On the technical side, I got lots of opportunities to use and understand Git more deeply, and also to navigate through and work on a large codebase.&lt;/p&gt;
&lt;h2&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Mixxx has an amazingly helpful and enthusiastic community behind it, and everyone I've worked with is so awesome!&lt;/p&gt;
&lt;p&gt;Firstly, I'd like to thank my mentor &lt;a href="////mixxx.acolombier.dev/news/author/daniel-schurmann"&gt;Daniel Schürmann&lt;/a&gt; for guiding me right from the very initial planning and brainstorming stages, and all the way to reviewing and getting the PRs merged. He made sure that I was never stuck on anything, and took great care that things go smoothly. He has been very helpful and supportive!&lt;/p&gt;
&lt;p&gt;I'd like to thank &lt;a href="https://github.com/ronso0"&gt;ronso0&lt;/a&gt; for his valuable design ideas and for guiding me with helpful feedback and testing during the code review. I'd also like to thank &lt;a href="////mixxx.acolombier.dev/news/author/nikolaus-einhauser"&gt;Swiftb0y&lt;/a&gt; for his valuable feedback and suggestions and for helping me make my code easier to read and efficient.&lt;/p&gt;
&lt;p&gt;A special thanks to everyone participating in the discussions and testing for these features, it has been a very essential part of the process and was also quite fun!&lt;/p&gt;
&lt;p&gt;Finally, I'd like to thank Google and the GSoC team for this one of a kind opportunity which introduced me to the awesome and collaborative world of open source.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2024"></category><category term="harmonic mixing"></category></entry><entry><title>Controller API declarations for JavaScript mapping developers</title><link href="//mixxx.acolombier.dev/news/2024-08-18-controller-api-declartions" rel="alternate"></link><published>2024-08-18T16:57:58+02:00</published><updated>2024-08-18T16:57:58+02:00</updated><author><name>Jörg Wartenberg</name></author><id>tag:mixxx.acolombier.dev,2024-08-18:/news/2024-08-18-controller-api-declartions</id><summary type="html">&lt;p&gt;If the support of a DJ controller requires more than the semantic 1:1 mapping of MIDI codes, Mixxx offers the possibility to use freely programmable Javascript code to implement such more complex functionalities.&lt;/p&gt;
&lt;p&gt;The Mixxx internal Application Programming Interface (API) for such controller scripts was previously only partially documented …&lt;/p&gt;</summary><content type="html">&lt;p&gt;If the support of a DJ controller requires more than the semantic 1:1 mapping of MIDI codes, Mixxx offers the possibility to use freely programmable Javascript code to implement such more complex functionalities.&lt;/p&gt;
&lt;p&gt;The Mixxx internal Application Programming Interface (API) for such controller scripts was previously only partially documented, in the &lt;a href="https://github.com/mixxxdj/mixxx/wiki/"&gt;Mixxx Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This has changed with Mixxx 2.4, now there are formal TypeScript declarations for each individual API class/method. These can be read by any code editor with &lt;a href="https://en.wikipedia.org/wiki/Language_Server_Protocol"&gt;Language Server Protocol (LSP)&lt;/a&gt; support, to be visualized to the developer while typing his controller scripting code.
&lt;img alt="Screenshot of documentation from controller API declaration visualized in editor" src="////mixxx.acolombier.dev/images/news/ControllerApiDocuInEditor.png"&gt;
Popular editors and IDEs with LSP support are Atom, Eclipse, Sublime Text, Visual Studio and Visual Studio Code.&lt;/p&gt;
&lt;p&gt;In addition to the inline visualization of the documentation, the syntax is also checked against the TypeScript declarations. Usage errors are reported directly when writing the code in the editor.
&lt;img alt="Screenshot of syntax check against controller API declaration visualized in editor" src="////mixxx.acolombier.dev/images/news/ControllerApiSyntaxCheckInEditor.png"&gt;&lt;/p&gt;
&lt;h2&gt;How to use it?&lt;/h2&gt;
&lt;p&gt;Development of mappings and controller scripts is usually done in the subdirectory &lt;code&gt;controllers&lt;/code&gt; of the &lt;a href="https://manual.mixxx.org/latest/chapters/appendix/settings_directory"&gt;Mixxx Settings Directory&lt;/a&gt;, while the common files (like &lt;code&gt;common-controller-scripts.js&lt;/code&gt;) which comes with Mixxx, are store in the subdirectory &lt;code&gt;controllers&lt;/code&gt; of Mixxx installation directory, or &lt;code&gt;./mixxx/res/controllers&lt;/code&gt; if you built Mixxx yourself. This is also the location, where the TypeScript files with the declarations of the Mixxx controller API are stored. The LSP language server need to know the location of all of them. To tell the LSP server general settings and the locations of these files, you need to create a file with the name &lt;code&gt;jsconfig.json&lt;/code&gt; placed next to your JavaScript controller script file, in the &lt;code&gt;controllers&lt;/code&gt; directory in your &lt;code&gt;Mixxx Settings Directory&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;jsconfig.json&lt;/code&gt; must have a content like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
&amp;quot;compilerOptions&amp;quot;: {
    &amp;quot;target&amp;quot;: &amp;quot;es6&amp;quot;,
    &amp;quot;checkJs&amp;quot;: true,
    &amp;quot;lib&amp;quot;: [ &amp;quot;ES2016&amp;quot; ]
},
&amp;quot;include&amp;quot;: [
    &amp;quot;./filename_of_your_controller_script.js&amp;quot;,
    &amp;quot;C:/Program Files/Mixxx/controllers/common-controller-scripts.js&amp;quot;,
    &amp;quot;C:/Program Files/Mixxx/controllers/common-hid-packet-parser.js&amp;quot;,
    &amp;quot;C:/Program Files/Mixxx/controllers/engine-api.d.ts&amp;quot;,
    &amp;quot;C:/Program Files/Mixxx/controllers/color-mapper-api.d.ts&amp;quot;,
    &amp;quot;C:/Program Files/Mixxx/controllers/console-api.d.ts&amp;quot;,
    &amp;quot;C:/Program Files/Mixxx/controllers/hid-controller-api.d.ts&amp;quot;
]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The content of the jsconfig.json:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;The compilerOptions&lt;/code&gt; section contains information about the JavaScript engine. Especially it overwrites the default included libraries, which only apply to JavaScript in webbrowsers&lt;/li&gt;
&lt;li&gt;The first file entry in the include section is the controller script under development, located next to the &lt;code&gt;jsconfig.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;common-controller-scripts.js&lt;/code&gt; is a JavaScript library used in most controller scripts, and is part of the Mixxx installation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;common-hid-packet-parser.js&lt;/code&gt; is also JavaScript library but only for controllers using the HID protocol&lt;/li&gt;
&lt;li&gt;&lt;code&gt;engine-api.d.ts&lt;/code&gt;, &lt;code&gt;color-mapper-api.d.ts&lt;/code&gt; and &lt;code&gt;console-api.d.ts&lt;/code&gt; are part of the Mixxx installation and contain TypeScript API declarations, which should be added for any controller script development&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hid-controller-api.d.ts&lt;/code&gt; is also such a declaration file, but specific to the communication protocol, because the APIs for HID and MIDI use the same symbols&lt;ul&gt;
&lt;li&gt;For HID controllers use &lt;code&gt;hid-controller-api.d.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For MIDI controllers use &lt;code&gt;midi-controller-api.d.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The .js files listed in the include section of the &lt;code&gt;jsconfig.json&lt;/code&gt; must exactly match the files in the &lt;code&gt;&amp;lt;scriptfiles&amp;gt;&lt;/code&gt; section of the controller mappings .xml file. But, note that the .xml only contains the file names, while the &lt;code&gt;jsconfig.json&lt;/code&gt; requires the full paths (relative to the position of the &lt;code&gt;jsconfig.json&lt;/code&gt; file).&lt;/p&gt;
&lt;p&gt;Once you have the &lt;code&gt;jsconfig.json&lt;/code&gt; file in place, you only need to open the folder containing the file in your editor, and all listed files will be found and read by the LSP server.&lt;/p&gt;</content><category term="news"></category><category term="2.4"></category><category term="controller"></category></entry><entry><title>Midsummer Mixxx</title><link href="//mixxx.acolombier.dev/news/2024-07-31-Midsummer-Mixxx" rel="alternate"></link><published>2024-07-31T17:18:23+02:00</published><updated>2024-07-31T17:18:23+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2024-07-31:/news/2024-07-31-Midsummer-Mixxx</id><summary type="html">&lt;h4&gt;Let the Mixxx shine&lt;/h4&gt;
&lt;p&gt;Summertime, partytime. In the middle of the festival season you are maybe playing a sunny vibes gig somewhere.
Or you are relaxing on the beach or at the pool with a cocktail in the hand checking the long list of music you had to discover.
Both …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;Let the Mixxx shine&lt;/h4&gt;
&lt;p&gt;Summertime, partytime. In the middle of the festival season you are maybe playing a sunny vibes gig somewhere.
Or you are relaxing on the beach or at the pool with a cocktail in the hand checking the long list of music you had to discover.
Both ways will give you inspiration and energy.
Who thinks Mixxx-devs are laying in the sun can't be more wrong, we're having a crowded github-festival ourselves.&lt;/p&gt;
&lt;h4&gt;Let the Mixxx in&lt;/h4&gt;
&lt;p&gt;A lot of new contributors found their way to our mapping parties on the discourse forum, our coding raves at github,
and the development zulip dancehall. You are all welcome and we'd like to thank you for all kind of input.
With your feedback on the 2.5 beta version the coding team is on track for gold, the bugs and errors teams are already defeated.&lt;/p&gt;
&lt;h4&gt;I'm going on a holiday and …&lt;/h4&gt;
&lt;p&gt;While you're enjoying a well deserved vacation the Mixxx team is preparing new features.
Not all new features are already for bundling in an official release but you can find everything about them in the partie venues.&lt;/p&gt;
&lt;p&gt;The new visual aids for key and bpm will be astonishing, it needed quite some adaptations but the project is in pole position for gold.&lt;/p&gt;
&lt;p&gt;The color integration will give you intuitive directions of matching tracks for harmonic mixing, also for people who suffer off color-blindness.
Soon you will be able to discover a 'heat column' in the library which will give you hints on tracks that are compatible with the current playing track,
based on the Key and BPM. And BPM coloring will be added to show tracks with a BPM close to the current tempo.
This will be our first step in Intelligent Assistance, it can inspire you to make surprising Mixxx-es with tracks that slipped your mind.
And these features will later be used later for some QOL features, like an improved suggestions algorithm, search ranking based on similarity,
and adding key color ticks on the rate sliders.
Fill the floors!&lt;/p&gt;
&lt;p&gt;Our marathon stem project is fantastic, a peek behind the curtain:
Playing with stems changes the whole idea of DJ-ing. If stems are new for you I would like to invite you to do some research.
In brief: stems are regular music files that are separated in 4 stem-tracks by the original producer or with the aid of AI.
Mostly those tracks are drums, bass, melody and vocals. Together with the original track are those 4 new tracks
combined in a new container, a &lt;em&gt;.Stem.MP4 or &lt;/em&gt;.Stem.M4A file, lossy or lossless (depends also on source).
While other DJ software will only support lossy stem files, we choose to support both.
These combined files can be 'remixed' on the fly, with other words: the volume of the tracks can be individual controlled,
a track can also be muted e.g. if you mute all tracks except the vocals you are actually playing an a capella.&lt;/p&gt;
&lt;p&gt;Without stems you need the beats to be synced, even if the intermediate beat would fit better to cover bass/drum sounds,
you need to work hard with the eq's to camouflage bass left-overs. With stems you can just completely hide the unwanted tracks.&lt;/p&gt;
&lt;p&gt;Remark: The quality of the stems is of course very important, a lot of stem creators are showing up everywhere.
Some need you to upload your original file, some can use your GPU, some use well trained AI models, others don't.
On Zulip I wrote a report about my quest for stems.&lt;/p&gt;
&lt;p&gt;In development Mixxx is already at the point that lossy and lossless stems can be played and controlled as stems, stem controls are already
working and can be experimental mapped in controller mappings.&lt;/p&gt;
&lt;p&gt;DJ-ing with stems is a gamechanger, it takes away limitations, gives your creativity a boost.
A hint: controlling stems with the mouse is rather difficult, some controllers are already stems-ready which means they incorporated
volume potentiometers and mute buttons for the different stem tracks. But don't throw away your valuable controller.
I have experimented successful creating a OSC midi controller to control stems (and samplers) from a tablet, when finished the files will be available.
Or you can start looking for an extra midi-controller that has enough potentiometers to control the volume and mute buttons of the stems (advice: 4 volume potentiometers, 4 mute buttons maybe 4 potentiometers for the effect on the stem-track and buttons to select the deck).&lt;/p&gt;
&lt;p&gt;If you're waiting for an official release with stem support, you'll have to be more patient.&lt;/p&gt;
&lt;h4&gt;Ceremonie protocollaire&lt;/h4&gt;
&lt;p&gt;A golden medal will be awarded to everyone who contributes to Mixxx.
Have a crazy Mixxxy summer.&lt;/p&gt;</content><category term="news"></category><category term="harmonic mixing"></category><category term="stems"></category></entry><entry><title>Mixxx 2.5 beta released</title><link href="//mixxx.acolombier.dev/news/2024-06-25-mixxx-2-5-beta-released" rel="alternate"></link><published>2024-06-25T07:17:16+02:00</published><updated>2024-06-25T07:17:16+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2024-06-25:/news/2024-06-25-mixxx-2-5-beta-released</id><summary type="html">&lt;p&gt;It's springtime, and baby birds recently hatched from their eggs are looking out of their nests deciding if they are ready to fly. So too it is with Mixxx, and version 2.5 is almost ready to greet the world.
A bit late for Easter but it is a magnificent …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's springtime, and baby birds recently hatched from their eggs are looking out of their nests deciding if they are ready to fly. So too it is with Mixxx, and version 2.5 is almost ready to greet the world.
A bit late for Easter but it is a magnificent giant gift filled with smaller gifts: Mixxx 2.5 beta!
You can find the details about the new version below.&lt;/p&gt;
&lt;h4&gt;Appeal&lt;/h4&gt;
&lt;p&gt;Before releasing 2.5 as the next stable release, we need it to be tested thoroughly, something we can't do all on our own.
After some time looking at the same release and searching for solutions, we might overlook minor bugs or problems.&lt;br&gt;
That's why we need &lt;strong&gt;YOU&lt;/strong&gt; to help us. The more people testing this beta and reporting eventual bugs to the &lt;a href="https://github.com/mixxxdj/mixxx/issues"&gt;bug tracker&lt;/a&gt;, the faster the beta can be promoted to stable.&lt;br&gt;
In case you're scared of messing up your neatly configured PC and losing your holy data is your Halloween nightmare, read the new wiki article &lt;a href="https://github.com/mixxxdj/mixxx/wiki/Safeguard-your-Digital-DJ-Data"&gt;Safeguard Your Mixxx Data&lt;/a&gt;.
It explains how to create a timestamped image, how to back up your data, and other tips and tricks.&lt;br&gt;
A beta release contains the solutions for problems that occurred and were notified by users who tested the alpha release.
The beta release is a general check before the new version can be released.&lt;br&gt;
The Mixxx database and settings of Mixxx 2.4.x stable are equal to those in Mixxx 2.5 beta, which means you can install the 2.5 over the 2.4 and vice versa without a problem.&lt;br&gt;
After you have successfully tested this 2.5 beta for yourself, you can continue using this version in your bedroom or even during live DJ-ing, and thus benefit from the new features.&lt;br&gt;
Please &lt;a href="https://mixxx.org/get-involved/"&gt;join Mixxx&lt;/a&gt;.
In Mixxx, we (can) trust.&lt;/p&gt;
&lt;h4&gt;Highlights&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;In version 2.5, Mixxx moves from depending on Qt 5 to &lt;a href="https://www.qt.io/product/qt6"&gt;Qt 6&lt;/a&gt;. This will improve hardware support and will enable Mixxx to be compatible with latest operating systems and hardware. However, this upgrade necessitates the discontinuation of support for older operating systems, specifically macOS versions earlier than 11, Windows 7 and 8.1 and Ubuntu 20.04 "Focal Fossa" and older.&lt;/li&gt;
&lt;li&gt;Controller mapping settings can now be adjusted directly in the preferences, compared to previously where they would have to be manually edited in script files.
  Controller settings are only available for JavaScript mappings. We will remain open for mapping contributions to 2.5 which add setting definitions. An example on how to do so can be found on &lt;a href="https://github.com/mixxxdj/mixxx/pull/12995"&gt;this pull request for the S4 Mk3&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are some more highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Display the number of beats and the time until next hot-cue or loop in the waveform &lt;a href="https://github.com/mixxxdj/mixxx/pull/12994"&gt;#12994&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visualization of Slip Mode when using the RGB GLSL waveform &lt;a href="https://github.com/mixxxdj/mixxx/pull/13002"&gt;#13002&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;An option to hide the main window menu bar &lt;a href="https://github.com/mixxxdj/mixxx/pull/11526"&gt;#11526&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A command line option &lt;code&gt;--start-autodj&lt;/code&gt; to start Auto DJ immediately after Mixxx starts. &lt;a href="https://github.com/mixxxdj/mixxx/pull/13017"&gt;#13017&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A beatloop anchor to set and adjust loop from either start or end &lt;a href="https://github.com/mixxxdj/mixxx/pull/12745"&gt;#12745&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;New effects: A Compressor &lt;a href="https://github.com/mixxxdj/mixxx/pull/12523"&gt;#12523&lt;/a&gt; and Glitch &lt;a href="https://github.com/mixxxdj/mixxx/pull/11329"&gt;#11329&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support for Audio Unit (AU) plugins on macOS &lt;a href="https://github.com/mixxxdj/mixxx/pull/12112"&gt;#12112&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Modify properties on multiple tracks at once &lt;a href="https://github.com/mixxxdj/mixxx/pull/12548"&gt;#12548&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;An experimental QML Skin that can be tested via the --qml command line option &lt;a href="https://github.com/mixxxdj/mixxx/pull/13152"&gt;#13152&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;What's else new / changed / corrected in 2.5 beta&lt;/h4&gt;
&lt;p&gt;The full list of changes can be found in the &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.5/CHANGELOG.md"&gt;ChangeLog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can download the new release from the &lt;a href="https://mixxx.org/download/"&gt;Download&lt;/a&gt; page.&lt;/p&gt;</content><category term="news"></category><category term="2.5"></category><category term="beta"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.4.1 released</title><link href="//mixxx.acolombier.dev/news/2024-05-09-mixxx-2-4-1-released" rel="alternate"></link><published>2024-05-09T15:07:38+02:00</published><updated>2024-05-09T15:07:38+02:00</updated><author><name>Evelynne Veys</name></author><id>tag:mixxx.acolombier.dev,2024-05-09:/news/2024-05-09-mixxx-2-4-1-released</id><summary type="html">&lt;h4&gt;Dear Mixxx-ers&lt;/h4&gt;
&lt;p&gt;The Mixxx developers started the year with good intentions and therefore imposed some deadlines on themselves.
That is why only three months after version 2.4, version 2.4.1 has been released.
This version delivers solutions for minor bugs and issues that came with 2.4.&lt;/p&gt;
&lt;h4&gt;What's …&lt;/h4&gt;</summary><content type="html">&lt;h4&gt;Dear Mixxx-ers&lt;/h4&gt;
&lt;p&gt;The Mixxx developers started the year with good intentions and therefore imposed some deadlines on themselves.
That is why only three months after version 2.4, version 2.4.1 has been released.
This version delivers solutions for minor bugs and issues that came with 2.4.&lt;/p&gt;
&lt;h4&gt;What's new / What's changed / What's corrected in 2.4.1&lt;/h4&gt;
&lt;p&gt;You can download the new release from the &lt;a href="https://mixxx.org/download/"&gt;Download&lt;/a&gt; page, the list of changes can be found in the &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.4.1/CHANGELOG.md"&gt;ChangeLog&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;Controller Mappings&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Behringer DDM4000 &amp;amp; BCR2000: Fix exception in JS code
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12969"&gt;#12969&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Denon DJ MC6000MK2: Fix mapping of filter knob/button
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13166"&gt;#13166&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Denon DJ MC7000: Fix redundant argument and migrate to &lt;code&gt;hotcue_x_status&lt;/code&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13113"&gt;#13113&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13121"&gt;#13121&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hercules Inpulse 200: Configure shift-browser knob to scroll the library (quick)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12932"&gt;#12932&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pioneer DDJ-FLX4: Add waveform zoom and other mapping improvements
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12896"&gt;#12896&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12842"&gt;#12842&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor Kontrol F1: Fixes for hid-parser and related script
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12876"&gt;#12876&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S2 Mk1: fix warnings
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13145"&gt;#13145&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S3: Fix mapping crash on macOS
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12840"&gt;#12840&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller I/O table: sort action column by display string
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13039"&gt;#13039&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Target Support&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Fix various minor build issues
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12853"&gt;#12853&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12847"&gt;#12847&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12822"&gt;#12822&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12892"&gt;#12892&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13079"&gt;#13079&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12989"&gt;#12989&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CMakeLists: Always prefer OpenGL framework on macOS
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13080"&gt;#13080&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Skins&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Deere: make sampler rows persist
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12928"&gt;#12928&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tango: Remove unneeded waveform Singleton
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12938"&gt;#12938&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Prevent possible crash in customs skins using parallel waveforms
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13043"&gt;#13043&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12580"&gt;#12580&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13136"&gt;#13136&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Slider tooltip: consider orientation for up/down shortcut tooltips + add support for WKnobComposed
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13088"&gt;#13088&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tooltips: update 'hotcue' with saved loop features
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12875"&gt;#12875&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Animate long press latching of sync button
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12990"&gt;#12990&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Polish fx chain controls
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12805"&gt;#12805&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Library&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Sidebar: show track count and duration of History playlists
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12811"&gt;#12811&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13020"&gt;#13020&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13019"&gt;#13019&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12788"&gt;#12788&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12880"&gt;#12880&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12882"&gt;#12882&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Computer feature: update removable devices on Linux
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12893"&gt;#12893&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12891"&gt;#12891&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: Prevent removing tracks from locked playlists
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12927"&gt;#12927&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;History feature: Fix removing deleted tracks after export
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13016"&gt;#13016&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13000"&gt;#13000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BPM display uses decimal separator of selected locale
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13067"&gt;#13067&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13051"&gt;#13051&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix relink directory when migrate between Linux/macOS and Windows
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12878"&gt;#12878&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow adding new directories while watched directories are missing
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12937"&gt;#12937&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10481"&gt;#10481&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Require a minimum movement before initiating the drag&amp;amp;drop of tracks
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13135"&gt;#13135&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12902"&gt;#12902&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iTunes/Serato/Traktor/Rhythmbox: Print error if library file could not be opened
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13012"&gt;#13012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlists: improve table update after deleting (purging) track files
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13127"&gt;#13127&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix Color column width issue
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12852"&gt;#12852&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tracks: select track row when clicking the preview button (only when starting preview)
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12791"&gt;#12791&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library track menu: show Hide action also in Playlist &amp;amp; Crates
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11901"&gt;#11901&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Miscellaneous&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Remove unnecessary unpolish operation of the style, before polish the new style
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12445"&gt;#12445&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Developer Tools: Initially sort controls by group name, ascending
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12884"&gt;#12884&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Waveforms: Fix scratching crossing loop boundaries
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13007"&gt;#13007&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Prohibit un-replace when deck is playing
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13023"&gt;#13023&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12906"&gt;#12906&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Track Properties dialog: Prevent wiping metadata when applying twice quickly
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12965"&gt;#12965&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12963"&gt;#12963&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AutoDJ: Fix button state after error message about playing deck 3/4
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12976"&gt;#12976&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/12975"&gt;#12975&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tagfetcher: Cache fetched covers
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12301"&gt;#12301&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11084"&gt;#11084&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avoid beats iterator being one off and DEBUG_ASSERT in Beats::iteratorFrom
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13150"&gt;#13150&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/13149"&gt;#13149&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Show hint if resource path in CMakeCache.txt does not exist
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/12929"&gt;#12929&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Always calculate the auto value for colorful console output.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13153"&gt;#13153&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix FLAC recording on macOS and Windows
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10880"&gt;#10880&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/13154"&gt;#13154&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;What happened?&lt;/h4&gt;
&lt;p&gt;I would like to share some memorable moments from the &lt;a href="https://mixxx.zulipchat.com/login/"&gt;Zulip&lt;/a&gt;-chat that are significant for the atmosphere and motivation of the Mixxx team:&lt;/p&gt;
&lt;h5&gt;Not giving up...&lt;/h5&gt;
&lt;p&gt;Ten days ago a Mixxx-er posted a problem that he struggled with for over a year.
He was unable to make a MIDI-connection between his Pioneer DJM-750MK2 Mixer with Mixxx and then activate the DVS (Digital Vinyl System) to work with Mixxx's Vinyl Control.
A Mixxx developer took the challenge and during 2 weeks you could see the messages flying over: log-files, screenshots, debugging-info, tooltests, capturing communication, a new pull request...
I think I've seen over 100 messages.
Trying things, fail, one step forward, two steps back ...
After two weeks the Mixxx developer managed to get it fixed.
All from a distance, not having the hardware available, putting a lot of time in it.
It was fantastic to be a witness of this magic.&lt;br&gt;
&lt;em&gt;Shout out to &lt;a href="https://mixxx.org/news/author/nikolaus-einhauser/"&gt;Niko/Swiftb0y&lt;/a&gt; !&lt;/em&gt;&lt;/p&gt;
&lt;h5&gt;Wow!&lt;/h5&gt;
&lt;p&gt;About three weeks ago a Mixxx developer proposed a new feature: showing the remaining beats till the next cue point in the waveform.
After some writing, testing, rewriting ... he created a feature I couldn't do without anymore.
If you make a hotcue at eg. a climax, or a loop, or an intro start in a song, you can see the remaining time (or number beats) until this point in the waveform.
Once a DJ has used this feature, they can't live without it.
This feature will be available in the next stable version 2.5&lt;br&gt;
&lt;em&gt;Shout out to &lt;a href="https://github.com/m0dB"&gt;m0dB&lt;/a&gt; !&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;What's going on in the Mixxx team?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;At the moment some people are trying to get Mixxx ready for stems. Stems are a new multi-channel format of audio files with which DJ's can 'remix' the song on-the-fly.&lt;/li&gt;
&lt;li&gt;A lot of people are improving controller-mappings to support more hardware with more features.&lt;/li&gt;
&lt;li&gt;Research is ongoing to make Mixxx able to share its database over a network.&lt;/li&gt;
&lt;li&gt;There's someone very keen on giving Mixxx the ability to support Spatial Audio.&lt;/li&gt;
&lt;li&gt;Translators are very busy adapting the manual and interface.&lt;/li&gt;
&lt;li&gt;Developers continue improving features, correcting minor bugs, and adapting code to support more machines and operating systems.&lt;/li&gt;
&lt;li&gt;On daily basis Mixxx-ers are given adequate support for small or big problems. Every question is taken seriously.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no cure for the spreading Mixxx-virus, everyone is invited to &lt;a href="https://mixxx.org/get-involved/"&gt;join the Mixxx team&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Appeal&lt;/h4&gt;
&lt;p&gt;I want to take the opportunity to make an appeal to all Mixxx-ers:
As we try to explain Mixxx's features in an optimal way and try to give the best possible support to every user, not everyone understands the English language as well as others.
Especially when the language contains technical terms it can get confusing for not native speakers.
If you understand the English manual well and you notice missing translations in your own language, please take the time to translate a/some part(s).
It needs a little effort in the beginning, but you can make a huge difference for other users.
We are available to get you started.
&lt;a href="https://mixxx.org/get-involved/#translators"&gt;Translators Wanted&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Who's writing this?&lt;/h4&gt;
&lt;p&gt;Music was my first love and it will be my last.
I like music, from Aaliyah to ZZ Top, from A Capella and Classical Aria's to Zouk, as long as it has a soul.
Since I was very young I discovered the power of music, it can strengthen or change emotions.
When I was thirteen (in the 80's) I started making my own radio show for myself, playing discs I found in my fathers (huge) collection.
A family party started my DJ-career, I felt the joy of sharing music, making people happy with it, make them want to dance.&lt;/p&gt;
&lt;p&gt;In the late 90's I got involved with BPM Studio, a superb but dated program. Dated because it was only compatible with MP3 and WAV.
Soundquality was and is very important for me, the term audiophile describes me very well, so I don't want to make a compromise in the audio quality.
Believe me, in the 90's, early 00's harddrive space wasn't that obvious and WAV-files took a lot of space.&lt;/p&gt;
&lt;p&gt;BPM development stopped about ten years ago and Traktor worked fine for me until a couple of years ago.
I could no longer trust and rely on Traktor for live gigs and I rediscovered Mixxx, with the versions 2.3.5/6 a big step was made.&lt;/p&gt;
&lt;p&gt;I found a controller-mapping file (+10 years old) for my Denon HC4500 that worked fine.
My first test: Auto-DJ (autopilot in Traktor)
The software must be able to play music for days without an error = test of hardware and software.
Mixxx passed the test gloriously.
So started playing around with Mixxx, I started importing my live-library, playlists, crates and history, found some minor bugs which I discussed on the forum and in bugreports.&lt;/p&gt;
&lt;p&gt;I got more and more interested.
I found some translation problems so I offered to make the Dutch translate of the Mixxx-application.
Meanwhile I started diving and swimming in the code to tweak some minor things, like exporting statusfiles, nowplaying, writing a new cpontroller-mappingsfile.
To give something back to the Mixxx-community I answered questions about little problems in the forum, I translated the manual and I offered to write this announcement that became a sort of testimony.&lt;/p&gt;
&lt;p&gt;And that all in about 12 weeks since I did the Auto DJ test.&lt;/p&gt;</content><category term="news"></category><category term="2.4"></category><category term="2.4.1"></category><category term="release announcement"></category></entry><entry><title>Mixxx Plans to Acquire AlphaTheta, Serato and Native Instruments</title><link href="//mixxx.acolombier.dev/news/2024-04-01-mixxx-plans-to-acquire-alphatheta-serato-ni" rel="alternate"></link><published>2024-04-01T11:32:09+02:00</published><updated>2024-04-01T11:32:09+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2024-04-01:/news/2024-04-01-mixxx-plans-to-acquire-alphatheta-serato-ni</id><summary type="html">&lt;p&gt;The Mixxx Board of Directors in pleased to announce plans to acquire the AlphaTheta Corporation (formerly known as Pioneer DJ), Serato Audio Research Ltd. and Native Instruments.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"This exciting &lt;a href="https://www.thepost.co.nz/a/business/350059653/us-firm-waves-prospect-legal-action-stop-100m-buy-out-nz-software-firm-serato"&gt;consolidation of brands&lt;/a&gt; will reshape the DJ software market as we know it"&lt;/em&gt;, Mixxx CEO Scrooge McScratch said after the decision …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Mixxx Board of Directors in pleased to announce plans to acquire the AlphaTheta Corporation (formerly known as Pioneer DJ), Serato Audio Research Ltd. and Native Instruments.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"This exciting &lt;a href="https://www.thepost.co.nz/a/business/350059653/us-firm-waves-prospect-legal-action-stop-100m-buy-out-nz-software-firm-serato"&gt;consolidation of brands&lt;/a&gt; will reshape the DJ software market as we know it"&lt;/em&gt;, Mixxx CEO Scrooge McScratch said after the decision was made.
Some trademarks such as Rekordbox®, Serato® and Traktor® will likely be dropped to archieve a lean portfolio and focus on the popular Mixxx brand.&lt;/p&gt;
&lt;p&gt;The move will lead to new synergies and enables Mixxx to benefit from the know-how of its former competitors.
&lt;em&gt;"Our new subsidiaries have a track record in profitable partnerships with hardware manufacturers."&lt;/em&gt;, McScratch commented.
&lt;em&gt;"We want to leverage their expertise on locking down DJ hardware artificially and ensure that the majority of DJ equipment in the market will only work with Mixxx. We are committed to our customers, so it's only fair to demand that they stay committed to us as well."&lt;/em&gt;&lt;/p&gt;</content><category term="news"></category><category term="takeover"></category><category term="super important business decision"></category></entry><entry><title>Google Summer of Code 2024, Get Involved</title><link href="//mixxx.acolombier.dev/news/2024-02-29-mixxx-accepted-for-gsoc-2024" rel="alternate"></link><published>2024-02-29T13:35:00+01:00</published><updated>2024-02-29T13:35:00+01:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2024-02-29:/news/2024-02-29-mixxx-accepted-for-gsoc-2024</id><summary type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2024/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2024&lt;/a&gt;, a global program focused on bringing new contributors into open source software development. This is a great opportunity for us to attract new contributors, as they will receive a stipend sponsored by Google. …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2024/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2024&lt;/a&gt;, a global program focused on bringing new contributors into open source software development. This is a great opportunity for us to attract new contributors, as they will receive a stipend sponsored by Google.&lt;/p&gt;
&lt;h4&gt;How Does GSoC Work?&lt;/h4&gt;
&lt;p&gt;Google Summer of Code is a program that enables students to work on open-source projects over the summer, typically lasting between 3 to 12 weeks. Participants are matched with mentoring organizations like Mixxx, where they collaborate on various projects under the guidance of experienced mentors. For more information, check out the &lt;a href="https://google.github.io/gsocguides/student/"&gt;Google Summer of Code Contributor Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contributors will gain hands-on experience by working on an open-source project used by DJs worldwide. This will enhance their skills in software development, collaboration, and project management, which are highly valuable in the professional live. They are supported by experienced mentors and a community of developers and DJs who will help to get the right things done and are ready to clear out any obstacles when they arise.&lt;/p&gt;
&lt;h4&gt;How to Get Involved?&lt;/h4&gt;
&lt;p&gt;You will find the &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSOC-2024-Ideas"&gt;GSoC 2024 Project Ideas for Mixxx&lt;/a&gt; in our wiki, but your own ideas are also more than welcome. Taking a look at our &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsocadvice"&gt;GSoC advice page&lt;/a&gt; is recommended if you're planning to apply. The best way to get started is to participate in the Mixxx community, so have a look at our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and consider making a small code contribution to show that you're able to familiarize yourself with our codebase.&lt;/p&gt;
&lt;p&gt;You could also help us, even if you are not a GSoC candidate yourself. Simply print out a &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;flyer&lt;/a&gt; and post it on the bulletin board of your local university.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;&lt;img alt="gsoc-flyer-thumbnail" src="////mixxx.acolombier.dev/images/news/gsoc-flyer-thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in past projects, take a look at the blog posts of &lt;a href="https://mixxx.org/news/2022-09-08-gsoc-final-blog-david-chocholaty"&gt;David Chocholatý&lt;/a&gt; and &lt;a href="https://mixxx.org/news/2022-09-26-gsoc-final-blog-fatih-emre-yildiz"&gt;Fatih Emre YILDIZ&lt;/a&gt;. Their work has been recently integrated into our new Mixxx version 2.4.&lt;/p&gt;
&lt;p&gt;The official application period will start on &lt;strong&gt;March 18th&lt;/strong&gt; and ends on &lt;strong&gt;April 2nd&lt;/strong&gt;, so have your applications ready in time. Potential GSoC contributors should start discussing their application ideas on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip&lt;/a&gt; now. Just start a new topic in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream. Please understand that we only engage with potential contributors via the respective channels in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream on Zulip or via the official GSoC application process.&lt;/p&gt;
&lt;p&gt;Join us in improving Mixxx and contributing to &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;free&lt;/a&gt; DJing worldwide!&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2024"></category></entry><entry><title>Improved Scrolling Waveforms in Mixxx 2.4.0</title><link href="//mixxx.acolombier.dev/news/2024-02-23-improved-waveforms" rel="alternate"></link><published>2024-02-23T21:18:57+01:00</published><updated>2024-02-23T21:18:57+01:00</updated><author><name>Maarten de Boer</name></author><id>tag:mixxx.acolombier.dev,2024-02-23:/news/2024-02-23-improved-waveforms</id><summary type="html">&lt;p&gt;One of the major improvements in Mixxx 2.4 is a revision of the scrolling waveform implementation, to achieve smoother animation at a higher frame rate (60 fps), with fewer frame-drops and a lower CPU load.&lt;/p&gt;
&lt;p&gt;The revision consists of an optimized rewrite, not only of the actual waveform drawing …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the major improvements in Mixxx 2.4 is a revision of the scrolling waveform implementation, to achieve smoother animation at a higher frame rate (60 fps), with fewer frame-drops and a lower CPU load.&lt;/p&gt;
&lt;p&gt;The revision consists of an optimized rewrite, not only of the actual waveform drawing, but also of the additional overlapping layers, i.e., the beat grid, the looping-, intro- and outro-ranges, the markers and the end-of-track indication. The improvements apply to all supported platforms and are particularly noticeable on macOS.&lt;/p&gt;
&lt;h2&gt;New waveform types&lt;/h2&gt;
&lt;p&gt;The new waveform types are marked "(GLSL)" in the Waveforms section in the settings dialog. When upgrading from older versions of Mixxx, the GLSL waveform type that best matches the old configuration will be selected automatically, as well as a frame rate of 60 fps.&lt;/p&gt;
&lt;p&gt;Visually, the new waveforms follow the design of the legacy waveforms, with some minor tweaks. Note for example the semi-transparently filled triangles pre- and post track. This also serves as a quick indication that you are using the new waveforms.&lt;/p&gt;
&lt;p&gt;&lt;img alt="RGB L/R (GLSL) Waveform type with pre-track trianges" src="////mixxx.acolombier.dev/images/news/glsl-rgb-lr-waveform.png"&gt;&lt;/p&gt;
&lt;p&gt;The newly implemented GLSL waveforms have been beta-tested for several months now and are considered stable and recommended. The old waveform types remain available, just in case, as an option in the Waveforms section of the settings dialog, marked with "(legacy)", and might be removed in future versions. If you experience issues with the new waveform types, you are encouraged to file a bug report!&lt;/p&gt;
&lt;h2&gt;Improved marker layout&lt;/h2&gt;
&lt;p&gt;Additionally, the markers layer has been improved: Multiple markers at the same beat grid location or sample position that would previously overlap and obscure each other, are now automatically stacked, placed at a respectively increased or decreased vertical offset. This applies to (hot) cue markers, intro- and outro-markers and loop-markers, and should be a big improvement for DJs that make heavy use of these markers.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Overlapping markers drawn at different vertical positions" src="////mixxx.acolombier.dev/images/news/overlapping-markers.png"&gt;&lt;/p&gt;
&lt;h2&gt;Some technical insights&lt;/h2&gt;
&lt;p&gt;Mixxx uses the Qt software framework for its user interface. Originally the layers that form the scrolling waveform display were rendered on the now deprecated &lt;a href="https://doc.qt.io/qt-5/qglwidget.html"&gt;&lt;code&gt;QGLWidget&lt;/code&gt;&lt;/a&gt; through a combination of &lt;a href="https://doc.qt.io/qt-5/qpainter.html"&gt;&lt;code&gt;QPainter&lt;/code&gt;&lt;/a&gt; and legacy OpenGL function calls. Profiling showed that this combination was a performance bottleneck, particularly on macOS.&lt;/p&gt;
&lt;p&gt;With the rewrite, all the layers mentioned above are now implemented using modern OpenGL code: All different waveform types, i.e, Simple, Filtered, HSV, RGB and RGB L/R, are now hardware accelerated using GLSL shaders. In addition to the waveforms, the Spinny widgets and VU-meters code has been revised with the same approach.&lt;/p&gt;
&lt;p&gt;The deprecated &lt;code&gt;QGLWidget&lt;/code&gt; has been replaced by a custom solution using a &lt;a href="https://doc.qt.io/qt-5/qopenglwindow.html"&gt;&lt;code&gt;QOpenGLWindow&lt;/code&gt;&lt;/a&gt; inside a &lt;a href="https://doc.qt.io/qt-5/qwidget.html"&gt;&lt;code&gt;QWidget&lt;/code&gt;&lt;/a&gt; using the &lt;a href="https://doc.qt.io/qt-5/qwidget.html#createWindowContainer"&gt;&lt;code&gt;createWindowContainer()&lt;/code&gt;&lt;/a&gt; call. Qt also offers &lt;code&gt;QOpenGLWidget&lt;/code&gt; to replace &lt;code&gt;QGLWidget&lt;/code&gt;, but the &lt;code&gt;QOpenGLWindow&lt;/code&gt; solution resulted in better performance and integrated better with the existing source code. This change will also facilitate the migration to Qt 6, planned for Mixxx 2.5.&lt;/p&gt;
&lt;h2&gt;New display synchronization mode&lt;/h2&gt;
&lt;p&gt;To avoid visual jitter, the rendered waveform has to be displayed at the right moment. This is achieved by synchronising the scrolling waveform animation with the display refresh rate. As a last minute addition, an alternative mode to do so has been introduced, using a so-called phase-locked-loop (PLL). This mechanism attempts to track the actual refresh rate and timing of the display automatically. On particular hardware, the default periodic timer-based approach can result in jitter and frame drops, and the PLL may give better results. The PLL has been made the default on macOS, where the improvement was most noticeable; on other platforms your mileage may vary. See &lt;a href="https://github.com/mixxxdj/mixxx/wiki/Changing-the-VSync-Mode-for-Scrolling-Waveforms"&gt;instructions to change the V-Sync mode&lt;/a&gt; if you want to try which mode works best for you. Note that this setting does not effect the audio control performance.&lt;/p&gt;</content><category term="news"></category><category term="2.4"></category><category term="improvements"></category></entry><entry><title>Official Flatpak now available on Flathub</title><link href="//mixxx.acolombier.dev/news/2024-02-21-official-flatpak-now-available-on-flathub" rel="alternate"></link><published>2024-02-21T00:00:00+01:00</published><updated>2024-02-21T00:00:00+01:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2024-02-21:/news/2024-02-21-official-flatpak-now-available-on-flathub</id><summary type="html">&lt;p&gt;An unofficial Mixxx Flatpak package for Linux users has been available on Flathub since Mixxx 2.2.1. Today, all major technical issues with the Flatpak have been resolved, so we have decided to officially support this Flatpak package with &lt;a href="/news/2024-02-16-mixxx-2-4-0-features"&gt;Mixxx 2.4.0&lt;/a&gt; and verify &lt;a href="https://flathub.org/apps/org.mixxx.Mixxx"&gt;Mixxx on Flathub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In …&lt;/p&gt;</summary><content type="html">&lt;p&gt;An unofficial Mixxx Flatpak package for Linux users has been available on Flathub since Mixxx 2.2.1. Today, all major technical issues with the Flatpak have been resolved, so we have decided to officially support this Flatpak package with &lt;a href="/news/2024-02-16-mixxx-2-4-0-features"&gt;Mixxx 2.4.0&lt;/a&gt; and verify &lt;a href="https://flathub.org/apps/org.mixxx.Mixxx"&gt;Mixxx on Flathub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the past, upstream Mixxx builds for Linux users have only been available on Ubuntu via a PPA. Now, this Flatpak brings upstream builds maintained by the Mixxx developers directly to users on all Linux distributions. The Ubuntu PPA is still maintained. If the PPA or a package from your distribution is up to date and works for you, there is no need to switch to the Flatpak.&lt;/p&gt;
&lt;h3&gt;Migrating to Flatpak&lt;/h3&gt;
&lt;p&gt;If you do want to switch from a distribution package or Mixxx built from source code to the Flatpak, a little setup is required. Flatpak stores Mixxx's database, settings, and custom controller mappings in a different location than the &lt;code&gt;~/.mixxx&lt;/code&gt; directory that Mixxx has always used before. Flatpak uses &lt;code&gt;~/.var/app/org.mixxx.Mixxx/.mixxx&lt;/code&gt; instead. To copy your database, settings, and controller mappings into the Flatpak sandbox, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixxx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mixxx&lt;/span&gt;
&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;mixxx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixxx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mixxx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If your library contains any directories outside of your XDG Music Directory (&lt;code&gt;~/Music&lt;/code&gt; unless you have reconfigured this), you will need to relink these directories to access the files inside of Flatpak's sandbox. Run Mixxx from the Flatpak and go to Options &amp;gt; Preferences &amp;gt; Library. Any directories that have a warning icon with &lt;code&gt;!&lt;/code&gt; in a yellow triangle need to be relinked. Select the directory in the preferences window and click the Relink button, then select the directory in the file picker dialog. Flatpak will automatically remap the directory under &lt;code&gt;/run/user&lt;/code&gt; so Mixxx can read and write your music files from inside the Flatpak sandbox. Press Ok in the preferences window, then in Mixxx's main window, go to Library &amp;gt; Rescan Library.&lt;/p&gt;
&lt;h3&gt;Technical requirements&lt;/h3&gt;
&lt;p&gt;Using the JACK sound API for audio input and output with the Flatpak requires running Pipewire with JACK support outside the Flatpak sandbox. Most distributions now install Pipewire configured as an audio server by default as a replacement for PulseAudio. However, Pipewire-JACK might not be installed by default and may need to be installed from your distribution package manager.&lt;/p&gt;
&lt;p&gt;If your distribution uses systemd, the Mixxx Flatpak requires a recent version of systemd to use HID controllers. A &lt;a href="https://github.com/systemd/systemd/pull/30611"&gt;bug fix&lt;/a&gt; for this has been backported to systemd stable versions from 252 and later. If your distribution, for example &lt;a href="https://packages.ubuntu.com/jammy-updates/systemd"&gt;Ubuntu 22.04&lt;/a&gt;, has an older version of systemd, HID controllers will not work with the Flatpak by default. You can work around this by copying &lt;a href="https://raw.githubusercontent.com/mixxxdj/mixxx/main/res/linux/mixxx-usb-uaccess.rules"&gt;this udev rule file&lt;/a&gt; to &lt;code&gt;/usr/lib/udev/rules.d/&lt;/code&gt; and rebooting.&lt;/p&gt;</content><category term="news"></category></entry><entry><title>Mixxx 2.4 Released</title><link href="//mixxx.acolombier.dev/news/2024-02-16-mixxx-2-4-0-features" rel="alternate"></link><published>2024-02-16T13:39:52+01:00</published><updated>2024-02-16T13:39:52+01:00</updated><author><name>Mixxx Team</name></author><id>tag:mixxx.acolombier.dev,2024-02-16:/news/2024-02-16-mixxx-2-4-0-features</id><summary type="html">&lt;p&gt;We are proud to announce Mixxx 2.4, a new major version of our free open source DJ software, &lt;a href="/download/"&gt;available right now&lt;/a&gt;. It's been two years since the last release due to the large number of great new features and important changes under the hood. See the &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.4/CHANGELOG.md"&gt;changelog&lt;/a&gt; for the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce Mixxx 2.4, a new major version of our free open source DJ software, &lt;a href="/download/"&gt;available right now&lt;/a&gt;. It's been two years since the last release due to the large number of great new features and important changes under the hood. See the &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.4/CHANGELOG.md"&gt;changelog&lt;/a&gt; for the full list of changes.&lt;/p&gt;
&lt;p&gt;The 2.4 release includes the following highlights:&lt;/p&gt;
&lt;h3&gt;EngineOS Export&lt;/h3&gt;
&lt;p&gt;Mixxx 2.4 adds support for exporting crates, playlists and the library to Engine DJ OS devices, including Denon and Numark standalone controllers.
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="Qle9Y1KdD2Y"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=Qle9Y1KdD2Y"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
This allows users to prepare their tracks on a laptop using Mixxx and export them to a USB stick for use on a standalone controller at their gig.&lt;/p&gt;
&lt;h3&gt;Saved Loops&lt;/h3&gt;
&lt;p&gt;Mixxx 2.4 adds support for Saved Loops, which can be assigned to any Hot Cue slot.
If you already have tracks from Serato DJ with Saved Loops, Mixxx 2.4 will import them automatically.&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="f8hI_uv9zHY"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=f8hI_uv9zHY"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Effect Chains&lt;/h3&gt;
&lt;p&gt;Mixxx 2.4 introduces Effect Chains, a set of effects which can be saved and reloaded with all their parameters and individual Meta Knob mappings.
Effect Chains can also be exported and imported, which allows you to share them with other Mixxx DJs.
Once you've created an Effect Chain, you can create a custom Super Knob mapping which turns the chain into a Quick-Effect, where you take creative control with a single knob.
Effect parameters can be reordered and or hidden.
In the effect units, Mixxx 2.4 also displays the value and unit of effect knob parameters while they are being adjusted.&lt;/p&gt;
&lt;h3&gt;Track Menu Enhancements&lt;/h3&gt;
&lt;p&gt;The track menu in Mixxx 2.4 is enhanced by several new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select loaded track in library.&lt;/li&gt;
&lt;li&gt;Analyze/re-analyze with variable/constant BPM on a per-track basis.&lt;/li&gt;
&lt;li&gt;Look up track metadata at Discogs, SoundCloud and LastFM.&lt;/li&gt;
&lt;li&gt;Remove track files from disk.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sync Lock Improvements&lt;/h3&gt;
&lt;p&gt;Mixxx 2.4 adds support for manually selecting the Sync Leader by clicking on the new button with the crown symbol next to the Sync button.
This mode is useful when tracks have variable BPM.
All decks with sync enabled will follow the changing BPM of the Sync Leader.
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="REiG8DBKr-M"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=REiG8DBKr-M"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Many Other Changes&lt;/h3&gt;
&lt;h4&gt;Soundstretcher / Key-Shift Algorithms&lt;/h4&gt;
&lt;p&gt;Mixxx 2.4 now supports three different key shift algorithms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Soundtouch (Basic audio quality - medium CPU usage)&lt;/li&gt;
&lt;li&gt;Rubberband R2 (Good audio quality - higher CPU usage)&lt;/li&gt;
&lt;li&gt;Rubberband R3 (High audio quality - very high CPU usage)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Waveform Rendering Reworked&lt;/h4&gt;
&lt;p&gt;The waveform display has been rewritten, solving some longstanding performance issues, especially on macOS.&lt;/p&gt;
&lt;h4&gt;Apple Silicon Support&lt;/h4&gt;
&lt;p&gt;Mixxx now supports macOS ARM systems ("Apple Silicon") such as M1 natively and provides installation packages for those architectures.
For macOS users, this increases the stability and performance of Mixxx on Apple silicon.&lt;/p&gt;
&lt;h4&gt;Controller Backend&lt;/h4&gt;
&lt;p&gt;Modernized Javascript ES7 based controller mapping system.
HID backend rework.&lt;/p&gt;
&lt;h3&gt;Mixxx 2.4 Factsheet&lt;/h3&gt;
&lt;h4&gt;Supported Platforms&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Windows 7 or later on 64bit processors&lt;/li&gt;
&lt;li&gt;macOS 10.12 or later on Intel processors&lt;/li&gt;
&lt;li&gt;macOS 11.0 or later on ARM processors (Apple Silicon)&lt;/li&gt;
&lt;li&gt;Ubuntu Linux 20.04 or later (other Linux distributions are supported by third parties)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Supported Controllers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Mappings for 129 MIDI controllers included&lt;/li&gt;
&lt;li&gt;Mappings for 16 HID controllers included&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href="https://manual.mixxx.org/2.4/hardware/manuals#controllers"&gt;full list&lt;/a&gt; of supported controllers in the Mixxx Manual.&lt;/p&gt;
&lt;h3&gt;Press Information&lt;/h3&gt;
&lt;p&gt;Mixxx 2.4 is available right now:
&lt;a href="/download/"&gt;https://mixxx.org/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The manual for Mixxx 2.4 can be found here:
&lt;a href="https://manual.mixxx.org/2.4"&gt;https://manual.mixxx.org/2.4&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Images For Media Use&lt;/h4&gt;
&lt;p&gt;Full-Resolution images of the Mixxx 2.4 screenshots above can be downloaded here:
&lt;a href="/screenshots"&gt;https://mixxx.org/screenshots&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Press Contact&lt;/h4&gt;
&lt;p&gt;Feel free to contact us via:
&lt;a href="mailto:press@mixxx.org"&gt;press@mixxx.org&lt;/a&gt;&lt;/p&gt;</content><category term="news"></category><category term="release announcement"></category><category term="2.4"></category></entry><entry><title>Mixxx 2.3.6 released</title><link href="//mixxx.acolombier.dev/news/2023-08-15-mixxx-2-3-6-released" rel="alternate"></link><published>2023-08-15T13:09:47+02:00</published><updated>2023-08-15T13:09:47+02:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2023-08-15:/news/2023-08-15-mixxx-2-3-6-released</id><summary type="html">&lt;p&gt;Welcome the Mixxx release version 2.3.6, the final maintenance release before releasing the upcoming 2.4.0 with exiting new features.&lt;/p&gt;
&lt;p&gt;This small bug fix release may appear insignificant, but it's a testament to the rock-solid quality we bring to every user to ensure a reliable mixing experience …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Welcome the Mixxx release version 2.3.6, the final maintenance release before releasing the upcoming 2.4.0 with exiting new features.&lt;/p&gt;
&lt;p&gt;This small bug fix release may appear insignificant, but it's a testament to the rock-solid quality we bring to every user to ensure a reliable mixing experience.&lt;/p&gt;
&lt;p&gt;This release improves, among other things, some details with looping, allows playing tracks exceeding 6 hours and fixes rare crashes in exceptional situations.&lt;/p&gt;
&lt;p&gt;You can download the new version from the &lt;a href="https://mixxx.org/download/"&gt;Download&lt;/a&gt; page. There, you will also find the 2.4&amp;nbsp;beta to test the new features that will be released soon.&lt;/p&gt;
&lt;p&gt;Here is the full changelog of Mixxx 2.3.6 for more details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed possible crash when closing Mixxx while browsing the file system
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11593"&gt;#11593&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11589"&gt;#11589&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No longer stop a track with an active loop at the very end
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11558"&gt;#11558&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11557"&gt;#11557&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed resyncing when moving an active loop
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11152"&gt;#11152&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11381"&gt;#11381&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow true gapless playback when repeating full tracks
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11532"&gt;#11532&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/9842"&gt;#9842&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11704"&gt;#11704&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rhythmbox: Fixed bulk track imports from playlists
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11661"&gt;#11661&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Console log spam reduced
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11690"&gt;#11690&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11691"&gt;#11691&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Numark DJ2GO2 Touch: Add missing loop_out mapping for the right deck
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11595"&gt;#11595&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11659"&gt;#11659&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Shade: Fixed VU-Meter and other minor issues
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11598"&gt;#11598&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed a rare crash when disabling quantize form a controller
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11744"&gt;#11744&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11709"&gt;#11709&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controller Preferences: Avoid scrollbars in I/O tabs if Info tab exceeds page height
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11756"&gt;#11756&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Broadcast: Improved error message in case of timeout
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11775"&gt;#11775&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Handle setting &lt;code&gt;loop_in&lt;/code&gt; and &lt;code&gt;loop_out&lt;/code&gt; to the same position
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11771"&gt;#11771&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10600"&gt;#10600&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix build issues with Protobuf v23.4 and with clang 32
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11751"&gt;#11751&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11765"&gt;#11765&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11762"&gt;#11762&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Disable GL VU-Meters on Windows by default. They can be re-enabled via the command line option &lt;code&gt;--enableVuMeterGL&lt;/code&gt;.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11787"&gt;#11787&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11785"&gt;#11785&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11789"&gt;#11789&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library preferences: Uncheck Serato metadata export when file metadata export is unchecked
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11782"&gt;#11782&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11226"&gt;#11226&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Denon MC6000MK2: Delete mapping for master gain
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11792"&gt;#11792&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve output in case of some failed file system operations
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11783"&gt;#11783&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix overlapping buffers when decoding M4A files using FFmpeg before 4.4
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11760"&gt;#11760&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11545"&gt;#11545&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Don't reject key values from file metadata with non-minor/-major scales.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11001"&gt;#11001&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10995"&gt;#10995&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow playing tracks with durations of more than 6 hours
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11511"&gt;#11511&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11504"&gt;#11504&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update latency compensation for Soundtouch version 2.1.1 to 2.3
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11154"&gt;#11154&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.6"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.4 beta release</title><link href="//mixxx.acolombier.dev/news/2023-05-31-mixxx-2-4-beta-released" rel="alternate"></link><published>2023-05-31T11:29:40+02:00</published><updated>2023-05-31T11:29:40+02:00</updated><author><name>Nikolaus Einhauser</name></author><id>tag:mixxx.acolombier.dev,2023-05-31:/news/2023-05-31-mixxx-2-4-beta-released</id><summary type="html">&lt;p&gt;It's been a while, but after almost exactly 3 years, we're proud to announce the
beta version of the next major release: Mixxx 2.4!&lt;br&gt;
Keep your eyes peeled for the stable version of 2.4 being released in August if
everything goes according to plan. In the meantime, we …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's been a while, but after almost exactly 3 years, we're proud to announce the
beta version of the next major release: Mixxx 2.4!&lt;br&gt;
Keep your eyes peeled for the stable version of 2.4 being released in August if
everything goes according to plan. In the meantime, we need help from &lt;strong&gt;YOU&lt;/strong&gt;!
In order to get 2.4 stable, we need lots of people testing this beta release,
the more, the better. Please &lt;a href="https://mixxx.org/download/#beta"&gt;download it&lt;/a&gt; and
report any bugs you find on &lt;a href="https://github.com/mixxxdj/mixxx/issues"&gt;our
bugtracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's a quick look at the most important changes and new features you can look
forward to in Mixxx 2.4:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for saving loops as hotcues ("Saved Loops").&lt;/li&gt;
&lt;li&gt;Save effect chains and then load them into effect units or the QuickEffect&lt;/li&gt;
&lt;li&gt;Native Apple Silicon support (better performance on M1/M2/etc. devices).&lt;/li&gt;
&lt;li&gt;Explicit Sync leader.&lt;/li&gt;
&lt;li&gt;New controller mapping scripting engine (ES2016 support).&lt;/li&gt;
&lt;li&gt;New "all-shaders" Scrolling waveforms resulting in much better GUI performance
  on all platforms (&lt;em&gt;especially MacOS&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;A bunch of polish for the Library.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Expect a more in depth blog posts for each of these features in the coming
weeks.&lt;/p&gt;
&lt;!-- TODO this link will change once we change the heading of the changelog entry --&gt;
&lt;p&gt;You can check out the &lt;a href="https://github.com/mixxxdj/mixxx/blob/main/CHANGELOG.md#240-unreleased"&gt;full changelog on
github&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="2.4"></category><category term="beta"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.3.5 released</title><link href="//mixxx.acolombier.dev/news/2023-05-11-mixxx-2-3-5-released" rel="alternate"></link><published>2023-05-11T00:00:55+02:00</published><updated>2023-05-11T00:00:55+02:00</updated><author><name>Nikolaus Einhauser</name></author><id>tag:mixxx.acolombier.dev,2023-05-11:/news/2023-05-11-mixxx-2-3-5-released</id><summary type="html">&lt;p&gt;Another bugfix release, this soon?&lt;/p&gt;
&lt;p&gt;Yes, unfortunately it turned out that &lt;a href="https://github.com/mixxxdj/mixxx/issues?q=is%3Aissue+is%3Aclosed+milestone%3A2.3.5+label%3Aregression"&gt;2.3.4 introduced a couple of serious
bugs&lt;/a&gt;
that required prompt action to fix in order to rectify this subpar release.&lt;/p&gt;
&lt;p&gt;The most serious issue we fixed was a regression that caused an empty waveform
overview after loading …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Another bugfix release, this soon?&lt;/p&gt;
&lt;p&gt;Yes, unfortunately it turned out that &lt;a href="https://github.com/mixxxdj/mixxx/issues?q=is%3Aissue+is%3Aclosed+milestone%3A2.3.5+label%3Aregression"&gt;2.3.4 introduced a couple of serious
bugs&lt;/a&gt;
that required prompt action to fix in order to rectify this subpar release.&lt;/p&gt;
&lt;p&gt;The most serious issue we fixed was a regression that caused an empty waveform
overview after loading a track. This issue has been fixed in version 2.3.5,
along with several other bug fixes and improvements.&lt;/p&gt;
&lt;p&gt;Other notable changes include requesting microphone and line-in access
on macOS, allowing explicit selection of buffers of 2048 and 4096
frames per period in the JACK API, making the Beat FX section of the Pioneer DDJ-400
more intuitive, and fixing a visual issue with the the VU peak indicators in the
Tango skin.&lt;/p&gt;
&lt;p&gt;Overall, version 2.3.5 aims to improve stability and performance while
addressing the issues introduced in the previous release. Users are encouraged
to update to this version as soon as possible to ensure the best possible
experience while using Mixxx.&lt;/p&gt;
&lt;p&gt;Here is the full change log if you're interested:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix empty waveform overview after loading a track (Mixxx 2.3.4 regression)
  Fixed by &lt;a href="https://github.com/mixxxdj/mixxx/pull/11333"&gt;#11333&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11359"&gt;#11359&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11344"&gt;#11344&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fullscreen: Fix a crash that occurs on Linux after enabling fullsceen and using menu
  shortcuts e.g. Alt-F.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11328"&gt;#11328&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11320"&gt;#11320&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fullscreen: Rebuild &amp;amp; reconnect menu only on desktops with global menu
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11350"&gt;#11350&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;macOS: Request Microphone and line-in access permission.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11367"&gt;#11367&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11365"&gt;#11365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JACK API: Allow to explicit select buffers of 2048 and 4096 frames/period. They are not
  supported by the automatic buffer setting of the used PortAudio library.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11366"&gt;#11366&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11341"&gt;#11341&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pioneer DDJ-400: Make Beat FX section more intuitive
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/10912"&gt;#10912&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playlist export: Adopt new extension after changing the playlist type
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11332"&gt;#11332&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11327"&gt;#11327&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LateNight: brighter fx parameter buttons
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11397"&gt;#11397&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix drift in analyzis data after exporting metadata to MP3 files with ID3v1.1 tags
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11168"&gt;#11168&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11159"&gt;#11159&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix broadcasting using Opus encoding
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11349"&gt;#11349&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/10666"&gt;#10666&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tango: Remove VU peak indicators from stacked layout. This fixes a visual regression in Mixxx 2.3.4.
  &lt;a href="https://github.com/mixxxdj/mixxx/pull/11430"&gt;#11430&lt;/a&gt;
  &lt;a href="https://github.com/mixxxdj/mixxx/issues/11362"&gt;#11362&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.5"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.3.4 Released</title><link href="//mixxx.acolombier.dev/news/2023-03-03-mixxx-2-3-4-released" rel="alternate"></link><published>2023-03-03T18:51:28+01:00</published><updated>2023-03-03T18:51:28+01:00</updated><author><name>Nikolaus Einhauser</name></author><id>tag:mixxx.acolombier.dev,2023-03-03:/news/2023-03-03-mixxx-2-3-4-released</id><summary type="html">&lt;p&gt;You know the drill, another 2.3 bugfix release. &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.4"&gt;Mixxx
2.3.4&lt;/a&gt; to be exact.&lt;/p&gt;
&lt;p&gt;Let's take a look at the changes:&lt;br&gt;
macOS received a bunch of love, especially in regards to possible UI performance
problems and translation issues. We also enabled support for macOS 13 (Ventura)
on Intel-CPUs …&lt;/p&gt;</summary><content type="html">&lt;p&gt;You know the drill, another 2.3 bugfix release. &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.4"&gt;Mixxx
2.3.4&lt;/a&gt; to be exact.&lt;/p&gt;
&lt;p&gt;Let's take a look at the changes:&lt;br&gt;
macOS received a bunch of love, especially in regards to possible UI performance
problems and translation issues. We also enabled support for macOS 13 (Ventura)
on Intel-CPUs, while there is still some work in progress to support Apple
silicon from Mixxx 2.4.0.&lt;br&gt;
In addition, our Tango and LateNight skins received a lot of minor tweaks and
visual fixes.&lt;br&gt;
Issues occurring during metadata import from 3rd party software were also fixed.
This includes issues when fetching data from MusicBrainz as well as importing
metadata from Rekordbox databases or music files containing Serato metadata.&lt;/p&gt;
&lt;p&gt;Since we include controller mappings in bugfix releases, we can also announce
that we gained support for the Traktor Kontrol S2 Mk1 and the Numark Party Mix.&lt;br&gt;
Some existing mappings also received some attention, especially Numark ones
because plenty of community members discovered that the Pitch/Rate-slider was
inverted in a couple mappings.&lt;/p&gt;
&lt;p&gt;That's about all for 2.3.4. If you're interested in the full changelog, you can
&lt;a href="https://github.com/mixxxdj/mixxx/blob/2.3.4/CHANGELOG.md"&gt;find it on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As usual, we recommend you update to the &lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;newest stable version by visiting our
download page&lt;/a&gt;&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.4"></category><category term="release announcement"></category></entry><entry><title>Mixxx accepted for GSoC 2023!</title><link href="//mixxx.acolombier.dev/news/2023-02-27-mixxx-accepted-for-gsoc-2023" rel="alternate"></link><published>2023-02-27T09:42:04+01:00</published><updated>2023-02-27T09:42:04+01:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2023-02-27:/news/2023-02-27-mixxx-accepted-for-gsoc-2023</id><summary type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2023/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2023&lt;/a&gt;, a global program focused on bringing new contributors into open source software development.&lt;/p&gt;
&lt;p&gt;This means that new or even established contributors of Mixxx have the opportunity to work on Mixxx full-time during the summer for 12 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2023/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2023&lt;/a&gt;, a global program focused on bringing new contributors into open source software development.&lt;/p&gt;
&lt;p&gt;This means that new or even established contributors of Mixxx have the opportunity to work on Mixxx full-time during the summer for 12+ weeks while receiving a stipend sponsored by Google. For more information, check out the &lt;a href="https://google.github.io/gsocguides/student/"&gt;Google Summer of Code Contributor Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You will find the &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSOC-2023-Ideas"&gt;GSoC 2023 Project Ideas for Mixxx&lt;/a&gt; in our wiki, but your own ideas are also more than welcome. Taking a look at our &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsocadvice"&gt;GSoC advice page&lt;/a&gt; is recommended if you're planning to apply. The best way to get started is to participate in the Mixxx community, so have a look at our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and consider making a small code contribution to show that you're able to familiarize yourself with our code base.&lt;/p&gt;
&lt;p&gt;You could also help us, even if you are no GSoC candidate yourself. Simply print out a &lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;flyer&lt;/a&gt; and post it on the bulletin board of your local university.
&lt;a href="https://github.com/mixxxdj/mixxx/wiki/GSoC-Flyers"&gt;&lt;img alt="gsoc-flyer-thumbnail" src="////mixxx.acolombier.dev/images/news/gsoc-flyer-thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in last years projects, take a look at the blog post of &lt;a href="https://mixxx.org/news/2022-09-08-gsoc-final-blog-david-chocholaty"&gt;David Chocholatý&lt;/a&gt; and &lt;a href="https://mixxx.org/news/2022-09-26-gsoc-final-blog-fatih-emre-yildiz"&gt;Fatih Emre YILDIZ&lt;/a&gt;. Their work will have a great benefit for our users in the upcoming Mixxx version 2.4. You can already test them in a development snapshot of &lt;a href="https://downloads.mixxx.org/snapshots/2.4"&gt;2.4-alpha&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The official application period will start &lt;strong&gt;March 20th&lt;/strong&gt; and ends on &lt;strong&gt;April 2th&lt;/strong&gt;, so have your applications ready in time. Potential GSoC contributors should start discussing their application ideas on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip&lt;/a&gt; now. Just start a new topic in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream. Please understand that we only engage with potential contributors via the respective channels in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc&lt;/a&gt; stream on Zulip or via the official GSoC application process.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2023"></category></entry><entry><title>GSoC 2022 Work Product - Track Suggestion Feature</title><link href="//mixxx.acolombier.dev/news/2022-09-26-gsoc-final-blog-fatih-emre-yildiz" rel="alternate"></link><published>2022-09-26T19:26:29+02:00</published><updated>2022-09-26T19:26:29+02:00</updated><author><name>Fatih Emre YILDIZ</name></author><id>tag:mixxx.acolombier.dev,2022-09-26:/news/2022-09-26-gsoc-final-blog-fatih-emre-yildiz</id><summary type="html">&lt;p&gt;Disclaimer: &lt;em&gt;The blog post primarily serves as the documentation for the &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code&lt;/a&gt; 2022 project: "Track Suggestion Feature". Thus, it contains a lot more detailed description, than the other Mixxx blog posts.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;After long hours of playing, when the floor is crowded the question shows up. "What …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Disclaimer: &lt;em&gt;The blog post primarily serves as the documentation for the &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code&lt;/a&gt; 2022 project: "Track Suggestion Feature". Thus, it contains a lot more detailed description, than the other Mixxx blog posts.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;After long hours of playing, when the floor is crowded the question shows up. "What to play next?". That is a big problem for almost every DJ. This project aims to give suggestions according to tracks playing on the decks. With this feature, Mixxx will have a helper for all the DJs.&lt;/p&gt;
&lt;p&gt;Hey everyone It's Emre! You've just read my project description. First, let me introduce myself before I dive into a detailed explanation of my project. I love to listen and play music. I have been always into DJing. That's why I wanted to take a part in Mixxx. I am a person who plays music while chilling-partying with my friends. They always find my music choices are the right fit. But they don't know how difficult to pick the right song, especially after a while of playing. So I thought &lt;em&gt;Track Suggestion Feature&lt;/em&gt; would be the best project to work on this summer.&lt;/p&gt;
&lt;h4&gt;Motivation&lt;/h4&gt;
&lt;p&gt;The track suggestion feature was on the wishlist a long time ago. This feature was mentioned firstly on the &lt;a href="https://github.com/mixxxdj/mixxx/issues/6106"&gt;Bug Tracker&lt;/a&gt; and on the &lt;a href="https://mixxx.discourse.group/t/individual-possible-followers-for-each-track-track-mind/11893"&gt;Forum&lt;/a&gt;. These discussions inspired me to do this project.&lt;/p&gt;
&lt;p&gt;Before we started to work on this project, My mentor and I decided to do it with side projects. We chose the side projects, so the implementation of the enormous features split into pieces. With that, we have a chance to test and review them in smaller environments. These side projects also helped me to get to know the code base, we can think of them just like preparation ground. Also, in one of those side projects we have encountered a bug that took long time to review and test, there was a risk to exceed the time of the project, but luckily we made it and could focus on the main part.&lt;/p&gt;
&lt;p&gt;We have come up with a few different side project ideas.&lt;/p&gt;
&lt;p&gt;The first idea was to have a feature called &lt;em&gt;Find On Web&lt;/em&gt;. This feature aims to help users if they are looking for additional info about a track on online music databases. After this is implemented roughly, we decided to polish it with the &lt;em&gt;Factory Design Pattern&lt;/em&gt; which simplifies adding other online music databases later on. After these two side projects we decided to get cover art of the tracks which is &lt;em&gt;Cover Art Fetcher&lt;/em&gt;. When I collect tracks for my library, I always wanted to have the correct metadata of the track and also the correct cover art. As a person who cares about appearance a lot, I thought that I am not alone in this situation and people would love it too. That's why I found this side project very helpful and important! At last, the main project comes along, the &lt;em&gt;Track Suggestion Feature&lt;/em&gt; which is getting Track Suggestions from various services.&lt;/p&gt;
&lt;h4&gt;Implementation&lt;/h4&gt;
&lt;h5&gt;&lt;em&gt;Find On Web Feature&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;The first side project &lt;em&gt;Find On Web&lt;/em&gt; is supposed to help user finding additional info about a track, album, or artist.&lt;/p&gt;
&lt;p&gt;Think about a scenario, you have only just a track from an album and you would like to get more information about other tracks in that album. Until now, you would first open your favourite web browser, then you type the Artist and Album in your search engine, you hit the button to search and you find the web page and finally you can get more information. This is very time-consuming. This is where the Find On Web comes in handy.&lt;/p&gt;
&lt;p&gt;Let's think about another scenario. You love to find out remixes of each track in your library and with those remixes you expand your library. You probably use &lt;a href="https://soundcloud.com/"&gt;SoundCloud&lt;/a&gt; or a similar service very often. Luckily we have this service in our &lt;em&gt;Find On Web&lt;/em&gt; feature. If you are looking for remixes in your library very often, &lt;em&gt;Find On Web&lt;/em&gt; feature will help you along with that.&lt;/p&gt;
&lt;p&gt;This feature is placed in the Track Menu. When you right-click on a track, you will see different Menus and Actions that you can take over a track. This is called &lt;em&gt;Track Menu&lt;/em&gt;. On the track menu, in the Metadata section, you can see the &lt;em&gt;Find On Web&lt;/em&gt;. There are three main Online Music Databases that exist as menus. They will be called services after this part. These services are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://soundcloud.com/"&gt;SoundCloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.discogs.com/"&gt;Discogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.last.fm/"&gt;Last.fm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you hover your mouse over those services menus, you can see the related track properties as actions. Each action populates the suggested service with the suggested track information for your default browser. This looks like:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Find On Web Feature&lt;/em&gt;
&lt;img alt="Find On Web Feature" src="////mixxx.acolombier.dev/images/news/findonwebfeature.png"&gt;&lt;/p&gt;
&lt;p&gt;This Implementation was designed roughly for the next step. The next step was:&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Find On Web With Factory Design Pattern&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;This implementation aims to have a Factory Design Pattern for the Find On Web feature.&lt;/p&gt;
&lt;p&gt;As its name states, you can think about you have a factory and you can produce products. Our factory is the &lt;em&gt;Find On Web&lt;/em&gt; itself and our products are the services. The most important point here is that all products coming out of a factory must be derived from the same interface or class. Thanks to this pattern, you can abstract our Services for future use. You can produce products - add new services - straight forward.&lt;/p&gt;
&lt;p&gt;Since there are many other online music databases, that is nice to have &lt;em&gt;Find On Web&lt;/em&gt; feature with the Factory Design Pattern. Just in case if needed any other service can be added easily without making any changes in the code base.&lt;/p&gt;
&lt;p&gt;Related Files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/main/src/widget/findonwebmenufactory.cpp"&gt;findonwebfactory.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/main/src/widget/findonwebmenufactory.h"&gt;findonwebfactory.h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/tree/main/src/widget/findonwebmenuservices"&gt;Find On Web Menu Services Folder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;&lt;em&gt;Editable Track Menu&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;While discussing &lt;em&gt;Find On Web&lt;/em&gt; feature and where we could placed it on Mixxx. We have decided to place it on Track Menu. There was an idea on Zulip, that the Track Menu was gettin crowded, and we can consider to make it configurable.&lt;/p&gt;
&lt;p&gt;At first I thought the same and this feature would be nice to have and that can help me to get to know the code base for the preferences option.&lt;/p&gt;
&lt;p&gt;I introduced this idea on the Zulip channel. The idea of making the track menu configurable rejected in the discussion with the community in favor of Mixxx. Sometimes the configuration option proves the developers' inability to make decisions for them. As a result, we have chosen not to implement this.&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Cover Art Fetcher&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;This is the third side project for the Track Suggestion Feature. Fetching cover art from online resources. According to the search we have done, we decided to fetch the cover art from Cover Art Archive (CAA) hosted by &lt;a href="https://archive.org"&gt;Archive.org&lt;/a&gt; . The Cover Art Archive is a joint project between the Internet Archive and &lt;a href="https://musicbrainz.org/"&gt;MusicBrainz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The CAA uses the track's Release MBID (MusicBrainz Identifier) to retrieve cover art. For that, the &lt;em&gt;Import Metadata From Musicbrainz&lt;/em&gt; feature could be used.&lt;/p&gt;
&lt;p&gt;To get cover arts, we needed two different processes that should work in order. These processes are called &lt;em&gt;tasks&lt;/em&gt;. First, we should get the cover art links. Second, by using that links and according to the user choice we should get the cover art itself.&lt;/p&gt;
&lt;p&gt;Cover Art Archive works a little bit different than the other services. I discovered that after I sent my first-ever request. I received the response but it was redirected. Thanks to Qt's class &lt;em&gt;QNetworkAccessManager&lt;/em&gt; has &lt;a href="https://doc.qt.io/qt-6/qnetworkrequest.html#RedirectPolicy-enum"&gt;Redirect Policy&lt;/a&gt; which is designed for these situations.&lt;/p&gt;
&lt;p&gt;The response consists of links to the cover art in different sizes. The possible sizes were 250px and 500px all the time and if it is available 1200px and also the HQ. This response also had the back cover art of the albums. After discussing that with the community, we have decided to only allow the front cover art but with every possible size, which includes the HQ!&lt;/p&gt;
&lt;p&gt;On the preferences the user will see these options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lowest:  250x250&lt;/li&gt;
&lt;li&gt;Medium:  500x500&lt;/li&gt;
&lt;li&gt;High:    1200x1200 if available on CAA.&lt;/li&gt;
&lt;li&gt;Highest: More than 1200px if available on CAA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we needed the second task to get the &lt;em&gt;Actual Image&lt;/em&gt; of the cover art. According to the preferences chosen by the user, the actual image is retrieved.&lt;/p&gt;
&lt;p&gt;After this task was successfully done, there was only one thing left and it was the use case.&lt;/p&gt;
&lt;p&gt;The best use case was to change the &lt;em&gt;Import Metadata From Musicbrainz&lt;/em&gt; window to be suitable for cover art fetching and updating metadata at the same time. That was solving all the possible issues mentioned.  &lt;/p&gt;
&lt;p&gt;Right now, users can select between the lowest quality to highest quality, when they press apply on the tag fetcher cover art is downloaded and updated for that track.&lt;/p&gt;
&lt;p&gt;Related files:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/18ed28d9061feb19b58aa4db1730f347622686a5/src/musicbrainz/web/coverartarchivelinkstask.cpp"&gt;coverartarchivelinkstask.cpp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/18ed28d9061feb19b58aa4db1730f347622686a5/src/musicbrainz/web/coverartarchiveimagetask.cpp"&gt;coverartarchiveimagetask.cpp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover Art Fetcher&lt;/em&gt;
&lt;img alt="Cover Art Fetcher" src="////mixxx.acolombier.dev/images/news/coverartfetcher.png"&gt;&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Track Suggestion Feature&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;This is the main part of the project. In my opinion, Track Suggestion is a cool feature for a DJ app. Getting a hint for the next track at right time would be so precious for a DJ. But the possibility of the finding correct track has also the same amount of difficulty.&lt;/p&gt;
&lt;p&gt;To find similar tracks, we have used Last.fm. Thanks to their &lt;a href="https://www.last.fm/api"&gt;API&lt;/a&gt; we can get track suggestions by just providing the Artist and Title. What is changed is basically on the library sidebar, there is a new feature called "Track Suggestion" which can be turned on or turned off on the preferences page. There are five different sub-menus located under this feature. Four of them belong to the decks and one of them belongs to the user's choice. When a track is placed on a deck, the correlated sub-menu changes to the &lt;em&gt;Artist | Track Title&lt;/em&gt;. If the user clicks on that menu a new library is populated. If the suggestions are fetched before the user will be retrieved from the database, if it is not, the user will see a button that says &lt;em&gt;Load Track Suggestions For Artist | Track Title&lt;/em&gt;. After this button is pressed, we send the request and get the response cached in the database.&lt;/p&gt;
&lt;p&gt;The new library is an External Library. The located tracks are not available to play, because they are only text retrieved from Last.fm. But the tracks listed in that library can give an idea to the DJ about what to play next. DJ can see a title or an artist, and with that, this title or artist can guide the DJ to pick the next song.&lt;/p&gt;
&lt;p&gt;There is a problem with the Last.fm service, when the track or artist name is misspelled the suggestions can not be fetched. Also for some tracks, there is no suggestion available on the Last.fm servers. To fix this issue, we have discussed a few different solutions, such as finding another service as a back up.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Track Suggestion Feature&lt;/em&gt;
&lt;img alt="Track Suggestion Feature" src="////mixxx.acolombier.dev/images/news/tracksuggestion.png"&gt;&lt;/p&gt;
&lt;p&gt;Related files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/03b1b6831e15428745398c20e36ef704db336c29/src/library/tracksuggestion/lastfm/lastfmgettracksimilartask.cpp"&gt;lastfmgettracksimilartask.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/03b1b6831e15428745398c20e36ef704db336c29/src/library/tracksuggestion/tracksuggestionfeature.cpp"&gt;tracksuggestionfeature.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Pull Requests and Issues&lt;/h4&gt;
&lt;h5&gt;Pull Requests&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4697"&gt;mixxx#4697&lt;/a&gt;
- &lt;em&gt;BasePlaylistFeature&lt;/em&gt;: add popup asking deletion playlist&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR is the beginning of my story. That was my initial PR in my open-source experience. As mentioned on the Mixxx &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsocadvice"&gt;GSoC advice page&lt;/a&gt; before, I fixed a bug from the easy tag.&lt;/p&gt;
&lt;p&gt;In order to do that, I needed to fork the project, clone it, compile it, make changes, install the pre-commit, push the changes, and open a PR.&lt;/p&gt;
&lt;p&gt;As a total beginner, that took my whole day to figure things out. But If I look at it now, I can say that I am more experienced and that it is easy peasy - lemon squeezy.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4700"&gt;mixxx#4700&lt;/a&gt;
- &lt;em&gt;CrateFeature&lt;/em&gt;: add popup to avoid accidental remove of Crate&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR is similar to my first PR. After the first PR is merged, That was also mentioned on the bug that it is needed for crates as well.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4752"&gt;mixxx#4752&lt;/a&gt;
- Parserm3u export&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR aims to have a better playlist/crate exporting experience. While I was surfing on the discourse, in one of the topics a user asked a question related to the exporting playlist. To help the user, I tried to export my playlist, but suddenly I realized that when I import my playlist back, there were some missing tracks. I have mentioned that on Zulip and with the help of other developers, I realized that there were missing characters and I wanted to solve this issue. This PR is about that issue.&lt;/p&gt;
&lt;p&gt;Meanwhile, I've learned that m3u files can have different encodings while m3u8 files are UTF-8.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4772"&gt;mixxx#4772&lt;/a&gt;
- &lt;em&gt;WFindOnWebMenu&lt;/em&gt;: Menu for to find track properties in online music databases&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR was my first PR in the coding period. &lt;em&gt;FindOnWebMenu&lt;/em&gt; helps users to find related
track properties on various online music databases.&lt;/p&gt;
&lt;p&gt;In this PR, I had the chance to get to know the code base and got familiar with the QT. I also used the git command rebase for the first time, that was difficult at those days, but right now I am more experienced with the git commands.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4836"&gt;mixxx#4836&lt;/a&gt;
- &lt;em&gt;WFindOnWebMenu&lt;/em&gt;: Implementing the factory pattern&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR is the second step of the previous one. This changes all the code into the factory pattern.&lt;/p&gt;
&lt;p&gt;In this PR, I have learned design patterns. Not only the factory design pattern, I also learned the other design patterns, such as Abstract Factory, Singleton, and more. I am pretty sure that I will encounter these general problems in software and I will use the design patterns.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4851"&gt;mixxx#4851&lt;/a&gt;
- Cover Art Fetcher&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open (WIP) | last GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/4851/commits/8856e4b994e48a80eac5f03f85459eb5649e1260"&gt;8856e4b&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the main PR about the cover art fetcher.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4864"&gt;mixxx#4864&lt;/a&gt;
- Cover Art Label &amp;amp; Cover Art Full Size composition with menu&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There was a problem with the cover art label displayed on the cover art fetcher. We decided to implement the cover art fetcher into "Import Metadata From Musicbrainz", and I wanted to add the existing cover art and the fetching cover art on the "MusicBrainz" dialog. The problem was, the cover art menu which consists of actions "update-clear-reload" was populating from the fetched cover art label too. To solve that, we first decided to have a base class for the cover art label which doesn't have any menu at all, and Inherit another label which has the menu. But this was not good looking in the code base with the duplication of the code and also locating/naming of the new base class. So with the help of my mentor, we have decided to have a composition approach. This has taught me a terminology in Object Oriented Programming. Which is very simple but effective in design. &lt;em&gt;Is-a &amp;amp; Has-a * relationship. When we inherit from a base class, we can simply say "Cover Art Label &lt;/em&gt;is a&lt;em&gt; Cover Art Label With The Menu". But that doesn't just sound right. So instead, we added Cover Art Menu as a parameter in the constructor. Now we can say "Cover art label &lt;/em&gt;has a* cover art menu". Thanks to this PR, this is not going to be used just not in the cover art fetcher also in the cover art worker.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4871"&gt;mixxx#4871&lt;/a&gt;
- DlgTagFetcher new feedback system&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open (WIP) | last GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/4871/commits/47bbc157885b4f343479d7f4291970fc67744f3e"&gt;47bbc15&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR was to aim for a better interface for "Import Metadata From MusicBrainz". Because when the user wants to get cover art from the cover art archive, the process was too long and confusing about the initial status of cover art fetching. To have a better feedback system, we have decided to add a &lt;em&gt;QProgressBar&lt;/em&gt; to show the initial progress not just for the cover art archive, but also for fetching Metadata from Musicbrainz. While Implementing this new feedback system, I discovered a few related bugs that were affecting the existing release of Mixxx version 2.3. That PR and also the bugs were going to lead me to learn more.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4887"&gt;mixxx#4887&lt;/a&gt;
- Ask user after changing the cover art.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Draft | last GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/4887/commits/693ab90bff30f88bf4bbaaae64a574a251dd4c72"&gt;693ab90&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR was about a "TODO:" comment in the code base. But after I work on it for a while, I discovered that this is a must, for the cover art fetcher. This PR asks users if they want to copy the cover art which they have updated. It started simply with a &lt;em&gt;QMessageBox&lt;/em&gt; and then became big with the needed implementations. Such as making it atomic writing, moving to a separate thread, and adding a comparison between the old and new cover art. This PR was becoming more bigger and difficult to review-implement. So we had to break this into smaller PRs but this one is still open for the future implementation.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4909"&gt;mixxx#4909&lt;/a&gt;
- CoverArtUtils: Fix Reload From File/Folder, Updates Wrong Cover Art&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR aims to fix the related bug mentioned below.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10822"&gt;mixxx#10822&lt;/a&gt;
- Fix: Rate limit exceeds for Musicbrainztask.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Closed&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This was a bug that I noticed while working on the new Musicbrainz design. I've tried to fix this by adding a state called "Looping" in the first place. But later on, this PR was superseded by &lt;a href="https://github.com/mixxxdj/mixxx/pull/10875"&gt;mixxx#10875&lt;/a&gt;. But even though, thanks to my mentor for providing additional information about how to overcome this issue. I have learned about the activity diagram 'Swimlane' and UML State charts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10860"&gt;mixxx#10860&lt;/a&gt;
- Track Suggestion Feature: Get tracks suggestions according to the track playing on the decks&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open (WIP) | last GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/10860/commits/0c020741edc5a4f9c3dcb7916bad959744c72602"&gt;0c02074&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is an initial PR about the Track Suggestion Feature. This is used Last.fm's API to get similar tracks that are placed on the deck and also tracks selected by the user.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10861"&gt;mixxx#10861&lt;/a&gt;
- BaseSqlTableModel: remove duplicated line.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While I was working on the Track Suggestion feature, I encountered a duplicated line in one of the classes. This PR deletes this duplicated line.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10878"&gt;mixxx#10878&lt;/a&gt;
- FIX: Tag Fetcher close button doesn't abort task&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR aims to fix the related bug mentioned below.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10897"&gt;mixxx#10897&lt;/a&gt;
- Moving SafelyWritableFile class to the utility folder.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a part of the cover art copy worker PR. This PR aims to move the SafelyWritableClass from inside a file to the utility folder.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/manual/pull/517"&gt;manual#517&lt;/a&gt;
- Update Getting Involved&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There was a new user who introduced himself on the Zulip channel. I wanted to give additional information to guide him. To do that I was looking at to documentation and realized that the links for bug reporting were directed to the launchpad which was the old bug tracker of Mixxx. This PR aims to delete the old links and replace them with the GitHub issues link.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10902"&gt;mixxx#10902&lt;/a&gt;
- Cover Art Copy Worker&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open (WIP) | last GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/10902/commits/2e13c64705390e3dd58526ec66a28c126347792c"&gt;2e13c64&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR was opened due to the size of the PR about "Ask user after changing the cover art". This is the smaller version of it. There is no comparison, wizard, or dialog but the other must-needed parts for the cover art fetcher are included in this PR.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10908"&gt;mixxx#10908&lt;/a&gt;
- ImageFileData class added to write images without loss&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While the worker was writing new cover art where the track was located, there was a decrease in the cover art file size. This PR was needed to save the cover art without loss. While working on this I have learned that the formats for images. Between these formats, "jpg"-"jpeg" format(s) is a lossy format that compresses the images. That is useful for websites to downgrade the size of the web page but not in our situation which quality is really important.&lt;/p&gt;
&lt;hr&gt;
&lt;h5&gt;Issues&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10877"&gt;mixxx#10877&lt;/a&gt;
- Closing Tag Fetcher via the "x" close button doesn't stop the WebTask&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Closed&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was testing the latest status of the &lt;em&gt;Tag Fetcher&lt;/em&gt;. If the Musicbrainz window is closed via the ESC button or 'x' button the &lt;em&gt;Tag Fetcher&lt;/em&gt; was not aborting and working in the background.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10816"&gt;mixxx#10816&lt;/a&gt;
- Updating Cover Art on Track Properties Doesn't Take Effect&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This bug is related to the &lt;em&gt;Track Properties&lt;/em&gt; and it is different than mentioned in the title. Normally all the cover art actions update the cover art right away, but when we update it on the track properties the cover art was not updated. That was a mistake by me and this was the correct behavior of the track properties.&lt;/p&gt;
&lt;p&gt;The bug is actually when the new cover art is updated on Track Properties and the user wanted to see it in full size, the old cover art populates.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10807"&gt;mixxx#10807&lt;/a&gt;
- Reload From File/Folder, Updates Wrong Cover Art&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Closed&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This was a bug that I encountered while working on the cover art fetcher. I have updated the cover art of all the tracks in my library. But the problem was all of my tracks were updated with only single cover art.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10796"&gt;mixxx#10796&lt;/a&gt;
- If MusicBrainz Returns an empty XML (404) whole task fails and no results displayed&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This bug was affecting some of the tracks in my library. While I was working on the Tag Fetcher, I realized some songs in my library could not get metadata from Musicbrainz. There was an error. That was displayed as "Not Found" on the Tag Fetcher. But the logs were different, there were some successful results, and they exist on the MusicBrainz. But importing metadata for these tracks was failing for some reason. When I dig that down, I realized that the responses from Musicbrainz are successful but empty, and in the codebase that was meant to be no results. This is still in progress, but after that is resolved we will increase the rate of the successful results of our Tag Fetcher.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10795"&gt;mixxx#10795&lt;/a&gt;
- Rate Limit exceeds for some songs while Importing Metadata From MusicBrainz&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Closed&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This bug is discovered the same as above. The error message displayed to the user was confusing too. The difference is, it was quite easier to find out why there was an error. The tracks that can not have the results were the ones that have a lot of Recording IDs compared with the other tracks. When that is dug down, we found out that MusicBrainz Rate Limit was a request per second. But that was designed without any delay. That's why if a track has many Recording ID's retrieved from AcoustID, we were hitting the rate limits.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10782"&gt;mixxx#10782&lt;/a&gt;
- Mixxx crashes when click on a track updated with Musicbrainz Metadata&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Closed&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This bug was happening due to debug assertion when I select the tracks updated from "Import Metadata From MusicBrainz".&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Discourse&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In my free time, I was surfing through the Mixxx Forum to help the users as much as I could with my knowledge. In some of the topics, I was able to help the users, these topics and my answers were:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mixxx.discourse.group/t/exporting-a-playlist-to-m3u-invalid-characters/25181"&gt;Discourse - Exporting a playlist to m3u invalid characters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mixxx.discourse.group/t/easy-uncheck-assume-constant-tempo-in-track-properties-when-default/24479/4?u=fatihemreyildiz"&gt;Discourse - Easy Uncheck Assume Constant Tempo In Track Properties When Default&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Future work&lt;/h4&gt;
&lt;p&gt;There are only a few to-do's left for the side projects we have discussed before. They can be improved just like in any other feature that exists in the Mixxx. For the track suggestion feature, there are still additional future works that still needs to be done. These are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Merge the cover art worker for &lt;em&gt;Cover Art Fetcher&lt;/em&gt;, with the caching class of the fetched cover art &lt;em&gt;Cover Art Fetcher&lt;/em&gt; can be easily integrated.&lt;/li&gt;
&lt;li&gt;Specialized External Playlist model for &lt;em&gt;Track Suggestion Feature&lt;/em&gt; for better database interaction&lt;/li&gt;
&lt;li&gt;Determination if the suggestions are in the user's library, with that &lt;em&gt;Track Suggestion Feature&lt;/em&gt; can be much more useful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a few ideas that have been discussed before on Zulip. These are not mandatory works but that would have been nice to have. These can be future references.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get cover art of the suggestions so the &lt;em&gt;Track Suggestion Feature&lt;/em&gt; would look better.&lt;/li&gt;
&lt;li&gt;User Clustering Playlists! There was a brilliant idea while we were brainstorming about Track Suggestion Feature. User's can make their own suggestions by using their own library.&lt;/li&gt;
&lt;li&gt;There could be a field in preferences for &lt;em&gt;Find On Web&lt;/em&gt; feature, which is a field that can be filled by the user. With that users can add their own services.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Find On Web&lt;/em&gt; could have a preference option to enable - disable the services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Things I learned from GSoC&lt;/h4&gt;
&lt;p&gt;First of all, I can easily say that GSoC was one of the best experiences in my life. It deserves Its title "Summer of Code" I had a great summer full of coding. I learned a lot and had so much fun. During this period, being an open-source contributor to a community felt amazing. Before the GSoC, I did some projects for my university projects and used git very basically. But for the first time in my life, I did coding for a real project and used git professionally, and learned a lot about it. I have learned that every aspect is really important while coding and even small glitches can cause a big bug. I have developed features which people can use. Fixed existing bugs that people encountered. This was such a unique experience. If I haven't met GSoC this year, I wouldn't be an open source contributor or I would have been very late in another time in my life. I can easily say that I've learned a lot about C++, Qt, design patterns, web services, testing, debugging, git and gained important experience on all of them. What I have learned was I am enjoying hours of coding, testing, hunting bug, and solving problems. If I have to compare myself before and after the GSoC, the difference is huge.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;At the end of the coding period, the decided side projects and their little steps were implemented into Mixxx. Such as &lt;em&gt;Find On Web&lt;/em&gt;, &lt;em&gt;Find on Web with Factory Design&lt;/em&gt;, and &lt;em&gt;Cover Art Label&lt;/em&gt; without a menu.  Besides the side projects, there were many bugs (which were affecting both the stable 2.3.3 version and the upstream branch) reported and fixed. Such as the empty XML, the rate limit of MusicBrainz, aborting the tag fetcher, etc. With those fixes, Mixxx users will have a better fetching metadata experience. At the end of the period, unfortunately, the Track suggestion feature couldn't be implemented into the Mixxx code base but we have a working POC as an open PR. Also, an existing request from a long time ago was discussed seriously with the developers and users on the Zulip GSoC channel. We have over-searched the available services and discussed the main problems with fetching suggestions from different services, how to make this feature useful and what needs to be done to have the best use-case. This will be a reference to the future for sure.&lt;/p&gt;
&lt;h4&gt;Acknowledgements&lt;/h4&gt;
&lt;p&gt;I want to start with how great Mixxx is! Since the first day I joined the community and introduce myself on Zulip today, I am enjoying it a lot and I am so happy to be part of Mixxx. Everybody in the community was really helpful and they are doing their best to make Mixxx the best DJ Software. I would like to thank all the developers and contributors who contributed to Mixxx in any way.&lt;/p&gt;
&lt;p&gt;I can not express how thankful I am, to my mentor &lt;a href="////mixxx.acolombier.dev/news/author/daniel-schurmann"&gt;@Daniel Schürmann&lt;/a&gt;. He has been such a great adviser, teacher, and guide from the very beginning to the end of the project. It won't be my fault if I say that he has been the best mentor! Besides being a really good mentor, he was so friendly. The ideas that he shared with me broadened my aspect through the project. At the beginning of the project, I was nervous about the whole big thing that needs to be done, and he gave me perspective in those sorts of circumstances. That was "broom stroke after broom stroke". This perspective helped me from the beginning till the end. There is one last thing left that I need to add, which is... "It's Friday Again!".&lt;/p&gt;
&lt;p&gt;I would like to thank &lt;a href="https://github.com/ronso0"&gt;@ronso0&lt;/a&gt; for his brilliant ideas about the GUI of the Tag Fetcher Dialog, Cover Art Fetcher also for the Track Suggestion Feature. His ideas about UI/UX were really helpful for me to move forward in my PRs. I would like to thank &lt;a href="https://github.com/Swiftb0y"&gt;@Swiftb0y&lt;/a&gt; for his reviews in "Factory Pattern Design", that was nice to work with him, also I would like to thank him for his ideas about the cover art fetcher. I would like to thank my friend &lt;a href="https://github.com/davidchocholaty"&gt;@David Chocholatý&lt;/a&gt; who is also a 2022 GSoC Mixxx participant for his coworking and help with the final blog. I would like to also congratulate him on his successful project!&lt;/p&gt;
&lt;p&gt;I would like to thank everyone interested and who shared their precious ideas related to the "Track Suggestion Feature" and Its little side projects.&lt;/p&gt;
&lt;p&gt;At last, I would like to thank Google for this amazing program and giving us this opportunity .&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2022"></category></entry><entry><title>GSoC 2022 Work Product - Pitch Shift effect and Group Delay handling</title><link href="//mixxx.acolombier.dev/news/2022-09-08-gsoc-final-blog-david-chocholaty" rel="alternate"></link><published>2022-09-08T23:45:52+02:00</published><updated>2022-09-08T23:45:52+02:00</updated><author><name>David Chocholatý</name></author><id>tag:mixxx.acolombier.dev,2022-09-08:/news/2022-09-08-gsoc-final-blog-david-chocholaty</id><summary type="html">&lt;p&gt;Disclaimer: &lt;em&gt;The blog post primarily serves as the documentation
for the &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code&lt;/a&gt; 2022
project: "Pitch Shift effect and Group Delay handling". Thus, it contains
a lot more detailed description, than the other Mixxx blog posts.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;The project implements the Pitch Shift effect for the Mixxx DJ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Disclaimer: &lt;em&gt;The blog post primarily serves as the documentation
for the &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code&lt;/a&gt; 2022
project: "Pitch Shift effect and Group Delay handling". Thus, it contains
a lot more detailed description, than the other Mixxx blog posts.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;The project implements the Pitch Shift effect for the Mixxx DJ
Software Application. The Pitch Shift effect raises or lowers the original pitch
of an audio signal&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Thanks to the long working period, the project
was expanded with the implementation of the Group Delay handling
for the effect chain.&lt;/p&gt;
&lt;h4&gt;Motivation&lt;/h4&gt;
&lt;p&gt;Before the effect was implemented, the pitch could be changed using the deck's
rate slider separately only. This imposes significant restrictions on the ways
other effects can interact with the sound. In this project, the new Pitch Shift
effect is introduced in the built-in effects, which can be used
in the effect chain. It implements the wish
&lt;a href="https://github.com/mixxxdj/mixxx/issues/7389"&gt;Add a Transpose / Pitch Shift effect&lt;/a&gt;
for the Mixxx software. The effect has to work with the effect chain API.
With that, the other extensional options can be used. Primarily, it allows
for a user to use a much wider range, than the Pitch Shifter
for the deck player. Due to the produced latency based on the pitch processing,
the production delay has to be handled for the Dry/Wet or Dry+Wet mode
to ensure that the original (dry) and processed (wet) signals overlap.&lt;/p&gt;
&lt;h4&gt;Background&lt;/h4&gt;
&lt;p&gt;List of terms from the field of music, sound processing
and development in general:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pitch&lt;ul&gt;
&lt;li&gt;Pitch is a perceptual property of sounds that allows
  their ordering on a frequency-related scale. The pitch
  is the quality that makes it possible to judge sounds as "higher"
  and "lower" in the sense associated with musical melodies&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scale&lt;ul&gt;
&lt;li&gt;In music theory, a scale is any set of musical notes ordered
 by fundamental frequency or pitch. The scale ordered
 by increasing pitch is an ascending scale, and a scale ordered
 by decreasing pitch is a descending scale&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Octave&lt;ul&gt;
&lt;li&gt;In music, an octave is an interval between one musical pitch
 and another with double its frequency&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Interval&lt;ul&gt;
&lt;li&gt;In music theory, an interval is a difference in pitch between
 two sounds. In western scales, intervals are most commonly differences
 between whole tones and semitones&lt;sup id="fnref:5"&gt;&lt;a class="footnote-ref" href="#fn:5"&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Semitone&lt;ul&gt;
&lt;li&gt;A semitone is a distance in pitch between a note
 and the very next note, higher or lower. It is the smallest interval
 in most western scales&lt;sup id="fnref:6"&gt;&lt;a class="footnote-ref" href="#fn:6"&gt;6&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chromatic scale&lt;ul&gt;
&lt;li&gt;A chromatic scale is a set of twelve pitches used
 in tonal music, with notes separated by the interval
 of a semitone&lt;sup id="fnref:7"&gt;&lt;a class="footnote-ref" href="#fn:7"&gt;7&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dry and wet signals&lt;ul&gt;
&lt;li&gt;Dry sound signals refer to the raw or unprocessed sounds
 that usually come from a direct recording. On the other hand,
 wet sounds refer to the processed sound/signal&lt;sup id="fnref:8"&gt;&lt;a class="footnote-ref" href="#fn:8"&gt;8&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ring buffer (circular buffer)&lt;ul&gt;
&lt;li&gt;In computer science, a circular buffer or ring buffer
 is a data structure that uses a single, fixed-size buffer
 as if it were connected end-to-end. This structure lends itself
 easily to buffering data streams&lt;sup id="fnref:9"&gt;&lt;a class="footnote-ref" href="#fn:9"&gt;9&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Audio buffer&lt;ul&gt;
&lt;li&gt;An audio buffer holds a fixed size amount of sampled audio data.
 The audio buffer size determines the time allowed for the computer
 to process the audio data. Thus, it also determines latency.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Latency&lt;ul&gt;
&lt;li&gt;In the audio world, “latency” is another word for “delay”&lt;sup id="fnref:10"&gt;&lt;a class="footnote-ref" href="#fn:10"&gt;10&lt;/a&gt;&lt;/sup&gt;.
 The latency (time) of an audio system refers to the time difference
 from the moment a signal is fed into the system, to the moment it appears
 at the output&lt;sup id="fnref:11"&gt;&lt;a class="footnote-ref" href="#fn:11"&gt;11&lt;/a&gt;&lt;/sup&gt;. For example, audio latency is when there is
 a noticeable delay between the sound being played and the moment it reaches
 the speakers&lt;sup id="fnref2:10"&gt;&lt;a class="footnote-ref" href="#fn:10"&gt;10&lt;/a&gt;&lt;/sup&gt;. Depending on the application, such a delay can have various
 effects. Usually, the aim is to achieve the lowest possible latency&lt;sup id="fnref2:11"&gt;&lt;a class="footnote-ref" href="#fn:11"&gt;11&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sample Rate&lt;ul&gt;
&lt;li&gt;Audio sampling is the process of transforming a musical source
 into a digital file. Digital audio recording does this by taking samples
 of the audio source along the soundwaves at regular intervals. The more
 samples are taken - known as the ‘sample rate’ - the more closely the final
 digital file will resemble the original. A higher sample rate tends
 to deliver a better-quality audio reproduction&lt;sup id="fnref:12"&gt;&lt;a class="footnote-ref" href="#fn:12"&gt;12&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Implementation&lt;/h4&gt;
&lt;h5&gt;&lt;em&gt;Pitch Shift effect&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;The Pitch Shift effect main algorithm is implemented
in the &lt;code&gt;PitchShiftEffect&lt;/code&gt; class. The implementation uses the widely known
audio time-stretching and pitch-shifting library RubberBand.
The implementation adheres to the “push model”. That means, that
the input audio samples are offered to the RubberBand library API directly.
Instead of the main Pitch Shifter for each deck player, which
has a limited range (only 7 semitones up and down in musical terms,
which means not even an octave), the independent Pitch Shift effect offers
to work in the range of ± 2 octaves (± 24 semitones).
The Pitch Shift effect has the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pitch knob&lt;/li&gt;
&lt;li&gt;Range knob&lt;/li&gt;
&lt;li&gt;Semitones mode&lt;/li&gt;
&lt;li&gt;Formant preserving&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Pitch knob changes the pitch of a track up or down. For the default
middle position, the track pitch is unchanged. The Range knob ensures setting
the range of the Pitch knob. The Pitch knob based on the range setting can work
from zero range to 2 octaves range. These two knobs work similarly to the real
professional Pioneer DJM-900NX2 mixer which is widely used in clubs for live
DJ mixing. Then, the Semitones mode toggle was added. This option sets the scale
of the Pitch knob. The knob can work in two modes: Continuous or Semitones mode.
In the Semitones mode, the pitch is changed based on the chromatic scale
in a musical way. Otherwise, the pitch is processed continuously,
which is a default approach of the used RubberBand library. By default,
the Semitones mode is on. As last, the Formant preserving option was added
which uses the RubberBand API namesake option. It preserves
the resonant frequencies (formants) of the human vocal tract
and other instruments (compensates for “chipmunk” or “growling” voices).&lt;/p&gt;
&lt;p&gt;Related files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/effects/backends/builtin/pitchshifteffect.cpp"&gt;pitchshifteffect.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/effects/backends/builtin/pitchshifteffect.h"&gt;pitchshifteffect.h&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Screenshots:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pitch Shift effect in the Mixxx software&lt;/em&gt;
&lt;img alt="Pitch Shift effect in the Mixxx software" src="////mixxx.acolombier.dev/images/news/mixxx-pitch-shift-app.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pitch Shift effect in the effect chain&lt;/em&gt;
&lt;img alt="Pitch Shift effect in the effect chain" src="////mixxx.acolombier.dev/images/news/mixxx-pitch-shift-effect.png"&gt;&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Group Delay handling&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;As a project extension, the Group Delay handling of the effect chain
was implemented. Based on the Pitch Shift effect processing,
using the RubberBand library, the effect produces some amount of latency.
Due to that, if we would like to play the original unprocessed signal
and the processed one together using the Dry/Wet or Dry+Wet mode, the two
audio signals will not overlap because of latency. With that, the common
audio processing approach is to delay the original signal by the amount
of latency to overlap the signals. Based on the Mixxx effect chain API
(&lt;code&gt;EngineEffectChain&lt;/code&gt;), the group delay latency handling was implemented
for the whole effect chain and works for the total produced latency
from the effect chain used effects. The main algorithm of the Group Delay
handling for the effect chain is implemented in the &lt;code&gt;EngineEffectsDelay&lt;/code&gt; class.
The implemented APIs take the group delay with the input signal and return
the delayed signal using the inner data structures. For group delay changes,
it performs cross-fading to avoid unwanted clicks in the output audio signal.
The implemented API was used and built into the implementation
of the effect chain. Now, the sum of the latency reported by effects
is processed. As was mentioned, lastly, the Group Delay reporting
from the effects was implemented using the Mixxx API structures for effects
(&lt;code&gt;EngineEffect&lt;/code&gt; and &lt;code&gt;EffectProcessor&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Related files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/engine/effects/engineeffectsdelay.cpp"&gt;engineeffectsdelay.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/engine/effects/engineeffectsdelay.h"&gt;engineeffectsdelay.h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/test/engineeffectsdelay_test.cpp"&gt;engineeffectsdelay_test.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/effects/backends/effectprocessor.h"&gt;effectprocessor.h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/engine/effects/engineeffect.h"&gt;engineeffect.h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/engine/effects/engineeffectchain.cpp"&gt;engineeffectchain.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/engine/effects/engineeffectchain.h"&gt;engineeffectchain.h&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Based on the implementation of the &lt;code&gt;EngineEffectsDelay&lt;/code&gt;, it was soon figured out,
that the custom optimized data structure for the Group Delay handling
should be created. A common approach for working with the audio signal stream
is to use the ring buffer data structure. However, based on the specification
of Group Delay handling and requirements on the buffer data structure,
the classic widely known implementation is not appropriate for use. So,
the new improved and optimized variant of the ring buffer data structure
was created specifically for the Group Delay handling use case.
The implementation can be found in the &lt;code&gt;RingDelayBuffer&lt;/code&gt; class.&lt;/p&gt;
&lt;p&gt;Related files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/util/ringdelaybuffer.cpp"&gt;ringdelaybuffer.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/util/ringdelaybuffer.h"&gt;ringdelaybuffer.h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mixxxdj/mixxx/blob/f3a3e04fe5a732d0a3e61b3bc2e2c3ec904a8630/src/test/ringdelaybuffer_test.cpp"&gt;ringdelaybuffer_test.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the &lt;code&gt;RingDelayBuffer&lt;/code&gt; was implemented, the new optimized data structure
was introduced in the &lt;code&gt;EngineEffectsDelay&lt;/code&gt; for Group Delay handling. With that,
the performance has highly improved based on the benchmark results comparison.
The benchmarking process and results will be described in detail
in the "Testing and benchmarking" chapter later.&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Pitch Shift effect improvement&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;At the latest, it was started the “pull model” implementation for decreasing
the Pitch Shift effect latency in the GSoC period. In the new
model implementation, the RubberBand API requires the amount of input samples
and this amount of samples is passed. The main difference between the usage
of these two implementations in the Mixxx software is which tradeoff
has to be made. When the “push model” implementation is used, the input
data samples have not to be prefilled between the processing
but the audio dropouts can occur. On the other hand,
the “pull model” implementation with correctly set structure sizes
avoids dropouts, but the input data samples have to be prefilled
before the processing, and a delay will be produced before the output
is produced.  To compare the differences in group delay between the “push model”
and “pull model” implementation, a measurement was made.
The results are captured in the following two graphs.&lt;/p&gt;
&lt;p&gt;Based on the first graph, the “pull model” implementation with the size
of the circular buffer of 4096 frames produces a lower latency than
the “push model” even with the latency produced before the output data.
Simultaneously, the delay between dynamic Pitch changes is in a smaller range.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Push and pull model group delay comparison&lt;/em&gt;
&lt;img alt="Pitch Shift effect graph - Push and pull model group delay comparison" src="////mixxx.acolombier.dev/images/news/pitch-shift-effect-graph-1.svg"&gt;&lt;/p&gt;
&lt;p&gt;In the second graph, the group delay for the unchanged pitch was measured.
The differences in the measurements are, that the previous pitch values
before the unchanged pitch settings are different. With the results
of the last measurement, the “pull model” implementation is more stable
and produces a similar, almost constant delay after dynamic pitch changes
for the same pitch setting.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Push and pull model group delay comparison for unchanged pitch&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pitch Shift effect graph - Push and pull model group delay comparison
for unchanged pitch" src="////mixxx.acolombier.dev/images/news/pitch-shift-effect-graph-2.svg"&gt;&lt;/p&gt;
&lt;p&gt;The results of the measurements clearly show, that despite the “pull model”
implementation for the Pitch Shift effect in the effect chain is not optimal,
it should be preferred over the “push model” implementation.&lt;/p&gt;
&lt;h4&gt;Testing and benchmarking&lt;/h4&gt;
&lt;p&gt;With the implementation of the &lt;code&gt;EngineEffectsDelay&lt;/code&gt; for Group Delay handling
and the &lt;code&gt;RingDelayBuffer&lt;/code&gt; as an optimized data structure for the same use case,
the tests were included with the use of the &lt;a href="https://github.com/google/googletest"&gt;GoogleTest framework&lt;/a&gt;. Basically, the common situations were
tested, then extreme cases and cases that are not allowed but have to be handled
for the release builds. On the basis that these implemented structures
are critical from the point of view of performance, with tests, the benchmarks
were created with the use of the &lt;a href="https://github.com/google/benchmark"&gt;Google Benchmark&lt;/a&gt;. Based on the results of benchmarks,
the used functions and algorithms were compared. After both of the mentioned
structures were implemented, tested and optimized, the &lt;code&gt;RingDelayBuffer&lt;/code&gt;
was introduced in the &lt;code&gt;EngineEffectsDelay&lt;/code&gt; as an inner structure
for the Group Delay handling. Based on the changes and use of optimized
data structure the performance has highly improved. The performance differences
are shown in the following benchmarks results taken over
from the Ubuntu GitHub CI’s results.&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;Without RingDelayBuffer&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;Run on (2 X 2593.91 MHz CPU s)&lt;br&gt;
CPU Caches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L1 Data 32 KiB (x2)&lt;/li&gt;
&lt;li&gt;L1 Instruction 32 KiB (x2)&lt;/li&gt;
&lt;li&gt;L2 Unified 1024 KiB (x2)&lt;/li&gt;
&lt;li&gt;L3 Unified 36608 KiB (x1)&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;Iterations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BM_ZeroDelay/64&lt;/td&gt;
&lt;td&gt;260 ns&lt;/td&gt;
&lt;td&gt;260 ns&lt;/td&gt;
&lt;td&gt;2690728&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_ZeroDelay/512&lt;/td&gt;
&lt;td&gt;2079 ns&lt;/td&gt;
&lt;td&gt;2078 ns&lt;/td&gt;
&lt;td&gt;336963&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_ZeroDelay/4096&lt;/td&gt;
&lt;td&gt;16616 ns&lt;/td&gt;
&lt;td&gt;16614 ns&lt;/td&gt;
&lt;td&gt;42139&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelaySmallerThanBufferSize/64&lt;/td&gt;
&lt;td&gt;269 ns&lt;/td&gt;
&lt;td&gt;269 ns&lt;/td&gt;
&lt;td&gt;2600146&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelaySmallerThanBufferSize/512&lt;/td&gt;
&lt;td&gt;2119 ns&lt;/td&gt;
&lt;td&gt;2119 ns&lt;/td&gt;
&lt;td&gt;330263&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelaySmallerThanBufferSize/4096&lt;/td&gt;
&lt;td&gt;16978 ns&lt;/td&gt;
&lt;td&gt;16977 ns&lt;/td&gt;
&lt;td&gt;40822&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayGreaterThanBufferSize/64&lt;/td&gt;
&lt;td&gt;269 ns&lt;/td&gt;
&lt;td&gt;269 ns&lt;/td&gt;
&lt;td&gt;2597728&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayGreaterThanBufferSize/512&lt;/td&gt;
&lt;td&gt;2125 ns&lt;/td&gt;
&lt;td&gt;2125 ns&lt;/td&gt;
&lt;td&gt;329431&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayGreaterThanBufferSize/4096&lt;/td&gt;
&lt;td&gt;16979 ns&lt;/td&gt;
&lt;td&gt;16978 ns&lt;/td&gt;
&lt;td&gt;40976&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayCrossfading/64&lt;/td&gt;
&lt;td&gt;608 ns&lt;/td&gt;
&lt;td&gt;608 ns&lt;/td&gt;
&lt;td&gt;1151956&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayCrossfading/512&lt;/td&gt;
&lt;td&gt;4865 ns&lt;/td&gt;
&lt;td&gt;4865 ns&lt;/td&gt;
&lt;td&gt;143875&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayCrossfading/4096&lt;/td&gt;
&lt;td&gt;40081 ns&lt;/td&gt;
&lt;td&gt;40079 ns&lt;/td&gt;
&lt;td&gt;17621&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayNoCrossfading/64&lt;/td&gt;
&lt;td&gt;539 ns&lt;/td&gt;
&lt;td&gt;539 ns&lt;/td&gt;
&lt;td&gt;1298494&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayNoCrossfading/512&lt;/td&gt;
&lt;td&gt;4238 ns&lt;/td&gt;
&lt;td&gt;4238 ns&lt;/td&gt;
&lt;td&gt;165164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayNoCrossfading/4096&lt;/td&gt;
&lt;td&gt;33939 ns&lt;/td&gt;
&lt;td&gt;33936 ns&lt;/td&gt;
&lt;td&gt;20622&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5&gt;&lt;em&gt;With RingDelayBuffer&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;Run on the same system as above.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;Iterations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BM_ZeroDelay/64&lt;/td&gt;
&lt;td&gt;14.3 ns&lt;/td&gt;
&lt;td&gt;14.3 ns&lt;/td&gt;
&lt;td&gt;48804839&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_ZeroDelay/512&lt;/td&gt;
&lt;td&gt;84.7 ns&lt;/td&gt;
&lt;td&gt;84.7 ns&lt;/td&gt;
&lt;td&gt;8291923&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_ZeroDelay/4096&lt;/td&gt;
&lt;td&gt;510 ns&lt;/td&gt;
&lt;td&gt;510 ns&lt;/td&gt;
&lt;td&gt;1345199&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelaySmallerThanBufferSize/64&lt;/td&gt;
&lt;td&gt;21.7 ns&lt;/td&gt;
&lt;td&gt;21.7 ns&lt;/td&gt;
&lt;td&gt;32209113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelaySmallerThanBufferSize/512&lt;/td&gt;
&lt;td&gt;108 ns&lt;/td&gt;
&lt;td&gt;108 ns&lt;/td&gt;
&lt;td&gt;6460461&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelaySmallerThanBufferSize/4096&lt;/td&gt;
&lt;td&gt;1627 ns&lt;/td&gt;
&lt;td&gt;1627 ns&lt;/td&gt;
&lt;td&gt;429938&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayGreaterThanBufferSize/64&lt;/td&gt;
&lt;td&gt;21.9 ns&lt;/td&gt;
&lt;td&gt;21.9 ns&lt;/td&gt;
&lt;td&gt;31799348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayGreaterThanBufferSize/512&lt;/td&gt;
&lt;td&gt;108 ns&lt;/td&gt;
&lt;td&gt;108 ns&lt;/td&gt;
&lt;td&gt;6471893&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayGreaterThanBufferSize/4096&lt;/td&gt;
&lt;td&gt;1625 ns&lt;/td&gt;
&lt;td&gt;1624 ns&lt;/td&gt;
&lt;td&gt;435414&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayCrossfading/64&lt;/td&gt;
&lt;td&gt;153 ns&lt;/td&gt;
&lt;td&gt;153 ns&lt;/td&gt;
&lt;td&gt;4596623&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayCrossfading/512&lt;/td&gt;
&lt;td&gt;841 ns&lt;/td&gt;
&lt;td&gt;841 ns&lt;/td&gt;
&lt;td&gt;832905&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayCrossfading/4096&lt;/td&gt;
&lt;td&gt;9451 ns&lt;/td&gt;
&lt;td&gt;9450 ns&lt;/td&gt;
&lt;td&gt;73944&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayNoCrossfading/64&lt;/td&gt;
&lt;td&gt;44.1 ns&lt;/td&gt;
&lt;td&gt;44.1 ns&lt;/td&gt;
&lt;td&gt;15865504&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayNoCrossfading/512&lt;/td&gt;
&lt;td&gt;209 ns&lt;/td&gt;
&lt;td&gt;209 ns&lt;/td&gt;
&lt;td&gt;3345740&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_DelayNoCrossfading/4096&lt;/td&gt;
&lt;td&gt;3236 ns&lt;/td&gt;
&lt;td&gt;3235 ns&lt;/td&gt;
&lt;td&gt;215491&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_WriteReadWholeBufferNoDelay/64&lt;/td&gt;
&lt;td&gt;714 ns&lt;/td&gt;
&lt;td&gt;715 ns&lt;/td&gt;
&lt;td&gt;978487&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_WriteReadWholeBufferNoDelay/512&lt;/td&gt;
&lt;td&gt;796 ns&lt;/td&gt;
&lt;td&gt;797 ns&lt;/td&gt;
&lt;td&gt;878388&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_WriteReadWholeBufferNoDelay/4096&lt;/td&gt;
&lt;td&gt;1594 ns&lt;/td&gt;
&lt;td&gt;1628 ns&lt;/td&gt;
&lt;td&gt;429600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_WriteReadWholeBufferDelay/64&lt;/td&gt;
&lt;td&gt;714 ns&lt;/td&gt;
&lt;td&gt;715 ns&lt;/td&gt;
&lt;td&gt;978692&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_WriteReadWholeBufferDelay/512&lt;/td&gt;
&lt;td&gt;795 ns&lt;/td&gt;
&lt;td&gt;796 ns&lt;/td&gt;
&lt;td&gt;878389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_WriteReadWholeBufferDelay/4096&lt;/td&gt;
&lt;td&gt;1500 ns&lt;/td&gt;
&lt;td&gt;1528 ns&lt;/td&gt;
&lt;td&gt;457952&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_MemCpy/64&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;174373476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_MemCpy/512&lt;/td&gt;
&lt;td&gt;33.0 ns&lt;/td&gt;
&lt;td&gt;33.0 ns&lt;/td&gt;
&lt;td&gt;21221060&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_MemCpy/4096&lt;/td&gt;
&lt;td&gt;154 ns&lt;/td&gt;
&lt;td&gt;154 ns&lt;/td&gt;
&lt;td&gt;4535488&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_StdCpy/64&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;152600697&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_StdCpy/512&lt;/td&gt;
&lt;td&gt;32.1 ns&lt;/td&gt;
&lt;td&gt;32.1 ns&lt;/td&gt;
&lt;td&gt;21839231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_StdCpy/4096&lt;/td&gt;
&lt;td&gt;158 ns&lt;/td&gt;
&lt;td&gt;158 ns&lt;/td&gt;
&lt;td&gt;4418188&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_SampleUtilCopy/64&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;174349198&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_SampleUtilCopy/512&lt;/td&gt;
&lt;td&gt;33.0 ns&lt;/td&gt;
&lt;td&gt;33.0 ns&lt;/td&gt;
&lt;td&gt;21194709&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_SampleUtilCopy/4096&lt;/td&gt;
&lt;td&gt;154 ns&lt;/td&gt;
&lt;td&gt;154 ns&lt;/td&gt;
&lt;td&gt;4515069&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_Copy2WithGain/64&lt;/td&gt;
&lt;td&gt;8.03 ns&lt;/td&gt;
&lt;td&gt;8.03 ns&lt;/td&gt;
&lt;td&gt;87167131&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_Copy2WithGain/512&lt;/td&gt;
&lt;td&gt;64.2 ns&lt;/td&gt;
&lt;td&gt;64.2 ns&lt;/td&gt;
&lt;td&gt;10889704&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_Copy2WithGain/4096&lt;/td&gt;
&lt;td&gt;823 ns&lt;/td&gt;
&lt;td&gt;823 ns&lt;/td&gt;
&lt;td&gt;847146&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_Copy2WithRampingGain/64&lt;/td&gt;
&lt;td&gt;15.6 ns&lt;/td&gt;
&lt;td&gt;15.6 ns&lt;/td&gt;
&lt;td&gt;44785697&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_Copy2WithRampingGain/512&lt;/td&gt;
&lt;td&gt;116 ns&lt;/td&gt;
&lt;td&gt;116 ns&lt;/td&gt;
&lt;td&gt;6011618&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BM_Copy2WithRampingGain/4096&lt;/td&gt;
&lt;td&gt;1113 ns&lt;/td&gt;
&lt;td&gt;1113 ns&lt;/td&gt;
&lt;td&gt;629003&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Demo video&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;The video with a couple of examples of Pitch Shift effect possible usage&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="NTjV7s5Jb_o"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=NTjV7s5Jb_o"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h4&gt;Challenges&lt;/h4&gt;
&lt;p&gt;Several problems arose during the coding period.
Despite the medium project size, it was needed to spend much more time
working on the project based on the issues. I think the biggest challenge
in this project was exactly the implementation of the Pitch Shift effect
using the RubberBand library. The issue occurred soon, that the effect chain
offers the effect to work only with the fixed size audio chunks. Based on that,
it is not possible to require an amount of input audio data as needed
for the RubberBand library “pull model” implementation.
The &lt;a href="https://www.surina.net/soundtouch/"&gt;SoundTouch library&lt;/a&gt; for Pitch Shifting
was tested too but produced results with worse audio quality and with the same
amount of delay. Based on all the discussions, the RubberBand library has shown
as the best option for the effect, despite the issues which are associated
with it. After that, the Mixxx application did not have implemented the effects
delay handler for the effect chain, so, the implementation of this structure
was automatically needed. Based on that, the goals of the project were changed.
The original proposal contained the Pitch Shift effect, and with that
as a project extension to the project requirements of the Mixxx organization,
the Auto-tune effect was proposed. After consideration, the Zulip chat survey
for other Mixxx developers and users was created to be able to vote for possible
project extensions. Based on the survey results, the project extension goal
was changed to the implementation and optimization of the Group Delay handling
for the effect chain to improve the performance of the Pitch Shift effect
for the Dry/Wet and Dry+Wet modes. As the last challenge, I would like to mention
the usage of the &lt;code&gt;std::span&lt;/code&gt; from the standard library which is supported
by C++20. Because the Mixxx organization adheres to its own
&lt;a href="https://github.com/mixxxdj/mixxx/wiki/Minimum%20requirements%20policy"&gt;Minimum requirements policy&lt;/a&gt;
for the Ubuntu LTS, the &lt;a href="https://github.com/mixxxdj/mixxx/pull/4810"&gt;mixxx#4810&lt;/a&gt;
and the &lt;a href="https://github.com/mixxxdj/mixxx/pull/4852"&gt;mixxx#4852&lt;/a&gt; pull requests
could be merged after the official Ubuntu release was announced in the middle
of August due to support of C++20.&lt;/p&gt;
&lt;h4&gt;Pull requests and issues&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4775"&gt;mixxx#4775&lt;/a&gt;
- PitchShiftEffect: add independent effect&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The PR adds an independent effect to Mixxx's built-in effects.
The implementation uses the &lt;a href="https://breakfastquay.com/rubberband/"&gt;RubberBand library&lt;/a&gt; for changing a pitch
of an input track. The effect works in real-time mode and adheres
to the “push model” implementation. That means that the input data are offered
to the RubberBand instead of that the library requires the amount
of input data.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4810"&gt;mixxx#4810&lt;/a&gt;
- EngineEffectsDelay: effect chain delay handling&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR adds the structure for the Group Delay handling of the effect chain.
Based on that, some effects can produce latency due to their inner processing.
The latency has to be handled for the Dry/Wet and Dry+Wet modes that the dry
and wet signals overlapped. The structure for delay reporting from the effects
into the effect chain was implemented. With that, the dry signal delaying
to overlap with the wet signal was implemented as well. Because it is
a critical part of the application engine performance, the tests and benchmarks
were included in the development.&lt;/p&gt;
&lt;p&gt;In this PR, the &lt;code&gt;std::span&lt;/code&gt; was newly introduced into the Mixxx software code
with the design proposal and cooperation of my mentor. The util for working
with spans was implemented, so other developers can easily work with spans
directly from the custom Mixxx data structures. With that, the Mixxx code
is being upgraded using the &lt;a href="https://en.cppreference.com/w/cpp/20"&gt;C++20 standard&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4848"&gt;mixxx#4848&lt;/a&gt;
- Fix EngineDelay and EngineFilterDelay modulo calculation documentation&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Based on the code changes in the &lt;code&gt;EngineEffectsDelay&lt;/code&gt; and discussion
with my mentor, the explanation commentary was added to two other Mixxx
structures working on a quite similar principle.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4852"&gt;mixxx#4852&lt;/a&gt;
- RingDelayBuffer: ring buffer for delay handling&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;During the creation of the &lt;code&gt;EngineEffectsDelay&lt;/code&gt; for the Group Delay handling
of the effect chain, it was suggested to create an optimized data structure
for the inner processing based on the ring buffer. This widely-known
signal processing structure was improved and optimized specifically
for the use case with handling of delay. Again, tests and benchmarks
were created for the &lt;code&gt;RingDelayBuffer&lt;/code&gt; and based on benchmarks results the used
data copy functions were compared.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/vcpkg/pull/48"&gt;vcpkg#48&lt;/a&gt;
- [rubberband] add overlaid rubberband v3&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;During the coding period, the new RubberBand library release v3.0.0
was announced. Based on the implementation for adding RubberBand v2.0.2 directly
into the microsoft / vcpkg repository by the Mixxx organization developer,
the RubberBand v3.0.0 was added to the overlaid ports in the Mixxx fork
of the original repository.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4869"&gt;mixxx#4869&lt;/a&gt;
- EngineFilterDelay: clamp wrong delay values&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While working on &lt;a href="https://github.com/mixxxdj/mixxx/pull/4810"&gt;mixxx#4810&lt;/a&gt;,
I encountered a bug in the &lt;code&gt;EngineFilterDelay&lt;/code&gt; structure: The structure
works in a similar way but for a little different use case.
Newly the unacceptably huge delay values are clamped in the setter, so,
based on the inner calculation the structure will not produce absolutely wrong
output. The PR was merged the same day as its creation.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4898"&gt;mixxx#4898&lt;/a&gt;
- PitchShiftEffect: decrease and report latency&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Draft (WIP), last GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/4898/commits/146f104e0e3d544178428f12f2f0c295b4545966"&gt;146f104&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this draft PR was worked as another project extension. The implemented “push”
way model is extended into the “pull” model instead. The new approach decreases
the effect latency and this latency is reported in the effect chain
delay handler. This PR is still a "Work In Progress". As the last work done
the latency measurements were performed for several implementations
and for different pitch settings. The measured data was plotted
for demonstration. The new implementation was accepted and the PR will be done
in the non-GSoC time as a future Mixxx contributor. With the new implementation,
the Mixxx circular buffer data structure was improved and optimized
for performance. So, it remains to finish the pull implementation by setting
the right size of the input ring buffer.  Eventually, implement the input
ring buffer size depending on the range that was set. As the last thing,
the valid delay value propagation for the effect will be finished.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/4901"&gt;mixxx#4901&lt;/a&gt;
- PitchShiftEffect: extend effect options&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The PR extends options of the Pitch Shift effect. The Range knob is added
to the setting of the range of the Pitch knob. These two knobs work similarly
to the real professional Pioneer DJM-900NX2 mixer which is widely used
in clubs for live DJ mixing. With that, the Semitones mode toggle was added
for changing the scale of the Pitch knob.  By default, this toggle is on,
and the Pitch knob works in the Semitones mode. In musical terminology,
the pitch is changed based on the semitone chromatic scale. If the toggle
is off, the Pitch knob works in the Continuous mode, which is also the default
in the RubberBand library. At last, the Formant preserving option was added
which works with the namesake RubberBand library option. It preserves
the resonant frequencies (formants) of the human vocal tract
and other instruments (compensates for “chipmunk” or “growling” voices).
With the PR, the new function for the calculation of the &lt;a href="https://en.wikipedia.org/wiki/Sign_function"&gt;Sign function&lt;/a&gt; was added
to the Mixxx util for math operations.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10827"&gt;mixxx#10827&lt;/a&gt;
- Improve buffers size function const-correctness&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This PR improves Mixxx’s buffers data structures by using the C++ constant
expressions for the size function.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/issues/10832"&gt;mixxx#10832&lt;/a&gt;
- EngineEffect: invalid engine parameters handed over into an effect&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;During the work on the Pitch Shift effect, it was figured out, that the actual
parameter settings are not propagated into the effects. The maximum
possible values are used instead and based on that, some newly added effects
can work wrong, based on the invalid values for sample rate or size
of the buffer, for example.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10835"&gt;mixxx#10835&lt;/a&gt;
- EngineBufferScaleRubberBand: remove unused include&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The unused include was removed from the implemented Mixxx structure.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10840"&gt;mixxx#10840&lt;/a&gt;
- EngineEffectsDelay: introduce ring delay buffer&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Open (WIP), last (non-failing) GSoC commit: &lt;a href="https://github.com/mixxxdj/mixxx/pull/10840/commits/0c01e340f43386155896f56333e608695d407677"&gt;0c01e34&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The implemented optimized ring buffer data structure for delay handling is built
into the effect chain handling structure. With the use of the new
data structure, the delay handling performance is highly improved based on
the benchmark measurements. Unfortunately, the PR was not merged during
the coding period due to a failing test for the macOS CI (based on the inner
rounding problem for zero value). At the same time, Mixxx's macOS CI
started crashing during the configuration stage because of an issue
that the workflow runner has changed. For that reason, the bug fix
couldn't be tested and the PR was not merged in time. After the bug fix
will be able to test on macOS CI and will pass, this PR is ready for merging.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10843"&gt;mixxx#10843&lt;/a&gt;
- RingDelayBufferTest: refactor includes and span creation&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The tests for the &lt;code&gt;RingDelayBuffer&lt;/code&gt; are refactored and the span creations
are deduplicated.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/mixxx/pull/10858"&gt;mixxx#10858&lt;/a&gt;
- PitchShiftEffect: add description comments&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Added the comments for the Pitch Shift effect processing.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://github.com/mixxxdj/website/pull/279"&gt;website#279&lt;/a&gt;
- content/news: add GSoC 2022 Work Product&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Status: Merged&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Adds a blog post containing the &lt;em&gt;"Work Product"&lt;/em&gt; for Google Summer of Code 2022
on the Mixxx website.&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;Future work&lt;/h4&gt;
&lt;p&gt;Concretely for the Pitch Shift effect, the effect will be improved
using the “pull model” implementation after the end of the GSoC period.
With that, the Dry/Wet and Dry+Wet modes will be done for the effect too.
As the next project extensions, based on the survey, the following options
or features can be added to the Pitch Shift effect implementation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auto-tune effect&lt;/li&gt;
&lt;li&gt;A piano keyboard interface&lt;/li&gt;
&lt;li&gt;Optimize interface for common controllers&lt;/li&gt;
&lt;li&gt;CPU load balancing&lt;/li&gt;
&lt;li&gt;Consider interaction with the main Pitch Shifter&lt;/li&gt;
&lt;li&gt;Expose compensation delay as additional parameter for making
 funny things without extra CPU cycles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More widely, as the future work for the Mixxx software, the wider support
for the &lt;a href="https://lv2plug.in/"&gt;LV2 standard&lt;/a&gt; for effects can be implemented or better, the &lt;a href="https://kx.studio/Applications:Carla"&gt;Carla
audio plugin host&lt;/a&gt; can be introduced
in the Mixxx application. It will allow users to use their favorite effects
enabled via audio plugin standards such as LADSPA, DSSI, LV2, VST2, VST3
and so on, in the application instead of offering only the built-in effects
or poor API for the LV2 standard. After consultation with my mentor, we agreed,
that I can take on this task as a regular Mixxx contributor after the end
of GSoC.&lt;/p&gt;
&lt;h4&gt;Things I learned from GSoC&lt;/h4&gt;
&lt;p&gt;I don't think I can even express how much the GSoC experience has given me.
Even though I had the experience with open source in one small project,
the workflow and development for the greater organization as Mixxx
was completely different and gives me a lot. I have learned so many cool things
about audio processing, development in C++ with the best practices,
using the new C++20 standard, testing and benchmarking with the use
of Google frameworks, and improving my knowledge with &lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt; and approaches to open source development in general.
Thanks to the change in the proposed project extension, I learned a lot about
real-time audio signal processing and about cool data structures. I had a chance
to try to design the data structure with extensions too. I am really glad about
the plan change now. I really improved my English, both, written and spoken.
I think, that it was the best experience so far for me as a developer
I ever had. It is awesome, that I can publish my work and have immediately
the feedback and proposed improvements. With that, I liked the open source
development to just how much I can learn from the awesome people and create new
cool stuff. Despite I’m a college student, this actually missed me a lot,
to just have feedback on my work which opens me the opportunities to learn.
I really felt that I’m a part of the community. I will be happy to continue
being part of the Mixxx organization and contributing to open source.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;The wished new effect was implemented, and the issue which requested
this new feature was closed with the "Fix Committed" status.  All requirements
by the Mixxx organization in their project idea, on which the project proposal
was based, were met. Thanks to enough time in the GSoC Coding period was worked
on the project extensions. Based on the situation and the importance of new
Mixxx features, the originally proposed extension was replanned and changed.
The new Group Delay handling structure was successfully implemented
and optimized with the implementation of the extended data structure.
In the GSoC Coding period, work was started to minimize the effects latency as
well as to polish the effect even more. Unfortunately, that work could
not be finished before the GSoC deadline.&lt;/p&gt;
&lt;p&gt;During the coding period, I lined up among the top Mixxx contributors
for the last month, with 61 commits authored, and I became
the 27th of 238 contributors for the Mixxx software, with 119 commits
in total.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;August 2022 contributors - mixxxdj/mixxx&lt;/em&gt;
&lt;img alt="August 2022 contributors insight - mixxxdj/mixxx" src="////mixxx.acolombier.dev/images/news/august-2022-contributors.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Contributor summary - mixxxdj/mixxx&lt;/em&gt;
&lt;img alt="Contributor summary insight - mixxxdj/mixxx" src="////mixxx.acolombier.dev/images/news/contributor-summary.png"&gt;&lt;/p&gt;
&lt;h4&gt;Acknowledgements&lt;/h4&gt;
&lt;p&gt;First, I would like to many thank my mentor &lt;a href="////mixxx.acolombier.dev/news/author/nikolaus-einhauser"&gt;@Swiftb0y&lt;/a&gt; for his guidance, help, reviews, and a lot of new
information and lessons he gave me during the summer. I'm just motivated
and learned a lot. I would like to thank the Mixxx organization developer
&lt;a href="////mixxx.acolombier.dev/news/author/daniel-schurmann"&gt;@Daniel Schürmann&lt;/a&gt; for his help, reviews
and active contributions with new ideas and improvements to my project
and pull requests. Thank you both for involving me in the Mixxx development
process and for constructive criticism which offers me learn many new things
in the past weeks. I would like to thank my summer colleague for the Mixxx
organization and friend &lt;a href="https://github.com/fatihemreyildiz"&gt;@Fatih Emre&lt;/a&gt;
for his help and synergy on the final blog post structure and chapters.
Of course, I would like to thank all Mixxx developers for welcoming me
into the Mixxx family and for their help. I would like to continue our
cooperation after GSoC end as Mixxx developers. I look forward to our future
teamwork. Many thanks to the Google Summer of Code team they made this amazing
experience possible for me.&lt;/p&gt;
&lt;h4&gt;Resources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://summerofcode.withgoogle.com/"&gt;https://summerofcode.withgoogle.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.launchpad.net/mixxx/+bug/1299035"&gt;https://bugs.launchpad.net/mixxx/+bug/1299035&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.focusrite.com/hc/en-gb/articles/115004120965-Sample-Rate-Bit-Depth-Buffer-Size-Explained"&gt;https://support.focusrite.com/hc/en-gb/articles/115004120965-Sample-Rate-Bit-Depth-Buffer-Size-Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/coreaudiotypes/audiobuffer"&gt;https://developer.apple.com/documentation/coreaudiotypes/audiobuffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://breakfastquay.com/rubberband/"&gt;https://breakfastquay.com/rubberband/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.cppreference.com/w/cpp/20"&gt;https://en.cppreference.com/w/cpp/20&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sign_function"&gt;https://en.wikipedia.org/wiki/Sign_function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.surina.net/soundtouch/"&gt;https://www.surina.net/soundtouch/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kx.studio/Applications:Carla"&gt;https://kx.studio/Applications:Carla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2plug.in/"&gt;https://lv2plug.in/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/googletest"&gt;https://github.com/google/googletest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/benchmark"&gt;https://github.com/google/benchmark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;https://git-scm.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Wikipedia, Pitch shift, Modified: 6 June 2022,
Accessed 2 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Pitch_shift"&gt;https://en.wikipedia.org/wiki/Pitch_shift&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Wikipedia, Pitch (music), Modified: 6 Sept. 2022,
Accessed: 7 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Pitch_(music)"&gt;https://en.wikipedia.org/wiki/Pitch_(music)&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Wikipedia, Scale (music), Modified: 13 July 2022,
Accessed 1 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Scale_(music)"&gt;https://en.wikipedia.org/wiki/Scale_(music)&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Wikipedia, Octave, Modified: 18 June 2022,
Accessed 1 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Octave"&gt;https://en.wikipedia.org/wiki/Octave&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Wikipedia, Interval (music), Modified: 6 Sept. 2022,
Accessed: 7 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Interval_(music)"&gt;https://en.wikipedia.org/wiki/Interval_(music)&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;Dan Farrant, A Guide To Semitones &amp;amp; Tones (Half &amp;amp; Whole Steps),
Modified: 25 June 2022, Accessed: 2 Sept. 2022, Retrieved from:
&lt;a href="https://hellomusictheory.com/learn/semitones-tones/"&gt;https://hellomusictheory.com/learn/semitones-tones/&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:6" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;Wikipedia, Chromatic scale, Modified: 15 March 2022,
Accessed: 1 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Chromatic_scale"&gt;https://en.wikipedia.org/wiki/Chromatic_scale&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:7" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:8"&gt;
&lt;p&gt;Celine, Difference Between Wet and Dry Signals or Sounds,
Modified: 22 Feb. 2012, Accessed: 3 Sept. 2022, Retrieved from:
&lt;a href="http://www.differencebetween.net/technology/difference-between-wet-and-dry-signals-or-sounds/"&gt;http://www.differencebetween.net/technology/difference-between-wet-and-dry-signals-or-sounds/&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:8" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:9"&gt;
&lt;p&gt;Wikipedia, Circular buffer, Modified: 29 Oct. 2018,
Accessed: 2 Sept. 2022, Retrieved from:
&lt;a href="https://en.wikipedia.org/wiki/Circular_buffer"&gt;https://en.wikipedia.org/wiki/Circular_buffer&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:9" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:10"&gt;
&lt;p&gt;Audio Modeling,  Grow Your Knowledge, Accessed: 3 Sept. 2022,
Retrieved from:
&lt;a href="https://kb.audiomodeling.com/en/c/grow-your-knowledge/d/what-is-audio-latency-how-do-i-fix-latency-issues-while-recording/"&gt;https://kb.audiomodeling.com/en/c/grow-your-knowledge/d/what-is-audio-latency-how-do-i-fix-latency-issues-while-recording/&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:10" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;a class="footnote-backref" href="#fnref2:10" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:11"&gt;
&lt;p&gt;NTi Audio, Latency in Audio Systems, Modified: 10 March 2021,
Accessed: 7 Sept. 2022, Retrieved from:
&lt;a href="https://www.nti-audio.com/en/news/latency-in-audio-systems"&gt;https://www.nti-audio.com/en/news/latency-in-audio-systems&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:11" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;a class="footnote-backref" href="#fnref2:11" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:12"&gt;
&lt;p&gt;Adobe, Sample rates and audio sampling: a guide for beginners,
Accessed: 8 Sept. 2022, Retrieved from:
&lt;a href="https://www.adobe.com/uk/creativecloud/video/discover/audio-sampling.html"&gt;https://www.adobe.com/uk/creativecloud/video/discover/audio-sampling.html&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:12" title="Jump back to footnote 12 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2022"></category></entry><entry><title>Migrated to GitHub Issues</title><link href="//mixxx.acolombier.dev/news/2022-08-24-github-issues-migration" rel="alternate"></link><published>2022-08-24T15:19:17+02:00</published><updated>2022-08-24T15:19:17+02:00</updated><author><name>Nikolaus Einhauser</name></author><id>tag:mixxx.acolombier.dev,2022-08-24:/news/2022-08-24-github-issues-migration</id><summary type="html">&lt;p&gt;Yes everybody, we officially moved our bug tracking away from Launchpad to
GitHub. If you've never tried to report a bug in Mixxx or wanted to contribute
in other ways, it's very likely you have no idea what this post is about, but if
you do it's even better. No …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yes everybody, we officially moved our bug tracking away from Launchpad to
GitHub. If you've never tried to report a bug in Mixxx or wanted to contribute
in other ways, it's very likely you have no idea what this post is about, but if
you do it's even better. No matter if you do or don't, keep reading.&lt;/p&gt;
&lt;p&gt;The Mixxx team has traditionally been using Canonical's (the makers of Ubuntu)
Launchpad platform for hosting their code, managing bug reports and releases.
Over the years, Launchpad has become increasingly dated, lack of modern
features, old UI, and bad user experience is the primary reason why many people
(myself included), stay away from Launchpad. Especially for new contributors the
mandatory Ubuntu One account was another reason for not to immediately report a
bug when they encountered it.&lt;/p&gt;
&lt;p&gt;We've started transitioning away from Launchpad quite a while ago:&lt;br&gt;
Back in 2013 we have transitioned from the Bazaar version control system to Git
and moved our &lt;code&gt;main&lt;/code&gt; branch to GitHub. At that point in time, GitHub issues
where not yet suitable for managing our bugfix and release workflow, thus bug
reports continued to be handled on Launchpad. This has progressively changed
over the past couple of years, now GitHub has a "duplicate issue" detection
feature, can organize bugs in projects and the labeling feature is flexible
enough to fulfill most of our needs.&lt;/p&gt;
&lt;p&gt;Going forward, Launchpad will only be used for publishing to our Ubuntu PPA.
Hence no contributor outside of the core team will have to bother with Launchpad
again.&lt;/p&gt;
&lt;p&gt;Shortly before starting the migration, we made our Launchpad bug tracker
read-only (some of you might have noticed that and/or have seen our heads-up
post). The migration took about 50 Hours. All of the existing messages were
copied to GitHub including links to any attachments and patches uploaded as part
of message. We also carry over the state of a bug by mapping them to Github
issue Labels:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Launchpad&lt;/th&gt;
&lt;th&gt;GitHub&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Confirmed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;confirmed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix Committed&lt;/td&gt;
&lt;td&gt;&lt;em&gt;close issue&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix Released&lt;/td&gt;
&lt;td&gt;&lt;em&gt;close issue&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incomplete&lt;/td&gt;
&lt;td&gt;&lt;code&gt;incomplete&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In Progress&lt;/td&gt;
&lt;td&gt;&lt;em&gt;no label&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invalid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;invalid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New&lt;/td&gt;
&lt;td&gt;&lt;em&gt;no label&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triaged&lt;/td&gt;
&lt;td&gt;&lt;code&gt;confirmed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Won't Fix&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wontfix&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;party stopper&lt;/code&gt;,  &lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Undecided&lt;/td&gt;
&lt;td&gt;&lt;em&gt;no label&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wishlist&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Since Mixxx is a project exclusively maintained by volunteers where each
volunteer is free to work on whatever they choose anyways, we decided to drop
the different priority levels assigned to issues.  &lt;/p&gt;
&lt;p&gt;I want to express a special thanks to our core team member
&lt;a href="////mixxx.acolombier.dev/news/author/jan-holthuis"&gt;@Holzhaus&lt;/a&gt; for writing a &lt;a href="https://gist.github.com/Holzhaus/ed384b93465dcc516ae205090e4f179b"&gt;custom import
script&lt;/a&gt; which
made this migration feasible in the first place.&lt;/p&gt;
&lt;p&gt;Due to the big number of bugs and the flood of related notifications, I have
noticed quickly that the script will likely hit various rate limits and spam
protection facilities.&lt;br&gt;
After getting in contact with GitHub via
Twitter they assembled
a team of engineers and FOSS experts to help us evaluate possible solutions.
Thanks to them, we were able to avoid email spam and reduce the time the import
took by two orders of magnitude.&lt;/p&gt;
&lt;h1&gt;What does this mean for existing contributors?&lt;/h1&gt;
&lt;p&gt;From today on, no more bug reports should be filed on Launchpad. Currently
ongoing discussions should be continued on GitHub instead. Note that any
comments made after 2022-08-22 12:00 UTC have not been migrated to GitHub.
Existing bug reporters need to create a GitHub account if they haven't already.&lt;/p&gt;
&lt;p&gt;Thank you everyone for your patience.&lt;/p&gt;</content><category term="news"></category><category term="infrastructure"></category><category term="development"></category><category term="contribute"></category></entry><entry><title>Bug Tracker Temporarily Unavailable</title><link href="//mixxx.acolombier.dev/news/2022-08-19-gh-issue-migration-downtime" rel="alternate"></link><published>2022-08-19T07:24:03+02:00</published><updated>2022-08-19T07:24:03+02:00</updated><author><name>Nikolaus Einhauser</name></author><id>tag:mixxx.acolombier.dev,2022-08-19:/news/2022-08-19-gh-issue-migration-downtime</id><summary type="html">&lt;p&gt;Hello Everybody.&lt;/p&gt;
&lt;p&gt;After thorough preparation, we're finally moving from Launchpad bugs to GitHub
issues. We'll publish a more detailed blogpost after the migration is done. For
now, We'd just like to let everybody know, that we will disable &lt;a href="https://bugs.launchpad.net/mixxx"&gt;our bug tracker
on launchpad&lt;/a&gt; sometime on Monday the 22nd of
August …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello Everybody.&lt;/p&gt;
&lt;p&gt;After thorough preparation, we're finally moving from Launchpad bugs to GitHub
issues. We'll publish a more detailed blogpost after the migration is done. For
now, We'd just like to let everybody know, that we will disable &lt;a href="https://bugs.launchpad.net/mixxx"&gt;our bug tracker
on launchpad&lt;/a&gt; sometime on Monday the 22nd of
August. Any activity on Launchpad after that point will not be carried over to
GitHub. Any already existing link to an issue on Launchpad will still continue
to work, but you will not be able to search for them on Launchpad anymore. Once
the migration has been completed, the more detailed blog post will be published
and you will be able to interact with the newly migrated issues on &lt;a href="https://github.com/mixxxdj/mixxx/issues"&gt;our GitHub
repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thank you all for your patience during the migration.&lt;/p&gt;</content><category term="news"></category><category term="infrastructure"></category><category term="development"></category><category term="contribute"></category></entry><entry><title>Mixxx 2.3.3 released</title><link href="//mixxx.acolombier.dev/news/2022-06-22-mixxx-2-3-3-released" rel="alternate"></link><published>2022-06-22T00:04:51+02:00</published><updated>2022-06-22T00:04:51+02:00</updated><author><name>Nikolaus Einhauser</name></author><id>tag:mixxx.acolombier.dev,2022-06-22:/news/2022-06-22-mixxx-2-3-3-released</id><summary type="html">&lt;p&gt;Its that time again!&lt;br&gt;
Almost a year after &lt;a href="////mixxx.acolombier.dev/news/2021-06-28-mixxx-2-3-0-released"&gt;the release of 2.3.0&lt;/a&gt;
we're bringing you the next bugfix release &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.3"&gt;Mixxx 2.3.3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release features - you guessed it - various bugfixes and improvements:
But since we're not your run-off-the-mill mobile app, we'll get a bit into
detail:&lt;/p&gt;
&lt;p&gt;A …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Its that time again!&lt;br&gt;
Almost a year after &lt;a href="////mixxx.acolombier.dev/news/2021-06-28-mixxx-2-3-0-released"&gt;the release of 2.3.0&lt;/a&gt;
we're bringing you the next bugfix release &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.3"&gt;Mixxx 2.3.3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release features - you guessed it - various bugfixes and improvements:
But since we're not your run-off-the-mill mobile app, we'll get a bit into
detail:&lt;/p&gt;
&lt;p&gt;A bunch of controller mappings have received various improvements,
such as the Pioneer DDJ-SB3, the NI Traktor S3, Behringer DDM4000 and Denon MC7000.
We've also addressed some long-standing bugs in our controller engine and the
Auto DJ, smoothed out the preference dialog and fixed a bunch of possibly
show-stopping bugs. 😬 😌&lt;/p&gt;
&lt;p&gt;As usual, we recommend you update to the &lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;newest stable version by visiting our
download page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in the detailed CHANGELOG, here you go 😉:&lt;/p&gt;
&lt;h2&gt;Changelog&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pioneer DDJ-SB3: Fix controller breaking when releasing the shift button &lt;a href="https://github.com/mixxxdj/mixxx/pull/4659"&gt;#4659&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S3: Push two deck switches to explicitly clone decks &lt;a href="https://github.com/mixxxdj/mixxx/pull/4665"&gt;#4665&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/4671"&gt;#4671&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1960680"&gt;lp:1960680&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Behringer DDM4000: Improve stability and add soft-takeover for encoder knobs &lt;a href="https://github.com/mixxxdj/mixxx/pull/4318"&gt;#4318&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/4799"&gt;#4799&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Denon MC7000: Fix 'inverted shift' bug in the controller mapping &lt;a href="https://github.com/mixxxdj/mixxx/pull/4755"&gt;#4755&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix spinback and break effect in the controller engine &lt;a href="https://github.com/mixxxdj/mixxx/pull/4708"&gt;#4708&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix scratch on first wheel touch &lt;a href="https://github.com/mixxxdj/mixxx/pull/4761"&gt;#4761&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1800343"&gt;lp:1800343&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Preferences: Prevent controller settings being treated as changed even though they were not &lt;a href="https://github.com/mixxxdj/mixxx/pull/4721"&gt;#4721&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1920844"&gt;lp:1920844&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix rare crash when closing the progress dialog &lt;a href="https://github.com/mixxxdj/mixxx/pull/4695"&gt;#4695&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Prevent preferences dialog from going out of screen &lt;a href="https://github.com/mixxxdj/mixxx/pull/4613"&gt;#4613&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix undesired jump-cuts in Auto DJ &lt;a href="https://github.com/mixxxdj/mixxx/pull/4693"&gt;#4693&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1948975"&gt;lp:1948975&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1893197"&gt;lp:1893197&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix bug that caused Auto DJ to stop playback after some time &lt;a href="https://github.com/mixxxdj/mixxx/pull/4698"&gt;#4698&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1893197"&gt;lp:1893197&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1961970"&gt;lp:1961970&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Do not reset crossfader when Auto DJ is deactivated &lt;a href="https://github.com/mixxxdj/mixxx/pull/4714"&gt;#4714&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/bugs/1965298"&gt;lp:1965298&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Change the minimum Auto DJ transition time to -99 &lt;a href="https://github.com/mixxxdj/mixxx/pull/4768"&gt;#4768&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1975552"&gt;lp:1975552&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Samplers, crates, playlists: fix storing import/export paths &lt;a href="https://github.com/mixxxdj/mixxx/pull/4699"&gt;#4699&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/bugs/1964508"&gt;lp:1964508&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library: keep hidden tracks in history &lt;a href="https://github.com/mixxxdj/mixxx/pull/4725"&gt;#4725&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Broadcasting: allow multiple connections to same mount if only one is enabled &lt;a href="https://github.com/mixxxdj/mixxx/pull/4750"&gt;#4750&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1972813"&gt;lp:1972813&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix a rare mouse vanish bug when controlling knobs &lt;a href="https://github.com/mixxxdj/mixxx/pull/4744"&gt;#4744&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1130794"&gt;lp:1130794&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1969278"&gt;lp:1969278&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Restore keylock from configuration and fix pitch ratio rounding issue &lt;a href="https://github.com/mixxxdj/mixxx/pull/4756"&gt;#4756&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1943180"&gt;lp:1943180&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve CSV export of playlists and crates and fix empty rating column &lt;a href="https://github.com/mixxxdj/mixxx/pull/4762"&gt;#4762&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix passthrough-related crash in waveform code &lt;a href="https://github.com/mixxxdj/mixxx/pull/4789"&gt;#4789&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/4791"&gt;#4791&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1959489"&gt;lp:1959489&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1977662"&gt;lp:1977662&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Passthrough: stop rendering waveforms and disable Cue/Play indicators &lt;a href="https://github.com/mixxxdj/mixxx/pull/4793"&gt;4793&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.3"></category><category term="release announcement"></category></entry><entry><title>Projects Announced for GSoC 2022</title><link href="//mixxx.acolombier.dev/news/2022-05-21-projects-announced-for-gsoc-2022" rel="alternate"></link><published>2022-05-21T16:51:39+02:00</published><updated>2022-05-21T16:51:39+02:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2022-05-21:/news/2022-05-21-projects-announced-for-gsoc-2022</id><summary type="html">&lt;p&gt;Google has accepted two contributor's projects for Mixxx as part of their &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code (GSoC)&lt;/a&gt;. GSoC is a stipend program that allows new contributors to work Mixxx on their own ~175 hours or ~350 hours project.&lt;/p&gt;
&lt;p&gt;This year &lt;a href="https://github.com/fatihemreyildiz"&gt;Fatih Emre YILDIZ&lt;/a&gt; and &lt;a href="https://github.com/davidchocholaty"&gt;David Chocholatý&lt;/a&gt; have been successful with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Google has accepted two contributor's projects for Mixxx as part of their &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code (GSoC)&lt;/a&gt;. GSoC is a stipend program that allows new contributors to work Mixxx on their own ~175 hours or ~350 hours project.&lt;/p&gt;
&lt;p&gt;This year &lt;a href="https://github.com/fatihemreyildiz"&gt;Fatih Emre YILDIZ&lt;/a&gt; and &lt;a href="https://github.com/davidchocholaty"&gt;David Chocholatý&lt;/a&gt; have been successful with their applications. Congratulations!&lt;/p&gt;
&lt;p&gt;David Chocholatý will implement a pitch shift and auto-tune effect, that will allow you to get creative with loops and samples for example by altering the pitch or even play melodies.&lt;/p&gt;
&lt;p&gt;Fatih Emre YILDIZ will add a track suggestion feature that fetches track suggestions from online sources. This information can then be used to make the random track selection in Auto Dj more reasonable or help the DJ to keep the crowd dancing even if he is out of ideas for a follow-up track.&lt;/p&gt;
&lt;p&gt;We will discuss the project details in our public &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt; so that anyone can follow their progress.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2022"></category></entry><entry><title>Russia's invasion of Ukraine</title><link href="//mixxx.acolombier.dev/news/2022-03-29-russians-war" rel="alternate"></link><published>2022-03-29T23:18:45+02:00</published><updated>2022-03-29T23:18:45+02:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2022-03-29:/news/2022-03-29-russians-war</id><summary type="html">&lt;p&gt;On 2022-02-24 we received horrible news from Ukraine, which has become even worse since then. As an organization committed to freedom we feel the urge speak up and show solidarity with Ukraine.&lt;/p&gt;
&lt;p&gt;Russia's invasion of Ukraine is unjustified and has already been condemned by the UN as a violation of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On 2022-02-24 we received horrible news from Ukraine, which has become even worse since then. As an organization committed to freedom we feel the urge speak up and show solidarity with Ukraine.&lt;/p&gt;
&lt;p&gt;Russia's invasion of Ukraine is unjustified and has already been condemned by the UN as a violation of international law. The attack creates endless suffering not only for the men, women and children of Ukraine but also for the many Russian soldiers who are sent into a senseless war that they do not want, do not understand and are not even allowed to call as such.&lt;/p&gt;
&lt;p&gt;Mixxx and the FOSS movement respect user freedom and stand for freedom in other ways as well, including freedom of speech and worldwide peaceful cooperation. As an expression of solidarity, we propose to include tracks by Ukrainian artists, Russian activists or anti-war tracks in general in our DJ sets. Although we are not able to stop this war, and we are not under the illusion that music alone will put an end to the suffering, however we think it is important to make our voices heard and support the various local or international efforts to help Ukrainians as much as we can.&lt;/p&gt;
&lt;p&gt;Here for instance three suitable tracks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=WLCiA38No3Y"&gt;Бетон - Kyiv Calling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://music.youtube.com/watch?v=QFZV_j5fjEM"&gt;Океан Ельзи - Не твоя війна (Not your war)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://music.youtube.com/watch?v=wir4k8BbX_Q"&gt;PROBASS ∆ HARDI - ДОБРОГО ВЕЧОРА (Where are you from?)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In case you cannot access them, please contact us on &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt;&lt;/p&gt;</content><category term="news"></category><category term="russian ukraine war invasion"></category></entry><entry><title>Mixxx accepted for GSoC 2022!</title><link href="//mixxx.acolombier.dev/news/2022-03-18-mixxx-accepted-for-gsoc-2022" rel="alternate"></link><published>2022-03-18T12:26:02+01:00</published><updated>2022-03-18T12:26:02+01:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2022-03-18:/news/2022-03-18-mixxx-accepted-for-gsoc-2022</id><summary type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2022/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2022&lt;/a&gt;, a global program focused on bringing new contributors into open source software development.&lt;/p&gt;
&lt;p&gt;This year the program is open for all new or beginner contributors of Mixxx. It is no longer limited to enrolled students. New …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/programs/2022/organizations/mixxx"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2022&lt;/a&gt;, a global program focused on bringing new contributors into open source software development.&lt;/p&gt;
&lt;p&gt;This year the program is open for all new or beginner contributors of Mixxx. It is no longer limited to enrolled students. New contributors have the opportunity to work on Mixxx full-time as a 12+ weeks programming project and receive a stipend sponsored by Google. For more information, check out the &lt;a href="https://google.github.io/gsocguides/student/"&gt;Google Summer of Code Contributor Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You will find the &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsoc-2022-ideas"&gt;GSoC 2022 Project Ideas for Mixxx&lt;/a&gt; in our wiki, but we're also interested in project ideas that matter more to you. Taking a look at our &lt;a href="https://github.com/mixxxdj/mixxx/wiki/gsocadvice"&gt;GSoC advice page&lt;/a&gt; is recommended if you're planning to apply. The best way to get started is to participate in the Mixxx community, so have a look at our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and consider making a small code contribution to show that you're able to familiarize yourself with our codebase.&lt;/p&gt;
&lt;p&gt;The official application period will start &lt;strong&gt;April 4th&lt;/strong&gt; and ends on &lt;strong&gt;April 19th&lt;/strong&gt;, so have your applications ready in time. Potential GSoC contributors should start now to discuss application ideas on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip&lt;/a&gt;. Just start a new topic in the &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109215-gsoc"&gt;#gsoc stream&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2022"></category></entry><entry><title>Mixxx 2.3.2 released</title><link href="//mixxx.acolombier.dev/news/2022-01-31-mixxx-2-3-2-released" rel="alternate"></link><published>2022-01-31T22:18:57+01:00</published><updated>2022-01-31T22:18:57+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2022-01-31:/news/2022-01-31-mixxx-2-3-2-released</id><summary type="html">&lt;p&gt;New year, new Mixxx - we're starting 2022 with the release of &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.2"&gt;Mixxx 2.3.2&lt;/a&gt;!
&lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;Grab it from our download page&lt;/a&gt; and install it on Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;This release irons out a few bugs and adds support for the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/pioneer_ddj_sb3.html"&gt;Pioneer DDJ-SB3 controller&lt;/a&gt;. The &lt;a href="https://manual.mixxx.org/2.3/en/chapters/appendix/changelog.html#v2-3-2"&gt;full changelog&lt;/a&gt; can be found …&lt;/p&gt;</summary><content type="html">&lt;p&gt;New year, new Mixxx - we're starting 2022 with the release of &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.2"&gt;Mixxx 2.3.2&lt;/a&gt;!
&lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;Grab it from our download page&lt;/a&gt; and install it on Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;This release irons out a few bugs and adds support for the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/pioneer_ddj_sb3.html"&gt;Pioneer DDJ-SB3 controller&lt;/a&gt;. The &lt;a href="https://manual.mixxx.org/2.3/en/chapters/appendix/changelog.html#v2-3-2"&gt;full changelog&lt;/a&gt; can be found below. In case you're a Linux package maintainer please double check the &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.3.2/CHANGELOG.md#packaging"&gt;Packaging section&lt;/a&gt; in the changelog and modify your packaging script if necessary.&lt;/p&gt;
&lt;h2&gt;Changelog&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Playlist: Enable sorting by color &lt;a href="https://github.com/mixxxdj/mixxx/pull/4352"&gt;#4352&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1945976"&gt;lp:1945976&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix crash when using Doubling/Halving/etc. BPM from track's Properties window on tracks without BPM &lt;a href="https://github.com/mixxxdj/mixxx/pull/4587"&gt;#4587&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1955853"&gt;lp:1955853&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix writing metadata on Windows for files that have never been played &lt;a href="https://github.com/mixxxdj/mixxx/pull/4586"&gt;#4586&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1955331"&gt;lp:1955331&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Preserve file creation time when writing metadata on Windows &lt;a href="https://github.com/mixxxdj/mixxx/pull/4586"&gt;#4586&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1955314"&gt;lp1955314&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix handling of file extension when importing and exporting sampler settings &lt;a href="https://github.com/mixxxdj/mixxx/pull/4539"&gt;#4539&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix crash when using an empty directory as resource path using the &lt;code&gt;--resource-path&lt;/code&gt; command line option &lt;a href="https://github.com/mixxxdj/mixxx/pull/4575"&gt;#4575&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1934560"&gt;lp:1934560&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pioneer DDJ-SB3: Add controller mapping &lt;a href="https://github.com/mixxxdj/mixxx/pull/3821"&gt;#3821&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Don't wipe sound config during startup if configured devices are unavailable &lt;a href="https://github.com/mixxxdj/mixxx/pull/4544"&gt;#4544&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Append selected file extension when exporting to playlist files &lt;a href="https://github.com/mixxxdj/mixxx/pull/4531"&gt;#4531&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1889352"&gt;lp:1889352&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix crash when using midi.sendShortMsg and platform vnc &lt;a href="https://github.com/mixxxdj/mixxx/pull/4635"&gt;#4635&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1956144"&gt;lp:1956144&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Traktor S3: Fix timedelta calculation bugs &lt;a href="https://github.com/mixxxdj/mixxx/pull/4646"&gt;#4646&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1958925"&gt;lp:1958925&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Packaging&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Downloads of external dependencies are placed in build/downloads&lt;/li&gt;
&lt;li&gt;The sources for libkeyfinder are now expected in build/downloads/libkeyfinder-2.2.6.zip instead of build/download/libkeyfinder/v2.2.6.zip&lt;/li&gt;
&lt;li&gt;CMake: Adjust the download directory and name of external dependencies &lt;a href="https://github.com/mixxxdj/mixxx/pull/4511"&gt;#4511&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix/Improve Appstream metainfo &lt;a href="https://github.com/mixxxdj/mixxx/pull/4344"&gt;#4344&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/4346"&gt;#4346&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/4349"&gt;#4349&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.2"></category><category term="release announcement"></category></entry><entry><title>How Does Timecode Vinyl Actually Work? (Pt. 2)</title><link href="//mixxx.acolombier.dev/news/2021-12-22-dvs-internals-pt2" rel="alternate"></link><published>2021-12-22T23:00:18+01:00</published><updated>2021-12-22T23:00:18+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2021-12-22:/news/2021-12-22-dvs-internals-pt2</id><summary type="html">&lt;p&gt;In the &lt;a href="////mixxx.acolombier.dev/news/2021-11-21-dvs-internals-pt1"&gt;last post&lt;/a&gt;, I explained how a basic relative-mode Digital Vinyl System (DVS) works.
But there are two problems that are still left to solve:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Seeking inside a track by picking up the needle from the record and dropping it somewhere else will not work.&lt;/li&gt;
&lt;li&gt;The basic relative-mode implementation …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;In the &lt;a href="////mixxx.acolombier.dev/news/2021-11-21-dvs-internals-pt1"&gt;last post&lt;/a&gt;, I explained how a basic relative-mode Digital Vinyl System (DVS) works.
But there are two problems that are still left to solve:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Seeking inside a track by picking up the needle from the record and dropping it somewhere else will not work.&lt;/li&gt;
&lt;li&gt;The basic relative-mode implementation will likely suffer from so-called &lt;em&gt;sticker drift&lt;/em&gt;.
   This means that if you &lt;a href="https://djtechtools.com/2015/11/04/marking-vinyl-records-with-stickers-throwback-thursday-dj-technique/"&gt;put a sticker on the vinyl record as visual aid&lt;/a&gt; and then scratch the record back and forth so that the sticker is in the same position it had before the scratch, the track should also be at the same position.
   If you just use the pitch information, it will likely be too inaccurate to make this work, and track position and sticker position drift apart (hence the name).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both of these problems can be solved by throwing position information into the mix.
This is why the timecode signal also contains information that can be used to detect the needle position on the record.&lt;/p&gt;
&lt;h2&gt;Getting the position out of the analog signal&lt;/h2&gt;
&lt;p&gt;From a steady sine waveform alone, it is hard to determine in which groove the needle is and at which rotation degree the platter is moving. One can imagine to count cycles of the wave from the beginning of the control track. Unfortunately this is error prone due to crackling or a skipped groove. The counted number becomes void after such an event. To restore the counted number, a periodical position information is required.
For Serato timecode, this information is added to the sine wave by amplitude modulation (AM) representing the position as a series of low and high amplitudes, digital bits, where 1 is a relatively high peak, and 0 is a relatively low peak.&lt;/p&gt;
&lt;p&gt;The right channel is just a phase-shifted version of the left one, so we only need to look at the positive peaks of the left channel.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Serato Timecode Signal" src="////mixxx.acolombier.dev/images/news/timecode-signal.png"&gt;&lt;/p&gt;
&lt;p&gt;If we look closely, we notice that the peaks occur every time the right channel crosses zero and the signal value goes from the positive part of the signal to negative part.&lt;/p&gt;
&lt;p&gt;This is very convenient, because that way we don't have to lose any sleep over how to detect the peaks in the left channel, we just detect if there was a positive-to-negative zero crossing in the &lt;em&gt;right&lt;/em&gt; channel, then take the current value of the left one and check if it's a &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;1&lt;/code&gt; by comparing it with a threshold.&lt;/p&gt;
&lt;p&gt;Now it's clear how the analog timecode signal can be converted to a stream of bits.
But how can these bits be interpreted as positions?
Or rather: How did the engineers that created the timecode format encode the positions as bits?&lt;/p&gt;
&lt;h2&gt;Encoding strategies&lt;/h2&gt;
&lt;h3&gt;Simple Base-2 Encoding&lt;/h3&gt;
&lt;p&gt;The intuitive approach is to encode positions as a sequence of ascending numbers, e.g. the first position is 0, the second position is 1, the third position is 2, etc.
Since we're working with bits, we could simply express these decimal numbers in the base-2 (binary) numeral system, like this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Bit Sequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;010&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;011&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;101&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;110&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;111&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Of course, that is just a toy example, but even if we only had 8 different positions, we need use 3 bits (= 3 cycles) to represent each position.
In reality, we want to encode &lt;em&gt;a lot&lt;/em&gt; more different positions, which means the resulting binary number will be longer, meaning we need more bits and therefore cycles per position we want to encode.&lt;/p&gt;
&lt;p&gt;The corresponding signal would look like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Simple bitstream with 3 bits per position" src="////mixxx.acolombier.dev/images/news/timecode-3-bit-bitstream.svg"&gt;&lt;/p&gt;
&lt;p&gt;The first 3 cycles encode position 0, the next 3 cycles encode position 1, and so on.
Simple, right?
Unfortunately, this approach has a major problem.&lt;/p&gt;
&lt;p&gt;Let's assume you seek to a random position in the track (by picking up the needle and dropping it somewhere) and the
next 3 bits are &lt;code&gt;001&lt;/code&gt;.
Do you know what position or cycle number we are at?&lt;/p&gt;
&lt;p&gt;We can look up &lt;code&gt;001&lt;/code&gt; in the table above and see that these bits encode position 1 (cycles 3-6).
So after reading these bits we should be at cycle 6.
And that is &lt;em&gt;one&lt;/em&gt; possibility, but not the only one.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Simple bitstream with 3 bits per position and all occurrences of 001 highlighted" src="////mixxx.acolombier.dev/images/news/timecode-3-bit-bitstream-highlight.svg"&gt;&lt;/p&gt;
&lt;p&gt;So there are multiple possible positions and we don't know which one is the correct one.
We can mitigate this by reading the next 3 cycles too, but this doubles the amount of cycles we have to read (6 instead of 3 cycles) until we know the position for sure.&lt;/p&gt;
&lt;p&gt;Digital Vinyl Systems need to be responsive and minimize the latency (i.e. the delay between moving the vinyl and seeing/hearing the action in the software) to be usable for scratching.
Therefore, this approach is not sufficient.&lt;/p&gt;
&lt;p&gt;The problem with the simple base-2 encoding is that may end up in the middle of a number and we don't know where a number begins or ends.&lt;/p&gt;
&lt;h3&gt;Using Sentinel Values&lt;/h3&gt;
&lt;p&gt;To detect the beginning of a new position mark reliably, we need something special, that can be clearly distinguished from the position values.
Such a value is called a &lt;a href="https://en.wikipedia.org/wiki/Sentinel_value"&gt;sentinel value&lt;/a&gt; and could be used to indicate "A new position value starts here".&lt;/p&gt;
&lt;p&gt;After a seek, we have to keep reading bits until we encounter the sentinel value, then we can start reading the actual position bits.
In fact, that's exactly what the early &lt;a href="https://en.wikipedia.org/wiki/Final_Scratch#Vinyl/CD_time_code"&gt;Final Scratch DVS&lt;/a&gt; did.&lt;/p&gt;
&lt;p&gt;In the Final Scratch timecode, each position was prefixed by &lt;code&gt;0001&lt;/code&gt;, followed by 16 bit of position information.
Although using a sentinel value ensures that we know when a position starts, this approach is also problematic.
Let me explain why.&lt;/p&gt;
&lt;p&gt;As we already stated, we want the latency between moving the needle and detecting the position to be as small as possible.
Among other things, the latency is determined by how many bits we have to read until we know the position, so we want this to be as small as possible in all cases.
And this is where using sentinel values fail.&lt;/p&gt;
&lt;p&gt;Let's assume the DJ dropped the needle directly in front of a sentinel value:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; 0 0 0 1 [-------16 bit position-------] 0 0 0 1 [-------16 bit position-------] 0 0 0 1 ...
^                                       ^
Needle dropped here          At this point we know the position
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After reading the next 20 bits (4 bit sentinel value + 16 bit position value), we know the position.
That's fine, but it's only the &lt;em&gt;best case&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What if the DJ dropped the needle after the first bit of the sentinel value?
That would be the &lt;em&gt;worst case&lt;/em&gt; and we'd need to read a lot more bits before know the position:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; 0 0 1 [-------16 bit position-------] 0 0 0 1 [-------16 bit position-------] 0 0 0 1 ...
^                                                                             ^
Needle dropped here                                            At this point we know the position
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The DVS can't detect that the needle was dropped on the sentinel value (because the first bit is missing).
Therefore, it need to wait for the next one and just ignore the remaining 3 bits of the sentinel value and the subsequent position value.
Then it can detect the next sentinel value and position.&lt;/p&gt;
&lt;p&gt;So in that case it would be necessary to read 39 bits before the position can be known.
Needing so many bits to reliably detect a position is bad for latency and might make the system feel "sluggish".&lt;/p&gt;
&lt;h3&gt;Using an LFSR&lt;/h3&gt;
&lt;p&gt;It would be great if we could reduce the number of bits that we need to read to detect the position reliably - even in the worst case.
In the DJ community, Serato's take on DVS is widely considered one of the best solutions.
What are they using for position detection?
We can get a basic idea by taking a look at the back of the Serato Control Vinyl (CV2):&lt;/p&gt;
&lt;p&gt;&lt;img alt="Serato Control Vinyl (CV2) back" src="////mixxx.acolombier.dev/images/news/timecode-serato-lfsr.png"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Deep in a New Zealand laboratory, the founders of Serato set out to create a control record to give professional DJs superior control. Standard timecode records just didn't feel enough like vinyl to make the cut. After months of nerdy, mathematical investigation, they created a maximal-length pseudo random bit sequence using a linear feedback shift register. Or, in English, the Serato NoiseMap™ - a unique control tone for digital DJs that offers unparalleled sensitivity and tightest, most authentic vinyl feel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So Serato is using a Linear Feedback Shift Register (LFSR) its control signal.
Sounds scary?
Don't worry, it's not as complicated as it may sound.&lt;/p&gt;
&lt;h4&gt;What is an LFSR and how does it work?&lt;/h4&gt;
&lt;p&gt;A Linear Feedback Shift Register (LFSR) is a shift register that uses a linear feedback function.
LFSRs are common in modern computing (e.g. for generating pseudo-random numbers), but using them for a vinyl control signal an interesting and unusual application.
I'll outline the basic principle and then try to explain step-by-step using an example.&lt;/p&gt;
&lt;p&gt;For our purposes, it suffices to know that a register is an array that contains a fixed number of bits.
We are working with a &lt;em&gt;Shift&lt;/em&gt; Register, which means means that the contents of the register are shifted to the left or right in each step.&lt;/p&gt;
&lt;p&gt;&lt;img alt="3-bit Shift Register" src="////mixxx.acolombier.dev/images/news/3-bit-shift-register.svg"&gt;&lt;/p&gt;
&lt;p&gt;If we shift the register's contents to the right, we need a new value that we insert at the leftmost position.
LFSRs use a (linear) function that takes the current content of the register as input.
The resulting value is then fed back into the register.&lt;/p&gt;
&lt;p&gt;Let's have a look at a step-by-step example.
Here's a 3-bit LFSR that generates a maximal-length pseudo random bit sequence:&lt;/p&gt;
&lt;p&gt;&lt;img alt="3-bit maximal-length LFSR" src="////mixxx.acolombier.dev/images/news/3-bit-lfsr.svg"&gt;&lt;/p&gt;
&lt;p&gt;In each step the following happens:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We take the current contents of the register to calculate the feedback bit. In this case, we calculate &lt;em&gt;x = s&lt;sub&gt;1&lt;/sub&gt; + s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Then shift the register to the right.&lt;/li&gt;
&lt;li&gt;The bit that is "pushed out" of the register (i.e. the rightmost bit &lt;em&gt;s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;) is the output bit&lt;/li&gt;
&lt;li&gt;The leftmost (empty) space is filled with the feedback bit (&lt;em&gt;x&lt;/em&gt;) we calculated.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let's assume that the initial state of the register is &lt;em&gt;(1, 0, 0)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;First, we need to calculate the feedback bit &lt;em&gt;x&lt;/em&gt; which is defined as the sum of &lt;em&gt;s&lt;sub&gt;1&lt;/sub&gt;&lt;/em&gt; and &lt;em&gt;s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;.
In this step, both bits have the value &lt;code&gt;0&lt;/code&gt;, so &lt;em&gt;x = s&lt;sub&gt;1&lt;/sub&gt; + s&lt;sub&gt;0&lt;/sub&gt; = 0 + 0 = 0&lt;/em&gt;
Next, we need to shift everything to the right, and insert &lt;em&gt;x = 0&lt;/em&gt; on the left.
The output bit is &lt;em&gt;0&lt;/em&gt;, because that is the rightmost bit that is "pushed out" of the register.&lt;/p&gt;
&lt;p&gt;In the next step, the feedback bit is &lt;em&gt;x = s&lt;sub&gt;1&lt;/sub&gt; + s&lt;sub&gt;0&lt;/sub&gt; = 1 + 0 = 1&lt;/em&gt;.
Note that this time &lt;em&gt;s&lt;sub&gt;1&lt;/sub&gt;&lt;/em&gt; has the value &lt;em&gt;1&lt;/em&gt; because we shifted the register to the right in the previous step and &lt;em&gt;1&lt;/em&gt; moved from &lt;em&gt;s&lt;sub&gt;2&lt;/sub&gt;&lt;/em&gt; to &lt;em&gt;s&lt;sub&gt;1&lt;/sub&gt;&lt;/em&gt;.
Now that we calculated &lt;em&gt;x&lt;/em&gt;, we again shift the whole register to the right and write the feedback bit into the leftmost position.
The output bit is &lt;em&gt;0&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We can now continue this a few more times.
In step 5, the feedback bit is &lt;em&gt;x = s&lt;sub&gt;1&lt;/sub&gt; + s&lt;sub&gt;1&lt;/sub&gt; = 1 + 1&lt;/em&gt;.
Usually, the result of that calculation would be &lt;em&gt;2&lt;/em&gt;, but in this case it's &lt;em&gt;0&lt;/em&gt;.
The reason for that is that we're working with bits (which are either &lt;em&gt;0&lt;/em&gt; or &lt;em&gt;1&lt;/em&gt;), so &lt;em&gt;2&lt;/em&gt; is not a valid value.&lt;/p&gt;
&lt;p&gt;Consider a 24-hours clock:
If it's 23:00 and you wait 2 hours, it's &lt;em&gt;01:00&lt;/em&gt; and not &lt;em&gt;25:00&lt;/em&gt;.
That time doesn't exist, so you just subtract 24, which is the number of possible hours from 0 to 23, to make it valid (25:00 - 24:00 = 01:00).
In the same way 2 becomes 0, when you calculate &lt;em&gt;2 - 2 = 0&lt;/em&gt;, because &lt;em&gt;2&lt;/em&gt; is not a valid bit value.&lt;/p&gt;
&lt;p&gt;After the first 6 steps we get the following table:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;&lt;em&gt;s&lt;sub&gt;2&lt;/sub&gt;&lt;/em&gt;&lt;/th&gt;
&lt;th&gt;&lt;em&gt;s&lt;sub&gt;1&lt;/sub&gt;&lt;/em&gt;&lt;/th&gt;
&lt;th&gt;&lt;em&gt;s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;&lt;/th&gt;
&lt;th&gt;Feedback bit &lt;em&gt;x = s&lt;sub&gt;1&lt;/sub&gt; + s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;&lt;/th&gt;
&lt;th&gt;Output bit &lt;em&gt;x = s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0 + 0 = 0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1 + 0 = 1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0 + 1 = 1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1 + 0 = 1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1 + 1 = 0&lt;/em&gt; (mod 2)&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;0 + 1 = 1&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In the next step, we would insert the feedback bit (1) at the leftmost position and shift the other bits to the right,
which results in the state (1, 0, 0), which is exactly the state we started with.
From now on, the table rows would just repeat forever.&lt;/p&gt;
&lt;p&gt;This means that this LFSR has a period of 7 (because it repeats after 7 steps).
That is the maximal period length you can archieve with a 3-bit LFSR.&lt;/p&gt;
&lt;p&gt;Other 3-bit LFSRs that have a &lt;em&gt;shorter&lt;/em&gt; period length exist, e.g. if you have an LFSR where the feedback bit is calculated as &lt;em&gt;x = s&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt; it will already repeats after 3 steps, no 3-bit LFSR will have a longer period.&lt;/p&gt;
&lt;p&gt;Hence, we now know how to generate a "maximal-length pseudo random bit sequence using a linear feedback shift register" just like Serato has.
Let's check how that can be used to solve the problem at hand.&lt;/p&gt;
&lt;h4&gt;LFSR output as timecode signal&lt;/h4&gt;
&lt;p&gt;In each step of the LFSR example above, we get exactly one output bit (the rightmost bit of the LFSR that is "pushed out").
The example has six steps, thus we also get 6 output bits:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Since the LFSR has an internal state of 3 bits, we can use 3 subsequent bits for encoding positions, like this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Bit Sequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;001___&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_010__&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;__101_&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;___011&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The corresponding timecode signal would look like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="LFSR bitstream with 3 bits per position" src="////mixxx.acolombier.dev/images/news/timecode-3-bit-lfsr-bitstream.svg"&gt;&lt;/p&gt;
&lt;p&gt;We can now observe an interesting property of our 3-bit-LFSR-based output signal:
&lt;em&gt;Any&lt;/em&gt; sequence of 3 bits in the signal is &lt;em&gt;unique&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is great and exactly what we want, because after reading 3 bits we now know unambiguously which one of the 4 positions we're at.&lt;/p&gt;
&lt;h4&gt;How big does the LFSR need to be?&lt;/h4&gt;
&lt;p&gt;The example above is obviously a toy example.
In real life, we want to a lot more than 4 different positions.&lt;/p&gt;
&lt;p&gt;The Serato Control CD has a play time of approximately 16 minutes 20 seconds, or 16 * 60 + 20 = 980 seconds.
At a timecode frequency of 1000 Hz (cycles per second), we have 980,000 cycles.
Every cycle encodes one bit, therefore we need an LFSR with an output length of at least 980,000 bits before it starts to repeat.&lt;/p&gt;
&lt;p&gt;At most, an n-bit LFSR can output 2&lt;sup&gt;n&lt;/sup&gt; - 1 bits before it starts to repeat.
An LFSR with such a period size is called a maximal-length LFSR, and we already mentioned that Serato states that it uses a such an LFSR on the packaging of its timecode media.&lt;/p&gt;
&lt;p&gt;The smallest possible LFSR that can output at least 980,000 bits without starting to repeat needs at least 20 bits of state.
A 19-bit LFSR is too small, because 2&lt;sup&gt;19&lt;/sup&gt; - 1 = 524,287 is less than 980,000, but a 20-bit LFSR can output up to 1048575 bits before it starts to repeat.
We don't want to make the LFSR larger than absolutely necessary, because the larger the register, the more bits we need to read before we can detect a position after a needle drop.
Hence, increasing the LFSR's size also increases the latency.&lt;/p&gt;
&lt;h4&gt;A Real Life Example&lt;/h4&gt;
&lt;p&gt;Let's have a look at a real-life DVS that relies on an LFSR for position detection.
We already know that Serato's timecodes uses an LFSR, but what does it look like exactly?&lt;/p&gt;
&lt;p&gt;Fortunately, we can find out by using the &lt;a href="https://en.wikipedia.org/wiki/Berlekamp%E2%80%93Massey_algorithm"&gt;Berlekamp-Massey algorithm&lt;/a&gt;.
It takes the bit sequence decoded from Serato's timecode, and finds the shortest LFSR that produces that output.&lt;/p&gt;
&lt;p&gt;For the Serato Timecode CD bit sequence, the algorithm finds the following LFSR:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Serato Timecode CD LFSR" src="////mixxx.acolombier.dev/images/news/serato-cd-lfsr.svg"&gt;&lt;/p&gt;
&lt;p&gt;We also have to find the correct seed (initial bit state for the LFSR), but this is trivial:&lt;/p&gt;
&lt;p&gt;We know the first 20 bits of the timecode (e.g. by simply looking at the waveform) and we also know that this bit sequence is unique.
First, we select a random non-zero bit sequence as initial LFSR state and then step through the LFSR states while comparing the output of the LFSR with these first 20 bits of timecode bit sequence.
As soon as we see these 20 bits, we just go back 20 steps to the LFSR state &lt;em&gt;before&lt;/em&gt; the first bit of that sequence appeared in the output.
This is the seed.&lt;/p&gt;
&lt;p&gt;A DVS could now generate a lookup table (LUT) that maps each LFSR state to a position.
When reading bits from the timecode, it can then perform a simple lookup to get the corresponding position.&lt;/p&gt;
&lt;h2&gt;Increasing the signal frequency&lt;/h2&gt;
&lt;p&gt;Another way to reduce the latency is to increase the signal frequency.
Serato uses a signal frequency of 1000 Hz, Final Scratch uses 1200 Hz and Traktor Scratch MK2 even uses 2000 Hz.
This means that if you play the record at its original tempo, Serato will read 1000 bits in a single second, Final Scratch will read 1200 bits and Traktor Scratch MK2 can read 2000 bits.
Sound like a good way to reduce the latency, right?&lt;/p&gt;
&lt;p&gt;Unfortunately, a higher signal frequency also comes with a cost:
The signal's maximum frequency must not exceed half the sampling frequency, otherwise &lt;em&gt;signal folding&lt;/em&gt; will occur and lead to information loss.
If you use an audio interface with a 44100 Hz sampling frequency (or sample rate), the signal's maximum frequency at which is can be sampled losslessly (called Nyquist frequency) is 22050 Hz.&lt;/p&gt;
&lt;p&gt;When DJs scratch using DVS, the record is being moved back and forth very fast, so it's &lt;em&gt;not&lt;/em&gt; played back at the original speed.
If they move it too fast, signal folding will lead to misdetection of the bits.
With Serato, you can speed up the record up to 22.05 times of the original speed before that happens.
Traktor MK2 only allows a scratching speed of 11.025 times before the Nyquist frequency is reached and signal folding occurs.&lt;/p&gt;
&lt;p&gt;Hence, the signal frequency is a tradeoff between latency (how many bits per second) and maximum possible scratching speed.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope these two blog posts were interesting and helped understanding how DVS works internally.
Of course, this was just a basic introduction, and there's still more to consider, like dealing with noise, dusty vinyl, etc.
And the information read from the timecode vinyl still has to be hooked up to the GUI and audio engine of the DJ software, which is challenging on it's own.&lt;/p&gt;
&lt;p&gt;If you want to see an actual DVS implementation, check out Mark Hills' excellent free and open-source &lt;a href="https://xwax.org/"&gt;xwax&lt;/a&gt; software.
Its timecode decoder is what Mixxx uses internally to provide &lt;a href="https://manual.mixxx.org/en/chapters/vinyl_control.html"&gt;vinyl control&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also have a look at &lt;a href="https://github.com/Holzhaus/vinylla"&gt;vinylla&lt;/a&gt;, a toy library that I started to get a better understanding of DVS (and also to learn how to program in &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;And if you want to help improve the way Mixxx' DVS capabilities or want work on other parts of Mixxx, hit us up on &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip Chat&lt;/a&gt;!&lt;/p&gt;</content><category term="news"></category><category term="serato"></category><category term="timecode"></category><category term="dvs"></category><category term="vinyl control"></category></entry><entry><title>How Does Timecode Vinyl Actually Work? (Pt. 1)</title><link href="//mixxx.acolombier.dev/news/2021-11-21-dvs-internals-pt1" rel="alternate"></link><published>2021-11-21T00:09:09+01:00</published><updated>2021-11-21T00:09:09+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2021-11-21:/news/2021-11-21-dvs-internals-pt1</id><summary type="html">&lt;p&gt;Since the dawn of DJing, spinning vinyl records has never really gone out of fashion.
Even when CDs became popular in 90s and most music listeners happily phased out their record players, the classical "two turntables and a mixer" setup stayed the epitome of DJing.
In recent years, digital DJ …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since the dawn of DJing, spinning vinyl records has never really gone out of fashion.
Even when CDs became popular in 90s and most music listeners happily phased out their record players, the classical "two turntables and a mixer" setup stayed the epitome of DJing.
In recent years, digital DJ controllers became more popular, but there are still many DJs that stick with their notorious Technics SL-1210s turntables.&lt;/p&gt;
&lt;p&gt;There's a reason for that: the tactile feeling of manipulating music with your hands is something that controllers have had trouble archieving.
Motorized controllers like the Rane One try to provide a similar workflow, but it's still to be seen whether they will be able to take significant market share and replace vinyl setups or if they stay a niche product.&lt;/p&gt;
&lt;p&gt;On the other hand, going digital has its benefits:
In contrast to the 80s, nowadays many tracks are only released digitally, and a pure vinyl setup makes it impossible to play them.
Jumping to different positions instantly inside a track using hotcues - without picking up, moving and dropping the needle - just isn't possible with vinyl records, and carrying around heavy crates of records isn't the best you can do for your back either.&lt;/p&gt;
&lt;p&gt;Digital Vinyl Systems (DVS) aim to provide the best of both worlds by combining the flexibility and power of digital DJing with the tactile control of traditional vinyl DJing.
But how does it actually work?&lt;/p&gt;
&lt;h2&gt;The Basics&lt;/h2&gt;
&lt;p&gt;Instead of a traditional record that contains music, a "control" record is used.
Such a record contains a special signal that is processed by the computer.
The computer transforms this signal into information about direction ("Is the record playing forwards or backwards?"), pitch ("How fast is the record spinning?") and position information ("At which position of the record is the needle?") and uses it to manipulate the playing track in software.&lt;/p&gt;
&lt;p&gt;There are many formats out there:
&lt;a href="http://www.virtualdj.com/buy/controlvinyl.html"&gt;VirtualDJ&lt;/a&gt;, &lt;a href="https://www.pioneerdj.com/product/features/software/rekordbox-dvs-control-vinyl/"&gt;Rekordbox&lt;/a&gt;, &lt;a href="https://www.numark.com/product/virtualvinyl"&gt;Numark&lt;/a&gt;, &lt;a href="https://www.mixvibes.com/cross-dj-4/"&gt;MixVibes&lt;/a&gt;, &lt;a href="https://www.native-instruments.com/en/products/traktor/digital-vinyl/traktor-scratch-a10/"&gt;Traktor&lt;/a&gt; and &lt;a href="https://serato.com/dj/pro/expansions/dvs?dvs=dvs-ready"&gt;Serato&lt;/a&gt; all provide their own solution.
Mixxx (and the underlying &lt;a href="https://xwax.org/"&gt;xwax&lt;/a&gt; library) &lt;a href="https://manual.mixxx.org/2.3/en/chapters/vinyl_control.html#supported-timecode-media"&gt;support the latter 3 formats&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Serato is one of the most popular and robust digital vinyl systems.
The Serato Control CD can be used to achieve the same thing on CDJs instead of turntables.
Since the latter essentially works the same as the vinyl version and can be &lt;a href="https://serato.com/controlcd/downloads"&gt;downloaded for free from the Serato Website&lt;/a&gt;, I'm going to explain how it works based on that format.&lt;/p&gt;
&lt;p&gt;Let's take a look at the control signal (also called "&lt;a href="https://en.wikipedia.org/wiki/Timecode"&gt;timecode&lt;/a&gt; signal").
If you open the WAV file with an audio editor like Audacity, it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Serato CD Timecode Signal in Audacity" src="////mixxx.acolombier.dev/images/news/timecode-signal.png"&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the timecode signal is a stereo signal.
The left channel is on top and the right channel is on the bottom.
Both channels look very similar, but the right channel is shifted a little.&lt;/p&gt;
&lt;h2&gt;Detecting the Playback Velocity&lt;/h2&gt;
&lt;p&gt;Let's focus on the left channel for now.
The wave basically looks similar to a sine wave that you may remember from your high school math classes.
You can divide that signal into "cycles", where each cycle starts from zero and goes into a positive part (above the black line) followed by a negative part (below the black line) and then repeats:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cycle of left channel in timecode signal" src="////mixxx.acolombier.dev/images/news/timecode-signal-cycle.png"&gt;&lt;/p&gt;
&lt;p&gt;Each cycle has the same length and if we count the number of cycles in a single second of audio, there are 1000 of them.
Hence, we now know that the signal has a frequency of 1000 Hz (Hz = 1/s, so it's basically a fancy way saying "per second").&lt;/p&gt;
&lt;p&gt;With that information, the DVS system can detect how fast the record is playing by checking how many cycles there are in a second of audio recorded from the turntable.
If there are 2000 cycles per second, it's playing a double speed, at 500 cycles per second the record is playing at half speed, and so on.&lt;/p&gt;
&lt;p&gt;But how does the computer know how many cycles there are in a second?
We can't actually wait for a second, because the delay (also called latency) would be very noticeable and make the system unsuitable for scratching.&lt;/p&gt;
&lt;h2&gt;Analog vs. Digital Audio&lt;/h2&gt;
&lt;p&gt;It's important to know that in contrast to analog audio like vinyl or music cassettes, the computer doesn't actually work with the continuous (smooth) wave that we see in the screenshot.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Analog Signal" src="////mixxx.acolombier.dev/images/news/signal_analog.svg"&gt;&lt;/p&gt;
&lt;p&gt;Instead, &lt;a href="https://en.wikipedia.org/wiki/Digital_signal_%28signal_processing%29"&gt;digital signals&lt;/a&gt; work with measurements (called "samples") that indicate the value of the wave position at specific points in time.
How often these measurements are taken is determined by the sample rate (or sampling rate).
For example, Audio CDs use a sample rate of 44100 Hz (i.e. 44100 measurements per second, or 1 measurement every ~22.68 microseconds).
Such a signal is called "time-discrete":&lt;/p&gt;
&lt;p&gt;&lt;img alt="Time-Discrete Signal" src="////mixxx.acolombier.dev/images/news/signal_time_discrete.svg"&gt;&lt;/p&gt;
&lt;p&gt;The reason for this is that a time-continuous signal has infinite resolution and would need infinite memory space to save, which is impossible - and also unnecessary, because as long as you take enough samples per second, you can &lt;a href="https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem"&gt;restore the original signal&lt;/a&gt; without any loss of information.&lt;/p&gt;
&lt;p&gt;Since computers can't store numbers with a theoretically infinite number of different values, a digital signal is also value-discrete.
This means that the amplitude values are mapped to a finite number of different values.&lt;/p&gt;
&lt;p&gt;Let's assume we only have space to store 11 distinct values per sample (-1.0, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8 and 1.0).
But a sample value may have any value, so if its value would be between two of these values, they have to be rounded (in this case: multiples of 0.2).
This process is called &lt;a href="https://en.wikipedia.org/wiki/Quantization_%28signal_processing%29"&gt;Quantization&lt;/a&gt; and causes some information loss, which means that it &lt;a href="https://en.wikipedia.org/wiki/Quantization_%28signal_processing%29#Error"&gt;adds noise&lt;/a&gt; to our signal.
An example for such a quantized, value-discrete version of the analog signal looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Value-Discrete Signal" src="////mixxx.acolombier.dev/images/news/signal_value_discrete.svg"&gt;&lt;/p&gt;
&lt;p&gt;A more realistic example is the Audio CD, which uses 16 bit per sample value.
With 16 bits, you can represent 2&lt;sup&gt;16&lt;/sup&gt; = 65536 different values.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;digital&lt;/em&gt; signal is both time-discrete and value-discrete:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Digital Signal" src="////mixxx.acolombier.dev/images/news/signal_digital.svg"&gt;&lt;/p&gt;
&lt;p&gt;Note that this is just a very basic introduction in how digital signals are represented.
If you're interested in the topic, I recommend watching &lt;a href="https://xiph.org/video/vid2.shtml"&gt;Monty Montgomery's "Digital Show &amp;amp; Tell" video&lt;/a&gt;, where he demonstrates how digital signals behave in contrast to analog ones and clears up common misconceptions.&lt;/p&gt;
&lt;p&gt;You may wonder why the timecode signal in the screenshots looks like a analog signal instead of a "lollypop chart".
&lt;em&gt;Digital&lt;/em&gt; vinyl scratch system work with digital signals, not analog ones, right?
And you'd be right, it's just that most audio tools (like Audacity) show a wave instead of individual samples by default.&lt;/p&gt;
&lt;h2&gt;Detecting Zero Crossings&lt;/h2&gt;
&lt;p&gt;Now that we know the basics of digital audio, we can start thinking about a simple low-latency approach to detect the playback velocity using so-called "zero crossings".&lt;/p&gt;
&lt;p&gt;Whenever the wave goes from the positive part to the negative part or vice-versa, it crosses "zero".
For example, in the timecode signal screenshot I used above, we can see 3 zero crossings:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Zero crossings in timecode signal" src="////mixxx.acolombier.dev/images/news/timecode-signal-samples.png"&gt;&lt;/p&gt;
&lt;p&gt;Note that we're working with a digital signal.
To illustrate that this signal is time-discrete, each individual sample value is illustrated by a little dot.&lt;/p&gt;
&lt;p&gt;To detect these zero crossings reliably, we can't just check if the sample value equals zero, because we cannot assume that a sample measurement is happening at the exact time that the signal is at zero position.&lt;/p&gt;
&lt;p&gt;It might be the case the current sample is &lt;em&gt;after&lt;/em&gt; the zero position and the previous sample was &lt;em&gt;before&lt;/em&gt; the zero position.
Hence, we also compare the previous sample value with the current sample value.
If the current value is positive and the previous value was negative, or if the previous value was negative and the current value is positive, the signal crossed zero.&lt;/p&gt;
&lt;h2&gt;Refining Pitch Detection Using Zero Crossings&lt;/h2&gt;
&lt;p&gt;Now that we know how to detect zero crossings, we can use them for determining the pitch.&lt;/p&gt;
&lt;p&gt;If we look at the timecode signal, we can see that each cycle of the timecode signal has two zero crossings:
At the start of the cycle, when the positive part of the wave starts and in the middle of the cycle when the negative part of the wave starts.&lt;/p&gt;
&lt;p&gt;So the equivalent of checking for 1000 cycles per second is to check if there are 2000 zero crossings per second.
Let's say the audio interface uses a sample rate of 44100 Hz, then there should be a zero crossing every 441000 / 2000 = 22.05 samples.&lt;/p&gt;
&lt;p&gt;We can now detect the pitch by comparing the expected number of samples between zero crossings with the actual number of samples between them.
This very simple, low latency pitch detection algorithm works because the Serato timecode has a fixed frequency of 1000 Hz, which means that the distance between all zero crossing is fixed.
It would not work with a regular music signal, which has lots of different frequencies added together.&lt;/p&gt;
&lt;p&gt;However, we need to use multiple sample distances and calculate the average to make this calculation more accurate, because in reality there are no fractions of samples, only full samples.&lt;/p&gt;
&lt;h2&gt;Detecting the Playback Direction&lt;/h2&gt;
&lt;p&gt;The DVS system also needs to know if the record is playing forwards or backwards.&lt;/p&gt;
&lt;p&gt;To do that, we need to take a look at the right channel.
It's basically the same signal as the left channel, but as we noticed before, it's shifted by a quarter cycle.
This means that whenever there's a negative or positive amplitude peak in the left channel, the right channel is at zero.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Zero crossing on right channel means there is a peak on the left channel" src="////mixxx.acolombier.dev/images/news/timecode-signal-zero-crossing-right-channel.png"&gt;&lt;/p&gt;
&lt;p&gt;We can use this property to detect the playback direction.
After the left channel crossed zero, we check if the left and right channel waves are both positive or both negative.
If so, the record is playing forwards, otherwise it's playing backwards.&lt;/p&gt;
&lt;p&gt;For the right channels it's the opposite.
After the right channel crossed zero and the left is negative and the right is positive or if the the right is negative and the left is positive, the timecode is playing forwards.
If both waves are positive or both are negative, the record is playing backwards.&lt;/p&gt;
&lt;p&gt;Now we have already have the basic building blocks to make a DVS system with a simple relative mode.&lt;/p&gt;
&lt;p&gt;For a DVS system that allows you to skip forward and backward in a track by picking up and moving the needle (absolute mode), we need a way to detect the current position in the timecode signal.
I'll explain how that works in the next post.&lt;/p&gt;</content><category term="news"></category><category term="timecode"></category><category term="dvs"></category><category term="vinyl control"></category><category term="serato"></category><category term="cd"></category></entry><entry><title>Mixxx 2.3.1 released</title><link href="//mixxx.acolombier.dev/news/2021-09-30-mixxx-2-3-1-released" rel="alternate"></link><published>2021-09-30T15:57:13+02:00</published><updated>2021-09-30T15:57:13+02:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2021-09-30:/news/2021-09-30-mixxx-2-3-1-released</id><summary type="html">&lt;p&gt;We are happy to announce the release of &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.1"&gt;Mixxx 2.3.1&lt;/a&gt;!
Head over to the &lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;download page&lt;/a&gt; and download it on Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;This release fixes a handful of bugs and packaging issues plus adds several controller mappings.&lt;/p&gt;
&lt;p&gt;Mixxx now includes mappings for the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/numark_dj2go2_touch.html"&gt;Numark DJ2GO2 Touch …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are happy to announce the release of &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.1"&gt;Mixxx 2.3.1&lt;/a&gt;!
Head over to the &lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;download page&lt;/a&gt; and download it on Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;This release fixes a handful of bugs and packaging issues plus adds several controller mappings.&lt;/p&gt;
&lt;p&gt;Mixxx now includes mappings for the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/numark_dj2go2_touch.html"&gt;Numark DJ2GO2 Touch&lt;/a&gt; controller and the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/numark_mixtrack_pro_fx.html"&gt;Numark Mixtrack Pro FX&lt;/a&gt; controller. The &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/behringer_ddm4000.html"&gt;Behringer DDM4000&lt;/a&gt;, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/hercules_djcontrol_inpulse_300.html"&gt;Hercules Inpulse 300&lt;/a&gt; mapping, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/denon_mc7000.html"&gt;Denon MC7000&lt;/a&gt; mapping and the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/native_instruments_traktor_kontrol_s3.html"&gt;Traktor Kontrol S3&lt;/a&gt; mapping have been improved since Mixxx 2.3.0.&lt;/p&gt;
&lt;p&gt;Among other minor issues, this release fixes the random skipping of tracks and the wrong track entries in the history playlist when using AutoDJ.
Both bugs are regressions that were introduced in the Mixxx 2.3.0 release.&lt;/p&gt;
&lt;p&gt;For the full list of changes, have a look at the &lt;a href="https://manual.mixxx.org/2.3/en/chapters/appendix/changelog.html#v2-3-1"&gt;changelog&lt;/a&gt; and the &lt;a href="https://launchpad.net/mixxx/+milestone/2.3.1"&gt;2.3.1 milestone on Launchpad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In case you're a Linux package maintainer please double check the &lt;a href="https://github.com/mixxxdj/mixxx/blob/2.3.1/CHANGELOG.md#packaging"&gt;Packaging section&lt;/a&gt; in the changelog and modify your packaging script if necessary.&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.1"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.3.0 released</title><link href="//mixxx.acolombier.dev/news/2021-06-28-mixxx-2-3-0-released" rel="alternate"></link><published>2021-06-28T18:11:51+02:00</published><updated>2021-06-28T18:11:51+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2021-06-28:/news/2021-06-28-mixxx-2-3-0-released</id><summary type="html">&lt;p&gt;We are proud to announce the &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.0"&gt;release of Mixxx 2.3.0&lt;/a&gt;!
If you want to give it a spin, &lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;you can download it now&lt;/a&gt; on Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;This release brings a lot of new features and bugfixes:&lt;/p&gt;
&lt;p&gt;Prepare your DJ set using &lt;a href="////mixxx.acolombier.dev/news/2020-08-25-new-in-2-3-hotcue-colors"&gt;hotcue colors &amp;amp; labels&lt;/a&gt;, mark &lt;a href="////mixxx.acolombier.dev/news/2020-07-09-intro-outro-sections"&gt;intro …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce the &lt;a href="https://github.com/mixxxdj/mixxx/releases/tag/2.3.0"&gt;release of Mixxx 2.3.0&lt;/a&gt;!
If you want to give it a spin, &lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;you can download it now&lt;/a&gt; on Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;This release brings a lot of new features and bugfixes:&lt;/p&gt;
&lt;p&gt;Prepare your DJ set using &lt;a href="////mixxx.acolombier.dev/news/2020-08-25-new-in-2-3-hotcue-colors"&gt;hotcue colors &amp;amp; labels&lt;/a&gt;, mark &lt;a href="////mixxx.acolombier.dev/news/2020-07-09-intro-outro-sections"&gt;intro/outro sections&lt;/a&gt; in your tracks and add &lt;a href="////mixxx.acolombier.dev/news/2020-10-24-new-in-2-3-track-colors"&gt;track colors&lt;/a&gt; for easier library navigation.
Our new multithreaded analysis and &lt;a href="////mixxx.acolombier.dev/news/2021-04-08-new-in-2-3-keyfinder"&gt;more accurate key detection&lt;/a&gt; will improve the preparation process further.&lt;/p&gt;
&lt;p&gt;Mixxx 2.3.0 comes with a new default skin:
"LateNight" underwent a massive redesign and replaces "Deere" as default skin, so check out the &lt;a href="////mixxx.acolombier.dev/screenshots/"&gt;screenshots page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="&amp;quot;LateNight&amp;quot; is the new default Skin in Mixxx 2.3.0" src="/theme/images/2.3/screenshots/latenight-palemoon-3840x2160.png"&gt;&lt;/p&gt;
&lt;p&gt;If you're a Rekordbox or Serato user, switching to Mixxx has become a lot easier:
You can now play tracks directly from USB drives that contain &lt;a href="////mixxx.acolombier.dev/news/2020-07-20-new-in-2-3-rekordbox-support"&gt;Rekordbox&lt;/a&gt; and &lt;a href="2021-02-08-new-in-2-3-serato-support.md"&gt;Serato&lt;/a&gt; libraries.&lt;/p&gt;
&lt;p&gt;We also added support for recording/streaming in the &lt;a href="https://opus-codec.org/"&gt;Opus&lt;/a&gt; and &lt;a href="https://www.iis.fraunhofer.de/en/ff/amm/broadcast-streaming/heaac.html"&gt;HE-AAC&lt;/a&gt; codecs, introduced &lt;a href="////mixxx.acolombier.dev/news/2020-11-15-new-in-2-3-deck-clone"&gt;deck cloning&lt;/a&gt; and polished the library and preferences (including the controller workflow).&lt;/p&gt;
&lt;p&gt;2.3.0 also adds out-of-the-box support for the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/pioneer_ddj_200.html"&gt;Pioneer DDJ-200&lt;/a&gt; and &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/pioneer_ddj_400.html"&gt;DDJ-400&lt;/a&gt;, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/native_instruments_traktor_kontrol_s3.html"&gt;Native Instruments Traktor Kontrol S3&lt;/a&gt;, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/hercules_djcontrol_inpulse_200.html"&gt;Hercules DJControl Inpulse 200&lt;/a&gt; and &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/hercules_djcontrol_jogvision.html"&gt;Jogvision&lt;/a&gt;, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/roland_dj_505.html"&gt;Roland DJ-505&lt;/a&gt;, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/behringer_bcr2000.html"&gt;Behringer B-Control BCR2000&lt;/a&gt; and &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/behringer_ddm4000.html"&gt;DDM4000&lt;/a&gt;, the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/ion_discover_dj_pro.html"&gt;ION Discover DJ Pro&lt;/a&gt; and the &lt;a href="https://manual.mixxx.org/2.3/en/hardware/controllers/numark_idj_live_ii.html"&gt;Numark iDJ Live II&lt;/a&gt;. A few existing controller mappings have received fixes and new features, too.&lt;/p&gt;
&lt;p&gt;For the full list of changes, have a look at the &lt;a href="https://manual.mixxx.org/2.3/en/chapters/appendix/changelog.html"&gt;changelog&lt;/a&gt; and the &lt;a href="https://launchpad.net/mixxx/+milestone/2.3.0"&gt;2.3.0 milestone on Launchpad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Linux users who see broken icons are affected by &lt;a href="https://bugs.kde.org/show_bug.cgi?id=434451"&gt;a bug in the KDE kIconThemes 5.80 package&lt;/a&gt;. If you don't have a newer version of that package in your repos, yet, see &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1922966/comments/36"&gt;this comment&lt;/a&gt; for how to fix the issue.&lt;/p&gt;
&lt;p&gt;This has been a rather big release, with lots of useful changes, bug fixes and improvements.
All in all, with a total of 7477 changes over 1 million lines of code were modified since the &lt;a href="////mixxx.acolombier.dev/news/2020-06-25-Mixxx-2-2-4-released"&gt;2.2.4 release&lt;/a&gt;!&lt;/p&gt;
&lt;!-- Numbers acquired using `git shortlog -sn release-2.2.4..upstream/2.3 | wc -l`, `git log --oneline --no-merges release-2.2.4..upstream/2.3 -- . ':!lib' | wc -l` and `git diff --shortstat release-2.2.4..upstream/2.3 -- . ':!lib`. --&gt;

&lt;p&gt;Despite our plans to release Mixxx more often, it's been two years since the 2.2.x release, and 2.3 has been in the beta phase for almost a year now.
The reason for these delays is that we &lt;a href="////mixxx.acolombier.dev/news/2020-12-14-scons-cmake-migration"&gt;switched to the CMake build system generator&lt;/a&gt;, worked on some big refactorings and &lt;a href="////mixxx.acolombier.dev/news/2021-02-23-build-infrastructure-updates"&gt;infrastructure updates&lt;/a&gt; that were necessary to streamline our process, but also took a lot of time.&lt;/p&gt;
&lt;p&gt;Our small development team can always need a helping hand, so if you want to help out and make Mixxx better, &lt;a href="////mixxx.acolombier.dev/get-involved/"&gt;get in touch with us&lt;/a&gt;!
Unfortunately, we receive almost no C++ contributions from Windows or macOS developers despite our large user base on those systems.
Our whole core development team uses Linux, which makes it extremely hard to maintain support for other systems.
Without significantly more contributions, the future of Mixxx on Windows and macOS is at stake.
If you know a bit of C++ and use Windows or macOS, please consider helping out.&lt;/p&gt;
&lt;p&gt;Many people spent their free time working on Mixxx and reported bugs, translated Mixxx into other languages, contributed controller mappings, improved skins and hacked on the core code.
This release also features improvements to our manual made by our first intern from the &lt;a href="https://www.outreachy.org/"&gt;Outreachy program&lt;/a&gt;.
Thanks a lot to all our contributors, we really appreciate it!&lt;/p&gt;
&lt;p&gt;The Mixxx code (including skins and controller mappings) has received contributions by almost 100 people:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;--pretty&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;format:%an&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;release-2.2.4..upstream/2.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;-u
abseits
Adam&lt;span class="w"&gt; &lt;/span&gt;Szmigin
Albert&lt;span class="w"&gt; &lt;/span&gt;Aparicio&lt;span class="w"&gt; &lt;/span&gt;Isarn
Alex
Alexander&lt;span class="w"&gt; &lt;/span&gt;Horner
Balló&lt;span class="w"&gt; &lt;/span&gt;György
Be
beenisss
Ben
Be&lt;span class="w"&gt; &lt;/span&gt;Wilson
Chris&lt;span class="w"&gt; &lt;/span&gt;Hills
Christian
Christian&lt;span class="w"&gt; &lt;/span&gt;Wolf
Codecat
Cristiano
Dan&lt;span class="w"&gt; &lt;/span&gt;Giddins
Daniel&lt;span class="w"&gt; &lt;/span&gt;Poelzleithner
Daniel&lt;span class="w"&gt; &lt;/span&gt;Schürmann
David
David&lt;span class="w"&gt; &lt;/span&gt;Baker
David&lt;span class="w"&gt; &lt;/span&gt;Lowenfels
David&lt;span class="w"&gt; &lt;/span&gt;TV
denvercoder21
dj3730
d-j-a-y
DJ&lt;span class="w"&gt; &lt;/span&gt;Phatso
DJPhatso
Edward&lt;span class="w"&gt; &lt;/span&gt;Millen
ehendrikd
ehmic
esbrandt
Evan&lt;span class="w"&gt; &lt;/span&gt;Dekker
Fayaaz&lt;span class="w"&gt; &lt;/span&gt;Ahmed
Ferran&lt;span class="w"&gt; &lt;/span&gt;Pujol&lt;span class="w"&gt; &lt;/span&gt;Camins
Frank&lt;span class="w"&gt; &lt;/span&gt;Breitling
Geovanni&lt;span class="w"&gt; &lt;/span&gt;Pacheco
geraldog
Geraldo&lt;span class="w"&gt; &lt;/span&gt;Nascimento
Harshit&lt;span class="w"&gt; &lt;/span&gt;Maurya
haslersn
Ilkka&lt;span class="w"&gt; &lt;/span&gt;Tuohela
Jan&lt;span class="w"&gt; &lt;/span&gt;Holthuis
Javier&lt;span class="w"&gt; &lt;/span&gt;Vilarroig
JoergAtGithub
JosepMaJAZ
Josep&lt;span class="w"&gt; &lt;/span&gt;Maria&lt;span class="w"&gt; &lt;/span&gt;Antolín&lt;span class="w"&gt; &lt;/span&gt;Segura
jusko
Justin&lt;span class="w"&gt; &lt;/span&gt;Kourie
Katsarov
Kerrick&lt;span class="w"&gt; &lt;/span&gt;Staley
ketan-lambat
luz.paz
Martin&lt;span class="w"&gt; &lt;/span&gt;Kirchgessner
Matthew&lt;span class="w"&gt; &lt;/span&gt;Nicholson
Matthieu&lt;span class="w"&gt; &lt;/span&gt;Bouron
Matthieu&lt;span class="w"&gt; &lt;/span&gt;Imbert
meltedpianoman
Michael
Nathan&lt;span class="w"&gt; &lt;/span&gt;Korth
naught101
ned&lt;span class="w"&gt; &lt;/span&gt;haughton
Nico&lt;span class="w"&gt; &lt;/span&gt;Schlömer
Nik&lt;span class="w"&gt; &lt;/span&gt;Martin
nikolas
Nino&lt;span class="w"&gt; &lt;/span&gt;Miškić-Pletenac
Nino&lt;span class="w"&gt; &lt;/span&gt;MP
nopeppermint
NotYourAverageAl
OsZ
Owen&lt;span class="w"&gt; &lt;/span&gt;Williams
perseo22
Philip&lt;span class="w"&gt; &lt;/span&gt;Gottschling
Pierre&lt;span class="w"&gt; &lt;/span&gt;Le&lt;span class="w"&gt; &lt;/span&gt;Gall
Pino&lt;span class="w"&gt; &lt;/span&gt;Toscano
Pradyuman
Raphael&lt;span class="w"&gt; &lt;/span&gt;Graf
Rebecca&lt;span class="w"&gt; &lt;/span&gt;Wallander
RJ&lt;span class="w"&gt; &lt;/span&gt;Ryan
RJ&lt;span class="w"&gt; &lt;/span&gt;Skerry-Ryan
ronso0
Sanskar&lt;span class="w"&gt; &lt;/span&gt;Bajpai
s.brandt
S.Brandt
Sean&lt;span class="w"&gt; &lt;/span&gt;M.&lt;span class="w"&gt; &lt;/span&gt;Pappalardo
Sebastien&lt;span class="w"&gt; &lt;/span&gt;Blaisot
Sebastien&lt;span class="w"&gt; &lt;/span&gt;BLAISOT
Sébastien&lt;span class="w"&gt; &lt;/span&gt;Blaisot
Sergey&lt;span class="w"&gt; &lt;/span&gt;Ukolov
Simon&lt;span class="w"&gt; &lt;/span&gt;Harst
Stefan
Stéphane&lt;span class="w"&gt; &lt;/span&gt;L
Stéphane&lt;span class="w"&gt; &lt;/span&gt;Lepin
Swiftb0y
Thomas
Timothy&lt;span class="w"&gt; &lt;/span&gt;Karani
toszlanyi
Uwe&lt;span class="w"&gt; &lt;/span&gt;Klotz
Valefungo
Waylon&lt;span class="w"&gt; &lt;/span&gt;Robertson
xerus
xerus2000
YunQiang&lt;span class="w"&gt; &lt;/span&gt;Su
z411
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="news"></category><category term="2.3"></category><category term="2.3.0"></category><category term="release announcement"></category></entry><entry><title>Does using Mixxx with JACK give you zero latency?</title><link href="//mixxx.acolombier.dev/news/2021-05-09-jack-zero-latency" rel="alternate"></link><published>2021-05-09T02:14:43+02:00</published><updated>2021-05-09T02:14:43+02:00</updated><author><name>Daniel Schürmann</name></author><id>tag:mixxx.acolombier.dev,2021-05-09:/news/2021-05-09-jack-zero-latency</id><summary type="html">&lt;p&gt;In regular intervals, we discuss how much latency the &lt;a href="https://jackaudio.org"&gt;JACK Audio Connection Kit&lt;/a&gt; introduces when used in Mixxx. That is one of the &lt;a href="https://manual.mixxx.org/2.3/en/chapters/preferences.html#sound-api"&gt;Sound APIs&lt;/a&gt; that Mixxx supports on Linux, and it's a layer on top of the &lt;a href="https://www.alsa-project.org"&gt;Advances Linux Sound Architecture (ALSA)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unlike analog devices, digital audio devices process …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In regular intervals, we discuss how much latency the &lt;a href="https://jackaudio.org"&gt;JACK Audio Connection Kit&lt;/a&gt; introduces when used in Mixxx. That is one of the &lt;a href="https://manual.mixxx.org/2.3/en/chapters/preferences.html#sound-api"&gt;Sound APIs&lt;/a&gt; that Mixxx supports on Linux, and it's a layer on top of the &lt;a href="https://www.alsa-project.org"&gt;Advances Linux Sound Architecture (ALSA)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unlike analog devices, digital audio devices process audio in time slices of samples stored in memory buffers. These are passed through the various layers. The latency of a digital audio device depends on the number and size of those buffers.
The aim is to minimize the latency, so that the audible result of pressing a button or turning a knob in Mixxx is produced without noticeable delay, in order to allow DJing by ear.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://jackaudio.org/faq/no_extra_latency.html"&gt;JACK FAQ&lt;/a&gt; state that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is &lt;strong&gt;NO&lt;/strong&gt; extra latency caused by using JACK for audio input and output. When we say none, we mean absolutely zero.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is true on its own, because JACK uses the buffer configured for ALSA directly to mix the audio sources together. ALSA has a second buffer with the same length that is used to feed these samples into the hardware. That's all.&lt;/p&gt;
&lt;p&gt;However, in the case of Mixxx two more buffers are used by JACK for syncing and mixing the buffers of the patch field. It allows the client applications to use the full CPU time of each buffer cycle.&lt;/p&gt;
&lt;p&gt;This is not a problem of JACK per se, but of the way JACK support was implemented in Mixxx.&lt;/p&gt;
&lt;p&gt;When using the ALSA API directly Mixxx does what JACK does: It uses the ALSA buffer directly, which doesn't add any latency.&lt;/p&gt;
&lt;p&gt;This can be confirmed by recording the own sound via a mic and measure the round trip latency. For my test, I have used the internal speaker, microphone and ALC298 Analog sound. For separating the signals in one stereo stream, I have enabled the Balance effect to move deck 1 fully to the right channel and the mic fully to the left. The test track is a 440 Hz sine wave generated by &lt;a href="https://www.audacityteam.org"&gt;Audacity&lt;/a&gt;. Then I have cued the track into the pre-roll, started recording and pressed play.&lt;/p&gt;
&lt;p&gt;These are the resulting recordings visualized in &lt;a href="https://www.audacityteam.org"&gt;Audacity&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of audacity showing the round trip latency" src="////mixxx.acolombier.dev/images/news/roundtriplatency.png"&gt;&lt;/p&gt;
&lt;p&gt;The upper stream is the JACK case. The left channel is the recorded master 440 Hz sine wave and the right channel is the mic input.&lt;/p&gt;
&lt;p&gt;JACK is configured with a 1024 frames buffer and reports a latency of 46.4 ms for the sum of two buffers.
The round trip latency is 95 ms (driver + ALSA + JACK async mode + duplex stream = 4 buffers).&lt;/p&gt;
&lt;p&gt;The lower stream is the ALSA case. Mixxx is configured with the same single buffer of 1024 frames = 23.2 ms.
The round trip latency is 49 ms (driver + ALSA = 2 buffers).&lt;/p&gt;
&lt;p&gt;Not in the picture is the ALSA pulse device. It runs at a latency of 104 ms (driver + ALSA + 2 x pulse + ALSA = 5 buffers)
PipeWire on Fedora 34 has by default the same latency as JACK in this test.&lt;/p&gt;
&lt;p&gt;With this picture we can verify that Mixxx actually has the same buffer size in both cases. When pressing pause, it fades the signal out over one buffer length which is equal in both cases.
The peaks in the recorded right channel is the sound of the mouse click. You can only barely see the recorded sine wave.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of audacity showing the fade out" src="////mixxx.acolombier.dev/images/news/fadeoutcompare.png"&gt;&lt;/p&gt;
&lt;p&gt;For reference, I have done the same test using &lt;a href="http://manpages.ubuntu.com/manpages/bionic/man1/jack_iodelay.1.html"&gt;&lt;code&gt;jack_iodelay&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;3114.842&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mf"&gt;70.631&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="n"&gt;tal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;roundtrip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;
&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loopback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;
&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The result is 70 ms (driver + ALSA + JACK async mode = 3 buffers). The duplex cycle is omitted here. This is one buffer more than a native ALSA implementation.&lt;/p&gt;
&lt;p&gt;To verify that the duplex cycle is not introduced by Mixxx or the &lt;a href="http://www.portaudio.com"&gt;PortAudio&lt;/a&gt; abstraction layer used by Mixxx, I have routed the &lt;code&gt;jack_iodelay&lt;/code&gt; signal through Mixxx.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jack patch field showing the jack_iodelay Mixxx loop" src="////mixxx.acolombier.dev/images/news/jackpatch.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2048.000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mf"&gt;46.440&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="n"&gt;tal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;roundtrip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;
&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loopback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2047&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;
&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1023&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is the minimum we can expect, one buffer is needed for &lt;code&gt;jack_iodelay&lt;/code&gt; and one for Mixxx. The result can be confirmed with the same setup using &lt;code&gt;jack_latent_client&lt;/code&gt; which just passes the input to the output.&lt;/p&gt;
&lt;p&gt;If we connect the output of Mixxx to the input, an extra buffer is used for some reason. This can be also confirmed with &lt;code&gt;jack_latent_client&lt;/code&gt; and the same feedback loop.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jack feedback loop" src="////mixxx.acolombier.dev/images/news/feedbackloop.png"&gt;&lt;/p&gt;
&lt;p&gt;The upper stream shows the Mixxx results and the lower stream shows the &lt;code&gt;jack_latent_client&lt;/code&gt; results.&lt;/p&gt;
&lt;p&gt;In addition, most distros use JACK with its default "Server Asynchronous Mode" which introduce one buffer of extra latency (&lt;code&gt;--async-latency&lt;/code&gt;) when accessing the sound card. In Ubuntu Hirsute 21.4, QJackCtl exposes a "Use server synchronous mode" checkbox in the sound card preferences. It is grayed out by default but becomes active if "Enable JACK D-Bus interface" is checked as well. In this case the JACK mixing is done after Mixxx in the same time interval.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;For now, we recommend using Mixxx with the ALSA backends even if you are running JACK. The same applies to &lt;a href="https://pipewire.org"&gt;PipeWire&lt;/a&gt; as Mixxx uses JACK protocol to connect to it.&lt;/p&gt;
&lt;p&gt;It should be also noted that JACK &lt;a href="https://jackaudio.org/faq/multiple_devices.html"&gt;can't deal well&lt;/a&gt; with two or more sound cards. Mixxx can do the required clock sync using the ALSA API and this with no extra latency as long the underlying driver allows it. For details refer the &lt;a href="https://manual.mixxx.org/2.2/chapters/preferences.html#other-sound-hardware-options"&gt;Mixxx manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pipewire will become default on most distros and we need to find out what is the best setup for using it with Mixxx. Do you have interest to help? Get in contact with us at &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt;&lt;/p&gt;</content><category term="news"></category><category term="jack"></category><category term="alsa"></category><category term="sound"></category><category term="latency"></category><category term="pipewire"></category></entry><entry><title>New in 2.3: KeyFinder support</title><link href="//mixxx.acolombier.dev/news/2021-04-08-new-in-2-3-keyfinder" rel="alternate"></link><published>2021-04-08T20:00:00+02:00</published><updated>2021-04-08T20:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2021-04-08:/news/2021-04-08-new-in-2-3-keyfinder</id><summary type="html">&lt;p&gt;Starting with the 2.3, Mixxx will integrate support for the excellent &lt;a href="https://github.com/mixxxdj/libKeyFinder"&gt;KeyFinder library&lt;/a&gt; by Ibrahim Sha'ath.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibrahimshaath.co.uk/keyfinder/"&gt;KeyFinder&lt;/a&gt; is a pretty accurate open-source key detection tool.
It's been in the top 3 of the &lt;a href="https://www.reddit.com/r/DJs/comments/hwlzyt/key_detection_comparison_2020/"&gt;2020 key detection comparison on Reddit&lt;/a&gt; and performs considerably better than the key analyzer from the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Starting with the 2.3, Mixxx will integrate support for the excellent &lt;a href="https://github.com/mixxxdj/libKeyFinder"&gt;KeyFinder library&lt;/a&gt; by Ibrahim Sha'ath.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibrahimshaath.co.uk/keyfinder/"&gt;KeyFinder&lt;/a&gt; is a pretty accurate open-source key detection tool.
It's been in the top 3 of the &lt;a href="https://www.reddit.com/r/DJs/comments/hwlzyt/key_detection_comparison_2020/"&gt;2020 key detection comparison on Reddit&lt;/a&gt; and performs considerably better than the key analyzer from the &lt;a href="https://code.soundsoftware.ac.uk/projects/qm-dsp"&gt;QM-DSP library&lt;/a&gt; that current stable version of Mixxx is using.&lt;/p&gt;
&lt;p&gt;Unfortunately, it's also a lot slower than the QM-DSP algorithm (because the latter divides the sample rate by 8 and only analyzes every 8th window, resulting in a speedup factor of 64).
We hope to improve performance in the future.
Until then, the Queen Mary key Analyzer will be selected by default and you'll have to enable KeyFinder in the Key Detection settings.&lt;/p&gt;
&lt;p&gt;&lt;img alt="KeyFinder option in the Key Detection preferences" src="////mixxx.acolombier.dev/images/news/keyfinder-key-detection.png"&gt;&lt;/p&gt;
&lt;p&gt;On Windows, macOS, Fedora and Arch Linux, KeyFinder support is already enabled.
To try it out, grab one of the &lt;a href="////mixxx.acolombier.dev/download/#unstable"&gt;2.3 beta builds&lt;/a&gt; from our download page.
On Ubuntu, KeyFinder is not enabled yet, because we didn't find the time to create a DEB package for it.&lt;/p&gt;
&lt;p&gt;If you want to help with out with that or work on improving key detection in Mixxx, get in touch with us on &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109171-development/topic/KeyFinder"&gt;Zulip Chat&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="key detection"></category><category term="2.3"></category><category term="beta"></category></entry><entry><title>Announcing the Mixxx Subscription Service</title><link href="//mixxx.acolombier.dev/news/2021-04-01-mixxx-subscription-model" rel="alternate"></link><published>2021-04-01T12:00:00+02:00</published><updated>2021-04-01T12:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2021-04-01:/news/2021-04-01-mixxx-subscription-model</id><summary type="html">&lt;p&gt;Starting with Mixxx 2.3, Mixxx will switch to a new, multi-tiered subscription plan.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are happy to announce a major change in our licensing model:
Starting with Mixxx 2.3, Mixxx will switch to a new, multi-tiered subscription plan.&lt;/p&gt;
&lt;p&gt;&lt;img alt="a laptop with the text &amp;quot;Take your DJing to the next level - Introducing the Mixxx subscription service. Prices starting from $6.99/month (introductory offer)&amp;quot;" src="////mixxx.acolombier.dev/images/news/subscription-service.png"&gt;&lt;/p&gt;
&lt;p&gt;Using our Mixxx &lt;strong&gt;Core&lt;/strong&gt; plan for only $6.99/month (introductory offer, $9.99/month after the first 3 months), you can get your party started.
It offers advanced DJ functions like a top-notch library and tag editing for organizing your music and supports playback of a single deck.&lt;/p&gt;
&lt;p&gt;If you want to enjoy advanced DJ features such as using a second deck and crossfader, recording your set, streaming to Shoutcast servers, check out our Mixxx &lt;strong&gt;Creative&lt;/strong&gt; plan for only $9.99/month (introductory offer, $14.99/month after the first 3 months).&lt;/p&gt;
&lt;p&gt;The Mixxx &lt;strong&gt;Pro&lt;/strong&gt; plan ($19.99/month) even goes one step further and lets you spice up your mix by adding EQs, controller support and samplers!&lt;/p&gt;
&lt;p&gt;With our additional &lt;strong&gt;FX&lt;/strong&gt;, &lt;strong&gt;DVS&lt;/strong&gt; and &lt;strong&gt;Spinal Tap&lt;/strong&gt; plans ($4.99/month each, can be purchased in addition to any of the Core/Creative/Pro plans) you can take your DJing to the next level and open even more possibilities by adding support for effect chains, enabling support for timecode vinyl and making all knobs and sliders go up to eleven (for that extra push over the cliff).&lt;/p&gt;
&lt;p&gt;For real headliners, the &lt;strong&gt;Bottle Service VIP&lt;/strong&gt; plan ($499.99/program launch) will guarantee the appearance of at least three Instagram Influencers at each of your parties.&lt;/p&gt;
&lt;p&gt;This is an amazing opportunity for us to generate shareholder value for our hedge fund investors and reshape the DJ experience for our customers.
Because of this is such a huge step forward, we don't want to overwhelm our users and make the transition as easy as possible.
Therefore, we will postpone all bug fixes and features for an indefinite amount of time instead of including them in Mixxx 2.3.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Existing Mixxx installations will start a 30-day free trial of the Mixxx Core plan.
Customers need to enter payment data before the trial period is over to continue using Mixxx.
If you're not satisfied with the service, you may cancel anytime.
Please note that canceling the subscription does not cancel payments.
Refunds are not available.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; As you probably noticed, this is an April Fool's joke. There is no subscription plan, and &lt;a href="////mixxx.acolombier.dev/news/2020-05-22-you-dont-need-to-pay-for-mixxx"&gt;Mixxx is and always will be free&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="april fools"></category></entry><entry><title>A Statement on Richard Stallman and the Free Software Foundation</title><link href="//mixxx.acolombier.dev/news/2021-03-26-fsf-statement" rel="alternate"></link><published>2021-03-26T00:00:00+01:00</published><updated>2021-03-26T00:00:00+01:00</updated><author><name>Mixxx Team</name></author><id>tag:mixxx.acolombier.dev,2021-03-26:/news/2021-03-26-fsf-statement</id><summary type="html">&lt;p&gt;The contributors to the Mixxx project were dismayed this week to learn that Richard Stallman had been reinstated to the board of directors of the Free Software Foundation.
His departure in 2019 was a consequence of the criticism he faced regarding his inappropriate behavior towards women, his hurtful comments about …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The contributors to the Mixxx project were dismayed this week to learn that Richard Stallman had been reinstated to the board of directors of the Free Software Foundation.
His departure in 2019 was a consequence of the criticism he faced regarding his inappropriate behavior towards women, his hurtful comments about people with Down's Syndrome and his remarks relating to the Epstein scandal.
His resignation came as a relief for many who have suffered his actions.
Richard Stallman's actions disqualify him from representing the FSF and the free software community as a whole.&lt;/p&gt;
&lt;p&gt;While Mixxx is not officially associated with the Free Software Foundation, there's an inevitable connection in the public's mind between all FOSS projects and the FSF.
Furthermore, Mixxx is and always has been licensed under the terms of the GNU General Public License, version 2 or &lt;em&gt;later&lt;/em&gt;, and only the Free Software Foundation can publish new versions of the GNU GPL which could be retroactively applied to the Mixxx code.
Given this relationship, the Mixxx project has an interest in ensuring that the Free Software Foundation has inclusive, principled, and wise leadership which can effectively lead the broad free software community to meet present and future challenges.&lt;/p&gt;
&lt;p&gt;Therefore, we feel an obligation to add our voices to the chorus of those who have expressed dismay at this turn of events and call for the resignation of Richard Stallman.
The FSF board of directors, by allowing him to return, is giving the appearance of endorsing his conduct and can't remain effective without significant personnel changes and bylaw reforms.
By sanctioning his return, the board of directors has lost all credibility on the issues of diversity, equity, and inclusion.
The myriad software developers who chose to trust the FSF with stewardship of licenses for the code we wrote deserve to have a voice on the leadership of the FSF.
We cannot trust an organization that knowingly makes controversial decisions behind closed doors.
We do acknowledge the Free Software Foundation's efforts to revise its bylaws to establish democratic processes for electing leadership and to increase the transparency of its activities, and the community will be watching closely to verify that these changes are effective and substantial.&lt;/p&gt;
&lt;p&gt;The FOSS community has led the way for the rest of the wider tech industry, showing that open standards and practices result in better products while respecting users' freedom, privacy, and community.
Now we have the opportunity to light a better way for the industry at large by showing that a more welcoming, inclusive industry also creates products that are better for everyone.
Our community needs to demonstrate a strong sense of accountability at this time.
We expect the FSF board to do the right thing and follow up its statements with actions by accepting responsibility for this bad decision and enacting specific commitments for change to rebuild trust.&lt;/p&gt;</content><category term="news"></category><category term="community"></category><category term="diversity"></category><category term="politics"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 13 progress</title><link href="//mixxx.acolombier.dev/news/2021-03-01-week-13-progress" rel="alternate"></link><published>2021-03-01T19:33:00+01:00</published><updated>2021-03-01T19:33:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-03-01:/news/2021-03-01-week-13-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the thirteeth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Following last week’s progress, I finished making the edits to the video, and now, I’m only waiting to get feedback before I add in any animations or effects. I hope to upload …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the thirteeth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Following last week’s progress, I finished making the edits to the video, and now, I’m only waiting to get feedback before I add in any animations or effects. I hope to upload it this week (since I’m writing this blog in the next week). 🤞🏽&lt;/li&gt;
&lt;li&gt;I have been working on &lt;a href="https://github.com/mixxxdj/manual/issues/117"&gt;issue #117&lt;/a&gt; – updating the screenshots of the &lt;a href="https://manual.mixxx.org/2.3/en/index.html"&gt;2.3 manual&lt;/a&gt; from the Deere to Latenight skin. I hope to make a PR this week.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And… this is the last week of the Outreachy internship program. This week’s blog is not as long as the previous ones because I have not documented what I will be doing next week. This is because I have not planned out all of the details yet, but of course, I will be making improvements to the manual – next week I will be updating the screenshots in the 2.3 manual from the Deere to the Latenight skin. I hope to check this item off the checklist in this &lt;a href="https://github.com/mixxxdj/manual/issues/117"&gt;issue&lt;/a&gt;. And then, of course, I will continue making tutorials for the &lt;a href="https://www.youtube.com/channel/UC1t9_tylS7XPBIJIpXhXQmQ"&gt;Mixxx Youtube channel&lt;/a&gt; and working on the cookbook/ DJing techniques chapter.&lt;/p&gt;
&lt;p&gt;This has been a great experience interacting and getting to know the Mixxx community virtually.
Overall, I would say my internship has been a success because I was able to gain practical skills, work in a fantastic environment that is really inclusive, and make connections that will last a lifetime.
I could not be more thankful.&lt;/p&gt;
&lt;p&gt;This is NOT goodbye, because I am still going to continue contributing to Mixxx, and endeavor to finish the projects that I started.
That is, I will still be making tutorials for the &lt;a href="https://www.youtube.com/channel/UC1t9_tylS7XPBIJIpXhXQmQ"&gt;Mixxx YouTube channel&lt;/a&gt;, working on the DJing techniques/cookbook project, and making other improvements to the manual.
See you next week 😉&lt;/p&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>Improving the Mixxx developer experience with maintainable build infrastructure</title><link href="//mixxx.acolombier.dev/news/2021-02-23-build-infrastructure-updates" rel="alternate"></link><published>2021-02-23T19:17:51+01:00</published><updated>2021-02-23T19:17:51+01:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2021-02-23:/news/2021-02-23-build-infrastructure-updates</id><summary type="html">&lt;p&gt;Since we &lt;a href="////mixxx.acolombier.dev/news/2020-06-07-mixxx-2-3-beta-released"&gt;published Mixxx 2.3 beta in June 2020&lt;/a&gt;, you may have been wondering what has taken so long to get the 2.3.0 release out. Well, we have been very busy the past few months building a more sustainable technical infrastructure for the Mixxx project. We have …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since we &lt;a href="////mixxx.acolombier.dev/news/2020-06-07-mixxx-2-3-beta-released"&gt;published Mixxx 2.3 beta in June 2020&lt;/a&gt;, you may have been wondering what has taken so long to get the 2.3.0 release out. Well, we have been very busy the past few months building a more sustainable technical infrastructure for the Mixxx project. We have &lt;a href="////mixxx.acolombier.dev/news/2020-12-15-website-improvents"&gt;moved this website to the Pelican static site generator&lt;/a&gt; and moved the &lt;a href="https://mixxx.discourse.group/"&gt;forums&lt;/a&gt; to &lt;a href="https://www.discourse.org/"&gt;Discourse&lt;/a&gt;. Additionally, we had to do a ton of work for the macOS and Windows builds. "Building" software is the process of transforming the code that we write into an executable file that you can run on your computer.&lt;/p&gt;
&lt;h2&gt;Build Servers&lt;/h2&gt;
&lt;p&gt;We &lt;a href="////mixxx.acolombier.dev/news/2020-07-15-new-in-2-3-cmake"&gt;introduced support for the CMake build system&lt;/a&gt; with the release of 2.3 beta, but there were still rough edges at that time, particularly for building Mixxx on Windows and macOS. When we released 2.3 beta, we planned to keep using the old SCons build system for 2.3 on the servers that make our official builds. However, shortly after we announced 2.3 beta, the self-hosted &lt;a href="https://www.jenkins.io/"&gt;Jenkins&lt;/a&gt; Windows build server stopped working. That was far from the first time our self-hosted build servers went offline and we got tired of continually troubleshooting these self-hosted servers. So, we decided to not bother fixing the old build server and instead move our builds to a hosted service.&lt;/p&gt;
&lt;p&gt;We were already using &lt;a href="https://www.appveyor.com/"&gt;AppVeyor&lt;/a&gt; for Windows and &lt;a href="https://travis-ci.com/"&gt;Travis&lt;/a&gt; for macOS &amp;amp; Linux continuous integration to build each commit (change to the code) to catch bugs early. However, we were not uploading the builds from AppVeyor or Travis to our file server at &lt;a href="https://downloads.mixxx.org/"&gt;downloads.mixx.org&lt;/a&gt;. Also, we were using the free options for these services. Together with the slow, old SCons build system, these CI builds hit the time limits on the free tiers so often or took so long to run that we often ignored them. When &lt;a href="https://blog.travis-ci.com/2020-11-02-travis-ci-new-billing"&gt;Travis announced tighter restrictions on their free service&lt;/a&gt;, we decided to evaluate other options.&lt;/p&gt;
&lt;p&gt;It turned out that &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; met all our needs with support for macOS, Windows, and Ubuntu. GitHub Actions allows us to run a maximum of 20 concurrent builds or 5 concurrent macOS builds with a 6 hour time limit for jobs. The 6 hour time limit for jobs is important because Mixxx's dependencies take about 4 hours for a full build without a cache.&lt;/p&gt;
&lt;p&gt;While we are wary of being dependent on services that are powered by proprietary software and have &lt;a href="https://www.theverge.com/2019/10/9/20906213/github-ice-microsoft-software-email-contract-immigration-nonprofit-donation"&gt;other serious issues&lt;/a&gt;, no other service provides comparable computing resources as GitHub Actions does for free. For a busy project with little budget, that is super helpful. Moreover, GitHub Actions hosts the artifacts from every build, even on pull requests. This allows users to &lt;a href="https://github.com/mixxxdj/mixxx/wiki/Testing"&gt;test Mixxx&lt;/a&gt; before we merge changes to the code without the users needing to know how to build Mixxx. This also makes it much easier for developers to test changes on operating systems they do not use personally, which is very helpful because all of our core development team runs Linux.&lt;/p&gt;
&lt;h2&gt;macOS Woes&lt;/h2&gt;
&lt;p&gt;Since we were switching to a whole new build server setup, we decided to get the new system working with CMake rather than keep using the old SCons build system. Although CMake comes with tools to make macOS application bundle packages (the files users download and drag and drop to their &lt;code&gt;/Applications&lt;/code&gt; folder), they are &lt;a href="https://gitlab.kitware.com/cmake/cmake/-/issues/21568"&gt;sorely lacking&lt;/a&gt; and &lt;a href="https://discourse.cmake.org/t/lost-with-getting-cpack-to-make-a-macos-bundle/2102/"&gt;badly documented&lt;/a&gt;. Since none of our core developers use macOS and macOS is cumbersome to run in virtual machines, one of our core developers had to borrow an old Macbook Air from a friend to do this work. Getting CMake correctly building macOS packages took more than a week, but that was only the beginning of the journey.&lt;/p&gt;
&lt;p&gt;A great aspect of using GitHub Actions for our builds is that GitHub does the work of keeping the operating systems and build tools in the virtual machine images up to date for us. However, when we tried to build Mixxx with our old archive of dependencies on GitHub Actions, it would not build because GitHub Actions no longer had a version of XCode old enough to support the macOS 10.13 SDK which was used on our old macOS build server.&lt;/p&gt;
&lt;p&gt;So, we got GitHub Actions to run the scripts we used on the old build server to build all of Mixxx's dependencies. This took about another week of work. With a new archive of dependencies built by GitHub Actions, we could build Mixxx on GitHub Actions. Then, more complications became apparent.&lt;/p&gt;
&lt;p&gt;The builds from GitHub Actions were so laggy that they were completely unusable, but the builds from the old build server with the same code were okay. It turned out that having our own build server that was such a hassle to upgrade that we didn't do it for years was masking a serious bug. Building Mixxx with a macOS SDK 10.14 or newer made Qt use layer backing. Combined with the legacy QGLWidget API we still use for Mixxx's waveforms, this was extremely slow. We have &lt;a href="https://github.com/mixxxdj/mixxx/pull/1974"&gt;previously attempted&lt;/a&gt; to update to the newer QOpenGLWidget API. Although this performed much better on macOS, the waveforms jerked back and forth instead of scrolling smoothly. We considered trying to finish this work for 2.3, but the task is difficult and would require major changes to the waveform rendering code.&lt;/p&gt;
&lt;p&gt;Ultimately solving this performance issue will require &lt;a href="https://forum.qt.io/topic/121746/determing-graphics-frame-swap-time-when-rendering-in-qt-6/"&gt;rewriting our whole GUI for Qt6&lt;/a&gt; which will also be a huge challenge. If anyone reading this is skilled at graphics programming, please get in touch on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip chat&lt;/a&gt;. We could really use help figuring out how to rewrite waveform rendering for Qt6. For now, we are using an ugly hack of automatically downloading the macOS 10.13 SDK to build Mixxx with current versions of XCode that do not officially support that old of a macOS SDK.&lt;/p&gt;
&lt;p&gt;But that was not the end of the macOS-specific bugs. While working on rebuilding our dependencies, we updated to Qt 5.12.10 from 5.12.3. However, when Mixxx was built with Qt 5.12.10, it &lt;a href="https://bugreports.qt.io/browse/QTBUG-87014"&gt;would not show any windows at all&lt;/a&gt; on macOS 11. So for now we are stuck with Qt 5.12.3 and the macOS 10.13 SDK. Altogther, dealing with these macOS-specific problems took about 3 months of work, and we are glossing over some details here.&lt;/p&gt;
&lt;p&gt;With CMake working on every OS we support, we changed our plans and decided to &lt;a href="////mixxx.acolombier.dev/news/2020-12-14-scons-cmake-migration"&gt;drop support for SCons for 2.3&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Winwoes&lt;/h2&gt;
&lt;p&gt;With macOS builds finally working on GitHub Actions, we still had challenges with Windows. Although we could build Mixxx on Windows on GitHub Actions using our old archive of dependencies, the server we used to build those dependencies was no longer functioning. In Mixxx 2.3, we have added support for analyzing tracks' musical key with &lt;a href="https://github.com/mixxxdj/libkeyfinder"&gt;libkeyfinder&lt;/a&gt;, but this new dependency was not in the old Windows build environment. We could not work around that by simply downloading libkeyfinder automatically when building Mixxx because libkeyfinder has its own dependency on &lt;a href="http://fftw.org/"&gt;FFTW&lt;/a&gt;. Moreover, if Mixxx users were affected by bugs in any of our dependencies, we would not be able to update them if we kept using the dependency archive from the old server.&lt;/p&gt;
&lt;p&gt;We tried to get our &lt;a href="https://github.com/mixxxdj/buildserver/tree/2.3.x-windows"&gt;old Windows batch scripts for building Mixxx's dependencies&lt;/a&gt; to run on GitHub Actions. However, like on macOS, we ran into challenges because GitHub Actions' virtual machine images had a more up to date version of the MSVC C++ toolchain than our old Windows build server. Our old scripts relied on old Visual Studio project files to build many of the dependencies. These did not work without modification on GitHub Actions. Updating those would have required a developer using Windows to update them using Visual Studio, but all of our core developers use Linux and nobody wanted to learn how to do that. If we did manage to do that, we would likely have to do that all over again when Microsoft releases a new version of Visual Studio.&lt;/p&gt;
&lt;p&gt;Rather than update our old build scripts for Mixxx's Windows dependencies, we decided to abandon them in favor of Microsoft's new &lt;a href="https://github.com/microsoft/vcpkg"&gt;vcpkg&lt;/a&gt; package manager for C &amp;amp; C++ libraries. Using a package manager is a much easier way of building our dependencies than our own custom build scripts. Many of our dependencies were already available in vcpkg, but many were not or had various issues using them with Mixxx. We had to add new packages for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/vcpkg/pull/15986"&gt;chromaprint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/vcpkg/pull/15990"&gt;libdjinterop&lt;/a&gt; (will be a new dependency for Mixxx 2.4)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/vcpkg/pull/15988"&gt;libebur128&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/vcpkg/pull/15878"&gt;libkeyfinder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/vcpkg/pull/15991"&gt;libid3tag&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For several other packages, we had to get them building with CMake or make changes to their CMake build systems to make them usable for Mixxx on Windows. These are still waiting for CMake support to be merged upstream to the libraries before we submit packages to vcpkg upstream:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/libusb/hidapi/pull/220"&gt;hidapi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PortAudio/portaudio/pull/461"&gt;portaudio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/breakfastquay/rubberband/pull/18"&gt;rubberband&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.freedesktop.org/wtaymans/fdk-aac-stripped/-/merge_requests/1"&gt;fdk-aac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="UPSTREAM ALL THE CODE!" src="////mixxx.acolombier.dev/images/news/upstream-all-the-code.png"&gt;&lt;/p&gt;
&lt;p&gt;This took another month of work after spending three months working on the macOS builds, but it was well worth it. The old scripts to build Mixxx's Windows dependencies on the old server took 36 hours to run because the server built both 32 and 64 bit binaries and built each with two different set of compiler options. We are dropping support for 32 bit Windows in Mixxx 2.3, so half of that build time is gone. A full build of Mixxx's Windows dependencies with vcpkg takes about 4 hours. Now, with caching on GitHub Actions, adding or modifying a dependency for Mixxx only takes about 20 minutes.&lt;/p&gt;
&lt;p&gt;Using vcpkg has allowed us to build Mixxx with some dependencies that were missing on Windows before because nobody wanted to put in the effort to write Windows batch scripts to build them. Now, Mixxx can play module tracker files with &lt;a href="https://github.com/Konstanty/libmodplug"&gt;libmodplug&lt;/a&gt; and use LV2 effects plugins on Windows. Coincidentally, as we were working on this, falkTX at DISTRHO published the first release of &lt;a href="https://kx.studio/News/?action=view&amp;amp;url=announcing-pawpaw-cross-platform-lv2-ports-for-macos-and-windows"&gt;PawPaw&lt;/a&gt; bringing many LV2 plugins common on Linux to Windows and macOS, which can now be used with Mixxx! Here is Mixxx working on Windows with LV2 plugins, Modplug, and KeyFinder all working:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot showing Mixxx with LV2 plugins, module tracker support, and KeyFinder support" src="////mixxx.acolombier.dev/images/news/lv2-modplug-keyfinder-windows.png"&gt;&lt;/p&gt;
&lt;p&gt;vcpkg is great for us because it works on Windows, macOS, and Linux. This allows us to work on packaging Mixxx's dependencies for Windows while we work on Linux. As long as the dependency's build system is crossplatform (CMake or Meson), this is quite easy. If they do not have crossplatform build systems, that is one reason we are working on getting CMake support merged upstream. Plus vcpkg's &lt;a href="https://github.com/microsoft/vcpkg/blob/master/docs/specifications/ports-overlay.md"&gt;overlay feature&lt;/a&gt; makes it easy for us to make custom modifications to certain packages while easily merging updates from upstream for every other package.&lt;/p&gt;
&lt;p&gt;Most of our dependencies already work on macOS and Linux with vcpkg, with the notable exception of the unmaintained &lt;a href="http://portmedia.sourceforge.net/portmidi/"&gt;portmidi&lt;/a&gt; library. When we get that working with vcpkg, or potentially replace it with a currently maintained crossplatform MIDI library such as &lt;a href="https://github.com/jcelerier/RtMidi17"&gt;RtMidi17&lt;/a&gt;, we will be able to use vcpkg for all our dependencies for both Windows and macOS. For Linux, we are considering distributing Mixxx as a Flatpak using the dependencies from vcpkg in the future, but this &lt;a href="https://github.com/flatpak/flatpak/issues/1509"&gt;will have to wait&lt;/a&gt; until &lt;a href="https://pipewire.org/"&gt;PipeWire&lt;/a&gt; is included in more Linux distributions, which will start happening in the next couple of months with the releases of &lt;a href="https://fedoraproject.org/wiki/Changes/DefaultPipeWire"&gt;Fedora 34&lt;/a&gt; and &lt;a href="https://bugs.launchpad.net/ubuntu/+source/pipewire/+bug/1802533/comments/33"&gt;Ubuntu 21.04&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Developer Experience&lt;/h2&gt;
&lt;p&gt;All of this work has been very tedious. We would have much rather spent this effort writing fun new features for Mixxx, but this had to be done to keep the project going. Now that it is working, developing for Mixxx is much nicer.&lt;/p&gt;
&lt;p&gt;As we got the new setup going with GitHub Actions, we wrote scripts that can be used both by GitHub Actions and by developers that want to set up a development environment on their computer. The scripts automatically download the archive of Mixxx's dependencies. On macOS, the script sets the appropriate environment variables. On Windows, the script generates a &lt;a href="https://docs.microsoft.com/en-us/cpp/build/cmakesettings-reference"&gt;&lt;code&gt;CMakeSettings.json&lt;/code&gt; file&lt;/a&gt; which can be used to setup Visual Studio to work on Mixxx very easily. We hope this makes Mixxx more welcoming for Windows and macOS developers to contribute.&lt;/p&gt;
&lt;p&gt;Developers on every OS can now easily have their code built and tested automatically on Windows, macOS, and Linux simply by pushing commits to GitHub, and we can ask users to give feedback using the build artifacts from GitHub Actions.&lt;/p&gt;
&lt;p&gt;On macOS and Linux, the builds on GitHub Actions only take a few minutes now that we are using &lt;a href="https://ccache.dev/"&gt;ccache&lt;/a&gt; which was &lt;a href="https://cmake.org/cmake/help/latest/prop_tgt/RULE_LAUNCH_COMPILE.html"&gt;easy to implement with CMake&lt;/a&gt;. We have tried getting compiler caching working on Windows with &lt;a href="https://github.com/mixxxdj/mixxx/pull/3618"&gt;sccache&lt;/a&gt; and &lt;a href="https://github.com/mixxxdj/mixxx/pull/3473"&gt;clcache&lt;/a&gt; but have not succeeded yet, so the Windows builds still take about 40 minutes.&lt;/p&gt;
&lt;p&gt;Historically, issues with the build servers have been a major factor why Mixxx releases have been so few and far between. We hope that by having this automated on a reliable service that we do not need to maintain ourselves, we can focus more on programming cool new features and getting Mixxx releases published more regularly.&lt;/p&gt;
&lt;p&gt;If you want to &lt;a href="https://mixxx.org/get-involved/"&gt;get involved&lt;/a&gt; in making Mixxx more awesome, come introduce yourself on our &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109123-introduce-yourself"&gt;Zulip chat&lt;/a&gt;. You do not need to be a coder to contribute. Our new infrastructure makes contributing easier both for developers and testers!&lt;/p&gt;
&lt;h2&gt;Addendum: compiler caching on Windows&lt;/h2&gt;
&lt;p&gt;After figuring out &lt;a href="https://github.com/mozilla/sccache/pull/963"&gt;undocumented requirements&lt;/a&gt; for &lt;a href="https://github.com/mozilla/sccache"&gt;sccache&lt;/a&gt;, &lt;a href="https://github.com/mozilla/sccache/pull/962"&gt;fixing&lt;/a&gt; a bug in it, and &lt;a href="https://github.com/google/googletest/pull/3291"&gt;fixing&lt;/a&gt; another bug in &lt;a href="https://github.com/google/googletest"&gt;Google Test&lt;/a&gt;, and working around &lt;a href="https://github.com/actions/cache/issues/531"&gt;a bug in GitHub Actions caching&lt;/a&gt;, we have compiler caching &lt;a href="https://github.com/mixxxdj/mixxx/pull/3618"&gt;working on Windows&lt;/a&gt;. Windows builds now take 16-18 minutes. That is significantly longer than macOS which takes about 10 minutes, but it is a
big improvement from 40 minutes per Windows build without compiler caching!&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="builds"></category><category term="infrastructure"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Career goals</title><link href="//mixxx.acolombier.dev/news/2021-02-22-career-goals" rel="alternate"></link><published>2021-02-22T11:30:00+01:00</published><updated>2021-02-22T11:30:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-02-22:/news/2021-02-22-career-goals</id><summary type="html">&lt;p&gt;As the outreachy internship program draws closer to an end, the question that comes to mind is "What next?". In this blog post, I write about what I hope to achieve in terms of my career path and the various skills that I have gained through this internship that could help me achieve some of my goals.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="goals" src="////mixxx.acolombier.dev/images/news/goals.jpg"&gt;&lt;/p&gt;
&lt;h4&gt;About me&lt;/h4&gt;
&lt;p&gt;My name is Aanyu Deborah Oduman. I am 23, and I work and live in Uganda.
I just recently finished studying for my bachelor’s degree in Computer Engineering from &lt;a href="https://www.mak.ac.ug"&gt;Makerere University&lt;/a&gt;, Kampala, and I am slated to graduate in mid-March.&lt;/p&gt;
&lt;p&gt;For the past three months, I have been contributing to Mixxx in improving their documentation.
The goal is to make the &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; software easier to use especially to the new user by making &lt;a href="https://manual.mixxx.org/2.2/en/"&gt;the manual&lt;/a&gt; easy to understand and follow.
I have also been making video tutorials for the &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; YouTube channel; videos that will act as a guide for &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; users to follow and make great mixes.&lt;/p&gt;
&lt;h4&gt;My background&lt;/h4&gt;
&lt;p&gt;I have always taken a keen interest in tech, but I didn’t get to fully explore it until I joined the university and enrolled in a Computer Engineering course.
&lt;a href="https://msmcnamagunga.ac.ug"&gt;High school&lt;/a&gt; provided a couple of opportunities in robotics and innovation, but with the limited resources and the vast number of students, the time was never enough to learn and master a new skill.
But even with the limited resources, I am grateful to have had the chance to learn how to build lego prototypes and write simple programs for them.&lt;/p&gt;
&lt;p&gt;I started learning C+ and Python, as part of the engineering curriculum and this foundation propelled me into wanting to learn more about programming and seeing what else I could do with code.
With these basics, I enrolled in a couple of coding bootcamps and attended a few seminars in aviation and software development.
I applied to the &lt;a href="https://andela.com"&gt;Andela&lt;/a&gt; bootcamps, just when the company was still new and we were just getting to know about the awesome tech startup.
It is here that I learned how to use HTML, and CSS – things that were not taught in my engineering course.&lt;/p&gt;
&lt;p&gt;After a while, I applied to the &lt;a href="https://medium.com/@chimdi2000/alc-announcing-google-africa-scholarships-with-the-andela-learning-community-ae4a3472ae30"&gt;Google-ALC training&lt;/a&gt; programs where we were given free access to some of the best coding courses on &lt;a href="https://www.pluralsight.com"&gt;Pluralsight&lt;/a&gt;.
I learned more about HTML5, CSS, Bootstrap and Python and created my first website using Flask.&lt;/p&gt;
&lt;p&gt;I worked on a few other projects alongside school, though, with the tight schedule, I didn’t get to do it consistently until the lockdown of March 2020.
COVID-19 came with a lot of downsides, but I was fortunate that it came as a blessing in disguise for me. I was stuck home with nothing else to do but bury my head in the heaps of programming languages and stacks.
I was finally able to put my HTML, CSS, JS and Python knowledge to use and that’s when I learned Frontend Web development with ReactJS in a 3-month remote internship that taught me everything I know about Frontend web development.
The program was continued in a second 4-month (or more) internship where they taught Backend with NodeJS, and finally, full-stack web development with MongoDB, ExpressJS, ReactJS, and NodeJS.&lt;/p&gt;
&lt;p&gt;Around the same period, I had the honour of participating in the &lt;a href="https://buildforsdg.andela.com"&gt;#BuildforSDGs challenge&lt;/a&gt;; Cohort 2.
The &lt;a href="https://buildforsdg.andela.com"&gt;#BuildforSDGs&lt;/a&gt; program is committed to helping empower people to build real-world, locally and relevant solutions focused on the &lt;a href="https://www.undp.org/content/undp/en/home/sustainable-development-goals.html"&gt;Sustainable Development Goals&lt;/a&gt; (SDGs) while gaining skills needed to advance in one’s career.
I got to collaborate with really talented developers from all over Africa and received priceless mentorship from the experts at &lt;a href="https://andela.com"&gt;Andela&lt;/a&gt; and &lt;a href="https://www.facebook.com"&gt;Facebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shortly after, towards the end of the program, I started applying for the Outreachy FOSS internship, and this where I am now.&lt;/p&gt;
&lt;h4&gt;The skills that I have learned through working for Mixxx&lt;/h4&gt;
&lt;p&gt;&lt;img alt="skills" src="////mixxx.acolombier.dev/images/news/skills.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The Outreachy internship with &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; introduced me to Free and Open-Source Software. I had never contributed to FOSS before the program, let alone knowing what the term meant.&lt;/p&gt;
&lt;p&gt;Through the internship working with &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt;, I have gained experience in technical writing on a larger scale, and with a more recognized project. I had only used markdown before while working with git, but now, I get to use &lt;a href="https://www.markdownguide.org/cheat-sheet/"&gt;markdown&lt;/a&gt; and &lt;a href="https://docutils.sourceforge.io/rst.html"&gt;reStructuredText&lt;/a&gt; for much greater work.&lt;/p&gt;
&lt;p&gt;I am getting to understand more about how to use Git, especially on an active project with many (experienced) contributors.
I am more comfortable with git now than I used to be.
I think it is safe to say that I can extricate myself from sticky git errors and I understand git tree structures much better.&lt;/p&gt;
&lt;p&gt;I have gained more confidence in my skills as a video and content creator, especially for technical projects such as &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt;.
I understand better how to use video editing tools to make short understandable YouTube tutorials for the new Mix user, and how to write scripts for the videos.&lt;/p&gt;
&lt;p&gt;I have learned more about usability, in the context of how easy software should be to understand and to use by people new to them.
With every new addition that I make to the &lt;a href="https://manual.mixxx.org/2.2/en/"&gt;Mixxx manual&lt;/a&gt;, I understand more about how the software works and the GUI aspects of it.&lt;/p&gt;
&lt;p&gt;The list of skills that I have learned through the &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; internship is quite endless.
I learned how to send files to another computer using OpenSSH and rsync in a command-line – something that might be easy for Linux users to do.
I have a better understanding of how Open-source software communities operate and how to get started contributing to Open-Source software.
Not forgetting the confidence that I have gained through the interactions that I have had with the various contributors in the community.
I have come to appreciate teamwork more, and the importance of asking for help when I need it.&lt;/p&gt;
&lt;h4&gt;What next? What are my career goals?&lt;/h4&gt;
&lt;p&gt;I love contributing to software applications that people use in their everyday lives.
I have loved receiving immediate feedback on my technical writing and video editing skills in this internship.
I have loved having a mentor who I can turn to for guidance about most things open source related.
Open source embodies some very positive aspects of the internet – and that is collaboration, knowledge and skill-sharing towards a common goal.
The results are impressive and demonstrate what can be achieved from small contributions of time and effort by a large number of people.&lt;/p&gt;
&lt;p&gt;I would love to continue being a part of the open-source contributors’ community and adding my input to various open-source projects.
I look forward to exploring different open-source internship programs such as the &lt;a href="https://fellowship.mlh.io"&gt;Major League Hacking&lt;/a&gt; open-source internship program, &lt;a href="https://developers.google.com/season-of-docs"&gt;Google Season of Docs&lt;/a&gt;, &lt;a href="https://summerofcode.withgoogle.com"&gt;Google Summer of Code&lt;/a&gt;, among other open-source opportunities.
I would love to grow my experience in working with various software and learn from highly experienced and long-standing members of the Open-source community.&lt;/p&gt;
&lt;p&gt;I look forward to strengthening my skills in Frontend web development, and eventually Backend web development.
During the lockdown period, I started off learning React JS and I was able to work on a couple of &lt;a href="https://github.com/deborahtrez?tab=repositories"&gt;personal projects&lt;/a&gt;.
I want to take it to the next level and learn more about things like Continuous Integration and Continuous Deployment (CI/CD), test-driven development (TDD), shipping apps using Docker among other things.
I want to get more comfortable with using public APIs in the applications that I create (this has always been tricky for me).
I also look forward to learning how to use Django for backend development and eventually get comfortable with it.
I want to strengthen my skills in UI/UX design and incorporate this with the frontend dev stack and finally, if the opportunity presents itself,
I will contribute to an Open source project using some of the technologies in the MERN stack or in UI/UX or even in Django or Flask.&lt;/p&gt;
&lt;h4&gt;What interpersonal skills make me a good collaborative member?&lt;/h4&gt;
&lt;p&gt;&lt;img alt="zoom call" src="////mixxx.acolombier.dev/images/news/zoom.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Open-mindedness&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I am open to and accepting of new ideas.
When people get together to discuss a project, different ideas come from different perspectives and areas of expertise,
so there’s inevitably going to be a flurry of ideas on the table about how to proceed—ideas that’ll be unfamiliar, new, exciting, and possibly difficult to understand.
As a naturally curious person, I thrive in this kind of environment.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Communication&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I try to make sure to communicate openly and clearly with other contributors. I am mindful of different communication styles and I adapt the way I communicate accordingly.&lt;/p&gt;
&lt;p&gt;Fostering a collaborative environment means making room for all types of communication and communicators.
I love that the collaborative process in open source usually incorporates alternative ways of communicating, otherwise the most outspoken people would steal the show.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Organization&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the things about contributing to open-source programs remotely is that no one will be physically around to push you to do anything or get work done.
The process is, for the most part, self-paced and I believe it takes a certain level of organization to make valuable contributions to a project.
Throughout the Outreachy internship working with &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt;, I have kept myself organized, assigning myself tasks daily and managing my time effectively.
I try to take my organization beyond just doing what I’m assigned but taking the initiative to find out what needs to be done and then doing it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Long term thinker&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I like to envision the end result of a goal before I get started and continue to do so while I carry out my duties.
Collaboration is about working towards a common goal or a shared purpose and recognizing how my contributions fit into that goal.
I endeavour to have a deeper understanding of the project’s scope and everyone’s role in it because the more I understand this, the better I will be equipped to make it happen.
I believe that understanding my broader purpose helps me make more meaningful contributions to the team.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adaptability&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sometimes collaborative projects don’t go as planned. Priorities shift, obstacles delay progress, and problems occur, catapulting the whole project into complete disarray.&lt;/p&gt;
&lt;p&gt;To persevere, people need to be able to adapt at a moment’s notice.
I adapt easily to sudden shifts in goals or priorities and prefer to brainstorm solutions to problems that may be encountered while working on the project, as opposed to freaking out and not working towards a solution.&lt;/p&gt;
&lt;h4&gt;What am I looking forward to ?&lt;/h4&gt;
&lt;p&gt;I want to keep working with &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt;, so I can get better at technical writing and make video tutorials that explain specific technical concepts.
I prefer to work with communities that openly make efforts to improve diversity and &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; does this.
So I plan to continue contributing to my current community even when the internship is officially done.
If I manage to find another paid internship or a remote paid full time or part-time job, that would be great.&lt;/p&gt;
&lt;p&gt;I am aiming to secure opportunities that will provide me with the exposure and chance for progression in the world of web development and Open-Source software.&lt;/p&gt;
&lt;p&gt;My three-month internship with &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; was a full-time remote internship which has made me come to appreciate the perks of working remotely.
I would love to continue doing so (working remotely), but if required, I am also able to move to a different region or country for work.&lt;/p&gt;
&lt;p&gt;I have a non-tech background in art, content creation for social media – I managed social media for an online platform called &lt;a href="https://celebu.online"&gt;Celebu Online&lt;/a&gt; and a creative arts group called &lt;a href="https://www.facebook.com/keleleatmakerere"&gt;Kelele @ Makerere&lt;/a&gt;.
I also have a background in writing – a skill that has greatly helped me with the technical writing bit of the &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; project.
I believe that this background provides me with a unique perspective on certain things, especially in the areas of usability, marketability, creativity, team-work and what consumers like.&lt;/p&gt;
&lt;p&gt;In five years’, time, I hope to be an exceptional software developer who has imparted the skills that she has learned to other younger people aiming to get into the field.
I hope to have empowered other people who wish to join this industry by teaching them what I know and exposing them to opportunities that will help them progress in their career, like I’ve had.
I hope to have scored a more permanent job doing the things that I love and effecting change in other people’s lives, one way or another, and I’m grateful to &lt;a href="https://mixxx.org"&gt;Mixxx&lt;/a&gt; and Outreachy for launching my career in the right direction.&lt;/p&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 12 progress</title><link href="//mixxx.acolombier.dev/news/2021-02-21-week-12-progress" rel="alternate"></link><published>2021-02-21T21:50:00+01:00</published><updated>2021-02-21T21:50:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-02-21:/news/2021-02-21-week-12-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the twelfth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I added the step by step tutorial on deck cloning for playing with a single turntable. See &lt;a href="https://github.com/mixxxdj/manual/pull/330"&gt;pull request #330&lt;/a&gt; I plan to do the same for beat juggling, but I want to get …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the twelfth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I added the step by step tutorial on deck cloning for playing with a single turntable. See &lt;a href="https://github.com/mixxxdj/manual/pull/330"&gt;pull request #330&lt;/a&gt; I plan to do the same for beat juggling, but I want to get feedback on how that looks before I proceed to do the same for beat juggling.&lt;/li&gt;
&lt;li&gt;I made the video tutorial introducing Mixxx to the first time user – a tutorial guided by &lt;a href="https://manual.mixxx.org/2.2/en/chapters/library.html"&gt;chapter 4&lt;/a&gt; of the manual. I’m still making edits to the video, but I’m hoping to finish with this by the end of the week.&lt;/li&gt;
&lt;li&gt;I lost a couple of days to long distance travels – from my home to the city and back. I had also to do bit of adjusting migrating from Windows to MacOS, but I’m getting there 🙂&lt;/li&gt;
&lt;li&gt;This week (since I’m writing this blog late), I will be making a pull request for &lt;a href="https://github.com/mixxxdj/manual/issues/293"&gt;issue #293&lt;/a&gt; (“Mention mp3 encoder in Recording chapter”). I posted a question in the comments section, hopefully I will get an answer this week.&lt;/li&gt;
&lt;li&gt;I'm also going to make another Youtube video tutorial and add other minor fixes to the Mixxx manual 🙂&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 11 progress</title><link href="//mixxx.acolombier.dev/news/2021-02-14-week-11-progress" rel="alternate"></link><published>2021-02-14T12:09:00+01:00</published><updated>2021-02-14T12:09:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-02-14:/news/2021-02-14-week-11-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the eleventh weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I successfully added &lt;a href="https://rekordbox.com/en/"&gt;rekordbox&lt;/a&gt; (and its icon) to the list of supported libraries in this &lt;a href="https://github.com/mixxxdj/manual/pull/322"&gt;pull request&lt;/a&gt; that I opened a long while ago – I was documenting the rekordbox library import.&lt;/li&gt;
&lt;li&gt;I also started …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the eleventh weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I successfully added &lt;a href="https://rekordbox.com/en/"&gt;rekordbox&lt;/a&gt; (and its icon) to the list of supported libraries in this &lt;a href="https://github.com/mixxxdj/manual/pull/322"&gt;pull request&lt;/a&gt; that I opened a long while ago – I was documenting the rekordbox library import.&lt;/li&gt;
&lt;li&gt;I also started a LinkedIn company page for Mixxx, on the suggestion of my mentor. I think it will be a great way to get Mixxx to reach an even wider audience. Here is the &lt;a href="https://www.linkedin.com/company/mixxx-dj/"&gt;link&lt;/a&gt; to the page.&lt;/li&gt;
&lt;li&gt;I learned something new this week! I learned how to use &lt;a href="https://linux.die.net/man/1/rsynchttps://linux.die.net/man/1/rsync"&gt;rsync&lt;/a&gt; and &lt;a href="https://www.openssh.com/"&gt;OpenSSH&lt;/a&gt; inside the &lt;a href="https://www.cygwin.com/"&gt;cygwin&lt;/a&gt; command-line environment to send files from one computer to another. The learning curve was slightly steep but I finally got the hang of it. I sent the YouTube Mixxx tutorials that I have made so far through the cygwin command-line to my mentor, Owen.&lt;/li&gt;
&lt;li&gt;I added more documentation to the track/library analysis section in the manual. The manual did not define what analysis does and why it is important, so I felt like it could easily be overlooked – especially by new users. I added some information about why users should do it in advance and what happens if they don’t. I opened a pull request &lt;a href="https://github.com/mixxxdj/manual/pull/351"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I didn't get to make the video introducing Mixxx to the first time user last week…a tutorial guided by &lt;a href="https://manual.mixxx.org/2.2/en/chapters/library.html"&gt;chapter 4&lt;/a&gt; of the manual. So will be doing that this week.&lt;/li&gt;
&lt;li&gt;I will continue working on &lt;a href="https://github.com/mixxxdj/manual/pull/330"&gt;pull request #330&lt;/a&gt;. I am taking a step by step instruction approach with documenting deck cloning in the cookbook. I hope to have made some progress with this pull request this week.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category></entry><entry><title>New in 2.3: Importing tracks and cues from Serato</title><link href="//mixxx.acolombier.dev/news/2021-02-08-new-in-2-3-serato-support" rel="alternate"></link><published>2021-02-08T11:18:15+01:00</published><updated>2021-02-08T11:18:15+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2021-02-08:/news/2021-02-08-new-in-2-3-serato-support</id><summary type="html">&lt;p&gt;As all of you probably know, Mixxx is the best DJ software in the market.
However, we've recently been made aware that a minor competitor has emerged and tries to steal that title from us - &lt;a href="https://serato.com/dj/pro"&gt;Serato DJ Pro&lt;/a&gt;.
The hardware support is nice, but since Serato is neither open-source nor …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As all of you probably know, Mixxx is the best DJ software in the market.
However, we've recently been made aware that a minor competitor has emerged and tries to steal that title from us - &lt;a href="https://serato.com/dj/pro"&gt;Serato DJ Pro&lt;/a&gt;.
The hardware support is nice, but since Serato is neither open-source nor as customizable, we're not too concerned.
From the user's perpective, switching to the most popular open-source DJ software in world seems like the obvious choice.&lt;/p&gt;
&lt;p&gt;Unfortunately, migrating from Serato to Mixxx is a lot of work - apart from familiarizing yourself with a new tool, all the countless hours you spent to organize and prepare the tracks in your old library are lost, and you need to start from scratch.
At least until now - if you're a Serato user and cast an eye on Mixxx, we've got a nice surprise for you.&lt;/p&gt;
&lt;h2&gt;Use your Serato library in Mixxx&lt;/h2&gt;
&lt;p&gt;In addition to &lt;a href="////mixxx.acolombier.dev/news/2020-07-20-new-in-2-3-rekordbox-support"&gt;Rekordbox device libraries&lt;/a&gt;, we added support for reading Serato's database files in Mixxx 2.3, too.
This means that the tracks from your &lt;a href="https://support.serato.com/hc/en-us/articles/203015464-Sorting-and-browsing-your-library"&gt;Serato library&lt;/a&gt; will show up in in the library table and can be directly loaded onto decks without the need to add the music directory in the preferences.
&lt;a href="https://support.serato.com/hc/en-us/articles/227561407-Crates"&gt;Crates created in Serato&lt;/a&gt; are also supported, so your collection is still neatly organized.&lt;/p&gt;
&lt;p&gt;If you have USB drives with a &lt;a href="https://support.serato.com/hc/en-us/articles/202304844-Using-a-USB-external-hard-drive-for-your-portable-library"&gt;portable Serato library&lt;/a&gt; on it, we've got you covered as well:
Libraries and crates on external USB drives will work on all supported platforms - even on Linux!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Serato library feature" src="////mixxx.acolombier.dev/images/news/serato-import-library.png"&gt;&lt;/p&gt;
&lt;h2&gt;Import your Beatgrid and Hotcues&lt;/h2&gt;
&lt;p&gt;Sorting tracks in your library is important, but preparing &lt;a href="https://support.serato.com/hc/en-us/articles/226518228-Cue-Points"&gt;cue points&lt;/a&gt; in tracks is probably the most time-consuming task.
Serato saves them in special file tags along with the other track metadata like title, artist and so on.
It took months of work, but we finally managed to &lt;a href="https://github.com/Holzhaus/serato-tags"&gt;reverse-engineer the binary formats&lt;/a&gt; used by Serato to a degree that allows us to parse this information and use it in Mixxx.&lt;/p&gt;
&lt;p&gt;This means you can import the positions, labels and &lt;a href="////mixxx.acolombier.dev/news/2020-08-25-new-in-2-3-hotcue-colors"&gt;colors of your hotcues&lt;/a&gt; into Mixxx automatically when you load the track for the first time.
Mixxx will also import the Beatgrid from Serato, which works for both Beatgrid that were automatically detected by Serato's track analyzer and those that you edited manually.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Beatgrid and Hotcues imported from Serato" src="////mixxx.acolombier.dev/images/news/serato-import-sbs.png"&gt;&lt;/p&gt;
&lt;p&gt;If you already added a track to your Mixxx library before support for reading Serato's hotcues was added, you can trigger a reimport of the metadata via the track context menu.
Note that this will clear your existing cuepoints in Mixxx if the track has any Serato hotcues.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Reimport metadata via context menu" src="////mixxx.acolombier.dev/images/news/serato-import-contextmenu.png"&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, a myriad of encoders and decoders for lossy formats such as MP3 and M4A/AAC exist, which leads to a situation where all decoders detect slightly different track start and end times for files from different sources.
Hence, your cues might end up shifted by a few milliseconds.&lt;/p&gt;
&lt;p&gt;We've done our best to mitigate the problem, but if you experience issues we'd appreciate if you get in touch with us on &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip Chat&lt;/a&gt; and work with us to make the offset correction more accurate.
Additionally, we've added a way to shift all cues for a track at once. This makes it possible to fix the cue positions if Mixxx fails to determine the correct offsets.&lt;/p&gt;
&lt;h2&gt;Support for other Serato metadata&lt;/h2&gt;
&lt;p&gt;Mixxx 2.3 will also import saved loops from Serato, but proper support for saving and restoring loops is scheduled for 2.4.
For the time being, we just import these loops into the Mixxx database and allow using their start position as regular hotcues.
That way, you can start using your loops once 2.4 is out without the need to reimport your metadata (which would undo your cue modifications in Mixxx).
Other Serato metadata that we parse include the &lt;a href="////mixxx.acolombier.dev/news/2020-10-24-new-in-2-3-track-colors"&gt;track color&lt;/a&gt; and the BPM lock status.&lt;/p&gt;
&lt;p&gt;Serato also stores other information like the overview waveform image, but we don't import that information in Mixxx 2.3.
&lt;a href="https://serato.com/dj/pro/expansions/flip"&gt;Serato Flip&lt;/a&gt; macros are not imported either, because Mixxx does not support that kind of functionality yet.
This is going to change with &lt;a href="////mixxx.acolombier.dev/news/2020-05-05-mixxx-gsoc-projects-2020"&gt;this year's GSoC project by Janek Fischer&lt;/a&gt;, so hopefully we'll be able to import them in the future.&lt;/p&gt;
&lt;h2&gt;Can Mixxx write Serato's Tags?&lt;/h2&gt;
&lt;p&gt;If you're running our development snapshots, you may have noticed that it's not possible to write cues from Mixxx into Serato metadata tags yet.&lt;/p&gt;
&lt;p&gt;At Mixxx, we believe vendor lock-in is a bad thing and that users should be free to use the DJ software they like best.
While these changes allow you to migrate from Serato to Mixxx with less friction we don't want to lock-in users into Mixxx either.&lt;/p&gt;
&lt;p&gt;This means we're looking into adding support for Serato metadata export in upcoming Mixxx releases.
Even for Mixxx-only users this would make it easy to transfer cue points between multiple computers.&lt;/p&gt;
&lt;p&gt;We &lt;a href="https://github.com/mixxxdj/mixxx/pull/3097"&gt;already&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/3101"&gt;have&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/3409"&gt;some&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/3421"&gt;code&lt;/a&gt; in the pipeline, but since it's a complex undocumented binary-only format we didn't want to rush adding support for writing these tags.
Bugs in the code or misconceptions about the format might lead to data loss and potentially even crash Serato, so extensive testing is necessary.&lt;/p&gt;
&lt;p&gt;Hence, it's still uncertain if support for Serato tag export will already land in Mixxx 2.3 - but stay tuned!&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="serato"></category><category term="library"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 10 progress</title><link href="//mixxx.acolombier.dev/news/2021-02-07-week-10-progess" rel="alternate"></link><published>2021-02-07T23:09:00+01:00</published><updated>2021-02-07T23:09:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-02-07:/news/2021-02-07-week-10-progess</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the tenth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made the necessary edits to the YouTube tutorial about the Mixxx community and uploaded it to YouTube.
 &lt;a href="https://www.youtube.com/watch?v=0f6QrjiFNJQ"&gt;Here is the link.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I had a brief video call with community team leaders from the …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the tenth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made the necessary edits to the YouTube tutorial about the Mixxx community and uploaded it to YouTube.
 &lt;a href="https://www.youtube.com/watch?v=0f6QrjiFNJQ"&gt;Here is the link.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I had a brief video call with community team leaders from the &lt;a href="https://www.torproject.org/"&gt;Tor Project&lt;/a&gt; to discuss more about the &lt;a href="https://explorer.ooni.org/country/UG"&gt;internet censorship situation&lt;/a&gt; that has been going on in Uganda.
 The purpose of the discussion was to understand more about how I am using Tor and other anti-censorship tools, and how it can be improved based on my feedback.&lt;/li&gt;
&lt;li&gt;To get some inspiration for the cookbook chapter, I read through the first few chapters of the Mixxx manual, looking for sections that could use the step by step instruction approach that the cookbook will provide.
 I found an area in the “&lt;a href="https://manual.mixxx.org/2.2/en/chapters/library.html#analyze-prepare-your-tracks"&gt;Analyze your tracks/ library&lt;/a&gt;” section that needed more explanation, and discussed it in the Zulip chat.
 I will be filing an issue and making a pull request for it soon.&lt;/li&gt;
&lt;li&gt;I lost a day of work to no electricity and maybe half a day to the poor internet speeds (some of the downsides to using VPNs).&lt;/li&gt;
&lt;li&gt;Next week, I will be working on a number of pull requests implementing suggested changes. One of them includes converting the deck cloning section into a step by step instruction guide as opposed to a whole article.&lt;/li&gt;
&lt;li&gt;I will be adding new sections to the same chapter with the same step by step approach – this will be my main task this week. All the (new) sections that I will be adding are subject to discussion. It is a work in progress 🙂&lt;/li&gt;
&lt;li&gt;Finally, I will be making another YouTube tutorial introducing Mixxx to the first time user… This tutorial will be guided by &lt;a href="https://manual.mixxx.org/2.2/en/chapters/library.html"&gt;chapter 4 of the manual&lt;/a&gt; and will go something like;&lt;ul&gt;
&lt;li&gt;Start the Mixxx software&lt;/li&gt;
&lt;li&gt;Import music to the Mixxx library - import your audio files&lt;/li&gt;
&lt;li&gt;Analyze your library tracks (what it means to analyze a track)&lt;/li&gt;
&lt;li&gt;Configure Sound output - especially if you're not using any DJ Hardware&lt;/li&gt;
&lt;li&gt;Play your first track with Mixxx&lt;/li&gt;
&lt;li&gt;The Mixxx manual - in case you need to refer to a Mixxx resource for help&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 9 progress</title><link href="//mixxx.acolombier.dev/news/2021-02-01-week-9-progress" rel="alternate"></link><published>2021-02-01T11:15:00+01:00</published><updated>2021-02-01T11:15:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-02-01:/news/2021-02-01-week-9-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the ninth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made a pull request &lt;a href="https://github.com/mixxxdj/website/pull/203"&gt;#203&lt;/a&gt; for this &lt;a href="https://github.com/mixxxdj/website/issues/200"&gt;issue&lt;/a&gt; that I had filed to correct the broken link to Paul Bloch of open Artist (creator of the Mixxx logo).&lt;/li&gt;
&lt;li&gt;I recorded the video tutorial …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the ninth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made a pull request &lt;a href="https://github.com/mixxxdj/website/pull/203"&gt;#203&lt;/a&gt; for this &lt;a href="https://github.com/mixxxdj/website/issues/200"&gt;issue&lt;/a&gt; that I had filed to correct the broken link to Paul Bloch of open Artist (creator of the Mixxx logo).&lt;/li&gt;
&lt;li&gt;I recorded the video tutorial about the Mixxx communities, following the script that I wrote the week before last.
 I got feedback for it from my mentor, and I need to do some editing.
 I will be editing and uploading this video next week, after getting feedback from the community on &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109176-documentation/topic/How.20to.20videos.20on.20YouTube"&gt;Zulip&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Following the discussion on GitHub for &lt;a href="https://github.com/mixxxdj/manual/issues/335"&gt;issue 335&lt;/a&gt;, I have rearranged the &lt;a href="https://manual.mixxx.org/2.2/en/chapters/livebroadcasting.html"&gt;Live Broadcasting – Start your own Internet radio chapter&lt;/a&gt; – mostly just headings.
 I made a pull request for it &lt;a href="https://github.com/mixxxdj/manual/pull/346"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Next week, I will be writing a script for the next video tutorial that I will be making (yet to decide which one but most likely it will be a 5-minute in-depth video about mixing (once the program is set up).
 I have homework to do with this one, considering the fact that I’m not a pro with mixing, but I look forward to the challenge.😅😅&lt;/li&gt;
&lt;li&gt;Once I have done my homework and written the script, I will record the video, send the first cut to my mentor for feedback before I re-record or edit the final video.
 Just like I did for the Mixxx communities video.&lt;/li&gt;
&lt;li&gt;I also realise that I need to do my homework on the cookbook. (See &lt;a href="https://github.com/mixxxdj/manual/pull/330#issuecomment-753349988"&gt;comment&lt;/a&gt; on cookbook chapter).
 I need to choose topics that will not conflict with the &lt;a href="https://manual.mixxx.org/2.2/en/chapters/djing_with_mixxx.html"&gt;DJing with Mixxx chapter&lt;/a&gt;.
 Some of the topics that I had chosen earlier were similar…. with the content in this chapter. This will be my assignment this week.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Contributing to open source amid Uganda’s internet restrictions</title><link href="//mixxx.acolombier.dev/news/2021-01-24-internet-censorship" rel="alternate"></link><published>2021-01-24T14:00:00+01:00</published><updated>2021-01-24T14:00:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-01-24:/news/2021-01-24-internet-censorship</id><summary type="html">&lt;p&gt;In the days leading up to the Ugandan election, access to major social media platforms and circumvention tools was blocked. This internet shutdown and the social media ban that followed affected many online jobs and businesses, my internship with Mixxx under the Outreachy program was no exception.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Internet shutdown" src="////mixxx.acolombier.dev/images/news/internet_shutdown.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Last week, amid the 2021 general election, Uganda was disconnected from the internet entirely.
The country experienced a widespread internet blackout that lasted 4 days, starting on the eve of the election (13th January 2021) and ending in the morning of 18th January 2021.
In the days leading up to the election, access to major social media platforms and circumvention tools was blocked – even when the OTT (Over the Top) tax (commonly referred to as the “Social Media Tax”) was paid.
This internet shutdown and the social media ban that followed affected many online jobs and businesses, my internship with Mixxx under the Outreachy program was no exception.&lt;/p&gt;
&lt;p&gt;Before I write this article, one thing to note is that Ugandans have been in this internet battle with the government for quite some time now.
The internet shut down came as a surprise when it did, but at the end of the day, I feel like we should have seen it coming.
By the time it dawned on us that the internet really had been disconnected, we were already in darkness, with only the people physically close to us to express our shock too.
The audacity of this government!&lt;/p&gt;
&lt;p&gt;As the years go by, our President, H.E Yoweri Kaguta Museveni, has been feeling a lot of pressure about the presidential seat.
If elections were conducted freely and fairly, you would notice a declining trend in the number of votes his political party (NRM) has been getting over the years.
Ugandans are tired, and they want change. They have been more vocal about the injustices that have been happening in the country and it has cost them their lives, even their families’.
This resistance from the public has been causing anxiety in State House, and it’s starting to show.&lt;/p&gt;
&lt;p&gt;In the 2016 presidential elections, Ugandan authorities blocked access to Facebook, Twitter and WhatsApp saying the platforms would be used by the opposition to mobilize protests.
(&lt;a href="https://www.bbc.com/news/world-africa-35601220"&gt;This article from the BBC&lt;/a&gt; has more context on the social media blockage)
President Yoweri Museveni was facing a tough challenge from veteran activist Kizza Besigye, and he believed shutting down social media would help to curb the “threat”.
Authorities also suspended mobile transfers of money.&lt;/p&gt;
&lt;p&gt;In 2019, the government introduced a tax on the use of the social media, which activists have called an attempt at controlling free speech.
He said that the youth only use social media to gossip and spread wrong rumors (about him).
(&lt;a href="https://www.bbc.com/news/world-africa-44315675"&gt;This article from the BBC&lt;/a&gt; provides a better account of the imposition of the social media tax by President Museveni on Ugandans) .
He imposed OTT – Over the Top Tax and since then, it’s never been enough to simply have a good internet connection.
You have to pay a daily fee of UGX 200 to your Internet Service Provider, or if you’re being rebellious, a VPN application installed on your phone or computer.
He insisted that the revenue collected from the tax would help the country cope with the consequences of olugambo [gossiping].
I don’t know... but to me, these look like the actions of an increasingly anxious person in power.&lt;/p&gt;
&lt;p&gt;On 12th January 2021, the Uganda Communications Commission (UCC) ordered internet service providers in the country to immediately suspend any access and use of all messaging apps and social media platforms until further notice.
This was done so suddenly and without prior notice that it took most of us a couple of failed OTT subscriptions to realize that social media platforms had indeed been blocked.
Before that, internet speeds had become excruciatingly slow, it was any wonder we were able to get anything done in those few days.
A few days after the social media block, the government decided to shut down the entire internet! (The social media ban was simply not cutting it)
So when Google stopped working and our parents were restarting their phones several times, is when we realized that truly, there was no end to the surprises.&lt;/p&gt;
&lt;p&gt;During this (not so brief) period we were in total blackout. No internet services were available anywhere.
I was not doing any work as far as the Outreachy internship with &lt;a href="https://mixxx.org/"&gt;Mixxx&lt;/a&gt; goes.
I was not making any contributions, and sadly, that whole week went just like that.
We (devs) wondered if there was a backdoor to the whole situation, maybe some independent internet Service Provider that didn’t serve the government or something – lol.
I was not sure what to do without the internet so I read books, watched movies on CD, took nature walks, anything to pass the time. How did our forefathers survive without the internet ?&lt;/p&gt;
&lt;p&gt;&lt;img alt="Why Museveni banned social media" src="////mixxx.acolombier.dev/images/news/tweet_about_m7.png"&gt;&lt;/p&gt;
&lt;p&gt;So after NRM won the Presidential election, the internet was restored on Monday evening (18th January).
There is speculation regarding this matter as to who exactly restored the internet.
Word has it that it was &lt;a href="https://en.wikipedia.org/wiki/Anonymous_(group)"&gt;the Anonymous&lt;/a&gt; that had hacked the government systems and restored the internet.
On the other hand, neither the ISPs nor the Uganda Communications Commission openly came out to declare/ announce that internet had been restored.
The internet had been restored alright, but we still could not access social media.
Not with OTT, and definitely not with certain VPNs. But the election was over, was it not? Then why was social media still blocked?
This time, not only had social media been blocked, but all app stores, YouTube, and most VPN clients.
(&lt;a href="https://techjaja.com/social-media-vpns-app-stores-and-youtube-indefinitely-banned-in-uganda/"&gt;This article by techjaja&lt;/a&gt; provides more detail on the platorms that were banned in Uganda and when it happened.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="email from Roke Telecom to customer" src="////mixxx.acolombier.dev/images/news/email.jpg"&gt; &lt;img alt="Email from UCC" src="////mixxx.acolombier.dev/images/news/email2.jpg"&gt;&lt;/p&gt;
&lt;p&gt;At this point, I was ready for anything.
I had about two VPN applications installed – &lt;a href="https://psiphon.ca/en/download.html"&gt;Psiphon Pro&lt;/a&gt;, and &lt;a href="https://psiphon.ca/en/download.html"&gt;Thunder VPN&lt;/a&gt;.
Nothing was going to get in the way of work this time.]
The VPN connections were mostly flaky so I decided to add &lt;a href="https://psiphon.ca/en/download.html"&gt;Orbot&lt;/a&gt; and &lt;a href="https://www.torproject.org/download/"&gt;Tor Browser&lt;/a&gt; to that list.
Things were working for a while, but I should have known that the relief would be short-lived.&lt;/p&gt;
&lt;p&gt;I was working one day when I encountered this error while trying to access GitHub.
&lt;img alt="Github inaccessible" src="////mixxx.acolombier.dev/images/news/github_inaccessible.png"&gt;&lt;/p&gt;
&lt;p&gt;I thought that was odd, considering I’ve always accessed GitHub with no difficulty.
I didn’t think much of it. I thought that as long I could run commands in the git command line, I would be okay.&lt;/p&gt;
&lt;p&gt;While I was wrapping my head around the whole situation, Gus from the &lt;a href="https://www.torproject.org/"&gt;Tor Project&lt;/a&gt; asked if I would volunteer to run a simple test
(See &lt;a href="https://github.com/NullHypothesis/emma"&gt;the Emma repository on Github&lt;/a&gt;  for them to see if Tor Bridges were working. I said yeah! Sure!
Anything to bypass the next internet shut down.
So I had to access the repository for &lt;a href="https://gitlab.torproject.org/tpo/anti-censorship/emma"&gt;Emma (a lightweight censorship analyzer)&lt;/a&gt; on GitLab, but to my dismay, I could not access GitLab.
I got returned the same error “this site can’t be reached”.
&lt;img alt="Gitlab inaccessible" src="////mixxx.acolombier.dev/images/news/gitlab_inaccessible.png"&gt;&lt;/p&gt;
&lt;p&gt;Well, that’s just ridiculous, I thought.
I entered this URL in my browser &lt;a href="https://www.torproject.org/"&gt;https://www.torproject.org/&lt;/a&gt; to see if it was a “tor issue”.
The browser returned “This site can’t be reached”.
So then, I realized all Tor sites had been blocked too, probably because the government suspected that we would try to use Tor to bypass the internet restrictions.
Smart! I was pissed, but I thought it was smart.
I went ahead and opened the Tor Browser on my computer, pasted the same link there, copied the link to the repository and ran ‘git clone’ in my command line. Error!
&lt;img alt="Error with cloning Emma from gitlab" src="////mixxx.acolombier.dev/images/news/git_error_tor.png"&gt;&lt;/p&gt;
&lt;p&gt;I reported this error to Gus, who suspected that the &lt;a href="https://torproject.org/"&gt;https://torproject.org&lt;/a&gt; domain had been blocked.
He then gave me a link to a different GitHub repository with the same code to clone but I kept getting returned the same error “Failed to connect to github.com port 443: Timed out”.
&lt;img alt="Error with cloning Emma from a personal repo" src="////mixxx.acolombier.dev/images/news/emma_git_error.png"&gt;&lt;/p&gt;
&lt;p&gt;My suspicions were right – the government had blocked GitHub too. GitHub!
I did not understand the reason for this considering GitHub is not even a social media application.
It’s not a VPN either, so what was going on?! I thought I had been blacklisted by the government and they had blocked my IP address from accessing these sites or something.&lt;/p&gt;
&lt;p&gt;It was hard not to feel defeated. I wondered how I would get any work done if I couldn’t even use GitHub?
How would I get inspiration for the “Create video tutorials” project if &lt;a href="https://www.youtube.com/"&gt;YouTube&lt;/a&gt; was blocked?
I had the Tor Browser installed on my computer which I could use to access &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; and &lt;a href="https://about.gitlab.com/"&gt;GitLab&lt;/a&gt;, but that virtual connection only worked inside the browser.
I needed to have my entire system tunneled so that I could push and clone from GitHub through the git command line.
I turned my mobile VPN on and took my frustrations to Twitter.
&lt;img alt="For some reason, our government thinks github is a social media platform." src="////mixxx.acolombier.dev/images/news/tweet_github_blocked.png"&gt;&lt;/p&gt;
&lt;p&gt;A friend of mine then sent me a link, which I used to download the VPN for Windows.
I got the .exe setup downloaded on my phone, transferred it to my computer through Bluetooth, and run the installation.
It worked. &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; was working, everything was working fine.
I have tried asking other people if they are able to access GitHub.
Some are, but majority aren't. I thought it was an OS specific problem, but I was wrong.
A friend of mine who runs Linux on his computer does not need the VPN to push to GitHub, but I think it could just be coincidence.&lt;/p&gt;
&lt;p&gt;So now, the new order of things is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;boot computer&lt;/li&gt;
&lt;li&gt;connect to the mobile hotspot&lt;/li&gt;
&lt;li&gt;start VPN&lt;/li&gt;
&lt;li&gt;get to work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://ooni.org/post/2021-uganda-general-election-blocks-and-outage/#circumvention-tools"&gt;This report by OONI&lt;/a&gt;
shows network measurement data on the blocking of social media and circumvention platforms leading up to Uganda’s elections,
as well as IODA data (and other public data sources) on the internet blackout that occurred amid and following the election.
It provides &lt;a href="https://explorer.ooni.org/country/UG"&gt;a full account&lt;/a&gt; of all the sites that got blocked, when they did, and the various circumvention tools that could be employed to bypass the censorship.&lt;/p&gt;
&lt;p&gt;I think it’s disappointing that our government sees the internet as a nuisance, and have very little regard for basic human rights.
Internet costs in Uganda are already very high, considering the social media tax (OTT) on top of that.
However, now that social media has been banned, OTT has been rendered ineffective. We do not know how long this social media ban is going to go on for, though word has it that it is indefinite.
It could be permanent, they say. I asked a close friend who works with &lt;a href="https://www.ucc.co.ug/"&gt;UCC&lt;/a&gt; why &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; was being blocked, and he says that people would try to get updates and installations from GitHub (the same reason for blocking the app stores).&lt;/p&gt;
&lt;p&gt;So the question that lingers in my mind is, if the government successfully blocks all VPNs, as well as &lt;a href="https://www.youtube.com/"&gt;YouTube&lt;/a&gt; and &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; along with all the social media applications, what will happen to the jobs of all the Ugandan developers who work remotely, but most importantly, what will happen to my internship with Outreachy ??&lt;/p&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 8 progress</title><link href="//mixxx.acolombier.dev/news/2021-01-24-week-8-progress-report" rel="alternate"></link><published>2021-01-24T12:09:00+01:00</published><updated>2021-01-24T12:09:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-01-24:/news/2021-01-24-week-8-progress-report</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the eighth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Has been a little bit slow, to be honest. Internet speeds are much slower now because of all the Virtual Private connections that have now become the new normal.&lt;/li&gt;
&lt;li&gt;I wrote a script for …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the eighth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Has been a little bit slow, to be honest. Internet speeds are much slower now because of all the Virtual Private connections that have now become the new normal.&lt;/li&gt;
&lt;li&gt;I wrote a script for the In-depth video tutorial about the Mixxx communities; &lt;a href="https://mixxx.discourse.group/"&gt;the forum on discourse&lt;/a&gt;, &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip chat&lt;/a&gt;, Mixxx' social media platforms - &lt;a href="https://www.facebook.com/mixxxdj/"&gt;Facebook&lt;/a&gt; and Twitter, filing a bug report in the &lt;a href="https://bugs.launchpad.net/mixxx/"&gt;Mixxx launchpad&lt;/a&gt;, and then finally how to contribute to any of the Mixxx projects on &lt;a href="https://github.com/mixxxdj"&gt;GitHub&lt;/a&gt;.
 Submitted it to my mentor, in case I needed to make any adjustments, which I did.&lt;/li&gt;
&lt;li&gt;I was going through past articles on the Mixxx website when I came across this one about a minor website revamp and the creation of the current Mixxx website logo.
 I noticed that the link to Paul Bloch of Open Artist was broken so I opened an issue for this in the website repo &lt;a href="https://github.com/mixxxdj/website/issues/200"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Next week, I will record the YouTube tutorial about the Mixxx communities, following the script that I wrote this week.&lt;/li&gt;
&lt;li&gt;Following &lt;a href="https://aanyudeborah.wordpress.com/2021/01/24/the-difficulties-of-making-contributions-amidst-ugandas-internet-blackout/"&gt;the article&lt;/a&gt; that I published this week about the current internet censorship situation in Uganda, I will be contributing to a section in the Outreachy internship guide that will help future interns who might find themselves in a similar situation, navigate internet censorship in their own countries.
A draft pull request has been opened by Sage Sharp &lt;a href="https://github.com/outreachy/website/pull/458"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Outreachy wants to help future interns circumvent internet censorship" src="////mixxx.acolombier.dev/images/news/outreachy_censorship_tweet.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;So in addition to next week’s tasks, I will contributing to this pull request as well.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 7 progress</title><link href="//mixxx.acolombier.dev/news/2021-01-17-week-7-progress-report" rel="alternate"></link><published>2021-01-17T16:40:00+01:00</published><updated>2021-01-17T16:40:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-01-17:/news/2021-01-17-week-7-progress-report</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the seventh weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I created a YouTube channel for Mixxx tutorials and posted the first video. Its an installation tutorial for Windows OS. Here is the &lt;a href="https://www.youtube.com/watch?v=F0tTUb-JpzY"&gt;link&lt;/a&gt; to the YouTube video. This was early in the week …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the seventh weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I created a YouTube channel for Mixxx tutorials and posted the first video. Its an installation tutorial for Windows OS. Here is the &lt;a href="https://www.youtube.com/watch?v=F0tTUb-JpzY"&gt;link&lt;/a&gt; to the YouTube video. This was early in the week.&lt;/li&gt;
&lt;li&gt;Sadly, I did not get a lot done in this week, because our government (Uganda) decided to shut down the internet. We had no access to the web or any internet-based services for at least four days.
  The internet just got restored today (as I write, it's Monday of week 8) but social media is still blocked.&lt;/li&gt;
&lt;li&gt;Since I did not finish accomplishing some of &lt;a href="////mixxx.acolombier.dev/news/2021-01-04-week-5-progress-report"&gt;last week's tasks&lt;/a&gt;, I will work on those first then record the second YouTube tutorial. It will most likely be an in-depth video about mixing once the program is set up (following the first video).&lt;/li&gt;
&lt;li&gt;I will be working on issue &lt;a href="https://github.com/mixxxdj/manual/issues/335"&gt;#335&lt;/a&gt; as well. Finding a reasonable arrangement for the Record/ Broadcast your mix chapter.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 6 progress</title><link href="//mixxx.acolombier.dev/news/2021-01-12-week-6-progress-report" rel="alternate"></link><published>2021-01-12T10:05:00+01:00</published><updated>2021-01-12T10:05:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-01-12:/news/2021-01-12-week-6-progress-report</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the sixth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I got feedback for &lt;a href="https://github.com/mixxxdj/manual/pull/337"&gt;Pull request #337&lt;/a&gt;.
 I am required to arrange the descriptions in the order that the &lt;a href="https://deploy-preview-337--mixxx-manual.netlify.app/chapters/user_interface.html#headphone-and-master-mix-controls"&gt;headphone and master mix controls&lt;/a&gt; appear in the screenshots (left&amp;gt;right).
 I asked for clarification …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the sixth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I got feedback for &lt;a href="https://github.com/mixxxdj/manual/pull/337"&gt;Pull request #337&lt;/a&gt;.
 I am required to arrange the descriptions in the order that the &lt;a href="https://deploy-preview-337--mixxx-manual.netlify.app/chapters/user_interface.html#headphone-and-master-mix-controls"&gt;headphone and master mix controls&lt;/a&gt; appear in the screenshots (left&amp;gt;right).
 I asked for clarification on this task before I could tackle it, so I think this will be finished next week.
 In the meantime, I edited the description for &lt;a href="https://deploy-preview-337--mixxx-manual.netlify.app/chapters/user_interface.html#channel-faders-and-level-meters"&gt;channel faders and level meters&lt;/a&gt; and committed it.&lt;/li&gt;
&lt;li&gt;I am still working out a proper arrangement for the Record/ Broadcast your mix chapter. &lt;a href="https://github.com/mixxxdj/manual/issues/335"&gt;issue #335&lt;/a&gt; . This is still in the works, so, perhaps I will finalize this next week.&lt;/li&gt;
&lt;li&gt;I wrote a script for the “How to download and Install Mixxx” video tutorial, as well as the sequence that I will be following.
 I haven’t gotten around to recording this yet (as I’m still planning), so this video will be done early next week once I’ve figured out exactly how to go about it.&lt;/li&gt;
&lt;li&gt;I lost a day or two to really bad internet. Either that or the Ugandan government has already started limiting certain Google applications.
 This usually happens as we near the Presidential elections. Here is a recent article about this. &lt;a href="https://www.reuters.com/article/uganda-election-social-media/uganda-orders-all-social-media-to-be-blocked-letter-idUSL1N2JN0SH"&gt;Ugand orders all social media to be blocked&lt;/a&gt; .
 I couldn’t use Youtube (for research purposes) and at a certain point, I had no network bars completely.&lt;/li&gt;
&lt;li&gt;So most of this week went into research and planning, stuff that didn't really require the internet.&lt;/li&gt;
&lt;li&gt;Next week, I plan to record at least three video tutorials for the “Create video tutorials” project.
 This will be my main priority for this week.&lt;/li&gt;
&lt;li&gt;I will open a pull request for &lt;a href="https://github.com/mixxxdj/manual/issues/335"&gt;issue #335&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;And if time allows, I will make at least one addition to the Cookbook, or at least start a different conversation about it.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Mixxx to the first time contributor</title><link href="//mixxx.acolombier.dev/news/2021-01-08-mixxx-to-the-first-time-contributor" rel="alternate"></link><published>2021-01-08T17:38:00+01:00</published><updated>2021-01-08T17:38:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-01-08:/news/2021-01-08-mixxx-to-the-first-time-contributor</id><summary type="html">&lt;p&gt;Before the Outreachy internship program, I had never contributed to open-source software.
I didn’t know what open source software was (or how different it was from other software) until a friend explained it to me. Since  made my first contribution to Mixxx, I have learned a lot about different …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Before the Outreachy internship program, I had never contributed to open-source software.
I didn’t know what open source software was (or how different it was from other software) until a friend explained it to me. Since  made my first contribution to Mixxx, I have learned a lot about different open source software and the different ways that I can contribute.
I thought it was rocket science (because of the term “open source”) but really, it’s not.
I feel fortunate to have been offered the internship contributing to Mixxx, and now I can’t wait to share everything that I know about contributing to open-source software – Mixxx in particular.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mixxx logo" src="////mixxx.acolombier.dev/images/news/mixxx_logo.png"&gt;&lt;/p&gt;
&lt;p&gt;Mixxx is a free/open source DJ performance software for Windows/Mac/and Linux. It supports effects, harmonic mixing, beat matching with thousands of users all over the world and it integrates the tools DJs need to perform creative live mixes with digital music files.&lt;/p&gt;
&lt;p&gt;Mixxx was first released in 2003 as a graduate student project, and then it was picked up by the community and greatly enhanced. Mixxx has an unusually broad community that encompasses performing musicians, C++ programmers, amateur DJs, Internet radio broadcasters and even casual users. All contributors, from programmers to skin designers to translators are unpaid volunteers, hence it is entirely community driven.&lt;/p&gt;
&lt;p&gt;Since Mixxx is completely free and also runs on older hardware, it is popular among people who want to try DJing or do not have the money to buy equipment or the latest fastest computers.
Also, most commercial competitors will not create (good) fully featured DJing applications for Linux OS, perhaps because of its &lt;a href="https://en.wikipedia.org/wiki/Usage_share_of_operating_systems"&gt;low desktop marketshare&lt;/a&gt;.
It is also the only DJ software that one can fully customize to one's needs, since full access to the source code is always available.
These, among many, are the reasons that set Mixxx apart from other DJing software.
In essence, Mixxx plays a vital role in allowing anyone anywhere to throw a party.&lt;/p&gt;
&lt;p&gt;I am contributing to Mixxx by improving their documentation (&lt;a href="https://manual.mixxx.org/2.2/en/"&gt;User manual&lt;/a&gt;).
Mixxx’s &lt;a href="https://manual.mixxx.org/2.2/en/"&gt;user manual&lt;/a&gt; does a decent job of explaining the application, however, there is lots of room for improvement.
Many users come to Mixxx without any prior experience DJing and are left wondering how to practically use the application to mix music.
My job as an intern is to improve the manual by explaining not only how to set up Mixxx and how to use specific features, but also explain the bigger picture of how to play music with Mixxx.
There is some information in the manual that is obvious or already explained in the application with tooltips but some of it may be deleted from the manual.
Other text may be moved directly into the Mixxx GUI. One of my major tasks is to explain information that would take too many words to adequately explain in the Mixxx GUI.
This also involves adding more links to specific sections of the manual from the Mixxx GUI (and edit the manual text with this context in mind).&lt;/p&gt;
&lt;p&gt;This project is important because it will better the experience of many first time users of Mixxx.
I had never used Mixxx before this internship and I think this turned out to be more of an advantage than a disadvantage.
I say this because if I was using a software for the first time, I would need to refer to the user manual a lot, and one of the things that I appreciate as a first time user is when documentation writers make the effort to explain technical application-specific concepts to non-developers and first time users in the simplest way possible.
Most long time users and developers of open source software might find difficulty doing this because they use these technical terms and apply these concepts every day in their work, therefore it comes easily to them.
It might slip a pro user’s mind once in a while that some terms might not be well known to the ordinary user.
So, as a newbie, I think that I am able to approach this project with fresh eyes and the perspective a first time user.
Are the concepts understandable? Are they easily relatable to the Mixxx graphical user interface? What sections of the manual need more emphasis? Are the directions easy to follow?
These are some of the questions that guide me as I work on this project.&lt;/p&gt;
&lt;p&gt;Another Mixxx project that I am working on for this internship is the YouTube video tutorials project.
Mixxx does not have enough updated video content on YouTube, and these videos are absolutely necessary for Mixxx’s documentation.
In this project, I create illustrative videos to help Mixxx users understand how to use the software and thus, can be used by professional DJs, aspiring DJs, music lovers, and casual users.
The project involves creating a series of short, brief videos for various playlists and they are mostly OBS Studio desktop recordings with voice-overs, coupled with some illustrative animations to keep the content fun and interesting.&lt;/p&gt;
&lt;p&gt;One of the things that I love about working on these projects is that the tools that I work with (git, OBS Studio, &lt;a href="https://www.movavi.com/videoeditor/"&gt;Movavi video editor&lt;/a&gt;, VSCode) are easy to use.
So I’m glad that I get to focus more on working on the actual tasks at hand, and not with the tools needed to get the tasks done (that happens sometimes 😊).
I make edits in &lt;a href="https://docutils.sourceforge.io/rst.html"&gt;reStructuredText&lt;/a&gt; (.rst) for the manual and &lt;a href="https://www.markdownguide.org/basic-syntax/"&gt;markdown&lt;/a&gt; (.md) for the website.
I found these two lightweight languages easy to learn and work with, so I was happy to get over that learning curve in no time (I’m still learning though).&lt;/p&gt;
&lt;p&gt;Another thing that I love about working on Mixxx’s “Improve User manual” and “Create Video Tutorials” projects is that I get to contribute to an open-source project that many people rely on.
Some of the work that I do represents a solution to a problem that others may experience as well.&lt;/p&gt;
&lt;p&gt;Through contributing to Mixxx, I have gained a much deeper understanding of the software.
It was not easy in the beginning as I had to determine which part of the project was worth contributing to.
Understanding the contribution guidelines also took me a day or two, and I made mistakes here and there, but that is all expected.
It also took me a while to understand some of the issues that were opened in the &lt;a href="https://github.com/mixxxdj/manual"&gt;manual repository&lt;/a&gt; on GitHub – determining where the problem was and why it was a problem, researching on the issue and then finally making the requested changes.
Once you’ve gone through these steps, you will have gained a much deeper level of knowledge and understanding of the project at hand.
Contributing to an open-source project, in the end, lets you reach a higher level of expertise. Something that cannot be easily achieved by simply reading books or using the project at hand.&lt;/p&gt;
&lt;p&gt;Before I learned about Mixxx, I was experimenting with &lt;a href="https://www.virtualdj.com/"&gt;Virtual DJ&lt;/a&gt; but I didn’t use it often.
I only knew the basics of loading a song on a deck, cueing, crossfading into another song, and beatmatching. (Man, I felt like a real DJ!)
I knew enough to record a mix for my friends or get a high school party going, nothing too complicated 🙂&lt;/p&gt;
&lt;p&gt;However, since I started working with Mixxx, I have learned a couple (understatement of the week) of new terms and concepts such as analyzing your tracks, the auto DJ feature (this is the coolest feature for me), microphone ducking (I always saw DJs do this, but I did not know that this was it was referred to), harmonic mixing, the difference between a crate and a playlist, kill switches among many other things.&lt;/p&gt;
&lt;p&gt;When I first started contributing to Mixxx (during the contribution phase), I was fortunate enough to be in a &lt;a href="https://mixxx.zulipchat.com/"&gt;community&lt;/a&gt; of really supportive people; developers, DJs, long time users of Mixxx, among others.
I learned how to get started on making a contribution by following the community chats in the different streams.
We (first-time contributors) all had the same questions.
“What next after cloning the manual repo?” “Which branches should we be creating ours off of?”
“Do you simply start working on an issue, or should you ask to have one assigned to you?”
I remember asking why the bugs reported in the &lt;a href="https://bugs.launchpad.net/mixxx/+bugs"&gt;launchpad&lt;/a&gt; didn’t have &lt;code&gt;documentation&lt;/code&gt; labels. 😌 Lol.&lt;/p&gt;
&lt;p&gt;Starting out can be confusing, so, based on my experience so far,  here are a few key suggestions that I would make to a first-time contributor of the “Improve User Manual” project or any other project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you ever get lost on how to start, try not to feel overwhelmed because you are not alone.
    You can always ask in the community Zulip chat, how to get started or even what tools you would need.
    But before you do so, I would suggest that you first read the &lt;a href="https://github.com/mixxxdj/manual#mixxx-user-manual"&gt;README.md&lt;/a&gt; in the repository of Mixxx’s User Manual or the respective project that you’re working on.
    It has well-written guidelines on how to get started, prerequisites for the installation of some of the tools you will need, how to build your project and view it before you can commit it, how to troubleshoot in case you run into an issue, and so much more!
    In addition, there are high chances that what you want to ask in the community chat has already been asked in a previous conversation in the stream, so going through these messages can be helpful for you, especially if you’re shy. 🙂&lt;/li&gt;
&lt;li&gt;Try to understand the working of Mixxx. Experiment with it.
    Learn about the different features and how they work, and how you can manipulate them to make good mixes.
    You don’t need to be a DJ to do this – the purpose for this is so that you understand better the project that you’re working on.
    It only makes sense that if you’re documenting a feature, let’s say microphone ducking, that you have Mixxx installed on your computer and that you have used microphone ducking before.
    I believe that doing this will give your work more context, and things will go smoother.
&lt;img alt="A DJing meme" src="////mixxx.acolombier.dev/images/news/bass_meme.png"&gt;&lt;/li&gt;
&lt;li&gt;Take note of the git tree structure.
    While working inside any branch in the repositories, make sure to understand the git tree for that repository so as to avoid running into git errors and then spending a lot of time correcting them.
    I forgot to do this once, and I all I can say is, I have never been frustrated about git in my life. I had to open a whole new pull request in the end. I wrote about this in my blog about &lt;a href="////mixxx.acolombier.dev/news/2020-12-06-struggles"&gt;struggles&lt;/a&gt;. (you can check it out 🙂 )&lt;/li&gt;
&lt;li&gt;Research on the issue you want to work on before you start working on it.
    This will help you understand what exactly you need to do and how to go about it.
    Some times the issues may not have enough detail in the description or the description may be too technical for you.
    Google is your best friend. I mean it.
    Leave no stone unturned by the time you start working on that issue!
    By doing this, you will find that you will have less commits as well (this is a good thing). It means that you understood what exactly needed to be done and did it.&lt;/li&gt;
&lt;li&gt;Build the manual to see your changes, before you commit your work upstream.
    I think this is important to note because it helps keep your branch clean with fewer errors and less commits.
    I believe maintainers love working with clean code because it makes their work easier (remember that they maintain a lot of code already).
    So with an organised git commit history, I believe you’re more likely to get a review on your work faster because you’ve made the reviewers’ and mentors’ work easier.
    You might be tempted to depend on the Netlify deploy previews to preview your changes but that means you would have to commit every minor correction that you’re making and that could potentially make your pull requests messy.&lt;/li&gt;
&lt;li&gt;Last but not least, your mentors are here for you. Do not hesitate to ask when you feel stuck. If you need more clarification, ask.
    Its okay to ask the same question twice because what’s important is that you understand and learn. Even better, ask your questions in the community streams.
    Leave it open so that you can receive different suggestions from various community members.
    It might open your mind up to new approaches to solving your problem.
    On the other hand, I am also [very] happy to help in case you have a question about this project or my experience in the internship.
    You can reach me on email at deborahtrez12@gmail.com or even in the &lt;a href="https://mixxx.zulipchat.com/"&gt;community Zulip chat&lt;/a&gt; at @Aanyu Deborah Oduman.
    I would be happy to hear from you!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, good luck with your first contribution, and happy documenting! 🙂&lt;/p&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 5 progress</title><link href="//mixxx.acolombier.dev/news/2021-01-04-week-5-progress-report" rel="alternate"></link><published>2021-01-04T09:00:00+01:00</published><updated>2021-01-04T09:00:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2021-01-04:/news/2021-01-04-week-5-progress-report</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the fifth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I finished working on moving “deck cloning” to the cookbook chapter BUT &lt;a href="https://github.com/mixxxdj/manual/pull/330"&gt;this pull request&lt;/a&gt; raised the question about how it differs from the “&lt;a href="https://manual.mixxx.org/2.3/en/chapters/djing_with_mixxx.html"&gt;DJing with Mixxx&lt;/a&gt;” chapter. It seems that there is sufficient …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the fifth weekly progress report of my Outreachy internship with Mixxx DJ.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I finished working on moving “deck cloning” to the cookbook chapter BUT &lt;a href="https://github.com/mixxxdj/manual/pull/330"&gt;this pull request&lt;/a&gt; raised the question about how it differs from the “&lt;a href="https://manual.mixxx.org/2.3/en/chapters/djing_with_mixxx.html"&gt;DJing with Mixxx&lt;/a&gt;” chapter. It seems that there is sufficient overlap to merge the two….&lt;/li&gt;
&lt;li&gt;I also finally finished moving all my past Outreachy blog posts to the website repo.&lt;/li&gt;
&lt;li&gt;I couldn’t go ahead with moving “&lt;a href="https://manual.mixxx.org/2.3/en/chapters/djing_with_mixxx.html"&gt;DJing with Mixxx&lt;/a&gt;” to the cookbook because I have to first figure out how the two chapters differ, and thus make the content differentiable. In any case, one of this week’s tasks is to clean up this same chapter. There is a lot of stuff mentioned in it and I received suggestions from some of the contributors to look at it with the eyes of a beginner. In other words, after the introduction, what are the most important aspects the manual should mention first, besides pointing to Preferences &amp;gt; Recording? What topics are most requested for by users? Can the sub-topics be re-ordered in that format?&lt;/li&gt;
&lt;li&gt;I also helped finish up a pull request opened up by one of the applicants from the Outreachy contribution phase. It hadn’t been worked on in a long time and I thought I would help. It was about finding a reasonable order for chapters in &lt;a href="https://manual.mixxx.org/2.3/en/chapters/user_interface.html#the-mixer-section"&gt;3.2. The Mixer Section&lt;/a&gt;. This &lt;a href="https://github.com/mixxxdj/manual/pull/337"&gt;pull request&lt;/a&gt; is yet to be reviewed. While working on this PR, I learned that even though you want to make a correction as little as a spelling mistake, you can’t push to other people’s repositories without them giving you write permission to their repo. 😊&lt;/li&gt;
&lt;li&gt;Finally, I worked on &lt;a href="https://github.com/mixxxdj/manual/issues/320"&gt;issue #320&lt;/a&gt; – Adding Screenshot of FX routing to effects documentation. The effect routing buttons are easy to overlook so I added a screenshot of the effect unit buttons located in the deck section of the skin to the manual, to make it more obvious. Here is a forum thread where a user overlooked the FX routing buttons: &lt;a href="https://mixxx.discourse.group/t/effect-rack-1-doesnt-work-for-deck-1-yet-works-in-headphones-master/20409"&gt;Effect rack 1 doesn't work for deck 1&lt;/a&gt; . I opened a pull request for this here.&lt;/li&gt;
&lt;li&gt;This week I will focus on working on the two chapters “DJing with Mixxx” and the “Cookbook”. The cookbook is my major internship project – so I think this will be a constant for the entire internship 😄. I will pick up on another open issue to work on as well, and then record a video tutorial – for real this time.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 4 progress</title><link href="//mixxx.acolombier.dev/news/2020-12-29-week-4-progress%20report" rel="alternate"></link><published>2020-12-29T23:55:00+01:00</published><updated>2020-12-29T23:55:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2020-12-29:/news/2020-12-29-week-4-progress report</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the fourth of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Last week, I mentioned that I was working on the cookbook chapter.
  I opened a GitHub issue for it &lt;a href="https://github.com/mixxxdj/manual/issues/329"&gt;here&lt;/a&gt;. I moved documentation about …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the fourth of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Last week, I mentioned that I was working on the cookbook chapter.
  I opened a GitHub issue for it &lt;a href="https://github.com/mixxxdj/manual/issues/329"&gt;here&lt;/a&gt;. I moved documentation about deck cloning that I found in &lt;a href="https://mixxx.discourse.group/t/new-in-2-3-deck-cloning/20267"&gt;this article&lt;/a&gt; to a new chapter of the manual that I called the cookbook.
  I opened a &lt;a href="https://github.com/mixxxdj/manual/pull/330"&gt;pull request for it here&lt;/a&gt; .
  I still have a couple of requested changes to make on it before it can get merged. I’m thinking that will be this week.&lt;/li&gt;
&lt;li&gt;I also mentioned in my previous blog post that I would be moving all my blog posts about my internship experience with Outreachy to the Mixxx website repository.
  I did that too. I opened a &lt;a href="https://github.com/mixxxdj/website/pull/177"&gt;pull request&lt;/a&gt; for that here. Just like the first, I still have a lot of changes to make (as requested) before it can get merged. I’m happy that I get to contribute to not just the Mixxx manual, but the website as well.☺&lt;/li&gt;
&lt;li&gt;Christmas day was on Friday. So I took some time off to spend with family from the 25th – 27th.
    I didn’t do a lot of work on these two and half days.&lt;/li&gt;
&lt;li&gt;This week, I plan to finish up on the above two pull requests.
  And then move onto moving the chapter “&lt;a href="https://manual.mixxx.org/2.3/en/chapters/djing_with_mixxx.html"&gt;DJing with Mixxx&lt;/a&gt;” to the cookbook.I planned to do this last week, but I didn’t get around to doing so.. This task will be moved to this week.&lt;/li&gt;
&lt;li&gt;I also plan to get/ create more content that I can add to the cookbook chapter…&lt;/li&gt;
&lt;li&gt;…and then pick an open &lt;a href="https://github.com/mixxxdj/manual/issues"&gt;GitHub issue&lt;/a&gt; that I can work on this week.&lt;/li&gt;
&lt;li&gt;I am not making Mixxx video tutorials as often as I hoped to.
    I think it’s because I am spending more time improving the Mixxx manual and contributing to the website repo – which is also okay. But this week, I should try to deliver on those promises that I made about making better &lt;em&gt;Getting Started&lt;/em&gt; videos.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 3 progress</title><link href="//mixxx.acolombier.dev/news/2020-12-23-week-3-progress" rel="alternate"></link><published>2020-12-23T08:09:00+01:00</published><updated>2020-12-23T08:09:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2020-12-23:/news/2020-12-23-week-3-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the third of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made a &lt;a href="https://github.com/mixxxdj/manual/pull/327"&gt;pull request #327&lt;/a&gt; in response to &lt;a href="https://github.com/mixxxdj/manual/issues/289"&gt;this issue&lt;/a&gt; .
  I  moved the standard effects mapping documentation to section 11.5 of the …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the third of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made a &lt;a href="https://github.com/mixxxdj/manual/pull/327"&gt;pull request #327&lt;/a&gt; in response to &lt;a href="https://github.com/mixxxdj/manual/issues/289"&gt;this issue&lt;/a&gt; .
  I  moved the standard effects mapping documentation to section 11.5 of the manual.&lt;/li&gt;
&lt;li&gt;Currently working on the cookbook chapter.
  I am moving documentation about deck cloning that I found in &lt;a href="////mixxx.acolombier.dev/news/2020-11-15-new-in-2-3-deck-clone"&gt;this article&lt;/a&gt; to a new chapter of the manual that I am calling the cookbook.
  I will then move onto moving the chapter “&lt;a href="https://manual.mixxx.org/2.3/en/chapters/djing_with_mixxx.html"&gt;DJing with Mixxx&lt;/a&gt;” to the cookbook as well.&lt;/li&gt;
&lt;li&gt;This week, I plan to move all my blog posts about my internship with Outreachy to the Mixxx website repository, and then if time allows,
  I will record another video tutorial about Mixxx DJ.&lt;/li&gt;
&lt;li&gt;I also plan to work on &lt;a href="https://github.com/mixxxdj/manual/issues/320."&gt;this GitHub issue&lt;/a&gt;
  and make a PR for it this week.&lt;/li&gt;
&lt;li&gt;I lost a couple of days to non-Mixxx related tasks.
  I had a slack week in general, in between finishing with University, submitting my project, moving out of my room, and then travelling home for the holidays – among other things. Because of this, I was not able to achieve all that I had planned to do this week. (see &lt;a href="////mixxx.acolombier.dev/news/2020-12-14-week-2-progress"&gt;Week 2 – progress report&lt;/a&gt;). However, I do plan make up for it this week, and at the end of the (official) internship period.😉&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>Improving our Website</title><link href="//mixxx.acolombier.dev/news/2020-12-15-website-improvents" rel="alternate"></link><published>2020-12-15T13:21:32+01:00</published><updated>2020-12-15T13:21:32+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-12-15:/news/2020-12-15-website-improvents</id><summary type="html">&lt;p&gt;Our website is now based on the &lt;a href="https://github.com/getpelican/pelican"&gt;Pelican&lt;/a&gt; instead of the &lt;a href="https://github.com/eudicots/Cactus"&gt;Cactus&lt;/a&gt; static site generator.
It supports blog posts natively and also supports pagination, archives, author pages and taxonomies likes categories and tags.
If you want to browse older news articles, using Pelican will make our website more easy to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our website is now based on the &lt;a href="https://github.com/getpelican/pelican"&gt;Pelican&lt;/a&gt; instead of the &lt;a href="https://github.com/eudicots/Cactus"&gt;Cactus&lt;/a&gt; static site generator.
It supports blog posts natively and also supports pagination, archives, author pages and taxonomies likes categories and tags.
If you want to browse older news articles, using Pelican will make our website more easy to use.&lt;/p&gt;
&lt;p&gt;This also means that contributors that want to improve our website don't need a Python 2.7 installation anymore
(Python 2 has reached end-of-life since the beginning of the year).&lt;/p&gt;
&lt;p&gt;There are already &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/248802-website/topic/Mixxx.20website.20refresh"&gt;some ideas to modernize the look of our website&lt;/a&gt;, and with Pelican we'll have a more solid basis for that.
Join the discussion Zulip if you want to get involved!&lt;/p&gt;</content><category term="news"></category><category term="website"></category></entry><entry><title>SCons build system dropped in favor of CMake</title><link href="//mixxx.acolombier.dev/news/2020-12-14-scons-cmake-migration" rel="alternate"></link><published>2020-12-14T14:07:57+01:00</published><updated>2020-12-14T14:07:57+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-12-14:/news/2020-12-14-scons-cmake-migration</id><summary type="html">&lt;p&gt;If you wanted to compile a recent version of Mixxx 2.3 beta or 2.4 yourself, you may have already noticed that we removed our old and rusty &lt;a href="https://scons.org/"&gt;SCons&lt;/a&gt; setup in favor of &lt;a href="https://cmake.org/"&gt;CMake&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="////mixxx.acolombier.dev/news/2020-07-15-new-in-2-3-cmake"&gt;A few months ago&lt;/a&gt; we said that we were planning to ship Mixxx 2.3 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you wanted to compile a recent version of Mixxx 2.3 beta or 2.4 yourself, you may have already noticed that we removed our old and rusty &lt;a href="https://scons.org/"&gt;SCons&lt;/a&gt; setup in favor of &lt;a href="https://cmake.org/"&gt;CMake&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="////mixxx.acolombier.dev/news/2020-07-15-new-in-2-3-cmake"&gt;A few months ago&lt;/a&gt; we said that we were planning to ship Mixxx 2.3 with both SCons and CMake configurations (the latter would be considered "experimental").
However, that turned out to be impractical.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mixxx 2.3 building with CMake" src="////mixxx.acolombier.dev/images/news/mixxx-cmake-build.png"&gt;&lt;/p&gt;
&lt;p&gt;All of core developers started using CMake as their primary build system since &lt;a href="https://github.com/mixxxdj/mixxx/pull/2280"&gt;initial support for it was added&lt;/a&gt; more than a year ago.
Our build servers that we use to compile and test Mixxx during development have also been switched to CMake.
That means that the SCons build received a lot less testing compared to the CMake build.&lt;/p&gt;
&lt;p&gt;Due to the maintenance burden of keeping an additional build system and some problems with our SCons configuration that popped up recently, we decided to &lt;a href="https://github.com/mixxxdj/mixxx/pull/2777"&gt;remove SCons&lt;/a&gt; and use CMake exclusively for the upcoming 2.3 release.
That should free some resources and will allow us to work on more important issues than keeping our SCons build alive.&lt;/p&gt;</content><category term="news"></category><category term="development"></category><category term="2.3"></category><category term="beta"></category><category term="cmake"></category><category term="scons"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 2 progress</title><link href="//mixxx.acolombier.dev/news/2020-12-14-week-2-progress" rel="alternate"></link><published>2020-12-14T13:40:00+01:00</published><updated>2020-12-14T13:40:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2020-12-14:/news/2020-12-14-week-2-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the second of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made a &lt;a href="https://github.com/mixxxdj/manual/pull/322"&gt;pull request #322&lt;/a&gt; in response to &lt;a href="https://github.com/mixxxdj/manual/issues/157"&gt;issue #157&lt;/a&gt;.
  I added missing documentation about importing rekordbox libraries from rekordbox prepared devices into …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the second of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made a &lt;a href="https://github.com/mixxxdj/manual/pull/322"&gt;pull request #322&lt;/a&gt; in response to &lt;a href="https://github.com/mixxxdj/manual/issues/157"&gt;issue #157&lt;/a&gt;.
  I added missing documentation about importing rekordbox libraries from rekordbox prepared devices into Mixxx. This is still in review.&lt;/li&gt;
&lt;li&gt;I made my first YouTube Mixxx tutorial titled “Getting Started”.
  I posted the video in the chat, and got feedback from some of the other contributors. I plan to record another video, and make some adjustments this time (based on the feedback that I got from the first.)&lt;/li&gt;
&lt;li&gt;Currently working on &lt;a href="https://github.com/mixxxdj/manual/issues/289"&gt;issue #289&lt;/a&gt; –
  which is moving the Standard effects mapping documentation to the manual.&lt;/li&gt;
&lt;li&gt;I lost a day of work to correcting git errors while making the
  &lt;a href="https://github.com/mixxxdj/manual/pull/322"&gt;pull request #322&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I lost a day or two as well to re-recording the video tutorial and editing.
  I had recorded my voice and my computer screen at the same time, but that wasn’t working out too well. I later on decided to record my screen and voice separately and then merge the two in the final video.&lt;/li&gt;
&lt;li&gt;So this week, I plan to make another recording    for “Getting Started with Mixxx DJ” with the      suggested edits and then make a PR for &lt;a href="https://github.com/mixxxdj/manual/issues/289"&gt;issue #289&lt;/a&gt; and &lt;a href="https://github.com/mixxxdj/manual/issues/320"&gt;issue #320&lt;/a&gt;.
    I will also finalize the list of recipes to publish for the cookbook.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Struggles</title><link href="//mixxx.acolombier.dev/news/2020-12-06-struggles" rel="alternate"></link><published>2020-12-06T18:10:00+01:00</published><updated>2020-12-06T18:10:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2020-12-06:/news/2020-12-06-struggles</id><summary type="html">&lt;p&gt;Everybody struggles. This blog post is about a struggle that i went through in the past two weeks. I ran into this blocker while using git (as i normally do) and making some improvements on the Mixxx manual. I write about how i got stuck and the measures that i took to get unstuck.&lt;/p&gt;</summary><content type="html">&lt;h4&gt;I thought i knew git until this day - struggles&lt;/h4&gt;
&lt;p&gt;I hate feeling stuck.
Staring at your screen blankly, at the verge of ripping your hair out because you have exhausted all the possible solutions and none of them has worked.&lt;/p&gt;
&lt;p&gt;&lt;img alt="stressed out" src="////mixxx.acolombier.dev/images/news/frustrated_dev.jpg"&gt;&lt;/p&gt;
&lt;p&gt;It makes me second guess myself, what I know, how I got here, the education that I got and all of the things that have led me to this career path.
I have been in this position many times before and yet each time, the feelings of self-doubt are as fresh as the first time that I encountered a bug in my code (it was HTML by the way).
I was in this position last week, and I have to admit, its not a good feeling.&lt;/p&gt;
&lt;p&gt;It’s not that I did not know how to approach the task at hand.
I did, but perhaps, git had other plans that day. So what happened is that I hadn’t pulled the latest changes from the upstream branch in a very long time and by then, a lot had changed; the branches had been renamed (from &lt;code&gt;manual-2.3.x&lt;/code&gt; to just &lt;code&gt;2.3&lt;/code&gt;, and &lt;code&gt;manual-2.2.x&lt;/code&gt; to &lt;code&gt;2.2&lt;/code&gt;, and so on), new sections and content had been added by some of the Outreachy applicants during the contribution phase.&lt;/p&gt;
&lt;p&gt;I needed my work to be updated I did the usual git pull and I thought everything was fine.
I usually never break a sweat when working with version control because I have been using git for the longest time – I think it’s coming to four years now.
I created another branch from the &lt;code&gt;manual-2.3.x&lt;/code&gt; branch (remember it had been renamed) and I started working.
I finished making edits, committed, pushed and sat back as my code got tested on GitHub. My problems began when my code failed all of the checks on GitHub.
In my head, I was like, “Wait, what?”.
&lt;img alt="failed checks" src="////mixxx.acolombier.dev/images/news/failed_checks.png"&gt;
I was shocked because my code wasn’t even passing the basic RST syntax check. I began to panic.
I got the feeling that I had not pulled the latest work from the upstream even though I had run “git pull”.
Maybe I did, but perhaps I didn’t do it the right way. So many thoughts were running through my mind at this moment.&lt;/p&gt;
&lt;p&gt;Panicked, I began to run a myriad of Git commands.&lt;/p&gt;
&lt;p&gt;&lt;img alt="i run too many git commands" src="////mixxx.acolombier.dev/images/news/myriad_git.png"&gt;&lt;/p&gt;
&lt;p&gt;In doing so, I was required to fix merge conflicts. Now we all know how badly this can go.
You could easily push outdated work and set everybody ten steps back. Or you could easily commit completely wrong work – work that has been deleted or moved.
I tried to avoid fixing merge conflicts as much as I could, but in trying to do so, I made things worse, and I was not making any progress.
When I finally got the guts to fix the merge conflicts, my commits were actively trying to disorganise progress in the upstream.
Git revert wasn’t even enough to reverse the mess that I had pushed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="git revert doing the most" src="////mixxx.acolombier.dev/images/news/git_revert.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/how-im-working-to-overcome-my-struggles-as-a-junior-developer-a6ab18ac29b2/"&gt;Aimen Batool&lt;/a&gt; was right. It hurts when you don’t know how to resolve merge conflicts.
You spend hours finding the solution to a problem and then you end up losing your code in an attempt to fix the merge conflict.&lt;/p&gt;
&lt;p&gt;I looked for solutions from &lt;a href="https://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;, &lt;a href="https://www.freecodecamp.org/"&gt;freeCodeCamp&lt;/a&gt; blogs, &lt;a href="https://medium.com/"&gt;Medium&lt;/a&gt; blogs, closed GitHub issues, and run them in my command line but none of them was working for me.
I got to a point where Google kept returning me the same search results, the same &lt;a href="https://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; solutions and that’s when I realised I was going in circles.
I was not achieving anything. I thought that I had missed something the first time, so the second time (and many after that) I would squint at my screen looking through the same solutions with a more critical eye but nothing!
I checked the code of the branch into which I was trying to merge on GitHub, and compared it with mine.
I realised that the work in my repo was quite outdated and for some reason, my local repo was refusing to sync with the upstream.&lt;/p&gt;
&lt;p&gt;By this time, I had run too many git commands in my git bash, therefore, in this process of trial and error, I couldn’t tell what had or hadn’t changed in my repo.
I had spent over nine hours on the internet searching for solutions and suggestions by people who had come across a similar issue.
I was tired, discouraged and all out of options. I heavily pondered on whether I should just come out and ask some of the contributors from the &lt;a href="https://mixxx.zulipchat.com/"&gt;Mixxx community&lt;/a&gt; for help.
For lack of a better option, this is exactly what I did. I explained the errors that I was getting and how I got there.
They understood what the problem was and guided me on what to do. One of the things they told me to do was rebase on my branch, so I thought “okay….”.
I had never rebased on a branch before so I looked up what it meant.
I read a blog about it and after I had understood the concept, I told myself, I got it. I got it.
I ran a couple of other git commands and things looked like they would work out after all. I was happy. And then….&lt;/p&gt;
&lt;p&gt;I got to building. &lt;code&gt;sphinx-build&lt;/code&gt; generates documentation from the files in &lt;code&gt;sourcedir&lt;/code&gt; and places it in the &lt;code&gt;outputdir&lt;/code&gt;.
It will create documentation in different formats whereby a format is selected by specifying the builder name on the command line – the default is HTML.
So when I ran this command, I got extension errors. &lt;code&gt;Could not import extension xxx (exception: No module named 'xxx')&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I reached out again about this error and one of the contributors suggested that I install some build dependencies and build inside a python virtual environment.
Again, huge relief! I do everything as told and then build. At this point, I’m pretty confident that things will work out this time.&lt;/p&gt;
&lt;p&gt;&lt;img alt="extension errors" src="////mixxx.acolombier.dev/images/news/extension_error.png"&gt;&lt;/p&gt;
&lt;p&gt;The darned extension errors came back again. At this point, I just wanted to crawl under a blanket and scream. I am thinking “What is everyone going to think if I go back and ask about yet ANOTHER error?”
“What if they think that I’m not good enough?” “What if they finally see me for the fraud that I am?” (not that I am a fraud) “What if they start to wonder how I even landed this internship?” “What if my mentors get tired of my endless questions?” “What if the questions never end?”&lt;/p&gt;
&lt;p&gt;As hard as it was, I forced myself to ignore all these fears and just asked. Again.
By then, this conversation with my mentors was happening under a GitHub issue and the thread had gotten too long.
One of them then suggests that I should open a new topic in the community development help stream on Zulip so that the discussion on GitHub didn’t go too off-topic.
So I move the discussion there and the community starts helping me debug.
In my heart, I knew that nobody in the community would think less of me for asking about an error because, well, this is part of the reason for why the community exists in the first place – to help fellow Mixxx users find solutions to the various problems they are facing while using Mixxx.
Even with this knowledge in mind, I was scared and felt small.&lt;/p&gt;
&lt;p&gt;So the discussion in the community forum is going on very well, and I’m getting replies in not more than 10 seconds. I was pleasantly surprised by the community’s willingness to help with this (little) error.
And then just as I was getting comfortable, one of the community members suggested that I run &lt;code&gt;pip install sphinxcontrib-svg2pdfconverter&lt;/code&gt;.
I was thinking “It can’t be that easy” when I got returned &lt;code&gt;Successfully installed sphinxcontrib-svg2pdfconverter-1.1.0&lt;/code&gt; . So I ran &lt;code&gt;sphinx build&lt;/code&gt; one more time and it was successful! I couldn’t believe it took them all of two seconds (okay not two seconds, but it was really short time) to know exactly what was wrong with my code and provide me with the correct solution. It worked! I laughed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="lol" src="////mixxx.acolombier.dev/images/news/giphy2.gif"&gt;&lt;/p&gt;
&lt;p&gt;I laughed at how simple the solution was even though I never would have guessed that that was it all along.
I laughed at how long it took me to get here (it was a little over 9 hours) – to finally get the guts to ask somebody for help.
I laughed because if I had just asked for help the minute I got stuck, who knows how many GitHub pull requests I would have created by now (not that many, but still…). I just laughed and shook my head.
All my inhibitions seemed silly now, like, what did I think would happen, spontaneous combustion from embarrassment?!&lt;/p&gt;
&lt;p&gt;So, moving on, I was able to build and preview my work before committing and everything looked good. I went ahead and created a pull request for this issue, feeling relief to my toes. I watch as the tests on Github run my code and then my heart dropped.&lt;/p&gt;
&lt;p&gt;&lt;img alt="failed checks" src="////mixxx.acolombier.dev/images/news/failed_checks.png"&gt;&lt;/p&gt;
&lt;p&gt;Again?! These errors just keep on giving, huh? This time I wasn’t going to panic.
I told myself that I had been given all the resources that I needed to solve this, and if all failed, I would not waste time. I would reach out to somebody for help.&lt;/p&gt;
&lt;p&gt;I decided to start afresh, on a completely new page. I created a new branch,  made another pull request for the same issue, this time paying extra attention to the branch tree. Everything went smoothly and the checks passed (except for one) but I had been told before that that particular test was nothing to worry about. The joy!&lt;/p&gt;
&lt;h3&gt;Lessons learned&lt;/h3&gt;
&lt;p&gt;So through this experience, I was able to learn new concepts in git merging, committing, rebasing, and resolving merge conflicts. But besides that, here are a few key things that this experience has taught me.&lt;/p&gt;
&lt;p&gt;Firstly, we have to learn to ask for help when we need it, even when it seems like the hardest thing to do.
Despite what you think people will think about you when you ask for help, the fact is, asking for help will get you to where you want in way less time than repeatedly trying the same solutions that aren’t working or remaining seated and feeling dejected.
We have to be humble enough to acknowledge that indeed things aren’t working and then make the effort to try to reach out to somebody for help.&lt;/p&gt;
&lt;p&gt;Secondly, it’s always good to ask for help but before you do, please, do your research.&lt;/p&gt;
&lt;p&gt;&lt;img alt="the question" src="////mixxx.acolombier.dev/images/news/research.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Try to ensure that you have exhausted all the resources at your disposal so that by the time you ask, you are better informed about all the alternative methods you could have used, but didn’t for justifiable reasons.
You will not feel completely clueless when asked if you’ve tried a certain solution because you know that you tried it, and it didn’t work or that if you had tried it, it wouldn’t work for reasons A, B, C and D.
I believe mentors feel more enthusiastic about providing help if they see that the intern has put in the effort to look for a solution to the problem and they did it exhaustively. But then again, don't research for 9 hours😉.&lt;/p&gt;
&lt;p&gt;Thirdly. In  &lt;a href="https://www.freecodecamp.org/news/how-im-working-to-overcome-my-struggles-as-a-junior-developer-a6ab18ac29b2/"&gt;Syeda Aimen Batool’s words&lt;/a&gt; (who also got the suggestion from Sarah), “Do not take things personally and focus on learning”. I read this in his article just the other day and I feel like this piece of advice resonated with me.
He said that it can be hard to not take things personally and feel insulted when a senior dev or mentor makes a correction or suggestion.
It’s even harder when you’re working in open source and it’s in a public platform. The most important thing is to focus on the main points and have a learning attitude.
We won’t be able to learn new concepts and good coding practices unless we put all our ego aside and focus on learning from the experience and knowledge of others.&lt;/p&gt;
&lt;p&gt;And finally, it’s important to remember that everybody struggles.
Every pro dev started somewhere. They all faced some pretty difficult bugs and blockers but this is exactly how they became the senior developers that they are today. It’s all part of the journey.
Once we understand that it is completely normal to get stuck, then we can normalize asking for help when we need it.&lt;/p&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Week 1 progress</title><link href="//mixxx.acolombier.dev/news/2020-12-06-week-1-progress" rel="alternate"></link><published>2020-12-06T18:10:00+01:00</published><updated>2020-12-06T18:10:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2020-12-06:/news/2020-12-06-week-1-progress</id><summary type="html">&lt;p&gt;&lt;em&gt;This is the first of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I submitted &lt;a href="https://github.com/mixxxdj/manual/pull/313#pullrequestreview-543022384"&gt;pull request #313&lt;/a&gt; in response to this &lt;a href="https://github.com//issues/272"&gt;issue&lt;/a&gt;.
  I added the base commands for each platform (MacOS, Windows and Linux) onto the …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is the first of many weekly progress reports that I will be publishing for the duration of my Outreachy internship with Mixxx DJ&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I submitted &lt;a href="https://github.com/mixxxdj/manual/pull/313#pullrequestreview-543022384"&gt;pull request #313&lt;/a&gt; in response to this &lt;a href="https://github.com//issues/272"&gt;issue&lt;/a&gt;.
  I added the base commands for each platform (MacOS, Windows and Linux) onto the which the command-line options can be appended.&lt;/li&gt;
&lt;li&gt;Currently working on &lt;a href="https://github.com/mixxxdj/manual/issues/157"&gt;issue #157&lt;/a&gt; – which is documenting the Rekordbox library import.
  I had run into a slight problem with pulling the latest changes made by some of the outreachy applicants during the contribution phase. Luckily, some of the contributors from the Mixxx community helped me figure it out. It took me longer than I expected but I hope to have made a PR for this issue by the end of today.&lt;/li&gt;
&lt;li&gt;I have also been working on my first video tutorial on “Getting started with Mixxx”.
  The plan is to make it then share the link in the chat so that I can get feedback, before I make the final. This is my first time making a YouTube tutorial, so it’s taking me a little bit of time. I wanted to record my voice as I made the tutorial but I faced some difficulty doing both at the same time (focusing on the script and my actions at the same time). So I have decided to try making the video first, then recording my voice in the video after.&lt;/li&gt;
&lt;li&gt;Lost a day of work (maybe two) to the
  last two issues.&lt;/li&gt;
&lt;li&gt;I’m thinking of a proper way to start working on the cookbook.
  I will need to consult on this – whether it should be in GitHub pages, a GitHub repo with &lt;code&gt;*.rst&lt;/code&gt; files (like the manual) or….. a simple website or…. something else.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="personal"></category><category term="internship"></category><category term="manual"></category></entry><entry><title>About my Outreachy internship with Mixxx DJ: Intro</title><link href="//mixxx.acolombier.dev/news/2020-12-01-about-me" rel="alternate"></link><published>2020-12-01T23:15:00+01:00</published><updated>2020-12-01T23:15:00+01:00</updated><author><name>Aanyu Deborah Oduman</name></author><id>tag:mixxx.acolombier.dev,2020-12-01:/news/2020-12-01-about-me</id><summary type="html">&lt;p&gt;In October, &lt;a href="////mixxx.acolombier.dev/news/2020-10-01-outreachy"&gt;Mixxx announced&lt;/a&gt; that it had been accepted into the &lt;a href="https://www.outreachy.org/outreachy-december-2020-internship-round/communities/mixxx-dj-software/"&gt;Outreachy program&lt;/a&gt;. This program provides a three-month internship to work in Free and Open Source Software (FOSS) and I was selected as the first contributor! Hi, my name is Deborah and in this blog post, I will be introducing myself.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;In October, &lt;a href="////mixxx.acolombier.dev/news/2020-10-01-outreachy"&gt;Mixxx announced&lt;/a&gt; that it had been accepted into the &lt;a href="https://www.outreachy.org/outreachy-december-2020-internship-round/communities/mixxx-dj-software/"&gt;Outreachy program&lt;/a&gt;. This program provides a three-month internship to work in Free and Open Source Software (FOSS) and I was selected as the first contributor! I will work mainly on improving the &lt;a href="https://manual.mixxx.org/2.2/en/"&gt;Mixxx manual&lt;/a&gt; while making video tutorials teaching users how to use Mixxx. While I do so, I will document my journey and work in a series of posts here on the website.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;A little bit about me.&lt;/h2&gt;
&lt;p&gt;My name is Deborah Aanyu, from Uganda.
I am 23 years old. I come from a family of five children – I am the eldest.
I have been in Catholic (single sex) school for most of my education, and it was during this time that I got to appreciate the beauty of God in the world, and in my life. I was in mixed school for only two years, up until University.
As an adventurous person, I like to try out a lot of things; from art and painting, to singing, writing, sports (basketball), web development, among other things.&lt;/p&gt;
&lt;p&gt;I am generally optimistic and believe the good in people. I like to read and write.
I like to dream, talk, listen and see the sunrise in the morning.
I like to see the moonlight at night and feel the rain on my face.
I like flowers.
I like delicious food and comfortable shoes. I like warm clothes and a nice cup of tea.
I also love babies, nature and laughter. I love food and listening to music.&lt;/p&gt;
&lt;p&gt;I have been studying a Computer Engineering degree at Makerere University, Kampala for the last four years, and I finished my final examinations just recently. So I’ve been really excited about getting done with school and  having the time to focus on what I really want to do which is software development and contributing to Open source!!&lt;/p&gt;
&lt;p&gt;I will be working on improving Mixxx's user manual for the Outreachy Internship.
Mixxx DJ is an Open Source application for DJs that gives them the power to mix songs for free.
Each day that I wake up, I am so grateful for the opportunities that I am given, and looking at how I got here, I can’t help but feel enthusiastic for the journey ahead! I’m here for all of it.&lt;/p&gt;
&lt;p&gt;I would love to travel and see the world someday, meet new people and make new friendships.
There are many things that I would love to do, see, and experience.
I am also working towards attaining seniority level with web development (particularly with JavaScript) and just the MERN stack (MongoDB, Express, React and Node.js) in general. (Let’s give it one more year)
I aspire to be successful at everything that I do so that I can share my journey and use my experience to inspire other people, especially women.
I am passionate about women empowerment and would love to see more women leaders in the technology sector.&lt;/p&gt;
&lt;h3&gt;My top three core values&lt;/h3&gt;
&lt;h4&gt;Honesty&lt;/h4&gt;
&lt;p&gt;As a young teen, I was very shy – bordering on fearful. I feared everybody including my own parents.
I feared to do the wrong thing because I wanted to be in everybody’s good books.
I needed the approval of my friends, family and everybody who cared about me.
Because of this, I was telling lies all the time. I was turning into a diabolical liar.&lt;/p&gt;
&lt;p&gt;&lt;img alt="why you lyin'?" src="////mixxx.acolombier.dev/images/news/giphy.gif"&gt;&lt;/p&gt;
&lt;p&gt;I didn’t even lie because I had anything to hide. I lied so that I could tell only the best version of events.
I lied to avoid attracting too much attention to myself. I lied to make people happy.
I lied because I was fearful of the consequences, even if my actions were not wrong.&lt;/p&gt;
&lt;p&gt;Eventually, I got caught. I saw how my lies were affecting the people around me and my father asked, “why do you lie so much?” and I had no real reason, except for my low self esteem.
So it wouldn’t be enough to just stop lying (if it was that easy), but I had to work on my self-image, how I felt about about myself in relation to the people around me. One of the hardest things I had to practice at the time, was telling the hard truth, however terrible I thought it was.
I discovered that people would rather be told the harsh, disappointing, heart-wrenching (lol) truth, than be deceived with words you think they would rather hear.
I found that I would rather deal with the immediate, but brief disappointment that comes with telling the truth, as opposed to the hurtful or pained expressions on their faces when they found out about the lie.
I practiced this everyday, even though some days were harder than others, but it got easy. Eventually, the truth became the easier, most obvious option.
I didn’t have to think twice about it anymore and concoct stories.
A huge burden is lifted off my shoulders every time I tell the truth in a difficult situation, because I know it would probably be easier to lie.
I did not lie, and the world didn’t cave in.&lt;/p&gt;
&lt;p&gt;It is because of this phase in my life that I appreciate honesty so much more.
I appreciate it more because I know sometimes the truth can be very difficult, and it is not always easy to say. I appreciate honesty because it comes with no burden, and it leaves you free from guilt – of hurting others or causing even more damage.
I value honesty because I have seen first hand how badly it can affect relationships with loved ones, how it can end a marriage and a life long friendship.
Honesty is a core value for me because it has saved me from a lot of things and I can only imagine how my life would have been if I had been transparent from the start.&lt;/p&gt;
&lt;h4&gt;Respect&lt;/h4&gt;
&lt;p&gt;Respect has been a core value in my family for ages. Sometimes it is easy to take what we have for granted and forget that there are people who do not have half as much. We make friends, and build relationships with people from different backgrounds with different stories. Along the way, we get to peek into other people’s worlds and see how things are done there. It can be easy to judge other people for the way they do certain things just because they do them differently than what you’re used to. And often times, this judgement can reflect in our actions and facial expressions, which might not be very respectful.&lt;/p&gt;
&lt;p&gt;I believe that part of respecting other people in society is believing that we were all created differently and there is no singular way to get anything done.
I also believe that however learned we might be, there is always a thing or two we can learn from the people that we meet everyday.
When we respect people, then we might be humble enough to learn from their experiences and add to ourselves one way or another.
We all have different personalities, beliefs and values. We don’t always have to understand other people’s routines, cultures, beliefs and likes, but we can learn to accept that they are different than what our brains have accepted as the norm and that is okay.
We are all human, we bleed the same, and we shall cease to exist some day. We all have that in common.&lt;/p&gt;
&lt;h4&gt;Adventure&lt;/h4&gt;
&lt;p&gt;I truly believe everybody deserves to make the most of their time on earth! We only get one life, so don’t waste it.
Try new things, go to new places and meet new people!
Adventure can be applied to every aspect of our lives, from the food we eat, to the clothes we wear, to the music we listen to it. You don’t need much to try something new – just an open mind!
However, I respect that some people might prefer to have a routine and live by it every single day. When we are willing to get out of our comfort zone and try something new, we learn a little bit more about ourselves.
If you try chocolate ice cream for the first time and you don’t like it, then at least you know for sure that you don’t like it! You’ve learned something new about yourself!&lt;/p&gt;
&lt;p&gt;With an adventurous mindset, we become open to learning new things. We are more willing to gain new information and accept that there could be better out there in the world. We open our minds to new knowledge and become more willing to adjust to new changes and environments.
Adaptability becomes ingrained in us.&lt;/p&gt;
&lt;h2&gt;My motivation for applying to Outreachy&lt;/h2&gt;
&lt;p&gt;So my friend Jordan Rob, and I, are self-taught developers.
Everything we know, we got off Stack Overflow or YouTube (lol).
We have shared a number difficulties in trying to be better developers with each passing day.
With this in common, we promised to always lift each other up and encourage each other to take up new opportunities. We promised that we would not get comfortable and we would always strive to get better at what we do.&lt;/p&gt;
&lt;p&gt;So on a random day in August, Jordan tagged me in this tweet and said “let’s apply”. And I replied “kawa” meaning ‘okay okay’.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Outreachy expressly invites applicants from around the world who face under-representation, systemic bias or discrimination in the technology industry of their country. Apply for our internships, which are completely remote and paid ($6,000 stipend)." src="////mixxx.acolombier.dev/images/news/outreachy_tweet.png"&gt;&lt;/p&gt;
&lt;p&gt;I replied rather casually after finding out how competitive the application process was.
I think Jordan and I thought the same thing. “Do we even stand a chance?”&lt;/p&gt;
&lt;p&gt;What Jordan and I have in common is that we are both passionate about software development and if we come across any opportunities for growth in the tech sector, we will always look into them.
Jordan and I have had similar struggles both personally and professionally, and hence we kind of look out for each other in this particular field.&lt;/p&gt;
&lt;p&gt;However, one of my setbacks was that I had a slight case of the imposter syndrome (a psychological pattern in which an individual doubts their skills, talents or accomplishments and has a persistent internalized fear of being exposed as a “fraud”).
I was constantly thinking to myself that I needed to be a little bit better before applying for any job or internship.
And so I found myself stuck in a cycle of tutorials, learning more and more and never really using the knowledge to contribute to any real life applications.&lt;/p&gt;
&lt;p&gt;Before the start of this year, I did not know the meaning of ‘Open Source’. I had always thought that it was a fancy term for very-hard-to-code software. I had googled the term before, but the search results always brought up some blog posts (that I found quite intimidating) about “How to get started on your first contribution”, that I could not really relate with. So my friend Jordan Rob tags me, and I ask rather sternly what Open Source is really all about. And he breaks it down for me bit by bit.&lt;/p&gt;
&lt;p&gt;Once I discovered that I could contribute to software applications that people use everyday, in a major way, my excitement grew!
I did some research and found that I, too, could contribute to repositories of some of the most common and widely used software applications.
I was happy because my fraudulent feeling was wrong! I didn’t have to be an absolute pro at code to contribute because there were other significant ways that I could do so!
Through documentation, graphics and editing, video making, audio recording among several other ways. So when the Outreachy internship opportunity came along, I grabbed it with both hands!&lt;/p&gt;
&lt;p&gt;But my motivation for applying for the Outreachy internship does not end here.
I had always yearned for a chance to work on a project that I was really passionate about together with a group of really talented developers from whom I could learn a lot and come out of there several times better than I started.
I have a strong will to gain technical expertise and use the knowledge to make people’s lives better.
I was motivated by the thought that if I actively contributed to an open source project that people actively used, I would benefit from the transparency of collaboration and would be able to evaluate the risks associated with required features or bug fixes more precisely.
Moreover, I could actively shape the roadmap (by contributing) or at least influence its prioritization. How cool is that?!&lt;/p&gt;</content><category term="news"></category><category term="personal"></category><category term="outreachy"></category><category term="internship"></category></entry><entry><title>New in 2.3: Deck Cloning</title><link href="//mixxx.acolombier.dev/news/2020-11-15-new-in-2-3-deck-clone" rel="alternate"></link><published>2020-11-15T13:36:00+01:00</published><updated>2020-11-15T13:36:00+01:00</updated><author><name>Matthew Nicholson</name></author><id>tag:mixxx.acolombier.dev,2020-11-15:/news/2020-11-15-new-in-2-3-deck-clone</id><summary type="html">&lt;p&gt;Deck cloning (also called "instant doubles" in some other DJ software) is a highly anticipated feature added in Mixxx 2.3. In short, it does what it says on the tin. When activated, the currently loaded song, playback state, pitch adjustment, and any playing loop will be cloned from one …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Deck cloning (also called "instant doubles" in some other DJ software) is a highly anticipated feature added in Mixxx 2.3. In short, it does what it says on the tin. When activated, the currently loaded song, playback state, pitch adjustment, and any playing loop will be cloned from one deck to another. This opens up a number of creative mixing possibilities, some of which we will explore below.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Swapping decks using the deck clone feature" src="////mixxx.acolombier.dev/images/news/deckclone.gif"&gt;&lt;/p&gt;
&lt;h2&gt;How Do I Use Deck Cloning?&lt;/h2&gt;
&lt;p&gt;Deck cloning can be triggered several different ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Double press the &lt;code&gt;Load&lt;/code&gt; button on your controller, mixer, or keyboard (this can be disabled in the Decks page of the preferences)&lt;/li&gt;
&lt;li&gt;Invoke the &lt;code&gt;CloneFromDeck&lt;/code&gt; control in a controller mapping (see the complete &lt;a href="https://github.com/mixxxdj/mixxx/wiki/mixxxcontrols#channeln"&gt;Mixxx controls table&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Drag and drop a track from one deck to another in the UI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any of these actions will result in the currently loaded track being loaded on the target deck at the current play position and pitch setting. If the track is playing on the source deck, it will play from the same exact position on the target deck.&lt;/p&gt;
&lt;h2&gt;What Can I Do With Deck Cloning?&lt;/h2&gt;
&lt;p&gt;The deck clone feature enables many unique and creative possibilities. Let's dive into a few of them.&lt;/p&gt;
&lt;h3&gt;Playing With a Single Turntable&lt;/h3&gt;
&lt;p&gt;Typically, in a DJ setup, you have two decks and a mixer, but with the deck clone feature, it's possible to play with a single deck. Cue, beatmatch, and mix in the next track on a single deck. Once the track is mixed in, swap it to another channel using the deck clone feature, freeing up your single deck for the next track. This is useful if you are building out a DVS setup, but you only have one turntable so far or if you need to play with a minimal setup. For example, you may not have enough space for two decks or you might want to reduce the amount of gear you have to lug around. Finally, this method can be used as a backup way to keep playing if one of your turntables malfunctions.&lt;/p&gt;
&lt;h3&gt;Beat Juggling&lt;/h3&gt;
&lt;p&gt;Beat juggling is a technique in which a DJ creates various loops and patterns by playing the same track on two decks. In its simplest, four or eight bars of a track are played on one deck (typically a drum-only break), while on the other deck, the same track is cued up to the start of the same section. When the desired section ends on the first deck, the second deck is started and the crossfader is switched to play that deck. This process can be repeated as many times as desired, back and forth between the two decks, playing a tidy drum loop.&lt;/p&gt;
&lt;p&gt;Historically, this technique required two copies of the same record, but using the deck clone feature, the currently playing track can quickly be cued on a second deck in the right spot at the correct tempo. In modern times, with digital DJ setups, many beat jugging techniques can be done on a single deck using loops and hotcues. Still, when done using traditional methods, beat juggling is creative and impressive.&lt;/p&gt;
&lt;h3&gt;Put Your Best Hand Forward&lt;/h3&gt;
&lt;p&gt;Often, DJs and turntablists can only perform certain complex scratches with one hand or the other. The deck clone feature makes it easy to quickly swap which deck a song is playing on, enabling a performer to use whichever hand they prefer for scratching.&lt;/p&gt;
&lt;h3&gt;Doubles, Follows, and Chases&lt;/h3&gt;
&lt;p&gt;In this technique, the same track is played on two decks, but on the second deck, the track is played 1/2 a beat ahead or behind. The crossfader is used to strategically switch between the two decks, creating a delay effect. This can be executed using a deck clone followed by a beat jump of 1/2 a beat on the second track (or manually nudging the track so it ends up half a beat ahead or behind).&lt;/p&gt;
&lt;h3&gt;Current Track Preview&lt;/h3&gt;
&lt;p&gt;While playing a track, sometimes it can be useful to preview an upcoming section of the song. This can be done using the deck clone feature by cloning the playing track to the another deck, seeking ahead, and listening via the cue output in your headphones.&lt;/p&gt;
&lt;p&gt;The examples here are just scratching the surface. There are many creative possibilities that the deck clone feature enables. This feature is included in Mixxx 2.3. &lt;a href="////mixxx.acolombier.dev/download/#unstable"&gt;Download the beta&lt;/a&gt; and play around with it today.&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category></entry><entry><title>New in 2.3: Colorize your Tracks!</title><link href="//mixxx.acolombier.dev/news/2020-10-24-new-in-2-3-track-colors" rel="alternate"></link><published>2020-10-24T12:00:00+02:00</published><updated>2020-10-24T12:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-10-24:/news/2020-10-24-new-in-2-3-track-colors</id><summary type="html">&lt;p&gt;As a DJ your most important job is to find and cue the track you're going to play next to make the crowd go wild.
In Mixxx 2.2 you already had plenty of options to organize and add information to the tracks in your library to make this task …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As a DJ your most important job is to find and cue the track you're going to play next to make the crowd go wild.
In Mixxx 2.2 you already had plenty of options to organize and add information to the tracks in your library to make this task easier.
You can add them to playlists, put them into crates and access them as files in different directories via the "Computer" sidebar entry.
It's also possible to order your tracks by key or BPM to find a match for the currently playing track.&lt;/p&gt;
&lt;p&gt;For the next Mixxx version, we added another feature that helps you picking the next track to play at a glance:
It's now possible to assign an individual color to each track.
The track color is shown in a dedicated "Color" column in the library view. You can sort tracks by color by clicking on the respective header section like with any other column.
To make it easier quickly grasp a track's color Mixxx also uses it to paint the background of the whole table row when the column is hidden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Track colors in the Mixxx library" src="////mixxx.acolombier.dev/images/news/track-colors.png"&gt;&lt;/p&gt;
&lt;p&gt;Once you load a track into a deck, the track color is indicated on the deck itself.
You can also change the color using the new track menu by right-clicking on the deck:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Track colors on decks" src="////mixxx.acolombier.dev/images/news/track-colors-on-deck.png"&gt;&lt;/p&gt;
&lt;p&gt;How you use track colors is &lt;a href="https://djtechtools.com/2017/12/18/color-code-tracks-dj-collection/"&gt;up to you&lt;/a&gt;:
You could assign the similar colors to tracks with the same key, BPM or generally mix well together.
Another option is to colorize the tracks by energy or mood.&lt;/p&gt;
&lt;p&gt;Are you doing live mashups and elaborate sampling?
You can also use color coding to group tracks with fitting acapellas and samples.&lt;/p&gt;
&lt;p&gt;Or you use it for keeping your library clean:
Highlight tracks that you still need to prepare hotcues for or that need beatgrid adjustments.
You can also mark tracks that have bad sound quality and you're planning to replace later.&lt;/p&gt;
&lt;p&gt;Of course we also included controller support:
Like we did for &lt;a href="////mixxx.acolombier.dev/news/2020-08-25-new-in-2-3-hotcue-colors"&gt;hotcue colors&lt;/a&gt;, we added &lt;a href="https://github.com/mixxxdj/mixxx/wiki/mixxxcontrols"&gt;controls&lt;/a&gt; to access and modify the track color in controller mappings.
This means that if you're a mapping creator, you can now add support for displaying and modifying track colors from the your controller!&lt;/p&gt;
&lt;p&gt;Stay tuned for more cool features in Mixxx 2.3 that we'll publish prior to the final release!&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="library"></category></entry><entry><title>Mixxx Accepted to Outreachy. Please Donate!</title><link href="//mixxx.acolombier.dev/news/2020-10-01-outreachy" rel="alternate"></link><published>2020-10-01T09:00:00+02:00</published><updated>2020-10-01T09:00:00+02:00</updated><author><name>Owen Williams</name></author><id>tag:mixxx.acolombier.dev,2020-10-01:/news/2020-10-01-outreachy</id><summary type="html">&lt;p&gt;Mixxx is proud to announce that we have been officially accepted into the Outreachy program and are immediately raising funds to sponsor our first Intern for the December 2020 cycle!&lt;/p&gt;</summary><content type="html">&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;US Dollar donations&lt;/th&gt;
&lt;th&gt;Euro donations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opencollective.com/mixxx/contribute"&gt;&lt;img alt="Contribute on OpenCollective" src="////mixxx.acolombier.dev/images/news/opencollective_donate.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.gofundme.com/f/mixxx-dj-software-outreachy-internship/donate"&gt;&lt;img alt="Contribute on GoFundMe" src="////mixxx.acolombier.dev/images/news/gofundme_donate.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Realizing a More Diverse Community.&lt;/h3&gt;
&lt;p&gt;Mixxx is proud to announce that we have been officially accepted into the Outreachy program and are immediately &lt;a href="https://opencollective.com/mixxx"&gt;raising funds&lt;/a&gt; to sponsor our first Intern for the December 2020 cycle!
We first announced our intention to join with Outreachy back in &lt;a href="../2020-06-29-black-lives-matter"&gt;June&lt;/a&gt;, and we're excited that our plan is coming to fruition.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.outreachy.org/"&gt;Outreachy&lt;/a&gt; provides three-month internships to work in Free and Open Source Software (FOSS).
Outreachy internship projects may include programming, user experience, documentation, illustration and graphical design, or data science.
Interns often find employment after their internship with Outreachy sponsors or in jobs that use the skills they learned during their internship.&lt;/p&gt;
&lt;p&gt;Outreachy expressly invites women (both cis and trans), trans men, and genderqueer people to apply.
We also expressly invite applications from residents and nationals of the United States of any gender who are Black/African American, Hispanic/Latin@, Native American/American Indian, Alaska Native, Native Hawaiian, or Pacific Islander.
Anyone who faces under-representation, systematic bias, or discrimination in the technology industry of their country is invited to apply.&lt;/p&gt;
&lt;p&gt;More details and eligibility criteria can be found on the &lt;a href="https://www.outreachy.org/apply/eligibility/"&gt;Outreachy website&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.outreachy.org/apply/"&gt;&lt;strong&gt;Applications are open!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Internship Funding&lt;/h3&gt;
&lt;p&gt;Because Mixxx is an all-volunteer community, we don't yet have the funds we need to sponsor our first intern.&lt;/p&gt;
&lt;p&gt;That's where you come in!&lt;/p&gt;
&lt;p&gt;Our users have told us they want to give back, even though Mixxx is and always will be free.
This is your chance to show your love for Mixxx.
We've set up a fundraiser on OpenCollective so you can help Mixxx expand its contributor base and become a more vibrant, sustainable project.
You can make a one-time donation, or you can set up a monthly contribution too.
Our first goal is to sponsor our new Intern, and if we raise more than we need, we'll try to sponsor more than one.&lt;/p&gt;
&lt;p&gt;Even though Mixxx is free, please be aware that collecting money isn't.
Between payment processing fees and fundraiser hosting fees, the amount collected by Mixxx won't be as much as you pledged.
If you're able to add a few dollars to help defray those costs, we'd greatly appreciate it.&lt;/p&gt;
&lt;p&gt;We have two ways to give: &lt;a href="" title="https://opencollective.com/mixxx/contribute"&gt;OpenCollective&lt;/a&gt; is set up to receive donations in dollars, and we also have a &lt;a href="https://www.gofundme.com/f/mixxx-dj-software-outreachy-internship"&gt;GoFundMe&lt;/a&gt; to receive donations in Euros.
Please use whichever you wish!&lt;/p&gt;
&lt;h4&gt;OpenCollective&lt;/h4&gt;
&lt;p&gt;For now, the most efficient way to donate from the U.S. is with a direct bank transfer through OpenCollective.
If you're not comfortable giving your bank account information, you can use credit cards or paypal.
With PayPal and credit card processing, extra fees are charged from the donated money.
You can click on your donation to see how the exact fees were calculated, but generally there will be 10% deducted to pay for our fundraiser host and bank handling.
PayPal may add a 5% fee on top of the donated amount if currency conversion is required.
We have vetted these organizations and they are providing a great service to open source projects like ours, so we are confident that this portion of the money is going to a good place.
We are working with OpenCollective on reducing these overhead costs for future fundraisers.&lt;/p&gt;
&lt;h4&gt;GoFundMe&lt;/h4&gt;
&lt;p&gt;GoFundMe's fees are optional, so it may be a better option for those who want to donate with Euros.
This GoFundMe will only exist for the duration of this fundraiser, whereas OpenCollective will be a persistent platform for giving to Mixxx, and supports recurring donations.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;US Dollar donations&lt;/th&gt;
&lt;th&gt;Euro donations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opencollective.com/mixxx/contribute"&gt;&lt;img alt="Contribute on OpenCollective" src="////mixxx.acolombier.dev/images/news/opencollective_donate.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.gofundme.com/f/mixxx-dj-software-outreachy-internship/donate"&gt;&lt;img alt="Contribute on GoFundMe" src="////mixxx.acolombier.dev/images/news/gofundme_donate.png"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="news"></category><category term="outreachy"></category><category term="diversity"></category></entry><entry><title>New in 2.3: Color your Hotcues</title><link href="//mixxx.acolombier.dev/news/2020-08-25-new-in-2-3-hotcue-colors" rel="alternate"></link><published>2020-08-25T12:00:00+02:00</published><updated>2020-08-25T12:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-08-25:/news/2020-08-25-new-in-2-3-hotcue-colors</id><summary type="html">&lt;p&gt;Hotcues are a neat thing and one of the major benefits of digital DJing.
On analogue vinyl decks, you had had to put stickers to mark the different sections of a song and physically pick up, move and drop the needle to move to it.
With the move to digital …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hotcues are a neat thing and one of the major benefits of digital DJing.
On analogue vinyl decks, you had had to put stickers to mark the different sections of a song and physically pick up, move and drop the needle to move to it.
With the move to digital DJ setups, a new way to navigate tracks emerged: Hotcues now allow you to "bookmark" different spots in a track and quickly move to these positions in the blink of an eye, even while track is playing on the PA.&lt;/p&gt;
&lt;p&gt;Mixxx has supported them for more than 10 years now:
Initial support for numbered hotcues has been added in 2009.&lt;/p&gt;
&lt;p&gt;However, it can be challenging to remember the correct number in the heat of the moment.
Accidentally pressing the wrong hotcue pad is not something you or your audience want to hear.&lt;/p&gt;
&lt;h2&gt;Better Hotcue Labels&lt;/h2&gt;
&lt;p&gt;In 2015, support for hotcue labels was added to mitigate this problem.
These can be arbitrary text that is shown on the waveforms.
However, these were only shown on the scrolling waveforms, so you could not see them unless the track was close to that position.
Also, it was cumbersome to edit labels because this was buried in the track Properties dialog that was only accessible from the library.&lt;/p&gt;
&lt;p&gt;In Mixxx 2.3, we overhauled the way you can interact with hotcues using the mouse:
It's now possible to see the labels on the overview waveforms.
You can edit them directly from the waveform by right clicking.&lt;/p&gt;
&lt;p&gt;If you have long, descriptive labels on hotcues that are close together, Mixxx will elide the labels so they don't overlap.
You can still see the full label by hovering your mouse over an elided label.
Mixxx will hide any other labels this would be drawn over so the text is legible.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hotcue labels on overview waveforms" src="////mixxx.acolombier.dev/images/news/hotcue-colors-labels.png"&gt;&lt;/p&gt;
&lt;h2&gt;Color your Hotcues&lt;/h2&gt;
&lt;p&gt;But Mixxx 2.3 has yet another next major improvement for hotcues in the pipeline:
Hotcues can now have individual colors to make them visually distinguishable.&lt;/p&gt;
&lt;p&gt;How you color code your hotcues is up to you - one example would be to set red cues 16 beats before the drop or chorus, yellow 8 beats before it and color the start of vocals blue.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hotcue buttons and color picker" src="////mixxx.acolombier.dev/images/news/hotcue-colors-picker.png"&gt;&lt;/p&gt;
&lt;h2&gt;Pick the colors YOU like&lt;/h2&gt;
&lt;p&gt;By default, you can pick a color from the Mixxx Hotcue Color palette.
That palette contains 9 colors that are easy to distinguish.&lt;/p&gt;
&lt;p&gt;Personal preferences differ though, and it's probably impossible to suit everyones taste.
This is why - unlike most other DJ software - you are not restricted to the single predefined color palette we picked.&lt;/p&gt;
&lt;p&gt;If you previously used Serato DJ Pro, Rekordbox, Traktor or VirtualDJ and like their color palettes better ours, we've got you covered.
You can also use one of their palettes instead.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hotcue color palette selection" src="////mixxx.acolombier.dev/images/news/hotcue-colors-palette-combobox.png"&gt;&lt;/p&gt;
&lt;p&gt;But it doesn't stop there:
We also added a powerful color palette editor that can be used to rearrange and customize these palettes and even design &lt;em&gt;your own palette&lt;/em&gt; using any RGB colors you like.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hotcue color palette editor" src="////mixxx.acolombier.dev/images/news/hotcue-colors-palette-editor.png"&gt;&lt;/p&gt;
&lt;h2&gt;Automatic Coloring&lt;/h2&gt;
&lt;p&gt;When setting a hotcue, a single default color is assigned that you can select in the preferences.
You can then go ahead and change the color to your liking.&lt;/p&gt;
&lt;p&gt;While assigning a custom color to cue points after you set them is a nice feature, coloring all your cue points this way can be tedious and a lot of extra work.
If you want, Mixxx 2.3 can color new hotcues automatically for you - based on the hotcue number.&lt;/p&gt;
&lt;p&gt;A small example:
Say you want to set a cue point before the main vocal part, and you want it colored "blue".
You can configure Mixxx to always assign "blue" to the hotcues number 5, and then just set hotcue number 5 at the desired position - done.&lt;/p&gt;
&lt;p&gt;If you do this, that also means that a hotcue of the same type (e.g. "before main vocals") does not only have the same color but is also assigned to the same hotcue pad.
Hence, the possibility of getting confused during a gig is reduced even more than when just using colors as visual aid.&lt;/p&gt;
&lt;h2&gt;Bulk replace old hotcue colors&lt;/h2&gt;
&lt;p&gt;At some point, you might feel like your current scheme for color code hotcues lacking and unintuitive.
Maybe you simply don't like the colors anymore and would like to switch to a different palette.
Or you realize that you find the colorful hotcue buttons actually distracting and want to get rid of them.
If that happens, you may want to bulk replace the colors of existing hotcue in your library.&lt;/p&gt;
&lt;p&gt;We're not aware that any of our competitors in the DJ software market have such an option - Mixxx 2.3 has.
You can find a dialog for replacing colors on the "Colors" page in the preferences window.&lt;/p&gt;
&lt;p&gt;It allows bulk replacing hotcue colors for hotcues in your library and can be used to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;replace colors by hotcue number ("Set the color of all hotcues with number 5 to blue"),&lt;/li&gt;
&lt;li&gt;replace colors by current color ("Set the color of all red hotcues to blue"),&lt;/li&gt;
&lt;li&gt;combine the two conditions ("Set the color of all red hotcues with index 5 to blue"),&lt;/li&gt;
&lt;li&gt;negate them ("Set the color of all hotcues that are red but don't have number 5 to blue")  or&lt;/li&gt;
&lt;li&gt;just replace all hotcue colors in your library unconditionally ("Set the color of all hotcues to blue").&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Hotcue color replace dialog" src="////mixxx.acolombier.dev/images/news/hotcue-colors-replace.png"&gt;&lt;/p&gt;
&lt;h2&gt;Support for colored hotcues on controllers&lt;/h2&gt;
&lt;p&gt;You're a controller mapping creator and wondered how to make use of hotcue colors on your controller?
Then don't worry - we designed this feature with controller support in mind.&lt;/p&gt;
&lt;p&gt;When it comes to hotcue buttons, there are 4 types of controllers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Controllers without hotcue buttons&lt;/li&gt;
&lt;li&gt;Controllers with uncolored buttons&lt;/li&gt;
&lt;li&gt;Controllers with colored hotcue buttons that allow setting an arbitrary RGB color&lt;/li&gt;
&lt;li&gt;Controllers with colored hotcue buttons that only allow setting certain, predefined colors&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For controllers of types 1 and 2, nothing changes (obviously).&lt;/p&gt;
&lt;p&gt;For type 3, we made the RGB color of a hotcue accessible in controller scripts, so you can go ahead and implement support for it.
If your controller mapping uses our JavaScript Components library, this is quite simple:
You only need to implement the &lt;code&gt;HotcueButton::sendRGB(color)&lt;/code&gt; method, that sends the 3-byte RGB color value to the controller (e.g. via a MIDI-SysEx message, depending on your hardware).&lt;/p&gt;
&lt;p&gt;What about type 4?
Controllers that only allow choosing from a predefined color set were probably designed that way because they were sold with a software that does not allow assigned arbitrary colors to hotcues.
You can think of these predefined colors as a list, and usually you can set the pad color of these controllers by sending the color's index in that list as MIDI value.
For example, red could be color 1, blue is color 2, yellow is color 3, green is color 4 and so on.&lt;/p&gt;
&lt;p&gt;We added a &lt;code&gt;ColorMapper&lt;/code&gt; class that you can use to establish a mapping between these IDs and can be used to get the appropriate MIDI value for a given color.&lt;/p&gt;
&lt;p&gt;But what happens if you set a hotcue to a color that isn't supported by the controller?
Obviously, it's not possible to show the exact same color on your controller if the hardware simply doesn't support it - but don't worry, we've got you covered.&lt;/p&gt;
&lt;p&gt;In this case, &lt;code&gt;ColorMapper&lt;/code&gt; returns the ID of the color that is &lt;em&gt;most similar&lt;/em&gt; to the color you put in.
As an example, the hotcue color in Mixxx could be a darker shade of blue - ColorMapper will simply return the color for the regular blue color in this case, because it's the best match.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Hotcue colors on a controller" src="////mixxx.acolombier.dev/images/news/hotcue-colors-controller.gif" style="width: 100%"&gt;&lt;/p&gt;
&lt;p&gt;Seems complicated?
It doesn't have to be.
If your mapping already uses our JavaScript Components library, you can just create a &lt;code&gt;ColorMapper&lt;/code&gt; object, add it to the &lt;code&gt;HotcueButton&lt;/code&gt; and your colored hotcue pads should start working!&lt;/p&gt;
&lt;p&gt;We also added &lt;a href="https://mixxx.org/wiki/doku.php/mixxxcontrols"&gt;controls&lt;/a&gt; to to make it possible assign a different color to an existing hotcue from your controller - for example, the mapping for the Roland DJ-505 uses the PARAMETER -/+ buttons next to the hotcue pads to cycle through the color palette for most recently activated hotcue.&lt;/p&gt;
&lt;p&gt;Refer to our wiki if you want to integrate it into your controller mapping and check out the video below:&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="library"></category><category term="hotcue"></category><category term="color"></category><category term="controller"></category></entry><entry><title>Guest Article: DJ on the fly with Mixxx and Raspberry Pi</title><link href="//mixxx.acolombier.dev/news/2020-08-22-portable-mixxx-setup" rel="alternate"></link><published>2020-08-22T12:00:00+02:00</published><updated>2020-08-22T12:00:00+02:00</updated><author><name>dennis</name></author><id>tag:mixxx.acolombier.dev,2020-08-22:/news/2020-08-22-portable-mixxx-setup</id><summary type="html">&lt;p&gt;&lt;em&gt;One of the things that make Mixxx special is that it works on more platforms that just Windows or macOS.&lt;/em&gt;
&lt;em&gt;Thanks to Mixxx being open-source, it's possible to create "unusual" setups that the developers didn't expect - for example by running it on a low-cost Raspberry Pi single board computer combined …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;One of the things that make Mixxx special is that it works on more platforms that just Windows or macOS.&lt;/em&gt;
&lt;em&gt;Thanks to Mixxx being open-source, it's possible to create "unusual" setups that the developers didn't expect - for example by running it on a low-cost Raspberry Pi single board computer combined with a touchscreen.&lt;/em&gt;
&lt;em&gt;It's always great to see what cool stuff our users do with Mixxx, so when we discovered a video of it on Reddit, we asked Dennis to write a blog post about his project.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="UZam2aeX3Nc"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=UZam2aeX3Nc"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Going portable&lt;/h3&gt;
&lt;p&gt;Since the advent of small, portable netbook computers and single board computers I have been trying to downsize my DJ setup.
Frustrated by power issues, lack of performance and audio quality I resorted to a bulky but solid Thinkpad, a cheap controller and my software of choice: Mixxx.&lt;/p&gt;
&lt;p&gt;This is a small story on how developments in both open source hard- and software as well as a well-equipped parts bin ends up in a somewhat specific but usable portable DJ setup using Mixxx and a Raspberry Pi.&lt;/p&gt;
&lt;p&gt;This was until I was commissioned to make a random sound file player for an exhibition by &lt;a href="https://www.deplayer.nl/"&gt;De Player&lt;/a&gt;.
In a move that later proved to be somewhat overkill, I grabbed a Raspberry Pi 3 that had been collecting dust and wrote some scripts to play random audio files.&lt;/p&gt;
&lt;p&gt;Up until then I had only worked with the original Raspberry Pi and I was quite shocked at the greatly improved performance of the Pi model 3.
Out of curiosity, a quick search of the Rasbian software repository brought up a match for "Mixxx"... but wait, would it actually run?&lt;/p&gt;
&lt;h3&gt;Gaining power&lt;/h3&gt;
&lt;p&gt;To my surprise Mixxx did run fine!
With new found hope of building a "laptop-less" portable DJ setup I connected my USB sound card and cheap controller only to find out the Raspberry Pi could not deliver enough current to the USB port of the controller - no surprise there.&lt;/p&gt;
&lt;p&gt;Eager to keep the setup simple and portable, I did not want to deal with external powered USB hubs.
To no avail I tried various cheap USB cards and after many more low power warnings and high latencies, my eye fell on a white label brand controller (Akiyama Pulsar) with built-in soundcard.
This "Traktor ready" controller had been given to me over the previous owner's frustrations with the lack of mappings for any other software than Traktor.&lt;/p&gt;
&lt;h3&gt;Putting one and two together&lt;/h3&gt;
&lt;p&gt;Being both a controller and audio interface, the Akiyama Pulsar reduced the overhead created by multiple USB devices (?) allowing the Raspberry Pi to run Mixxx smoothly with less than 20ms latency and no underruns.
Note, this is without any optimizations to the Raspbian OS (no realtime kernel, no JACK) so there is possibly room for improvement!&lt;/p&gt;
&lt;p&gt;As there was no mapping for the controller I set out to create my own.
Most buttons are easily mapped using the GUI, but the jogwheels can be problematic.
Starting from an existing community contributed mapping script that did not intimidate me (Icon iDJ) and by launching Mixxx with the &lt;code&gt;--controllerDebug&lt;/code&gt; argument I was able to at least get the jogwheels to be somewhat reactive.&lt;/p&gt;
&lt;h3&gt;Skinning the fat&lt;/h3&gt;
&lt;p&gt;To make the setup extra portable I dressed my Raspberry Pi in a 2.8" Touch Screen that is long out of production.
Being rather impractical, I would suggest getting a larger screen.
Nevertheless, you will need a skin that accommodates the data you are interested in, while being readable on a small screen.&lt;/p&gt;
&lt;p&gt;Again I started off with an existing skin, an older "minimal" skin found on in an old Mixxx install (&amp;lt; 2.0.0) only to find out there is no scaling, only absolute values for size and position as well a different naming convention for buttons, making it incompatible with newer skins and mappings ("library" verus "playlist" for example).&lt;/p&gt;
&lt;p&gt;The skins provided by the later Mixxx distributions seemed rather indimidating at first but soon made me realized they are far more flexible than they look.
Next to dynamic scaling using &lt;code&gt;(e,e)&lt;/code&gt; units the newer default skins are somewhat modular.
Departing from LateNight i simply deleted the style xml files for the buttons/sections I did not need, ending up with a minimal two deck view of waveforms, track name, bpm and using a leftover key on my controller to show and hide the fullscreen library!&lt;/p&gt;
&lt;p&gt;The paths where Mixxx stores its default skins and controller mappings are different on various operating systems.
Working with both OSX and Raspbian this was somewhat confusing at times.
To add to this, the directory of the built-in skins/mappings is not the same as the user skins/mappings.
As soon as you edit a default mapping for example, it gets copied to your "user" settings directory.
Keep this in mind (and just edit/copy your custom mapping directly to your "user" settings folder).&lt;/p&gt;
&lt;h3&gt;In short&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Get a Raspberry Pi 3 Model B or newer&lt;/li&gt;
&lt;li&gt;Find a USB DJ controller with built-in sound-card.&lt;/li&gt;
&lt;li&gt;Get a powerbank that can deliver the right amount of current.
  The specifications advertised about most electronics don't seem to tell much, there is only one way to find out...try it out and let the &lt;a href="https://mixxx.zulipchat.com/"&gt;community&lt;/a&gt; know!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What is next?&lt;/h3&gt;
&lt;p&gt;The current setup is far from perfect. While being portable, allowing for a quick session at a friends place or even outdoors, the controller mapping and skin still need work.
So rather than sharing an end result I hope this post will encourage you to start tweaking your own settings and contributing to the Mixxx cause!&lt;/p&gt;
&lt;h3&gt;Read more&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Check out the complete how-to guide on this &lt;a href="https://github.com/dennisdebel/pi_dj"&gt;git repo&lt;/a&gt;. You will also find the skin and controller mapping there.&lt;/li&gt;
&lt;li&gt;A separate post for the skin I modified can be found &lt;a href="https://mixxx.discourse.group/t/skin-for-small-screens-wip/19607/5"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="mixxx in the wild"></category><category term="raspberry pi"></category></entry><entry><title>GSoC 2020: Adding Experimental Meter Detection</title><link href="//mixxx.acolombier.dev/news/2020-08-20-Meter-Detection" rel="alternate"></link><published>2020-08-20T12:00:00+02:00</published><updated>2020-08-20T12:00:00+02:00</updated><author><name>Cristiano Lacerda</name></author><id>tag:mixxx.acolombier.dev,2020-08-20:/news/2020-08-20-Meter-Detection</id><summary type="html">&lt;p&gt;One of the parts where Mixxx is lacking is how it handles time signatures and downbeats.
Currently, Mixxx only has individual beats but has no support for detecting or displaying additional information about the rhythm.&lt;/p&gt;
&lt;p&gt;This is going to change during this year's &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code (GSoC)&lt;/a&gt;, because we …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the parts where Mixxx is lacking is how it handles time signatures and downbeats.
Currently, Mixxx only has individual beats but has no support for detecting or displaying additional information about the rhythm.&lt;/p&gt;
&lt;p&gt;This is going to change during this year's &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code (GSoC)&lt;/a&gt;, because we have two students working on detecting and on displaying rhythm information.
This post focuses on the implementation of meter detection, which is a chance to put Mixxx ahead of some of its commercial competitors that just assume a 4/4 time signature for all tracks.&lt;/p&gt;
&lt;p&gt;The meter detection code is an extension of the tempogram &lt;a href="http://resources.mpi-inf.mpg.de/MIR/tempogramtoolbox/2010_GroscheMuellerKurth_TempogramCyclic_ICASSP.pdf"&gt;as described by Peter Grosche, Meinard Muller and Frank Kurth&lt;/a&gt; and is based on the QM Vamp plugin that implement such features.&lt;/p&gt;
&lt;p&gt;The tempogram is an analogy to spectogram and is a two-dimensional representation of onset detection function that captures the periodicity rate of note events. There are two main methods for capturing this periodicity the fourier transform which compares the onset function with periodic signals and the auto correlation function that compares the onsets with time shifted versions of itself. It's widely accepted that the salience of tempograms are able to capture the metrical structure of the music, but it's also easy to see that not all peaks are related to metrical information. This constitutes one of the biggest challenges for extracting the meter from such representations.&lt;/p&gt;
&lt;p&gt;It has been reported that combining both representations helps to enhance the meter relevant peaks. This is the approach followed in the meter detection code. As proposed by &lt;a href="https://qmro.qmul.ac.uk/xmlui/bitstream/handle/123456789/25936/QUINTON_Elio_Final_PhD_030817.pdf?isAllowed=y&amp;amp;sequence=1"&gt;Elio Quinton&lt;/a&gt; we call this combined tempograms the metergram.&lt;/p&gt;
&lt;p&gt;While the metergram does indeed improve the metrical information periodicity it's still not clear and easy to distinguish the metrical peaks from other spurious saliencies. Following the ideas of Quinton we implement a musically informed peak picking algorithm based on the fact that neighbor metrical levels are related by an integer ratio. We start with out beat pulse which is computed from the QM beat tracker and then filter the integer pulses that might match the measure level considering the range of 6 to 60 beats per minute. Here we use the term beat not to refer to the beat itself but the metrical in analysis.&lt;/p&gt;
&lt;p&gt;We then build metrical hierarchies by combining pulses that are apart by integer ratios and compute their weights by accumulating the weight of their constituent pulses and averaging them. Our chosen tempo range is usually large enough to accommodate the meter hierarchy of the accented beats inside a measure, beats per bar and phrases made of bars but this varies based on the beat pulse. By combining these pulses we are able to filter out individual pulses that do not match the metrical structure of the track.&lt;/p&gt;
&lt;p&gt;The track &lt;a href="https://www.youtube.com/watch?v=VQ2EyU75p2o"&gt;&lt;em&gt;Fuego&lt;/em&gt; by Alok &amp;amp; Bhaskar&lt;/a&gt; illustrates nicely the advantage of creating metrical hierarchies, instead of just looking at the highest peak. In this straight 4 on the floor beat, but the strongest pulse has a 17 beats length. However we can correctly detect the best hierarchy as &amp;lt;4,8,16&amp;gt;. In this case though there is an ambiguity of the phrase length, which could be 2 or 4 measures. By looking at the other hierarchies we can see that the &amp;lt;2,4,16&amp;gt; is stronger than the &amp;lt;2,4,8&amp;gt; which correctly indicates the 4 bar phrase used in this track.&lt;/p&gt;
&lt;p&gt;A second advantage of our metrical hierarchy is that it's very common for the strongest pulse of 4/4 tracks to be of length equal 2 beats, but these could be of any simple meter, again by combining the pulses we are usually able to correctly identify if a track is 4/4 or not. There are still some challenges to address. If our best hierarchy is &amp;lt;2,4,8&amp;gt; for example, how can we possibly distinguish a 2/4 track with 2 bars phrases from a 4/4 track that has its strongest pulse of 2 beats?&lt;/p&gt;
&lt;p&gt;One idea is to use the tempo as a hint, in the same way we can reasonably assume the right BPM is the one closest to 120, as opposed to double of half, we should also be able to reasonably assume that the a measure should be close to 2 seconds.&lt;/p&gt;
&lt;p&gt;A track that nicely illustrates this property is &lt;a href="https://youtu.be/-488UORrfJ0"&gt;&lt;em&gt;All Blues&lt;/em&gt; by Miles Davis&lt;/a&gt;. It has a 6/4 meter and is around 156bpm. Our best meter hierarchy is &amp;lt;3,6,12&amp;gt; and it's strongest pulse is of 3 beats length. But a 3 beats bar would be around 1.15 seconds while the 6 beats bar is 2.3 seconds.&lt;/p&gt;
&lt;p&gt;Finally we have a different kind of problem, that time signatures can be misleading and not always corvetely nicely in the meter hierarchy.  A 6/8 time signature for example, indicates that the measure has 6 eight beats, but it's a common practice for musicians to fit 2 dotted quarter notes, instead of 6 eights on those time signatures. For example, &lt;a href="https://youtu.be/__N8fMTZa-s"&gt;Pat Menethy's &lt;em&gt;Minuano (Six eight)&lt;/em&gt;&lt;/a&gt; is played like that. Our meter code estimates it's meter hierarchy as &amp;lt;2,4,8&amp;gt; which is wrong if we consider the time signature alone but 2 beats measure actually are correct if we consider the actual feel and meter of the song. Look how nice the 2 bar measure actually captures the six eight note onsets in this case:
&lt;img alt="6/8 track with 2 beats per measure" src="////mixxx.acolombier.dev/images/news/PatMenethyMinuano.png"&gt;&lt;/p&gt;
&lt;p&gt;On informal preliminary tests the meter detection code has an accuracy of around 80% which sounds nice on paper, but if we consider that probably 95% of tracks our users spins are 4/4 it still is more misleading than helpful.&lt;/p&gt;
&lt;p&gt;Another huge limitation is that it uses a winner-takes-it-all strategy and is unable to find time signature changes or metric modulations.
Although the meter is actually estimated at around 0.26 seconds windows, the output is to noise to be followed blindly and some smart algorithm still need to be developed with we want to follow changes.&lt;/p&gt;
&lt;p&gt;There are still issues to address and the code is still very experimental with a lot of rough edges, but can be tested at &lt;a href="https://github.com/mixxxdj/mixxx/pull/2877"&gt;2877&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2020"></category><category term="analyzer"></category></entry><entry><title>New in 2.3: Importing tracks and cues from Rekordbox removable devices</title><link href="//mixxx.acolombier.dev/news/2020-07-20-new-in-2-3-rekordbox-support" rel="alternate"></link><published>2020-07-20T12:00:00+02:00</published><updated>2020-07-20T12:00:00+02:00</updated><author><name>Evan</name></author><id>tag:mixxx.acolombier.dev,2020-07-20:/news/2020-07-20-new-in-2-3-rekordbox-support</id><summary type="html">&lt;p&gt;Do you rock your gigs armed only with your cans and a Rekordbox prepared USB flash drive? Ever been tempted to play your carefully curated tracks on something other than a CDJ or Rekordbox, on something that is free and open-source? We have news for you!&lt;/p&gt;
&lt;p&gt;Mixxx 2.3 will …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Do you rock your gigs armed only with your cans and a Rekordbox prepared USB flash drive? Ever been tempted to play your carefully curated tracks on something other than a CDJ or Rekordbox, on something that is free and open-source? We have news for you!&lt;/p&gt;
&lt;p&gt;Mixxx 2.3 will support reading the following from Rekordbox prepared removable devices on all of Mixxx's supported platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Folders&lt;/li&gt;
&lt;li&gt;Playlists&lt;/li&gt;
&lt;li&gt;Beatgrids&lt;/li&gt;
&lt;li&gt;Hotcues&lt;/li&gt;
&lt;li&gt;Memory cues&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can use this new feature now in &lt;a href="/download/#unstable"&gt;Mixxx 2.3 beta&lt;/a&gt;. This includes importing the key and BPM analyzed by Rekordbox, and comments and colors for tracks, cues and loops. &lt;strong&gt;We have to be clear however:&lt;/strong&gt; this feature &lt;em&gt;only&lt;/em&gt; reads Rekordbox prepared removable devices, such as USB flash drives or external hard drives. It &lt;em&gt;will not&lt;/em&gt; read your locally stored Rekordbox collection if you also have Rekordbox installed. The main Rekordbox database (both for Rekordbox 5 and Rekordbox 6) use completely different formats from the USB drives, so reading those databases would be a whole other project.&lt;/p&gt;
&lt;h2&gt;Importing from Rekordbox to Mixxx&lt;/h2&gt;
&lt;p&gt;After you have exported music to a USB drive in Rekordbox, simply plug it in while Mixxx is running. Click on Rekordbox in the library, and all USB drives prepared with Rekordbox will be visible (attach as many as you like!). Then click on the desired removable device, and all your folders and playlists that you have so tirelessly prepared will be revealed for you to play from.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mixxx showing a Rekordbox USB library" src="////mixxx.acolombier.dev/images/news/mixxx-rekordbox-usb.png"&gt;&lt;/p&gt;
&lt;p&gt;Some notes to keep in mind on how Rekordbox hotcues, memory cues, and loops are imported: Mixxx currently has one main cue point, one loop, and 38 hotcues. As such, all Rekordbox hotcues are mapped to Mixxx hotcues as expected, the first chronological Rekordbox memory cue is mapped to the Mixxx main cue, and the first chronological Rekordbox loop mapped to the Mixxx loop. All loops (including the first loop), and all subsequent Rekordbox memory cues are appended as Mixxx hotcues following the previously imported Rekordbox hotcues. A little confusing? Perhaps, but hopefully it will all make sense when you give it a whirl. Rest assured the hotcue and memory cue colors you assigned in Rekordbox are also imported, assisting in distinguishing between them. Also note that whilst the additional imported Rekordbox loops only appear in Mixxx 2.3 as hotcues, their loop details are preserved, ready for the multiple loop feature proposed for Mixxx 2.4!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Rekordbox USB library" src="////mixxx.acolombier.dev/images/news/rekordbox-6-usb.png"&gt;&lt;img alt="Mixxx showing a Rekordbox USB library" src="////mixxx.acolombier.dev/images/news/mixxx-rekordbox-usb.png"&gt;&lt;/p&gt;
&lt;p&gt;Also note that as with the Serato library feature{# TODO: Add link to serato blogpost #}, we have tried our best to mitigate against certain edge cases of audio files encoded in lossy formats (MP3 and AAC/MP4), where different software's decoders can interpret conflicting timing information, leading to shifted cue points and beatgrids. We hope these are all correct, but some cases may be milliseconds off, and if you find any of these, please let us know on &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We probably didn't get every case perfect, so we have added some buttons by the beatgrid editing buttons to shift all cue points in a track by 10 ms (left click) or 1 ms (right click) so you can correct the timing yourself. This only shifts cue points, not the beatgrid (because the same problem happens with Serato and Mixxx does not yet import the beatgrid from Serato). If you want to shift the beatgrid too, you can shift the cue points, then go to a cue point and press the beatgrid shift button.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mixxx showing a Rekordbox USB library and beatgrid adjustment buttons" src="////mixxx.acolombier.dev/images/news/mixxx-rekordbox-usb-beatgrid.png"&gt;&lt;/p&gt;
&lt;h2&gt;Can I prepare a Rekordbox removable device from Mixxx to use in a CDJ?&lt;/h2&gt;
&lt;p&gt;Sadly no, however this would be super cool! If you are so inclined to look at how to implement this and contribute back to Mixxx, it would be most welcome. A great to place to start would be looking into &lt;a href="https://doc.kaitai.io/faq.html#writing"&gt;Kaitai Struct serialization&lt;/a&gt; which is a prerequisite for writing the &lt;a href="https://github.com/Deep-Symmetry/crate-digger/blob/master/src/main/kaitai/rekordbox_pdb.ksy"&gt;PDB file format&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Shoutouts&lt;/h2&gt;
&lt;p&gt;As is often the case in open-source, the development of this new functionality was not possible without input from others. The new Mixxx Rekordbox removable device library feature builds upon the hard work already completed by &lt;a href="https://github.com/Deep-Symmetry"&gt;Deep Symmetry&lt;/a&gt; for the &lt;a href="https://github.com/Deep-Symmetry/crate-digger"&gt;Crate Digger&lt;/a&gt; library and &lt;a href="https://github.com/pestrela"&gt;Pedro Estrela's&lt;/a&gt; &lt;a href="https://github.com/digital-dj-tools/dj-data-converter/issues/3"&gt;research about MP3 timing shifts&lt;/a&gt; for &lt;a href="https://github.com/digital-dj-tools/dj-data-converter"&gt;DJ Data Converter&lt;/a&gt;. Kudos and keep up the great work!&lt;/p&gt;
&lt;h2&gt;Future work: CDJs as Mixxx controllers&lt;/h2&gt;
&lt;p&gt;On a related note, we have &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/113295-controller-mapping/topic/Pioneer.20CDJ-2000NXS2"&gt;started reverse engineering the HID protocol for the Pioneer CDJ 2000 NXS2&lt;/a&gt;. In future versions of Mixxx this would allow you to plug your laptop using Mixxx into CDJs via a USB cable and use your Mixxx library with the CDJs without needing Rekordbox at all. With the release of Rekordbox 6.0, this feature is now restricted in Rekordbox to customers paying a subscription fee, but &lt;a href="/news/2020-05-22-you-dont-need-to-pay-for-mixxx"&gt;Mixxx is free&lt;/a&gt; and unlike Rekordbox, Mixxx runs on Linux. You could even add another controller to a CDJ setup to control other Mixxx features such as an &lt;a href="https://github.com/mixxxdj/mixxx/wiki/Allen-&amp;amp;-Heath-Xone-K2-K1"&gt;Allen &amp;amp; Heath Xone K2&lt;/a&gt; for full control of Mixxx's effects while using CDJs!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pioneer CDJ 2000 NXS2 proof of concept" src="////mixxx.acolombier.dev/images/news/IMG_4627.JPG"&gt;&lt;/p&gt;
&lt;p&gt;We have &lt;a href="https://mixb.me/CDJHidProtocol/hid-analysis/startup.html"&gt;documented what we have learned about the protocol so far&lt;/a&gt; but there is still more to reverse engineer. After that, it will be more work to write a Mixxx HID controller mapping. If you have a CDJ 2000 NXS 2 or other CDJ model and want to get involved in this reverse engineering effort, &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109123-introduce-yourself"&gt;introduce yourself on our Zulip chat&lt;/a&gt; and let us know how you can help.&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="rekordbox"></category></entry><entry><title>New in 2.3: Build Mixxx with CMake</title><link href="//mixxx.acolombier.dev/news/2020-07-15-new-in-2-3-cmake" rel="alternate"></link><published>2020-07-15T10:00:00+02:00</published><updated>2020-07-15T10:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-07-15:/news/2020-07-15-new-in-2-3-cmake</id><summary type="html">&lt;p&gt;Starting with Mixxx 2.3, we're introducing experimental support for &lt;a href="https://cmake.org/"&gt;CMake&lt;/a&gt;.
This will probably be more interesting for people who are either compiling Mixxx themselves or going hack on its code base than for regular users, but it will make the build process more straightforward in the future.&lt;/p&gt;
&lt;p&gt;Mixxx has …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Starting with Mixxx 2.3, we're introducing experimental support for &lt;a href="https://cmake.org/"&gt;CMake&lt;/a&gt;.
This will probably be more interesting for people who are either compiling Mixxx themselves or going hack on its code base than for regular users, but it will make the build process more straightforward in the future.&lt;/p&gt;
&lt;p&gt;Mixxx has used &lt;a href="https://www.scons.org/"&gt;SCons&lt;/a&gt; as its build system for more than 13 years.
Since it's based on the Python programming language, it's quite flexible and can be used to customize every build step.
Unfortunately, it requires lots of boilerplate code to accomplish simple tasks.
This makes our build scripts hard to maintain on all platforms and has lead to problems in the past.&lt;/p&gt;
&lt;p&gt;Hence, we added support for the CMake build system (&lt;em&gt;or rather:&lt;/em&gt; build system generator), which many C++ developers are already be familiar with.
This has several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The code is more maintainable and requires fewer platform-specific hacks.
  Also, less code is necessary. To give you a rough idea:
  We managed to reduce the line count from approximately 8000 lines of Python code down to a 2300 line &lt;code&gt;CMakeLists.txt&lt;/code&gt; file plus modules.
  All in all we reduced the line count by almost 3000 lines.&lt;/li&gt;
&lt;li&gt;If you prefer a graphical "build" button over compiling Mixxx on the command line, this is now possible:
  IDEs such as &lt;a href="https://www.kdevelop.org/features"&gt;KDevelop&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=vs-2019"&gt;Visual Studio&lt;/a&gt; or &lt;a href="https://www.jetbrains.com/en-us/clion/features/cmake-support.html"&gt;CLion&lt;/a&gt; have support for CMake built-in.
  There is even a &lt;a href="https://cmake.org/runningcmake/"&gt;standalone GUI&lt;/a&gt; that you can try.&lt;/li&gt;
&lt;li&gt;Improved caching:
  Unnecessary recompilation is annoying and a waste of time.
  To avoid this, we had a custom caching solution in SCons, which cached the compilation units based on the git branch you're working on.
  This solution took a lots of disk space and also had occasional issues with failed builds.
  With CMake, we added support for &lt;a href="https://ccache.dev/"&gt;ccache&lt;/a&gt; (and &lt;a href="https://github.com/frerich/clcache"&gt;clcache&lt;/a&gt; on Windows), which makes development significantly faster.&lt;/li&gt;
&lt;li&gt;Arguably, CMake is vastly more popular than SCons, so we hope that more people be able to build and contribute to Mixxx.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that there are still some &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109171-development/topic/cmake.20on.20macOS/near/194884364"&gt;issues with building Mixxx on macOS with CMake&lt;/a&gt;, so if you own a Mac we'd appreciate if you help us out.
Apart from that, it's already working quite well.
Most of our core developers already switched over to CMake as their daily driver when working on Mixxx, but since it hasn't been as widely tested as we'd like, we label the support as "experimental" for the 2.3 release and stick with SCons for the release builds.
We plan to drop SCons and fully migrate over to CMake in 2.4.&lt;/p&gt;
&lt;p&gt;If you want to try out building Mixxx with CMake yourself, check the instructions in &lt;a href="https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux#cmake"&gt;our wiki&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category><category term="cmake"></category></entry><entry><title>New In 2.3: Intro &amp; Outro Cues, Silence Detection, and AutoDJ Improvements</title><link href="//mixxx.acolombier.dev/news/2020-07-09-intro-outro-sections" rel="alternate"></link><published>2020-07-09T01:00:00+02:00</published><updated>2020-07-09T01:00:00+02:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2020-07-09:/news/2020-07-09-intro-outro-sections</id><summary type="html">&lt;p&gt;Do you use hotcues to mark the points you use to mix in and out of tracks? Have you wished AutoDJ knew to mix in and out at those points?
In Mixxx 2.3, we have introduced new intro &amp;amp; outro cues for these purposes. You can try them now with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Do you use hotcues to mark the points you use to mix in and out of tracks? Have you wished AutoDJ knew to mix in and out at those points?
In Mixxx 2.3, we have introduced new intro &amp;amp; outro cues for these purposes. You can try them now with &lt;a href="/download#unstable"&gt;Mixxx 2.3 beta&lt;/a&gt;.
These are not ordinary cue points. Unlike hotcues, and unlike intro and outro cues in other DJ software, they do not mark only one point. The intro &amp;amp; outro are sections and each section is defined by two points.&lt;/p&gt;
&lt;p&gt;When analyzing a track, Mixxx detects where the first and last sounds are to make it easy to skip playing silent parts at the beginning and end of the track.
The analyzer places the intro start point at the first sound and the outro end point at the last sound. The first and last sound are determined by the first time the signal rises above -60 dBFS and the last time it goes below -60 dBFS.&lt;/p&gt;
&lt;p&gt;&lt;img alt="A track with the automatically placed intro start and outro end cues" src="////mixxx.acolombier.dev/images/news/intro-outro/intro-start-outro-end.png" style="max-height: 137px"&gt;&lt;/p&gt;
&lt;p&gt;It is up to you to decide where to place the intro end and outro start points.
Marking the whole intro and outro allows Mixxx to calculate how long each section is and show it on the overview waveform.
You can use this information to inform when you press play on the next track. AutoDJ can also use this information to line up tracks and determine how long to crossfade.&lt;/p&gt;
&lt;p&gt;&lt;img alt="A track with the full intro and outro marked" src="////mixxx.acolombier.dev/images/news/intro-outro/intro-outro-full.png" style="max-height: 137px"&gt;&lt;/p&gt;
&lt;h2&gt;Mixing With The Intro &amp;amp; Outro Cues&lt;/h2&gt;
&lt;p&gt;As an example, you can line up the ends of the intro &amp;amp; outro so the energy of the new track picks up right as the old track ends.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Two tracks' waveforms with the end of the intro and outro aligned" src="////mixxx.acolombier.dev/images/news/intro-outro/ends-aligned-waveforms.png"&gt;&lt;/p&gt;
&lt;p&gt;If the intro and outro are both short enough to fit on the waveforms at the same time, you can simply watch the waveforms and press play when the markers align.
Otherwise, you can watch the time remaining on the old track and press play when it is equal to the length of the intro of the next track.&lt;/p&gt;
&lt;p&gt;If the old track has a period of silence at the end, the analyzer will mark the outro end where the sound becomes too quiet to hear.
In this case, instead of watching the time remaining on the deck, hover your mouse cursor over the outro end line on the overview waveform.
Mixxx will show how much time is left until that point.
When that time equals the length of the intro, press play to precisely line up the end of the outro with the end of the intro.
If you have changed the tempo of the track, the time remaining scales to show the real time remaining at the adjusted tempo.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Two tracks with the ends of the outro and intro aligned" src="////mixxx.acolombier.dev/images/news/intro-outro/ends-aligned-decks.png"&gt;&lt;/p&gt;
&lt;p&gt;Alternatively, you can line up the start of the intro &amp;amp; outro.
In this case, watch the scrolling waveform when the outro start point is coming up on the old track.
Then, press play on the new track when the old track reaches the outro start.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Two tracks' waveforms with the starts of the outro and intro aligned" src="////mixxx.acolombier.dev/images/news/intro-outro/starts-aligned-waveforms.png"&gt;&lt;/p&gt;
&lt;p&gt;There are no firm rules to decide which method to use; it's an artistic judgement based on the musical content of each track, what the vibe of the crowd is at that moment, and what you want to do with the mix.&lt;/p&gt;
&lt;p&gt;If you do not have the intro end and outro start points marked when loading a track, you can find and mark these in headphones before you mix in the track.
Then, seek back to the intro start to get the track ready.
If you don't have time to find the outro end point before mixing in the track, you can use the new deck cloning feature to drag and drop to a new deck, then seek ahead on the new deck and listen in headphones to mark the outro start point.
If you don't have time to do that either, you can right click on the overview waveform where you think the outro starts.
Then, look how far that is from the end of the track to compare it to the length of the intro of the next track.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Right clicking on the overview waveform to approximate the length of the outro" src="////mixxx.acolombier.dev/images/news/intro-outro/outro-right-click.png" style="max-height: 137px;"&gt;&lt;/p&gt;
&lt;p&gt;Here, the outro is approximately 30 seconds long. However, the analyzer placed the outro end point before the end of the track, so the outro is actually a little bit shorter than 30 seconds. Without marking the outro start point, you would have to do some math in your head to find exactly how long the outro is.&lt;/p&gt;
&lt;h2&gt;Intro &amp;amp; Outro Cues With AutoDJ&lt;/h2&gt;
&lt;p&gt;In Mixxx 2.3, these new intro &amp;amp; outro section cues can be used to tell AutoDJ how long to crossfade and how to align the tracks in time.
AutoDJ uses the intro &amp;amp; outro cues in the new "Full Intro + Outro" and "Fade At Outro Start" modes.
In both modes, instead of crossfading over an arbitrary number of seconds, AutoDJ compares the duration of the outro of the old track and the intro of the new track.
AutoDJ picks the time of the shorter section as the crossfade time.&lt;/p&gt;
&lt;p&gt;If the outro is shorter than the intro, AutoDJ will align the start of the outro with the start of the intro in both modes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AutoDJ aligning the start of the intro and outro" src="////mixxx.acolombier.dev/images/news/intro-outro/autodj-align-starts.png"&gt;&lt;/p&gt;
&lt;p&gt;The two modes work differently when the outro is longer than the intro.
In the "Full Intro + Outro" mode, AutoDJ aligns the end of the intro and outro by starting the next track during the outro of the previous track.
This way, the full length of both the intro and the outro are played.
This mode is the most likely to sound good with the widest variety of tracks.
Therefore, it is the default mode.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AutoDJ aligning the end of the intro and outro in Full Intro + Outro mode" src="////mixxx.acolombier.dev/images/news/intro-outro/autodj-align-ends.png"&gt;&lt;/p&gt;
&lt;p&gt;The "Fade At Outro Start" mode always aligns the start of the intro and outro.
When the outro is longer than the intro, AutoDJ cuts off the end of the outro.
This can be helpful if you want to prevent the energy of the mix from declining during a long outro. However, the transition may sound abrupt if the intro is short.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AutoDJ aligning the start of the intro and outro in Fade At Outro Start mode" src="////mixxx.acolombier.dev/images/news/intro-outro/autodj-fade-at-outro-start.png"&gt;&lt;/p&gt;
&lt;p&gt;Both modes were designed so that AutoDJ sounds good fading between any pair of tracks if the intro and outro sections have been marked reasonably.
AutoDJ does not take into account the volume of each track, nor the frequency content, nor the rhythms, so it's not intended to be a replacement for a human DJ.
However, it is good enough to give a human DJ a break without a major disruption to the mix.&lt;/p&gt;
&lt;p&gt;If you still want the old behavior of AutoDJ using a fixed number of seconds to crossfade, that is still available with the "Full Track" mode.
The new "Skip Silence" mode behaves the same way, but cuts out the silence at the beginning and end of tracks.&lt;/p&gt;
&lt;h2&gt;Section Detection&lt;/h2&gt;
&lt;p&gt;Now that we know how useful it is to mark intro &amp;amp; outro sections, we are planning to take this concept further. As part of our &lt;a href="/news/2020-05-05-mixxx-gsoc-projects-2020"&gt;Google Summer of Code 2020 projects&lt;/a&gt;, our GSOC students Harshit and Cristiano will be adding downbeat, phrase, and section markers to Mixxx and extending the analyzers to detect these.
The intros &amp;amp; outros added in Mixxx 2.3 will become part of a timeline of sections that cover the whole track.
We will add similar tools to show the duration of each section and the time remaining until section markers so you can get more creative with the temporal alignment of tracks.&lt;/p&gt;
&lt;p&gt;Do you have more ideas for features that would allow you to DJ in new ways?
Do you want to turn your ideas into reality?
With Mixxx, &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;you have the freedom&lt;/a&gt; to do this without begging a company to do it for you.
If you want to help make Mixxx even more awesome, &lt;a href="/get-involved"&gt;get involved&lt;/a&gt;!&lt;/p&gt;</content><category term="news"></category><category term="2.3"></category></entry><entry><title>#BlackLivesMatter: Taking a Stand with Terminology and Recruitment</title><link href="//mixxx.acolombier.dev/news/2020-06-29-black-lives-matter" rel="alternate"></link><published>2020-06-29T15:00:00+02:00</published><updated>2020-06-29T15:00:00+02:00</updated><author><name>Mixxx Team</name></author><id>tag:mixxx.acolombier.dev,2020-06-29:/news/2020-06-29-black-lives-matter</id><summary type="html">&lt;p&gt;Alongside the protesters in the US and around the world, the Mixxx team unequivocally condemns police brutality.
The systemic racism that burdens people of color every day is the responsibility of white people around the world to address.
Mixxx' core development team feels it necessary not to remain silent on …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Alongside the protesters in the US and around the world, the Mixxx team unequivocally condemns police brutality.
The systemic racism that burdens people of color every day is the responsibility of white people around the world to address.
Mixxx' core development team feels it necessary not to remain silent on this issue, for &lt;a href="https://www.theguardian.com/news/2000/sep/14/guardianobituaries"&gt;"silence in the face of injustice is complicity with the oppressor."&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Going beyond the hashtag, we have been discussing concrete actions we can take as a community and today we announce two efforts: first, to &lt;strong&gt;&lt;a href="https://www.washingtonpost.com/opinions/2020/06/12/tech-industry-has-an-ugly-master-slave-problem/"&gt;eliminate master/slave terminology&lt;/a&gt; from our code base&lt;/strong&gt; and second, to &lt;strong&gt;recruit paid interns from underrepresented communities&lt;/strong&gt; to join our contributor base.&lt;/p&gt;
&lt;h2&gt;Terminology Changes&lt;/h2&gt;
&lt;p&gt;Major projects like &lt;a href="https://www.vice.com/en_us/article/8x7akv/masterslave-terminology-was-removed-from-python-programming-language"&gt;Python&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/golang/comments/gy9ylr/go_has_removed_all_uses_of_blacklistwhitelist_and/fte1zk0/"&gt;Go&lt;/a&gt;, and now &lt;a href="https://www.cnet.com/news/microsofts-github-is-removing-coding-terms-like-master-and-slave/"&gt;Github&lt;/a&gt; have all worked to eliminate the use of the &lt;a href="https://blog.carbonfive.com/problematic-terminology-in-open-source/"&gt;problematic&lt;/a&gt; terms, "master" and "slave," and today Mixxx joins them.
The issue of nomenclature and terminology in software is one example of how deeply embedded white privilege is around the globe and we hope changing these terms is one small step towards a more inclusive and diverse coding community.&lt;/p&gt;
&lt;p&gt;Although we eliminated the use of the word "slave" back in &lt;a href="https://github.com/mixxxdj/mixxx/commit/e59916caf72a256bb28b1722759a629c5cc9cf81"&gt;2016&lt;/a&gt;, "master" still appears in a number of places.
We have a "master" code branch, a "Master Sync" feature, an "EngineMaster" object, and more.
We are working to migrate our code away from these words, even in many cases where the particular meaning of "master" was never explicitly associated with a problematic context.&lt;/p&gt;
&lt;p&gt;It’s important to note that there will be some cases where the word will remain.
Many DJ controllers have buttons marked "master" on them, and we need to refer to those buttons by name.
There are also the audio engineering concepts of a "master tape" or "audio mastering", so there may be areas of our documentation or code that would be less understandable if we tried to use synonyms.
But in situations where "master" is used in code, we commit to changing the language we use in the next major release, Mixxx version 2.4.&lt;/p&gt;
&lt;p&gt;But changing language is not enough.&lt;/p&gt;
&lt;h2&gt;Building A More Diverse Community&lt;/h2&gt;
&lt;p&gt;As an entirely online community that allows anyone to participate with a pseudonym, we don't know the exact demographic makeup of our contributors.
Our impression, however, is that the Mixxx contributor base is largely white, male, and either from the US or Western Europe.
This is especially disappointing given that people of color played a foundational role in &lt;a href="https://www.dukeupress.edu/Love-Saves-the-Day/"&gt;creating DJing as an art form in the US and elsewhere&lt;/a&gt;.
Technology companies have a tacit (and sometimes explicit) expectation that prospective employees "prove themselves" by contributing to open source projects. Companies also often value referrals, which increase the likelihood that new hires will be similar to previous hires, thus perpetuating homogeneity.&lt;/p&gt;
&lt;p&gt;We want to break this cycle and ensure that the door to our open source network is open to everyone.
It is our goal to make both the Mixxx community and the software we make as inclusive, accessible and welcoming as possible.
As such, it is our responsibility to actively seek out and promote the participation of groups who are underrepresented in our community.&lt;/p&gt;
&lt;p&gt;Research shows that blind admission and hiring tends to result in less diverse outcomes.
To that end, we plan to participate in the &lt;a href="https://www.outreachy.org/"&gt;Outreachy&lt;/a&gt; program and have a paid internship position by December 2020, the next available cycle.
Outreachy’s stated goal is to provide "internships to work in open source and free software, for women (both cis and trans), trans men, and genderqueer people" and "residents and nationals of the United States of any gender who are Black/African American, Hispanic/Latin@, Native American/American Indian, Alaska Native, Native Hawaiian, or Pacific Islander."
They encourage "anyone who faces under-representation, systemic bias, or discrimination in the technology industry of their country" to apply.&lt;/p&gt;
&lt;p&gt;Our goal is that this Outreachy intern will be one of an increasing number of valued contributors from more diverse backgrounds that will help us be a healthier, more sustainable open source project.
Provided that we're able to raise sufficient funds, we commit to participate in Outreachy for at least 2 cycles.  At that time we'll evaluate our progress and decide if we'll continue our participation or focus on other ways to support BIPOC.&lt;/p&gt;
&lt;p&gt;One Outreachy intern will cost Mixxx $6,500 to sponsor.
To fund our two cycles of interns, we'll need $13,000.
As a project that is entirely community-driven, we are looking to you, our collaborators and users, to secure the funding for this effort. There is no company behind Mixxx.
All Mixxx developers are volunteers that work on Mixxx in their free time.
We &lt;a href="/news/2020-05-22-you-dont-need-to-pay-for-mixxx/"&gt;have never and will never charge for Mixxx&lt;/a&gt;, so this is a chance for you to contribute money that will go directly to a person working on the project.&lt;/p&gt;
&lt;p&gt;We are currently working out the details of our fundraiser and we hope to have it launched in the next couple weeks.&lt;/p&gt;
&lt;p&gt;We're aware that replacing some terms and participating in Outreachy might seem insignificant in light of the discrimination and violence that people of color and Black people in particular face every day.
As a project that depends on donations and volunteer work, we invite all our collaborators and users to discuss further community action on &lt;a href="https://mixxx.zulipchat.com"&gt;Zulip&lt;/a&gt; as we continue to stand against racism and discrimination.
Keep protesting!&lt;/p&gt;</content><category term="news"></category><category term="black lives matter"></category><category term="diversity"></category><category term="community"></category><category term="outreachy"></category></entry><entry><title>Mixxx 2.2.4 released</title><link href="//mixxx.acolombier.dev/news/2020-06-25-Mixxx-2-2-4-released" rel="alternate"></link><published>2020-06-25T12:00:00+02:00</published><updated>2020-06-25T12:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-06-25:/news/2020-06-25-Mixxx-2-2-4-released</id><summary type="html">&lt;p&gt;Mixxx 2.2.4 has been released.
&lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;Download it here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release fixes some bugs and adds some controller mappings, but doesn't introduce any new features.
If you want to check out the new features of the upcoming 2.3 release, you can also &lt;a href="////mixxx.acolombier.dev/news/2020-06-07-mixxx-2-3-beta-released"&gt;download and test the 2.3 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx 2.2.4 has been released.
&lt;a href="////mixxx.acolombier.dev/download/#stable"&gt;Download it here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release fixes some bugs and adds some controller mappings, but doesn't introduce any new features.
If you want to check out the new features of the upcoming 2.3 release, you can also &lt;a href="////mixxx.acolombier.dev/news/2020-06-07-mixxx-2-3-beta-released"&gt;download and test the 2.3 beta instead&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Changelog&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Store default recording format after "Restore Defaults" lp:1857806 #2414&lt;/li&gt;
&lt;li&gt;Prevent infinite loop when decoding corrupt MP3 files #2417&lt;/li&gt;
&lt;li&gt;Add workaround for broken libshout versions #2040 #2438&lt;/li&gt;
&lt;li&gt;Speed up purging of tracks lp:1845837 #2393&lt;/li&gt;
&lt;li&gt;Prevent infinite loop when decoding corrupt MP3 files #2417&lt;/li&gt;
&lt;li&gt;Store default recording format after "Restore Defaults" lp:1857806 #2414&lt;/li&gt;
&lt;li&gt;Don't stop playback if vinyl passthrough input is configured and PASS button is pressed #2474&lt;/li&gt;
&lt;li&gt;Fix debug assertion for invalid crate names lp:1861431 #2477&lt;/li&gt;
&lt;li&gt;Fix crashes when executing actions on tracks that already disappeared from the DB #2527&lt;/li&gt;
&lt;li&gt;AutoDJ: Skip next track when both deck are playing lp:1399974 #2531&lt;/li&gt;
&lt;li&gt;Tweak scratch parameters for Mixtrack Platinum #2028&lt;/li&gt;
&lt;li&gt;Fix auto tempo going to infinity on Pioneer DDJ-SB2 #2559&lt;/li&gt;
&lt;li&gt;Fix bpm.tapButton logic and reject missed &amp;amp; double taps #2594&lt;/li&gt;
&lt;li&gt;Add controller mapping for Native Instruments Traktor Kontrol S2 MK3 #2348&lt;/li&gt;
&lt;li&gt;Add controller mapping for Soundless joyMIDI #2425&lt;/li&gt;
&lt;li&gt;Add controller mapping for Hercules DJControl Inpulse 300 #2465&lt;/li&gt;
&lt;li&gt;Add controller mapping for Denon MC7000 #2546&lt;/li&gt;
&lt;li&gt;Add controller mapping for Stanton DJC.4 #2607&lt;/li&gt;
&lt;li&gt;Fix broadcasting via broadcast/recording input lp:1876222 #2743&lt;/li&gt;
&lt;li&gt;Only apply ducking gain in manual ducking mode when talkover is enabed lp:1394968 lp:1737113 lp:1662536 #2759&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.2"></category><category term="2.2.4"></category><category term="release announcement"></category></entry><entry><title>Mixxx GSoc Coding Begins</title><link href="//mixxx.acolombier.dev/news/2020-06-08-mixxx-GSoC-Coding-Begins" rel="alternate"></link><published>2020-06-08T01:00:00+02:00</published><updated>2020-06-08T01:00:00+02:00</updated><author><name>Cristiano Lacerda</name></author><id>tag:mixxx.acolombier.dev,2020-06-08:/news/2020-06-08-mixxx-GSoC-Coding-Begins</id><summary type="html">&lt;p&gt;This year Mixxx is again &lt;a href="////mixxx.acolombier.dev/news/2020-05-05-mixxx-gsoc-projects-2020"&gt;taking part in Google Summer of Code&lt;/a&gt;, and 3 students are working full-time for 3 months to make Mixxx even more awesome.&lt;/p&gt;
&lt;p&gt;After one month of community bonding period, they started coding last week. Cristiano and Harshit, who are both working towards the same final …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This year Mixxx is again &lt;a href="////mixxx.acolombier.dev/news/2020-05-05-mixxx-gsoc-projects-2020"&gt;taking part in Google Summer of Code&lt;/a&gt;, and 3 students are working full-time for 3 months to make Mixxx even more awesome.&lt;/p&gt;
&lt;p&gt;After one month of community bonding period, they started coding last week. Cristiano and Harshit, who are both working towards the same final feature—a new beatgrid format capable of handling not only beats, but also downbeats, phrases and sections as well varying tempos and time signatures—have already sent some initial patches to Mixxx' Git repository (&lt;a href="https://github.com/mixxxdj/mixxx/pull/2844"&gt;#2844&lt;/a&gt;, &lt;a href="https://github.com/mixxxdj/mixxx/pull/2847"&gt;#2847&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Cristiano which is focusing his work on the auto detection of such features is making weekly vlogs on YouTube to share his progress with the community. The first one is available here:&lt;/p&gt;
&lt;p&gt;
&lt;div class="video-container drop-shadow"&gt;
&lt;div class="video-dialog" data-source="rVJ7pBWHp8E"&gt;
&lt;div&gt;
&lt;p&gt;
        Watching embedded videos will transfer data to YouTube. To protect your privacy, you need to accept &lt;a href="https://policies.google.com/privacy" target="_blank"&gt;YouTubes privacy statement and terms of use&lt;/a&gt; first by clicking the button below.
      &lt;/p&gt;
&lt;input class="button button-primary video-button" type="button" value="Accept &amp;amp; Play"&gt;
      &lt;a class="button button-secondary" href="https://www.youtube.com/watch?v=rVJ7pBWHp8E"&gt;Direct Link&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Janek, who is working on &lt;a href="https://www.mixxx.org/wiki/doku.php/mixxx_macros"&gt;a feature similar to Serato Flip&lt;/a&gt;, had the great idea and prepared a community call where the new and old members alike had the opportunity to get to know each other better and put some faces to their usernames.&lt;/p&gt;
&lt;p&gt;We are looking forward to a new call in which we discuss our GSoC projects with our students, mentors and the rest of the community.
If you're interested, hit us up on &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip&lt;/a&gt;.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2020"></category><category term="analyzer"></category><category term="video"></category></entry><entry><title>Mixxx 2.3 beta released</title><link href="//mixxx.acolombier.dev/news/2020-06-07-mixxx-2-3-beta-released" rel="alternate"></link><published>2020-06-07T01:00:00+02:00</published><updated>2020-06-07T01:00:00+02:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2020-06-07:/news/2020-06-07-mixxx-2-3-beta-released</id><summary type="html">&lt;p&gt;We are proud to announce the release of Mixxx 2.3 beta, &lt;a href="////mixxx.acolombier.dev/download/#unstable"&gt;download it!&lt;/a&gt; This release brings hotcue colors &amp;amp; labels, Serato metadata import, Rekordbox metadata import, intro &amp;amp; outro cues, a revamped LateNight skin, multithreaded analysis, deck cloning, and more.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Mixxx deck with the intro and outro cues and hotcue editing menu" src="////mixxx.acolombier.dev/images/news/screenshot-2.3-beta-deck.png" style="max-height: 275px"&gt;&lt;/p&gt;
&lt;p&gt;Please test it, &lt;a href="https://bugs.launchpad.net/mixxx/+filebug"&gt;report bugs&lt;/a&gt;, help &lt;a href="https://mixxx.org/wiki/doku.php/internationalization"&gt;translate&lt;/a&gt;, and &lt;a href="https://mixxx.org/wiki/doku.php/contributing_mappings"&gt;contribute controller mappings …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce the release of Mixxx 2.3 beta, &lt;a href="////mixxx.acolombier.dev/download/#unstable"&gt;download it!&lt;/a&gt; This release brings hotcue colors &amp;amp; labels, Serato metadata import, Rekordbox metadata import, intro &amp;amp; outro cues, a revamped LateNight skin, multithreaded analysis, deck cloning, and more.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Mixxx deck with the intro and outro cues and hotcue editing menu" src="////mixxx.acolombier.dev/images/news/screenshot-2.3-beta-deck.png" style="max-height: 275px"&gt;&lt;/p&gt;
&lt;p&gt;Please test it, &lt;a href="https://bugs.launchpad.net/mixxx/+filebug"&gt;report bugs&lt;/a&gt;, help &lt;a href="https://mixxx.org/wiki/doku.php/internationalization"&gt;translate&lt;/a&gt;, and &lt;a href="https://mixxx.org/wiki/doku.php/contributing_mappings"&gt;contribute controller mappings&lt;/a&gt;. If you want help make Mixxx even more awesome, introduce yourself on our &lt;a href="https://mixxx.zulipchat.com/#narrow/stream/109123-introduce-yourself"&gt;Zulip chat&lt;/a&gt; and read the &lt;a href="https://mixxx.org/wiki/doku.php#developer_documentation"&gt;developer documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A brief overview of the changes is below. In the coming weeks, we will be publishing a series of posts on this blog discussing the new features in more depth, so stay tuned!&lt;/p&gt;
&lt;h2&gt;Hotcues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add hotcue colors and custom labels by right clicking hotcue buttons or right clicking hotcues on waveforms (both overview and scrolling waveforms) &lt;a href="https://github.com/mixxxdj/mixxx/pull/2016"&gt;#2016&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2520"&gt;#2520&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2238"&gt;#2238&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2560"&gt;#2560&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2557"&gt;#2557&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2362"&gt;#2362&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mouse hover cues on overview waveform to show time remaining until the cue &lt;a href="https://github.com/mixxxdj/mixxx/pull/2238"&gt;#2238&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Hotcue &amp;amp; Track Colors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add configurable color per track &lt;a href="https://github.com/mixxxdj/mixxx/pull/2470"&gt;#2470&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2539"&gt;#2539&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2545"&gt;#2545&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2630"&gt;#2630&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1100882"&gt;lp:1100882&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add customizable color palettes for hotcue and track colors &lt;a href="https://github.com/mixxxdj/mixxx/pull/2530"&gt;#2530&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2589"&gt;#2589&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add hotcue color find-and-replace tool &lt;a href="https://github.com/mixxxdj/mixxx/pull/2547"&gt;#2547&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Importing From Other DJ Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Import cue points, track colors, and playlists from Serato file tags &amp;amp; database &lt;a href="https://github.com/mixxxdj/mixxx/pull/2480"&gt;#2480&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2526"&gt;#2526&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2499"&gt;#2499&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2495"&gt;#2495&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2673"&gt;#2673&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Note: Mixxx does not yet support multiple loops per track. We are &lt;a href="https://github.com/mixxxdj/mixxx/pull/2194"&gt;working on this for Mixxx 2.4&lt;/a&gt;. In Mixxx 2.3, if you import a track with multiple loops from Serato, Mixxx will use the first loop cue as the single loop Mixxx currently supports. The imported loops are still stored in Mixxx's database and are treated as hotcues in Mixxx 2.3. If you do not delete these hotcues, they will be usable as loops in Mixxx 2.4. Serato keeps loops and hotcues in separate lists, but Mixxx does not, so loops from Serato are imported starting as hotcue 9.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Import cue points, track colors, and playlists from Rekordbox USB drives &lt;a href="https://github.com/mixxxdj/mixxx/pull/2119"&gt;#2119&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2555"&gt;#2555&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2543"&gt;#2543&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2779"&gt;#2779&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Note: The first Rekordbox memory cue is imported for the main cue button in Mixxx and the remaining Rekordbox memory cues are imported as Mixxx hotcues, starting with the next hotcue number after the last hotcue from Rekordbox.&lt;/li&gt;
&lt;li&gt;Note: Mixxx does not yet support multiple loops per track. Imported loops from Rekordbox are treated like imported loops from Serato, so refer to the note above for details.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Intro &amp;amp; Outro Cues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add intro &amp;amp; outro range cues with automatic silence detection &lt;a href="https://github.com/mixxxdj/mixxx/pull/1242"&gt;#1242&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Show duration of intro &amp;amp; outro ranges on overview waveform &lt;a href="https://github.com/mixxxdj/mixxx/pull/2089"&gt;#2089&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use intro &amp;amp; outro cues in AutoDJ transitions &lt;a href="https://github.com/mixxxdj/mixxx/pull/2103"&gt;#2103&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deck cloning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add deck cloning (also known as "instant doubles" in other DJ software) by dragging and dropping between decks &lt;a href="https://github.com/mixxxdj/mixxx/pull/1892"&gt;#1892&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clone decks by double pressing the load button on a controller (with option to disable this) &lt;a href="https://github.com/mixxxdj/mixxx/pull/2024"&gt;#2024&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2042"&gt;#2042&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Skins &amp;amp; GUI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Aesthetically revamped LateNight skin &lt;a href="https://github.com/mixxxdj/mixxx/pull/2298"&gt;#2298&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2342"&gt;#2342&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Right click overview waveform to show time remaining until that point &lt;a href="https://github.com/mixxxdj/mixxx/pull/2238"&gt;#2238&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Show track context menu when right clicking text in decks &lt;a href="https://github.com/mixxxdj/mixxx/pull/2612"&gt;#2612&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2675"&gt;#2675&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2684"&gt;#2684&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2696"&gt;#2696&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add laptop battery widget to skins &lt;a href="https://github.com/mixxxdj/mixxx/pull/2283"&gt;#2283&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2277"&gt;#2277&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2250"&gt;#2250&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2228"&gt;#2228&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2221"&gt;#2221&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2163"&gt;#2163&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2160"&gt;#2160&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2147"&gt;#2147&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2281"&gt;#2281&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2319"&gt;#2319&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2287"&gt;#2287&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Show when passthrough mode is active on overview waveforms &lt;a href="https://github.com/mixxxdj/mixxx/pull/2575"&gt;#2575&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2616"&gt;#2616&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Music Feature Analysis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multithreaded analysis for much faster batch analysis on multicore CPUs &lt;a href="https://github.com/mixxxdj/mixxx/pull/1624"&gt;#1624&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2142"&gt;#2142&lt;/a&gt; &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1641153"&gt;lp:1641153&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix bugs affecting key detection accuracy &lt;a href="https://github.com/mixxxdj/mixxx/pull/2137"&gt;#2137&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2152"&gt;#2152&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2112"&gt;#2112&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2136"&gt;#2136&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Note: Users who have not manually corrected keys are advised to clear all keys in their library by pressing Ctrl + A in the library, right clicking, going to Reset -&amp;gt; Key, then reanalyzing their library. This will freeze the GUI while Mixxx clears the keys; this is a known problem that we will not be able to fix for 2.3. Wait until it is finished and you will be able to reanalyze tracks for better key detection results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remove VAMP plugin support and use Queen Mary DSP library directly. vamp-plugin-sdk and vamp-hostsdk are no longer required dependencies. &lt;a href="https://github.com/mixxxdj/mixxx/pull/926"&gt;#926&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Music Library&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add support for searching for empty fields (for example &lt;code&gt;crate:""&lt;/code&gt;) &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1788086"&gt;lp:1788086&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve synchronization of track metadata and file tags &lt;a href="https://github.com/mixxxdj/mixxx/pull/2406"&gt;#2406&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Library Scanner: Improve hashing of directory contents &lt;a href="https://github.com/mixxxdj/mixxx/pull/2497"&gt;#2497&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rework of Cover Image Hashing &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1607097"&gt;lp:1607097&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2507"&gt;#2507&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2508"&gt;#2508&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MusicBrainz: Handle 301 status response &lt;a href="https://github.com/mixxxdj/mixxx/pull/2510"&gt;#2510&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MusicBrainz: Add extended metadata support &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1581256"&gt;lp:1581256&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2522"&gt;#2522&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TagLib: Fix detection of empty or missing file tags &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1865957"&gt;lp:1865957&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2535"&gt;#2535&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Audio Codecs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add FFmpeg audio decoder, bringing support for ALAC files &lt;a href="https://github.com/mixxxdj/mixxx/pull/1356"&gt;#1356&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Include LAME MP3 encoder with Mixxx now that the MP3 patent has expired &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1294128"&gt;lp:1294128&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/buildserver/pull/37"&gt;buildserver:#37&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/buildserver/commit/9e8bcee771731920ae82f3e076d43f0fb51e5027"&gt;buildserver:9e8bcee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add Opus streaming and recording support. &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1338413"&gt;lp:1338413&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remove support for SoundSource plugins because the code was not well-maintained and could lead to crashes &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1792747"&gt;lp:1792747&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Controllers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Improve workflow for configuring controller mappings and editing mappings &lt;a href="https://github.com/mixxxdj/mixxx/pull/2569"&gt;#2569&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve error reporting from controller scripts &lt;a href="https://github.com/mixxxdj/mixxx/pull/2588"&gt;#2588&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make hotcue and track colors mappable on controllers &lt;a href="https://github.com/mixxxdj/mixxx/pull/2030"&gt;#2030&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2541"&gt;#2541&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2665"&gt;#2665&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2520"&gt;#2520&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add way to change library table sorting from controllers &lt;a href="https://github.com/mixxxdj/mixxx/pull/2118"&gt;#2118&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add support for velocity sensitive sampler buttons in Components JS library &lt;a href="https://github.com/mixxxdj/mixxx/pull/2032"&gt;#2032&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add logging when script ControlObject callback is disconnected successfully &lt;a href="https://github.com/mixxxdj/mixxx/pull/2054"&gt;#2054&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add controller mapping for Roland DJ-505 &lt;a href="https://github.com/mixxxdj/mixxx/pull/2111"&gt;#2111&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update controller mapping for Allen &amp;amp; Heath Xone K2 to add intro/outro cues &lt;a href="https://github.com/mixxxdj/mixxx/pull/2236"&gt;#2236&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add CMake build system with Ccache support for faster compilation time &lt;a href="https://github.com/mixxxdj/mixxx/pull/2280"&gt;#2280&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;Note: The old SCons build system is still supported for 2.3. We will be removing it for Mixxx 2.4.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Make Mixxx compile even though &lt;code&gt;QT_NO_OPENGL&lt;/code&gt; or &lt;code&gt;QT_OPENGL_ES_2&lt;/code&gt; is defined (fixes build on Raspberry Pi) &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1863440"&gt;lp:1863440&lt;/a&gt; &lt;a href="https://github.com/mixxxdj/mixxx/pull/2504"&gt;#2504&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.3"></category><category term="release announcement"></category></entry><entry><title>Website Redesign</title><link href="//mixxx.acolombier.dev/news/2020-06-03-website-redesign" rel="alternate"></link><published>2020-06-03T01:00:00+02:00</published><updated>2020-06-03T01:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-06-03:/news/2020-06-03-website-redesign</id><content type="html">&lt;p&gt;As you probably already noticed we facelifted our Website, gave it a more modern look and cleaned up the code.
We will continue to update and improve its contents in the next weeks in joyful anticipation of the soon-to-be-released Mixxx 2.3 beta version.&lt;/p&gt;
&lt;p&gt;Stay tuned!&lt;/p&gt;</content><category term="news"></category><category term="website"></category></entry><entry><title>You don't need to pay for Mixxx!</title><link href="//mixxx.acolombier.dev/news/2020-05-22-you-dont-need-to-pay-for-mixxx" rel="alternate"></link><published>2020-05-22T13:00:00+02:00</published><updated>2020-05-22T13:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-05-22:/news/2020-05-22-you-dont-need-to-pay-for-mixxx</id><summary type="html">&lt;p&gt;Over the past few years there have been multiple instances of sellers that distribute paid boxed versions of Mixxx on eBay and Amazon.
While it's not illegal to do this per se, we are not affiliated with these sellers and neither earn money from this nor endorse this in any …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Over the past few years there have been multiple instances of sellers that distribute paid boxed versions of Mixxx on eBay and Amazon.
While it's not illegal to do this per se, we are not affiliated with these sellers and neither earn money from this nor endorse this in any way.
Instead, you can download the latest version of Mixxx from the &lt;a href="////mixxx.acolombier.dev/download/"&gt;download page on our website&lt;/a&gt; for free.&lt;/p&gt;
&lt;p&gt;If you want to support Mixxx financially, consider &lt;a href="https://mixxx.org/donate"&gt;donating&lt;/a&gt; - we'll appreciate it!&lt;/p&gt;
&lt;h3&gt;Mixxx was, is and always will be free&lt;/h3&gt;
&lt;p&gt;In contrast our commercial competitors that offer "free" feature-reduced versions of their software, we do not impose any artificial restrictions on Mixxx.
There is no "Pro Edition" or Premium version of Mixxx, even if it says so in the description of the online shop.&lt;/p&gt;
&lt;p&gt;The Mixxx developers don't sell Mixxx, and if you "buy" Mixxx somewhere online you'll likely just get the free Mixxx version that the seller downloaded from our website and burned onto a CD.
Even worse, some of these paid Mixxx versions might contain ads or malware according to Amazon reviews.
Just use the free &lt;a href="////mixxx.acolombier.dev/download/"&gt;download&lt;/a&gt; from our website to get the ad-free, malware-free, most recent version of Mixxx.&lt;/p&gt;
&lt;h3&gt;Mixxx is free as in freedom, not just free as in "free beer"&lt;/h3&gt;
&lt;p&gt;You don't need to pay money to use Mixxx, but there's more:
Its source code is accessible to everyone and if you know how to code, you can modify it and customize Mixxx to a degree that is simply not possible with any closed-source software.
Even if you did get your hands on the source code of Serato DJ Pro/Lite, Rekordbox, Traktor or VirtualDJ (which is not available to their users), it would be illegal for you to modify the program or redistribute it.&lt;/p&gt;
&lt;p&gt;Mixxx, on the other hand, is &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;free software&lt;/a&gt; and grants you the four essential freedoms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The freedom to run the program as you wish, for any purpose.&lt;/li&gt;
&lt;li&gt;The freedom to study how the program works, and change it so it does your computing as you wish. Access to the source code is a precondition for this.&lt;/li&gt;
&lt;li&gt;The freedom to redistribute copies so you can help others.&lt;/li&gt;
&lt;li&gt;The freedom to distribute copies of your modified versions to others. By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These freedoms are guaranteed by the license Mixxx uses, the &lt;a href="https://github.com/mixxxdj/mixxx/blob/master/LICENSE"&gt;GNU General Public License (GPL)&lt;/a&gt;.
Thanks to the GPL, these freedoms can never be taken away from you.
It's a copyleft license, meaning anyone who distributes or modifies Mixxx has to use the same license and provide the source code.&lt;/p&gt;
&lt;p&gt;The original Mixxx developers chose the GPL when they started Mixxx back in the early 2000s.
They stopped working on Mixxx many years ago, but thanks to the copyleft terms of the GPL, you have the same freedoms with Mixxx now as when the first version of Mixxx was published.
We can't take that away, nor could any future developers, nor could any company. It's free because it's yours.&lt;/p&gt;
&lt;p&gt;If you want to know more about Mixxx' license, &lt;a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0-faq"&gt;check out the FAQ&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Getting involved&lt;/h3&gt;
&lt;p&gt;The Mixxx project is entirely community-driven and supported by volunteers from all over the globe.
None of our developers are paid; all of us are passionate about the project and work on Mixxx in our spare time.&lt;/p&gt;
&lt;p&gt;We dedicate our time to working Mixxx, because we believe in open-source and care about delivering a decent product to our users — including ourselves!
In fact, all our currently active developers started out as regular Mixxx users — just like you.&lt;/p&gt;
&lt;p&gt;Do you want to contribute to Mixxx, too?
&lt;a href="////mixxx.acolombier.dev/get-involved/"&gt;You can!&lt;/a&gt;
There are countless ways to get involved in the Mixxx community. You hack on Mixxx' code, create controller mappings, test new in-development features, improve Mixxx skins or design new ones, translate Mixxx into your language, write articles and make YouTube videos about Mixxx or help out newbies on &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip Chat&lt;/a&gt; or &lt;a href="https://mixxx.org/forums/"&gt;our forums&lt;/a&gt;. Every little bit helps!&lt;/p&gt;
&lt;p&gt;Help us make Mixxx even more awesome than it already is!&lt;/p&gt;</content><category term="news"></category><category term="license"></category><category term="contribute"></category></entry><entry><title>Announcing our Google Summer of Code Projects 2020</title><link href="//mixxx.acolombier.dev/news/2020-05-05-mixxx-gsoc-projects-2020" rel="alternate"></link><published>2020-05-05T01:00:00+02:00</published><updated>2020-05-05T01:00:00+02:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-05-05:/news/2020-05-05-mixxx-gsoc-projects-2020</id><summary type="html">&lt;p&gt;Mixxx is participating in this year's &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code (GSoC)&lt;/a&gt;, an opportunity for students to work on Mixxx full-time as a 3-month summer project and receive a stipend from Google.&lt;/p&gt;
&lt;p&gt;For this year's Google Summer of Code, Mixx has been &lt;a href="https://summerofcode.withgoogle.com/organizations/6577142898360320/"&gt;granted 3 slots&lt;/a&gt; that will be filled by students …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx is participating in this year's &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code (GSoC)&lt;/a&gt;, an opportunity for students to work on Mixxx full-time as a 3-month summer project and receive a stipend from Google.&lt;/p&gt;
&lt;p&gt;For this year's Google Summer of Code, Mixx has been &lt;a href="https://summerofcode.withgoogle.com/organizations/6577142898360320/"&gt;granted 3 slots&lt;/a&gt; that will be filled by students from 3 different continents:
&lt;a href="https://github.com/hacksdump"&gt;Harshit Maurya&lt;/a&gt; from India, &lt;a href="https://github.com/crisclacerda"&gt;Cristiano Lacerda&lt;/a&gt; from Brazil and &lt;a href="https://github.com/xerus2000"&gt;Janek Fischer&lt;/a&gt; from Germany.
Congratulations!&lt;/p&gt;
&lt;p&gt;Harshit and Cristiano will be working on making a new beatgrid format that marks bars, meter, and phrases.&lt;/p&gt;
&lt;p&gt;Cristiano will focus on &lt;a href="https://summerofcode.withgoogle.com/projects/#5309419128094720"&gt;implementing autodetection&lt;/a&gt; of this information from audio files.
This DSP- and research-heavy project will mentored by &lt;a href="https://github.com/daschuer"&gt;Daniel Schürmann&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Harshit will &lt;a href="https://summerofcode.withgoogle.com/projects/#5081784049467392"&gt;focus on creating the user interface&lt;/a&gt; for viewing and editing the beatgrid and using this information in other Mixxx features like waveforms, loops, beatjumps and quantization.
&lt;a href="https://github.com/uklotzde"&gt;Uwe Klotz&lt;/a&gt; will be his primary mentor.&lt;/p&gt;
&lt;p&gt;Janek will be working on a &lt;a href="https://summerofcode.withgoogle.com/projects/#4641898733502464"&gt;macro recording feature&lt;/a&gt; inspired by &lt;a href="https://serato.com/dj/pro/expansions/flip"&gt;Serato Flip&lt;/a&gt; to record custom edits in Mixxx without altering the audio files.
His project will be mentored by &lt;a href="https://github.com/Jan Holthuis"&gt;Jan Holthuis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We're going to do things a bit differently for GSoC this year than we have in the past.
Before, mentors have had a lot of private one-on-one communication with students.
This year we'll be encouraging students to discuss their work more publicly so the whole community is involved throughout their projects.&lt;/p&gt;
&lt;p&gt;Thus, if you're interested in these projects check our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip chat&lt;/a&gt; for discussions and progress reports.&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2020"></category></entry><entry><title>Mixxx accepted for GSoC 2020!</title><link href="//mixxx.acolombier.dev/news/2020-02-20-mixxx-accepted-for-gsoc-2020" rel="alternate"></link><published>2020-02-20T20:00:00+01:00</published><updated>2020-02-20T20:00:00+01:00</updated><author><name>Jan Holthuis</name></author><id>tag:mixxx.acolombier.dev,2020-02-20:/news/2020-02-20-mixxx-accepted-for-gsoc-2020</id><summary type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/organizations/6577142898360320/"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2020&lt;/a&gt;, a global program that aims to bring more student developers into the world of open source development.&lt;/p&gt;
&lt;p&gt;This means that students have the opportunity to work on Mixxx full-time as a 3 month programming project and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx has been &lt;a href="https://summerofcode.withgoogle.com/organizations/6577142898360320/"&gt;accepted as a mentoring organization&lt;/a&gt; for &lt;a href="https://summerofcode.withgoogle.com/"&gt;Google Summer of Code 2020&lt;/a&gt;, a global program that aims to bring more student developers into the world of open source development.&lt;/p&gt;
&lt;p&gt;This means that students have the opportunity to work on Mixxx full-time as a 3 month programming project and receive a stipend sponsored by Google. For more information, check out the &lt;a href="https://developers.google.com/open-source/gsoc/faq#students"&gt;Google Summer of Code FAQ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We have prepared a list of &lt;a href="https://mixxx.org/wiki/doku.php/gsoc2020ideas"&gt;GSoC 2020 Project Ideas for Mixxx&lt;/a&gt; and added it to our wiki, but we're always interested in new ideas. Taking a look at our &lt;a href="https://mixxx.org/wiki/doku.php/gsocadvice"&gt;GSoC advice page&lt;/a&gt; is recommended if you're planning to apply. The best way to get started is to participate in the Mixxx community, so have a look at our &lt;a href="https://github.com/mixxxdj/mixxx"&gt;GitHub repository&lt;/a&gt; and consider making a small code contribution to show that you're able to familiarize yourself with our codebase.
&lt;strong&gt;The application period is March 16 - 31, 2020.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Past GSoC projects include &lt;a href="https://mixxx.org/wiki/doku.php/live_metadata_output"&gt;Live metadata output&lt;/a&gt; and &lt;a href="https://mixxx.org/wiki/doku.php/effects_customization"&gt;effects customization&lt;/a&gt;. A complete list can be &lt;a href="https://mixxx.org/wiki/doku.php/gsoc"&gt;found at our wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you're interested in hacking on Mixxx this summer, become a part of the Mixxx community and &lt;a href="https://summerofcode.withgoogle.com/organizations/6577142898360320/"&gt;apply starting March 16th&lt;/a&gt;!&lt;/p&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2020"></category></entry><entry><title>Mixxx 2.2.3 released</title><link href="//mixxx.acolombier.dev/news/2019-12-09-Mixxx-2-2-3-released" rel="alternate"></link><published>2019-12-09T16:25:00+01:00</published><updated>2019-12-09T16:25:00+01:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2019-12-09:/news/2019-12-09-Mixxx-2-2-3-released</id><summary type="html">&lt;p&gt;Mixxx 2.2.3 has been released. &lt;a href="http://downloads.mixxx.org/mixxx-2.2.3/"&gt;Download it here.&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Changelog&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Don't make users reconfigure sound hardware when it has not changed #2253&lt;/li&gt;
&lt;li&gt;Fix MusicBrainz metadata lookup lp:1848887 #2328&lt;/li&gt;
&lt;li&gt;Fix high DPI scaling of cover art #2247&lt;/li&gt;
&lt;li&gt;Fix high DPI scaling of cue point labels on scrolling waveforms #2331 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Mixxx 2.2.3 has been released. &lt;a href="http://downloads.mixxx.org/mixxx-2.2.3/"&gt;Download it here.&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Changelog&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Don't make users reconfigure sound hardware when it has not changed #2253&lt;/li&gt;
&lt;li&gt;Fix MusicBrainz metadata lookup lp:1848887 #2328&lt;/li&gt;
&lt;li&gt;Fix high DPI scaling of cover art #2247&lt;/li&gt;
&lt;li&gt;Fix high DPI scaling of cue point labels on scrolling waveforms #2331&lt;/li&gt;
&lt;li&gt;Fix high DPI scaling of sliders in Tango skin #2318&lt;/li&gt;
&lt;li&gt;Fix sound dropping out during recording lp:1842679 #2265 #2305 #2308 #2309&lt;/li&gt;
&lt;li&gt;Fix rare crash on application shutdown #2293&lt;/li&gt;
&lt;li&gt;Workaround various rare bugs caused by database inconsistencies lp:1846971 #2321&lt;/li&gt;
&lt;li&gt;Improve handling of corrupt FLAC files #2315&lt;/li&gt;
&lt;li&gt;Don't immediately jump to loop start when loop_out is pressed in quantized mode lp:1837077 #2269&lt;/li&gt;
&lt;li&gt;Preserve order of tracks when dragging and dropping from AutoDJ to playlist lp:1829601 #2237&lt;/li&gt;
&lt;li&gt;Explicitly use X11 Qt platform plugin instead of Wayland in .desktop launcher lp:1850729 #2340&lt;/li&gt;
&lt;li&gt;Pioneer DDJ-SX: fix delayed sending of MIDI messages with low audio buffer sizes #2326&lt;/li&gt;
&lt;li&gt;Enable modplug support on Linux by default lp:1840537 #2244 #2272&lt;/li&gt;
&lt;li&gt;Fix keyboard shortcut for View &amp;gt; Skin Preferences lp:1851993 #2358 #2372&lt;/li&gt;
&lt;li&gt;Reloop Terminal Mix: Fix mapping of sampler buttons 5-8 lp:1846966 #2330&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.2"></category><category term="2.2.3"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.2.2 released</title><link href="//mixxx.acolombier.dev/news/2019-08-15-Mixxx-2-2-2-released" rel="alternate"></link><published>2019-08-15T07:06:00+02:00</published><updated>2019-08-15T07:06:00+02:00</updated><author><name>Uwe Klotz</name></author><id>tag:mixxx.acolombier.dev,2019-08-15:/news/2019-08-15-Mixxx-2-2-2-released</id><summary type="html">&lt;p&gt;Mixxx 2.2.2 has been released and is available on the &lt;a href="https://www.mixxx.org/download/"&gt;download&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;This release includes many stability and usability fixes. Please note that we had to disable writing of file tags for .ogg files with the current TagLib version 1.11.1 that would otherwise corrupt your precious …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx 2.2.2 has been released and is available on the &lt;a href="https://www.mixxx.org/download/"&gt;download&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;This release includes many stability and usability fixes. Please note that we had to disable writing of file tags for .ogg files with the current TagLib version 1.11.1 that would otherwise corrupt your precious files. Upgrading from version 2.2.1 is strongly recommended.&lt;/p&gt;
&lt;h4&gt;Changelog&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fix battery widget with upower &amp;lt;= 0.99.7. #2221&lt;/li&gt;
&lt;li&gt;Fix BPM adjust in BpmControl. lp:1836480&lt;/li&gt;
&lt;li&gt;Disable track metadata export for .ogg files and TagLib 1.11.1. lp:1833190&lt;/li&gt;
&lt;li&gt;Fix interaction of hot cue buttons and looping. lp:1778246&lt;/li&gt;
&lt;li&gt;Fix detection of moved tracks. #2197&lt;/li&gt;
&lt;li&gt;Fix playlist import. lp:16878282&lt;/li&gt;
&lt;li&gt;Fix updating playlist labels. lp:1837315&lt;/li&gt;
&lt;li&gt;Fix potential segfault on exit. lp:1828360&lt;/li&gt;
&lt;li&gt;Fix parsing of invalid bpm values in MP3 files. lp:1832325&lt;/li&gt;
&lt;li&gt;Fix crash when removing rows from empty model. #2128&lt;/li&gt;
&lt;li&gt;Fix high DPI scaling of RGB overview waveforms. #2090&lt;/li&gt;
&lt;li&gt;Fix for OpenGL SL detection on macOS. lp:1828019&lt;/li&gt;
&lt;li&gt;Fix OpenGL ES detection. lp:1825461&lt;/li&gt;
&lt;li&gt;Fix FX1/2 buttons missing Mic unit in Deere (64 samplers). lp:1837716&lt;/li&gt;
&lt;li&gt;Tango64: Re-enable 64 samplers. #2223&lt;/li&gt;
&lt;li&gt;Numark DJ2Go re-enable note-off for deck A cue button. #2087&lt;/li&gt;
&lt;li&gt;Replace Flanger with QuickEffect in keyboard mapping. #2233&lt;/li&gt;
&lt;/ul&gt;</content><category term="news"></category><category term="2.2"></category><category term="2.2.2"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.2.1 released</title><link href="//mixxx.acolombier.dev/news/2019-04-23-Mixxx-2-2-1-released" rel="alternate"></link><published>2019-04-23T21:18:00+02:00</published><updated>2019-04-23T21:18:00+02:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2019-04-23:/news/2019-04-23-Mixxx-2-2-1-released</id><summary type="html">&lt;p&gt;Mixxx 2.2.1 has been released and is available on the &lt;a href="https://mixxx.org/download/"&gt;download page&lt;/a&gt;. This update includes fixes that were in 2.1.7 and 2.1.8. There were a few performance improvements which have an especially big impact on macOS. Mac users who were staying with 2.1 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mixxx 2.2.1 has been released and is available on the &lt;a href="https://mixxx.org/download/"&gt;download page&lt;/a&gt;. This update includes fixes that were in 2.1.7 and 2.1.8. There were a few performance improvements which have an especially big impact on macOS. Mac users who were staying with 2.1.x versions because 2.2.0 was too slow are advised to upgrade to 2.2.1. Other fixes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LED output for the Traktor Kontrol S4 Mk2 on Windows has been fixed.&lt;/li&gt;
&lt;li&gt;Mute and volume controls for microphones have been fixed.&lt;/li&gt;
&lt;li&gt;The QuickEffect enable button can now be selected in the controller mapping wizard.&lt;/li&gt;
&lt;li&gt;Fix a &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1823199"&gt;bug&lt;/a&gt; where the cover art window could not be closed.&lt;/li&gt;
&lt;li&gt;Numark Mixtrack (Pro) 3 mapping: fix bug where TAP + FX level to move the beatgrid changed the effect unit mix knob.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that we are currently having an issue updating the Ubuntu PPA. Ubuntu users can install the .deb file from the &lt;a href="https://mixxx.org/download/"&gt;download page&lt;/a&gt; or wait until we get the new update in the PPA (or &lt;a href="https://mixxx.org/wiki/doku.php/compiling_on_linux"&gt;build from source code&lt;/a&gt;).&lt;/p&gt;</content><category term="news"></category><category term="2.2"></category><category term="2.2.1"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.2 released</title><link href="//mixxx.acolombier.dev/news/2018-12-24-Mixxx-2-2-released" rel="alternate"></link><published>2018-12-24T18:07:00+01:00</published><updated>2018-12-24T18:07:00+01:00</updated><author><name>Be.</name></author><id>tag:mixxx.acolombier.dev,2018-12-24:/news/2018-12-24-Mixxx-2-2-released</id><summary type="html">&lt;p&gt;Mixxx 2.2.0 has been released, &lt;a href="https://mixxx.org/download/"&gt;download it!&lt;/a&gt; Since we are now releasing Mixxx more often, the changes are not as big as between Mixxx 2.0 and Mixxx 2.1. Here is a quick overview of the changes since Mixxx 2.1:&lt;/p&gt;
&lt;h4&gt;General&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Update from Qt4 to Qt5 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Mixxx 2.2.0 has been released, &lt;a href="https://mixxx.org/download/"&gt;download it!&lt;/a&gt; Since we are now releasing Mixxx more often, the changes are not as big as between Mixxx 2.0 and Mixxx 2.1. Here is a quick overview of the changes since Mixxx 2.1:&lt;/p&gt;
&lt;h4&gt;General&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Update from Qt4 to Qt5.&lt;/li&gt;
&lt;li&gt;Use Qt5's automatic high DPI scaling.&lt;/li&gt;
&lt;li&gt;Vectorize remaining raster graphics for better HiDPI support.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Effects&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Add mix mode switch (Dry/Wet vs Dry+Wet) for effect units.&lt;/li&gt;
&lt;li&gt;Add support for LV2 effects plugins (currently no way to show plugin GUIs).&lt;/li&gt;
&lt;li&gt;Add preference option for selecting which effects are shown in the list of available effects in the main window (all LV2 effects are hidden by default and must be explicitly enabled by users).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Library&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Text searches without any field qualifiers (such as "title: some-title") now search crates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Skins&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Add 8 sampler and small sampler options to LateNight.&lt;/li&gt;
&lt;li&gt;Add key / BPM expansion indicators to Deere decks.&lt;/li&gt;
&lt;li&gt;Add skin settings menu to LateNight.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Controllers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Add controller mapping for Numark Mixtrack Platinum.&lt;/li&gt;
&lt;li&gt;Update controller mapping for Numark N4.&lt;/li&gt;
&lt;li&gt;Add spinback and break for Vestax VCI-400 mapping.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Miscellaneous&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Add preference option to adjust the play position marker of scrolling waveforms.&lt;/li&gt;
&lt;li&gt;Add preference option to adjust opacity of beatgrid markers on scrolling waveforms.&lt;/li&gt;
&lt;li&gt;Support IRC/AIM/ICQ broadcast metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The focus of development for Mixxx 2.2 was switching from Qt 4 to Qt 5. Qt is the toolkit that allows us to write one Mixxx application that runs on Linux, macOS, and Windows. For users, the most noticeable difference from this will be improved support for scaling the graphical user interface (GUI) for high pixel density (high DPI) screens. The scaling we used with Qt 4 in Mixxx 2.1 scaled most parts of the GUI, but some small parts like the arrows on menus and widgets in the preferences did not scale. Now with Qt 5, everything scales automatically according to the operating system scaling settings. Going forward, we will be able to use new features of Qt sooner (for example, &lt;a href="https://github.com/mixxxdj/mixxx/pull/1795"&gt;work is ongoing&lt;/a&gt; for supporting ECMAScript 7 in controller scripts). Note that Qt 5 requires Windows 7 or later, so Mixxx 2.2 no longer supports Windows XP and Windows Vista.&lt;/p&gt;
&lt;p&gt;We have added a new button to the effects units that adds a new mode for mixing effects. Previously, the mix knob always crossfaded between the dry signal (input to the first effect) and wet signal (output of the last effect). This is now called Dry/Wet mode and is the default. The new Dry+Wet mode always keeps the dry signal at full volume and the mix knob controls how much of the wet signal is added. This allows for adding sounds with effects without modifying the underlying track. For example, with the effect unit in Dry+Wet mode, you can load an equalizer or filter effect before the Echo effect to remove bass frequencies from the echoed signal without removing the bass from the track.&lt;/p&gt;
&lt;p&gt;Mixxx 2.2 introduces initial support for LV2 sound effects plugins. Many GNU/Linux distributions package LV2 effects plugins that can be installed separately from Mixxx. Because many LV2 plugins are not useful for DJing, you must explicitly enable plugins in the Effects section of the preferences before you can load them in the Mixxx main window. Currently there is no way to show the GUI for LV2 plugins in Mixxx. While LV2 effects are technically cross-platform, in practice there are very few LV2 plugins that are distributed for macOS and Windows. Mixxx 2.2 has LV2 support enabled for GNU/Linux and macOS, but not for Windows.&lt;/p&gt;
&lt;p&gt;Want to help make Mixxx more awesome? We could always use more people, whether you can write code or not. If you are interested in getting involved, join us on our &lt;a href="https://mixxx.zulipchat.com/"&gt;Zulip chat&lt;/a&gt; and introduce yourself.&lt;/p&gt;</content><category term="news"></category><category term="2.2"></category><category term="2.2.0"></category><category term="release announcement"></category></entry><entry><title>2.1.3 released</title><link href="//mixxx.acolombier.dev/news/2018-08-20-Mixxx-2-1-3-released" rel="alternate"></link><published>2018-08-20T22:42:00+02:00</published><updated>2018-08-20T22:42:00+02:00</updated><author><name>Pegasus</name></author><id>tag:mixxx.acolombier.dev,2018-08-20:/news/2018-08-20-Mixxx-2-1-3-released</id><summary type="html">&lt;p&gt;Hello again, everyone. Another release so soon?? It seems a performance regression slipped into 2.1.2, but the great people working on Mixxx found and fixed it quickly so we have 2.1.3 ready for you now!&lt;br /&gt;&lt;br /&gt;You know &lt;a href="https://mixxx.org/download/"&gt;where to get it&lt;/a&gt;. :) &lt;br /&gt;&lt;br /&gt;As always, report any issues …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello again, everyone. Another release so soon?? It seems a performance regression slipped into 2.1.2, but the great people working on Mixxx found and fixed it quickly so we have 2.1.3 ready for you now!&lt;br /&gt;&lt;br /&gt;You know &lt;a href="https://mixxx.org/download/"&gt;where to get it&lt;/a&gt;. :) &lt;br /&gt;&lt;br /&gt;As always, report any issues using our &lt;a href="https://bugs.launchpad.net/mixxx/"&gt;bug tracker&lt;/a&gt; and check out &lt;a href="https://mixxx.org/support/"&gt;our support resources&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mixxx on!&lt;/p&gt;</content><category term="news"></category><category term="2.1"></category><category term="2.1.3"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.1.2 released</title><link href="//mixxx.acolombier.dev/news/2018-08-19-mixxx-2-1-2-released" rel="alternate"></link><published>2018-08-19T21:52:00+02:00</published><updated>2018-08-19T21:52:00+02:00</updated><author><name>Pegasus</name></author><id>tag:mixxx.acolombier.dev,2018-08-19:/news/2018-08-19-mixxx-2-1-2-released</id><summary type="html">&lt;p&gt;Hello, Mixxxers. We're happy to announce our latest bug fix release of 2.1.2. Here's a summary of what has changed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allow maximum deck speed of 4x normal&lt;/li&gt;&lt;li&gt;Don't always quantize hotcues, a 2.1.1 regression, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1777429"&gt;bug #1777429&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fix artifacts using more than 32 samplers, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1779559"&gt;bug #1779559&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Store …&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello, Mixxxers. We're happy to announce our latest bug fix release of 2.1.2. Here's a summary of what has changed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allow maximum deck speed of 4x normal&lt;/li&gt;&lt;li&gt;Don't always quantize hotcues, a 2.1.1 regression, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1777429"&gt;bug #1777429&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fix artifacts using more than 32 samplers, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1779559"&gt;bug #1779559&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Store No EQ and Filter persistently, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1780479"&gt;bug #1780479&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Pad unreadable samples with silence on cache miss, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1777480"&gt;bug #1777480&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fixing painting of preview column for Qt5 builds, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1776555"&gt;bug #1776555&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fix sampler play button tool tips, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1779468"&gt;bug #1779468&lt;/a&gt; &lt;/li&gt;&lt;li&gt;LateNight skin: Fix play button right click, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1781829"&gt;bug #1781829&lt;/a&gt;&lt;/li&gt;&lt;li&gt;LateNight skin: Added missing sort up/down buttons&lt;/li&gt;&lt;li&gt;Shade skin: remove superfluid margins and padding in sampler.xml, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1773588"&gt;bug #1773588&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Deere skin: Fix background-color code&lt;/li&gt;&lt;li&gt;ITunes: Don't stop import in case of duplicated Playlists, &lt;a href="https://bugs.launchpad.net/mixxx/+bug/1783493"&gt;bug #1783493&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If you encounter any problems, please report at &lt;a class="moz-txt-link-freetext" href="https://bugs.launchpad.net/mixxx/+filebug"&gt;https://bugs.launchpad.net/mixxx/+filebug.&lt;/a&gt;&lt;br /&gt;&amp;nbsp;  &lt;br /&gt;We are also of course working towards Mixxx 2.2.0 which will include new features  and be built on QT 5. We can always use more help with programming, testing, documentation, translations and so on, so &lt;a href="https://mixxx.org/get-involved/"&gt;please get involved&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Until next time, have fun!&lt;/p&gt;</content><category term="news"></category><category term="2.1"></category><category term="2.1.2"></category><category term="release announcement"></category></entry><entry><title>Mixxx 2.1.0 has arrived!</title><link href="//mixxx.acolombier.dev/news/2018-04-16-mixxx-2-1-0-has-arrived" rel="alternate"></link><published>2018-04-16T17:56:00+02:00</published><updated>2018-04-16T17:56:00+02:00</updated><author><name>RJ Ryan</name></author><id>tag:mixxx.acolombier.dev,2018-04-16:/news/2018-04-16-mixxx-2-1-0-has-arrived</id><summary type="html">&lt;p&gt;After more than two years of hard work, we are pleased to announce the release of &lt;b&gt;Mixxx 2.1.0&lt;/b&gt;! Since Mixxx 2.0, we have overhauled the effects system, redesigned the skins, added and improved lots of controller mappings, rewrote the audio file decoders twice, and of course fixed …&lt;/p&gt;</summary><content type="html">&lt;p&gt;After more than two years of hard work, we are pleased to announce the release of &lt;b&gt;Mixxx 2.1.0&lt;/b&gt;! Since Mixxx 2.0, we have overhauled the effects system, redesigned the skins, added and improved lots of controller mappings, rewrote the audio file decoders twice, and of course fixed a bunch of bugs.&lt;br /&gt;&lt;/p&gt;
&lt;div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto;"&gt;
  &lt;div style="font-family: times; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"&gt;
    &lt;br /&gt;
    &lt;div class="separator" style="clear: both; text-align: center;"&gt;
      &lt;a href="////mixxx.acolombier.dev/images/news/2.1/splash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;
        &lt;img border="0" data-original-height="450" data-original-width="800" height="222" src="////mixxx.acolombier.dev/images/news/2.1/splash.png" width="400" /&gt;
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="separator" style="clear: both; text-align: center;"&gt;
    &lt;/div&gt;
    &lt;br /&gt;
  &lt;/div&gt;
  &lt;div style="text-align: center;"&gt;
    &lt;div class="separator" style="clear: both;"&gt;
    &lt;/div&gt;
    &lt;div class="separator" style="clear: both;"&gt;
    &lt;/div&gt;
    &lt;h2&gt;
      &lt;a href="http://www.mixxx.org/download/?utm_source=blog&amp;amp;utm_medium=blog&amp;amp;utm_campaign=210_release" target="_blank"&gt;Download Mixxx 2.1.0 Now&lt;/a&gt;
    &lt;/h2&gt;
  &lt;/div&gt;
  &lt;div style="text-align: center;"&gt;Available for Windows, macOS, and Linux.
  &lt;/div&gt;
  &lt;br /&gt;Here is a quick summary of what is new in Mixxx 2.1:
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;ul&gt;
    &lt;li&gt;Graphical interface scales for high resolution screens&lt;/li&gt;
    &lt;li&gt;Overhauled Deere and LateNight skins&lt;/li&gt;
    &lt;li&gt;New Tango skin&lt;/li&gt;
    &lt;li&gt;Resizable waveforms&lt;/li&gt;
    &lt;li&gt;Effects are synchronized to the tempo&lt;/li&gt;
    &lt;li&gt;Effects are processed post-fader and post-crossfader and can be previewed in headphones&lt;/li&gt;
    &lt;li&gt;One metaknob per effect with customizable parameter control for intuitive use of effect chains&lt;/li&gt;
    &lt;li&gt;Nine new effects: Autopan, Biquad Equalizer, Biquad Full Kill Equalizer, Loudness Contour, Metronome, Parametric Equalizer, Phaser, Stereo Balance, Tremolo&lt;/li&gt;
    &lt;li&gt;Loaded effects and their parameters are saved and restored when Mixxx restarts&lt;/li&gt;
    &lt;li&gt;More transparent sounding equalizers (Biquad Equalizer and Biquad Full Kill Equalizer)&lt;/li&gt;
    &lt;li&gt;Improved scratching sounds with jog wheels, vinyl control, and dragging waveforms with the mouse&lt;/li&gt;
    &lt;li&gt;Simplified looping and beatjump controls&lt;/li&gt;
    &lt;li&gt;Configurable rows of 8 samplers with up to 8 rows available for a total of 64 samplers&lt;/li&gt;
    &lt;li&gt;Files loaded to samplers are reloaded when Mixxx restarts&lt;/li&gt;
    &lt;li&gt;Improved volume normalization algorithm (EBU-R 128)&lt;/li&gt;
    &lt;li&gt;Filter library table by crates&lt;/li&gt;
    &lt;li&gt;Sort musical keys in library table by circle of fifths&lt;/li&gt;
    &lt;li&gt;Write metadata tags back to audio files&lt;/li&gt;
    &lt;li&gt;New JavaScript library for controller mapping&lt;/li&gt;
    &lt;li&gt;Configure multiple Internet broadcasting stations and use multiple stations at the same time&lt;/li&gt;
    &lt;li&gt;Broadcast and record microphones with direct monitoring and latency compensation&lt;/li&gt;
    &lt;li&gt;Broadcast and record from an external mixer&lt;/li&gt;
    &lt;li&gt;Booth output with independent gain knob for using sound cards with 6 output channels without an external mixer&lt;/li&gt;
    &lt;li&gt;Prevent screensaver from starting while Mixxx is running&lt;/li&gt;
    &lt;li&gt;CUP (Cue And Play) cue button mode&lt;/li&gt;
    &lt;li&gt;Time remaining and time elapsed now take into account the tempo fader&lt;/li&gt;
    &lt;li&gt;Clicking cover art now shows it full size in a separate window&lt;/li&gt;
    &lt;li&gt;and of course, lots and lots of bug fixes./li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Hardware Support&lt;/h3&gt;
  &lt;br /&gt;Here are controllers with mappings that have been added or updated since the 2.0.0 release. Mappings marked with an asterisk (*) have been updated for the new effects interface:
  &lt;br /&gt;
  &lt;ul&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/american_audio_vms2"&gt;American Audio VMS2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/american_audio_vms4"&gt;American Audio VMS4&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/allen_heath_xone_k2"&gt;Allen &amp;amp; Heath Xone K2/K1&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/behringer_cmd_micro"&gt;Behringer CMD Micro&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/behringer_cmd_mm-1"&gt;Behringer CMD MM1&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/behringer_cmd_studio_4a"&gt;Behringer CMD Studio 4a&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/denon_mc4000"&gt;Denon MC4000&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/denon_mc6000mk2"&gt;Denon MC6000 Mk2&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/faderfox_dj2"&gt;FaderFox DJ2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/hercules_dj_console_4-mx"&gt;Hercules DJ Console 4-Mx&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/hercules_dj_control_mp3_e2"&gt;Hercules DJ Control MP3 LE / Glow&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/hercules_djcontrol_compact"&gt;Hercules DJ Control Compact&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/hercules_p32_dj"&gt;Hercules P32&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/ion_discover_dj"&gt;Ion Discover DJ&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/korg_nanokontrol_2"&gt;Korg Nanokontrol 2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/korg_kaoss_dj"&gt;Korg KAOSS DJ&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/m-audio_xponent"&gt;M-Audio Xponent&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/native_instruments_traktor_kontrol_s4_mk2"&gt;Native Instruments Traktor Kontrol S4 Mk2&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/novation_launchpad_mk1"&gt;Novation Launchpad Mk1&lt;/a&gt;&amp;nbsp;and&amp;nbsp; &lt;a href="https://github.com/mixxxdj/mixxx/wiki/novation_launchpad_mk2"&gt;Mk2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/novation_twitch"&gt;Novation Twitch&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/numark_mixtrack_pro_3"&gt;Numark Mixtrack Pro 3 &amp;amp; Numark Mixtrack 3&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/pioneer_ddj-sb2"&gt;Pioneer DDJ-SB2&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/pioneer_ddj-sx"&gt;Pioneer DDJ-SX&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/reloop_beatmix_2"&gt;Reloop Beatmix 2&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/reloop_beatmix_4"&gt;Reloop Beatmix 4&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/reloop_jockey_3_me"&gt;Reloop Digital Jockey 3 ME&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/reloop_terminal_mix"&gt;Reloop Terminal Mix 2&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/reloop_terminal_mix"&gt;Reloop Terminal Mix 4 &lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/vestax_vci-100mkii"&gt;Vestax VCI-100 Mk2&lt;/a&gt;*
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/mixxxdj/mixxx/wiki/vestax_typhoon"&gt;Vestax Typhoon&lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;br /&gt;
  &lt;div&gt;
    &lt;h3&gt;Important Announcements for Upgrading from 2.0.x&lt;/h3&gt;
    &lt;div&gt;
      &lt;br /&gt;
    &lt;/div&gt;For users upgrading from Mixxx 2.0.x or older, we have a few important announcements. First, if you are using Windows, you will have to uninstall any old versions of Mixxx before you can install 2.1.0 (unless you were using the 2.1.0 beta or release candidate). How to uninstall Mixxx varies on different versions of Windows:
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;a href="https://support.microsoft.com/en-us/help/2601726"&gt;Windows Vista, 7, and 8&lt;/a&gt;: Start &amp;gt; Control Panel &amp;gt; Programs &amp;gt; Uninstall a Program
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="https://support.microsoft.com/en-gb/help/4028054/windows-repair-or-remove-programs-in-windows-10"&gt;Windows 10&lt;/a&gt;: Start &amp;gt; Control Panel &amp;gt; Programs &amp;gt; Programs And Features &amp;gt; look for Mixxx &amp;gt; Uninstall
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;br /&gt;
    &lt;br /&gt;If you are upgrading from Mixxx 2.0.0 or older and have MP3 files in your library, we have another important announcement. The good news is that we fixed a bug where the waveforms and audio playback of MP3 files were misaligned. The bad news is that we have no way of knowing which MP3 files were affected or how much the offset was. That means that waveforms, beatgrids, cues, and loops from older versions of Mixxx may be offset by an unknown amount for any MP3 file. Only MP3 files were affected by this bug; other audio file types are unaffected. You can either correct your beatgrids and cue points manually for each track, or you can clear this information for all MP3s and start fresh. Regardless, we recommend clearing the waveforms for all MP3 files. To clear these, type "location:mp3" into the library search bar, press Control + A to select all tracks, right click, and select the information you want to clear from the menu.
    &lt;br /&gt;
    &lt;br /&gt;
  &lt;/div&gt;
  &lt;h3&gt;
  &lt;/h3&gt;
  &lt;h3&gt;Bugs and Feedback
  &lt;/h3&gt;
  &lt;div&gt;
    &lt;br /&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;div style="margin: 0px;"&gt;
        &lt;b&gt;
          &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;
            &lt;b&gt;
              &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;You can help improve Mixxx by&amp;nbsp;
              &lt;/span&gt;
              &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;
                &lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;reporting any bugs you find&lt;/a&gt;
              &lt;/span&gt;
              &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;. Your&amp;nbsp;
                &lt;a href="https://docs.google.com/forms/d/14pLA_aeK0TZUgpfEa6uVLknRX2CBPBPf99gHNHkYgUc/viewform" target="_blank"&gt;feedback&lt;/a&gt;&amp;nbsp;plays a crucial role in Mixxx's development cycle, and even filing a quick bug report makes an important contribution to the project.&amp;nbsp;
              &lt;/span&gt;
            &lt;/b&gt;
          &lt;/span&gt;
        &lt;/b&gt;We want to hear from you! Please&amp;nbsp;
        &lt;a href="https://docs.google.com/forms/d/14pLA_aeK0TZUgpfEa6uVLknRX2CBPBPf99gHNHkYgUc/viewform" target="_blank"&gt;send us feedback&lt;/a&gt;,&amp;nbsp;
        &lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;file a bug&lt;/a&gt;,&amp;nbsp;
        &lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;write us an email&lt;/a&gt;,&amp;nbsp;
        &lt;a href="https://mixxx.org/forums/" target="_blank"&gt;post to the forums&lt;/a&gt;, or&amp;nbsp;
        &lt;a href="https://mixxx.zulipchat.com/" target="_blank"&gt;chat with us on Zulip&lt;/a&gt;.
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;div style="margin: 0px;"&gt;
        &lt;b&gt;
          &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;
            &lt;br /&gt;
          &lt;/span&gt;
        &lt;/b&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div style="margin: 0px;"&gt;
      &lt;h3&gt;
      &lt;/h3&gt;
      &lt;h3&gt;Join Us!
      &lt;/h3&gt;
      &lt;div&gt;
        &lt;br /&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;div&gt;Want to help make Mixxx even more awesome?&amp;nbsp;
          &lt;b&gt;The biggest thing we need is more people.
          &lt;/b&gt;&amp;nbsp;You do not need to be a programmer to help out. Giving feedback on the design of new features as they are being made is very valuable. Refer to the&amp;nbsp;
          &lt;a href="https://github.com/mixxxdj/mixxx/wiki/testing"&gt;Testing page on the wiki&lt;/a&gt;&amp;nbsp;for more information on how to get involved with that. Reporting bugs and telling us your ideas on the&amp;nbsp;
          &lt;a href="https://bugs.launchpad.net/mixxx"&gt;Launchpad bug tracker&amp;nbsp;&lt;/a&gt;is a big help too! We cannot fix problems we do not know about, so please let us know if you find any issues with Mixxx. If you would like to help translate Mixxx into another language, refer to the&amp;nbsp;
          &lt;a href="https://github.com/mixxxdj/mixxx/wiki/internationalization"&gt;Internationalization wiki page&lt;/a&gt;. Of course, more programmers could always help! Read the&amp;nbsp;
          &lt;a href="https://github.com/mixxxdj/mixxx/wiki#developer_documentation"&gt;Developer Documentation&lt;/a&gt;&amp;nbsp;on the wiki for tips on getting started contributing code to Mixxx.
        &lt;/div&gt;
        &lt;div&gt;
          &lt;br /&gt;
        &lt;/div&gt;
        &lt;div&gt;We hope you have as much fun with Mixxx as we do!
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</content><category term="news"></category><category term="2.1"></category><category term="2.1.0"></category><category term="release announcement"></category></entry><entry><title>Announcing Mixxx 2.0!</title><link href="//mixxx.acolombier.dev/news/2015-12-30-announcing-mixxx-2-0" rel="alternate"></link><published>2015-12-30T00:59:00+01:00</published><updated>2015-12-30T00:59:00+01:00</updated><author><name>RJ Ryan</name></author><id>tag:mixxx.acolombier.dev,2015-12-30:/news/2015-12-30-announcing-mixxx-2-0</id><summary type="html">&lt;p&gt;The wait is finally over. After years of hard work, the Mixxx development team is pleased to present&amp;nbsp;&lt;b&gt;Mixxx 2.0!&lt;/b&gt;&lt;br /&gt;&lt;div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto;"&gt;&lt;div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="////mixxx.acolombier.dev/images/news/mixxx-200-latenight-skin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Mixxx 2.0 - LateNight Skin" border="0" height="243" src="////mixxx.acolombier.dev/images/news/mixxx-200-latenight-skin.png" title="Mixxx 2.0 - LateNight Skin" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;h2&gt;&lt;a href="http://www.mixxx.org/download/?utm_source=blog&amp;amp;utm_medium=blog&amp;amp;utm_campaign=200_release" target="_blank"&gt;Download Mixxx 2.0 Now&lt;/a&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Available for Windows, Mac OS X, and Linux.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Mixxx 2.0 is the culmination of over a decade of work by hundreds of DJs …&lt;/div&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;The wait is finally over. After years of hard work, the Mixxx development team is pleased to present&amp;nbsp;&lt;b&gt;Mixxx 2.0!&lt;/b&gt;&lt;br /&gt;&lt;div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto;"&gt;&lt;div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="////mixxx.acolombier.dev/images/news/mixxx-200-latenight-skin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Mixxx 2.0 - LateNight Skin" border="0" height="243" src="////mixxx.acolombier.dev/images/news/mixxx-200-latenight-skin.png" title="Mixxx 2.0 - LateNight Skin" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;h2&gt;&lt;a href="http://www.mixxx.org/download/?utm_source=blog&amp;amp;utm_medium=blog&amp;amp;utm_campaign=200_release" target="_blank"&gt;Download Mixxx 2.0 Now&lt;/a&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Available for Windows, Mac OS X, and Linux.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Mixxx 2.0 is the culmination of over a decade of work by hundreds of DJs, artists, and software engineers. We hope you enjoy it! If you tried our betas then you already know what you're in for. If not, check out &lt;a href="////mixxx.acolombier.dev/news/2015-12-19-whats-new-in-mixxx-2-0" target="_blank"&gt;this quick tour of the new features in Mixxx 2.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;A Sneak Peak at Mixxx 2.1&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;In order to prevent a repeat of the long delay between the 1.11 and 2.0 releases, we are making changes to allow us to release new versions more rapidly. As part of those changes, we will soon cut the release branch for &lt;b&gt;Mixxx 2.1&lt;/b&gt;&amp;nbsp;to get the ball rolling on our next release targeted for &lt;b&gt;Q1 2016&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Our focus for this iteration will be an already-completed rewrite of our &lt;b&gt;Audio File Decoders&lt;/b&gt;&amp;nbsp;and improved&amp;nbsp;&lt;b&gt;Controller Support&lt;/b&gt;. &lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;If you'd like to help out or even provide commentary / advice, see below for details on how to join us in making Mixxx great.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Help Translate Mixxx&lt;/h3&gt;&lt;br /&gt;We want Mixxx to rock parties around the whole world and we need your help to do it! If you speak a non-English language, we could use your help translating Mixxx as well as our manual and website. Check out our&amp;nbsp;&lt;a href="https://explore.transifex.com/mixxx-dj-software/" target="_blank"&gt;Transifex page&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://github.com/mixxxdj/mixxx/wiki/internationalization" target="_blank"&gt;internationalization wiki&lt;/a&gt;&amp;nbsp;for details on how to get started.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Bugs and Feedback&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;You can help improve Mixxx by&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;reporting any bugs you find&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;. Your&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/14pLA_aeK0TZUgpfEa6uVLknRX2CBPBPf99gHNHkYgUc/viewform" target="_blank"&gt;feedback&lt;/a&gt;&amp;nbsp;plays a crucial role in Mixxx's development cycle, and even filing a quick bug report makes an important contribution to the project.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;We want to hear from you! Please&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/14pLA_aeK0TZUgpfEa6uVLknRX2CBPBPf99gHNHkYgUc/viewform" target="_blank"&gt;send us feedback&lt;/a&gt;,&amp;nbsp;&lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;file a bug&lt;/a&gt;,&amp;nbsp;&lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;write us an email&lt;/a&gt;,&amp;nbsp;&lt;a href="https://mixxx.org/forums/" target="_blank"&gt;post to the forums&lt;/a&gt;, or&amp;nbsp;chat with us.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Join Mixxx&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;We're always looking for new contributors who are interested in working on Mixxx. If you're a hacker, artist, or translator and want to work with a creative, enthusiastic team, hop on our IRC channel (#mixxx on&amp;nbsp;Freenode) or sign up for our&amp;nbsp;&lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;developer mailing list&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;</content><category term="news"></category><category term="2.0"></category><category term="2.0.0"></category><category term="release announcement"></category></entry><entry><title>What's New in Mixxx 2.0</title><link href="//mixxx.acolombier.dev/news/2015-12-19-whats-new-in-mixxx-2-0" rel="alternate"></link><published>2015-12-19T18:50:22+01:00</published><updated>2015-12-19T18:50:22+01:00</updated><author><name>Owen Williams</name></author><id>tag:mixxx.acolombier.dev,2015-12-19:/news/2015-12-19-whats-new-in-mixxx-2-0</id><summary type="html">&lt;p&gt;Three years in the making, we've added so many new features to Mixxx that we had to call it 2.0. As always, Mixxx 2.0 is available as a free upgrade for all existing Mixxx users.&lt;/p&gt;</summary><content type="html">&lt;div class="content"&gt;

  &lt;div style="float: right; width: 370px; border: 1px solid #222; border-radius: 5px; margin-top: 0px; padding: 16px; margin-left: 70px; margin-right: 20px;"&gt;
    &lt;h2 style="margin-top: 0px;"&gt;New to Mixxx?&lt;/h2&gt;
    Mixxx is &lt;b&gt;free&lt;/b&gt;, open source DJ software that gives you everything you need to DJ and mix music live at your next party or club gig. &lt;a href="/download"&gt;Download it today&lt;/a&gt; and mix like a pro on Windows, Mac OS X, and Linux.
  &lt;/div&gt;

  &lt;p&gt;
    Three years in the making, we've added so many new features to Mixxx that we had to call it 2.0. As always, Mixxx 2.0 is available as a &lt;b&gt;free upgrade&lt;/b&gt; for all existing Mixxx users.
  &lt;/p&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;img class="center responsive" src="////mixxx.acolombier.dev/images/news/2.0/mixxx-tilt.jpg" width="879" style="margin-top: 50px; margin-bottom: 50px;"&gt;

  &lt;!-- Resizable Skins --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;h2&gt;Dynamic, Resizable Skins&lt;/h2&gt;
    &lt;p&gt;
      Each of our three professionally-designed skins can stretch to fill whatever size screen you have.  Turn parts of the interface on and off to reveal the features you use most.
    &lt;/p&gt;
  &lt;/div&gt;

  &lt;div class="halfbox_right"&gt;
    &lt;img class="responsive" width="400px" src="////mixxx.acolombier.dev/images/news/2.0/feature-resizeableskins.jpg" style="margin-left: 30px;"&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- 4 Decks, Master Sync --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;img class="responsive" width="255px" src="////mixxx.acolombier.dev/images/news/2.0/feature-mastersync.png"&gt;
  &lt;/div&gt;
  &lt;div class="halfbox_right"&gt;
    &lt;h2&gt;4 Decks with Master Sync&lt;/h2&gt;
    &lt;p&gt;
      Supporting the latest DJing techniques, Mixxx supports up to four decks playing back simultaneously.  Combine tracks with loops and samples to create sophisticated on-the-fly remixes.
    &lt;/p&gt;
    &lt;p&gt;
      Holding your mix together is the new Master Sync engine, a powerful feature that holds all of your tracks perfectly aligned even if you change the speed of the mix.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Effects --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;h2&gt;Built-in Effects&lt;/h2&gt;
    &lt;p&gt;
      Mixxx's new effect processing system allows you to apply up to 4 chains of effects to any mixer channel.
      Mixxx 2.0 comes with 5 high-quality effects and 4 equalizer effects with many more to come!
      &lt;ul&gt;
        &lt;li&gt;Flanger&lt;/li&gt;
        &lt;li&gt;Moog 4-pole Ladder Filter&lt;/li&gt;
        &lt;li&gt;Echo&lt;/li&gt;
        &lt;li&gt;Reverb&lt;/li&gt;
        &lt;li&gt;BitCrusher&lt;/li&gt;
        &lt;li&gt;Bessel 4th Order EQ&lt;/li&gt;
        &lt;li&gt;Bessel 8th Order EQ&lt;/li&gt;
        &lt;li&gt;Linkwitz-Riley 8th Order EQ&lt;/li&gt;
        &lt;li&gt;Biquad 8 band graphic EQ&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/p&gt;
  &lt;/div&gt;

  &lt;div class="halfbox_right"&gt;
    &lt;img class="responsive" width="400px" src="////mixxx.acolombier.dev/images/news/2.0/feature-effects.png"&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Harmonic Mixing / Key Detection --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;img class="responsive" width="300px" src="////mixxx.acolombier.dev/images/news/2.0/feature-keydetect.jpg" style="margin-left: 60px;"&gt;
  &lt;/div&gt;

  &lt;div class="halfbox_right"&gt;
    &lt;h2&gt;Harmonic Mixing with Musical Key Detection&lt;/h2&gt;
    &lt;p&gt;
      Mixxx now detects the musical key of your tracks and allows you to fine tune them to be in key with the rest of your mix. With support for Traditional, Open Key, Lancelot, and custom key notations, you'll feel right at home no matter what system you're used to.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- RGB Waveforms --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;h2&gt;RGB Waveforms&lt;/h2&gt;
    &lt;p&gt;
      See the sound of your music.  With RGB waveforms, bright red means killer bass, blue glints where you find crisp hihats, and soft greens show you when the lyrics come in.  A quick glance at the waveform overview and you'll know if a track is banging or just right for sunrise.
    &lt;/p&gt;
  &lt;/div&gt;

  &lt;div class="halfbox_right" style="margin-top: 30px;"&gt;
    &lt;img class="responsive" width="400px" src="////mixxx.acolombier.dev/images/news/2.0/feature-rgbwaveform.png"&gt;
  &lt;/div&gt;

  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- 4 Mic / 4 Aux Inputs --&gt;
  &lt;div class="halfbox_left" style="margin-top: 30px;"&gt;
    &lt;img class="responsive" width="400px" src="////mixxx.acolombier.dev/images/news/2.0/feature-inputs.png"&gt;
  &lt;/div&gt;

  &lt;div class="halfbox_right"&gt;
    &lt;h2&gt;Four Microphones, Four AUX Inputs, Microphone Ducking&lt;/h2&gt;
    &lt;p&gt;
      Radio DJs, MCs, and users with external gear will appreciate the flexibility of 12 total external audio inputs.  And with auto-ducking, listeners will always be able to hear you over the music.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Vinyl Passthrough --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;h2&gt;Vinyl Passthrough&lt;/h2&gt;
    &lt;p&gt;
      Calling all vinyl addicts &amp;mdash; you can now switch off between vinyl timecode records and vinyl audio records with the new vinyl passthrough feature.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class="halfbox_right" style="margin-top: 30px;"&gt;
    &lt;img class="responsive" width="255px" src="////mixxx.acolombier.dev/images/news/2.0/feature-vinylpassthrough.png"&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Quit readin' and download already! --&gt;
  &lt;div class="gapfiller"&gt;
    &lt;p style="text-align: center;"&gt;Like what you see? Download Mixxx for FREE and Start DJing:&lt;/p&gt;
    &lt;p style="text-align: center; font-size: x-large;"&gt;&lt;a href="////mixxx.acolombier.dev/download/"&gt;Download&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Cover Art --&gt;
  &lt;div class="halfbox_left"&gt;
    &lt;h2&gt;Cover Art Support&lt;/h2&gt;
    &lt;p&gt;
      Mixxx reads cover art from your tracks and displays it in the library, on your decks, and on the spinning vinyl widgets.
    &lt;/p&gt;
    &lt;img class="responsive" width="350px" src="////mixxx.acolombier.dev/images/news/2.0/feature-coverart.png"&gt;
  &lt;/div&gt;

  &lt;!-- Engine Improvements --&gt;
  &lt;div class="halfbox_right"&gt;
    &lt;h2&gt;Core Mixing Engine Improvements&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;Improved, high-fidelity equalizers.&lt;/li&gt;
      &lt;li&gt;Improved time-stretching algorithm for better sounding key-lock.&lt;/li&gt;
      &lt;li&gt;Multi-soundcard Synchronization Improvements&lt;/li&gt;
      &lt;li&gt;Mono / Stereo Output&lt;/li&gt;
      &lt;li&gt;Mono Mixing&lt;/li&gt;
      &lt;li&gt;Split Cueuing&lt;/li&gt;
      &lt;li&gt;Master/Headphone Delay&lt;/li&gt;
      &lt;li&gt;Latency Usage Meter&lt;/li&gt;
      &lt;li&gt;Improved Broadcasting Stability&lt;/li&gt;
      &lt;li&gt;Improved Microphone Routing&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Library --&gt;
  &lt;h1&gt;Upgraded Library&lt;/h1&gt;

  The Mixxx music library was designed from the ground up for DJs. Powered by a high-performance database, accessing and organizing your music is easy and intuitive.
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;div class="halfbox_left"&gt;
    &lt;img class="responsive" width="360px" src="////mixxx.acolombier.dev/images/news/2.0/feature-library.jpg" style="margin-left: 60px;"&gt;
  &lt;/div&gt;

  &lt;div class="halfbox_right"&gt;
    &lt;b&gt;Auto DJ Crates&lt;/b&gt;
    &lt;p&gt;
      Need an extended bathroom-break? Automatically expand your Auto DJ queue with Auto DJ crates.
    &lt;/p&gt;

    &lt;b&gt;Multi-Core Library Scanner&lt;/b&gt;
    &lt;p&gt;
      Got a huge library? Mixxx will fly through it with its new multi-core scanning support.
    &lt;/p&gt;

    &lt;b&gt;Cover Art Support&lt;/b&gt;
    &lt;p&gt;
      Evoke the feel of thumbing through your record crate. Mixxx now shows slivers of cover art in the library table.
    &lt;/p&gt;

    &lt;b&gt;Improved Auto DJ Stability&lt;/b&gt;
    &lt;p&gt;
      We've worked closely with heavy users of Auto DJ to identify problems, clean up code, and add internal tests to make Auto DJ more reliable than ever.
    &lt;/p&gt;

    &lt;b&gt;MusicBrainz Tag Lookup&lt;/b&gt;
    &lt;p&gt;
      Fingerprint your tracks and fetch missing tags from MusicBrainz.
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;!-- Controller Support --&gt;
  &lt;h1&gt;Improved, Expanded Support for DJ Controllers&lt;/h1&gt;
  &lt;p&gt;
    Thanks to generous DJs and our vibrant forum community, Mixxx 2.0 brings support for an exciting new range of DJ controllers.
  &lt;/p&gt;

  &lt;h2&gt;Newly Supported DJ Controllers&lt;/h2&gt;
  &lt;div style="float: right"&gt;
    &lt;img class="responsive" width="500px" src="////mixxx.acolombier.dev/images/news/2.0/feature-newcontrollers.jpg" alt="Newly Supported Controllers in Mixxx 2.0"&gt;
  &lt;/div&gt;

  &lt;p&gt;
    &lt;b&gt;New Mixxx Certified Controllers&lt;/b&gt;
  &lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Traktor Kontrol S4 MK2&lt;/li&gt;
    &lt;li&gt;Denon HS5500&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    &lt;b&gt;New Mixxx Community Supported Controllers&lt;/b&gt;
  &lt;/p&gt;
  &lt;div style="float: left; width: 30%; padding-right: 50px;"&gt;
    &lt;ul&gt;
      &lt;li&gt;American Audio RADIUS 1000&lt;/li&gt;
      &lt;li&gt;American Audio RADIUS 3000&lt;/li&gt;
      &lt;li&gt;Denon MC6000MK2&lt;/li&gt;
      &lt;li&gt;Denon SC2000&lt;/li&gt;
      &lt;li&gt;DJ-Tech Kontrol One&lt;/li&gt;
      &lt;li&gt;DJ-Tech Mixer One&lt;/li&gt;
      &lt;li&gt;Electrix Tweaker&lt;/li&gt;
      &lt;li&gt;Korg nanoKONTROL 2&lt;/li&gt;
      &lt;li&gt;MixVibes U-Mix Control 2 Pro&lt;/li&gt;
      &lt;li&gt;Novation Launchpad Mini&lt;/li&gt;
      &lt;li&gt;Numark MixTrack Pro II&lt;/li&gt;
      &lt;li&gt;Pioneer DDJ-SB&lt;/li&gt;
      &lt;li&gt;Pioneer DDJ-SB2&lt;/li&gt;
      &lt;li&gt;Reloop Beatpad&lt;/li&gt;
      &lt;li&gt;Reloop Terminal Mix 2&lt;/li&gt;
      &lt;li&gt;Vestax VCI-100 MKII&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;

  &lt;div style="clear: both;"&gt;&lt;/div&gt;
  &lt;div style="margin-top: 40px; margin-bottom: 40px;"&gt;
    &lt;b&gt;Want to know if your DJ controller is supported in Mixxx?&lt;/b&gt; Please check the &lt;a href="/features/#full_specs"&gt;full technical specifications&lt;/a&gt;.
  &lt;/div&gt;
  &lt;div style="clear: both;"&gt;&lt;/div&gt;

  &lt;div class="gapfiller"&gt;
    &lt;p style="text-align: center;"&gt;Ready to Upgrade? Download Mixxx for FREE and Start DJing:&lt;/p&gt;
    &lt;p style="text-align: center; font-size: x-large;"&gt;&lt;a href="////mixxx.acolombier.dev/download/"&gt;Download&lt;/a&gt;&lt;/p&gt;
    &lt;div style="clear: both;"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</content><category term="news"></category><category term="2.0"></category><category term="2.0.0"></category></entry><entry><title>Surprise! Release Candidate 1</title><link href="//mixxx.acolombier.dev/news/2015-12-05-surprise-release-candidate-1" rel="alternate"></link><published>2015-12-05T19:04:00+01:00</published><updated>2015-12-05T19:04:00+01:00</updated><author><name>RJ Ryan</name></author><id>tag:mixxx.acolombier.dev,2015-12-05:/news/2015-12-05-surprise-release-candidate-1</id><summary type="html">&lt;p&gt;Hi Mixxx-heads,&lt;br /&gt;
&lt;br /&gt;
Are you ready for a surprise?&lt;br /&gt;
&lt;br /&gt;
The Mixxx 1.12 beta period has been going quite smoothly and we're almost ready to launch this baby. This release packs a punch. It's our &lt;b&gt;single biggest release ever&lt;/b&gt;
 and adds more headline features than we've ever put in one release …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hi Mixxx-heads,&lt;br /&gt;
&lt;br /&gt;
Are you ready for a surprise?&lt;br /&gt;
&lt;br /&gt;
The Mixxx 1.12 beta period has been going quite smoothly and we're almost ready to launch this baby. This release packs a punch. It's our &lt;b&gt;single biggest release ever&lt;/b&gt;
 and adds more headline features than we've ever put in one release. We decided that it was time -- time to &lt;b&gt;drop the "1.1"&lt;/b&gt;
 (it's cleaner):&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;Mixxx 1.12.0 will be...&amp;nbsp;&lt;b&gt;Mixxx 2.0!&lt;/b&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
We've been working towards this release for many years now. But we still need your help to make this our best ever.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;We need your help &lt;b&gt;translating&lt;/b&gt;
 and &lt;b&gt;testing.&lt;/b&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;Today we're releasing Mixxx 2.0 Release Candidate 1. If all goes according to plan, we're going to get some more testing in from the community and have &lt;b&gt;Mixxx 2.0&lt;/b&gt;
&amp;nbsp;ready for all of your New Year's Eve parties!&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
Please help us out!&lt;br /&gt;&lt;/p&gt;
&lt;div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto;"&gt;&lt;div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="////mixxx.acolombier.dev/images/news/Mixxx-1.12-beta.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Mixxx 1.12 Beta - LateNight Skin" border="0" height="200" src="////mixxx.acolombier.dev/images/news/Mixxx-1.12-beta.png" title="Mixxx 1.12 Beta - LateNight Skin" width="320" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;
&lt;a href="http://www.mixxx.org/download/?utm_source=blog&amp;amp;utm_medium=blog&amp;amp;utm_campaign=200_rc1" target="_blank"&gt;Download Mixxx 2.0 RC1 Now&lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;Available for Windows, Mac OS X, and Linux.&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;b&gt;Help Translate Mixxx&lt;/b&gt;
&lt;br /&gt;
In order to make this release rock in every language we need your help with translations! This is the first release we are offering translations of the Mixxx manual in addition to the app itself. We are currently in dire need of translations for Spanish, Chinese and Japanese (among many other languages).&lt;br /&gt;
Check out our&amp;nbsp;&lt;a href="https://explore.transifex.com/mixxx-dj-software/" target="_blank"&gt;Transifex page&lt;/a&gt;
&amp;nbsp;and&amp;nbsp;&lt;a href="https://github.com/mixxxdj/mixxx/wiki/internationalization" target="_blank"&gt;internationalization wiki&lt;/a&gt;
&amp;nbsp;for details on how to get started.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div style="margin: 0px;"&gt;&lt;b&gt;Call for Controller Presets&lt;/b&gt;
&lt;br /&gt;
Support for MIDI/HID controllers is historically one of Mixxx's biggest weak points. If you have built a controller preset for a device, please consider submitting it for inclusion in Mixxx as a community-maintained preset! Check out &lt;a href="https://github.com/mixxxdj/mixxx/wiki/contributing_mappings" target="_blank"&gt;the guide on our wiki&lt;/a&gt;
 for more details.&lt;/div&gt;
&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Bugs and Feedback&lt;/b&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;You can help improve Mixxx by&amp;nbsp;&lt;/span&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;reporting any bugs you find&lt;/a&gt;
&lt;/span&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;. Your&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/1Zbx-VgdcSIuTTmy9UalNZhtDypSJdSLvRVZ0MKOuLu4/viewform" target="_blank"&gt;feedback&lt;/a&gt;
&amp;nbsp;plays a crucial role in Mixxx's development cycle, and even filing a quick bug report makes an important contribution to the project.&amp;nbsp;&lt;/span&gt;
&lt;/b&gt;
&lt;/span&gt;
&lt;/b&gt;
We want to hear from you! Please&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/1Zbx-VgdcSIuTTmy9UalNZhtDypSJdSLvRVZ0MKOuLu4/viewform" target="_blank"&gt;send us feedback&lt;/a&gt;
,&amp;nbsp;&lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;file a bug&lt;/a&gt;
,&amp;nbsp;&lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;write us an email&lt;/a&gt;
,&amp;nbsp;&lt;a href="https://mixxx.org/forums/" target="_blank"&gt;post to the forums&lt;/a&gt;
, or&amp;nbsp;chat with us.
.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/b&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin: 0px;"&gt;&lt;b&gt;Join Mixxx&lt;/b&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div style="margin: 0px;"&gt;We're always looking for new contributors who are interested in working on Mixxx. If you're a hacker, artist, or translator and want to work with a creative, enthusiastic team, hop on our IRC channel (#mixxx on&amp;nbsp;&lt;a href="https://webchat.freenode.net/"&gt;Freenode&lt;/a&gt;
) or sign up for our&amp;nbsp;&lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;developer mailing list&lt;/a&gt;
.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="news"></category><category term="1.12"></category><category term="release announcement"></category></entry><entry><title>Mixxx 1.12 Beta Released!</title><link href="//mixxx.acolombier.dev/news/2015-04-29-mixxx-1-12-beta-released" rel="alternate"></link><published>2015-04-29T03:12:00+02:00</published><updated>2015-04-29T03:12:00+02:00</updated><author><name>RJ Ryan</name></author><id>tag:mixxx.acolombier.dev,2015-04-29:/news/2015-04-29-mixxx-1-12-beta-released</id><summary type="html">&lt;p&gt;Hi Mixxxers -- did you miss us? The Mixxx team has been quietly toiling for &lt;b&gt;over 2 years&lt;/b&gt;
&amp;nbsp;to bring you Mixxx 1.12. This will be our &lt;b&gt;biggest release ever&lt;/b&gt;
&amp;nbsp;and we need your help to make sure that it's our &lt;b&gt;best ever&lt;/b&gt;
 as well. We've been doing alpha testing …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hi Mixxxers -- did you miss us? The Mixxx team has been quietly toiling for &lt;b&gt;over 2 years&lt;/b&gt;
&amp;nbsp;to bring you Mixxx 1.12. This will be our &lt;b&gt;biggest release ever&lt;/b&gt;
&amp;nbsp;and we need your help to make sure that it's our &lt;b&gt;best ever&lt;/b&gt;
 as well. We've been doing alpha testing with our dedicated &lt;a href="https://mixxx.org/forums/viewtopic.php?f=1&amp;amp;t=6617" target="_blank"&gt;forum users&lt;/a&gt;
&amp;nbsp;for a while now and are ready to release Mixxx 1.12 Beta!&lt;br /&gt;&lt;/p&gt;
&lt;div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto;"&gt;&lt;div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="////mixxx.acolombier.dev/images/news/Mixxx-1.12-beta.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Mixxx 1.12 Beta - LateNight Skin" border="0" src="////mixxx.acolombier.dev/images/news/Mixxx-1.12-beta.png" height="200" title="Mixxx 1.12 Beta - LateNight Skin" width="320" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;
&lt;a href="http://www.mixxx.org/download/?utm_source=blog&amp;amp;utm_medium=blog&amp;amp;utm_campaign=112_beta" target="_blank"&gt;Download Mixxx 1.12 Beta Now&lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;Available for Windows, Mac OS X, and Linux.&lt;/div&gt;
&lt;br /&gt;
There are too many new features and fixes to list all of them, but here's just some of the new things Mixxx can do: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;4 Decks with M&lt;/b&gt;
&lt;b&gt;aster Sync&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;New Effects Framework with 4 Effect Units and 5 Built-in Effects:&lt;/b&gt;
&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Flanger&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bit Crusher&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reverb&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Echo&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Filter&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;More to come! &lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Configurable, Resizable User Interface with 3 Brand New Skins&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cover Art Display&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Music Key Detection and Shifting&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vinyl Audio Pass-Through&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;4 Microphone inputs and 4 Auxiliary inputs&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MIDI Mapping GUI and Improved Learning Wizard&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RGB Musical Waveforms&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hundreds of Bug Fixes and Improvements&lt;/b&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;New Pitch-Independent Algorithm for Better-Sounding Key-lock.&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;If you tried the Alpha release, be sure to check out the Beta. &amp;nbsp;There are a ton of new features and fixes even since then.&amp;nbsp; And we'll be updating the Beta every week, so you can always have the latest updates.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Help Translate Mixxx&lt;/b&gt;
&lt;br /&gt;
In order to make this release rock in every language we need your help with translations! We are currently in dire need of translations for Chinese and Japanese (among many other languages).&lt;br /&gt;
Check out our &lt;a href="https://explore.transifex.com/mixxx-dj-software/" target="_blank"&gt;Transifex page&lt;/a&gt;
 and &lt;a href="https://github.com/mixxxdj/mixxx/wiki/internationalization" target="_blank"&gt;internationalization wiki&lt;/a&gt;
 for details on how to get started.&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;
&lt;/div&gt;
&lt;b&gt;Bugs and Feedback&lt;/b&gt;
&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;You can help improve Mixxx by&amp;nbsp;&lt;/span&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;reporting any bugs you find&lt;/a&gt;
&lt;/span&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;. Your&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/1Zbx-VgdcSIuTTmy9UalNZhtDypSJdSLvRVZ0MKOuLu4/viewform" target="_blank"&gt;feedback&lt;/a&gt;
&amp;nbsp;plays a crucial role in Mixxx's development cycle, and even filing a quick bug report makes an important contribution to the project.&amp;nbsp;&lt;/span&gt;
&lt;/b&gt;
&lt;/span&gt;
&lt;/b&gt;
We want to hear from you! Please&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/1Zbx-VgdcSIuTTmy9UalNZhtDypSJdSLvRVZ0MKOuLu4/viewform" target="_blank"&gt;send us feedback&lt;/a&gt;
,&amp;nbsp;&lt;a href="https://bugs.launchpad.net/mixxx/+filebug" target="_blank"&gt;file a bug&lt;/a&gt;
,&amp;nbsp;&lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;write us an email&lt;/a&gt;
,&amp;nbsp;&lt;a href="https://mixxx.org/forums/" target="_blank"&gt;post to the forums&lt;/a&gt;
, or&amp;nbsp;chat with us
.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/b&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin: 0px;"&gt;&lt;b&gt;Join Mixxx&lt;/b&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div style="margin: 0px;"&gt;We're always looking for new contributors who are interested in working on Mixxx. If you're a hacker, artist, or translator and want to work with a creative, enthusiastic team, hop on our IRC channel (#mixxx on &lt;a href="https://webchat.freenode.net/"&gt;Freenode&lt;/a&gt;
) or sign up for our&amp;nbsp;&lt;a href="https://lists.sourceforge.net/lists/listinfo/mixxx-devel" target="_blank"&gt;developer mailing list&lt;/a&gt;
.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><category term="news"></category><category term="1.12"></category><category term="beta"></category><category term="release announcement"></category></entry><entry><title>Google Summer of Code 2013 Projects!</title><link href="//mixxx.acolombier.dev/news/2013-05-29-google-summer-of-code-2013-projects" rel="alternate"></link><published>2013-05-29T22:14:00+02:00</published><updated>2013-05-29T22:14:00+02:00</updated><author><name>RJ Ryan</name></author><id>tag:mixxx.acolombier.dev,2013-05-29:/news/2013-05-29-google-summer-of-code-2013-projects</id><summary type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="////mixxx.acolombier.dev/images/news/image00.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="////mixxx.acolombier.dev/images/news/image00.jpg" width="400" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
The Summer of Code is upon us! Google has just&amp;nbsp;&lt;a href="http://google-opensource.blogspot.com/2013/05/students-announced-for-google-summer-of.html"&gt;announced&lt;/a&gt;
&amp;nbsp;which students Mixxx has accepted into the&amp;nbsp;&lt;span style="font-weight: bold;"&gt;Google Summer of Code 2013&lt;/span&gt;
&amp;nbsp;program. Students were competing for one of four slots awarded to Mixxx by Google. This year we received a high volume of applications from many skilled students …&lt;/p&gt;</summary><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="////mixxx.acolombier.dev/images/news/image00.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="////mixxx.acolombier.dev/images/news/image00.jpg" width="400" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
The Summer of Code is upon us! Google has just&amp;nbsp;&lt;a href="http://google-opensource.blogspot.com/2013/05/students-announced-for-google-summer-of.html"&gt;announced&lt;/a&gt;
&amp;nbsp;which students Mixxx has accepted into the&amp;nbsp;&lt;span style="font-weight: bold;"&gt;Google Summer of Code 2013&lt;/span&gt;
&amp;nbsp;program. Students were competing for one of four slots awarded to Mixxx by Google. This year we received a high volume of applications from many skilled students which made the decision-making process very difficult.&lt;br /&gt;&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;After over two weeks of deliberation, we're pleased to introduce our Google Summer of Code students for 2013:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Wei Xin &lt;/b&gt;
from&amp;nbsp;&lt;b&gt;Dalian University of Technology&lt;/b&gt;
 in Liaoning, China&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Carl Pillot&lt;/b&gt;
&amp;nbsp;from&amp;nbsp;&lt;b&gt;The New England Conservatory of Music&lt;/b&gt;
&amp;nbsp;in Boston, USA&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nazar Gerasymchuk &lt;/b&gt;
from&amp;nbsp;&lt;b&gt;Taras Shevchenko University&lt;/b&gt;
&amp;nbsp;in Kiev, Ukraine&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Chris Johnson-Roberson &lt;/b&gt;
from&amp;nbsp;&lt;b&gt;Brown University&lt;/b&gt;
&amp;nbsp;in Rhode Island, USA&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;Wei Xin will build a &lt;b&gt;community-powered controller mapping portal&lt;/b&gt;
. This will allow Mixxx users to download the latest controller presets for their devices, rate and comment on presets, and share their own presets with the community. All of this will be possible from within Mixxx!&lt;br /&gt;
&lt;br /&gt;
Carl Pillot will build a &lt;b&gt;loop recorder for live remixing&lt;/b&gt;
. This will allow DJs to record samples from their live mix and play them back live, providing them with yet another opportunity to get creative with their performances.&lt;br /&gt;
&lt;br /&gt;
Nazar&amp;nbsp;Gerasymchuk will &lt;b&gt;re-design Mixxx's database concurrency model&lt;/b&gt;
 to fix a long-standing issue Mixxx has with locking the GUI for database queries. This should make the Mixxx interface smoother than ever!&lt;br /&gt;
&lt;br /&gt;
Last but not least, Chris Johnson-Roberson will build an &lt;b&gt;intelligent track suggestions&lt;/b&gt;
&amp;nbsp;feature which aims to helps DJs with the most important choice there is in DJing: what to play next.&lt;br /&gt;
&lt;br /&gt;
This summer's Google Summer of Code projects will be a huge step forward for Mixxx both in functionality and polish. We can't wait to get these students integrated into the Mixxx community and get their work into a release. The 4 will be mentored by our mentoring team: RJ Ryan, Max Linke, Daniel Schürmann, Owen Williams, Sean Pappalardo, and Albert Santoni. As always, we're very grateful for Google's generosity in enabling this work.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, the Mixxx team is working full-speed ahead on Mixxx 1.12, which we hope to release by Christmas 2013. Look for an alpha release in the near future!&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;</content><category term="news"></category><category term="gsoc"></category><category term="gsoc-2013"></category></entry></feed>