Você está na página 1de 4

Fabio Henrique Medeiros 125111361908

Gustavo Martins de Oliveira 125111350915

Sistemas de áudio e vídeo


Avaliação N1

Programação realizada em Python.

Utilização das seguintes bibliotecas:

-Tkinter: biblioteca padrão de interface gráfica de usuário em Python.


-Filedialog: módulo da biblioteca tkinter que permite abrir janelas de seleção de arquivo.
-Pygame: biblioteca para criação de jogos e multimídia em Python.
-Numpy: biblioteca para computação científica em Python.
-Sounddevice: biblioteca para gravação e reprodução de áudio em tempo real em Python.
-Soundfile: biblioteca para leitura e escrita de arquivos de áudio em Python.

Código completo e executável após a instalação das bibliotecas citadas acima, devem ser instaladas no
prompt de comando do Anaconda, utilizando “pip install xxxxx” (xxxx biblioteca em questão).

Código completo:
1
import tkinter as tk
from tkinter import filedialog
import pygame
import numpy as np
import sounddevice as sd
import soundfile as sf

NOTE_FREQS = {
'C': 261,
'C#': 277,
'D': 293,
'D#': 311,
'E': 329,
'F': 349,
'F#': 369,
'G': 392,
'G#': 415,
'A': 440,
'A#': 466,
'B': 493
}

sample_rate = 100000
recording = False
recording_frames = []

def play_sound(frequency, duration):


sound_array = (32767 * np.sin(2 * np.pi * frequency * np.linspace(0, duration, int(sample_rate *
duration), dtype=np.float32))).astype(np.int16)
sound = pygame.mixer.Sound(sound_array)
sound.set_volume(0.5)
sound.play()
if recording:
global recording_frames
recording_frames.append(sound_array)

def record_audio():
global recording
recording = True
print('Gravando...')
sd.default.samplerate = sample_rate
sd.default.channels = 1
global recording_frames
recording_frames = []

def stop_recording():
global recording
recording = False
2
print('Gravação finalizada.')
file_path = filedialog.asksaveasfilename(defaultextension=".wav", filetypes=[("WAV Files",
"*.wav")])
if file_path:
sf.write(file_path, np.concatenate(recording_frames), sample_rate)

pygame.mixer.pre_init(44100, -16, 1)
pygame.mixer.init()

root = tk.Tk()
root.title('Piano Virtual')

for key in NOTE_FREQS:


button = tk.Button(root, text=key, width=4, height=4)
button.bind('<ButtonPress>', lambda event, key=key: play_sound(NOTE_FREQS[key], 0.5))
button.pack(side='left')

record_button = tk.Button(root, text='Gravar', command=record_audio)


record_button.pack(side='bottom')

stop_button = tk.Button(root, text='Parar', command=stop_recording)


stop_button.pack(side='bottom')

root.mainloop()

Explicação de algumas questões do código:

Após o código ser executado, será aberta uma aba em que constará o piano virtual, neste piano virtual
ao clicar em suas teclas, será gerado um áudio criado a partir das funções em Hz definidas em cada
tecla na programação (C: 261, C#: 277, D: 293, D#: 311, E: 329, F: 349, F#: 369, G: 392, G#: 415, A:
440, A#: 466, B: 493). Dentro deste piano virtual, é possível clicar na opção “gravar”, e recriar os sons
gerados pelas teclas, após clicar em “parar”, irá abrir uma aba para salvar o arquivo gerado, após salvar
em uma pasta em seu computador, o arquivo WAV. pode ser aberto e irá ouvir exatamente o que foi
tocado durante sua execução. O valor da variável sample_rate define a taxa de amostragem de áudio
em Hz.
A variável recording é usada para indicar se a gravação de áudio está em andamento e a variável
recording_frames armazena os quadros de áudio gravados.
A função play_sound recebe uma frequência e uma duração e gera um array de áudio com essa
frequência e duração. Esse array é então convertido em um objeto Sound do pygame e tocado. Se a
gravação estiver em andamento, o array de áudio é adicionado à variável recording_frames.
A função record_audio define a variável recording como True, inicializa a biblioteca sounddevice com
a taxa de amostragem e o número de canais desejados, e redefine a variável recording_frames como
uma lista vazia.

3
A função stop_recording define a variável recording como False, exibe uma mensagem de conclusão
de gravação e abre uma janela de seleção de arquivo para salvar o áudio gravado em formato WAV
usando a biblioteca soundfile.
As últimas linhas do código inicializam a biblioteca pygame, criam a janela da interface gráfica de
usuário usando a biblioteca tkinter e adicionam botões para cada nota musical no piano virtual, além de
botões para iniciar e parar a gravação de áudio. O loop principal da interface gráfica é iniciado usando
o método mainloop() do objeto root.

Você também pode gostar