#!/usr/bin/env python3 """Convert .track files from beat-based to unit-less timing.""" import re import sys def convert_beat_to_unit(beat_str): """Convert beat value to unit-less (beat / 4).""" beat = float(beat_str) unit = beat / 4.0 return f"{unit:.2f}" def process_line(line): """Process a single line, converting beat values.""" line = line.rstrip('\n') # Skip comments and empty lines if not line.strip() or line.strip().startswith('#'): return line # PATTERN line - add LENGTH 1.0 if line.strip().startswith('PATTERN '): # Check if LENGTH already exists if ' LENGTH ' in line: return line parts = line.split() if len(parts) >= 2: return f"PATTERN {parts[1]} LENGTH 1.0" return line # Event line (starts with a number) match = re.match(r'^(\s*)([0-9.]+),\s*(.+)$', line) if match: indent, beat_str, rest = match.groups() unit_str = convert_beat_to_unit(beat_str) return f"{indent}{unit_str}, {rest}" return line def main(): if len(sys.argv) != 3: print(f"Usage: {sys.argv[0]} ") sys.exit(1) input_file = sys.argv[1] output_file = sys.argv[2] with open(input_file, 'r') as f: lines = f.readlines() # Add header comment about timing output_lines = [] output_lines.append("# Enhanced Demo Track - Progressive buildup with varied percussion\n") output_lines.append("# Features acceleration/deceleration with diverse samples and melodic progression\n") output_lines.append("#\n") output_lines.append("# TIMING: Unit-less (1 unit = 4 beats at 120 BPM = 2 seconds)\n") output_lines.append("# Pattern events use unit-less time (0.0-1.0 for 4-beat pattern)\n") output_lines.append("# Score triggers use unit-less time\n") # Skip old header lines start_idx = 0 for i, line in enumerate(lines): if line.strip() and not line.strip().startswith('#'): start_idx = i break # Process rest of file for line in lines[start_idx:]: output_lines.append(process_line(line) + '\n') with open(output_file, 'w') as f: f.writelines(output_lines) print(f"Converted {input_file} -> {output_file}") if __name__ == '__main__': main()