Friday, June 19, 2009

Mixxx with the Stanton SCS.3d and SCS.1m

Sean Pappalardo's been busy again, this time working on support for the Stanton SCS.1m and improving our existing support for the SCS.3d. In this first video, Sean explains some of the neat features he's coded like fader-start, real-time feedback using the SCS.1m LED digit displays, and lots of other bells and whistles.



In this second video, Sean demonstrates some of the new features he's implemented since he made his original SCS.3d video, including the new vinyl platter mode and VU meters.



Our improved SCS.3d and SCS.1m support will be available for everyone to play with in our next beta. In the meantime, current hardware owners can still use their controllers with Mixxx 1.7.0 Beta1, but they'll have some extra to look forward to in our next release.

Speaking of which - Since our recent beta, your bug reports have provided us with important feedback that's helped us discover, fix, and prevent several problems. We've now identified a handful of remaining issues that we want to tackle, and once they're fixed, we'll either release another beta or a "release candidate". We've also completed a preliminary round of planning for Mixxx 1.8, but we'll save that for another blog post. Stay tuned!

Thursday, May 7, 2009

Mixxx 1.7.0 Beta1 for Windows x64 Now Available!



The Mixxx team is pleased to announce the availability of a 64-Bit version of Mixxx 1.7.0 Beta1 for Windows.

In a dazzling display of masochism and borderline insanity, Sean Pappalardo has been working hard over the last month or so to get Mixxx to run natively on 64-bit Windows. When asked why, he just mumbled, "full power...full power" over and over again as he rocked in his chair. Sean comes from the Commodore 64 programming days of yore when 64 KB of RAM and a 1 MHz CPU was all you had to work with, so he enjoys taking maximum advantage of the available hardware.

While 64-bit versions of Mixxx have been available on Linux for the past year, this is the first time it's been done on Windows.

