Índice:

Melodia: 8 etapas (com imagens)
Melodia: 8 etapas (com imagens)
Anonim
Image
Image
Compreendendo o fluxo
Compreendendo o fluxo

A par das inúmeras vantagens e soluções tecnológicas que permitem trabalhar a partir de casa, persiste a dificuldade de formulação e criação de suportes de vida entre os colegas de trabalho. MELODY é um dispositivo físico-digital que permite a criação de jams musicais curtos colaborativos. Os colegas de trabalho coordenam o tempo e o dispositivo configura uma jam session com curvas e diferentes sons aleatórios. O primeiro participante define um ritmo específico, após o qual cada participante adiciona sua própria seção musical correspondente ao ritmo definido. Para tornar mais fácil para os usuários sem formação musical, o software os ajuda a manter o ritmo, amostrando seus cliques e ajustando-os ao ritmo apropriado. A sessão termina após cerca de 3 minutos, quando todos os participantes terminarem de registrar sua parte.

Como funciona?

O Melody é baseado no hardware ESP2866, que se comunica com um servidor Node-Red pelo protocolo MQTT. O dispositivo traduz as notas do jogador em uma sequência de caracteres que é enviada ao servidor e do servidor de volta para os outros jogadores. Isso permite que qualquer pessoa toque e ouça a música sem interrupção de sua conexão de rede.

A melodia tem dois indicadores visuais principais. O primeiro é uma faixa de LED que permite ao jogador saber quando o Loop começa e quando termina e indica se é a vez do jogador. O segundo é um display LED no centro do produto, que é usado para exibir visualmente a melodia existente. Uma contagem regressiva de 3 a 1 indica para começar a jogar e uma exibição de tempos direciona o usuário quando e como ele deseja contribuir com a melodia do grupo. A gravação é salva automaticamente na nuvem da empresa para uso futuro.

Este projeto foi elaborado por quatro alunos do laboratório de inovação de mídia (MiLab) no Centro interdisciplinar de Herzliya (IDC): Shahar Agassy, Eden Bar-Tov, Gal Eshchar e Gad Stern. Com a ajuda de Zvika Markfeld, Netta Ofer e Michal Leschinsky e a orientação de Noa Morag e Oren Zuckerman.

obrigado a Tom Granot por criar um ótimo instrutível que me ajudou a aprender como implementar algumas das coisas aqui (algumas das etapas aqui são modeladas após este ótimo instrutível).

Suprimentos

  • impressora 3d
  • ESP8266
  • 7 botões
  • Matriz 8X8 LED
  • WS2812B LED Strip
  • Amplificador I2S
  • Conector de áudio fêmea de 1/8 "(3,5 mm) 4 pólos
  • 4X resistor 1K
  • Resistor 1X3K

Etapa 1: Compreendendo o fluxo

Compreendendo o fluxo
Compreendendo o fluxo
Compreendendo o fluxo
Compreendendo o fluxo

Neste projeto, tentamos resolver alguns problemas:

  1. Como podemos fazer isso online, para que os jogadores possam jogar ao mesmo tempo?
  2. Como podemos contornar as latências da Internet e criar uma experiência perfeita?
  3. Como podemos fazer a música soar bem mesmo para pessoas sem formação musical?

Tempo e serialização da música

Para resolver o primeiro problema, examinamos o protocolo MIDI e tentamos usá-lo, mas vimos que é mais robusto do que o que realmente precisávamos. Também queríamos torná-lo simples para que possamos construir o primeiro protótipo funcional. Então, nos inspiramos no MIDI e fizemos nosso loop musical representado por uma seqüência de números (de 0 a 5) vezes o tamanho dos loops em relação aos jogadores (explicaremos toda a matemática musical mais tarde).

Na música, dividimos os ritmos em barras musicais. Cada compasso é basicamente um segmento pequeno que escolhemos usar 4/4 (ou seja, 4 batidas em um compasso musical) - o mais comum.

Cada batida é então dividida em 4 janelas de amostragem para que cada nota tocada seja alinhada automaticamente em uma posição boa e também nos permita representar uma música como uma sequência de números para enviar ao servidor.

Para ser amigável com os jogadores sem formação musical, fizemos três coisas:

  1. Limite o número de teclas para fazer o jogador se concentrar em menos opções.
  2. Escolhemos notas na mesma escala que tocam bem juntas, então não haverá nenhum som de dissonância.
  3. Cada pressão é definida para a "janela" do ritmo, assim, alheia a música do jogador ao ritmo

Protocolos de comunicação

Então, depois de entendermos a lógica por trás da música, como podemos comunicá-la entre nossos músicos?

para isso, usamos MQTT, um protocolo de rede publicar-assinar que transporta mensagens entre dispositivos.

cada jogador está inscrito em dois tópicos: o loop (obtém o loop mais atual) e o turn (obtém o id do jogador atual para fins de sincronização).

Por sua vez, quando um jogador terminar de tocar a melodia, ele pressionará o botão UP e o loop (o atualizado) será enviado ao corretor MQTT, que o transmitirá de volta para todos os jogadores do canal de loop.

este loop ficará "dormente" até que o loop atual termine de tocar e então o substituirá. portanto, será transparente para o jogador. além disso, como o novo loop está salvo localmente no dispositivo do reprodutor, não há latência de internet para a música e resolvemos o segundo problema.

Etapa 2: Configurando o servidor - Ngrok

Configurando o servidor - Ngrok
Configurando o servidor - Ngrok
Configurando o servidor - Ngrok
Configurando o servidor - Ngrok

ngrok é um serviço de tunelamento. Ele nos permite expor um serviço em execução local (no nosso caso, Node-RED) para o mundo externo - sem o incômodo de configurar um servidor ou lidar com registros DNS. Você simplesmente executa o Node-RED em seu computador e, em seguida, executa o ngrok na mesma porta em que o Node-RED está sendo executado.

É isso - você obterá uma URL que poderá usar para acessar o Node-RED de qualquer lugar do mundo, independentemente da rede à qual ele está conectado.

Instalação e configuração

  1. Baixe o ngrok para seu sistema operacional aqui.
  2. Siga a etapa na página de download, até a etapa "Fire it up".
  3. Na "etapa de inicialização", troque o 80 por 1883 - e o http por tcp como em./ngrok tcp 1883 dependendo do seu
  4. salve a URL e o número da porta (visto na imagem), vamos precisar do, mais tarde.

Etapa 3: Configurando o servidor - Node-Red

Configurando o servidor - Node-Red
Configurando o servidor - Node-Red

A lógica de servidor do projeto, Node-RED é um ambiente de programação visual que permite conectar vários softwares (e hardwares!).

Aqui fizemos a lógica da comunicação entre todos os jogadores (compartilhando e recebendo os loops e coordenando os turnos)

Instalação de Node-Red

siga as seguintes etapas para carregar nosso fluxo Node-RED em seu computador local:

  1. Node-RED requer Node.js, instale-o aqui
  2. instale o próprio Node-RED usando as instruções aqui.

Agora que você tem o Node-RED instalado, execute-o usando as instruções na etapa acima e verifique se você pode ver uma página de tela vazia. Deve estar localizado em

Agora você precisará importar o fluxo que usamos para este projeto, você pode encontrá-lo aqui e apenas pressionar importar, adicionar o arquivo JSON e pressionar Implementar.

Instalação do Node-Red:

Se você olhar para a imagem que está anexada a esta etapa, você pode ver que temos 2 "ações" principais, recebemos um loop atual de um de nossos jogadores e então o transmitimos para todos os outros jogadores. além disso, transmitimos a nova virada a todos os jogadores. para que o jogo fique sincronizado.

Etapa 4: Configurando o servidor - MQTT (Mosquitto)

Configurando o servidor - MQTT (Mosquitto)
Configurando o servidor - MQTT (Mosquitto)

Como o Node-RED não tem seu próprio broker MQTT e precisaremos nos comunicar com nossos sensores e ativadores por MQTT, usaremos um broker MQTT dedicado. Como o Node-RED recomenda o Mosquitto, este é o que usaremos. Veja aqui algumas informações sobre o MQTT e por que ele é freqüentemente usado em projetos de IoT.

