Traktor track name / time to LCD via MIDI! ...using Denon LCD support & Arduino
Page 1 of 7 12345 ... LastLast
Results 1 to 10 of 69
  1. #1
    Tech Wizard Siytek's Avatar
    Join Date
    Apr 2011
    Location
    UK
    Posts
    36

    Default Traktor track name / time to LCD via MIDI! ...using Denon LCD support & Arduino

    Hi All

    This has already been discussed in another thread however it was decided that it was probably a good idea to put the info in a new thread.

    Firstly.... here it is in action!

    http://www.youtube.com/watch?v=9gQBgCKsGgc

    Here is the info I posted about how its done...

    By using the MIDI outputted for the Denon HC4500. When you add a HC4500 to your list of controllers, Traktor will start to output MIDI for the track name, artist and time. Its not an option you can select in the 'add out' section in Traktor, it happens in the background as soon as you add the DN4500 controller and select a MIDI OUT port. I used the Denon MIDI sheet to get the info

    Here is the sheet I used, Denon MIDI (page 7) : HC4500 MIDI Command List

    As only 7 bits of the MIDI data messages are available (the first bit is used to identify the message type) and the LCD needs 8 bits of data to display a character, each character needs to be transmitted in two control change messages. The first bit is used to idenfify the message, nothing to do with LCD but will be used in your code by the MIDI IN routine. The next three bits are discarded, and the final 4 bits are used for the data. The first control change message contains the first 4 bits of the 8-bit LCD character data, and the second CC message contains the second 4 bits, so....

    X000AAAA
    +
    X000BBBB
    =
    AAAABBBB

    Where X is the message identifier bit, the '0s' are discarded, A is the first CC and B is the second CC.

    Assuming you have Arduino sucessfully receiving MIDI CC, by loading two CC messages into cc_data1 and cc_data2 the following code is a simplified way of getting the MIDI messages to the LCD. The actual code uses bitwise (see arduino website) to join the two nibbles together and simplified looks like this...

    This line shifts the first 4 bits of the first message along 4 places to make
    0000AAAA into AAAA0000
    lcd_nibble1 = (cc_data1 << 4);

    This line takes the data from the second CC message and passes it to a variable for the LCD routine
    lcd_nibble2 = cc_data2;

    Now we have the following
    lcd_nibble1 = AAAA0000
    lcd_nibble2 = 0000BBBB

    Now we need to merge the two using the bitwise OR operator...
    lcd_output = lcd_nibble1 | lcd_nibble2;

    so now 'lcd_output' is AAAABBBB, a complete byte which can be passed straight to the lcd.print command using the standard Arduino LCD library...
    lcd.print(lcd_output);

    Now this code could be better as the library will break the byte up back into nibbles to pass to the LCD using the 4-bit interface (as my design uses 4-bit connection) so when I get some time, ill most likely make a few mods to the library to save some considerable processing time! However at the moment in development, this method works great and is a good way to simply use the standard Arduino LCD library in 4 or 8 bit mode.

    There is one more thing, I described how to pass the CC data to the LCD but nothing about CC numbers. The value of the CC message relates to the character but the CC number determines both the character position and identifies whether the message is the first or second nibble of data. Its all in the Denon MIDI sheet. For example....

    If you (or Traktor!) wanted to display the letter 'A' in the second (of 16) character position and on the first line you would use the following...

    The character 8-bit code (from Denon or Hitachi LCD datasheet) is 0100 for the first nibble and 0001 for the second nibble, so...

    CC message 1 = 0001 = 1 (in decimal)
    CC message 2 = 0100 = 4

    From the Denon sheet, CC number 2 (0x02 in hex) represents the first nibble for the second character on the first line of the display. CC number 34 (0x22 in hex) represents the second nibble for the second character on the first line of the display, so...

    CC#02 value 1
    CC#34 value 4

    will display the letter 'A' in the second char position on the first line. BTW Deck A will output all this info on channel 1 and Deck B will output it on channel 2... so my advice if your designing a controller with the Denon LCD system, reserve ch1 and ch2 for the LCD data!

    Here is the actual code with bits removed that dont relate to the LCD (easier to understand! ), please note the MIDI channel is currently ignored but a simple if or switch statement could be included to check the channel is correct or identify whether the data is from deck A or deck B, just havent got round to doing it yet! to use this code the receiveMIDI routine is fired whenever the serial port data is read and verified to be a recognised MIDI message. The following variables must be passed to the routine...

    statusType = type of message, CC, note on, note off etc...
    MIDIchannel = self explanatory!
    param1 = first parameter of data (for CC this would be the CC number)
    param2 = second parameter of data (for CC this would be the CC value)

    Code:
    void receiveMIDI(byte statusType, byte MIDIchannel, byte param1, byte param2){
    
      switch (statusType) {
    
        break;
        case 0xB0:
        ///// IF MESSAGE IS CONTROL CHANGE MESSAGE (0xB0) /////
    
        switch(param1){ // CHECKS CC NUMBER, MSB GETS PUT IN tn_byte1
          
         case  0x01:
               tn_byte1 = (param2 << 4);
         break;
         case  0x02:
               tn_byte1 = (param2 << 4);
         break;
         case  0x03:
               tn_byte1 = (param2 << 4);
         break;
         case  0x04:
               tn_byte1 = (param2 << 4);
         break;
         case  0x05:
               tn_byte1 = (param2 << 4);
         break;
         case  0x07:
               tn_byte1 = (param2 << 4);
         break;
         case  0x08:
               tn_byte1 = (param2 << 4);
         break;
         case  0x09:
               tn_byte1 = (param2 << 4);
         break;
         case  0x21: // BEGIN LSB, MSB IS READY IN tn_byte1
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(0 , 0 , tn_output); // FIRES LCD PRINT WITH CO-ORDS AND CHAR DATA          
         break;
         case  0x22:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(1 , 0 , tn_output);      
         break;
         case  0x23:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(2 , 0 , tn_output);
         break;
         case  0x24:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(3 , 0 , tn_output);
         break;
         case  0x25:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(4 , 0 , tn_output);
         break;
         case  0x27:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(5 , 0 , tn_output);
         break;
         case  0x28:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(6 , 0 , tn_output);
         break;
         case  0x29:
          tn_byte2 = param2;
          tn_output = tn_byte1 | tn_byte2;
          track_name(7 , 0 , tn_output);
         break;
          
        }
    
    }
    
    }
    
    void track_name(byte lcd_col, byte lcd_row, byte lcd_data){
      
          lcd.setCursor(lcd_col , lcd_row);
          lcd.print(lcd_data); 
      
      
    }
    enjoy

    Here is the post about the board itself and the spec im aiming to achieve...

    * Arduino based design using ATMega168 (or 328) with on-board MIDI I/O port
    * 48 Analogue / Digital inputs or outputs (6 ports with 8 pins, each can be either I or O) by use of on-board multiplexers
    * Built-in twin 8-LED bargraph VU meter, controlled by MIDI CC
    * 8x2 (or 16x2 if you want) LCD display
    * Menu system allows for changes without reprogramming, so Arduino is optional, the MIDI config can be changed with the LCD menu
    * Supports the display of Traktor track name, artist and time on the LCD display (Uses/hijacks the data Traktor sends out for the Denon HC4500 LCD display)

    There is no built-in FTDI chip like there is with the Arduino boards however there is a connector for an FTDI programmer, I use the Modern Device USB-BUB, http://shop.moderndevice.com/products/usb-bub, the little red board shown in my picture below

    Im keen to get some feedback about whether peeps are interested in this kind of product aimed specifically at Traktor or Ableton. This is only a prototype board meant for testing all the features, so it looks a bit of a mess! Please excuse rubbish mobile phone camera pictures too!





    Last edited by Siytek; 04-15-2011 at 02:43 PM.
    ...dreams in binary

  2. #2
    Tech Wizard Excluded's Avatar
    Join Date
    Apr 2011
    Location
    Netherlands
    Posts
    63

    Default

    sick mate wish i was technical to do this stuff aswell !

  3. #3
    Tech Mentor extraclassic's Avatar
    Join Date
    May 2010
    Location
    Sheffield - UK
    Posts
    255

    Default

    Quote Originally Posted by Excluded View Post
    sick mate wish i was technical to do this stuff aswell !
    Me too

    Siytek what's the learning curve like for programming the Arduino? For a complete noob like me that's never programmed anything in his life?

  4. #4
    DJTT Tankard fullenglishpint's Avatar
    Join Date
    Aug 2010
    Location
    St Albans, UK
    Posts
    7,097

    Default

    very cool, thanks for posting.
    TSP 2 | Serato DJ | Live 8 | MBP (SSD + HDD) | AIAIA TMA-1 Fool's Gold Edition | 1200 Mk2s | MidiFighter | KRK RP5
    Xone: DB4 | Pioneer CDJ-2000 Nexus
    DJTT FAQ | Read my guide to AUDIO CABLES

  5. #5
    DJTT Infectious Moderator photojojo's Avatar
    Join Date
    Apr 2010
    Location
    Sherman, TX
    Posts
    13,925

    Default

    Fantastic post. I'm attaching the pdf to the thread so if it goes away from the Denon site for some reason we'll still have it.
    Chris Jennings FHP

    Podcast - Soundcloud - Mixcloud - Beatport Charts - x

  6. #6
    Tech Guru MiL0's Avatar
    Join Date
    May 2009
    Location
    Brighton / Bangkok
    Posts
    1,386

    Default

    amazing work... welcome to the forum by the way!

    one thing that I've noticed is that Traktor seems to output the track name and title constantly. It also seems to scroll the text, rather than output the entire length of the track/title and let the controller do the scrolling. The disadvantage with this is that the scrolling looks a bit choppy (and will likely get worse if a lot of midi messages are being sent/received).

    I think a better method would be to write some code that extracts the whole track name and artist name and then outputs it once. Further code could then be written to let the Arduino deal with scrolling the text, the speed it scrolls or just keeping it stationary.

    I intend to do the same thing with the Autohotkey script I'm writing (for non-Arduino users).

    BTW - have you seen my VU meters thread? check my sig for details... might save you a bunch of LED outputs on the Arduino if you do it that way. You could then have the VU meters, track title, artist and time remaining all being shown on an LCD display (with a midi button to change what's being displayed?)

  7. #7
    Tech Wizard Siytek's Avatar
    Join Date
    Apr 2011
    Location
    UK
    Posts
    36

    Default

    Quote Originally Posted by extraclassic View Post
    Me too

    Siytek what's the learning curve like for programming the Arduino? For a complete noob like me that's never programmed anything in his life?
    If you have a passion for technology, an understanding of computers beyond knowing how to navigate round the operating system and dont have too much trouble with a bit of basic algebra then your probably not going to find learning Arduino too much of a problem!

    Im guessing for yourself extraclassic, the fact that your part of the djtechtools forum and seem interested in something as geeky as my Traktor LCD project would suggest to me that you have all the tools necessary to embark on the journey of learning Arduino!
    ...dreams in binary

  8. #8
    Tech Wizard
    Join Date
    Aug 2010
    Posts
    81

    Default

    While I'd never do this myself. I think its awesome to see people take the initiative to do stuff like this. Awesome ideas and implementation. Awesome just to read and see how people go about stuff even if I don't understand all of it.
    MBP & a i5-2500k/asus p8p67 pro/8gb (1600mhz)ram/ Win7 x64 - Kontrol S4 - KRK 5s

  9. #9
    Tech Wizard Siytek's Avatar
    Join Date
    Apr 2011
    Location
    UK
    Posts
    36

    Default

    Quote Originally Posted by MiL0 View Post
    amazing work... welcome to the forum by the way!
    Cheers!

    Quote Originally Posted by MiL0 View Post
    I think a better method would be to write some code that extracts the whole track name and artist name and then outputs it once. Further code could then be written to let the Arduino deal with scrolling the text, the speed it scrolls or just keeping it stationary.
    Yep totally agree about the scrolling, im giving all my attention to my live set at the mo as I have a gig in two weeks but I was going to return to the Traktor LCD code pretty soon to refine things.

    I have wondered about stopping the constant MIDI processing to keep this info on the screen, it is processor hungry for what it achieves! I figured you could identify the end of the track name or artist by the fact that there are two spaces at the end, this would allow the whole track name or artist to be loaded into the Arduino at the speed Traktor scrolls it (the info could scroll on the screen and stop, when it stopped so would reading the MIDI). The problem I think is once you have this info, you can ignore the MIDI data relative to the track name and artist, the difficult bit is getting the Arduino to know when the track is changed. Hmmmm..... im thinking as I type.... maybe some connection with the mm:ss:ff might do it? ie Arduino checks to see if the track name has changed when the timer is put back to 0:00:00, ie when you load in a new track!

    Quote Originally Posted by MiL0 View Post
    BTW - have you seen my VU meters thread? check my sig for details... might save you a bunch of LED outputs on the Arduino if you do it that way. You could then have the VU meters, track title, artist and time remaining all being shown on an LCD display (with a midi button to change what's being displayed?)
    I certainly have! I stumbled upon your thread while searching for info about Traktor LCD MIDI before I created an account here. Defiantly liking the idea of saving the outputs. Having a display button would be cool too but I could defiantly picture a blue 16x4 line display with it all on! ...even better a twin 16x4 for each deck with channel VU on each screen!! Now im just getting silly!
    ...dreams in binary

  10. #10
    Tech Mentor
    Join Date
    Feb 2011
    Location
    Southern Ontario, Canada
    Posts
    244

    Default

    I was going to do some inline quoting but I am running late for an appointment...

    Regarding the pdf you are using... I highly recommend changing the code to work with the pdf I posted (attached to this post)... Traktor specifically supports the hc4500 (with its 12 segment display), I'm not sure if using the 3700's midi-spec will cause a problem in the future (or with certain charcters since the 3700's font table is slightly different than the hc4500's).

    I was doing some thinking about how to stop the scrolling (which is about twice as fast in TP2 )... Your idea about the double spaces intrigues me... I will have to play... combining that with the track time (which I havent stripped out of the midi data yet) may be the trick we need to make it work...

    The first thing I think should be left out of the code would be the frame (?) number... processing and displaying the frames (of which there are many many per second) will add a crap-ton of extra processing time... If I were to have two in my controller I would be thinking of dedicating a board and chip to drive the displays due to the processing required... the last thing we want is latency on the midi out (which is the only thing that really matters).

Page 1 of 7 12345 ... LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •