tja2fumen – TJA chart converter
tja2fumen is a tool that allows you to convert TJA charts (.tja) to fumen charts (.bin).

Test status (main branch) GitHub release (with filter) MIT License

---- ## Features - Parse `.tja` chart files. - Convert parsed TJA song data into fumen chart data. - Write fumen chart data to `.bin` files. - Decode official fumen `.bin` files. ## Usage tja2fumen is included as part of several existing projects. So, you may be using tja2fumen already! - **XB1/TDMX**: [TakoTako](https://github.com/fluto/takotako) converts both chart and audio files for XB1/TDMX. - **Nijiro**: [TaikoSoundEditor](https://github.com/NotImplementedLife/TaikoSoundEditor) converts both chart and audio files for NIjiro. You can also use tja2fumen directly on a `.tja` file by downloading `tja2fumen.exe` from the [Releases](https://github.com/vivaria/tja2fumen/releases) page and running `tja2fumen.exe file.tja` in a command prompt. > **Note**: For older versions of TakoTako (3.2.0 and below), you can add tja2fumen by renaming `tja2fumen.exe` to `tja2bin.exe` and placing it inside TakoTako's plugin folder (`BepInEx/plugins/com.fluto.takotako/`). ## TJA Support If there is an unsupported feature that you would like support for, please make a request by [opening a new issue](https://github.com/vivaria/tja2fumen/issues/new). ### Supported file formats > **Legend**: `✅` = Fully supported, `❌` = Not supported | | tja 2 fumen | tja 2 bin | Comment | |---------------------|-------------|-----------|----------| | UTF-8 (with BOM) | `✅` | `❌` |   | | UTF-8 (without BOM) | `✅️` | `✅` |   | | Shift-JIS | `✅` | `✅` |   | ### Supported metadata > **Legend**: `✅` = Fully supported, `⚪️` = Ignored, `⚠️` = Incorrect behavior, `❌` = Not supported | | tja 2 fumen | tja 2 bin | Comment | |-----------------------------------------------------------------|-------------|-----------|-------------------------------------------------------------------------| | `BPM:`, `OFFSET:` | `✅` | `✅` |   | | `TITLE:`, `SUBTITLE:`, `WAVE:`,
`DEMOSTART:`, etc. | `⚪️` | `⚪️` | The only global metadata needed are `BPM:` and `OFFSET:`.   | | `COURSE:`, `LEVEL:`, `BALLOON:`,
`SCOREINIT:`, `SCOREDIFF:` | `✅` | `✅` |   | | `STYLE:` (`Single`, `Double`) | `✅` | `❌` |   | | `EXAM1:`, `GAUGEINCR:`, `TOTAL:`, etc. | `⚪️` | `⚪️` | Other simulator-specific metadata fields are currently ignored.  | ### Supported notes/commands > **Legend**: `✅` = Fully supported, `⚪️` = Ignored, `⚠️` = Incorrect behavior, `❌` = Not supported | | tja 2 fumen | tja 2 bin | Comment | |--------------------------------------------------|-------------|-----------|---------------------------------------------------------------------------------------------------------------| | `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9` | `✅` | `✅` | | | `A`, `B` | `✅` | `❌` | | | `C`, `D`, `E`, `F`, `G`, `H`, `I` | `⚠️` | `❌` | Replaced by normal notes/rolls in tja2fumen. | | `9000,`
`9008,` | `⚪️` | `⚠️` | Double Kusudama note treated as 1 drumroll by tja2fumen, but 2 overlapping drumrolls by tja2bin. | | `#START`, `#END` | `✅` | `✅` | | | `#START P1`, `#START P2` | `✅` | `❌` | | | `#BPMCHANGE` | `✅` | `⚠️` | See [#16](https://github.com/Fluto/TakoTako/issues/16) | | `#MEASURE` | `✅` | `✅` | | | `#SCROLL` | `✅` | `✅` | | | `#GOGOSTART`, `#GOGOEND` | `✅` | `✅` | | | `#BARLINEOFF`, `#BARLINEON` | `✅` | `✅` | | | `#DELAY` | `✅` | `❌` | See [#27](https://github.com/Fluto/TakoTako/issues/27) | | `#BRANCHSTART`, `#BRANCHEND` | `✅` | `✅` | | | `#N`, `#E`, `#M` | `✅` | `✅` | | | `#SECTION` | `⚠️` | `❌` | See [#53](https://github.com/vivaria/tja2fumen/issues/53), [#27](https://github.com/Fluto/TakoTako/issues/27) | | `#LEVELHOLD` | `✅` | `❌` | | | `#BMSCROLL`, `#LYRIC`,
`#DIRECTION`, etc. | `⚪️` | `❌` | Other simulator-specific chart commands are currently ignored. | ## Reporting bugs If you've found a `.tja` file that tja2fumen converts incorrectly, please [open a new issue](https://github.com/vivaria/tja2fumen/issues/new) on the tja2fumen repo. It is especially important that you attach the song files to the issue. You can do this by adding the song files to a `.zip` (Select files -> Right click -> "Send to" -> "Compressed (zipped) folder"), and then uploading the `.zip` to the issue. This greatly helps me to reproduce and fix any issues. You can also message me directly on Discord (`_vivaria`) if you don't have a GitHub account, and I will take care of making an issue for you. :) ## Building on top of tja2fumen If you are a developer looking to add tja2fumen to your project, you have two options: 1. For non-Python projects, you can download `tja2fumen.exe` and call it via a system call. 2. For Python projects, you can install tja2fumen via `pip install tja2fumen`. tja2fumen uses a very permissable license ([MIT License](https://choosealicense.com/licenses/mit/)). You are free to distribute and modify tja2fumen, but please include a copy of the MIT License alongside the `tja2fumen.exe` executable if you copy it into your project. ## Attribution - The fumen-parsing code in this project is based off of a modified copy of the [`readFumen()`](https://github.com/KatieFrogs/fumen-tools/blob/6ff3a2f7f53687f3dd49c5c57fcfc5ccbe3e5a10/fumen2osu/fumen2osu.py#L7-L152) function from the [`fumen2osu.py`](https://github.com/KatieFrogs/fumen-tools/blob/main/fumen2osu/fumen2osu.py) found in @KatieFrogs' [`fumen-tools`](https://github.com/KatieFrogs/fumen-tools) project. - The TJA-parsing code in this project is a Python translation of the [`parseTJA.js`](https://github.com/WHMHammer/tja-tools/blob/master/src/js/parseTJA.js) file from @WHMHammer's [`tja-tools`](https://github.com/WHMHammer/tja-tools). - sakurada0291, DDDDDD, U-ros, and others in the Discord for helping to test tja2fumen. :)