Git Product home page Git Product logo

spctag's Introduction

SPCtag : Java SPC tag reader (SNES Sound Files)

SPCTag is a Java stand-alone command line app for reading the ID666 tags from SNES SPC-files.

SPC-files are sound files containing ripped chiptune music from Super Nintendo and Super Famicom games. They are named after the Sony SPC-700 sound chip created by Ken Kutaragi (who later became the father of the Playstation).

Not for PKCS#7 certificates who share the same filename extension.

๐Ÿ–ฅ๏ธ Usage

usage: spctag <filename>
 -j,--json      output JSON
 -v,--verbose   verbose output
 -V,--version   print version
 -x,--xid6      print xid6 tags

For example:

$ java -jar spctag -v --json "/warez/spc/dkc2/17 Stickerbrush Symphony.spc"
[
  {
    "fileHeader": "SNES-SPC700 Sound File Data v0.30",
    "tagFormat": "Text",
    "artist": "Dave Wise",
    "songTitle": "Stickerbush Symphony",
    "gameTitle": "Donkey Kong Country 2",
    "dumpedBy": "Datschge",
    "comments": "Bramble Maze",
    "dateSpcWasDumped": "",
    "lengthSeconds": 253,
    "fadeLengthMilliseconds": 10000,
    "emulatorUsedToDumpSpc": "Unknown",
    "xid6": {
      "publishersName": "Rare, Nintendo",
      "copyrightYear": "1995",
      "introductionLength": 25.3,
      "fadeLength": 640000
    }
  }
]

Features

  • โœ”๏ธ 100% Java (Java 17) โ˜•
  • โœ”๏ธ Supports UTF-8 encoding in the tags!
  • โœ”๏ธ Command line. Multi-platform.
  • โœ”๏ธ Batch processing using wildcards is possible! For example: java -jar spctag *.spc
  • โœ”๏ธ xid6 support (extended tags).
  • โŒ Edit tags (as of yet)

๐Ÿ’พ Building

This is a Maven-project.

Linux / POSIX

Run:

./build.sh

Windows

Run:

mvnw.cmd clean install assembly:single

to build the JAR-file.

๐Ÿ“ Binaries

Binaries are included with every release on Github to simplify for end-users who can't compile stuff on their platform.

Character encodings

Supported character encodings are:

  • ASCII
  • UTF-8
  • latin-1

The program auto-detect character encodings, if text is not valid UTF-8 then latin-1 is used. This may result in mojibake.

Noncharacters in UTF-8 are disallowed for security reasons.

๐Ÿ”ง Development

  1. I wrote this because there was a lack of tools supporting the SPC-format.
  2. And it would be a fun project to learn binary I/O in Java.
  3. Lastly, spctag has the best support for parsing the "Emulator used for dumping SPC"-tag ๐Ÿ˜

Most of the existing tools are 15-20 year old legacy Windows programs that won't run on modern computers. The source code is lost. Or it was written in C/C++ for 32-bit architecture and won't compile on modern 64-bit computers.

Java is multi-platform and you can run and compile 20-year-old Java programs without any issues. So I'd figure this would be a suitable platform for posterity.

Hopefully doing it in Java makes it easy to convert to XML and JSON, as well as persisting it in databases using SQL.

๐Ÿ†” Emulator Dump Tag

The Emulator used for dumping-value is set by 1 byte-flag. In two different offset locations depending on if the SPC-file is using binary or text-format for storing the ID666-tag.

  • Binary offset 0xD1
  • Text offset: 0xD2

There are two different set of specifications for emulator codes available. The legacy SPC-file specification and the newer Japanese one. SPCTag supports both of them.

๐Ÿ‡ฏ๐Ÿ‡ต Japanese spec

The following byte-values are used according to the Japanese spec:

Emulator name Text format Binary format
Unknown 0x30 0x00
ZSNES 0x31 0x01
Snes9x 0x32 0x02
ZST2SPC 0x33 0x03
Other 0x34 0x04
SNEShout 0x35 0x05
ZSNES / W 0x36 0x06
Snes9xpp 0x37 0x07
SNESGT 0x38 0x08

Note: Other and Unknown are both specified with unique values (?) somehow...

๐Ÿ‘ต Legacy spec

Only 3 values are defined in the legacy spec (SPC File Format v.0.31 txt-file)

Emulator name Text format Binary format
Unknown 0x00 0x00
ZSNES 0x01 0x01
Snes9x 0x02 0x02

๐Ÿญ Factory Method

  • se.anosh.spctag.emulator.factory contains a factory method.
  • Used for creating immutable Emulator-objects based on the two aforementioned tables.

Usage example:

Emulator emulatorUsed = EmulatorFactory.createEmulator(0x31, Type.JAPANESE) // Type.LEGACY is also available

๐Ÿ“œ:Licence

GPL 3 only. See COPYING

Libraries used & credit

Dedication

SPCtag is dedicated to my favourite OC remixer Avien (1986-2004). RIP ๐ŸŽถ ๐ŸŽท

spctag's People

Contributors

dependabot[bot] avatar ullenius avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.