header

header

Sunday, 4 January 2015

Make your own Traktor DJ Cable for iPad / iOS


Native Instruments Traktor for iOS retails for $4.99 right now with the 50% post xmas sale discount, that's well below the ~$150 AUD they're asking for Traktor PRO2. Given its touch controls, it's a pretty sweet dirt cheap option for a self contained DJ setup on your iPad.

With only stereo output from the 3.5mm jack, NI has conveniently created a small range of tailored peripherals to work around the audio I/O limitations of the iPad/iPhone.

The cheapest of these is the Traktor DJ Cable - a simple 3.5mm splitter cable to allow cueing.

What happens inside the ~$20 cable is that each stereo channel is split to their own female 3.5mm socket - making them both dual mono output. Within the software, the main mix out is fed independently to only one stereo channel of the analogue output, with the other stereo channel receiving the cue channel.

You may be questioning the sound quality of playing stereo mixed tracks in dual mono. Most club PA systems are not arranged as L & R stereo pairs, the mix is summed to mono and sent to both speakers. When you move around the club the stereo mix appears balanced because you are receiving the same signal from both speakers. So in this environment it makes sense to have your cue track in mono as it is actually closer to what you're going to have playing through the PA.

The other hardware options NI provides are the Audio2 and the Z1, essentially giving some OOTB audio processing and some tactile buttons/knobs.

If you find the ~$150 and ~$300 pricetags on the above options pretty redundant for a low cost dj'ing rig, you'll probably feel the same way about their $20 dual mono splitter cable.

If you're concerned about missing out on tactile controls there's nothing stopping you running both the cue and the master out from your split signal into two channels on the club's DJ mixer to mix as you normally would by the using its eq, faders and effects which are definitely much more fluid and comfortable than the touch based controls in the iOS port.


What you'll need:

- 3.5mm Stereo Headphone splitter cable
  Preferably with a hollow plastic section housing the two 3.5mm sockets.

- Traktor for iOS

- 2x 3.5mm to stereo RCA cables

- Headphones

+heatshrink, solder, soldering iron.



  
Get a headphone splitter, I got mine from Daiso for $2.80. Unscrew the back and open it up.



Inside, the headphone wires are fed to both sockets. Each socket will have the Left, Right and Ground wired to all three pins. You want to change this so that one socket has both the Left wires soldered to the top two pins, and the other has the Right wires soldered to its top two pins. You don't need to change the ground pins.


Now the left socket (pictured) has both red wires soldered to the top two pins and the right has both blue wires soldered to its top two pins.

Close it up and plug your headphones into one side and speakers on the other.


Open TraktorDJ, tap the speaker icon. The "Split Output" slider should now be available. Slide it to enable split output. You can now adjust cue mix and cue volume controls.


The headphone icon is now available on your tracks. Select this to route the track to your cue channel on your DJ splitter cable.


You now have two discrete audio channels to work with from your iOS device. By adjusting the crossfader control within TraktorDJ to route only your track without the headphone icon selected to the master output [See image above] you can plug two 3.5mm stereo to RCA cables from your DJ splitter cable to two channels of the clubs mixer. Then you can cue, EQ and mix using tactile controls. All for under $10.


Follow lysdexic:

Monday, 7 July 2014

Ninbento - NES MIDI Controller Mod for Circuit Bent

I found a box on the shelf that contained an Arduino Duemilanove, a skinned and cut Korg Nanokontrol pcb, a gutted NES with two original controllers and the controller sockets still intact on the box.

It all belongs to one of the guys from Circuit Bent an aussie electronic music duo based here in Melbourne. They wanted to use the enclosure from the NES as a MIDI controller on stage, i've fallen deeper and deeper into the rabbit holes of Arduino and MaxMSP over the last 6 months - looking at the box I realised it'd be dead simple to wire the controller sockets into the Arduino board so they could plug in the unmodified controllers and use them as assignable MIDI controllers. There's plenty of space in the enclosure to house both the Arduino board and the Korg Nanokontrol pcb, with some neat dremel cuts and two female USB ports installed on the side for each it would be a pretty sweet little unit.



I checked a pinout diagram for the NES online, pretty straightforward:



The board and jumper block would have been convienient for connecting straight to the arduino. Unfortunately it was messing with the bitstream, throwing off all of the sketches I uploaded.

The state of the controller is fed out in the following order: A button, B button, select, start, up, down, left, right - fed sequentially into a stream of 8 bits. This gets polled by the sketch at a constant interval then interpreted as discrete button presses. Thinking it was a discrepancy with timing I adjusted the polling interval to match that of the original NES, but serial data still didn't match the button presses.

I'm assuming it's something to do with the resistors but it wasn't enough of a concern to warrant troubleshooting it.


I removed the pcb and soldered new leads, bits now being sent/received correctly.


Converted the bitstream to serial strings, then to MIDI messages. Successfully received in Ableton in a draft custom Max For Live object with single controller input.

Many example sketches for NES controller input use the NESpad library, though this and almost every other approach I took wouldn't support 2 controllers natively. I found a fork of this library called snespadplus built intentionally to address this issue - allowing two controllers to be read at the same time without having to poll them individually or create multiple instances of the NESpad/SNESpad object.

I had to mod the SNESPadPlus library to make it work with the NES bit ordering. The SNES recieves bits in the following order: B, Y, SELECT, START, U, D, L, R, A, X, L, R


TBC


Clock and latch pins are shared between controllers with only the datalines taking separate inputs on the arduino. I made up a protoshield for the project and connected it up.


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