Vestax Spin mapping v1.2 [BHVN Official]

Latest release download is in this post:

Original post follows:

These changes fix the jog wheel behavior with 1.11 for me–can someone else with a Spin confirm whether this works correctly with other firmware versions etc? Is there a cross platform or cross firmware compatibility issue with this mapping?

I just acquired a (fairly beat up) Vestax Spin, and am using it under Windows 7 and 8 (32 and x64, with both 32 and 64 bit executables). Maybe this is just my version of the firmware, but it behaved very strangely when using the “scratch” mode switch. The wheels were very laggy and after a scratch the track would just spin to a stop or lope along very slowly and unevenly. It’s hard to describe but it was definitely messed up.

Apparently this behavior is actually a side effect of the hack to prevent strange behavior when you “untouch” the wheel. Apparently Mixxx 1.11 no longer needs this hack; I removed it, and then the jog wheels work properly with no strange side effects.

I also tried to enable soft takeover for the rate sliders, which worked really well at first, and now no longer seems to do anything. I can’t figure out if it is a syntax error in my javascript or what. I ran it through a linter and after adding a lot of semicolons decided that it’s probably just my ignorance of the inner workings of mixxx. If anyone can tell me what I did wrong on that part it would be awesome.

In any case, I have uploaded the modified version of the scripts file. General change summary:

  • Removed the scratch mode spindown hack
  • Set ticks-per-rotation to 128, which seems correct (was very very sensistive at 300, maybe suitable for scratching?)
  • added soft takeup init code that does not work for me.

Vestax-Spin-scripts.js (11.7 KB)

I’ve improved the spin support scripts, but they’re different enough from the official release that I’ve renamed them for my own use. This version works quite well for me.

I’ve adjusted the rotation so that wheels rotate approximately 1:1 with the wheels in mixxx. I adjusted the scratch alpha/beta so that it’s not quite so laggy in touch mode, probably the default “1/8” recommendation is perfect for 128 ticks-per-rev, but this wheel is supposedly 300. I also adjusted the jog wheel resolution in “non-scratch mode”, but I don’t know how to adjust its alpha/beta. (No documentation!) Maybe I’ll dig through the source code one of these days and mess with it, but it’s much better as it is.

This version also removes the busy-wait-loop in the startup and shutdown code. Apparently the MIDI I/O is fixed since the original script was written. a) It is no longer needed, and b) busy wait loops are evil.

Other notes

  • I’m using a Vestax Spin with Windows and Mixxx 1.11.0
  • I still have no idea why the soft takeover code isn’t working. engine.softTakeover( “[Channel1]”, “rate”, true ); right?
  • Scratching is still a tiny bit laggy-- I prefer the response with beta set to 0.008?

Vestax-Spin-BHVN-scripts.js (11.6 KB)
Vestax Spin BHVN.midi.xml (15.7 KB)

Thanks so much for making this mapping! I thought I’d posted but can’t see my post anywhere - I tried to install this and put the two files in the right directory but when I restarted Mixx (and my computer) it’s not showing up in the presets anywhere even when I have my controller on before I open Mixx. Any ideas how to fix this?? I’m probably missing something. Thanks!

Updated for Mixxx 2.2 (tested on mint).

  • Alpha increased to 0.008 because I think it feels good. :slight_smile:
  • Pitch up/down buttons mapped to beatjump because you have a jog wheel, you don’t need 'em
  • Mic fx/pitch are the “super” knobs for fx racks 1/2
  • Similarly, Mic on/off and “Rec” buttons are the on/off for the first fx
  • No filter knob mapping (sad!) but hey we’re out of controls and midrange is useful. I typically leave the first FX channels mapped to “moog filter” because I do miss it, so you might want to remap something (midrange?) to filter using the magical mapping wizard.

Loop buttons work as the classic mapping, with dedicated buttons for in, out, and on/off. I think this wastes a button but I’m not big into looping anyway so maybe the whole looper stack needs rethinking.

There’s no control to do pitch adjustment. I like to do manual mix-in-key, ideally with quarter-step manual adjustment, but the Spin is a little knob-deficient. So it goes. Guess I should update the VCI-400 next for knob overload!

