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
To map and play directly from a micro:bit sensor you can use the following block with a dropdown menu for choosing the sensor. The input range is automatically selected to match the minimum and maximum values that can be obtained from the micro:bit sensors.
Although the hard work is behind the curtains, this makes it more challenging for you to innovate in sonification :)
This example is equivalent to the real-time sonification example using the sonification map function for single value as follows.
Map and play a single value on a music scale
The map function returns an integer number from mapping a number on a certain range [low, high] to a specified music scale on a specified number of octaves. For instance, the following example maps the light level value on the range [0,255] to Middle C Major on 1 octave and plays it for 500 ms forever:
Other sensors (including external sensors connected through pins to the micro:bit) and different input ranges can be used as well. This is useful for real-time sonification, when you sonify the data at the same time you collect it.
For instance, the following example maps the light level value on the range [0,255] to Middle C Major on 1 octave and plays it for 500 ms forever:
Other sensors (including external sensors connected through pins to the micro:bit) and different input ranges can be used as well. This is useful for real-time sonification, when you sonify the data at the same time you collect it.
Map and play on a custom scale
You can easily create your own music scales with arrays and serve them as input to the map functions to map and play any number value on your custom scale. The input array must contain the frequency ratios relative to the root frequency.
For instance, the following maps the light level value on the range [0,255] to Middle C harmonic on 1 octave and plays it for 500 ms:
where harmonic is an array of numbers containing the frequency ratios of the harmonic scale. Since each tone in the harmonic scale is exactly one octave apart from the previous tone, changing the octave number in this particular case will just expand the range of the harmonic series.
Sonification via MIDI (The micro:bit as a MIDI instrument)
The sound produced by the speaker (buzzer) of the micro:bit has little power and does not play low frequencies. The micro:bit is also very limited in its capacity to generate multiple sounds simultaneously and sounds with more complex timbres. In the last example, we used a "trick" to sonify values of multiple inputs. We used the pause (duration of silence between consequent sounds) as a sonification output. Smart but what we would really enjoy would be several sounds simultaneously playing and expressing several layers of data. We can obtain better sound quality and play more instruments at the same time using the midi protocol.
MIDI is a protocol that facilitates real-time communication between electronic musical instruments. MIDI stands for Musical Instrument Digital Interface and it was developed in the early ’80s for storing, editing, processing, and reproducing sequences of digital events connected to sound-producing electronic instruments, especially those using the 88-note chromatic compass of a piano-keyboard. We can roughly, but easily, understand MIDI as the advanced successor of the “piano rolls”, which, more than a century ago, were perforated papers or pinned cylinders, in which music performances were either recorded (in real-time) or notated (in step time). These paper-rolls were then played automatically by specially designed mechanical instruments, the mechanical pianos (pianolas) or music machines, using them as their “program”.
Setup the MIDI
The following video explains in detail how to connect the micro:bit to your DAW (Digital Audio Workstation) or digital synthesizer through MIDI on Windows:
Step-by-step instructions (see the video):
- Install the MIDI Extension for Makecode.
- Create a very basic program using the MIDI extension to test your setup.
- Install Hairless MIDI, open it, and from serial port drop-down menu select the com port (USB port) to which the micro:bit is connected to.
- Install loopMIDI, open it, and click the + button at the bottom-left corner to create a new virtual port.
- Go back to the HairlessMIDI window and on the MIDI out drop-down menu select loopMIDI port
- You might need to unplug and plug in the micro:bit again for it to work.
- You are ready to play!
How it works: The micro:bit sends MIDI messages through serial communication. These messages are then received by Hairless MIDI, which forwards them to LoopMIDI. Acting as a virtual MIDI port, LoopMIDI makes the MIDI messages accessible to computer software/web apps (like DAWs or digital synthesizers) that receive these messages and generate the corresponding sounds, completing the connection.
There are plenty of free (and some open-source, cross-platform) DAW stations like LMMS that you can download and configure to play MIDI input. The easiest method is to play directly from the browser through a web app such as midi.city, the Online Sequencer and many others to discover online. In principle, web apps such as midi.city will readily detect your midi instrument (the micro:bit in this case) and you are ready to play after giving the browser permissions to access your device (which you will be asked to do).
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.
- Show a fancy musical note icon on the LED screen just to make it nicer.
- Set the Instrument_1 variable to midi channel 1. Thus any changes to the variable Instrument_1 are actions on the MIDI channel 1.
- 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:
- 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.
- Set the sound volume of Instrument_1 (on MIDI channel 1) to 100.
- Play MIDI note Note (measured light level mapped to MIDI) with Instrument_1 (on MIDI channel 1).
- Pause for 250 ms.
- Stop playing the MIDI note Note.
- 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.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