Akai AMX Mapping Thread

[size=150]This is going to be the thread for the Akai AMX. [/size]

If you do not know what this unit is:

“A powerful controller for any performer, AMX controls 2 decks of Serato DJ with an intuitive array of faders, touch-activated knobs, and buttons. Featuring a curve-adjustable mini innoFADER crossfader, dedicated line faders, and control signal inputs, AMX can interface Serato DJ with turntables using Serato Noise Map (DVS) or HID players over a single USB cable. Built-in headphone and master outputs integrate into any booth or tabletop setup, bringing the trusted Akai Professional hardware experience to stages and studios all over the world. AMX comes with the full-version, letting you take advantage of precise, powerful audio manipulation in real-time. Already have Serato DJ? AMX unlocks it, providing both a control surface and audio interface to build around or have as an extra controller option. AMX features two sets of audio inputs, selectable as Line or Phono, to accept signals from Serato time code vinyl, also known as Serato Noise Map. This Digital Vinyl System (DVS) lets you DJ with your digital music collection, while maintaining the feel and action of a turntable vinyl setup. AMX is a rock-solid, affordable interface that fuses the best of analog feel with the best of digital music access (Serato DVS Expansion Pack and time code vinyl are sold separately). By themselves, the EQ and Filter knobs on AMX are tactile, responsive controls for shaping tracks and carving out transitions. These knobs also incorporate a dramatic “twist”- they react to the human touch. In Touch mode, each knob responds to a twist, a touch, or a combination of both.”

I am currently working on mapping this unit out on one of my xubuntu laptops using Mixxx 1.12 beta1 (build 1.12 r5442) and also using a bootable USB drive with Crossfade and Mixxx 1.11.

I will be looking for some help to finish out this mapping, mainly because this is my first time mapping a controller with Mixxx (using XML and JavaScript).

If I need to post actual code, MIDI messages from the unit, or anything else please let me know. Here is what I have so far:
The XML file

