Skip to content

Commit c7b52fa

Browse files
committed
v0.7.0: MVP!!
- unbiasing operation is live in both GUI and CLI - GUI allows downselection of charts in the results table - I have some cleanup and optimization to do...
1 parent 3c17802 commit c7b52fa

File tree

3 files changed

+89
-14
lines changed

3 files changed

+89
-14
lines changed

nine-or-null/nine_or_null/__init__.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
_VERSION = '0.6.0'
1+
_VERSION = '0.7.0'
22

33
from collections.abc import Container
44
import csv
@@ -53,7 +53,8 @@
5353
'kernel_target': 'Choose whether to convolve with the beat digest ("digest") or the spectral accumulator ("accumulator").',
5454
'kernel_type': 'Choose a kernel that responds to a rising edge ("rising") or local loudness ("loudest").',
5555
'magic_offset_ms': '[ms] Add a constant value to the time of maximum kernel response. I haven\'t tracked the cause of this down yet. Might be related to attack perception?',
56-
'full_spectrogram': 'Analyze the full spectrogram in one go - this will make the program run slower...'
56+
'full_spectrogram': 'Analyze the full spectrogram in one go - this will make the program run slower...',
57+
'to_paradigm': 'Choose a target paradigm for the pack unbiasing step. This will modify your simfiles!'
5758
}
5859

5960
class FloatRange(Container):
@@ -94,7 +95,8 @@ class KernelTarget(IntEnum):
9495
'kernel_target': KernelTarget.DIGEST,
9596
'kernel_type': BiasKernel.RISING,
9697
'magic_offset_ms': 0.0,
97-
'full_spectrogram': False
98+
'full_spectrogram': False,
99+
'to_paradigm': None
98100
}
99101

100102
def timestamp():
@@ -735,8 +737,12 @@ def batch_adjust(fingerprints, target_bias, **params):
735737
raise Exception(f'What paradigm does "{target_bias}" represent?')
736738

737739
logging.info(f'Converting charts with +9ms (In The Groove) bias to null (StepMania)...')
738-
for k, v in fingerprints.items():
739-
if guess_paradigm(v['bias_result'], **params) == source_bias:
740+
affect_rows = params.get('affect_rows')
741+
for i, k in enumerate(fingerprints):
742+
if affect_rows is not None and i not in affect_rows:
743+
continue
744+
current_paradigm = fingerprints[k].get('bias_adjust', guess_paradigm(fingerprints[k]['bias_result'], **params))
745+
if current_paradigm == source_bias:
740746
logging.info(f'\t{k}')
741747
# Open simfile
742748
p, abbr = os.path.split(k)
@@ -756,15 +762,28 @@ def batch_adjust(fingerprints, target_bias, **params):
756762
) as sm:
757763
try:
758764
if abbr == '*':
759-
logging.info(f'\t{float(sm.offset):6.3f} -> {float(sm.offset) + bias_shift:6.3f}: {k}')
760-
sm.offset = f'{float(sm.offset) + bias_shift:0.3f}'
765+
new_offset = float(sm.offset) + bias_shift
766+
logging.info(f'\t{float(sm.offset):6.3f} -> {new_offset:6.3f}: {k}')
767+
sm.offset = f'{new_offset:0.3f}'
761768
else:
762769
steps_type, chart_slot, chart_index = slot_expansion(abbr)
763770
if chart_index is None:
764771
chart_index = [i for i, c in enumerate(sm.charts) if c['STEPSTYPE'] == steps_type and c['DIFFICULTY'] == chart_slot][0]
765772
prev_offset = float(sm.charts[chart_index]['OFFSET'])
766-
logging.info(f'\t{prev_offset:6.3f} -> {prev_offset + bias_shift:6.3f}: {k}')
767-
sm.charts[chart_index]['OFFSET'] = f'{prev_offset + bias_shift:0.3f}'
773+
new_offset = prev_offset + bias_shift
774+
logging.info(f'\t{prev_offset:6.3f} -> {new_offset:6.3f}: {k}')
775+
sm.charts[chart_index]['OFFSET'] = f'{new_offset:0.3f}'
776+
fingerprints[k]['bias_result'] += bias_shift * 1e3
777+
fingerprints[k]['bias_adjust'] = target_bias
778+
779+
gui_hook = params.get('gui_hook')
780+
if gui_hook is not None:
781+
font_cell = gui_hook.grid_results.GetCellFont(i, 0)
782+
gui_hook.grid_results.SetCellValue(i, 2, f"{fingerprints[k]['bias_result']:+0.1f}")
783+
gui_hook.grid_results.SetCellValue(i, 3, target_bias)
784+
for j in range(gui_hook.grid_results.GetNumberCols()):
785+
gui_hook.grid_results.SetCellFont(i, j, font_cell.MakeBold())
786+
768787

