Sonificação em tempo real

From Soundscapes
Revision as of 13:08, 6 April 2026 by David Sousa (talk | contribs) (Created page with "Existem inúmeras estações DAW gratuitas (e algumas de código aberto e multiplataforma), como o [https://lmms.io/ LMMS], que pode descarregar e configurar para reproduzir entrada MIDI. O método mais fácil é tocar diretamente a partir do navegador através de uma aplicação web como [https://midi.city/ midi.city], o [https://onlinesequencer.net/ Online Sequencer] e muitas outras que pode descobrir online. Em princípio, aplicações web como o midi.city detetam fac...")
Jump to navigation Jump to search

A sonificação em tempo real é uma técnica fascinante que pode promover significativamente o envolvimento dos alunos nas áreas STEAM. A sonificação em tempo real significa que não conseguimos perceber o intervalo de tempo entre a aquisição dos dados e o som correspondente produzido pelo nosso dispositivo de sonificação, devido à rapidez do processo. Além disso, os métodos para criar representações sonoras dos dados são definidos simultaneamente com a recolha de dados (em «tempo real»).

Antes de começarmos, queremos salientar que a qualidade do som, que é subjetiva e, por isso, depende do gosto do utilizador, deve ser tal que, no mínimo, não o incomode. Pelo contrário, se fosse suficientemente apelativo para atrair a sua atenção, seria melhor. Por outro lado, ao tentar criar algo «agradável», corre-se o risco de gerar resultados sonoros que não cumprem o objetivo de descrever bem o comportamento dos dados de entrada. É, portanto, necessário encontrar um equilíbrio: o som deve ser suficientemente agradável e, ao mesmo tempo, exaustivamente informativo.

Dispositivos de sonificação em tempo real

View of the micro:bit on the both sides
O microcontrolador BBC micro:bit

Para criar um dispositivo de sonificação em tempo real, é útil recorrer a um microcontrolador. Estes são como «computadores pequenos e simples» com uma única unidade de processamento. No entanto, não são computadores. A sua arquitetura é muito mais simples e não conseguem executar um sistema operativo. Ainda assim, podem ser programados para executar um único programa de cada vez, o qual pode realizar várias tarefas, mas de forma sequencial, de acordo com a ordem das instruções listadas no programa. Existem vários tipos de microcontroladores, sendo o Arduino (arduino.cc) o mais popular.

Para começar, o projeto SoundScapes sugere a utilização do microcontrolador BBC micro:bit. Esta ferramenta é muito simples de utilizar, versátil e inclui vários sensores incorporados prontos a usar, eliminando a necessidade de construir um circuito elétrico específico para o seu funcionamento. O micro:bit pode ser programado online com o Makecode (utilizando o navegador Chrome para uma melhor compatibilidade) em Python, JavaScript ou blocos.

Sonificação com o micro:bit

Antes de se iniciar na sonificação com o micro:bit, deve primeiro familiarizar-se com o ambiente de programação Makecode. Na página principal, existem vários tutoriais, como o «Flashing Heart», o «Name Tag», etc., entre os quais pode escolher para começar. Se se registar na plataforma, os seus projetos serão guardados na sua conta e poderá aceder-lhes a partir de qualquer dispositivo, desde que inicie sessão. Caso contrário, eles são guardados como cookies; no entanto, poderá perdê-los se limpar a cache do navegador.

Noções básicas sobre som no micro:bit

No editor Makecode, existe uma biblioteca útil e apelativa dedicada à música, especialmente para jovens estudantes. Esta biblioteca musical oferece vários comandos/blocos que facilitam a geração de sons e a criação de melodias. Existem muitos blocos e combinações de blocos que pode utilizar para gerar diferentes tipos de sons. Aqui apresentamos-lhe os blocos mais básicos e avançamos para exemplos mais complexos. É um bom exercício brincar com os diferentes blocos e ouvir o que acontece para se familiarizar com eles.

Makecode editor music category

Gerar um único tom

O código seguinte gera um único tom com uma frequência pré-definida (Dó central) e uma duração de 1 batida quando o botão A é pressionado, ou um som contínuo de Mi central quando o botão B é pressionado. É possível alterar a frequência dos tons clicando nos campos de entrada brancos com os valores «Dó central» e «Mi central». A partir das setas do menu suspenso, também é possível alterar a duração do tom «Dó central» e definir se o som é reproduzido sequencialmente com outros blocos de comando, em segundo plano ou em loop [Note 1].

Tocar uma melodia

Para tocar uma melodia, utilize o bloco seguinte e clique nele para criar a melodia:

Play melody block

O código de exemplo a seguir reproduz duas melodias com valores de bpm diferentes para os botões A e B e interrompe todos os sons quando A e B são pressionados simultaneamente. É possível alterar as melodias clicando nos campos de entrada brancos com as notas musicais coloridas. Tal como no exemplo anterior, também é possível alterar a duração da batida e definir se o som é reproduzido sequencialmente com outros blocos de comando, em segundo plano ou em loop [Note 1].

Controlar a alteração da frequência, a forma de onda, o volume e a duração

Também é possível gerar sons mais complexos manipulando a variação de frequência, a forma de onda, o volume e a duração com o seguinte bloco:

Complex sounds block

O exemplo seguinte reproduz dois sons complexos sequencialmente de forma contínua [Note 1]:

Sonificação de um valor booleano

Na ciência da computação, um tipo de dados booleano, ou lógico, é uma primitiva fundamental que pode assumir um de dois valores possíveis: verdadeiro ou falso, frequentemente representados por 1 ou 0. Para ilustrar este conceito, vamos sonificar o tipo de dados mais simples: o booleano. Exemplos comuns de sensores que produzem dados booleanos incluem sensores de presença, sensores de contacto, interruptores e botões.

O código a seguir implementa a sonificação de um sensor booleano utilizando o micro:Bit, com foco específico no botão A. Quando o botão é pressionado, ouvimos a nota C e, quando é solto, a nota muda para F. Este feedback auditivo fornece uma representação clara do estado do botão, melhorando a nossa compreensão dos dados booleanos num contexto prático [Note 1].

Explicação detalhada do código:

Os blocos são avaliados sequencialmente, de cima para baixo, dentro do bloco de loop forever, que repete a seguinte sequência de avaliação até que algo interrompa o programa:

  1. Define a variável X com o estado do botão (true ou false, dependendo se o botão está pressionado no momento da avaliação do bloco rosa botão A é pressionado)
  2. Se a variável/condição X for true (o botão foi pressionado), tom de toque (Hz) Dó central, caso contrário, tom de toque (Hz) Mi central

Sonificação de um intervalo de valores (utilizando sensores de entrada)

A maioria dos sensores fornece um intervalo de valores, e não apenas 0 ou 1; nesse caso, devemos primeiro determinar quais são os valores mínimo e máximo possíveis antes de definir o mapeamento para a sonificação. Esta entrada variável do sensor pode provir do sensor de luminosidade, do acelerómetro, do magnetómetro, da intensidade do som captado pelo microfone ou de outros sensores ligados ao micro:bit através dos pinos. Estes dados podem ser facilmente recolhidos pelo microcontrolador.

Alterar a frequência com ritmo fixo

Neste exemplo, mostramos como mapear o nível de luminosidade para um intervalo de frequências. O sensor de luz interno do micro:bit fornece um valor entre 0 (escuro) e 255 (muito claro). Chamamos a esta variável de valor de entrada x. Também definimos as variáveis x-Min e x-Max com os valores mínimo e máximo do nosso sensor. Com o objetivo de sonificar o nível de luz medido, iremos mapear o valor do nível de luz para uma altura entre 200 Hz (valor mínimo) e 2000 Hz (valor máximo), reproduzida a um ritmo fixo [Note 1].

Explicação detalhada do código:

Os blocos dentro do bloco on start são executados sequencialmente, antes de qualquer outra coisa no programa, quando o micro:bit é ligado.

  1. Defina a variável x-Min para o valor mais baixo possível medido para o nível de luminosidade, 0.
  2. Defina a variável x-Max para o valor mais alto possível medido para o nível de luminosidade, 255.

Os blocos dentro do bloco forever são avaliados sequencialmente num ciclo, de cima para baixo, após a sequência on start:

  1. Set the x variable to the measured light level
  2. Play a one 1 beat tone with a frequency resulting from mapping the x value (in the x-Min to x-Max range) to the chosen frequency range in the map block.

Change rhythm with fixed pitch

Another option is to maintain a fixed pitch while varying the rhythm based on the light level. We can achieve this by playing a short-duration note and introducing pauses that vary in length, ranging from 1000 ms (for dark conditions) to 20 ms (for very bright conditions). This approach allows for a dynamic auditory representation of the changing light levels [Note 1].

Explicação detalhada do código:

Os blocos dentro do bloco on start são executados sequencialmente, antes de qualquer outra coisa no programa, quando o micro:bit é ligado.

  1. Defina a variável x-Min para o valor mais baixo possível medido para o nível de luminosidade, 0.
  2. Defina a variável x-Max para o valor mais alto possível medido para o nível de luminosidade, 255.

Os blocos dentro do bloco forever são avaliados sequencialmente num ciclo, de cima para baixo, após a sequência on start:

  1. Define a variável x com o nível de luz medido
  2. Reproduz um tom D agudo durante 1 batida.
  3. Faz uma pausa cuja duração é calculada a partir da correspondência entre o valor de x (no intervalo entre x-Min e x-Max) e o intervalo de tempo selecionado no bloco map.

Lembrete: Pode substituir o bloco de entrada nível de luz por qualquer outro bloco de entrada do micro:bit (ou por quaisquer outros sensores ligados ao micro:bit através dos pinos) que forneçam um intervalo de valores. Certifique-se apenas de redefinir os valores x-Min e x-Max em conformidade, uma vez que o acelerómetro e a direção da bússola, por exemplo, funcionam num intervalo diferente.

Utilização de sensores de entrada externos

Para utilizar um sensor digital/analógico externo num micro-pino ou, por exemplo, através do protocolo I2C (todos estes blocos podem ser encontrados nas categorias avançadas), pode utilizar os mesmos programas, bastando substituir o bloco de entrada «nível de luz» pelo bloco correspondente, da seguinte forma:

Pino de leitura digital
Pino de leitura digital
Pino de leitura analógica
Pino de leitura analógica
i2c
i2c

Preste atenção ao número do pino ou ao endereço I²C!

Várias entradas mapeadas para um único som

Os sistemas de sonificação servem frequentemente para fornecer mais do que uma informação. Podemos mapear tantas variáveis quantos os parâmetros sonoros que conseguimos controlar, desde que o som não se torne confuso devido às múltiplas camadas sonoras reproduzidas simultaneamente. Se considerarmos que uma orquestra filarmónica pode ter mais de cem elementos, temos alguma margem para sobrepor vários sons. Ao contrário dos estímulos visuais, onde não podemos exceder um determinado número, geralmente inferior ao dos estímulos áudio. Por fim, tal como na orquestra, os sons têm de ser cuidadosamente organizados em conjunto, no caso de um grande número.

O seguinte transforma em som o nível de luz mapeado para o tom central, com uma pausa definida pela rumo da bússola mapeada para milésimos de segundo [Note 1]

A extensão de sonificação SoundScapes para micro:bit

Em todos os exemplos anteriores, os números foram mapeados para um intervalo contínuo de frequências, o que é ótimo! Mas será que soa bem? Para melhorar a experiência auditiva, pode mapear os números para uma escala musical. A extensão de sonificação SoundScapes para MakeCode micro:bit torna este tipo de mapeamento fácil e acessível.

A seguir, explicamos como instalar a extensão:

Instalar a extensão do registador de dados
Instalar a extensão do registador de dados

Mapear e tocar diretamente a partir de um sensor micro:bit

Para mapear e reproduzir dados diretamente a partir de um sensor do micro:bit, pode utilizar o bloco seguinte, que inclui um menu suspenso para selecionar o sensor. O intervalo de entrada é selecionado automaticamente de forma a corresponder aos valores mínimo e máximo que podem ser obtidos dos sensores do micro:bit.

