from classes import Message on_file = r'c:\Sync\Code\Python\Pyano-release\src\experiments\truths\fur_elise_b_14000ms_on.txt' output_path = r'c:\Sync\Code\Python\Pyano-release\src\experiments\truths\fur_elise_b_13500ms_on.txt' accelerate_factor = 13.5 / 14 # <1 for shorter duration (faster) msgs = Message.construct_many_from_file(on_file) tempoed = Message.transform_to_tempo(msgs, accelerate_factor * 100) with open(output_path, mode="w") as f: for msg in tempoed: msg_line = msg.to_line() f.write(msg_line)
def get_on_off_pairs(_on_msgs: List[Message], _off_msgs: List[Message]) -> List[Tuple[Message, Message]]: _pairs = [] for _on_msg in _on_msgs: _matching_off_msg = next((_off_msg for _off_msg in _off_msgs if (_off_msg.note == _on_msg.note and _off_msg.time > _on_msg.time)), None) if _matching_off_msg is not None: _off_msgs.remove(_matching_off_msg) _pairs.append((_on_msg, _matching_off_msg)) return _pairs on_msgs: List[Message] = Message.normalize_chords_in_file(on_path) off_msgs: List[Message] = Message.construct_many_from_file(off_path) on_off_pairs = get_on_off_pairs(on_msgs, off_msgs[:]) for i, (on, off) in enumerate(on_off_pairs): for j, (next_on, _) in enumerate(on_off_pairs[i + 1:], i + 1): if next_on.note == on.note and next_on.time < off.time: warning = "\n".join([f"ON time and matching OFF time don't make sense:", f"OFF happened only after ON happened TWICE.", f"{on_path = }, {off_path = }", f"1st ON: {on}, 2nd ON: {next_on}, 1st OFF: {off}"]) logger.log_thin(warning, should_pf=False, title="WARNING") on_off_chained = it.chain.from_iterable(on_off_pairs) on_off_sorted = sorted(on_off_chained, key=lambda m: m.time) with open(base_path, mode="w") as base: base.writelines(map(lambda m: m.to_line(), on_off_sorted))