I recently watched Techmoan’s YouTube video on using a PS2 keyboard to title tracks on a MiniDisk player. Cool stuff. I am a fan of the MiniDisk form factor despite it falling out of favour before I really got into it properly.

So Techmoan used a PS2 keyboard to title his tracks. That’s a pretty forward thinking solution from Sony (Well all but that PS2 keyboards are hard to get hold of now), they even thought ahead enough to put it on the front panel.

Now, the tragedy in all this is I own a Sony MDS-JE480 deck, as it goes it’s a entry level deck, but otherwise not too shabby. Except it doesn’t have a PS2 port. So I can’t title with it. Or can i?

This bad boy has proven itself to be a excellent purchase, thanks Joseph for spotting this on Facebook Marketplace! What more can you ask for for £30 or so? (A PS2 port..)

Titles can be entered using the original remote control (which I also don’t have). This would tend to be a relatively painful process as you’d have to enter these titles using a T9 keypad but without the intelligent predictive part.

Remote would look a little like this, but with a T9 keypad. Either way, painful to type on.

Now, some clever sod has written some code for Arduino, so it behaves as a kind of serial-infrared remote control. And this can be used to enter track names. It would also be a hell of a lot easier than using the T9 keypad.  The Hackaday article really does a good job explaining it all, but skimps on the hardware description.

This is the Arduino Uno Infra-Red transmitter i knocked up in a afternoon. Pretty simple, but effective.

Main steps – take the code from the hackaday page, and save it onto you machine. Choose a suitable digital pin to attach the LED to. I’m using a Uno, so I need to use Pin 9. I use a BC547 Transistor and a IR LED out of a old remote to get going. Simple, but effective. The BC547 sinks or blocks the current through the LED as required. It may also be possible to ditch the BC547 and just go with the LED, but you may run into current constraints on the ATmega328.

Techmoan’s video about adding track titles.
Hackaday Author’s video demonstration.

Link to the Hackaday article

Hope you find this helpful!

– Charles

Arduino Sketch and Definitions

Definitions

//Source is hackaday.io user smartroad
//Project URL : https://hackaday.io/project/165504-sony-minidisc-namer
#define EJECT       0x69E
#define POWER       0xA9E
#define INPUTSELECT 0x67E
#define RECMODE     0x07E
#define PLAYMODE    0xE9E
#define DISPLAY     0x19E
#define SCROLL      0x99E
#define MENUNO      0x57E
#define NAMESELECT  0x87E
#define YES         0xD7E
#define NUMBER1     0x01E
#define NUMBER2     0x81E
#define NUMBER3     0x41E
#define NUMBER4     0xC1E
#define NUMBER5     0x21E
#define NUMBER6     0xA1E
#define NUMBER7     0x61E
#define NUMBER8     0xE1E
#define NUMBER9     0x11E
#define NUMBER10    0x51E
#define NUMBER0     0x91E
#define CLEAR       0xF1E
#define GROUPONOFF  0xCFE
#define GROUPSKIP   0x4FE
#define MUSICSYNC   0xFDE
#define PLAY        0x55E
#define PAUSE       0x95E
#define RECORD      0xB5E
#define TREC        0x0DE
#define STOP        0x15E
#define AMSPREV     0x05E
#define AMSNEXT     0x85E
#define REWIND      0xD5E
#define FASTFORWARD 0x35E
#define LEVELUP     0x09E
#define LEVELDOWN   0x89E
#define REPEATMODE  0x65E
#define ATOB        0xE5E

Arduino Sketch

//Source is hackaday.io user smartroad
//Project URL : https://hackaday.io/project/165504-sony-minidisc-namer

#include <IRremote.h>
#include "defines.h"

IRsend irsend;

char inputChars[64];
byte charCount = 0;

byte mode = 0; // Capticals = 0, Lowercase = 1, Numbers = 2
byte targetMode = 0;
boolean commandMode = true; // True = control playback | False = name entry mode

int totalCount = 0;
byte blockCount = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  helpText();
}

void loop() {

  if (commandMode) {
    if (charCount > 0) {
      Serial.println(F("\n\r\u001b[34;1mCONFIRM NAME INPUT\u001b[0m"));
      Serial.println(F("Y - Yes or N - NO"));
    }
    else {
      Serial.print(F("\n\r\n\rEnter Command (H for help): "));
    }
  }

  while (!Serial.available()) {}

  if (commandMode) {

    char serialChar = Serial.read();
    if (charCount == 0) {
      if (serialChar == 'b') {
        Serial.println(F("Next Track"));
        sendButton(AMSNEXT);
      }
      else if (serialChar == 'z') {
        Serial.println(F("Previous Track"));
        sendButton(AMSPREV);
      }
      else if (serialChar == 'x') {
        Serial.println(F("Play"));
        sendButton(PLAY);
      }
      else if (serialChar == 'c') {
        Serial.println(F("Pause"));
        sendButton(PAUSE);
      }
      else if (serialChar == 'v') {
        Serial.println(F("Stop"));
        sendButton(STOP);
      }
      else if (serialChar == 'l') {
        Serial.println(F("Eject"));
        sendButton(EJECT);
      }
      else if (serialChar == 's') {
        Serial.println(F("Starting Record"));
        sendButton(RECORD);
      }
      else if (serialChar == 'S') {
        Serial.println(F("Music Sync Recording"));
        sendButton(MUSICSYNC);
      }
      else if (serialChar == 'i') {
        Serial.println(F("Change Input"));
        sendButton(INPUTSELECT);
      }
      else if (serialChar == 'd') {
        Serial.println(F("Display Mode"));
        sendButton(DISPLAY);
      }
      else if (serialChar == 'D') {
        Serial.println(F("Scrolling Display"));
        sendButton(SCROLL);
      }
      else if (serialChar == 'p') {
        Serial.println(F("Play Mode"));
        sendButton(PLAYMODE);
      }
      else if (serialChar == 'r') {
        Serial.println(F("Repeat Mode"));
        sendButton(REPEATMODE);
      }
      else if (serialChar == 'R') {
        Serial.println(F("Section Repeat (A<>B)"));
        sendButton(ATOB);
      }
      else if (serialChar == 'q') {
        Serial.println(F("Recording Mode (Stereo/LP2/LP4/Mono"));
        sendButton(RECMODE);
      }
      else if (serialChar == '1') {
        Serial.print(F("1"));
        sendButton(NUMBER1);
      }
      else if (serialChar == '2') {
        Serial.print(F("2"));
        sendButton(NUMBER2);
      }
      else if (serialChar == '3') {
        Serial.print(F("3"));
        sendButton(NUMBER3);
      }
      else if (serialChar == '4') {
        Serial.print(F("4"));
        sendButton(NUMBER4);
      }
      else if (serialChar == '5') {
        Serial.print(F("5"));
        sendButton(NUMBER5);
      }
      else if (serialChar == '6') {
        Serial.print(F("6"));
        sendButton(NUMBER6);
      }
      else if (serialChar == '7') {
        Serial.print(F("7"));
        sendButton(NUMBER7);
      }
      else if (serialChar == '8') {
        Serial.print(F("8"));
        sendButton(NUMBER8);
      }
      else if (serialChar == '9') {
        Serial.print(F("9"));
        sendButton(NUMBER9);
      }
      else if (serialChar == '0') {
        Serial.print(F("0"));
        sendButton(NUMBER0);
      }
      else if (serialChar == '=' || serialChar == '+') {
        Serial.print(F(">10"));
        sendButton(NUMBER10);
      }
      else if (serialChar == '#') {
        Serial.print(F("CLEARING MEMUSAGE"));
        totalCount = 0;
        blockCount = 0;
        memUsed();
      }
      else if (serialChar == '`') { // change to naming mode
        Serial.println(F("Name Mode"));
        commandMode = false;
        memUsed();
        Serial.println(F("\n\rType name and press enter to send:\u001b[37;1m"));
      }
      else if (serialChar == 'H' || serialChar == 'h') { // stop
        Serial.println(F("Help\r\n\r\n"));
        helpText();
      }
    }
    else {
      if (serialChar == 'Y'  || serialChar == 'y') { // confirm name
        totalCount += charCount;
        blockCount += (charCount + 6) / 7;
        memUsed();
        charCount = 0;
        sendButton(YES);
      }
      else if (serialChar == 'N'  || serialChar == 'n') { // cancel name
        memUsed();
        charCount = 0;
        sendButton(MENUNO);
      }
    }
  }
  else {
    inputChars[charCount] = Serial.read();
    if (inputChars[charCount] == 10 || inputChars[charCount] == 13) {
      Serial.print(F("\u001b[0m"));
      if (nameCheck()) sendName();
      else charCount = 0;
      commandMode = true;
    }
    else if (inputChars[charCount] == 127) {
      Serial.print(inputChars[charCount]);
      charCount--;
    }
    else {
      Serial.print(inputChars[charCount]);
      charCount++;
    }
  }
}





void memUsed() {
  float countPercent = (float(totalCount) / 1785) * 100;
  float blockPercent = (float(blockCount) / 255) * 100;
  Serial.print(F("\n\rTotal characters used: \u001b[1m"));
  if (countPercent >= 75 && countPercent < 90) Serial.print(F("\u001b[33m"));
  else if (countPercent >= 90) Serial.print(F("\u001b[31m"));
  else Serial.print(F("\u001b[32m"));
  Serial.print(countPercent);
  Serial.print(F("%\u001b[0m\u001b[0m\n\rTotal blocks used: \u001b[1m"));
  if (blockPercent >= 75 && blockPercent < 90) Serial.print(F("\u001b[33m"));
  else if (blockPercent >= 90) Serial.print(F("\u001b[31m"));
  else Serial.print(F("\u001b[32m"));
  Serial.print(blockPercent);
  Serial.print(F("%\u001b[0m\n\r"));
}



void sendName() {
  Serial.println(F("\n\r\n\rActivating Name Edit on Player - \u001b[31mPress any key when player ready\u001b[0m"));
  sendButton(0x87e);
  mode = 0;
  targetMode = 0;
//  delay(2000);
  while(!Serial.available()) {}

  char purge = Serial.read(); // dump the character

  Serial.print(F("\n\rSending: \u001b[32;1m"));

  for (byte c = 0; c < charCount; c++) {
    if (inputChars[c] >= 65 && inputChars[c] <= 90) { // Check if char is captial and switch to correct mode
      targetMode = 0;
    }
    else if (inputChars[c] >= 97 && inputChars[c] <= 122) { // Check if char is lower and switch to correct mode
      targetMode = 1;
    }
    else if (inputChars[c] >= 32 && inputChars[c] <= 64) { // Check if char is special/number and switch to correct mode
      if (inputChars[c] >= 48 && inputChars[c] <= 57) targetMode = 2;
      else {
        if (targetMode == 2) targetMode = 0;
      }
    }

    while (mode != targetMode) {
      sendButton(NAMESELECT);
      delay(100);
      mode++;
      if (mode > 2) mode = 0;
    }

    if (inputChars[c] == 'A') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 1);
    }
    else if (inputChars[c] == 'B') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 2);
    }
    else if (inputChars[c] == 'C') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 3);
    }
    else if (inputChars[c] == 'D') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 1);
    }
    else if (inputChars[c] == 'E') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 2);
    }
    else if (inputChars[c] == 'F') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 3);
    }
    else if (inputChars[c] == 'G') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 1);
    }
    else if (inputChars[c] == 'H') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 2);
    }
    else if (inputChars[c] == 'I') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 3);
    }
    else if (inputChars[c] == 'J') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 1);
    }
    else if (inputChars[c] == 'K') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 2);
    }
    else if (inputChars[c] == 'L') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 3);
    }
    else if (inputChars[c] == 'M') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 1);
    }
    else if (inputChars[c] == 'N') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 2);
    }
    else if (inputChars[c] == 'O') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 3);
    }
    else if (inputChars[c] == 'P') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 1);
    }
    else if (inputChars[c] == 'Q') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 2);
    }
    else if (inputChars[c] == 'R') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 3);
    }
    else if (inputChars[c] == 'S') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 4);
    }
    else if (inputChars[c] == 'T') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 1);
    }
    else if (inputChars[c] == 'U') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 2);
    }
    else if (inputChars[c] == 'V') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 3);
    }
    else if (inputChars[c] == 'W') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 1);
    }
    else if (inputChars[c] == 'X') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 2);
    }
    else if (inputChars[c] == 'Y') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 3);
    }
    else if (inputChars[c] == 'Z') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 4);
    }

    else if (inputChars[c] == 'a') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 1);
    }
    else if (inputChars[c] == 'b') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 2);
    }
    else if (inputChars[c] == 'c') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 3);
    }
    else if (inputChars[c] == 'd') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 1);
    }
    else if (inputChars[c] == 'e') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 2);
    }
    else if (inputChars[c] == 'f') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 3);
    }
    else if (inputChars[c] == 'g') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 1);
    }
    else if (inputChars[c] == 'h') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 2);
    }
    else if (inputChars[c] == 'i') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 3);
    }
    else if (inputChars[c] == 'j') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 1);
    }
    else if (inputChars[c] == 'k') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 2);
    }
    else if (inputChars[c] == 'l') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 3);
    }
    else if (inputChars[c] == 'm') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 1);
    }
    else if (inputChars[c] == 'n') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 2);
    }
    else if (inputChars[c] == 'o') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 3);
    }
    else if (inputChars[c] == 'p') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 1);
    }
    else if (inputChars[c] == 'q') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 2);
    }
    else if (inputChars[c] == 'r') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 3);
    }
    else if (inputChars[c] == 's') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 4);
    }
    else if (inputChars[c] == 't') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 1);
    }
    else if (inputChars[c] == 'u') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 2);
    }
    else if (inputChars[c] == 'v') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 3);
    }
    else if (inputChars[c] == 'w') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 1);
    }
    else if (inputChars[c] == 'x') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 2);
    }
    else if (inputChars[c] == 'y') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 3);
    }
    else if (inputChars[c] == 'z') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 4);
    }

    else if (inputChars[c] == 39 || inputChars[c] == 96) { // ' and `
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 1);
    }
    else if (inputChars[c] == 45 || inputChars[c] == 95) { // - or _
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 2);
    }
    else if (inputChars[c] == 47 || inputChars[c] == 92) { // / or \
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 3);
    }
    else if (inputChars[c] == 44) { // ,
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 4);
    }
    else if (inputChars[c] == 46) { // .
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 5);
    }
    else if (inputChars[c] == 40) { // (
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 6);
    }
    else if (inputChars[c] == 41) { // )
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 7);
    }
    else if (inputChars[c] == 58) { // :
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 8);
    }
    else if (inputChars[c] == 33) { // !
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 9);
    }
    else if (inputChars[c] == 63) { // ?
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 10);
    }

    else if (inputChars[c] == '1') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER1, 1);
    }
    else if (inputChars[c] == '2') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER2, 1);
    }
    else if (inputChars[c] == '3') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER3, 1);
    }
    else if (inputChars[c] == '4') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER4, 1);
    }
    else if (inputChars[c] == '5') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER5, 1);
    }
    else if (inputChars[c] == '6') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER6, 1);
    }
    else if (inputChars[c] == '7') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER7, 1);
    }
    else if (inputChars[c] == '8') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER8, 1);
    }
    else if (inputChars[c] == '9') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER9, 1);
    }
    else if (inputChars[c] == '0') {
      Serial.print(inputChars[c]);
      sendCmd(NUMBER0, 1);
    }

    else if (inputChars[c] == ' ') { // space
      Serial.print(inputChars[c]);
      sendButton(NUMBER0);
    }


    if (inputChars[c] >= 48 && inputChars[c] <= 57 || inputChars[c] == ' ') {}
    else sendButton(0x35e); // move to next character
  }

  Serial.print(F("\u001b[0m\n\r\n\rTotal characters needed: "));
  Serial.print(charCount);
  Serial.print(F("\n\rTotal blocks needed: "));
  Serial.print((charCount + 6) / 7);
  Serial.print(F("\n\r"));
}



void sendCmd(int command, byte repeats) {
  for (int i = 0; i <= repeats - 1; i++) {
    sendButton(command);
    delay(100);
  }
}

void sendButton(int bts) {
  digitalWrite(9, LOW);
  for (int i = 0; i < 3; i++) {
    irsend.sendSony(bts, 12);
    delay(25);
  }
  digitalWrite(9, HIGH);
}



void helpText() {
  Serial.print(F("\u001b[1m\u001b[7mMinidisc Namer\u001b[0m\n\r\
\n\r\
\u001b[1mCommands:\u001b[0m\n\r\
\n\r\
\u001b[32mGeneral:\n\r\
\u001b[0mz    Previous Track\n\r\
x    Play\n\r\
c    Pause\n\r\
v    Stop\n\r\
b    Next Track\n\r\
l    Eject\n\r\
\n\r\
\u001b[31mRecording:\n\r\
\u001b[0ms    Record\n\r\
S    Music Sync Recording\n\r\
i    Input Selection\n\r\
q    Recording Mode\n\r\
\n\r\
\u001b[33mNumbers:\n\r\
\u001b[0m0-9  Number Entry\n\r\
=/+  >10 Entry\n\r\
\n\r\
\u001b[34;1mDisplay:\n\r\
\u001b[0md    Display\n\r\
D    Scroll Display\n\r\
\n\r\
\u001b[36mPlaymodes/Repeating:\n\r\
\u001b[0mp    Play Mode (Normal/Shuffle/Program)\n\r\
r    Repeat\n\r\
R    A <-> B\n\r\
\n\r\
\u001b[32;1mNaming Disc/Tracks:\n\r\
\u001b[0m`    Name Entry Mode\n\r\
#    Reset Memory Usage Stats\n\r\
\n\r\
\u001b[37;1mh    This help list\u001b[0m\n\r\n\r"));
}





boolean nameCheck() {
  Serial.print(F("\n\r\n\r\n\rSend this to player (Y/N):\n\r\u001b[37;1m"));
  for (byte c = 0; c < charCount; c++) {
    Serial.print(inputChars[c]);
  }
  Serial.print(F("\n\r\u001b[0m"));
  while (!Serial.available()) {}
  char serialChar = Serial.read();
  if (serialChar == 'Y' || serialChar == 'y') return 1;
  else return 0;
}