769788
except Exception as e:
770789
raise Exception(f'Something happened while adjusting bias for {test_simfile_path}') from e

nine-or-null/nine_or_null/cli.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import logging
77
import textwrap
88

9-
from . import FloatRange, BiasKernel, KernelTarget, batch_process, guess_paradigm, timestamp, _VERSION, _CSV_FIELDNAMES, _PARAMETERS
9+
from . import FloatRange, BiasKernel, KernelTarget, batch_process, batch_adjust, guess_paradigm, timestamp, _VERSION, _CSV_FIELDNAMES, _PARAMETERS
1010
from .gui import start_gui
1111

1212
def start_cli():
@@ -38,6 +38,11 @@ def start_cli():
3838
parser.add_argument('-r', '--report_path',
3939
help=_PARAMETERS['report_path']
4040
)
41+
parser.add_argument('-p', '--to-paradigm',
42+
required=False,
43+
choices=['null', '+9ms'],
44+
help=_PARAMETERS['to_paradigm'],
45+
)
4146
parser.add_argument('--consider_null', '--cn',
4247
help=_PARAMETERS['consider_null'],
4348
action='store_false',
@@ -160,6 +165,13 @@ def start_cli():
160165

161166
fingerprints = batch_process(**params)
162167

168+
if params['to_paradigm'] is not None:
169+
logging.info(f"Performing unbiasing step (target paradigm: {params['to_paradigm']})...")
170+
batch_adjust(fingerprints, params['to_paradigm'], **params)
171+
logging.info(f"Performing unbiasing step (target paradigm: {params['to_paradigm']})...Done!")
172+
else:
173+
logging.info('Not performing unbiasing step')
174+
163175
logging.info('-' * 72)
164176
logging.info(f"Sync bias report: {len(fingerprints)} fingerprints processed in {root_path}")
165177

nine-or-null/nine_or_null/gui.py

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ def __init__(self, *args, **kwargs):
351351
)
352352
self.panel_plot.canvas = FigureCanvas(self.panel_main, -1, self.panel_plot.figure)
353353
self.panel_plot.canvas.SetMinSize((180, 402))
354-
self.panel_plot.canvas.SetToolTip(wx.ToolTip('Double-click on a result row to examine the audio fingerprint.\n(These plots are also stored in the report directory)'))
354+
self.panel_plot.canvas.SetToolTip(wx.ToolTip('Double-click on a result row to examine the audio fingerprint.\n(These plots are also stored in the report directory)\n\nTo limit bias adjustment to specific charts, select their cells or rows in the table.'))
355355

356356
# --------------------------------------------------------------
357357
# Menu and status bar
@@ -554,7 +554,7 @@ def OnProcess(self, event):
554554

555555
paradigm_count = {}
556556
for paradigm in ['+9ms', 'null', '????']:
557-
paradigm_map = {k: v for k, v in self.fingerprints.items() if guess_paradigm(v['bias_result']) == paradigm}
557+
paradigm_map = {k: v for k, v in self.fingerprints.items() if guess_paradigm(v['bias_result'], **params) == paradigm}
558558
logging.info(f"Charts sync'd to {paradigm}: {len(paradigm_map)}")
559559
for k, v in paradigm_map.items():
560560
logging.info(f"\t{k}")
@@ -604,27 +604,71 @@ def OnClickResultRow(self, event):
604604