Instalação e configuração

  1. Baixe o Mosquitto aqui e instale, tudo de acordo com o seu sistema operacional.
  2. Normalmente, você precisa seguir as instruções aqui para conectar o Node-RED ao Mosquitto. No entanto, se você usou nosso fluxo, ele já está pré-configurado para você. Contanto que você instale o flow e o Mosquitrro corretamente e o Mosquitto seja executado na porta 1883 (na qual é executado por padrão), ele deve funcionar imediatamente.
  3. Observe que isso significa que o broker MQTT e seu servidor Node-RED são executados na mesma máquina. Isso é útil para simplificar a comunicação dentro do sistema. Veja a nota abaixo para mais informações.

Monitorando o tráfego MQTT

Usei MQTTfx para monitorar o tráfego, é uma ótima ferramenta com uma GUI muito simples.

Etapa 5: O Código

O código
O código

você pode encontrar o código no GitHub (com todos os arquivos de dados e o config.h)

Dependências:

antes de carregar o código no esp2866, você precisará instalar algumas bibliotecas:

  1. libmad-8266 (decodificar a música de SPIFF para I2S)
  2. EspMQTTClient
  3. ESP8266WiFi
  4. Adafruit_NeoPixel

Faça upload dos sons para o ESP usando SPIFF:

  1. siga este grande instrutível.
  2. adicione a pasta de dados ao diretório do código-fonte.
  3. No IDE do Arduino em Ferramentas, altere o tamanho do Flash para "4 MB (FS: 3 MB TOA: ~ 512 KB)"
  4. Também em Ferramentas, pressione ESP2866 Sketch Data Upload

Configurando os parâmetros:

depois disso, vá para o arquivo config.h e adicione os dados necessários, como credenciais WIFI e o URL e porta do ngrok da etapa anterior (verifique a foto em anexo para referência).

p.s - Eu ainda adicionei um recurso de conexão automática para ajudá-lo a definir os dados WIFI e ngrok do seu smartphone, já que foi apenas uma primeira prova de conceito, gostaria de adicioná-lo algum dia.

Defina a quantidade de jogadores que deseja (este jogo funciona melhor para 2-3 jogadores e vem pronto para uso com uma variedade de sons para 2 jogadores). mas pode ser facilmente ajustado para mais:

para cada jogador, adicione outro fluxo no nó vermelho para publicar um loop em um tópico específico do usuário.

Além disso, você pode editar o som musical adicionando esta matriz aos seus sons personalizados:

aqui você pode ver 3 tipos de instrumentos (Chrods para o jogador 0, Lead para o jogador 1 e Baixo para o jogador 2)

const char * path [NUMofNotes] = {"/blank1.wav", "/Chords_Am.wav", "/Chords_F.wav", "/Chords_C.wav", "/Chords_G.wav", "/Chords_Dm.wav", "/blank2.wav", "/Lead_C.wav", "/Lead_D.wav", "/Lead_E.wav", "/Lead_G.wav", "/Lead_A.wav", "/blank0.wav", "/Bass_C3.wav", "/Bass_D3.wav", "/Bass_F3.wav", "/Bass_G3.wav", "/Bass_A3.wav"};

Etapa 6: imprimir o modelo 3D

Imprima o modelo 3D
Imprima o modelo 3D
Imprima o modelo 3D
Imprima o modelo 3D
Imprima o modelo 3D
Imprima o modelo 3D
Imprima o modelo 3D
Imprima o modelo 3D

Para a primeira etapa, baixe o STL e imprima-os.

depois de retirar os suportes e talvez lixar um pouco (dependendo da resolução da impressora)

pinte-o com a cor desejada

Etapa 7: Montagem e soldagem

Montagem e Soldagem
Montagem e Soldagem

Então, basicamente, aqui é onde a verdadeira magia acontece.

você pode seguir esses esquemas e soldar tudo junto.

lembre-se de que você pode alterar a posição dos PINs, mas lembre-se de alterá-la também no código.

o A0 e o I2S estão bem fixos no lugar:

já que o A0 é para a ponte do resistor (usamos a diferença na corrente para saber qual botão dos 5 foi pressionado - semelhante a este Instructables.

o I2S tem uma codificação específica que você pode encontrar aqui

Etapa 8: Jogue alguns loops com seus amigos

Recomendado: