Robotic_Piano_Player/pysrc/ControllerV1.py

81 lines
2.3 KiB
Python

import serial
import time
import pygame
from pydub import AudioSegment
import serial.tools.list_ports
# Define the paths
#Short notes
NOTES_PATH = "Player\\notes\\mp3-master\\"
#Long notes
#NOTES_PATH = r"C:\Users\Balthazar\Shared\ECAM\Advance Robotique\Project\Player\notes\high-quality-master\renamed\\"
SERIAL_PORT = "COM5" #"COM3"
BAUD_RATE = 115200
# New Features
wait_note_finish = False # Set to False to play without waiting for the note to finish
keyboard_input = False # Set to False to disable keyboard note input
check_com3 = True # Set to False to skip COM3 check
pygame.mixer.init()
octave = 4
notes = ["C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B"]
def play_note_with_pygame(note):
try:
pygame_sound = pygame.mixer.Sound(f"{NOTES_PATH}{note}.mp3")
pygame_sound.play()
if wait_note_finish:
while pygame.mixer.get_busy(): # Wait until sound is finished
pygame.time.Clock().tick(10)
except Exception as e:
print(f"Error playing {note}: {e}")
# Check if COM3 is connected
if check_com3:
ports = list(serial.tools.list_ports.comports())
com3_found = any(port.device == SERIAL_PORT for port in ports)
if not com3_found:
print(f"{SERIAL_PORT} not found. Switching to keyboard input mode.")
keyboard_input = True
try:
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
time.sleep(2)
except Exception as e:
print(f"Error opening {SERIAL_PORT}: {e}")
keyboard_input = True
print("Listening for Arduino input...")
while True:
try:
# Keyboard input for playing notes
if keyboard_input:
user_input = input("Enter note (C, Db, D, ... B) or 'q' to quit: ")
if user_input == 'q':
break
if user_input in notes:
play_note_with_pygame(f"{user_input}{octave}")
# Arduino input for playing notes
data = ser.readline().decode('utf-8', errors='ignore').strip()
if data:
print("data : " + data)
note = data
if note in notes:
play_note_with_pygame(f"{note}{octave}")
except KeyboardInterrupt:
print("Exiting...")
break
except Exception as e:
print(f"Error: {e}")
ser.close()