605605
def OnConvert9msToNull(self, event):
606606
logging.info('Conversion from +9ms to null')
607+
print([b for b in self.grid_results.GetSelectedBlocks()])
608+
affect_rows = []
609+
for b in self.grid_results.GetSelectedBlocks():
610+
affect_rows += list(range(b.GetTopRow(), b.GetBottomRow()+1))
611+
if len(affect_rows) == 0:
612+
affect_rows = None
613+
print(affect_rows)
607614
params = self.collect_parameters()
608615

609616
if wx.MessageBox('Are you sure you want to convert all charts with +9ms (In The Groove) bias to null (StepMania)?',
610617
caption='+9ms or Null?',
611618
style=wx.YES_NO
612619
) == wx.YES:
613-
batch_adjust(self.fingerprints, 'null', **params)
620+
batch_adjust(self.fingerprints, 'null', gui_hook=self, affect_rows=affect_rows, **params)
614621
else:
615622
logging.info('Canceled conversion from +9ms to null')
616623

624+
paradigm_count = {}
625+
for paradigm in ['+9ms', 'null', '????']:
626+
paradigm_map = {k: v for k, v in self.fingerprints.items() if guess_paradigm(v['bias_result'], **params) == paradigm}
627+
logging.info(f"Charts sync'd to {paradigm}: {len(paradigm_map)}")
628+
for k, v in paradigm_map.items():
629+
logging.info(f"\t{k}")
630+
logging.info(f"\t\tderived sync bias = {v['bias_result']:+0.1f} ms")
631+
paradigm_count[paradigm] = len(paradigm_map)
632+
633+
if params['consider_null']:
634+
self.entry_null.SetValue(f"{paradigm_count['null']}")
635+
if params['consider_p9ms']:
636+
self.entry_p9ms.SetValue(f"{paradigm_count['+9ms']}")
637+
self.entry_unknown.SetValue( f"{paradigm_count['????']}")
638+
617639
def OnConvertNullTo9ms(self, event):
618640
logging.info('Conversion from null to +9ms')
641+
print([b for b in self.grid_results.GetSelectedBlocks()])
642+
affect_rows = []
643+
for b in self.grid_results.GetSelectedBlocks():
644+
affect_rows += list(range(b.GetTopRow(), b.GetBottomRow()+1))
645+
if len(affect_rows) == 0:
646+
affect_rows = None
647+
print(affect_rows)
619648
params = self.collect_parameters()
620649

621650
if wx.MessageBox('Are you sure you want to convert all charts with null (StepMania) bias to +9ms (In The Groove)?',
622651
caption='+9ms or Null?',
623652
style=wx.YES_NO
624653
) == wx.YES:
625-
batch_adjust(self.fingerprints, '+9ms', **params)
654+
batch_adjust(self.fingerprints, '+9ms', gui_hook=self, affect_rows=affect_rows, **params)
626655
else:
627656
logging.info('Canceled conversion from null to +9ms')
657+
658+
paradigm_count = {}
659+
for paradigm in ['+9ms', 'null', '????']:
660+
paradigm_map = {k: v for k, v in self.fingerprints.items() if guess_paradigm(v['bias_result'], **params) == paradigm}
661+
logging.info(f"Charts sync'd to {paradigm}: {len(paradigm_map)}")
662+
for k, v in paradigm_map.items():
663+
logging.info(f"\t{k}")
664+
logging.info(f"\t\tderived sync bias = {v['bias_result']:+0.1f} ms")
665+
paradigm_count[paradigm] = len(paradigm_map)
666+
667+
if params['consider_null']:
668+
self.entry_null.SetValue(f"{paradigm_count['null']}")
669+
if params['consider_p9ms']:
670+
self.entry_p9ms.SetValue(f"{paradigm_count['+9ms']}")
671+
self.entry_unknown.SetValue( f"{paradigm_count['????']}")
628672

629673
def OnExit(self, event):
630674
self.Close(True)

0 commit comments

Comments
 (0)