Barack hangszer

A hardver régi bútorlapból, hulladék deszkából és maradék szegőlécből, meg persze kábelekből áll. A titkos rész így néz ki: (igen, szigetelőszalaggal mindent meg lehet oldani)

Az érintés érzékelőnek szüksége van néhány csomagra:

sudo apt install git python3-pip python3-smbus i2c-tools espeak

A zenelejátszáshoz pygame-t használunk:

pip3 install pygame

A pygame-hez kell libsdl2:

sudo apt install libsdl2-mixer-2.0-0 libsdl2-image-2.0-0 libsdl2-2.0-0

Ha esetleg összekeveredtek a dolgok, ezzel tudsz rendet tenni:

sudo pip uninstall pygame==2.5.2 --break-system-packages
sudo apt purge libsdl2-image-2.0-0 libsdl2-mixer-2.0-0  libsdl2-ttf-2.0-0
sudo apt purge libopusfile0 libportmidi0
sudo apt install python3-pygame

A forráskód:

import time, board, busio, adafruit_mpr121, pygame, subprocess

i2c = busio.I2C(board.SCL, board.SDA)
m = adafruit_mpr121.MPR121(i2c)
lastTouch=0;
prev=[False,False,False,False,False,False,False,False,False,False,False,False]
sounds=[]
soundKeys=8
lastSound=soundKeys;
pygame.mixer.init(buffer=8192)
dir="/home/pi/barack/"

with open(dir+'all.txt') as f:
  allSound = f.read().splitlines()
for i in range(soundKeys):
  prev.append(False);
  sounds.append(pygame.mixer.Sound(dir+"samples/"+allSound[i]))

def speak(text):
  file_name=dir+"temp.txt"
  subprocess.call(["espeak", "-vhu", text,"-w"+file_name, "2>/dev/null"])
  pygame.mixer.music.load(file_name)
  pygame.mixer.music.play(1)

def changeSound(slot):
  global lastSound
  sounds[slot].stop()
  sounds[slot]=pygame.mixer.Sound(dir+"samples/"+allSound[lastSound])
  lastSound+=1
  if lastSound>=len(allSound):
    lastSound=0

speak("Indulhat a zene.")
try:
  while True:
    for i in range(soundKeys):
      if m[i].value and prev[i]==False:
        prev[i]=True
        sounds[i].play(-1)
      elif m[i].value==False and prev[i]:
        lastTouch=i
        prev[i]=False
        sounds[i].stop()

    if m[10].value and prev[10]==False:
      prev[10]=True
      speak(allSound[lastSound]+" betöltve.")
      changeSound(lastTouch)
    elif m[10].value==False and prev[10]:
      prev[10]=False

    if m[11].value and prev[11]==False:
      prev[11]=True
      speak("Új hangok betöltve.")
      for i in range(soundKeys):
        changeSound(i)
    elif m[11].value==False and prev[11]:
      prev[11]=False

    time.sleep(0.15)

except KeyboardInterrupt:
  pygame.mixer.quit()
  print("vége")

Az automatikus indításhoz az /etc/rc.local file-ba kell beírni:

python3 /home/pi/barack/barack.py &

Comments are closed.