# Pet Sounds
## `hackmd.io/@sesc-av-paulista/pet-sounds`
Vamos usar a linguagem Python para fazer um tocador de sons!
Para isso podemos usar o *Thonny IDE* (https://thonny.org) um editor de código que já vem com um interpretador Python embutido. Nele será preciso instalar o pacote PyGame (`pygame-ce`) que é uma biblioteca Python para desenvolvimento de jogos e aplicações multimídia (no menu *Manage packages...*).
O código do tocador de sons em Python. Precisamos por o código num arquivo `.py` na mesma pasta que os sons que vamos tocar. Para finalizar podemos usar o *Makey-Makey* para simular as teclas que disparam os sons!
```python=
"""
Procura arquivos mp3 na pasta corrente e toca enquanto uma tecla é pressionada.
A tecla que dispara o som é o primeiro caractere do nome do arquivo, ou
código entre colchetes de constante K_... do pygame, exemplo:
a-mar.mp3 (tecla A)
1-vento.mp3 (tecla 1)
[LEFT]-zumbido.mp3 (seta para esquerda)
[SPACE]-chuva.mp3 (barra de epaço)
Outras opções [UP], [DOWN], [RIGHT], a, s, d, w
"""
from pathlib import Path
import pygame
folder = Path.cwd() # se quiser pode trocar por Path('/caminho/pasta/')
key_to_files = {}
for fp in sorted(folder.iterdir()):
if not fp.name.lower().endswith('.mp3'):
continue # pula arquivos que não terminam em .mp3
if fp.name[0] == '[': # nomes com código entre colchetes
c = fp.name[1:fp.name.find(']')]
else: # outras teclas
c = fp.name[0].lower()
key_code = getattr(pygame, 'K_' + c, None) # procura constante do pygame
if not key_code: # tecla ou código entre colchetes não serve
print(f'Nome incompatível: {fp.name}')
continue
key_to_files[key_code] = fp # põe constante e path do arquivo no dict
pygame.init()
# tela de 800 x 200 pixels
screen = pygame.display.set_mode((800, 800))
font = pygame.font.Font(None, 24)
# Mixer é a interface do pygame para audio
pygame.mixer.init()
pygame.mixer.music.set_volume(0.7) # ajusta o volume
# Laço principal do pygame
running = True
play_file = None
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
play_file = key_to_files.get(event.key)
if play_file:
pygame.mixer.music.load(play_file)
pygame.mixer.music.play()
elif event.type == pygame.KEYUP:
pygame.mixer.music.fadeout(200)
play_file = None
#pygame.mixer.music.stop() # meio brusco
# Parte que desenha na tela
screen.fill((0, 0, 0)) # fundo preto, limpa a tela
instructions = [
'Aperte e segure uma tecla.',
'Disponíveis:'] + [fp.name for k, fp in key_to_files.items()]
if pygame.mixer.music.get_busy():
instructions[0] = f'Tocando: {play_file.name if play_file else "Nenhum"}'
x = y = 10
for line in instructions:
text = font.render(line, True, (255, 255, 255))
screen.blit(text, (x, y))
y += 30
if y > screen.get_height():
y = 70
x += 250
pygame.display.flip() # atualiza a tela
# Encerra tudo (fecha a janela)
pygame.quit()
```
Sons livre: https://pixabay.com/pt/sound-effects/search/gato/