Coder Social home page Coder Social logo

vivaria / tja2fumen Goto Github PK

View Code? Open in Web Editor NEW
11.0 2.0 1.0 715 KB

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

Python 100.00%
fumen taiko tja tatsujin

tja2fumen's People

Contributors

vivaria avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

sakurada0291

tja2fumen's Issues

Drumroll end timing is sometimes incorrect

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,

Speed up performance of `tja2fumen` when converting many files at once

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:

  • Distributing tja2fumen as a directory rather than a single exe (may be complicated for users)
  • Allowing to pass a folder to tja2fumen then converting any TJAs/BINs within the folder (potentially dangerous as users may accidentally pass a folder with non-fumen .bin files)

Investigate simpler method for computing HP/soul gauge bytes

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.

Timing windows are incorrect for easier difficulties

The timing windows for fumens are currently hardcoded here:

b000_b431_timing_windows: Tuple[float, ...] = (25.025, 75.075, 108.422)*36

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.

Debug conversion failures in ESE using latest version of TakoTako (Attempt 2)

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.

Fold `preprocessTJAMeasures` into `parseTJA` function

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.

Fix how the header bytes are set (using new information)

Currently, I set the header bytes based on reverse engineered values from my own research, and from observing what tja2bin sets:

# The next 80 bytes of fumen headers contain mostly 0s, with a few non-zero bytes thrown in
sampleHeaderMetadata = [0] * 80
# The following bytes are hardcoded by tja2bin.exe (implying they have little/no effect on how the song is parsed)
sampleHeaderMetadata[4] = 16
sampleHeaderMetadata[5] = 39
sampleHeaderMetadata[12] = 10

However, there are many gaps in my understanding, e.g.:

# 7. <padding>
# Notes:
# * For the vast majority (99%) of charts, bytes 21, 22, and 23 have the values (1, 1, 1)
# * For a small minority of charts (~100), one or both of bytes 30/34 will be 0 instead of 1
# Given that most platforms use the values (1, 1, 1), and unique values are very platform-specific,
# I'm going to stick with (1, 1, 1) when it comes to converting TJA files to fumens.

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.

Intentionally fail early when a song has more measures than TDMX's limit (>300)

@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.

Ura Oni songs fail to load correctly into TakoTako

Some background:

  • According to TakoTako, tja2bin can't convert ura oni songs. (This isn't actually true!)
  • But, nonetheless, TakoTako has some custom logic in 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.

Initial offset timing is sometimes incorrect

I make an assumption that TJA offset value corresponds to the second measure:

# Apply the change in offset to the overall offset to get the measure offset
# This is a bodge I'm using just for Rokuchounen to Ichiya Monogatari
# Its first measure happens _before_ the first barline
# So, we actually need to shift the offsets by 1 to get everything to line up
if idx_m == 0:
# Compute fumen offset for the first measure that has a barline
fumenOffset = float(tja['metadata']['offset']) * -1000
measureFumen['fumenOffset'] = fumenOffset - measureDuration
else:
# Just refer back to the previous offset
measureOffsetPrev = tjaConverted['measures'][-1]['fumenOffset']
measureFumen['fumenOffset'] = measureOffsetPrev + measureDurationNext
measureDurationNext = measureDuration

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.

Debug `BPMCHANGE` measure duration adjustment in Aleph-0 chart

The desync occurs specifically at measure 34 in the chart:

image

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:

image

In my converter, when a BPMCHANGE occurs, the previous measure's duration is adjusted.

measureTJANext = branch[idx_m + 1]
if measureTJA['bpm'] != measureTJANext['bpm']:
measureDuration -= (4 * 60_000 * ((1 / measureTJANext['bpm']) - (1 / measureTJA['bpm'])))

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.

Improve error feedback for common TJA transcription errors

Many charts have common transcription errors, including:

  • Typos in command names
  • Missing/extra measures in one branch but not others
  • Incorrect usage of mid-measure commands
  • Missing scoreInit/scoreDiff values
  • Missing metadata for STYLE:SINGLE and STYLE:DOUBLE charts

It 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.