Embora o trabalho árduo se passe nos bastidores, isso torna mais desafiante para si inovar na sonificação :)

Este exemplo é equivalente ao exemplo de sonificação em tempo real que utiliza a função de sonificação map para um único valor, conforme se segue.

Mapeie e reproduza um único valor na escala musical

A função map devolve um número inteiro ao mapear um valor num determinado intervalo [low, high] para uma escala musical especificada num número especificado de oitavas. Por exemplo, o exemplo seguinte mapeia o valor do nível de luz no intervalo [0,255] para o Dó central maior numa oitava e reproduz-o durante 500 ms indefinidamente:

Também é possível utilizar outros sensores (incluindo sensores externos ligados ao micro:bit através de pinos) e diferentes intervalos de entrada. Isto é útil para a sonificação em tempo real, quando se sonifica os dados ao mesmo tempo que se recolhem.

Por exemplo, o exemplo seguinte mapeia o valor do nível de luz no intervalo [0,255] para o Dó central em tom maior, numa oitava, e reproduz-o durante 500 ms indefinidamente:

Também é possível utilizar outros sensores (incluindo sensores externos ligados ao micro:bit através de pinos) e diferentes intervalos de entrada. Isto é útil para a sonificação em tempo real, quando se sonifica os dados ao mesmo tempo que se recolhem.

Mapear e reproduzir numa escala personalizada

Pode criar facilmente as suas próprias escalas musicais com matrizes e utilizá-las como entrada para as funções de mapeamento, de modo a mapear e reproduzir qualquer valor numérico na sua escala personalizada. A matriz de entrada deve conter as relações de frequência em relação à frequência fundamental.

Por exemplo, o código seguinte mapeia o valor do «nível de luz» no intervalo [0,255] para a nota C central com uma oitava acima e reproduz-a durante 500 ms:

onde «harmonic» é uma matriz de números que contém as relações de frequência da escala harmónica. Uma vez que cada tom da escala harmónica está exatamente a uma oitava de distância do tom anterior, alterar o número da oitava, neste caso específico, apenas irá ampliar o intervalo da série harmónica.

Sonificação via MIDI (O micro:bit como instrumento MIDI)

O som produzido pelo altifalante (buzzer) do micro:bit tem pouca potência e não reproduz frequências baixas. O micro:bit também é muito limitado na sua capacidade de gerar vários sons simultaneamente e sons com timbres mais complexos. No último exemplo, utilizámos um «truque» para sonificar valores de várias entradas. Utilizámos a pausa (duração do silêncio entre sons consecutivos) como saída de sonificação. Inteligente, mas o que realmente gostaríamos seria de vários sons a tocar simultaneamente e a expressar várias camadas de dados. Podemos obter melhor qualidade de som e tocar mais instrumentos ao mesmo tempo utilizando o protocolo MIDI.

O MIDI é um protocolo que facilita a comunicação em tempo real entre instrumentos musicais eletrónicos. MIDI significa Musical Instrument Digital Interface e foi desenvolvido no início dos anos 80 para armazenar, editar, processar e reproduzir sequências de eventos digitais associados a instrumentos eletrónicos de produção sonora, especialmente aqueles que utilizam a escala cromática de 88 notas de um teclado de piano. Podemos, de forma aproximada mas simples, entender o MIDI como o sucessor avançado dos «piano rolls», que, há mais de um século, eram papéis perfurados ou cilindros com pinos, nos quais as execuções musicais eram gravadas (em tempo real) ou anotadas (em tempo de passo). Esses rolos de papel eram então reproduzidos automaticamente por instrumentos mecânicos especialmente concebidos, os pianos mecânicos (pianolas) ou máquinas de música, utilizando-os como o seu «programa».

Configurar o MIDI

O vídeo a seguir explica em detalhe como ligar o micro:bit à sua DAW (Estação de Trabalho de Áudio Digital) ou sintetizador digital através de MIDI no Windows:


