Mapping for the VCI-300

Hi there,

I’ve created a mapping for my VCI-300 using the latest Mixxx 1.11.0 beta under Linux. The initial revision (see attached file) is now ready for testing:

  • High-res jog wheels (1600 steps per revolution, not 1664 as originally stated) for scratching and pitch bending
  • High-res pitch sliders (9-bit = 512 steps)
  • VU meters display left/right channel volume (incl. peak indicator)
  • 6 hotcues (instead of 3 hotcues and 3 manual loops)
  • Beatloop starting with 4 beats + Half/Double buttons
  • Shift + Half/Double jumps to start/end of the loaded track (disabled while playing)
  • Pitch Shift buttons for fine tuning the pitch +/-0.01
  • Keylock is disabled permanently when starting to scratch
  • Navigation buttons work
  • Crates/Files/Browse buttons are connected but unused

Update 2012-08-13:

  • Show spinning wheels in scratch mode
  • Fast track search

It would be nice to get some feedback from other owners of this controller. Hopefully we can get this stuff as a preset into one of the next releases :wink:

Please download the latest version from here:

Thanks for the mapping tapir.
I tested your mapping with trunk and 1st gen VCI300 on Mac OS 10.6.8 and really like that it is pretty similar to the original mapping and the way you implemented the jogwheel scratching.

Some comments:

  • Pressing he CRATES buttes crashes Mixxx : ControllerEngine: “Uncaught exception at line 789 in file …/Vestax-VCI-300-scripts.js: TypeError: Result of expression ‘VestaxVCI300.createsLED’ [undefined] is not an object”. The FILES and BROWSE buttons are unaffected.
  • I have not found the cause yet, but when using the jog scratch on the VCI, Mixxx locks up sometimes and accepts no midi messages any more. I have to restart the program.
  • The AUTO TEMPO kinda lie. Once presses it adjusts the tempo and phase of the track to the other track, but the button lits permanently. Since Mixxx to not have a master tempo yet it would be fair to have the button only lit temporary.
  • No matter what was set in the Mixxx preferences, the pitch range is reset to 6% on restart which is pretty narrow. Would be nice if the VCI script would inherit the setting from the preferences.
  • As a long time user of the original mapping i find the cue point order odd. 1-3 vertical and 4-6 again vertical in a 2nd row. Out of habit the fingers always seek the horizontal order 1-2, 3-4 - nevermind this is only minor and a matter of personal preferences.
  • What i really miss is the lack of manual loop points and that i can not recall a loop that was previously set but is currently inactive. Maybe give up CUE3/IN and CUE3/OUT for loop_in and loop_out and use SHIFT+AUTOLOOP for reloop_exit ?

Some ideas:

  • Delete the VCI LED`s on shutdown
  • Use the quantize MixxxControl with SHIFT+KEYLOCK button on the VCI to enable quantization in Cues and Loops
  • Allow scrolling through the library with SCROLL+ Jogwheel like with the original mapping
  • Use the C.F.CURVE control on the front of the VCI ( 0x1A) to control the crossfader curve. There is a script.crossfaderCurve common function available and is currently used e.g. in Reloop TerminalMix4.js

Thanks again and i am happy to do further testings,

Wow, thanks for your helpful comments! I will fix the errors as soon as possible, implement the requested features, and post/commit a new version.

  • Fixing the crates LED was a no brainer, just a typo in the code :wink:
  • Currently I set the rateRange to 6% and restore the original setting upon shutdown. I will remove this constant value and instead read the rateRange setting from the preferences.
  • 4 hotcues + 1 manual loop would indeed be an interesting option. In the next version I will use CUE3/IN and CUE3/OUT (blue/green) for manual looping. The remaining 4 hotcues will be reordered.
  • The key combination Shift + Auto Loop is currently unused, I will try to use it for de/-reactivation auf the manual loop. We could also use the Scroll button as a modifier key for both CUE3/IN and CUE3/OUT.
  • I’ve never used auto tempo or sync myself, need to investigate this further.
  • The scratching code is a little bit complicated. Might take some time to get it waterproof.

I will implement all of the above. The LEDs should already be turned off upon shutdown(), don’t know why this doesn’t work as expected.

Updated version (2012-08-14):

  • Fix typo to avoid crash when pressing Crates button
  • Fix typo to correctly disconnect controls upon shutdown
  • Fix array of auto loop beat lengths
  • Connect and synchronize rateRange with preference settings
  • Adjust behaviour of Auto Tempo button:
    • Auto Tempo = trigger “beatsync”
    • Shift + Auto Tempo = toggle “quantize”
  • Manipulate crossfader curve via C.F.CURVE control
  • Use Scroll + Jog to scroll the playlist
  • Shift + Play = toggle “repeat”

Reworking the hotcue and manual/auto loop code will take some time. I plan to use blinking lights for an active and steady lights for an inactive loop.

By the way, I was not able to produce any lock ups during scratching on my machine (Core2Duo, Ubuntu 12.04, 64-bit).

Deleted this version. Too many bugs after some last minute refactorings :wink:

Again some feedback from testing the VCI-300_2012-08-14 version.

  • Scratching does not work anymore. If The SCRATCH button is active, moving the jog wheel only slows down or speed up the track like a motorstart/-stop on a turntable.

  • Fast track search with SHIFT+Jog does not work anymore. The playposition jumps instantly to the tracks beginning when moving the jog wheel.

  • SCROLL+Jog for scrolling the library does not work. Debug trows “Warning [Controller]: ControllerEngine: script setting [ “[Playlist]” , “SelectTrackKnob” ] to NotANumber, ignoring.

  • Apparently there is a bug with the Hotcues. If the track is stopped and you press a already present hotcue, you cant stop the playback by using the Play/pause button, even in the GUI.
    Ideally, if a track is paused, the hotcue plays while the hotcue button is pressed. If the PLAY button is pressed while hotcue plays, you can lift the hotcue button and the playback continues. This is how hotcues work in the GUI.

  • Typo for Channel 2 AutoTempo (Ox3C) around line 384 in the xml, change to VestaxVCI300.onAutoTempoButton

  • Typo for Channel 2 AutoLoop (0x46) around line 618 in the xml , change to [Channel2]

  • LEDs still lit on shutdown

  • There is currently no way to set a CUE point while playing. Since SHIFT+PLAY (the equivalent in the GUI) is now already taken by repeat , what about using SHIFT+CUE for cue_set ?

  • If a loop is active, SHIFT+HALF/DOUBLE could move the loop. You could use the script.loopMove function from common-controller-scripts.js like demo`ed in Reloop TerminalMix4.js

