header

header

Tuesday, 1 July 2014

$15 USB Midi Controller hacking [Livingstone MID-100 // Silvercrest SDJ-100 A1]

Picked up a Livingstone MID-100 from a Pawn Shop today for 15 bucks. These were originally sold at Aldi stores for a short period last year for about $60 here in Australia and seem to be a rebranding of the Silvercrest SDJ-100 A1 sold in Europe and bundled with some DJ Software premapped to it.




The build quality is what you'd expect from the pricetag, being about as robust as a DJ Hero 2 controller but with more functionality. With two jogwheels, a crossfader, 14 rotaries, 16 backlit buttons and MIDI over USB already functioning out of the box it presents an interesting hacking project for controllerism and hardware modding.

As you'd expect, this unit is intended to be used with included software. I assumed there were going to be issues using it in recognizing it as a MIDI device outside of Cross DJ, but OSX picked it up as a MIDI device:



I opened Max6 and set up a patch to check what MIDI messages were being sent and to see whether the jogwheels, rotaries and buttons had dedicated assignments. Only the jogwheels were sending values on 24 & 25 and MIDI notes C#6 & C6 respectively.



Instead of the jogwheels sending the full range from 0-127 they only send a 1 value with a forward (clockwise) movement of the jogwheel and a 127 value when moved in reverse/anticlockwise. Going by Precision Audio's amusing Product Demonstration, the controller can actually scrub through tracks using these wheels similar to Traktor - I guess it moves the playhead forward and backward incrementally whenever it receives these values on their respective controller numbers. 

The video also mentions a "break" function on the jogwheels which pauses the playing track on each channel by pushing in the jogwheel and releasing it to resume playback. This explains the noteon and noteoff messages on C6 & C#6.

None of the other buttons and rotaries were sending messages. I assumed that the bundled DJ software sends a proprietary message to the controller when it boots for it to load its functions. Neither the software or the registration key were included with the one I picked up so I grabbed a copy of the demo here.


I used MIDI Monitor to check what messages were being sent to and/or from the controller when Cross DJ boots. It does indeed send a list of noteoff messages which then trigger a list of control values to be sent back (perhaps polled by the software.)



After this the controller sends MIDI from all of the buttons and rotaries even with Cross DJ closed.

The full dump of the activation string is below:

22:53:13.979    To GW MID-100    Note Off    1    D#2    0
22:53:13.979    To GW MID-100    Note Off    1    B2    0
22:53:13.979    To GW MID-100    Note Off    1    C3    0
22:53:13.979    To GW MID-100    Note Off    1    E3    0
22:53:13.979    To GW MID-100    Note Off    1    F#3    0
22:53:13.979    To GW MID-100    Note Off    1    B3    0
22:53:13.979    To GW MID-100    Note Off    1    D4    0
22:53:13.979    To GW MID-100    Note Off    1    E4    0
22:53:13.979    To GW MID-100    Note Off    1    A#4    0
22:53:13.979    To GW MID-100    Note Off    1    B4    0
22:53:13.979    To GW MID-100    Note Off    1    C5    0
22:53:13.979    To GW MID-100    Note Off    1    C#5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    F#5    0
22:53:13.979    To GW MID-100    Note Off    1    G5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D4    0
22:53:13.979    To GW MID-100    Note Off    1    A#4    0
22:53:13.979    To GW MID-100    Note Off    1    B4    0
22:53:13.979    To GW MID-100    Note Off    1    D#2    0
22:53:13.979    To GW MID-100    Note On    1    F#5    127
22:53:13.979    To GW MID-100    Note Off    1    B2    0
22:53:13.979    To GW MID-100    Note Off    1    E3    0
22:53:13.979    To GW MID-100    Note Off    1    E4    0
22:53:13.979    To GW MID-100    Note Off    1    C5    0
22:53:13.979    To GW MID-100    Note Off    1    C#5    0
22:53:13.979    To GW MID-100    Note Off    1    C3    0
22:53:13.979    To GW MID-100    Note On    1    G5    127
22:53:13.979    To GW MID-100    Note Off    1    F#3    0
22:53:13.979    To GW MID-100    Note Off    1    B3    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:13.979    To GW MID-100    Note Off    1    D5    0
22:53:13.979    To GW MID-100    Note Off    1    D#5    0
22:53:14.160    From GW MID-100    Control    1    General Purpose 1 (coarse)    63
22:53:14.160    From GW MID-100    Control    1    Effect Control 1 (coarse)    127
22:53:14.161    From GW MID-100    Control    1    Effect Control 2 (coarse)    62
22:53:14.161    From GW MID-100    Control    1    Expression (coarse)    120
22:53:14.161    From GW MID-100    Control    1    Controller 9    65
22:53:14.162    From GW MID-100    Control    1    Pan (coarse)    68
22:53:14.163    From GW MID-100    Control    1    General Purpose 2 (coarse)    60
22:53:14.163    From GW MID-100    Control    1    General Purpose 4 (coarse)    61
22:53:14.163    From GW MID-100    Control    1    Controller 15    71
22:53:14.164    From GW MID-100    Control    1    Balance (coarse)    56
22:53:14.164    From GW MID-100    Control    1    General Purpose 3 (coarse)    55
22:53:14.165    From GW MID-100    Control    1    Controller 20    85
22:53:14.165    From GW MID-100    Control    1    General Purpose 1 (coarse)    63
22:53:14.166    From GW MID-100    Control    1    Effect Control 1 (coarse)    127
22:53:14.166    From GW MID-100    Control    1    Effect Control 2 (coarse)    62
22:53:14.166    From GW MID-100    Control    1    Expression (coarse)    120
22:53:14.167    From GW MID-100    Control    1    Controller 9    65
22:53:14.168    From GW MID-100    Control    1    Pan (coarse)    68
22:53:14.168    From GW MID-100    Control    1    General Purpose 2 (coarse)    60
22:53:14.168    From GW MID-100    Control    1    General Purpose 4 (coarse)    61
22:53:14.169    From GW MID-100    Control    1    Controller 15    71
22:53:14.169    From GW MID-100    Control    1    Balance (coarse)    56
22:53:14.169    From GW MID-100    Control    1    General Purpose 3 (coarse)    55
22:53:14.170    From GW MID-100    Control    1    Controller 20    85
22:53:14.170    From GW MID-100    Control    1    General Purpose 1 (coarse)    63
22:53:14.171    From GW MID-100    Control    1    Effect Control 1 (coarse)    127
22:53:14.171    From GW MID-100    Control    1    Effect Control 2 (coarse)    62
22:53:14.171    From GW MID-100    Control    1    Expression (coarse)    120
22:53:14.172    From GW MID-100    Control    1    Controller 9    65
22:53:14.310    To GW MID-100    Note Off    1    D#5    0
22:53:14.310    To GW MID-100    Note Off    1    D#5    0
22:53:14.310    To GW MID-100    Note Off    1    D5    0
22:53:14.310    To GW MID-100    Note Off    1    D5    0
22:53:14.310    To GW MID-100    Note Off    1    D#5    0
22:53:14.310    To GW MID-100    Note Off    1    D5    0
22:53:14.310    To GW MID-100    Note Off    1    D#5    0

Converted these messages to a txt file and loaded it into a coll. A dump message sends this activation string to the controller.


1, 51 0;
2, 59 0;
3, 60 0;
4, 64 0;
5, 66 0;
6, 71 0;
7, 74 0;
8, 76 0;
9, 82 0;
10, 83 0;
11, 84 0;
12, 85 0;
13, 86 0;
14, 87 0;
15, 90 0;
16, 91 0;
17, 86 0;
18, 86 0;
19, 87 0;
20, 87 0;
21, 86 0;
22, 87 0;
23, 74 0;
24, 82 0;
25, 83 0;
26, 51 0;
27, 90 127;
28, 59 0;
29, 64 0;
30, 76 0;
31, 84 0;
32, 85 0;
33, 60 0;
34, 91 127;
35, 66 0;
36, 71 0;
37, 86 0;
38, 86 0;
39, 87 0;
40, 87 0;
41, 86 0;
42, 86 0;
42, 87 0;
43, 87 0;
44, 86 0;
45, 87 0;
47, 87 0;
48, 87 0;
49, 86 0;
50, 86 0;
51, 87 0;
52, 86 0;
53, 87 0;



Draft map of the native MIDI assignments of the controller:
 




 Dump of the De-activation string that is sent when Cross DJ closes:

01:26:34.432    To GW MID-100    Note Off    1    D4    0
01:26:34.432    To GW MID-100    Note Off    1    A#4    0
01:26:34.432    To GW MID-100    Note Off    1    B4    0
01:26:34.432    To GW MID-100    Note Off    1    D#2    0
01:26:34.432    To GW MID-100    Note Off    1    F#5    0
01:26:34.432    To GW MID-100    Note Off    1    B2    0
01:26:34.432    To GW MID-100    Note Off    1    E3    0
01:26:34.432    To GW MID-100    Note Off    1    E4    0
01:26:34.432    To GW MID-100    Note Off    1    C5    0
01:26:34.432    To GW MID-100    Note Off    1    C#5    0
01:26:34.432    To GW MID-100    Note Off    1    C3    0
01:26:34.432    To GW MID-100    Note Off    1    G5    0
01:26:34.432    To GW MID-100    Note Off    1    F#3    0
01:26:34.432    To GW MID-100    Note Off    1    B3    0
01:26:34.432    To GW MID-100    Note Off    1    D#2    0
01:26:34.432    To GW MID-100    Note Off    1    B2    0
01:26:34.432    To GW MID-100    Note Off    1    C3    0
01:26:34.432    To GW MID-100    Note Off    1    E3    0
01:26:34.432    To GW MID-100    Note Off    1    F#3    0
01:26:34.432    To GW MID-100    Note Off    1    B3    0
01:26:34.432    To GW MID-100    Note Off    1    D4    0
01:26:34.432    To GW MID-100    Note Off    1    E4    0
01:26:34.432    To GW MID-100    Note Off    1    A#4    0
01:26:34.432    To GW MID-100    Note Off    1    B4    0
01:26:34.432    To GW MID-100    Note Off    1    C5    0
01:26:34.432    To GW MID-100    Note Off    1    C#5    0
01:26:34.432    To GW MID-100    Note Off    1    D5    0
01:26:34.432    To GW MID-100    Note Off    1    D#5    0
01:26:34.432    To GW MID-100    Note Off    1    F#5    0
01:26:34.432    To GW MID-100    Note Off    1    G5    0
01:26:34.437    From GW MID-100    Control    1    Expression (coarse)    68
01:26:34.438    From GW MID-100    Control    1    Controller 9    107
01:26:34.438    From GW MID-100    Control    1    Pan (coarse)    86
01:26:34.439    From GW MID-100    Control    1    General Purpose 2 (coarse)    63
01:26:34.439    From GW MID-100    Control    1    General Purpose 4 (coarse)    119
01:26:34.439    From GW MID-100    Control    1    Controller 15    65
01:26:34.440    From GW MID-100    Control    1    Balance (coarse)    42
01:26:34.440    From GW MID-100    Control    1    General Purpose 3 (coarse)    68
01:26:34.440    From GW MID-100    Control    1    Controller 20    115
01:26:34.441    From GW MID-100    Control    1    General Purpose 1 (coarse)    53
01:26:34.441    From GW MID-100    Control    1    Effect Control 1 (coarse)    65
01:26:34.442    From GW MID-100    Control    1    Effect Control 2 (coarse)    63
01:26:34.442    From GW MID-100    Control    1    Expression (coarse)    68
01:26:34.443    From GW MID-100    Control    1    Controller 9    107
01:26:34.443    From GW MID-100    Control    1    Pan (coarse)    86
01:26:34.444    From GW MID-100    Control    1    General Purpose 2 (coarse)    63
01:26:34.444    From GW MID-100    Control    1    General Purpose 4 (coarse)    119
01:26:34.444    From GW MID-100    Control    1    Controller 15    65
01:26:34.444    From GW MID-100    Control    1    Balance (coarse)    42
01:26:34.445    From GW MID-100    Control    1    General Purpose 3 (coarse)    68
01:26:34.445    From GW MID-100    Control    1    Controller 20    115
01:26:34.445    From GW MID-100    Control    1    General Purpose 1 (coarse)    53
01:26:34.445    From GW MID-100    Control    1    Effect Control 1 (coarse)    65





Next, 

MIDI Map of backlit buttons
Max >> Controller activation string
Waveform Scratch in Max



TBC

3 comments:

  1. According to MIXXX forum, sending any MIDI output to it will initialize the controls and make them operational, it doesn't have to be the particular Mixvibes sequence. The Mixvibes initialization and shutdown sequences are presumably a side effect of it lighting up and then turning off the button LEDs, because Mixvibes is not actually MIDI scriptable, it uses a simple I/O mapping system with modifiers.

    To discover how to light up particular buttons, you have two options. One option is to use Mixvibes (bundled, or time-limited Demo but not Free version) and export the MIDI mapping as XML from it, it will contain the output mapping too and isn't too hard to read. Other option is to examine the user-created MIDI script for MIXXX that's on the forums.

    ReplyDelete
    Replies
    1. I also think i know why they did this. It allows the controller to burst the inputs into the software, so that the rotary and fader positions in the software match the hardware upon software startup.

      Delete
  2. hello,
    I know the post is old.
    I have silvercrest sdj 100 a1 since 2 week ago and i am on linux mint.
    I have try to connect the controller with your explication, by sending midi note off signals in mixxx output signal.
    But it's not working the faders and buttons don't send midi signal
    how do your manipulation on mixxx could you explain me please.

    ReplyDelete