Instruções passo a passo (ver o vídeo):

  1. Instale a [Extensão MIDI [1] para o Makecode.
  2. Crie um [programa muito básico [2] utilizando a extensão MIDI] para testar a sua configuração.
  3. Instale o Hairless MIDI, abra-o e, no menu suspenso da porta serial, selecione a porta COM (porta USB) à qual o micro:bit está ligado.
  4. Instale o loopMIDI, abra-o e clique no botão + no canto inferior esquerdo para criar uma nova porta virtual.
  5. Volte à janela do HairlessMIDI e, no menu suspenso de saída MIDI, selecione loopMIDI port
  6. Pode ser necessário desligar e ligar novamente o micro:bit para que funcione.
  7. Está pronto para tocar!

Como funciona: O micro:bit envia mensagens MIDI através de comunicação série. Estas mensagens são então recebidas pelo Hairless MIDI, que as reencaminha para o LoopMIDI. Atuando como uma porta MIDI virtual, o LoopMIDI torna as mensagens MIDI acessíveis a software de computador/aplicações web (como DAWs ou sintetizadores digitais) que recebem essas mensagens e geram os sons correspondentes, completando a ligação.

Existem inúmeras estações DAW gratuitas (e algumas de código aberto e multiplataforma), como o LMMS, que pode descarregar e configurar para reproduzir entrada MIDI. O método mais fácil é tocar diretamente a partir do navegador através de uma aplicação web como midi.city, o Online Sequencer e muitas outras que pode descobrir online. Em princípio, aplicações web como o midi.city detetam facilmente o seu instrumento MIDI (o micro:bit, neste caso) e estará pronto para tocar depois de conceder ao navegador permissões para aceder ao seu dispositivo (o que lhe será solicitado).

MIDI is a powerful tool for sonification because it allows you to control a wide range of sound parameters, such as pitch, volume, and timbre. This setup allows for multiple Microbits to send MIDI data to a single synthesizer, enabling synchronized sonification of multiple data streams. It also allows a single micro:bit to send MIDI data over multiple MIDI chanels.

Note: On Linux install ttymidi instead of hairlesMIDI and loopMIDI.

Sensor data over MIDI

Previous examples using sensor data can be adapted to send data over MIDI with the Makecode MIDI extension, meaning that the sounds will play not on the micro:bit but through a properly configured computer software/web application. The following example maps the light level to MIDI notes and sends them through MIDI channel 1 [Note 1].

Detailed explanation of the code:

The blocks inside the on start block are evaluated sequentially before anything else in the program when the micro:bit is turned on.

  1. Show a fancy musical note icon on the LED screen just to make it nicer.
  2. Set the Instrument_1 variable to midi channel 1. Thus any changes to the variable Instrument_1 are actions on the MIDI channel 1.
  3. midi use raw serial is what will get the micro:bit to "talk" to the MIDI output device.

The blocks within the block forever are evaluated sequentially in a loop from top to bottom after the on start sequence:

  1. Set the Note variable to a MIDI note by mapping the light level range of possible values to the chosen MIDI range 40 to 85 (within 0 and 128) using the map block.
  2. Set the sound volume of Instrument_1 (on MIDI channel 1) to 100.
  3. Play MIDI note Note (measured light level mapped to MIDI) with Instrument_1 (on MIDI channel 1).
  4. Pause for 250 ms.
  5. Stop playing the MIDI note Note.
  6. Pause for 100 ms.

Using multiple MIDI channels

This example maps the light level to MIDI and uses multiple MIDI channels allowing one to choose to play the notes either with a button or by shaking the micro:bit [Note 1].

Detailed explanation of the code:

The logic behind this example is very similar to the previous one. However, an extra MIDI channel 10 (it could have been any other number between 1 and 16) is set on start as variable Instrument_2. Thus, any changes on this variable are actions on the MIDI channel 10. The mapping of the light level to MIDI is still set within the loop, but the Instrument_1 related blocks and pauses were moved to the input block on button B pressed. The input block on shake just repeats the same code for Instrument_2. Note, that when you play a note, irrespectively of the instrument chosen, a musical note appears and disappears from the LED screen.

Notes

  1. 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 Clique no botão «Simulador» na barra superior para interagir com um micro:bit virtual e testar o código. Pode editar o código clicando em «Editar» no canto superior direito. Cite error: Invalid <ref> tag; name "code" defined multiple times with different content