<?xml version='1.0' encoding='utf-8'?>
<MixxxControllerPreset mixxxVersion="1.11.0+" schemaVersion="1">
	<info>
	  <name>Akai AMX Preset For Mixxx</name>
	  <author>Prism</author>	
	<info/>
    <controller id="AMX">
        <scriptfiles>
            <file filename="AMX-scripts.js" functionprefix="AMX"/>
        </scriptfiles>
        <controls>
            <control>
                <group>[Channel1]</group>
                <key>pfl</key>
                <status>0x90</status>
                <midino>0x0C</midino>
                <options>
                    <switch/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>pfl</key>
                <status>0x80</status>
                <midino>0x0C</midino>
                <options>
                    <switch/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>pfl</key>
                <status>0x90</status>
                <midino>0x0D</midino>
                <options>
                    <switch/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>pfl</key>
                <status>0x80</status>
                <midino>0x0D</midino>
                <options>
                    <switch/>
                </options>
            </control>
	    <control>
                <group>[Channel1]</group>
                <key>pregain</key>
                <status>0xB0</status>
                <midino>0x3C</midino>
                <options>
                    <diff/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>pregain</key>
                <status>0xB0</status>
                <midino>0x3D</midino>
                <options>
                    <diff/>
                </options>
            </control>
	    <control>
                <group>[Channel1]</group> 
                <key>filterHighKill</key>
                <status>0x90</status>
                <midino>0x11</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterHighKill</key>
                <status>0x80</status>
                <midino>0x11</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterMidKill</key>
                <status>0x90</status>
                <midino>0x13</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterMidKill</key>
                <status>0x80</status>
                <midino>0x13</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterLowKill</key>
                <status>0x90</status>
                <midino>0x15</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterLowKill</key>
                <status>0x80</status>
                <midino>0x15</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterLow</key>
                <status>0xB0</status>
                <midino>0x08</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterMid</key>
                <status>0xB0</status>
                <midino>0x09</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>filterHigh</key>
                <status>0xB0</status>
                <midino>0x0A</midino>
                <options>
                    <normal/>
                </options>
            </control>
	    <control>
                <group>[Channel2]</group>
                <key>filterLow</key>
                <status>0xB0</status>
                <midino>0x0C</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterMid</key>
                <status>0xB0</status>
                <midino>0x0D</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterHigh</key>
                <status>0xB0</status>
                <midino>0x0E</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterHighKill</key>
                <status>0x90</status>
                <midino>0x12</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterHighKill</key>
                <status>0x80</status>
                <midino>0x12</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterMidKill</key>
                <status>0x90</status>
                <midino>0x14</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterMidKill</key>
                <status>0x80</status>
                <midino>0x14</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterLowKill</key>
                <status>0x90</status>
                <midino>0x16</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>filterLowKill</key>
                <status>0x80</status>
                <midino>0x16</midino>
                <options>
                    <normal/>
                </options>
            </control>
	    <control>
                <group>[Channel2]</group>
                <key>volume</key>
                <status>0xB0</status>
                <midino>0x0B</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Master]</group>
                <key>volume</key>
                <status>0xB0</status>
                <midino>0x32</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Master]</group>
                <key>headVolume</key>
                <status>0xB0</status>
                <midino>0x33</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Master]</group>
                <key>crossfader</key>
                <status>0xB0</status>
                <midino>0x01</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Master]</group>
                <key>headMix</key>
                <status>0xB0</status>
                <midino>0x37</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>volume</key>
                <status>0xB0</status>
                <midino>0x07</midino>
                <options>
                    <normal/>
                </options>
            </control>
	    <control>
                <group>[Channel1]</group>
                <key>LoadSelectedTrack</key>
                <status>0x90</status>
                <midino>0x04</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>LoadSelectedTrack</key>
                <status>0x80</status>
                <midino>0x04</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>LoadSelectedTrack</key>
                <status>0x90</status>
                <midino>0x05</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>LoadSelectedTrack</key>
                <status>0x80</status>
                <midino>0x05</midino>
                <options>
                    <normal/>
                </options>
            </control>
	    <control>
                <group>[Channel1]</group>
                <key>cue_default</key>
                <status>0x80</status>
                <midino>0x08</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>cue_default</key>
                <status>0x90</status>
                <midino>0x09</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>play</key>
                <status>0x90</status>
                <midino>0x0A</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>cue_default</key>
                <status>0x80</status>
                <midino>0x09</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>play</key>
                <status>0x80</status>
                <midino>0x0A</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>play</key>
                <status>0x90</status>
                <midino>0x0B</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>play</key>
                <status>0x80</status>
                <midino>0x0B</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>beatsync</key>
                <status>0x90</status>
                <midino>0x06</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>beatsync</key>
                <status>0x80</status>
                <midino>0x06</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>beatsync</key>
                <status>0x90</status>
                <midino>0x07</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>cue_default</key>
                <status>0x90</status>
                <midino>0x08</midino>
                <options>
                    <normal/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>beatsync</key>
                <status>0x80</status>
                <midino>0x07</midino>
                <options>
                    <normal/>
                </options>
            </control>
	    <control>
                <group>[QuickEffectRack1_[Channel2]]</group>
                <key>super1</key>
                <description>MIDI Learned from 744 messages.</description>
                <status>0xB0</status>
                <midino>0x30</midino>
                <options>
                    <fourteen-bit-msb/>
                </options>
            </control>
	    <control>
                <group>[QuickEffectRack1_[Channel2]]</group>
                <key>super1</key>
                <description>MIDI Learned from 744 messages.</description>
                <status>0xB0</status>
                <midino>0x10</midino>
                <options>
                    <fourteen-bit-lsb/>
                </options>
            </control>
	    <control>
                <group>[Playlist]</group>
                <key>SelectTrackKnob</key>
                <description>MIDI Learned from 234 messages.</description>
                <status>0xB0</status>
                <midino>0x3B</midino>
                <options>
                    <selectknob/>
                </options>
            </control>
        </controls>
        <outputs/>
    </controller>
</MixxxControllerPreset>

Features That need to be finished: (in no real order)

  1. Channels 1 & 2 VU LED meter
  2. Master VU LED meter
  3. LED ‘on’ state of Play/Pause (Channel 1&2)
  4. Shift functions of Sync (Sync Off), Cue (Start track from beginning), Channel Gain (Channel Pitch), Chanel Search (DVS)
  5. Crossfader curve control

