From 52827f1abc7a6ea8d64708c5976d1ec5a5f2bbe3 Mon Sep 17 00:00:00 2001 From: Viv Date: Sun, 25 Jun 2023 12:01:27 -0400 Subject: [PATCH] Add support for `#BARLINE` commands Fixes #3. Necessary to get `mikdp` test to pass. --- src/tja2fumen/converters.py | 21 ++++++++++++--------- src/tja2fumen/parsers.py | 4 ++-- src/tja2fumen/writers.py | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/tja2fumen/converters.py b/src/tja2fumen/converters.py index 7aac83a..31f076e 100644 --- a/src/tja2fumen/converters.py +++ b/src/tja2fumen/converters.py @@ -11,7 +11,7 @@ default_measure = { 'bpm': 0.0, 'fumenOffset': 0.0, 'gogo': False, - 'hidden': True, + 'barline': True, 'padding1': 0, 'branchInfo': [-1, -1, -1, -1, -1, -1], 'padding2': 0, @@ -42,6 +42,7 @@ def preprocessTJAMeasures(tja): currentBPM = 0 currentScroll = 1.0 currentGogo = False + currentBarline = True measuresCorrected = [] for measure in tja['measures']: @@ -63,7 +64,7 @@ def preprocessTJAMeasures(tja): combined.append(notes.pop(0)) # Step 2: Split measure into submeasure - measure_cur = {'bpm': currentBPM, 'scroll': currentScroll, 'gogo': currentGogo, + measure_cur = {'bpm': currentBPM, 'scroll': currentScroll, 'gogo': currentGogo, 'barline': currentBarline, 'subdivisions': len(measure['data']), 'pos_start': 0, 'pos_end': 0, 'time_sig': measure['length'], 'data': []} for data in combined: @@ -88,7 +89,8 @@ def preprocessTJAMeasures(tja): currentGogo = bool(int(data['value'])) measure_cur['gogo'] = currentGogo elif data['type'] == 'barline': - pass + currentBarline = bool(int(data['value'])) + measure_cur['barline'] = currentBarline else: print(f"Unexpected event type: {data['type']}") measure_cur['pos_end'] = len(measure['data']) @@ -136,13 +138,14 @@ def convertTJAToFumen(tja): measureFumen['fumenOffset'] = measureOffsetPrev + measureDurationPrev measureDurationPrev = measureDuration - # Best guess at what 'hidden' status means for each measure: - # - 'True' means the measure lands on a barline (i.e. most measures) - # - 'False' means that the measure is between barlines. For example: - # 1. Measures before the first barline + # Best guess at what 'barline' status means for each measure: + # - 'True' means the measure lands on a barline (i.e. most measures), and thus barline should be shown + # - 'False' means that the measure doesn't land on a barline, and thus barline should be hidden. + # For example: + # 1. Measures where #BARLINEOFF has been set # 2. Sub-measures that don't fall on the barline - if idx_m == 0 or (measureRatio != 1.0 and measureTJA['pos_start'] != 0): - measureFumen['hidden'] = False + if measureTJA['barline'] is False or (measureRatio != 1.0 and measureTJA['pos_start'] != 0): + measureFumen['barline'] = False # Create note dictionaries based on TJA measure data (containing 0's plus 1/2/3/4/etc. for notes) note_counter = 0 diff --git a/src/tja2fumen/parsers.py b/src/tja2fumen/parsers.py index b43a892..7937f0c 100644 --- a/src/tja2fumen/parsers.py +++ b/src/tja2fumen/parsers.py @@ -346,7 +346,7 @@ def readFumen(fumenFile, byteOrder=None, debug=False): # - 'f': BPM (represented by one float (4 bytes)) # - 'f': fumenOffset (represented by one float (4 bytes)) # - 'B': gogo (represented by one unsigned char (1 byte)) - # - 'B': hidden (represented by one unsigned char (1 byte)) + # - 'B': barline (represented by one unsigned char (1 byte)) # - 'H': (represented by one unsigned short (2 bytes)) # - 'iiiiii': branchInfo (represented by six integers (24 bytes)) # - 'i': (represented by one integer (4 bytes) @@ -363,7 +363,7 @@ def readFumen(fumenFile, byteOrder=None, debug=False): # measure["offset"] = ((prev["offset"] + measure["fumenOffset"] + 240000) / # (measure["bpm"] - prev["fumenOffset"] - 240000 / prev["bpm"])) measure["gogo"] = getBool(measureStruct[2]) - measure["hidden"] = getBool(measureStruct[3]) + measure["barline"] = getBool(measureStruct[3]) measure["padding1"] = measureStruct[4] measure["branchInfo"] = list(measureStruct[5:11]) measure["padding2"] = measureStruct[11] diff --git a/src/tja2fumen/writers.py b/src/tja2fumen/writers.py index f065c0f..712ebcb 100644 --- a/src/tja2fumen/writers.py +++ b/src/tja2fumen/writers.py @@ -35,7 +35,7 @@ def writeFumen(file, song): file.seek(0x208) for measureNumber in range(song['length']): measure = song['measures'][measureNumber] - measureStruct = [measure['bpm'], measure['fumenOffset'], int(measure['gogo']), int(measure['hidden'])] + measureStruct = [measure['bpm'], measure['fumenOffset'], int(measure['gogo']), int(measure['barline'])] measureStruct.extend([measure['padding1']] + measure['branchInfo'] + [measure['padding2']]) writeStruct(file, order, format_string="ffBBHiiiiiii", value_list=measureStruct)