Debug conversion failures in ESE using latest version of TakoTako (Attempt 1)

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:

  • Ai to Jouzai no Mori/
  • Aloft in the wind/
  • Black Rose Apostle/
  • Classical Medley -Sports Day Version-/
  • Crazy Beauty/
  • Cycle of Rebirth/
  • Dragon of Ice ~Kooryu~/
  • Famicom Medley/
  • Hataraku 2000/
  • Heat Haze Shadow 2/
  • Karakuri Kairou/
  • Kokoro Korogase!/
  • Mahoujin -Summon Delta-/
  • Music Revolver/
  • No Gravity/
  • Parallel Lollipop/
  • Ryuu to Kokuen no Himegimi/
  • Synchronica Airlines/
  • Thank You!/
  • The Tower of Druaga Medley/

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.
    • A Cruel Angel’s Thesis/ ( vs ')
  • TJA is invalid, branches do not have same measure count.
    • Angel Dream/
    • Anzu no Uta/
    • Dai-chan Kazoe Uta/
    • GALAXY EXPRESS 999/
    • Gatchaman no Uta/
    • NEXT LEVEL/
    • Night of Knights/
    • Oklahoma Mixer/
    • Onegai! Senorita/
    • Oodain/
    • Pirameki Taisou Taiko de Metabo Yattsukero! no Maki/
    • Romantic ga Tomaranai/
    • Symphony No. 05 “Fate”/
    • THE iDOLM@STER/
    • William Tell Overture/
    • Yozakura Shanikusai/
    • last cross/
  • TJA Metadata is invalid, or points to invalid paths.
    • Holomen Ondo/ (Empty DEMOSTART)
    • Ridge Racer/ (Multiple issues: Empty SCOREINIT/SCOREDIFF, unsupported SCOREMODE)
  • Failed to create Fumens for ...
    • tja2fumen errors
      • Carmen Prelude/ (#START 2P)
      • Soroban 2000/ (Measure count mismatch)
      • Youthful Coaster (Missing balloon metadata)
    • TakoTako errors
      • Ghost Rule/
      • Audio de Ka!/
      • Hinaru Medjed no Hinaru Yuu’utsu/
      • Ikazuchi/
      • Kamisama no Iutoori ni/
      • Mirumiru ~Mirai Mieru~/
      • Onigiri wa Doko Kashira♪/
      • Orb no Inori/
      • Super DandD ~Kanzen ni Lead Shite I-my-me~/
  • Song timeouts
    • Got more raves/
    • Yokuderu 15300/
  • System.DivideByZeroException: Attempted to divide by zero.
    • Garyoutensei/
    • Issei Fuubi/

This issue is for debugging and fixing issues preventing these songs from converting.

Fix inaccurate Soul Gauge byte value estimation

.bin files have a single byte that dictates how fast the soul gauge should increase.

I wrote a rough function to estimate this value:

def computeSoulGaugeByte(n_notes):
# I don't think this is fully accurate. It doesn't work for non-Oni songs, and it's usually off by a bit.
A = -85.548628
B = 44.780199
return round(A+B*math.log(n_notes))

But this formula consistently underestimates the byte value, causing song failures even for DFCs.

Add support for branch commands

Currently, the converter doesn't take into account branch commands (#BRANCHSTART, #BRANCHEND, #N, #E, #M, #LEVELHOLD, etc.), so branching songs can't be converted.

Add test suite to verify TJA conversion accuracy

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.

Add feature to fix desync from BPMCHANGE in songs previously converted by `tja2bin`

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.

Add proper logging to match expectations from TakoTako

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.

Fix `#LEVELHOLD` behavior for Shoutoku Taiko

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.

Add support for audio conversion

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:

  • Add support for XB1 audio conversion (ACB/Criware)
  • Add support for Nijiro audio conversion (nus3bank)

Investigate ways to optimize the performance of `tja2fumen`

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:

  • PyInstaller overhead
    • PyInstaller --onefile. Using --onedir causes a 50% speedup (0.34s -> 0.17s)
  • Only about ~0.05s of that is tja2fumen itself, with the following bottlenecks:
    • 0.01s is spent on reading values from the CSV LUTs
    • 0.005s is spent on regex matching
    • 0.005s is spent writing values to .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.)

Switch from `camelCase` to `snake_case`

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.

Test additional `#BRANCHSTART p` songs to capture untested behavior

The current logic works for hol6po, which has the following condition:

#BRANCHSTART p,86,94

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?

TakoTako falls back to `tja2bin.exe` sometimes, even when `tja2fumen.exe` is present

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.

Balloons sometimes overlap with notes

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.

Does `OFFSET` really correspond to the second measure's `fumenOffset`?

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.

Use more specific don/ka types when writing to fumen (ド, コ, ドン, カッ, カ)

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:

image

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. 🤔

Add support for barline commands

Currently, the converter doesn't take into account barline commands (#BARLINEON, #BARLINEOFF)

Things to figure out:

  • Are these commands even supported by the .bin format?
  • Do these commands affect the initial offset of songs?

Misalignment of notes

I don't know the exact cause, but the notes are shifting more and more as time goes on.
The attached images are the part at the beginning and end of the performance.
The upper part of the image is the fumen converted using tja2fumen and the lower part is the original fumen.
Start00
End00

Convert song classes into either Pydantic `BaseModels` or `dataclasses`

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

SENOTES defects and suggestions for additional features

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.

senotes_test.txt

Expand test suite to cover different combinations of `#SECTION` and `#BRANCHSTART`

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:

  • Taiko Time
  • Dragon Night (has #BRANCHSTART but no #SECTION... though, song has percentage conditions, so I guess #SECTION doesn't matter?)
  • Soroban 2000 (has #BRANCHSTART p,-1,0.0001)

My question is: Do any custom charters do weird things with #SECTION/#BRANCHSTART? Like, for example:

  • Have #BRANCHSTART r with no #SECTION so that there is a cumulative drumroll count
  • Have #BRANCHSTART p with no #SECTION so that the percentage is an average of all #BRANCHSTART commands

Or, is this behavior so niche that no one ever bothers?

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.