vivaria / tja2fumen Goto Github PK
View Code? Open in Web Editor NEWMod tool to convert TJA chart files (.tja) into .bin files compatible with official games
Home Page: https://pypi.org/project/tja2fumen/
License: MIT License
Mod tool to convert TJA chart files (.tja) into .bin files compatible with official games
Home Page: https://pypi.org/project/tja2fumen/
License: MIT License
Drumrolls keep overlapping the notes that come after the drumroll, so I'm sure I'm computing the duration incorrectly.
Affected songs: Kokuryu, R.I.P. Hero, Challengers, VIVIVIVID, etc.
Sample section (from VIVIVIVID):
1122112270000080,
Because tja2fumen
is packaged using pyinstaller --onefile
, the .exe
has to temp
every time it is run, which means it is very slow when calling it hundreds/thousands of times.
Additionally, since tja2fumen
currently only converts one song at a time, we have to spin up a new Python process each time, too.
This could be trivially fixed in two ways:
tja2fumen
as a directory rather than a single exe (may be complicated for users)tja2fumen
then converting any TJAs/BINs within the folder (potentially dangerous as users may accidentally pass a folder with non-fumen .bin files)In #14, I painstakingly graphed 1800+ fumens and created lookup tables using interpolation between known values.
This is an accurate method, but it's also a little inelegant to use, since I need to package up the .csv files and parse them at runtime.
In the document I received on Discord, it contained a little writeup about alternate ways to compute these values:
HP calculation:
良:
Find out when the gauge is maxed out and divide 10000 by the combo amount at which the gauge hits max. Round up the value.
可: (these give very close to official values)
_e = 0.75(良)
_n = 0.75(良)
_h = 0.75(良)
_m = 0.5(良) -> rounded up
ex = 0.5(良) -> rounded down
不可: (these give not-so-close to original values except for _e, _n and ex_)
_e = -(良/2)
_n = -(良)
_h = -(1.25x良)
_m = -(2良)
ex = -(2良)
Round up before changing the sign.
I'm curious about just how accurate these methods are (vs. my LUT method). In my method, I found that not just the difficulty, but also the n_stars has a big impact on which curves are used.
The timing windows for fumens are currently hardcoded here:
tja2fumen/src/tja2fumen/classes.py
Line 227 in 09d83c3
But, there are different timing windows for Easy/Normal:
good = 25.0250015258789
ok = 75.0750045776367
bad = 108.441665649414
good_easy = 41.7083358764648
ok_easy = 108.441665649414
bad_easy = 125.125
This should be very easy to fix.
This issue is a follow-up to:
In that issue, I tried converting all 2200+ ESE TJAs, then tried debugging the failures. Most of the failures were due to chart issues, which caused TakoTako itself to throw the error in many cases. So, there was not much to fix on the tja2fumen side of things.
However, later on, I realized that there was actually a bug in TakoTako that was interfering with my test:
Because of this bug, tja2fumen wasn't used in ~75% of conversions. So, I need to re-run the conversion for all 2200+ songs, and make sure that tja2bin
is never used at all. Then, I need to debug any new failures that didn't show up in my first round of testing.
Currently, the parseTJA
function is almost a direct Python translation of parseTJA.js
from another project.
The unmodified output of parseTJA.js
is a little hard to work with, though, so I wrote a preprocessTJAMeasures
function that slightly modifies the output of parseTJA
before doing the tja -> bin conversion.
However, this makes it difficult to search for specific logic in the codebase, since it can be unclear whether a certain LOC is in the parsing code or the converting code. So, to fix this, I should just fold the preprocessing code into the parsing code.
Currently, I set the header bytes based on reverse engineered values from my own research, and from observing what tja2bin
sets:
tja2fumen/src/tja2fumen/constants.py
Lines 68 to 73 in 46ef084
However, there are many gaps in my understanding, e.g.:
tja2fumen/testing/test_conversion.py
Lines 251 to 256 in 46ef084
This all changed when I was given a document that fully explains what each byte represents:
Header:
000-431 000-1AF - timing windows. if _e or _n then easier timings, if _h or _m then harder timings.
432-435 1B0-1B3 - whether the chart has divergent paths. 1 if yes, 0 if no. (set to 01000001 if you'll be switching endianness)
436-439 1B4-1B7 - Max HP. Default is 10000.
440-443 1B8-1BB - Clear HP. _e is 6000, _n & _h is 7000 and _m is 8000.
444-447 1BC-1BF - HP earned per 良.
448-451 1C0-1C3 - HP earned per 可.
452-455 1C4-1C7 - HP loss per 不可. Negative value.
456-459 1C8-1CB - 普通 max combo/普通 max combo. Usually set to 65536.
460-463 1CC-1CF - Ratio of hp increase. 65536(普通 max combo/玄人 max combo). If no branch paths set to 65536.
464-467 1D0-1D3 - Ratio of hp increase. 65536(普通 max combo/達人 max combo). If no branch paths set to 65536.
468-471 1D4-1D7 - 良 diverge points. Common value is 20.
472-475 1D8-1DB - 可 diverge points. Common value is 10.
476-479 1DC-1DF - 不可 diverge points. Common value is 0.
480-483 1E0-1E3 - 連打 diverge points. Common value is 1.
484-487 1E4-1E7 - 良 diverge points (big notes). Common value is 20.
488-491 1E8-1EB - 可 diverge points (big notes). Common value is 10.
492-495 1EC-1EF - 連打(大) diverge points. Common value is 1.
496-499 1F0-1F3 - Balloon diverge points. Common value is 30.
500-503 1F4-1F7 - Bell/Yam diverge points. Common value is 30.
504-507 1F8-1FB - Number of diverge points?? Common value is 20. (can be 0, even with diverge points)
508-511 1FC-1FF - Max Score value (deprecated). Dummy data.
512-515 200-203 - Number of measures. The limit is 300, 200 on older platforms.
516-519 204-207 - Unknown data.
Measure data:
208-20B - BPM (float)
20C-20F - Offset (float). Formula for calculation: (240000/bpm1)+(240000/bpm1)(x/y)-(240000/bpm2)
210 - Gogo time. 1 if yes, 0 if no.
211 - Barline visibility. 1 if yes, 0 if no.
212-213 - Dummy data.
214-217 - 普通譜面. 普通-玄人 diverge point requirement. For charts without divergent paths set to FFFFFFFF.
218-21B - 普通譜面. 普通-達人 diverge point requirement. For charts without divergent paths set to FFFFFFFF.
21C-21F - 玄人譜面. 玄人-玄人 diverge point requirement. For charts without divergent paths set to FFFFFFFF.
220-223 - 玄人譜面. 玄人-達人 diverge point requirement. For charts without divergent paths set to FFFFFFFF.
224-227 - 達人譜面. 達人-玄人 diverge point requirement. For charts without divergent paths set to FFFFFFFF.
228-22B - 達人譜面. 達人-達人 diverge point requirement. For charts without divergent paths set to FFFFFFFF.
22C-22F - Dummy data.
Note data (普通譜面):
230-231 - Number of notes in this branch of the measure.
232-233 - Dummy data.
234-237 - Scroll speed (float). Default is 1.
Note:
238-23B - Note. 01 - ドン, 02 - ド, 03 - コ, 04 - カッ, 05 - カ, 06 - 連打, 07 - ドン(大), 08 - カッ(大), 09 - 連打(大), 0A - Balloon, 0B - , 0C - Bell.
23C-23F - Note offset (ms float).
240-243 - Dummy data.
244-245 - Initial score value. If the note is a balloon then it's the balloon hit count.
246-247 - Score difference *4. If the note is a balloon then it's zero.
248-24B - Dummy Data. Old balloon count.
24C-24F - Length of 連打 and balloons (float). Zero otherwise.
Note data (玄人譜面):
If the chart has no branch paths then you just set the note count (to zero of course) and the scroll speed. If it does then repeat what you did for 普通譜面.
Note data (達人譜面):
Same deal.
HP calculation:
良:
Find out when the gauge is maxed out and divide 10000 by the combo amount at which the gauge hits max. Round up the value.
可: (these give very close to official values)
_e = 0.75(良)
_n = 0.75(良)
_h = 0.75(良)
_m = 0.5(良) -> rounded up
ex = 0.5(良) -> rounded down
不可: (these give not-so-close to original values except for _e, _n and ex_)
_e = -(良/2)
_n = -(良)
_h = -(1.25x良)
_m = -(2良)
ex = -(2良)
Round up before changing the sign.
I will need to overhaul my header code so that all of this knowledge is properly represented.
Inspired by the following links that popped up on HN today:
@Deathbloodjr alerted me to the fact that some official games have a limit to the number of measures that can be included in a song. But, currently, both tja2bin
and tja2fumen
will convert these TJAs without error. Only when the songs are played in TDMX does the game crash.
To avoid this, it would be helpful to catch this early and fail, so that users don't end up with a broken song in their song list.
Some background:
tja2bin
can't convert ura oni songs. (This isn't actually true!)ConvertTJA.exe
to handle ura oni charts. (Copying out the ura chart, turning it into an oni chart, putting that into its own temp .tja
file, converting that, and then renaming the _m.bin
file to _x.bin
.)The original tja2bin.exe
can handle this logic, but my converter can't, leading to the Ura Oni chart missing from the output.
I make an assumption that TJA offset value corresponds to the second measure:
tja2fumen/tja2fumen/converters.py
Lines 125 to 137 in 84056ae
I don't think this works for all songs though, so I should rewrite this section once I figure out the proper offset logic.
EDIT: This definitely doesn't work for SUPERNOVA.
The Doppelgangers chart plays fine in a TJAPlayer, yet the converted fumen feels like it's maybe half a second off for the entirety of the song.
Common error found in custom TJAs.
Several charts have this issue. tja2fumen can handle it just fine, but TakoTako fails to convert.
Putting it here so I don't forget it, but I should probably report upstream.
The desync occurs specifically at measure 34 in the chart:
From measure 19 to measure 33, each has a duration of 240ms. In the real song, measure 34 also has a duration of ~240ms. However, in my converter, measure 34 instead has a duration of 1200ms.
The reason for this increase from 240ms to 1200ms is due to a BPMCHANGE at measure 35:
In my converter, when a BPMCHANGE occurs, the previous measure's duration is adjusted.
tja2fumen/src/tja2fumen/converters.py
Lines 166 to 168 in b874d5c
This works for 99% of measures with BPMCHANGE commands, and even fixes the BPM issues that tja2bin.exe
has.
So, I need to find out why the adjustment should not be applied for Aleph-0 here, but applied for all other songs I've tested.
Many charts have common transcription errors, including:
STYLE:SINGLE
and STYLE:DOUBLE
chartsIt would be nice to try and catch these errors and output a useful error message so that the user knows where the problem is in their TJA file.
I've been given some feedback on the Discord that BATTLE NO. 1 (and probably others) aren't branching like they should.
Fluto has integrated tja2fumen
into TakoTako starting with Fluto/TakoTako@f728d69. 🎉
To test this current configuration of TakoTako + tja2fumen 0.5.2, I have built TakoTako from source. Then, I cloned ESE, fixed some very straightforward chart issues (typos in command names) then ran conversion on the entirety of ESE:
Running cat LogOutput.log | grep Error | sort
yields:
$ cat LogOutput.log | grep Error | sort
[Error : Unity] NullReferenceException: Object reference not set to an instance of an object.
[Error :com.fluto.takotako] Could not convert .\01 SF Live... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\02 SF Live... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\03 SF Live... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\A Promise [GENERATED]
[Error :com.fluto.takotako] Could not convert .\A Sparking... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\ALLSTARS C... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\ALLSTARS C... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Abandoned ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ai to Jouz... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Akizuki Ri... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Aloft in t... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Amami Haru... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Amber Ligh... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ami and Ma... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ami and Ma... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Angel Drea... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Anzu no Ut... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Audio de K... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Azusas Fe... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Bakumatsu ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Black Rose... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Caribbean ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Carmen Pre... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Chihayas ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Chimimoury... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Clapolpols... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Classical ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Crazy Beau... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Cycle of R... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\DIMENSIONS [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Dai-chan K... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Debut Memo... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Debut Memo... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Dragon of ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Dress Up M... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Emma [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Famicom Me... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\First ALLS... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\First Anni... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\First Anni... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\GALAXY EXP... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ganaha Hib... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Garyoutens... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Gatchaman ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ghost Rule [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Gomakashi [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Got more r... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Green Chou... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Green Kuro... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Green Meij... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Green Tats... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Green Tent... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Groovy Due... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hagiwara Y... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Harukas F... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hataraku 2... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Heat Haze ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hibikis F... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hinaru Med... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Holomen On... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hoshii Mik... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\IMITATION ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ikazuchi [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ioris Fes... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Issei Fuub... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kamisama n... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Karakuri K... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kaze no Ku... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kikuchi Ma... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kisaragi C... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kokoro Kor... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kokorobo [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kotoris I... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\La Paz no ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Mahoujin -... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Makotos F... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Mars [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Mikis Fes... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Minase Ior... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Mirumiru ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Miura Azus... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Moment of ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Music Revo... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\NEXT LEVEL [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Night of K... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Nijiiro 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\No Gravity [GENERATED]
[Error :com.fluto.takotako] Could not convert .\ONE FOR AL... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Oklahoma M... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Onegai! Se... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Onigiri wa... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Oodain [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Orb no Ino... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Parallel L... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ridge Race... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ritsukos ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Romantic g... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ryuu to Ko... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\SP Live M... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\SP Live P... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\SP Live P... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\SP Live W... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Secret Nig... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Secret Nig... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Shijou Tak... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Sonata, Ge... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Soroban 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Special Me... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Super Dand... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Symphony N... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Synchronic... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\THE iDOLM@... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\THE iDOLM@... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\THE iDOLMA... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\THE iDOLMA... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Taiko no T... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Takanes F... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Takatsuki ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Tenjiku 20... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Tenth Memo... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\The Tower ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\William Te... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Winter Fes... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Yayois Fe... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Yo-kai Wat... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Yokuderu 1... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Youthful C... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Yozakura S... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Yukihos F... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\last cross [GENERATED]
When I re-ran the converter, I got this instead:
Running cat LogOutput.log | grep Error | sort
yields a shorter list:
[Error :com.fluto.takotako] Could not convert .\Ai to Jouz... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Aloft in t... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Angel Drea... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Anzu no Ut... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Audio de K... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Black Rose... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Classical ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Cycle of R... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Dragon of ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Dragon of ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Famicom Me... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\GALAXY EXP... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ghost Rule [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Got more r... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hataraku 2... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Heat Haze ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Hinaru Med... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ikazuchi [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kamisama n... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Karakuri K... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Kokoro Kor... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Mahoujin -... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Mirumiru ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Music Revo... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\No Gravity [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Onigiri wa... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Orb no Ino... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Parallel L... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Romantic g... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Ryuu to Ko... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Super Dand... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Symphony N... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Synchronic... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\THE iDOLMA... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\THE iDOLMA... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Thank You! [GENERATED]
[Error :com.fluto.takotako] Could not convert .\The Tower ... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\William Te... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Youthful C... [GENERATED]
[Error :com.fluto.takotako] Could not convert .\Yozakura S... [GENERATED]
And running cat LogOutput.log | grep Ignoring | sort
yields:
$ cat LogOutput.log | grep Ignoring | sort
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\01 Pop\Holomen Ondo
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\01 Pop\Onegai! Senorita
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\02 Anime\A Cruel Angel’s Thesis
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\02 Anime\Dai-chan Kazoe Uta
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\02 Anime\Gatchaman no Uta
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\02 Anime\NEXT LEVEL
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\02 Anime\last cross
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\04 Children and Folk\Oklahoma Mixer
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\04 Children and Folk\Pirameki Taisou Taiko de Metabo Yattsukero! no Maki
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\05 Variety\Night of Knights
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\06 Classical\Carmen Prelude
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\07 Game Music\Oodain
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\07 Game Music\Ridge Racer
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\08 Namco Original\Crazy Beauty
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\08 Namco Original\Garyoutensei
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\08 Namco Original\Issei Fuubi
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\08 Namco Original\Soroban 2000
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\08 Namco Original\Yokuderu 15300
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\01 Debut Memorial Live -Red Version-
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\02 Amami Haruka’s It’s A Live, A Live!
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\03 Kikuchi Makoto’s Night Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\04 Ami and Mami’s Miracle Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\05 Hagiwara Yukiho’s MY Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\06 Ganaha Hibiki Haisai! Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\07 Minase Iori-chan’s Live for the People
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\08 Hoshii Miki’s Honey Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\09 Takatsuki Yayoi’s Tryhard Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\10 Shijou Takene’s Ceremony
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\11 Kisaragi Chihaya’s Solo Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\12 Akizuki Ritsuko’s Magical World
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\13 Miura Azusa’s Solo Concert
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\14 Kotori’s Imaginary Theatre
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\15 First Anniversary Live 2006 Day 1
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\16 First Anniversary Live 2006 Day 2
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\17 Secret Night 2007
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\18 Secret Night 2008
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\19 SP Live “Missing Moon”
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\20 SP Live “Perfect Sun”
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\21 SP Live “Wandering Star”
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\22 SP Live “Project Fairy”
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\23 Special Medley -Seventh Digest-
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\24 ALLSTARS Commemoration Festival -Red Version-
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\25 Moment of Awakening
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\26 Tenth Memorial Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\27 Debut Memorial Live -Blue Version-
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\28 Azusa’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\29 Miki’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\30 Ritsuko’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\31 Chihaya’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\32 Takane’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\33 Yukiho’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\34 Makoto’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\35 Ami and Mami’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\36 Hibiki’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\37 Yayoi’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\38 Iori’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\39 Haruka’s Festival
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\40 THE iDOLM@STER 2 Live Day 1
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\41 THE iDOLM@STER 2 Live Day 2
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\42 ONE FOR ALL Union Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\43 First ALLSTAR LIVE
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\44 SF Live
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\45 Dress Up MAGIC DAY
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\46 Winter Festival 2014
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\47 ALLSTARS Commemoration Festival -Blue Version-
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\48 Taiko no Tatsujin Collaboration Festival 2015
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\49 A Promise
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\09 Live Festival Mode\50 A Sparking Thank You
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\10 Taiko Towers\Taiko Tower 01
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\10 Taiko Towers\Taiko Tower 04
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\01 Nijiiro 2022 Fifth Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\02 Nijiiro 2022 Fourth Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\03 Nijiiro 2022 Third Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\04 Nijiiro 2022 Second Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\05 Nijiiro 2022 First Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\06 Nijiiro 2022 Shodan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\07 Nijiiro 2022 Second Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\08 Nijiiro 2022 Third Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\09 Nijiiro 2022 Fourth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\10 Nijiiro 2022 Fifth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\11 Nijiiro 2022 Sixth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\12 Nijiiro 2022 Seventh Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\13 Nijiiro 2022 Eighth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\14 Nijiiro 2022 Ninth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\01 Nijiiro 2022 Version\15 Nijiiro 2022 Tenth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\01 Nijiiro 2021 Fifth Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\02 Nijiiro 2021 Fourth Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\03 Nijiiro 2021 Third Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\04 Nijiiro 2021 Second Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\05 Nijiiro 2021 First Kyuu
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\06 Nijiiro 2021 Shodan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\07 Nijiiro 2021 Second Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\08 Nijiiro 2021 Third Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\09 Nijiiro 2021 Fourth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\10 Nijiiro 2021 Fifth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\11 Nijiiro 2021 Sixth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\12 Nijiiro 2021 Seventh Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\13 Nijiiro 2021 Eighth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\14 Nijiiro 2021 Ninth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\15 Nijiiro 2021 Tenth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\16 Nijiiro 2021 Kurouto
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\17 Nijiiro 2021 Meijin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\18 Nijiiro 2021 Choujin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\02 Nijiiro 2021 Version\19 Nijiiro 2021 Tatsujin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\11 Nijiiro 2020 Sixth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\12 Nijiiro 2020 Seventh Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\13 Nijiiro 2020 Eighth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\14 Nijiiro 2020 Ninth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\15 Nijiiro 2020 Tenth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\16 Nijiiro 2020 Kurouto
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\17 Nijiiro 2020 Meijin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\18 Nijiiro 2020 Choujin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\03 Nijiiro 2020 Version\19 Nijiiro 2020 Tatsujin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\04 Green Version\21 Green Tenth Dan
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\04 Green Version\22 Green Kurouto
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\04 Green Version\23 Green Meijin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\04 Green Version\24 Green Choujin
[Warning:com.fluto.takotako] Ignoring C:\Users\viv\Documents\TakoTako\ESE\11 Dan Dojo\04 Green Version\25 Green Tatsujin
I isolated all listed tracks into their own folder, then deleted the conversion.json
files and tried again. Several of the songs successfully converted without any changes. I then repeated this again, and even more songs were correctly converted:
Finally, after 4 passes, I seemed to be left with a set of songs that could not be converted:
Audio path does not exist. Check WAVE field in TJA.
’
vs '
)TJA is invalid, branches do not have same measure count.
TJA Metadata is invalid, or points to invalid paths.
DEMOSTART
)SCOREINIT
/SCOREDIFF
, unsupported SCOREMODE
)Failed to create Fumens for ...
#START 2P
)System.DivideByZeroException: Attempted to divide by zero.
This issue is for debugging and fixing issues preventing these songs from converting.
.bin
files have a single byte that dictates how fast the soul gauge should increase.
I wrote a rough function to estimate this value:
Lines 194 to 198 in 84056ae
But this formula consistently underestimates the byte value, causing song failures even for DFCs.
Currently, the converter doesn't take into account branch commands (#BRANCHSTART
, #BRANCHEND
, #N
, #E
, #M
, #LEVELHOLD
, etc.), so branching songs can't be converted.
The tja2fumen
codebase already contains code to validate fumen files (.bin
). I used this code when creating my fumen writer. For each of the 1800+ charts in UM4, I read in the official .bin.
files, then wrote the parsed the data to .bin
files, then compared the input/output to see if they match.
But, this same code could be moved to a tests/
folder, and adapted to check certain TJA files against certain official fumens, to make sure the conversion is accurate when new changes are made.
In KatieFrogs' fumen parser, she parsed a specific note byte as item
:
tja2fumen/src/tja2fumen/parsers.py
Line 412 in 417bfe5
This byte has no parallel in TJA files, so I'm not sure how to set this byte when writing converted fumen data.
In #64, I added the ability to run tja2fumen
on .bin
charts, fixing the don/ka types based on timing, for previously-converted bins that don't have the correct don/ka values.
In theory, I could take this further, for example by checking for BPM changes between measures and re-computing the offset values. This should fix desync caused by the old tja2bin
, see: Fluto/TakoTako#16
I don't know whether this is wanted, though, so I will leave this for now unless someone specifically asks for it.
Currently, the converter doesn't take into account the #DELAY
command
TakoTako's ConvertTJA.exe
utility checks for specific logging messages to make sure that no errors have occurred. But, if a general Python exception is thrown (e.g. NotImplementedError
, ValueError
) without the specific keywords, then TakoTako just... won't print the error message to the log at all? Which is very unhelpful when something goes wrong.
So, tja2fumen
should probably attempt to mimic what tja2bin
does, so that it can function as a drop-in replacement for tja2bin
.
There is a single #LEVELHOLD
song in all of ESE: Shoutoku Taiko:
#SECTION
#BRANCHSTART r,5,6
#N
#LEVELHOLD
100000000100000000200000500000000008000000100200,
1000202210201120,
#E
100000000100000000200000500000000008000000100200,
1000202210201120,
#M
100000000100000000200000500000000008000000100200,
1000202210201120,
#SECTION
#BRANCHSTART r,7,8
#BRANCHEND
500000000008000000200200100000200200200200200200,
1010202210201020,
#SECTION
#BRANCHSTART r,4,5
#N
I don't really understand how this works yet, so I need to make sure this produces the correct fumen.
Currently, tja2fumen only converts the chart data and ignores the audio file. This is because TakoTako handles audio conversion already, and tja2fumen was originally just meant to be a replacement for tja2bin
.
But, we could consider expanding the scope of tja2fumen
to include audio conversion as well, so that TakoTako isn't needed for converting the song as a whole. This would be beneficial for people who want to convert songs for platforms that aren't TDMX/TakoTako.
This feature request is split into multiple sub-features, as there are multiple target audio formats that could be supported:
DDDDDD provided a song that had Course: HARD
instead of Course: Hard
. This shouldn't cause a failure, since it's such a simple thing to fix.
tja2fumen is naturally a bit slow because it's written in Python. It takes around ~0.35s to convert a TJA. Here are some sources of slowdown + potential improvements:
--onefile
. Using --onedir
causes a 50% speedup (0.34s -> 0.17s).bin
files in write_struct()
The first option seems like a good one to pursue for upstream packages. But, I'm not sure about whether it's worth it to pursue fixes for the latter issues.
(Going from 0.17s to 0.16s doesn't feel all that consequential? Even if someone converts the entirety of ESE (~2200 songs), they'll only go from 6m14s to 5m52s (-22s) That's somewhat significant, but the user will still have to wait ~6m either way.)
Sometimes TJA charters will exclude the branch when it is impossible to access. But, currently tja2fumen throws an error.
This project was originally based off of the fumen2osu.py
script written by KatieFrogs. That script uses camel case, so to keep things consistent while hacking away at the converter, I kept on using camel case.
But, I'd like to go through the project and convert everything to snake case instead, to keep things Pythonic.
Investigation to come...
The current logic works for hol6po
, which has the following condition:
tja2fumen/testing/data/hol6po.tja
Line 23 in a95b8e7
But Anzu no Uta has very strange conditions:
#BRANCHSTART p,0,0
#BRANCHSTART p,999,999
I assumed that these were supposed to be percentages from (0-100). But, what does 0% accuracy mean? And what does 999% accuracy mean? How should these conditions be written into the branchInfo
fumen bytes?
tl;dr I noticed that Ai Want U (that I converted in a big batch during #37) fell out of sync during a #BPMCHANGE
section.
This is a problem that tja2bin.exe
has, but tja2fumen.exe
has supposedly fixed.
Right before the first long stream, the KK pair of notes arrives very fast, and the song is out of sync after that.
#MEASURE 13/16
30000000100020001000000020000000
3000000010000000
#BPMCHANGE 43.5
#SCROLL 4
0220,
#BPMCHANGE 174
#MEASURE 4/4
#SCROLL 1
1222
1122
1112
1111,
The chart works fine in a TJAPlayer, so something is being calculated incorrectly with the BPMCHANGE commands here.
This is a similar but slightly different error compared to #1.
On the song YOAKE, the balloon duration is the correct length, but the positioning seems to be off, such that it overlaps with notes.
Right now, my converter assumes that OFFSET
directly corresponds to the second measure's fumenOffset
. See:
While this holds for the majority of cases, sometimes an ESE song will be off by anywhere between 0-25ms. Normally, I just correct the TJA file so that it matches the official fumen's OFFSET value.
But, what if I should be leaving the TJA offset values as-is? ((There may be some interaction with #BPMCHANGE
commands that cause OFFSET
to not line up with the second measure's fumenOffset
.))
So, I will need to see how these "wrong OFFSET" songs play on TJAPlayers, and compare that to how they play on TDMX, to make sure that my fumenOffset
calculations are correct.
Since TJA files use only a single number to represent dons and kas (1 and 2 respectively), I have only been writing a single type of don/ka to the converted .bin file.
However, official fumens actually have 3 types of dons and 2 types of kas. And, different types will be used depending on how the dons and kas are grouped together:
Theoretically, my converter could track if a note is part of a triplet/quad/etc. and write the different notes accordingly. But, it might be quite tricky to programmatically detect groupings of notes.
Maybe what I could do is track "time since last note". If the time decreases (i.e. notes are closer together), we enter a "grouping". If the time stays the same, then we're still within the grouping. If the time increases (i.e. notes are further apart), we have exited the grouping. But, I don't know how foolproof that is if we consider BPMCHANGE commands, etc. 🤔
This would:
song.measure
instead of song['measure']
)It fails for both tja2bin
and tja2fumen
, so this might be an issue on TakoTako's end? It may also be a chart error. Needs investigation!
Currently, the converter doesn't take into account P1/P2 commands (STYLE: Single
, STYLE: Double
, #START P1
, #START P2
, etc.)
Currently, the converter doesn't take into account barline commands (#BARLINEON
, #BARLINEOFF
)
Things to figure out:
.bin
format?I've implemented Pydantic support in viv/test-out-pydantic
, and it's uncovered a few bugs (yay!), but it incurs a fairly big performance hit for type validation. I don't really want to add such a slow down to production (it's pretty antithetical to #55), so I expect that I'll eventually settle on dataclasses instead? 🤔
There's a way to implement type conversion for dataclasses here: https://stackoverflow.com/a/54863733
I am Japanese, so I go through a translator.
Please understand that there may be strange English.
(For some reason I could not attach the zip file, so I am attaching it as a txt.)
I have a request for corrections regarding the notes in the file you attached. When I convert the attached file, the first 16 beats are "ドドドド..." but the following 24 beats become "ドコドコ" instead. These 24 beats should actually be "ドドドド..."
Even in sections where the BPM changes and the SCROLL becomes 0.56 or 0.67, it still becomes "ドコドコ..." It should also be "ドドドド..." in these sections.
Additionally, I would like to request the addition of a command to change the notes to any desired characters. Here's an example:
d = ド
o = コ
dn = ドン
ka = カッ
k = カ
dodn = ドコドン
dddn = ドドドン
kkka = カカカッ
By adding this functionality, it would allow for the creation of a flexible custom fumen. I would greatly appreciate it if you could consider implementing these changes.
Songs with basic usage (#SECTION before #BRANCHSTART) convert OK!
However, I have a feeling I don't cover every case... for example, take the ESE chart for Taiko Time:
#BRANCHSTART p,80,98.5
#N
#SECTION
#GOGOSTART
#BPMCHANGE 170
[...]
#E
#SECTION
#GOGOSTART
#BPMCHANGE 170
[...]
#M
#GOGOSTART
#SECTION
#BPMCHANGE 170
[...]
#BRANCHSTART p,80,90
Here, #SECTION comes after the #N/#E/#M commands, and there are two different #BRANCHSTART p
commands. So, I'm very curious what the branch_info
bytes will be in an official fumen, and whether my converter produces the correct bytes.
Other songs to test:
My question is: Do any custom charters do weird things with #SECTION/#BRANCHSTART? Like, for example:
#BRANCHSTART r
with no #SECTION
so that there is a cumulative drumroll count#BRANCHSTART p
with no #SECTION
so that the percentage is an average of all #BRANCHSTART
commandsOr, is this behavior so niche that no one ever bothers?
In the short-term, this should be an incredibly simple change, since TDMX only cares about the last value (shinuti). (value.split(",")[-1]
)
In the long term, we may want to add a way for users to specify which of the values they want encoded into their fumens.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.