{"id":18918879,"url":"https://github.com/ullenius/spctag","last_synced_at":"2025-04-15T10:33:12.764Z","repository":{"id":62756075,"uuid":"172131427","full_name":"ullenius/spctag","owner":"ullenius","description":" :video_game: :notes: Read and parse ID666 tags from SNES SPC-700 files (Super Nintendo \u0026 Super Famicom Sound Files)","archived":false,"fork":false,"pushed_at":"2025-01-01T20:32:30.000Z","size":1317,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-28T20:11:19.388Z","etag":null,"topics":["cli","gpl3","java","maven","snes","spc700","super-famicom","tag","terminal","xid6"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ullenius.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-22T20:39:07.000Z","updated_at":"2025-03-04T22:48:35.000Z","dependencies_parsed_at":"2024-04-10T09:41:43.586Z","dependency_job_id":"afd72bea-d234-4e80-94bd-865bc6755229","html_url":"https://github.com/ullenius/spctag","commit_stats":null,"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ullenius%2Fspctag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ullenius%2Fspctag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ullenius%2Fspctag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ullenius%2Fspctag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ullenius","download_url":"https://codeload.github.com/ullenius/spctag/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249051901,"owners_count":21204914,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","gpl3","java","maven","snes","spc700","super-famicom","tag","terminal","xid6"],"created_at":"2024-11-08T10:34:09.433Z","updated_at":"2025-04-15T10:33:12.421Z","avatar_url":"https://github.com/ullenius.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SPCtag : Java SPC tag reader (SNES Sound Files)\n\u003cimg src=\"spc700.jpg\" width=\"395\" height=\"326\" align=\"right\"\u003e\n\n[SPCTag](https://github.com/ullenius/spctag) is a Java stand-alone command line app for reading the ID666 tags from SNES SPC-files.\n\nSPC-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).\n\n**Not** for *PKCS#7* certificates who share the same filename extension.\n\n## :desktop_computer: Usage\n\n```sh\nusage: spctag \u003cfilename\u003e\n -j,--json      output JSON\n -v,--verbose   verbose output\n -V,--version   print version\n -x,--xid6      print xid6 tags\n```\n\nFor example:\n```sh\n$ java -jar spctag -v --json \"/warez/spc/dkc2/17 Stickerbrush Symphony.spc\"\n```\n```json\n[\n  {\n    \"fileHeader\": \"SNES-SPC700 Sound File Data v0.30\",\n    \"tagFormat\": \"Text\",\n    \"artist\": \"Dave Wise\",\n    \"songTitle\": \"Stickerbush Symphony\",\n    \"gameTitle\": \"Donkey Kong Country 2\",\n    \"dumpedBy\": \"Datschge\",\n    \"comments\": \"Bramble Maze\",\n    \"dateSpcWasDumped\": \"\",\n    \"lengthSeconds\": 253,\n    \"fadeLengthMilliseconds\": 10000,\n    \"emulatorUsedToDumpSpc\": \"Unknown\",\n    \"xid6\": {\n      \"publishersName\": \"Rare, Nintendo\",\n      \"copyrightYear\": \"1995\",\n      \"introductionLength\": 25.3,\n      \"fadeLength\": 640000\n    }\n  }\n]\n```\n\n## Features\n\n* :heavy_check_mark: 100% Java (Java 17) :coffee:\n* :heavy_check_mark: Supports UTF-8 encoding in the tags!\n* :heavy_check_mark: Command line. Multi-platform.\n* :heavy_check_mark: Batch processing using wildcards is possible! For example: `java -jar spctag *.spc`\n* :heavy_check_mark: xid6 support (extended tags).\n* :x: Edit tags (as of yet)\n\n## :floppy_disk: Building\nThis is a Maven-project.\n\n### Linux / POSIX\nRun:\n```sh\n./build.sh\n```\n\n### Windows\nRun:\n```dosbatch\nmvnw.cmd clean install assembly:single\n```\n\nto build the JAR-file.\n\n## :file_folder: Binaries\nBinaries are included with every release on Github to simplify for end-users who\ncan't compile stuff on their platform.\n\n## Character encodings\nSupported character encodings are:\n\n* ASCII\n* UTF-8\n* latin-1\n\nThe program auto-detect character encodings, if text is not valid UTF-8 then\nlatin-1 is used. This may result in mojibake.\n\nNoncharacters in UTF-8 are disallowed for security reasons.\n\n* [Which code points are noncharacters?](https://www.unicode.org/faq/private_use.html#noncharacters)\n\n## :wrench: Development\n1. I wrote this because there was a lack of tools supporting the SPC-format.\n2. And it would be a fun project to learn binary I/O in Java.\n3. Lastly, **spctag** has the best support for parsing the *\"Emulator used for dumping SPC\"*-tag :grin:\n\nMost 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.\n\nJava 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.\n\nHopefully doing it in Java makes it easy to convert to XML and JSON, as well as persisting it in databases using SQL.\n\n## :id: Emulator Dump Tag\nThe *Emulator used for dumping*-value is set by 1 byte-flag. In two different \noffset locations depending on if the SPC-file is using binary or text-format for \nstoring the ID666-tag.\n\n* Binary offset   `0xD1`\n* Text offset:    `0xD2`\n\nThere 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.\n\n### :jp: Japanese spec\nThe following byte-values are used according to the [Japanese spec](https://dgrfactory.jp/spcplay/id666.html):\n\n| Emulator name | Text format | Binary format |\n|---------------|-------------|---------------|\n| Unknown       | 0x30        | 0x00          |\n| ZSNES         | 0x31        | 0x01          |\n| Snes9x        | 0x32        | 0x02          |\n| ZST2SPC       | 0x33        | 0x03          |\n| Other         | 0x34        | 0x04          |\n| SNEShout      | 0x35        | 0x05          |\n| ZSNES / W     | 0x36        | 0x06          |\n| Snes9xpp      | 0x37        | 0x07          |\n| SNESGT        | 0x38        | 0x08          |\n\nNote: *Other* and *Unknown* are both specified with unique values (?) somehow...\n\n### :older_woman: Legacy spec\nOnly 3 values are defined in the legacy spec (SPC File Format v.0.31 txt-file)\n\n| Emulator name | Text format | Binary format |\n|---------------|-------------|---------------|\n| Unknown       | 0x00        | 0x00          |\n| ZSNES         | 0x01        | 0x01          |\n| Snes9x        | 0x02        | 0x02          |\n\n### :factory: Factory Method\n* *se.anosh.spctag.emulator.factory* contains a factory method.\n* Used for creating immutable *Emulator*-objects based on the two aforementioned tables.\n\n#### Usage example:\n```java\nEmulator emulatorUsed = EmulatorFactory.createEmulator(0x31, Type.JAPANESE) // Type.LEGACY is also available\n```\n\n## :scroll::Licence\nGPL 3 only. See COPYING\n\n### Libraries used \u0026 credit\n* Apache Commons CLI-library - [Apache Licence version 2](https://www.apache.org/licenses/LICENSE-2.0)\n* tinylog - [Apache Licence version 2](https://www.apache.org/licenses/LICENSE-2.0)\n* [S-SMP chip for SFC](https://commons.wikimedia.org/wiki/File:S-SMP_01.jpg) - made by [Yaca2671](https://commons.wikimedia.org/wiki/User_talk:Yaca2671) (2007). [Creative Commons Attribution-Share-Alike](https://creativecommons.org/licenses/by-sa/3.0/) 3.0 Unported licence.\n* SPC dumped-date check (logs warning if tag pre-dates the birth of the SPC-format; 1998-04-15) used is from `SPCTool` \n(GPL2 or later) by Anti Resonance. [Source](https://github.com/ullenius/spctool/blob/7a680c84c02bf8bacfb6233e466a43c0b5588ba9/SNES/ID666.cpp#L918)\n\n## Dedication\nSPCtag is dedicated to my favourite OC remixer [Avien](https://ocremix.org/artist/4402/avien) (1986-2004). RIP :notes: :saxophone:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fullenius%2Fspctag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fullenius%2Fspctag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fullenius%2Fspctag/lists"}