As you can see a lot of this is java script, which I might as well no nothing about.

Any help with finishing this will, in the end, help everyone.

AMX_MIDI_1.midi.xml.zip (430 Bytes)
akai-amx-detail.jpg

I am wondering If i should Edit the first post to reflect updates or just keep adding posts until a final version is completed and then change the first post.

[size=150]Now working:[/size]

  1. LEDs for Play/Pause (channel 1 & 2)
  2. LEDs for Sync (Channel 1 & 2)
  3. LEDs for Load Selected Track (Channel 1 & 2)
  4. ‘Panel’ Now switches ‘big library view’ on and off, With LED
  5. Center encoder works for scrolling through tracks

[size=150]Still Needs Work:[/size]

  1. Track Search/Scrubbing. There is two ‘Search’ buttons (Channel 1 & 2), When held down the center encoder is used to search/scrub through the track (selected by which search button is held down)
  2. Shift + Channel Gain = Channel Pitch Adjust
  3. Shift + Channel Cue = Start Track From Beginning
  4. Crossfader Curve Adjustment Knob
  5. Filter Knob (Channel 1 & 2)
  6. Reset LED state to off when loading Mixxx
  7. Reset LED state to off when closing Mixxx
  8. VU Meter LEDs (Channel 1, 2, & Master)
    [size=150]
    Unsure What to do (Open to Ideas):[/size]
  9. Touch + Center Encoder = ? (Not sure what to make this do)
  10. Shift + Play/Pause = ?
  11. Shift + Sync = ? ( Listed on AMX as Sync off, but that is handled by the sync button already)
  12. Crossfader Reverse Switch (Hamster Mode) …
    Akai-AMX-Version-0.20.zip (1.34 KB)

I am not real skilled with JavaScript at all. If someone could check my js file as see if everything looks right, that would be great. Thanks in advance

[size=150]What Works As Should:[/size]
Channel 1 & 2:

  • Play/Pause, Cue, Sync, Load Selected Track, EQ (all three), Volume/Up Faders, Channel Gain, EQ Kill (all three), Headphone Cue

Master:

  • Headphone Gain, Headphone Mix, Master Volume, Crossfader, Track Selector Knob

[size=150]Things That Work But Need to be Tested Further by Someone Else:[/size]

  • Crossfader Curve Adjustment Knob
  • VU Meters, Master and Channel

[size=150]What Needs To Be Finished:[/size]

  • On loading mixxx controller resets the LEDs of the AMX
  • On exiting mixxx controller resets the LEDs of the AMX
  • Search/Scrub through track function
  • DVS/thru switch
  • All SHIFT functions
  • Filter knobs for both channels

[size=150]Do you have any Suggestions, input, or some help? Please let me know. [/size]
Version-0.3.zip (2.02 KB)

Hello Prism,

I just wanted to drop by to say thank you!

I tested your mapping roughly on Windows 7 with 1.12.0-beta1 (build 1.12 r5481) and most of it seems to work. Only the LED were dark, but I didn’t had the time to check it in a comprehensive way.

[size=80]One thing you could add to your TODO-List: The LED states should also be updated, when the software knob is hit instead of the hardware knob. [/size]

Best regrads

[size=150]What Works As Should:[/size]
Channel 1 & 2:

  • Play/Pause, Cue, Sync, Load Selected Track, EQ (all three), Volume/Up Faders, Channel Gain, EQ Kill (all three), Headphone Cue

Master:

  • Headphone Gain, Headphone Mix, Master Volume, Crossfader, Track Selector Knob
  • VU Meters, Master and Channel
  • On loading mixxx controller resets the LEDs of the AMX
  • On exiting mixxx controller resets the LEDs of the AMX

[size=150]What Needs To Be Finished:[/size]

  • Search/Scrub through track function
  • DVS/thru switch
  • All SHIFT functions
  • Filter knobs for both channels

Thanks to Be for help on the JavaScript

