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)
Example #2
0
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))