Share and enjoy!
Vestax-Spin-BHVN-scripts.js (11.6 KB)
Vestax-Spin-BHVN.midi.xml (16.2 KB)

You’re quite welcome. I think the Spin was undersold: it’s really a pro controller pretending to be entry-level, and deserves more love IMO. :slight_smile:

I don’t know why it wouldn’t show up. I tried the old 1.x mapping with Mixxx 2.2, putting it in .mixxx/controllers/., and it showed up…but of course it didn’t work. Try the new one.

Also, you might want to clean out (move to another location) the current contents of your controllers dir before you start. When you select a controller, Mixxx makes a copy to be overwritten by the mapping wizard, which can cause confusion to say the least as it does not copy the script and both show up with the same name in the mapping selection dialog.

Try the new script and see if it works. Good luck!

Thanks for your reply, really appreciate it. I think I’m missing something or something’s broken for me still.
When I clean out the folder, then copy everything back included the latest script version and restart mixxx, there’s still nothing showing for the Spin in the dropdown controller menu, or in any menus inside the preset controllers. :frowning: I might try uninstalling Mixxx and reinstalling it to see if that does anything and my Spin driver but can’t think of what else to do!

Really wish I had an answer for you! I think the mapping may specify version 2.2+, are you using an older version? That might be excluding it from the list (unsure). If you drop a different mapping into the folder, does it show up?

I’m going to do a complete rewrite on the spin mapping to remove the spindown hacks and use new features, like I did to for the VCI-400. This will happen as soon as I get a free afternoon (and get v2.2 backported to Devuan). Maybe the rewrite will help.

Have rewritten the Spin mapping, using the builtin spinback support (nice). It exposes the super knob, beatjump, pitch management, auto and manual looping, and one (1) hotcue. You’ll be using the Shift button.

Documentation to follow. Mappings attached. Share and enjoy.

Bugfixes in 1.1:

  • Added in the code to control the VU meters (with peak light!)
  • LEDs are initialized at startup and shut down on exit

BHVN-Vestax-Spin.scripts.js (19.3 KB)
BHVN-Vestax-Spin.midi.xml (18.1 KB)

Here’s how it works, barring bugs and your hacks. Controls that are not listed work in the default boring way!


  • Play: works normally
  • Cue Set: acts as a normal CDJ cue button
  • Cue Jump: slip-reverse(censor)

Shifted, these work just like the silkscreen says: jump to start, rewind, ff.


  • Sync: tries to work like modern Mixxx
  • Sync-longpress: sets this deck as master
  • Plus: beatjump forward
  • Minus: beatjump backward
  • Shift:Sync: Match key
  • Shift:Sync-longpress: reset track key
  • Shift:Plus: Key-up (halfstep)
  • Shift:Minus: Key-down


  • Loop-Auto: Create/move beatloop
  • Loop-In/Out: If loop is active, clears loop. Otherwise, first click sets loop-in, second sets loop-out
  • Shift:Loop-Auto: double beatloop size (does nothing to manual loop)
  • Shift:Loop-In/Out: halve beatloop size
  • FX: Hotcue 1
  • Shift:FX: Clear Hotcue 1

Manual looping is almost never useful unless the beatgrid is completely wrong, and I can’t remember the last time I used it. Perhaps a reloop-focused use for the In/Out button would be more useful?


  • Up&Down: set selection to previous/next
  • Shift:Up&Down: Page-up and Page-down
  • Left&Right: load selection into left or right deck
  • Shift:Left&Right: same as Tab and Shift-Tab navigation

Mic Knobs
The Mic FX and Pitch knobs control the left and right Super knob respectively.

Hey, we all have to pee sometimes.

  • Automix: toggles AutoDJ
  • Shift:Automix: triggers “fade now” in AutoDJ
  • Mic OnOff: add current selection to end of AutoDJ playlist
  • Shift:Mic OnOff: add current selection next in AutoDJ Playlist

Record button
I mapped it to split-cue toggle. This is not as useful as you might think, because there is no headphone blend control knob, and you usually want the blend in the middle for split-cue. It does nothing fancy so it should be easy to remap to Record or Broadcast if that’s your kind of thing. I prefer an external record/broadcast rig myself.