[size=150]Do you have any Suggestions, input, or some help? Please let me know. [/size]
Akai-AMX-Mapping-Version-0.4.zip (2.29 KB)

Firstly, thanx for great work till now. I just got this controler, and with your script all works as expected.

Do you have any progress on finishing remaining stuff?

As im pretty new to mappings, i’m farely proficient in JS so if i get some time i will try to finish remaining stuff.

FYI: I’m using latest git master build from couple of days ago on Linux, and all is ok :slight_smile:

deresh, it would be great if you could finish this mapping and submit it for inclusion in Mixxx. For someone proficient in JS, mapping this controller should be easy. See the Controller Mapping Documentation.

Well, il try as soon as a get some free time. It shouldn’t be to hard, and i have a good base point.

Will spend some time studying mapping documentation, as i dont have any experience with that.

Will get back as soon as i’ll have some work to show :slight_smile:

Just an short update:

i have added support for Filter knobs and started working on “shift support”. As soon as i cleanup the code, will attach new files to the thread.

When shift button is implemented, the only thing that remains is finetuning and maybe some LED updates (when using Serato DJ, Play and CUE leds are blinking when used)

As explained on the Contributing Mappings page, map the play and cue LEDs to play_indicator and cue_indicator to match what is on screen. These behave differently depending on the cue mode selected by the user in the preferences.

I am glad that someone is able to pick up where i left off. I have been on the road the last month. Looking forward to seeing the end result.

Hi guys,

another short update, almost all stuff is done. I’m trying to match functionalities to that of original SeratoDJ mappings.

As i’m using AutoDJ alot, i plan to map it’s functions to the following keys:
button knob touch -> toggle autoDJ
shift + load1 -> load currently selected track to autoDJ playlist (top)
shift + load2 -> load currently selected track to autoDJ playlist (bottom)

New additions:

  • play and cue indicator leds are mapped now
  • browse button now behaves exactly as in Serato: clicking button switches between browsing library or currently selected tracks
  • shift + browse button click -> expands currently selected item in library
  • filter knobs are working now

TODO:
search buttons + browse knob -> searching through loaded track
gain buttons + shift -> pitch adjusting (instead of gain)
filter knobs + shift -> beatloop roll

Please try this new mapping and report if there is any problems.
Akai-AMX-mapping-v0.5.7z (2.43 KB)

Well i just posted a new update. You could try it and give me a feedback if it’s working ok for you.

It’s great to see someone pick this back up :slight_smile: It would be good if you started a wiki page and put it in the Mappings In Development table as described on the Contributing Mappings wiki page.

Cool, those are nice little additions.

It would be good to address a shortcoming of the Serato mapping by having ways of doing both coarse and fine seeking. Perhaps search + browse encoder could do fine seeking and shift + search + browse encoder could do coarse seeking.

Please post mappings in zip archives, as a link to raw files on GitHub, or attach both the XML & JS files to the post. Every OS that Mixxx runs on has built-in support for unzipping archives but 7-Zip is less common (also there’s no reason to put a tar archive inside a 7-Zip archive).

i have started the wiki page http://mixxx.org/wiki/doku.php/akai_amx

That is a realy good suggestion, i will try to do that, it already crossed my mind :slight_smile:

As for 7z, i’m sorry, update will use plain zip file.

Also my plan is when im feature complete to do a proper pull request on github for inclusion in Mixxx.

br

Another idea for seeking to play with would be using beatjumping when quantize is enabled. Is the browse encoder smooth or stepped? That might be a bit awkward with a smooth encoder.

It’s stepped.

That’s a realy good idea.

I’m a bit busy next couple of days, but as soon as i get some free time, i will try to finish mappings, and cleanup js file a bit.

Any progress on this? It would be great to get it finished for the upcoming Mixxx 2.0 release.

Sorry not yet. Been realy busy last few weeks. I have some spare time in next few day, so i hope to finish most of the planned features.

What is the timeline for 2.0 release?

Trying to get all changes in by Monday December 21, leave a day or two for making sure nothing is seriously broken, then release a few days later. If you can get the mapping completed this weekend that would be awesome. If not, it can wait for 2.1 (which won’t take nearly as long as the time between 1.11 and 2.0).