Super BeatBox Machine

Projetos

Em um mundo onde a música é a ponte da expressão mais profunda da alma, o som e a interface gráfica se unem, para juntos conceberem uma sinfonia de possibilidades de experiências sensoriais infinitas — Super BeatBox Machine.

Super BeatBox Bachine Closed Hi Hat

A Super BeatBox Machine é um projeto de transformação criado para consolidar os conhecimentos adquiridos em Java SE. A aplicação permite criar e reproduzir um padrão musical feito com batidas de instrumentos de percussão. Para criar um novo padrão basta definir o número de batidas de cada instrumento, utilizando para isso, as caixas de seleção — é possível escolher sons entre 16 instrumentos.

Super BeatBox Machine - Caixas de Seleção

Em vermelho, caixas de seleção que permitem criar um novo padrão.
Em rosa, botão Play que permite ouvi-lo.

A Super BeatBox Machine é uma aplicação cliente-servidor que disponibiliza um engenhoso sistema de chat. Através dele é possível enviar um padrão musical via rede aos usuários conectados ao servidor. Além disso, é possível salvar um padrão musical em disco — para recuperá-lo, alterá-lo e enviá-lo via chat em momento posterior.

Super BeatBox Machine - Enviar Mensagem

Usuário Cibele cria um novo padrão (1 e 2); pressiona Play para ouvi-lo (3);
atribui-lhe o nome "dance beat" (4); pressiona Send para enviá-lo via chat (5).

Super BeatBox Machine - Selecionar Mensagem Recebida

Usuário Ricardo recebe um padrão via chat e clica nele para ouvi-lo (1 e 2);
padrão é carregado e reproduzido (3).

Super BeatBox Machine - Salvar

Usuário Ricardo pressiona Save (1 e 2); escolhe uma pasta (3);
define um nome (4); salva o padrão recebido em disco (5).

A Super BeatBox Machine é um desafio de programação que não utiliza IDE — foi construída no Notepad++ e compilada no prompt de comando da console. O projeto utiliza um conjunto de tecnologias complexas de difícil compreensão e domínio, entre elas: Biblioteca Java Swing, GridLayout, GridBagLayout, JFrame, JPanel, PlainDocument, File, JFileChooser, API Java Sound, Sequencer, MidiEvent, Serialização de Objetos em Disco, Serialização de Objetos em Rede, Socket, ServerSocket, Segmentação Múltipla, Classe Interna e Mapeamento de Teclas.

Desenvolvido entre Fevereiro de 2018 e Março de 2020, consumiu ao final, dois anos e um mês de trabalho árduo.

Concepção do Projeto

A Super BeatBox Machine nasce a partir de um dos maiores clássicos da literatura mundial sobre Java: O livro Use a cabeça! Java — de Kathy Sierra e Bert Bates. No livro os autores abordam desde os princípios básicos da linguagem de programação, até assuntos complexos como: Programação Orientada a Objetos, Graphical User Interface, Serialização, Conexões de Rede, Concorrência, Collections, Tipos Genéricos, RMI para Computação Distribuída e mais. A obra se destaca por sua didática única — sempre apresentando os temas com humor e irreverência.

Durante o livro, o assunto mais interessante abordado é, sem dúvida nenhuma, a manipulação de eventos MIDI (Musical Instrument Digital Interface). Isso permite na prática, um código Java registrar e reproduzir qualquer som, de qualquer instrumento musical — bastando para isso saber o código do canal, o código do instrumento e o número da nota que se deseja tocar.

No decorrer da obra, os autores constroem passo a passo com o leitor, uma aplicação que utiliza eventos MIDI para reproduzir um padrão musical feito com batidas de instrumentos de percussão. O projeto, intitulado Cyber BeatBox, também permite salvar os padrões registrados em disco e enviá-los via rede a um servidor. Para o leitor que opta em não ler o livro na sequência, o capítulo 19 (apêndice A) traz o código completo da aplicação.

Durante os dois anos que me debrucei sobre a obra, percorri todos os capítulos e, gradativamente, adicionei funcionalidades ao projeto do livro (Cyber BeatBox) até transformá-lo em Super BeatBox Machine.

Transformações do Projeto

BeatBox - Projeto Original do Livro

Cyber BeatBox - Projeto Original do Livro

Super BeatBox Machine - Projeto Transformado

Super BeatBox Machine - Projeto Transformado

  1. JFrame (2 modificações)
    • A janela do projeto (JFrame) utiliza agora um painel de conteúdo (JPanel) com um gerenciador de layout GridBagLayout. Em decorrência, os elementos internos da janela (Label, JCheckBox, JTextField, JList) não aumentam de tamanho quando a janela é maximizada — preservando assim, a tela da aplicação.
    • O projeto original utiliza um JPanel com gerenciador de layout BorderLayout. Em decorrência, os elementos internos aumentam de tamanho quando a janela é maximizada, deformando assim, a tela da aplicação.

    • A barra de título da janela da aplicação exibe agora o nome do usuário e o status da conexão — podendo este último variar entre Connected to Server e Playing Alone.
  2. Beat Selection Panel (1 modificação)
    • O Painel de Seleção de Batidas exibe agora colunas guia (de coloração diferente) que agregam valor estético à aplicação e permitem ao usuário identificar de forma rápida e intuitiva a posição de cada coluna no painel.
  3. Instrument Name Panel (6 modificações)
    • Os nomes dos instrumentos musicais foram numerados.
    • A numeração adicionada foi elegantemente alinhada à direita.
    • Ao posicionar o ponteiro do mouse sobre um rótulo (Label)
      • O nome do instrumento musical se torna azul negrito.
      • O nome do instrumento musical e sua imagem são impressos no Dynamic Instrument Draw Panel (C).
      • Uma batida do instrumento musical é reproduzida para que o usuário possa ouvi-la.
    • Além disso, a ordem dos instrumentos musicais foi alterada. O novo arranjo exibe os instrumentos da bateria em sequência — ordenados da esquerda para a direita.
  4. Dynamic Instrument Draw Panel (presente apenas na versão transformada)
    • Exibe a imagem e o nome do instrumento musical correspondente ao rótulo ativo — entende-se por rótulo ativo o nome do instrumento musical impresso em azul negrito (em decorrência do ponteiro do mouse pairar sobre ele).
  5. Static Instrument Draw Panel (presente apenas na versão transformada)
    • Exibe uma imagem do conjunto de instrumentos musicais numerados — muito útil para identificar a posição dos instrumentos da bateria.
  6. speedTextField (presente apenas na versão transformada)
    • Permite modificar a velocidade de reprodução. Para alterar a velocidade de reprodução basta clicar na caixa de texto, digitar o novo valor e pressionar ENTER — a velocidade de reprodução é atualizada instantaneamente.
    • Caso o usuário deseje um valor decimal, é possível utilizar ponto ou vírgula como separador — 1,5 ou 1.5 funcionam do mesmo jeito.

  7. Botão Clear (presente apenas na versão transformada)
    • Limpa as caixas de seleção do Painel de Seleção de Batidas e interrompe a reprodução de qualquer padrão em execução. Muito útil quando se tem um padrão em execução e deseja-se apagá-lo para criar outro.
  8. Save/Restore (1 modificação)
    • O processo para salvar e recuperar um padrão de batidas foi alterado. Agora, ao clicar nos botões Save e Restore, as caixas de diálogo Save e Open utilizam saved-beats como pasta padrão. Entretanto, caso o usuário escolha outra pasta, esta, por sua vez, se torna automaticamente a pasta padrão. Isso significa na prática que, para salvar um conjunto de padrões em uma pasta personalizada de sua preferência, o usuário tem de informar o endereço da pasta uma única vez.
    • A versão original do projeto sempre utiliza documentos como pasta padrão. Isso significa na prática que, para salvar 10 padrões em uma pasta de sua preferência, o usuário tem de informar o endereço da pasta 10 vezes.

  9. [btd] (presente apenas na versão transformada)
    • As mensagens recebidas via chat, que possuem um padrão musical de batidas incorporado, exibem agora a expressão [btd] — em rosa.
    • As mensagens recebidas via chat, que não possuem um padrão musical de batidas incorporado, exibem agora a expressão [btd] — em cinza.
  10. Data e Hora (presente apenas na versão transformada)
    • As mensagens recebidas via chat exibem agora a data e hora local.
  11. Reproduzindo um padrão de batidas recebido via chat (1 modificação)
    • Ao clicar sobre a mensagem recebida, o padrão musical de batidas incorporado é reproduzido automaticamente. Ao clicar novamente, a reprodução é interrompida.
    • No projeto original a única forma de parar a reprodução é através do botão Stop.

  12. Botão Delete (presente apenas na versão transformada)
    • Permite apagar uma mensagem recebida.
  13. outputMessageTextField (2 modificações)
    • Limita o número de caracteres, de modo que o tamanho da mensagem enviada não ultrapasse a largura do JList que exibe as mensagens recebidas.
    • No projeto original, quando a mensagem recebida ultrapassa a largura da JList, uma barra de navegação horizontal é adicionada, comprometendo assim, a estética da aplicação — ao contrário do JTextArea, a JList não possui quebras de linha.

    • Permite enviar a mensagem escrita pressionando ENTER — no projeto original a mensagem só pode ser enviada através do botão Send.

A versão transformada do projeto oferece também uma tela inicial que permite informar o nome do usuário e o endereço IP do servidor — no projeto original, o nome de usuário e o endereço IP do servidor têm de ser digitados no prompt de comando da console do sistema operacional.

Super BeatBox Machine - Projeto Transformado - Tela Inicial

Super BeatBox Machine - Tela Inicial
(presente apenas na versão transformada)

O lado servidor da aplicação também passou por severas mudanças. A Super BeatBox Machine Music Server possui agora a Intuitive Console — uma janela de log criada com interface gráfica (JFrame) que permite classificar os tipos de mensagens da console do servidor por cor — facilitando em muito o trabalho de análise.

Mensagens relativas ao estado do servidor são impressas em preto; mensagens relativas a usuários conectados são impressas em rosa; mensagens relativas a operações são impressas em verde; mensagens relativas a usuários desconectados são impressas em cinza.

Super BeatBox Machine - Servidor

Super BeatBox Machine Music Server com Intuitive Console
(presente apenas na versão transformada)

E por último, mas não menos importante, a cereja do bolo. O projeto transformado disponibiliza arquivos de inicialização executáveis (.jar) para os lados cliente e servidor da aplicação — um luxo!

No projeto original, a aplicação é iniciada via interface de linha de comando (na janela da console do sistema operacional) — eficiente, mas nada prático.

Super BeatBox Machine - Arquivos de Inicialização Executáveis

Super BeatBox Machine - Arquivos de Inicialização Executáveis
(presentes apenas na versão transformada)