Zurück zur Übersicht

JS: Cue-Dateien für Playstation 1 Emulatoren erstellen

#Tutorials#Javascript

Da ich mir vor einiger Zeit einen Raspberry Pi 3 in ein altes Nes-Gehäuse gebaut habe, brauchte ich natürlich auch Roms. Für N64, Snes und so weiter klappte alles immer auf Anhieb. Bei der Playstation waren oft nur bin-Dateien dabei. Hat man nur diese, so kann der Emulator die Spiele nicht abspielen. Man braucht die Cue-Datei. Diese zu generieren ist händisch machbar, aber ich habe mir gedacht, dass es einfacher ist, wenn  das automatisiert geht.

Das Ganze läuft über HTML5 mit Drag/Drop. Durch das Droppen bekomme ich die Dateinamen, die abgelegt wurden, ohne dass die Dateien hochgeladen werden. Das Skript habe ich auf meiner Tools-Seite hinzugefügt.

Zum Cue-Maker

Hier mal ein kleiner Auszug des Codes:

$(function() {

  var dropzone = $("#dropzone");

  //...

  dropzone.on("drop", function(e) {
    dropzone.removeClass("hover");

    var flasher = function(state) {
      dropzone.toggleClass("flash", state);
    }

    flasher(true);

    var fileNames = extractFilenames(e.originalEvent.dataTransfer.files);

    setTimeout(function() {
      flasher(false);
      var cueSheet = filenamesToCue(fileNames);

      // set cue file name
      fileNames = fileNames.slice();
      var firstFile = fileNames.shift();
      var cuefilename = firstFile.split('.').slice(0, -1).join('.') + '.cue';
      $("#result").text(cueSheet);
      $(".dlbutton").attr('data-filename',cuefilename).show();
    }, 250)
  })

  $('.dlbutton').click(function(e) {
    e.preventDefault();
    var filename = $(this).attr('data-filename');
    var text = $("#result").text();
    download(filename, text);
  });

});


// Download generated file
function download(filename, text) {
  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  element.setAttribute('download', filename);

  element.style.display = 'none';
  document.body.appendChild(element);

  element.click();

  document.body.removeChild(element);
}

// Get Filenames
function extractFilenames(fileList) {
  return $.makeArray(fileList).map(function(file) {
    return file.name;
  })
}

// Generatore Cue-Data
function filenamesToCue(fileNames) {
  fileNames = fileNames.slice();
  var firstFile = fileNames.shift();

  var sheet =  'FILE "' + firstFile + '" BINARY\n\
  TRACK 01 MODE2/2352\n\
  INDEX 01 00:00:00\n\
';
  var trackCounter = 2
  fileNames.forEach(function(fileName) {
    sheet += 'FILE "' + fileName + '" BINARY\n\
    TRACK ' + padLeadingZero(trackCounter) + " AUDIO\n\
    INDEX 00 00:00:00\n\
    INDEX 01 00:02:00\n\
"
  trackCounter++;
  });

  return sheet;
}

function padLeadingZero(number) {
  var padded = "0" + number;
  return padded.substr(padded.length-2);
}

Kommentare

Es gibt noch keine Kommentare. Sei der Erste!

Hinterlasse einen Kommentar

Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Kommentar wird gespeichert
Danke für deinen Kommentar! Sobald er freigegeben wurde erscheint er hier.