Sonificação em tempo real
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

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.

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:

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:

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:
- 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)
- 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.
- Defina a variável x-Min para o valor mais baixo possível medido para o nível de luminosidade, 0.
- 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:
- Set the x variable to the measured light level
- 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.
- Defina a variável x-Min para o valor mais baixo possível medido para o nível de luminosidade, 0.
- 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:
- Define a variável x com o nível de luz medido
- Reproduz um tom D agudo durante 1 batida.
- 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:



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:

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):
- Instale a MIDI Extension para o Makecode.
- Crie um [programa muito básico [1] utilizando a extensão MIDI] para testar a sua configuração.
- 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.
- Instale o loopMIDI, abra-o e clique no botão + no canto inferior esquerdo para criar uma nova porta virtual.
- Volte à janela do HairlessMIDI e, no menu suspenso de saída MIDI, selecione loopMIDI port
- Pode ser necessário desligar e ligar novamente o micro:bit para que funcione.
- 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).
O MIDI é uma ferramenta poderosa para a sonificação, pois permite controlar uma vasta gama de parâmetros sonoros, tais como a altura do som, o volume e o timbre. Esta configuração permite que vários micro:bits enviem dados MIDI para um único sintetizador, possibilitando a sonificação sincronizada de vários fluxos de dados. Também permite que um único micro:bit envie dados MIDI através de vários canais MIDI.
Nota: No Linux, instale o ttymidi em vez do hairlesMIDI e do loopMIDI.
Dados do sensor via MIDI
Os exemplos anteriores que utilizam dados de sensores podem ser adaptados para enviar dados via MIDI com a extensão Makecode MIDI, o que significa que os sons não serão reproduzidos no micro:bit, mas sim através de um software de computador ou aplicação web devidamente configurado. O exemplo seguinte mapeia o nível de luz para notas MIDI e envia-as através do canal MIDI 1 [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.
- Mostrar um ícone elegante de nota musical no ecrã LED apenas para melhorar a aparência.
- Defina a variável Instrument_1 como canal MIDI 1. Assim, quaisquer alterações na variável Instrument_1 correspondem a ações no canal MIDI 1.
- midi use raw serial é o que fará com que o micro:bit "comunique" com o dispositivo de saída MIDI.
Os blocos dentro do bloco forever são avaliados sequencialmente num ciclo, de cima para baixo, após a sequência on start:
- Defina a variável Note como uma nota MIDI, mapeando o intervalo de valores possíveis do nível de luz para o intervalo MIDI escolhido, de 40 a 85 (entre 0 e 128), utilizando o bloco map.
- Defina o volume do som do Instrument_1 (no canal MIDI 1) para 100.
- Reproduza a nota MIDI Note (nível de luz medido mapeado para MIDI) com Instrument_1 (no canal MIDI 1).
- Faça uma pausa de 250 ms.
- Pare de reproduzir a nota MIDI Note.
- Faça uma pausa de 100 ms.
Utilização de vários canais MIDI
Este exemplo mapeia o nível de luz para MIDI e utiliza vários canais MIDI, permitindo escolher entre tocar as notas com um botão ou agitando o micro:bit [Note 1]
Explicação detalhada do código:
A lógica por trás deste exemplo é muito semelhante à do exemplo anterior. No entanto, um canal MIDI adicional, o canal 10 (poderia ter sido qualquer outro número entre 1 e 16), é definido «no início» como a variável «Instrument_2». Assim, quaisquer alterações nesta variável traduzem-se em ações no canal MIDI 10. O mapeamento do nível de luz para o MIDI continua definido dentro do loop, mas os blocos relacionados com Instrument_1 e as pausas foram movidos para o bloco de entrada ao premir o botão B. O bloco de entrada ao agitar apenas repete o mesmo código para Instrument_2. Note que, quando toca uma nota, independentemente do instrumento escolhido, uma nota musical aparece e desaparece do ecrã LED.
Notas
- ↑ 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 Cite error: Invalid<ref>tag; name "code" defined multiple times with different content Cite error: Invalid<ref>tag; name "code" defined multiple times with different content