OMG!! The 2012-08-14 version was simply unusable. I deleted the uploaded file.

I’m currently preparing a bugfixed version, testing will take some time. Such a disaster should not happen again :wink:

Hopefully this version works better than the previous one:

  • Bugfixing, bugfixing, bugfixing
  • Fix shutdown() function
  • Shift + Cue sets a cue point while playing
  • Scroll + Auto Tempo = BPM tap
  • Switch hotcue behaviour to default

It will be the last version for some days. Reorganizing the hotcues and an improved manual/auto loop section is planned.


Another major update. Please refer to the header of the script file for more details. I also added a Quick reference section there.

If I only knew in advance how much work this was, I wouldn’t have started this project :wink:

Minor fixes, scratching improvements and jog response tuning (see changelog)


Latest snapshot from my launchpad branch: (8.34 KB)

Thanks for the update, the latest Mixxx_Vestax-VCI-300_2012-08-28 works excellent.

Might be an error on my my side but i can only enable PFL A or PFL B not both at a time.
Another thing is that the CENSOR function goes rapidly out of sync, you see/hear it best if you sync the same track on both decks.
Try the new Slip mode here. Toggle slip_enabled then call reverse and toggle slip_enabled again - the playback will resume where the track would have been.

Um, well, the “smart” PFL switching (only one activated at a time) was intentional :wink: I will change it back to the regular (and expected) behavior.

Due you think it would be helpful to switch PFL exclusively to a single deck when loading a track with Scroll + PFL? Usually I need to disable PFL for the opposite deck manually after loading a track.

Good tip for testing CENSOR mode! I must have overlooked the slip controls in Mixxx.

Next version will follow, maybe sunday…

New version in response to additional helpful feedback from jus:

  • Reduce “smartness” of PFL switching
  • Censor: Use slip_enabled in conjunction with reverse playback to keep track synchronized (8.36 KB)
Remark: The .midi.xml file has been renamed according to the new naming scheme introduced in the 1.11 upstream branch!

Have fun :wink:

Minor improvements:

  • Use Auto Tempo LED as a beat indicator
  • Reduce sensitivity of playlist scrolling (Scroll + Jog) (8.46 KB)

Excellent work on this tapir! It’s been a LONG time coming. My only issue is, i’m using windows xp. I moved your map files into place and activated them. I am getting errors that suggest format/syntax issues. I have little functionality of things, no LED feedback and the jog wheels throw errors on touch. When you load the map there is an exception starting at line 1. And an example error is:

‘Uncaught exception at line 351 in file C:/Program Files/Mixxx/midi/Vestax-VCI-300-scripts.js: TypeError: Result of expression ‘engine.isScratching’ [undefined] is not a function.’

The Java machine on my laptop is up to date FWIW. Javascript is NOT a strong suit for me, so any ideas would be great. Is there a basic rule of thumb I can use to ‘port’ this for windows? I did check the wiki and either didn’t see differences noted, or overlooked them somehow. Thanks!

  • Matt


I should clarify I was running 1.10 and was ushered to 1.11 by another support user. Upon loading 1.11 the controllers list now shows 2 devices (previously 1), 1 USB sound and 1 VCI 300 DJ controller. If I enable them and go to drop down to select maps, USB audio does not show a map for the 300? Nor does the map list under the VCI give the option. Did you name them something else?

EDIT 2 (saving all this for other users)

Was informed the new map files go into the ‘controllers’ folder, and not the traditional ‘midi’ folder for this. Now have function with some minor bugs. Will post what I find. Thanks for all the work on mixxx!

My mapping requires Mixxx 1.11. You can download the latest beta builds from this location:

As of this writing the most recent build available was r3427.

Just copy the two files from the .zip archive into the controllers folder of your Mixxx installation. After restarting Mixxx a controller named “Vestax VCI-300” should be available for selection.

Feel free to report any findings or sugggestions on how to improve the mapping!

Navigation improvements and jog scroll fixes:

  • Map TAB button to ToggleSelectedSidebarItem
  • Rework playlist scrolling (Scroll + Jog) completely to solve sensitivity issues (8.56 KB)
Thanks again for your helpful feedback, jus! Unfortunately I need more time to think about the cue/beatroll feature suggestions :wink:

Implement beatlooproll:

  • Shift + Auto Loop: enter/exit beatlooproll
  • Scroll + Auto Loop: reset number of beats to 4 if beatloop not active (re-mapped from Shift + Auto Loop)
  • Documentation updates (8.7 KB)

My preset is now included in the latest 1.11 beta builds. No need to download it separately from here.

Please contact me for bug reports or if you have some ideas for improvements/extensions.

Edit: An excellent documentation of the VCI-300 itself and my Mixxx mapping has been provided by jus! Without his feedback and support this would not have been possible. Please refer to the Wiki:

Track nudging could be working only when jog wheel is touched. To avoid skipping caused by vibrations. I think in this way it’s working on ITCH too.