Denon MC7000 Mapping

XML preset files and script files (.js) for MIDI and other controllers.

Moderators: garth, User Customization Moderators

Denon MC7000 Mapping

Postby OsZ » Tue Dec 17, 2019 7:53 pm

Hello guys,
finally I have decided to go the bumpy road and get that Denon MC7000 controller running with MIXXX on Linux.

I don't attach the mappings here anymore but moved it to GitHub. Please see the WIKI for download of the latest version.
https://www.mixxx.org/wiki/doku.php/denon_mc7000#mapping


Edit: This is no longer valid:
Warning for all Linux Users who find this thread - don't be too enthusiastic. You need to build your own kernel in order to get sound out of the controller.

I used the git method described here:
https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel

The change you have to apply is documented here:
https://alsa-user.narkive.com/2tDAO87f/ ... ice#post11

instead the Linux Kernel is patched supporting the USB audio device. See details in this post:
https://www.mixxx.org/forums/viewtopic.php?f=7&t=13126&p=43959#p43959

As Denon does not provide any MIDI Documentation this is what I did as first. Please find attached a zipped .ods document. A lot of trials but the MC8000 MIDI specs were helpful alreday.

I started to create .xml and .js file so a very basic functionality is done. I continue with that and will come back with questions as I already found some hurdles that I cannot solve myself. I trust on your help for getting this task done with me.

have a few great days...
Cheers! OsZ
Attachments
Denon MC7000 - MIDI Spec.ods.zip
(348.62 KiB) Downloaded 208 times
Last edited by OsZ on Sat Mar 14, 2020 9:54 am, edited 14 times in total.
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Re: Denon MC7000 Mapping

Postby OsZ » Fri Dec 20, 2019 9:43 am

Hi again - here I upload the first drafts of a very basic MC7000 mapping.
There are many things to do yet but I would like to already ask a few questions here.

1) How to get the current status of the controller submitted to MIXXX? The GUI always starts all knobs and faders at Zero Position, even though the controller is somewhere else.
EDIT: This is not so important as the "Soft-takeover" option prevents the worst but would still be nice to understand how to send current status to MIXXX

2) Denon typically increases the tempo by moving the Pitch Fader down. While doing so the sliders in the software are moving up. I tried to reverse in the script line 38 without any effect.

3) The Jog wheels are working but sensitivity need tuning still. The issue is - I couldn't get the Vinyl Button mapped in order to activate or deactivate the wheel touch. Knowing that in MC7000.wheelTouch function still a dependency to the knob is missing but first of all I would like to see the knobs working which they don't. Even with < this.isVinylMode = true; > the LEDs should light up but they only do for Deck 2 and 3 - not for Deck 1 and 4. See lines 40 - 48 in the script.

Enough for the first place.
Thanks a lot for your attention and help.
OsZ
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Re: Denon MC7000 Mapping

Postby OsZ » Sun Dec 22, 2019 8:11 pm

Hey there - I almost finished a version which now can be tested with the MC7000 controller for MIXXX 2.2.x.
Most important functions are working incl LED's for buttons, Deck level meter, Platter Ring LED's.

What is not working yet and where I need your support and guidance:

1) How to get the current status of the controller submitted to MIXXX? "Soft-takeover" option prevents the worst but is not ideal for initializing
------working now
2) Orientation of Channel to Crossfader
------finished mapping

3) Pitch Fader orientation (when reversing in the GUI still the GUI faders move up when hardware faders move down)
------now correct orientation is set using script instead of xml
4) Pitch Fader Range not mapped yet, uses the GUI setting
------range set now to 4%, 6%, 10%, 16% customizable
5) Vinyl Button not mapped
------done, mapped to toggle platter surface in- / active
------when active the Jog LEDs are spinny, else they show track position
6) "STOP TIME" not mapped. Does waveform zoom make sense or engine.softStop?
------backspin mapped on "CENSOR" button
------"STOP TIME" regulates how quickly the backspin comes to stop
7) FX Beats and TAP not mapped
------is mapped now:
------"Beats" rotary to adjust Dry/Wet relation
------"TAP" to toggle FX on Master
------"SHIFT"+"TAP" to toggle FX on Headphone

8) Needle Search not mapped
------LSB + MSB signal mapped
------ hold shift to search through a playing track
9) Program 1/2 not mapped (easy to fix - I just didn't see a valuable function yet)
------is mapped to jump 8 beats back and forth
------hold "Shift" to jump 32 beats[/i]
10) Pads "hard" mapped to HotCue but the whole Cue/Roll/Slicer/Sampler section needs some thoughts
11) Key select is mapped but needs a few ticks until the key actually changes
------this is solved now using script