Another quick bugfix release:

  • Fixed message about “MoveFocusForkward”
  • Fixed bug where nonexitent timers were released, causing temporary UI freeze

Share and enjoy
BHVN-Vestax-Spin.scripts.js (19.4 KB)
BHVN-Vestax-Spin.midi.xml (18.1 KB)

An FYI: I am having serious performance issues with the Spin if I adjust pitch. I do not have the same problem with the VCI-400. I suspect this may have to do with how it handles USB events, or it might just be I’ve coded something that is flooding it with MIDI.

Will do some experimenting when I get a chance.

note: code is now maintained at

Hi @tekhedd ,
a friend of mine had the opportunity to buy a Vestax Spin, I will check its compatibility with Linux (Ubuntu). I saw that you had succeeded in doing the mapping, great!
If I understood correctly everything works except the pitch problem…
Can you tell me more about this problem? It happens when you use the knobs or if you modify it from the pc too?
Is there a way to avoid this is to use it properly? (Does the sync function work or not?)

Thanks a lot for your answers and your work.

Hi there! Sorry I never followed up on this. I’ve been meaning to track down the problems with the SPIN but life happened. :slight_smile: I like the SPIN hardware; I guess everyone else does too because they seem to hold their value.

When I say “pitch problems,” I mean I run out of CPU when I start to use keylock and pitch shift seriously while also using rubberband stretching. The VCI-400 mapping is steady at about 75% CPU with the same settings/load/computer. It’s a 2013 quad-core i5, so I know I’m close to the edge in any case, and it could be that newer/faster CPUs will simply run fine.

Theory: maybe the USB on the SPIN has a smaller buffer or other design difference that introduces latency, and this affects the efficiency of the pitch shifting algorithms.

Investigating this is at the top of my list of things to do as soon as I get a free night. I’ve heard COVID has a lot of people bored with nothing to do, but my calendar apparently hasn’t got the news! :slight_smile:

So, anyway, sorry I can’t give you good news just yet. Maybe I’ll skip out on work for the rest of the day, I’m obviously not getting anything done right now anyway!

I think you may be OK. If Mixxx runs in the green on your system with other controllers, the Spin should run about the same.

Running the Spin today, I’m not having problems, other than that the exact amount of CPU varies more than with the VCI-400. This seems to be because it has slightly slower MIDI (for the blinkies) and a different USB chip, making it a little more likely to glitch on my system when you suddenly enable keybending. But keep in mind my system is always close to the edge in any case, and can’t run rubberband at all under Windows.

Really, rubberband just needs some serious CPU. (Which I’m sure someone will remind me is a known and documented issue!)

Anyway, I think you should be fine, but it also depends on the PC. I guess this is one of those life decisions! I’m also going to upload a small update to how the blinky lights work because, hey, I can.

As I warned you, I uploaded new blinky code:

Share and Enjoy.

Hello! I have just built the latest mixxx HEAD on MacOS. Everything works perfectly except for the spin controller mapping. I’ve used the 1.3.1 version of your script on Mixxx 2.3 and it works flawlessly. Now with the latest build (actually any that’s considered “2.4”) the controller does not initialize properly. The first time I try pressing any button I get this error window

Another midi controller I use (Akai pro mkII) works perfectly fine on Mixxx 2.4.
Looking through the log as Mixxx 2.4 starts up I see:

warning [Controller] "Controller" has no "init"  method

Any idea what to fix?

Mixxx 2.4 has some backwards incompatible changes for controller scripts. Try Mixxx 2.3.

I was actually able to find a temporary workaround by removing the “const” keywords from the script.js file. I am sure this isn’t how it was meant to be used since those keywords were put there in the first place but so far this works with no issues.

BHVN-Vestax-Spin.scripts.js (20.5 KB)

Thanks for the report, I’ll take a look at it this weekend; will see if I can get a 2.4 build up and running. It does look a lot like 2.4 didn’t find the startup code, so the main program object is undefined.

I have a new Spin to test out too; now two excuses to stop practicing and listen to music for a bit. :slight_smile:

1 Like