Why was there no 64-bit version of Mixxx for Windows? As Sean found out, this was not simply a matter of recompiling Mixxx - all of Mixxx's dependencies had to be rebuilt as x64 binaries as well. This process brought numerous headaches and profanity-littered screams because Microsoft's Visual Studio is not always easy to deal with (especially when you're trying to force the free version to compile x64 binaries which involves a hack .) Fortunately a couple of the libraries that Mixxx depends on (libsndfile, FFTW) already had x64 binaries available for download, and for that we are very grateful. The good news is that, unless we decide they need upgrading, the dependencies don't have to be rebuilt in the future, so the hard part is done for now.

Mixxx is now the first and only known DJ software package that runs natively on 64-bit Windows, and this gives 64-bit Mixxx fans improved performance for free. A native 64-bit build also improves compatibility with ASIO devices on 64-bit Windows.

To take advantage of this, you need three things:
  1. a 64-bit AMD or Intel processor (eg. AMD Athlon 64, AMD Phenom, Intel Core 2)
  2. a 64-bit version of Windows (XP Professional x64, Vista x64, Server 2003 x64, etc.)
  3. A copy of Mixxx x64 for Windows
Install and run as usual, and enjoy! Please let us know if you have any problems or questions.

Thursday, April 23, 2009

Mixxx 1.7.0 Beta1 Released!


The Mixxx development team is proud to announce the first beta of Mixxx 1.7.0. This latest release is the culmination of six months of work by over a dozen contributors, and contains several exciting new features as well as many bug fixes.

Some of the new changes in Mixxx 1.7.0 Beta1 that we'd like to highlight are:
  • Cue points are now saved in the library for each track, with "auto-recall" cue option added to preferences.
  • The default skin is now widescreen, and fits nicely on netbook sized screens.
  • Stereo master VU meter added.
  • MIDI overhaul:
    • MIDI learning wizard
    • MIDI mappings table editor
    • Upgraded, faster mapping system
  • QtScript/JavaScript-based MIDI Scripting Environment - Code up complex behaviour for your MIDI controller without recompiling Mixxx!
  • MIDI output now fully supported on Windows, OS X, and Linux.
  • Added full support for the Stanton SCS.3d on all platforms.
  • Added Mixman DM2 mappings for Linux and OS X.
  • Vinyl Control:
    • Scratching responsiveness improved, with needle-skip prevention option added.
    • Signal quality indicators added to vinyl control preferences.
  • Merged the mixxx and mixxx-data packages for Ubuntu users into a single mixxx package.
  • Fixed about 40 bugs, including:
    • Browse mode no longer disappears in certain situations
    • Skin changing is now much faster
    • Tooltips now work again
    • Fixed rare instabilities caused by certain OGG and MP3 files
    • Minor improvements to the BPM detection
    • Fixed some OpenGL issues
    • Fixed a handful of obscure issues that may have prevented Mixxx from starting up on Windows
    • Play nicer with Ubuntu systems that are running PulseAudio
Aside from these more visible changes, there was significant work done on less visible parts of Mixxx. This includes many improvements to the organization and cleanliness of our source code, as well as a lot of work on features that didn't make it into the final 1.7.0. release. Improving the overall codebase is important for us because it makes it easier for new developers to contribute, and it was these new contributors who helped catalyze the overhaul of our MIDI system.

Back around December, we started toying around with the idea of something we called MIDI scripting. The idea of MIDI scripting is that having a small scripting engine sitting on top of our regular MIDI mappings would allow our users to code complex behaviour for their MIDI controllers using a JavaScript-like language. Soon after this idea hatched, we realized MIDI scripting would make it much easier for us to support new controllers in the future, and this attracted the attention of a handful of our developers.

Because we felt that both the long-term and short-term impact of implementing MIDI scripting would be very beneficial, several of our developers decided to shift their time away from other subprojects that they were working on (like effects, the new library, and looping) in order to complete the MIDI overhaul and scripting engine. When this work was nearing completion, we collectively felt that MIDI scripting support along with the slew of other improvements we made were significant enough to call this release 1.7.0. We're very excited about the possibilities that scripting opens up, and we hope to see our users come up with new, cool uses for it.

We'd also like to thank Stanton for their support during this development cycle, which allowed us to significantly accelerate the development of our MIDI scripting functionality. We're pleased to be the only cross-platform DJ software that fully supports the SCS.3d without the use of any extra software in the middle.

Lastly, if you encounter problems with the beta, please report them in our bug tracker! We hope you enjoy Mixxx 1.7.0 beta1, and we'll be working hard towards a final, stable release. Stay tuned.

Errata
  • The overhaul of our MIDI code included many changes to our MIDI mapping file format. Some of our old mappings were converted automatically by a script, but many required additional modifications by hand, which introduces the possibility of us having made errors. Due to the limited availability of hardware and free time within our development team, the MIDI mappings for some controllers have not been tested. If you have a controller that we provide a mapping for, please test it and report your results in our controller testing matrix.
  • MIDI Pitch messages are no longer processed internally and must be mapped to a script function. Fortunately script.pitch can be used very easily from your script.
  • M-Audio Xponent support has likely been broken. Support for it needs to be rewritten using scripting, but none of our developers have this device. (This is a great task for a user who wants to contribute to Mixxx! Come ask someone on IRC in #mixxx on Freenode about it.)
  • Windows: MIDI feedback on all but the first listed controller doesn't work with more than one connected. It's best to disconnect/remove all (real and virtual) devices except the one you're interested in working with.
  • Windows: You may need to tell Windows to send MIDI output to the correct device, especially if you hear random notes instead of see lights on your controller: Start→Settings→Control Panel→Classic View→Sounds and Audio Devices→Audio Tab, set “MIDI Music Playback” at the bottom to the device you're trying to use.
  • The use of multiple MIDI devices simultaneously is not yet supported.
  • For script developers:
    • The SelectNextTrack, SelectPrevTrack and LoadSelected controls do not work in the Browse view. See bug #342120.
    • The SelectNextTrack and SelectPrevTrack controls cause the GUI to freeze for a few seconds when you try to scroll down beyond the current page. See bug #361170.

Thursday, February 19, 2009

Hercules releases GPL Linux MIDI drivers & Mixxx 1.6.1+Herc is released

On Feb 16th, Hercules released GPL Linux MIDI drivers for their DJ Console / DJ Control series of MIDI input controllers ( Mk2, RMX, MP3 Control, DJ Control Steel ).

Mixxx is proud to support Hercules' great contribution by releasing Mixxx 1.6.1+Herc (Linux) and the +Herc MIDI mapping update packs (Windows & OSX). All are available for download now at http://mixxx.org/

Hercules users are encouraged to download these updates and visit the Mixxx Hercules documentation page at http://mixxx.org/hercules/.

Release Notes

1.6.1+Herc



Hercules DJ Console Mk1 users will have to wait until usbquirks is modified in the Linux kernel to remove the quirk for Mk1.

Monday, February 9, 2009

MIDI Scripting and the Stanton SCS.3d (Videos)



One of Mixxx's newer developers, Sean Pappalardo (DJ Pegasus), has been hacking away at MIDI scripting for the past few months so that we can fully support more advanced MIDI controllers. One of the new controllers scripting will allow us to support is Stanton's SCS.3d (aka "DaScratch").

The Stanton SCS.3d replaces conventional knobs, buttons and sliders found on other MIDI controllers with touch-sensitive surfaces laid out in a DJ-friendly format. It's compact, rugged, light-weight, and best of all, reliable, since there are almost no moving parts to break. The large central circular area is where all the magic happens as it can be configured to serve multiple purposes (jog dial/vinyl emulation, three sliders, or 9 buttons) depending on the control needs of the software.



Sean demonstrating the SCS.3d with Mixxx 1.6.2



Mixxx's previous MIDI system only allowed you to map one MIDI control to one property and provided no means of feedback or otherwise sending commands to the device. However, controllers like the SCS.3d are of limited use without being able to illuminate LEDs and toggle various modes, since there would be no physical indicators.

Stanton gets around this by offering a free middleware solution called "DaRouter" which essentially acts as a MIDI translation bridge between your DJ software and the SCS.3d. However, it is difficult to get feedback to the controller from your DJ software, and your ability to customize the device's behaviour is limited. Additionally, this middleware solution is not available for Linux.

Enter Mixxx's new MIDI Scripting Engine.

After scratching our heads for some time, we conjured up and coded a system that allows DJs to link hardware MIDI controls with custom script functions. These scripts are written in QtScript, which is an easy language that's almost identical to JavaScript. Scripts can contain functions that can affect any number of Mixxx controls and also send feedback to a hardware MIDI device, freeing Mixxx from a one-to-one mapping ideology. These user-created scripts can then do anything desired with the MIDI event data such as have a single controller button simultaneously affect two or more Mixxx properties, adjust incoming control values to work better with Mixxx (scratching,) display a complex LED sequence, or even send messages to text displays on the controller.

This approach provides a number of key benefits:
  • Script functions are evaluated at run time and and can access or modify Mixxx's internal properties.
  • QtScript brings all of the advantages of a full scripting language. For example, functions can use variables, allowing a single piece of code to be used for multiple cases and to remember states between invocations (this is how we implement mode and deck switching).
  • Functions can send any MIDI messages they like including SYStem EXclusive messages, needed for advanced controllers like the SCS series for mode changes and text displays.
  • Functions can be connected to Mixxx properties so that when the property changes, the function is called with the new value, allowing automatic controller response.
  • DJs can customize the script functions to suit their particular work flow and desires without compiling anything.
  • Support for complex controllers can be added to Mixxx at any time between releases by anyone since no compilation is needed!
  • No middleware is needed to use advanced controllers like the SCS.3d with Mixxx
  • Our MIDI scripting system is platform-independent, which makes it available to Windows, Mac OS X, and Linux users!

Our new MIDI scripting engine is going to be the biggest new feature in Mixxx 1.6.2, and we're currently polishing it up along with some of our other MIDI code. We hope to have a beta release out within the next month or two for our DJs to play with.

Lastly, we'd like to thank Stanton for their gracious support and cooperation. We think the SCS.3d is going to be a great device for Mixxx users in the future!

Wednesday, December 17, 2008

Looking for a Community Coordinator

Are you a creative Mixxx enthusiast?
Would you like volunteer with the project, but don't know how to code?
If so, we might have found the role for you - We are officially looking for a Mixxx Community Coordinator.



As the Mixxx community grows, we're finding that we're spending more and more time on administrative tasks and less time writing code. We've got cool ideas for stuff to do with our community, but we don't have time to do them and keep pushing development forwards at the same time. A community coordinator will help fill a growing niche in our development team and will be a great benefit to the project.

Our community coordinator will have many responsibilities, including moderating the forums, writing blog and news posts, and will also hold the cherished title of Mixxx Chocolatier*. We're looking for a dynamic, enthusiastic individual with a passion for DJing (and excellent English language skills) to fill this position. Any experience with forums and HTML is a plus.

If you think you'd be a good candidate and you'd like to be our community coordinator, please contact Adam or Albert and tell us a bit about yourself. Due to the importance of the responsibilities involved, we'll be following up with interviews for potential candidates.

As Mixxx continues to grow, more opportunities for more volunteers to help out without coding will continue to arise. We've seen tremendous growth since our 1.6.0 release, and there's no signs of slowing down. Getting involved with an open source project also looks good on your resumé or CV, and it can help demonstrate the diversity and flexibility of your background. 2009 will be a great year for Mixxx, and we're looking forward to hearing from interested volunteers!

* More on the chocolatier front will come as we fill this position.

Wednesday, December 3, 2008

Rewriting the Library

This developer commentary explains the trials and tribulations of Mixxx's library code, and what the Mixxx developers are doing to improve it.

In the (long) development cycle between Mixxx 1.5.0 and 1.6.0, several changes were made to the library. Some of the more visible changes were the addition of our search box and "Browse" mode, which allows you to play songs off your hard drive without importing them into the library. There was also significant work done on playlist handling and management.


Mixxx 1.5.0, with our old-school library



Mixxx 1.6.1, with the new library


One not-so-apparent difference is that the underlying code was changed to use the Model-View-Controller (MVC) paradigm, which is easy to do with Qt 4 (... or so we thought).

As it turns out, many of the library problems that have been discovered since 1.6.0 are tied to the fact that we botched our use of MVC. Even if you grasp the MVC concepts at a high level, when you get deep into coding it, the separation between "models", "views", and the organization of GUI code can become mucky. Basically, we made some design mistakes, and the only way to correct them and allow us to continue improving the library is to go back and rewrite it from scratch. Some of the library-related bugs in our tracker are going to be very tough to fix because of the current poor design (#194415, #202594, #257769, #258955, #275198, etc!). Rewriting the library code will prevent many of these bugs from reappearing, and should also prevent us from being in a quagmire like this again in the future. Of course, this all depends on us having learned from our mistakes, and I hope that we have. :)



Mixxx with the even newer library! (work-in-progress)


Back in October at the GSoC Mentor Summit, I started hacking our library to use an integrated SQLite database to store track metadata, instead of storing them in a flat XML file on disk. I quickly discovered that there were two separate problems - The first being how the library was stored inside Mixxx at runtime, and the other being how it was stored on disk (XML).

At runtime, we were using a gigantic skip-list to store the metadata of every single track in the library. If you had a library with 100,000 songs, we were keeping the metadata (eg. ID3 tag info) for every song in memory. As you might guess, this was probably something the original Mixxx developers didn't think very hard about, because it doesn't scale well to large libraries. This brings us to the second problem.

When Mixxx starts up or is shut down, it read/writes all of this track metadata to an XML file (mixxxtrack.xml). Again, this simply doesn't scale well for large libraries because it takes a very long time to write metadata for a library of 100,000 songs (and is another example of where the original Mixxx developers didn't think hard enough).

When I started hacking SQLite integration into Mixxx, I started replacing the XML file loading/saving stuff. I quickly realized that I was going to need to fix the skip-list problem too, and then the lightbulb went on - Switching to SQLite solves both of these problems. Rather than storing metadata for all the tracks in memory at runtime, we could simply query the database to retrieve what we need. With that thought, I started deleting as much of the old library code as possible - It was a complete write-off.

I wanted to start from scratch to prevent myself from falling into the trap of the poor design of the old library. I coded many of the changes to the library that were made in 1.6.0, and it took a long time for me to finally give up and realize it was never going to be salvageable. I find this amusing because history is repeating itself - I made major changes to the soundcard I/O code inside Mixxx several times before I gave up and rewrote it all from scratch (which enabled things like vinyl control and multiple soundcard support to happen). For me, this is the fuel that keeps me coding. I know that cool things will be possible if I rewrite the library the Right Way (TM).

There is still a very long way to go before the new library code is complete, but I already have a few new features that people have been requesting, like the ability to move the columns in the library around (which saves automatically too!). Starting and shutting down Mixxx is faster, and I'm hoping that searching will be faster as well. The rewrite has also improved other areas of Mixxx's code - Some pieces of the old library were tied to seemingly unrelated parts of Mixxx, and fortunately I've been able to separate them, which solves many of the code organization problems that the old library had.

Some of the (big) things that need to be added still are playlist support, browse mode, and some sort of intelligent library scanning. The last item is being worked on by a new contributor, and we've been playing around with some cool ideas that we're both hoping will improve the library scanning/rescanning situation greatly. (That topic probably deserves a blog article on it's own.) :) In any event, the new library code won't be ready for at least another release or two.

Anyways, the main focus is to reimplement all the library functionality that was there before, but while I'm hacking the library, I want to hear what cool new features you (Mixxx users) want. If you want to share a neat idea, please leave a comment!