Library:
"Back" switches panels
Push "Select/Load" knob loads into deck (see below)
"L.Prep" loads track into Preview deck (hold shift and press "L.Prep" to start the track)
"Files" maximizes the Library

As there are no Load buttons for the single Decks I have mapped it as following:
Deck 1 / 3: choose either deck and push the left hand side "Select/Load" knob to load
Deck 2 / 4: choose either deck and push the right hand side "Select/Load" knob to load

Future Functions: The section to sort by BPM, Key, Title, Artist will be mapped at MIXXX 2.3 beta release

Thanks a lot for hints or concrete help to fix the remaining open points.

Cheers!
OsZ
Last edited by OsZ on Thu Jan 30, 2020 9:06 am, edited 6 times in total.
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Re: Denon MC7000 Mapping

Postby Be. » Sun Dec 29, 2019 1:17 am

OsZ wrote:1) How to get the current status of the controller submitted to MIXXX? "Soft-takeover" option prevents the worst but is not ideal for initializing


You can find the MIDI message you need to send to the controller for this by intercepting the MIDI messages Serato sends on Windows or macOS. The wiki lists some tools that can help with that.

2) Orientation of Channel to Crossfader


[ChannelX], orientation Control. As documented on the wiki, 0=left, 1=center (unassigned), 2=right

3) Pitch Fader orientation (when reversing in the GUI still the GUI faders move up when hardware faders move down)


If you're using XML, use the <Invert/> option. In JS just multiply the value by -1.

6) "STOP TIME" not mapped. Does waveform zoom make sense or engine.softStop?


You could use this knob for the "factor" parameter for engine.brake... although I don't know if that's really useful.

7) FX Beats and TAP not mapped


Use the Components EffectUnit.

11) Key select is mapped but needs a few ticks until the key actually changes


Map this to [ChannelX], pitch_adjust (not pitch) and change it by +1/-1 depending on which direction the encoder is turned.
Mixxx is free because it's yours!

I heard FLAC and I haven't gone back.
Protect your hearing with earplugs!

Hear my mixes
User avatar
Be.
Mixxx Developer
 
Posts: 2573
Joined: Tue Jan 06, 2015 1:00 am
Location: Chicago, USA

Re: Denon MC7000 Mapping

Postby OsZ » Sun Dec 29, 2019 12:10 pm

Thank you very much Be by checking. Let's go topic by topic as I don't get it.

1) I need to find one who has got Win or Mac running with Serato then. Do you think that Serato runs under Linux using WINE ? Well must not run smoothly - only start to get the MIDI commands...

2) about the Channel assignment. I found the "orientation" command before but did not get it to work - tried with JS instead but still no luck. Just for the first channel here my example:

On first channel I use: 0x90

Then the second byte would always be: 0x1E

and the third byte:
0x00 for center position
0x01 for left position
0x02 for right position

The signals can be only distinguished using the channel number and 3rd byte value.

That's how I assigned it in xml file now:
Code: Select all
           <control>
                <group>[Channel1]</group>
                <key>MC7000.crossfaderAssignCenter</key>
                <description>Ch1 THRU</description>
                <status>0x90</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>MC7000.crossfaderAssignLeft</key>
                <description>Ch1 on DeckA</description>
                <status>0x90</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>
            <control>
                <group>[Channel1]</group>
                <key>MC7000.crossfaderAssignRight</key>
                <description>Ch1 on DeckB</description>
                <status>0x90</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>


and the corresponding script lines:
Code: Select all
/* Assign Channel to Crossfader */
// Center (THRU)
MC7000.crossfaderAssignCenter = function(channel, control, value, status, group) {
    var deckNumber = script.deckFromGroup(group);
   if (value = 0) {
        engine.setValue(deckNumber, "orientation", 1);
    }
};
// Left (A)
MC7000.crossfaderAssignLeft = function(channel, control, value, status, group) {
    var deckNumber = script.deckFromGroup(group);
   if (value = 1) {
        engine.setValue(deckNumber, "orientation", 0);
    }
};
// Right (B)
MC7000.crossfaderAssignRight = function(channel, control, value, status, group) {
    var deckNumber = script.deckFromGroup(group);
   if (value = 2) {
        engine.setValue(deckNumber, "orientation", 2);
    }
};


I always get an error that the value returns 0 for the channel - this example for channel 3

Code: Select all
Warning [Controller]: ControlDoublePrivate::getControl returning NULL for ( "3" , "orientation" )


Thanks a lot for any suggestion to get that working.
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Re: Denon MC7000 Mapping

Postby Be. » Sun Dec 29, 2019 3:53 pm

First, I do not understand why you have 3 XML mappings and 3 JS functions for one function. Maybe by chance this could work, but it's strange and makes the code confusing.


