#!/usr/bin/env python3 """ Test script to verify the application components work without launching GUI. """ import sys import os # Add the project root to Python path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) def test_core_modules(): """Test core application modules""" print("Testing core modules...") try: from core.midi_channel_manager import MIDIChannelManager channel_manager = MIDIChannelManager() print(" - MIDI Channel Manager: OK") from core.volume_pattern_engine import VolumePatternEngine volume_engine = VolumePatternEngine() print(" - Volume Pattern Engine: OK") from core.synth_router import SynthRouter synth_router = SynthRouter(channel_manager) print(" - Synth Router: OK") from simulator.simulator_engine import SimulatorEngine simulator = SimulatorEngine() print(" - Simulator Engine: OK") from core.output_manager import OutputManager output_manager = OutputManager(simulator) print(" - Output Manager: OK") from core.arpeggiator_engine import ArpeggiatorEngine arpeggiator = ArpeggiatorEngine(channel_manager, synth_router, volume_engine, output_manager) print(" - Arpeggiator Engine: OK") return True, (channel_manager, volume_engine, synth_router, simulator, output_manager, arpeggiator) except Exception as e: print(f" - Error: {e}") import traceback traceback.print_exc() return False, None def test_functionality(components): """Test basic functionality""" print("\nTesting functionality...") channel_manager, volume_engine, synth_router, simulator, output_manager, arpeggiator = components try: # Test channel manager channel_manager.set_active_synth_count(4) channel_manager.set_channel_instrument(1, 10) # Drum kit print(" - Channel management: OK") # Test volume patterns volume_engine.set_pattern("swell") volume_engine.set_pattern_speed(1.5) volumes = volume_engine.get_all_channel_volumes(4) print(f" - Volume patterns: OK (generated {len(volumes)} channel volumes)") # Test arpeggiator arpeggiator.set_root_note(60) # Middle C arpeggiator.set_scale("major") arpeggiator.set_pattern_type("up") arpeggiator.set_tempo(120) print(" - Arpeggiator settings: OK") # Test note handling (without starting playback) arpeggiator.note_on(60) # C arpeggiator.note_on(64) # E arpeggiator.note_on(67) # G print(f" - Note input: OK (holding {len(arpeggiator.held_notes)} notes)") # Test simulator simulator.play_note(1, 60, 80) simulator.stop_note(1, 60) print(" - Simulator playback: OK") return True except Exception as e: print(f" - Functionality error: {e}") import traceback traceback.print_exc() return False def test_maschine_integration(): """Test Maschine integration (without actual hardware)""" print("\nTesting Maschine integration...") try: from maschine.maschine_interface import MaschineInterface from maschine.maschine_controller import MaschineController # Note: This won't actually connect without hardware maschine_interface = MaschineInterface() print(" - Maschine Interface: OK") # Test finding devices (will return empty list without hardware) inputs, outputs = maschine_interface.find_maschine_devices() print(f" - Device detection: OK (found {len(inputs)} inputs, {len(outputs)} outputs)") return True except Exception as e: print(f" - Maschine integration error: {e}") return False def main(): """Run all tests""" print("MIDI Arpeggiator - Application Test") print("=" * 40) # Test core modules success, components = test_core_modules() if not success: print("\nCore module test failed!") return 1 # Test functionality if not test_functionality(components): print("\nFunctionality test failed!") return 1 # Test Maschine integration test_maschine_integration() print("\n" + "=" * 40) print("All tests completed successfully!") print("\nYour application is ready to run!") print("Execute: python run.py") return 0 if __name__ == "__main__": sys.exit(main())