script.deckFromGroup returns a number, then you are passing that to engine.setValue as the first parameter, but that expects a string like "[Channel1]".
Mixxx is free because it's yours!

I heard FLAC and I haven't gone back.
Protect your hearing with earplugs!

Hear my mixes
User avatar
Be.
Mixxx Developer
 
Posts: 2573
Joined: Tue Jan 06, 2015 1:00 am
Location: Chicago, USA

Re: Denon MC7000 Mapping

Postby OsZ » Sun Dec 29, 2019 5:24 pm

OK - to have it 3 times on the xml is strange indeed.
Then the xml file must link to a script function in 4 <control> blocks mentioning the 4 channels but the midi signal is always the same.

Code: Select all
<control>
                <group>[Channel1]</group>
                <key>MC7000.crossfaderAssign</key>
                <description>Ch1 THRU</description>
                <status>0x90</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>
            <control>
                <group>[Channel2]</group>
                <key>MC7000.crossfaderAssign</key>
                <description>Ch2 THRU</description>
                <status>0x91</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>
            <control>
                <group>[Channel3]</group>
                <key>MC7000.crossfaderAssign</key>
                <description>Ch3 THRU</description>
                <status>0x92</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>
            <control>
                <group>[Channel4]</group>
                <key>MC7000.crossfaderAssign</key>
                <description>Ch4 THRU</description>
                <status>0x93</status>
                <midino>0x1E</midino>
                <options>
                    <script-binding/>
                </options>
            </control>



But how would the Midi Script look like then to get the position of the switch?
here what doe not work either:

Code: Select all
MC7000.crossfaderAssign = function(channel, control, value, status, group) {
        var deckNumber = script.deckFromGroup(group);
       if (value = 0) {
            engine.setValue(deckNumber, "orientation", 1);
        }
   
       else if (value = 1) {
            engine.setValue(deckNumber, "orientation", 0);
        }

       else if (value = 2) {
            engine.setValue(deckNumber, "orientation", 2);
        }
    };


Thank you
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Re: Denon MC7000 Mapping

Postby Be. » Sun Dec 29, 2019 7:41 pm

Do not use script.deckFromGroup for this. Just use group for the first parameter to engine.setValue
Mixxx is free because it's yours!

I heard FLAC and I haven't gone back.
Protect your hearing with earplugs!

Hear my mixes
User avatar
Be.
Mixxx Developer
 
Posts: 2573
Joined: Tue Jan 06, 2015 1:00 am
Location: Chicago, USA

Re: Denon MC7000 Mapping

Postby OsZ » Sun Dec 29, 2019 7:54 pm

Just tried but that does not assign anything. No warning or error messages though.
The console output while moving the switch on the controller for Channel 1 and 3 is following:

Code: Select all
Debug [Controller]: DENON DJ MC7000 MIDI 1: t:10344 ms status 0x90 (ch 1, opcode 0x9), ctrl 0x1E, val 0x00
Debug [Controller]: DENON DJ MC7000 MIDI 1: t:10563 ms status 0x90 (ch 1, opcode 0x9), ctrl 0x1E, val 0x01
Debug [Controller]: DENON DJ MC7000 MIDI 1: t:10929 ms status 0x90 (ch 1, opcode 0x9), ctrl 0x1E, val 0x00
Debug [Controller]: DENON DJ MC7000 MIDI 1: t:13533 ms status 0x92 (ch 3, opcode 0x9), ctrl 0x1E, val 0x02
Debug [Controller]: DENON DJ MC7000 MIDI 1: t:13825 ms status 0x92 (ch 3, opcode 0x9), ctrl 0x1E, val 0x00
Debug [Controller]: DENON DJ MC7000 MIDI 1: t:13843 ms status 0x92 (ch 3, opcode 0x9), ctrl 0x1E, val 0x01


Any other idea ?
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Re: Denon MC7000 Mapping

Postby OsZ » Mon Dec 30, 2019 9:16 am

Good Morning -
I got that channel assign to work by changing the "=" to "===". Yes - as newbee - I learned the difference it makes.

So what works now is:
Code: Select all
    // Assign Channel to Crossfader
    MC7000.crossfaderAssign = function(channel, control, value, status, group) {
       if (value === 0x00) {
            engine.setValue(group, "orientation", 1);
        }
   
       else if (value === 0x01) {
            engine.setValue(group, "orientation", 0);
        }

       else if (value === 0x02) {
            engine.setValue(group, "orientation", 2);
        }
    };
Last edited by OsZ on Thu Jan 02, 2020 7:52 am, edited 2 times in total.
OsZ
 
Posts: 68
Joined: Sun Mar 11, 2018 4:19 pm

Next

Return to Controller presets/mappings

Who is online

Users browsing this forum: No registered users and 13 guests