Real-time sonification/es: Difference between revisions

From Soundscapes
Jump to navigation Jump to search
No edit summary
(Created page with "<references group="Note" />")
 
(75 intermediate revisions by the same user not shown)
Line 84: Line 84:


<span id="Change_pith_with_fixed_rhythm"></span>
<span id="Change_pith_with_fixed_rhythm"></span>
==== Cambio de la médula con ritmo fijo ====
==== Cambiar el tono con ritmo fijo ====


<div lang="en" dir="ltr" class="mw-content-ltr">
En este ejemplo, mostramos cómo asignar el '''nivel de luz''' a un rango de frecuencias. El sensor de luz interno del micro:bit proporciona un valor entre 0 (oscuro) y 255 (muy brillante). Llamamos a este valor de entrada variable '''x'''. También definimos las variables '''x-Min''' y '''x-Max''' con los valores mínimo y máximo de nuestro sensor. Para sonorizar el nivel de luz medido, asignaremos el valor del nivel de luz a un tono entre 200 Hz (valor mínimo) y 2000 Hz (valor máximo), reproducido a un ritmo fijo <ref name="code" group="Note"/>.
In this example, we show how to map the '''light level''' to a frequency range. The internal light sensor of the micro:bit provides a value between 0 (dark) and 255 (very bright). We call this input value variable '''x'''. We also define the variables '''x-Min''' and '''x-Max''' with the minimum and maximum values of our sensor. For the purpose of sonifying the measured light level, we will map the value of the light level to a pitch between 200 Hz (minimum value) and 2000 Hz (maximum value), played at a fixed rhythm <ref name="code" group="Note"/>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML>
<HTML>
<div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S29417-89547-25165-22076" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
<div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S29417-89547-25165-22076" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
</html>
</html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Explicación detallada del código:'''
'''Detailed explanation of the code:'''
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Los bloques dentro del bloque '''on start''' se evalúan secuencialmente antes que cualquier otra cosa en el programa cuando se enciende el micro:bit.
The blocks within the '''on start''' block are evaluated sequentially before anything else in the program when the micro:bit is turned on.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Establece la variable '''x-Min''' al valor mínimo posible de nivel de luz medido '''0'''.
# Set the '''x-Min''' variable  to the light level lowest possible measured value '''0'''.
# Set the '''x-Max''' variable to the light level highest possible measured value '''255'''.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Establece la variable '''x-Max''' al valor máximo posible de nivel de luz medido '''255'''.
The blocks within the block '''forever''' are evaluated sequentially in a loop from top to bottom after the '''on start''' sequence:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Los bloques dentro del bloque '''forever''' se evalúan secuencialmente en un bucle de arriba a abajo después de la secuencia '''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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Establece la variable '''x''' al '''nivel de luz''' medido.
==== Change rhythm with fixed pitch ====
# Reproduce un tono de un tiempo con una frecuencia resultante de asignar el valor '''x''' (en el rango '''x-Mín''' a '''x-Máx''') al rango de frecuencia seleccionado en el bloque '''map'''.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Change_rhythm_with_fixed_pitch"></span>
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 <ref name="code" group="Note"/>.
==== Cambiar el ritmo con tono fijo ====
</div>
 
Otra opción es mantener un tono fijo mientras se varía el ritmo según el nivel de luz. Esto se logra reproduciendo una nota de corta duración e introduciendo pausas que varían en duración, desde 1000 ms (en condiciones de oscuridad) hasta 20 ms (en condiciones de mucha luz). Este enfoque permite una representación auditiva dinámica de los cambios en los niveles de luz.


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML>
<HTML>
<div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_F4g6Y9Fd6WRW" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
<div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_F4g6Y9Fd6WRW" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
</html>
</html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Explicación detallada del código:'''
'''Detailed explanation of the code:'''
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Los bloques dentro del bloque '''on start''' se evalúan secuencialmente antes que cualquier otra cosa en el programa cuando se enciende el micro:bit.
The blocks within the '''on start''' block are evaluated sequentially before anything else in the program when the micro:bit is turned on.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Establece la variable '''x-Min''' al valor mínimo posible de nivel de luz medido '''0'''.
# Set the '''x-Min''' variable  to the light level lowest possible measured value '''0'''.
# Set the '''x-Max''' variable to the light level highest possible measured value '''255'''.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Establece la variable '''x-Max''' al valor máximo posible de nivel de luz medido '''255'''.
The blocks within the block '''forever''' are evaluated sequentially in a loop from top to bottom after the '''on start''' sequence:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Los bloques dentro del bloque '''forever''' se evalúan secuencialmente en un bucle de arriba a abajo después de la secuencia '''on start''':
# Set the  '''x''' variable to the measured '''light  level'''
# Play a one 1 beat High D tone.
# Pause for a period calculated from mapping the '''x''' value (in the '''x-Min''' to '''x-Max''' range) to the chosen time range in the '''map''' block.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Asigna a la variable '''x''' el valor medido de '''nivel de luz'''.
'''Reminder:''' You can replace the '''light level''' input block with any other micro:bit sensor [https://makecode.microbit.org/reference/input input block] (or any other sensors connected to the micro:bit through the pins) that provide a range of values. Just be sure, to redefine the '''x-Min''' and '''x-Max''' values accordingly, as the [https://makecode.microbit.org/reference/input/acceleration accelerometer] and the [https://makecode.microbit.org/reference/input/compass-heading compass] heading, for instance, work on a different range.
# Reproduce un tono de Re agudo de un tiempo.
</div>
# Haz una pausa durante un periodo calculado al asignar el valor de '''x''' (en el rango '''x-Mín''' a '''x-Máx''') al intervalo de tiempo seleccionado en el bloque '''map'''.


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Recordatorio:''' Puedes reemplazar el bloque de entrada '''nivel de luz''' con cualquier otro sensor de micro:bit [https://makecode.microbit.org/reference/input input block] (o cualquier otro sensor conectado a la micro:bit a través de los pines) que proporcione un rango de valores. Solo asegúrate de redefinir los valores '''x-Min''' y '''x-Max''' en consecuencia, ya que el [https://makecode.microbit.org/reference/input/acceleration accelerometer] y la [https://makecode.microbit.org/reference/input/compass-heading compass] dirección, por ejemplo, funcionan en un rango diferente.
==== Using external input sensors ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Using_external_input_sensors"></span>
To use an external digital/analog sensor on a micro pin or using for instance the I2C protocol (all of these blocks can be found under the advanced categories) you can use the same programs but simply replace the '''light level''' input block with the corresponding block as follows:
==== Uso de sensores de entrada externos ====
</div>


[[File:Soundscapes realtime digitalread.png|350 px|center|<span lang="en" dir="ltr" class="mw-content-ltr">Digital read pin</span>]]
Para usar un sensor digital/analógico externo en un micro pin o usar, por ejemplo, el protocolo I2C (todos estos bloques se pueden encontrar en las categorías avanzadas), puede usar los mismos programas, pero simplemente reemplace el bloque de entrada '''nivel de luz''' con el bloque correspondiente de la siguiente manera:
[[File:Soundscapes realtime analogread.png|350 px|center|<span lang="en" dir="ltr" class="mw-content-ltr">Analog read pin</span>]]
[[File:Soudnscapes realtime i2c.png|700 px|center|<span lang="en" dir="ltr" class="mw-content-ltr">i2c</span>]]


<div lang="en" dir="ltr" class="mw-content-ltr">
[[File:Soundscapes realtime digitalread.png|350 px|center|PIN de lectura digital]]
'''Attention to the pin number or the i2c address!'''
[[File:Soundscapes realtime analogread.png|350 px|center|Pin de lectura analógica]]
</div>
[[File:Soudnscapes realtime i2c.png|700 px|center|i2c]]


<div lang="en" dir="ltr" class="mw-content-ltr">
'''¡Atención al número PIN o a la dirección I2C!'''
=== Multiple inputs mapped to a single sound ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Multiple_inputs_mapped_to_a_single_sound"></span>
Sonification systems often serve to provide more than one piece of information. We can map as many variables as the amount of sound parameters we can control. As long as the sound does not become confusing due to the multiple sound layers playing simultaneously. If we consider that a philharmonic orchestra can have over one hundred elements we have some room for overlaying several sounds. Opposite to the visual stimuli where we cannot exceed a certain number, usually inferior to that of audio stimuli. Finally, like in the orchestra, the sounds have to be carefully arranged together in case of large numbers.
=== Múltiples entradas asignadas a un solo sonido ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Los sistemas de sonificación suelen proporcionar más de una información. Podemos mapear tantas variables como parámetros de sonido podamos controlar, siempre y cuando el sonido no resulte confuso debido a la reproducción simultánea de múltiples capas sonoras. Si consideramos que una orquesta filarmónica puede tener más de cien integrantes, disponemos de cierto margen para superponer varios sonidos. Esto contrasta con los estímulos visuales, donde no podemos superar un número determinado, generalmente inferior al de los estímulos auditivos. Finalmente, al igual que en la orquesta, los sonidos deben organizarse cuidadosamente en conjunto cuando se trata de un gran número de ellos.
The following sonifies the '''light level''' mapped to pith with a pause detefined by the '''compass heading''' mapped to milliseconds <ref name="code" group="Note"/>.
 
</div>
Lo siguiente sonoriza el '''nivel de luz''' mapeado a la médula con una pausa definida por el '''rumbo de la brújula''' mapeado a milisegundos <ref name="code" group="Note"/>.


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML>
<HTML>
<div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_4w40bdb7LTjV" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
<div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_4w40bdb7LTjV" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
</html>
</html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="The_SoundScapes_sonification_extension_for_micro:bit"></span>
=== The SoundScapes sonification extension for micro:bit ===
=== La extensión de sonorización SoundScapes para micro:bit ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
En todos los ejemplos anteriores, los números se asignaron a un rango continuo de frecuencias, ¡lo cual es genial! Pero, ¿suena atractivo? Para mejorar la experiencia auditiva, puedes asignar números a una escala musical. La extensión de sonificación SoundScapes para MakeCode micro:bit [https://makecode.microbit.org/pkg/davidnsousa/sonification] facilita este tipo de asignación.  
In all the previous examples, numbers were mapped to a continuous range of frequencies, which is great! But does it sound appealing? To enhance the auditory experience, you can map numbers to a musical scale. The [https://makecode.microbit.org/pkg/davidnsousa/sonification SoundScapes sonification extension for MakeCode micro:bit] makes this type of mapping easy and accessible.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
A continuación se muestra cómo instalar la extensión:
The following shows how to install the extension:
</div>


[[File:Install-sonification-extension.gif |600 px|center|<span lang="en" dir="ltr" class="mw-content-ltr">Install datalogger extension</span>]]
[[File:Install-sonification-extension.gif |600 px|center|Instalar la extensión del registrador de datos]]


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Map_and_play_directly_from_a_micro:bit_sensor"></span>
==== Map and play directly from a micro:bit sensor ====
==== Mapear y reproducir directamente desde un sensor micro:bit ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Para mapear y reproducir directamente desde un sensor de micro:bit, puedes usar el siguiente bloque con un menú desplegable para seleccionar el sensor. El rango de entrada se selecciona automáticamente para que coincida con los valores mínimo y máximo que pueden obtenerse de los sensores de 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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML><div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S46900-26939-17526-29927" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></HTML>
<HTML><div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S46900-26939-17526-29927" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></HTML>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Aunque el trabajo duro se realiza entre bastidores, esto hace que sea más difícil para ti innovar en sonificación :)
Although the hard work is behind the curtains, this makes it more challenging for you to innovate in sonification :)
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Este ejemplo es equivalente al ejemplo de sonificación en tiempo real que utiliza la función '''map''' de sonificación para un solo valor, como se muestra a continuación.
This example is equivalent to the real-time sonification example using the sonification '''map''' function for single value as follows.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Map_and_play_a_single_value_on_a_music_scale"></span>
==== Map and play a single value on a music scale ====
==== Mapear y reproducir un único valor en una escala musical ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
La función '''map''' devuelve un número entero que corresponde a una escala musical específica en un número determinado de octavas, en un rango específico. Por ejemplo, el siguiente ejemplo asigna el valor '''light level''' del rango [0,255] a Do mayor central en 1 octava y lo reproduce durante 500 ms indefinidamente:
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:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML><div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S52170-83121-65302-12966" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></HTML>
<HTML><div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S52170-83121-65302-12966" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></HTML>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
También se pueden usar otros sensores (incluidos sensores externos conectados mediante pines a la micro:bit) y diferentes rangos de entrada. Esto resulta útil para la sonificación en tiempo real, donde se procesan los datos simultáneamente a su recopilación.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Por ejemplo, el siguiente ejemplo asigna el valor del nivel de luz en el rango [0,255] a Do mayor central en 1 octava y lo reproduce durante 500 ms indefinidamente:
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:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML><div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S52170-83121-65302-12966" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></HTML>
<HTML><div style="position:relative;height:0;padding-bottom:40%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S52170-83121-65302-12966" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></HTML>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
También se pueden usar otros sensores (incluidos sensores externos conectados mediante pines a la micro:bit) y diferentes rangos de entrada. Esto resulta útil para la sonificación en tiempo real, donde se procesan los datos simultáneamente a su recopilación.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Map_and_play_on_a_custom_scale"></span>
==== Map and play on a custom scale ====
==== Mapear y reproducir a escala personalizada ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Puedes crear fácilmente tus propias escalas musicales con matrices y usarlas como entrada para las funciones de mapeo, que te permitirán reproducir cualquier valor numérico en tu escala personalizada. La matriz de entrada debe contener las relaciones de frecuencia con respecto a la frecuencia fundamental.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Por ejemplo, el siguiente código asigna el valor '''nivel de luz''' en el rango [0,255] al armónico de Do central en 1 octava y lo reproduce durante 500 ms:
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:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML><div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S52429-19885-94270-50677" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></html>
<HTML><div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:S52429-19885-94270-50677" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div></html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
donde '''armónico''' es una matriz de números que contiene las relaciones de frecuencia de la escala armónica. Dado que cada tono en la escala armónica está exactamente a una octava del tono anterior, cambiar el número de octava en este caso particular simplemente ampliará el rango de la serie armónica.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Sonification_via_MIDI_(The_micro:bit_as_a_MIDI_instrument)"></span>
=== Sonification via MIDI (The micro:bit as a MIDI instrument) ===
=== Sonificación mediante MIDI (El micro:bit como instrumento MIDI) ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
El sonido que produce el altavoz (zumbador) del micro:bit tiene poca potencia y no reproduce frecuencias bajas. El micro:bit también tiene una capacidad muy limitada para generar varios sonidos simultáneamente y sonidos con timbres más complejos. En el último ejemplo, utilizamos un truco para sonorizar valores de múltiples entradas. Usamos la pausa (duración del silencio entre sonidos consecutivos) como salida de sonorización. Es ingenioso, pero lo que realmente nos gustaría es que varios sonidos se reprodujeran simultáneamente y expresaran varias capas de datos. Podemos obtener una mejor calidad de sonido y tocar más instrumentos al mismo tiempo usando el protocolo MIDI.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
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.  
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”.
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”.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Setup_the_MIDI"></span>
==== Setup the MIDI ====
==== Configurar el MIDI ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
El siguiente vídeo explica en detalle cómo conectar el micro:bit a tu DAW (estación de trabajo de audio digital) o sintetizador digital mediante MIDI en Windows:
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:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<html>
<html>
<center>
<center>
Line 303: Line 217:
</center>
</center>
</html>
</html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Instrucciones paso a paso (ver el vídeo):'''
'''Step-by-step instructions (see the video):'''
 
</div>
# Instala la extensión MIDI [https://makecode.microbit.org/pkg/microsoft/pxt-midi] para Makecode.
 
# Crea un programa [https://makecode.microbit.org/_RKp9zi8Jw11L] muy básico usando la extensión MIDI para probar la configuración.


<div lang="en" dir="ltr" class="mw-content-ltr">
# Instala [https://projectgus.github.io/hairless-midiserial/ Hairless MIDI], ábrelo y, en el menú desplegable de puerto serie, selecciona el puerto COM (puerto USB) al que está conectada la micro:bit.
# Install the [https://makecode.microbit.org/pkg/microsoft/pxt-midi MIDI Extension] for Makecode.
# Create a [https://makecode.microbit.org/_RKp9zi8Jw11L very basic program using the MIDI extension] to test your setup.
# Install [https://projectgus.github.io/hairless-midiserial/ 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 [https://www.tobias-erichsen.de/software/loopmidi.html 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!
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Instala [https://www.tobias-erichsen.de/software/loopmidi.html loopMIDI], ábrelo y haz clic en el botón '''+'' en la esquina inferior izquierda para crear un nuevo puerto virtual.
'''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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Vuelve a la ventana de HairlessMIDI y, en el menú desplegable de salida MIDI, selecciona '''puerto loopMIDI'''.
There are plenty of free (and some open-source, cross-platform) DAW stations like [https://lmms.io/ LMMS] that you can download and configure to play
# Es posible que tengas que desconectar y volver a conectar la micro:bit para que funcione.
MIDI input. The easiest method is to play directly from the browser through a web app such as [https://midi.city/ midi.city], the [https://onlinesequencer.net/ 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).
# ¡Estás listo para jugar!
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Cómo funciona:''' El micro:bit envía mensajes MIDI mediante comunicación serial. Estos mensajes son recibidos por Hairless MIDI, que los reenvía a LoopMIDI. LoopMIDI, que actúa como un puerto MIDI virtual, hace que los mensajes MIDI sean accesibles para software informático o aplicaciones web (como estaciones de trabajo de audio digital o sintetizadores digitales) que reciben estos mensajes y generan los sonidos correspondientes, completando así la conexión.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Existen numerosas estaciones de trabajo de audio digital (DAW) gratuitas (y algunas de código abierto y multiplataforma) como [https://lmms.io/ LMMS] que puedes descargar y configurar para reproducir entrada MIDI. El método más sencillo es reproducir directamente desde el navegador mediante una aplicación web como [https://midi.city/ midi.city], [https://onlinesequencer.net/ Online Sequencer] y muchas otras que puedes encontrar en línea. En principio, aplicaciones web como midi.city detectarán fácilmente tu instrumento MIDI (el micro:bit en este caso) y podrás empezar a reproducir tras otorgar al navegador los permisos necesarios para acceder a tu dispositivo (lo cual se te solicitará).
'''Note:''' On Linux install [http://www.varal.org/ttymidi/ ttymidi] instead of hairlesMIDI and loopMIDI.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
MIDI es una herramienta poderosa para la sonorización, ya que permite controlar una amplia gama de parámetros de sonido, como el tono, el volumen y el timbre. Esta configuración permite que varios Micro:bit envíen datos MIDI a un solo sintetizador, posibilitando la sonorización sincronizada de múltiples flujos de datos. También permite que un solo micro:bit envíe datos MIDI a través de múltiples canales MIDI.
==== Sensor data over MIDI ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Nota:''' En Linux, instale [http://www.varal.org/ttymidi/ ttymidi] en lugar de hairlesMIDI y loopMIDI.
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 <ref name="code" group="Note"/>.
 
</div>
<span id="Sensor_data_over_MIDI"></span>
==== Datos del sensor a través de MIDI ====
 
Los ejemplos anteriores que utilizan datos de sensores se pueden adaptar para enviar datos a través de MIDI con la extensión MIDI de Makecode, lo que significa que los sonidos se reproducirán no en el micro:bit sino a través de un software/aplicación web de computadora configurado correctamente. El siguiente ejemplo asigna el '''nivel de luz''' a notas MIDI y las envía a través del canal MIDI 1 <ref name="code" group="Note"/>.


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML>
<HTML>
<div style="position:relative;height:0;padding-bottom:60%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_gdURLxbmvCqo" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
<div style="position:relative;height:0;padding-bottom:60%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_gdURLxbmvCqo" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
</html>
</html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Explicación detallada del código:'''
'''Detailed explanation of the code:'''
 
</div>
Los bloques dentro del bloque '''on start''' se evalúan secuencialmente antes que cualquier otra cosa en el programa cuando se enciende el micro:bit.
 
# Muestra un elegante icono de nota musical en la pantalla LED para que se vea mejor.
 
# Asigna la variable '''Instrument_1''' al canal MIDI 1. Por lo tanto, cualquier cambio en la variable '''Instrument_1''' se aplicará al canal MIDI 1. # '''midi use raw serial''' permite que la micro:bit se comunique con el dispositivo de salida MIDI.
 
Los bloques dentro del bloque '''forever''' se evalúan secuencialmente en un bucle de arriba a abajo después de la secuencia '''on start''':
 
# Asigna una nota MIDI a la variable '''Note''' mapeando el rango de valores posibles de '''light level''' al rango MIDI seleccionado de 40 a 85 (entre 0 y 128) mediante el bloque '''map'''.


<div lang="en" dir="ltr" class="mw-content-ltr">
# Establece el volumen de '''Instrument_1''' (en el canal MIDI 1) a 100.
The blocks inside the '''on start''' block are evaluated sequentially before anything else in the program when the micro:bit is turned on.
# Reproduce la nota MIDI '''Note''' (nivel de luz medido mapeado a MIDI) con '''Instrument_1''' (en el canal MIDI 1).
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Pausa de 250 ms.
# 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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Deja de reproducir la nota MIDI '''Note'''.
The blocks within the block '''forever''' are evaluated sequentially in a loop from top to bottom after the '''on start''' sequence:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
# Pausa de 100 ms.
# 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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Using_multiple_MIDI_channels"></span>
==== Using multiple MIDI channels ====
==== Uso de múltiples canales MIDI ====
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Este ejemplo asigna el '''nivel de luz''' a MIDI y utiliza múltiples canales MIDI, lo que permite elegir reproducir las notas con un botón o agitando el micro:bit <ref name="code" group="Note"/>.
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 <ref name="code" group="Note"/>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<HTML>
<HTML>
<div style="position:relative;height:0;padding-bottom:75%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_it6bszWsMeyq" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
<div style="position:relative;height:0;padding-bottom:75%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://makecode.microbit.org/#pub:_it6bszWsMeyq" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe></div>
</html>
</html>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
'''Explicación detallada del código:'''
'''Detailed explanation of the code:'''
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
La lógica de este ejemplo es muy similar a la del anterior. Sin embargo, se ha añadido un canal MIDI adicional, el 10 (que podría haber sido cualquier otro número entre 1 y 16), configurado como variable '''Instrumento_2''' al inicio. Por lo tanto, cualquier cambio en esta variable se traduce en acciones sobre el canal MIDI 10. La asignación del nivel de luz al MIDI se mantiene dentro del bucle, pero los bloques relacionados con '''Instrumento_1''' y las '''pausas''' se han trasladado al bloque de entrada '''al pulsar el botón B'''. El bloque de entrada '''al agitar''' simplemente repite el mismo código para '''Instrumento_2'''. Cabe destacar que, al reproducir una nota, independientemente del instrumento seleccionado, aparece y desaparece una nota musical de la pantalla LED.
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.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Notes"></span>
==Notes==
==Notas==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<references group="Note" />
<references group="Note" />
</div>

Latest revision as of 20:41, 15 April 2026

La sonificación en tiempo real es una técnica fascinante que puede fomentar la participación de los estudiantes en las áreas STEAM (Ciencia, Tecnología, Ingeniería, Arte y Matemáticas). Esto significa que, debido a la velocidad del proceso, no podemos percibir el intervalo de tiempo entre la adquisición de datos y el sonido producido por el dispositivo de sonificación. Además, los métodos para crear representaciones sonoras de los datos se definen simultáneamente con la recopilación de datos (en tiempo real).

Antes de comenzar, queremos enfatizar que la calidad del sonido, que es subjetiva y por lo tanto depende del gusto del usuario, debe ser tal que al menos no lo moleste. Por el contrario, si fuera lo suficientemente atractivo como para captar su atención, mejor. Por otro lado, al intentar hacer algo "agradable" existe el riesgo de generar resultados de sonido que no cumplan con el objetivo de describir adecuadamente el comportamiento de los datos de entrada. Por lo tanto, es necesario encontrar un compromiso: el sonido debe ser suficientemente agradable y, a la vez, exhaustivamente informativo.

Dispositivos de sonificación en tiempo real

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

Para crear un dispositivo de sonificación en tiempo real, es útil utilizar un microcontrolador. Estos son como "computadoras pequeñas y sencillas" con una sola unidad de procesamiento. Sin embargo, no son computadoras propiamente dichas. Su arquitectura es mucho más simple y no pueden ejecutar un sistema operativo. Aun así, se pueden programar para ejecutar un único programa a la vez, el cual puede realizar múltiples tareas de forma secuencial, según el orden de las instrucciones del programa. Existen varios tipos de microcontroladores, siendo Arduino (arduino.cc) el más popular.

Para empezar, el proyecto SoundScapes sugiere usar el microcontrolador BBC micro:bit. Esta herramienta es muy sencilla de usar, versátil e incluye varios sensores integrados listos para usar, lo que elimina la necesidad de construir un circuito eléctrico específico para su funcionamiento. El micro:bit se puede programar en línea con Makecode (usando el navegador Chrome para una mejor compatibilidad) en Python, JavaScript o bloques.

Sonificación con micro:bit

Antes de adentrarte en la sonorización con micro:bit, primero debes familiarizarte con el entorno de programación Makecode [1]. En la página principal encontrarás varios tutoriales, como el del "Corazón parpadeante" y el de la "Etiqueta de nombre", entre los que puedes elegir para empezar. Si te registras en la plataforma, tus proyectos se guardarán en tu cuenta y podrás acceder a ellos desde cualquier dispositivo siempre que inicies sesión. De lo contrario, se guardarán como cookies; sin embargo, podrías perderlos si borras la caché de tu navegador.

Conceptos de sonido en micro:bit

En el editor Makecode [2], existe una útil y atractiva biblioteca dedicada a la música, especialmente para jóvenes estudiantes. Esta biblioteca [3] ofrece varios comandos/bloques que facilitan la generación de sonidos y la creación de melodías. Hay muchos bloques y combinaciones de bloques que puedes usar para generar diferentes tipos de sonidos. Aquí te presentamos los bloques más básicos y avanzamos hacia ejemplos más complejos. Es un buen ejercicio experimentar con los diferentes bloques y escuchar lo que sucede para familiarizarte con ellos.

Categoría de música del editor Makecode

Generar un solo tono

El siguiente código genera un tono único con una frecuencia predefinida de Do central y una duración de 1 tiempo al presionar el botón A, o un sonido continuo de Mi central al presionar el botón B. Es posible cambiar la frecuencia de los tonos haciendo clic en los campos de entrada blancos con los valores "Do central" y "Mi central". Desde las flechas del menú desplegable, también es posible cambiar la duración del tiempo del tono "Do central" y si el sonido se reproduce secuencialmente con otros bloques de comandos, en segundo plano o en bucle. [Note 1].

Tocar una melodía

Para reproducir una melodía, utilice el siguiente bloque y haga clic en él para crearla:

Reproducir bloque de melodía

El siguiente código de ejemplo reproduce dos melodías con diferentes valores de BPM para los botones A y B, y detiene todos los sonidos cuando se presionan A y B simultáneamente. Es posible cambiar las melodías haciendo clic en los campos de entrada blancos con las notas musicales de colores. Al igual que en el ejemplo anterior, también es posible cambiar la duración del ritmo y si el sonido se reproduce secuencialmente con otros bloques de comandos, en segundo plano o en bucle [Note 1].

Manipular el cambio de frecuencia, la forma de onda, el volumen y la duración

También es posible generar sonidos más complejos manipulando el cambio de frecuencia, la forma de onda, el volumen y la duración con el siguiente bloque:

Bloque de sonidos complejos

El siguiente ejemplo reproduce dos sonidos complejos secuencialmente de forma indefinida [Note 1]:

Sonificación de un booleano

En informática, un tipo de dato booleano, o lógico, es una primitiva fundamental que puede contener uno de dos valores posibles: verdadero o falso, representados a menudo como 1 o 0. Para ilustrar este concepto, sonorizaremos el tipo de dato más simple: el booleano. Algunos ejemplos comunes de sensores que generan datos booleanos son los sensores de presencia, los sensores de contacto, los interruptores y los botones.

A continuación se implementa la sonorización de un sensor booleano utilizando el micro:Bit, centrándonos específicamente en el botón A. Al pulsar el botón, oiremos la nota C, y al soltarlo, la nota cambiará a F. Esta retroalimentación auditiva proporciona una representación clara del estado del botón, lo que mejora nuestra comprensión de los datos booleanos en un contexto práctico [Note 1].

Explicación detallada del código:

Los bloques se evalúan secuencialmente de arriba a abajo dentro del bloque de bucle forever que repite la siguiente secuencia de evaluación hasta que algo detiene el programa:

  1. Asigna a la variable X el estado del botón (verdadero o falso según si el botón se presionó al momento de evaluar el bloque rosa botón A presionado).
  2. Si la variable/condición X es verdadera (el botón se presionó), tono de llamada (Hz) Do central, tono de llamada (Hz) Mi central

Sonificación de un rango de valores (usando sensores de entrada)

La mayoría de los sensores proporcionan un rango de valores, no solo 0 o 1. En ese caso, primero debemos determinar los valores mínimo y máximo posibles antes de definir la configuración para la sonorización. Esta entrada variable del sensor puede provenir del sensor de nivel de luz, el acelerómetro, el magnetómetro, la intensidad del sonido captado por el micrófono u otros sensores conectados al micro:bit mediante los pines. El microcontrolador puede recopilar fácilmente estos datos.

Cambiar el tono con ritmo fijo

En este ejemplo, mostramos cómo asignar el nivel de luz a un rango de frecuencias. El sensor de luz interno del micro:bit proporciona un valor entre 0 (oscuro) y 255 (muy brillante). Llamamos a este valor de entrada variable x. También definimos las variables x-Min y x-Max con los valores mínimo y máximo de nuestro sensor. Para sonorizar el nivel de luz medido, asignaremos el valor del nivel de luz a un tono entre 200 Hz (valor mínimo) y 2000 Hz (valor máximo), reproducido a un ritmo fijo [Note 1].

Explicación detallada del código:

Los bloques dentro del bloque on start se evalúan secuencialmente antes que cualquier otra cosa en el programa cuando se enciende el micro:bit.

  1. Establece la variable x-Min al valor mínimo posible de nivel de luz medido 0.
  1. Establece la variable x-Max al valor máximo posible de nivel de luz medido 255.

Los bloques dentro del bloque forever se evalúan secuencialmente en un bucle de arriba a abajo después de la secuencia on start:

  1. Establece la variable x al nivel de luz medido.
  2. Reproduce un tono de un tiempo con una frecuencia resultante de asignar el valor x (en el rango x-Mín a x-Máx) al rango de frecuencia seleccionado en el bloque map.

Cambiar el ritmo con tono fijo

Otra opción es mantener un tono fijo mientras se varía el ritmo según el nivel de luz. Esto se logra reproduciendo una nota de corta duración e introduciendo pausas que varían en duración, desde 1000 ms (en condiciones de oscuridad) hasta 20 ms (en condiciones de mucha luz). Este enfoque permite una representación auditiva dinámica de los cambios en los niveles de luz.

Explicación detallada del código:

Los bloques dentro del bloque on start se evalúan secuencialmente antes que cualquier otra cosa en el programa cuando se enciende el micro:bit.

  1. Establece la variable x-Min al valor mínimo posible de nivel de luz medido 0.
  1. Establece la variable x-Max al valor máximo posible de nivel de luz medido 255.

Los bloques dentro del bloque forever se evalúan secuencialmente en un bucle de arriba a abajo después de la secuencia on start:

  1. Asigna a la variable x el valor medido de nivel de luz.
  2. Reproduce un tono de Re agudo de un tiempo.
  3. Haz una pausa durante un periodo calculado al asignar el valor de x (en el rango x-Mín a x-Máx) al intervalo de tiempo seleccionado en el bloque map.

Recordatorio: Puedes reemplazar el bloque de entrada nivel de luz con cualquier otro sensor de micro:bit input block (o cualquier otro sensor conectado a la micro:bit a través de los pines) que proporcione un rango de valores. Solo asegúrate de redefinir los valores x-Min y x-Max en consecuencia, ya que el accelerometer y la compass dirección, por ejemplo, funcionan en un rango diferente.

Uso de sensores de entrada externos

Para usar un sensor digital/analógico externo en un micro pin o usar, por ejemplo, el protocolo I2C (todos estos bloques se pueden encontrar en las categorías avanzadas), puede usar los mismos programas, pero simplemente reemplace el bloque de entrada nivel de luz con el bloque correspondiente de la siguiente manera:

PIN de lectura digital
PIN de lectura digital
Pin de lectura analógica
Pin de lectura analógica
i2c
i2c

¡Atención al número PIN o a la dirección I2C!

Múltiples entradas asignadas a un solo sonido

Los sistemas de sonificación suelen proporcionar más de una información. Podemos mapear tantas variables como parámetros de sonido podamos controlar, siempre y cuando el sonido no resulte confuso debido a la reproducción simultánea de múltiples capas sonoras. Si consideramos que una orquesta filarmónica puede tener más de cien integrantes, disponemos de cierto margen para superponer varios sonidos. Esto contrasta con los estímulos visuales, donde no podemos superar un número determinado, generalmente inferior al de los estímulos auditivos. Finalmente, al igual que en la orquesta, los sonidos deben organizarse cuidadosamente en conjunto cuando se trata de un gran número de ellos.

Lo siguiente sonoriza el nivel de luz mapeado a la médula con una pausa definida por el rumbo de la brújula mapeado a milisegundos [Note 1].

La extensión de sonorización SoundScapes para micro:bit

En todos los ejemplos anteriores, los números se asignaron a un rango continuo de frecuencias, ¡lo cual es genial! Pero, ¿suena atractivo? Para mejorar la experiencia auditiva, puedes asignar números a una escala musical. La extensión de sonificación SoundScapes para MakeCode micro:bit [4] facilita este tipo de asignación.

A continuación se muestra cómo instalar la extensión:

Instalar la extensión del registrador de datos
Instalar la extensión del registrador de datos

Mapear y reproducir directamente desde un sensor micro:bit

Para mapear y reproducir directamente desde un sensor de micro:bit, puedes usar el siguiente bloque con un menú desplegable para seleccionar el sensor. El rango de entrada se selecciona automáticamente para que coincida con los valores mínimo y máximo que pueden obtenerse de los sensores de micro:bit.

Aunque el trabajo duro se realiza entre bastidores, esto hace que sea más difícil para ti innovar en sonificación :)

Este ejemplo es equivalente al ejemplo de sonificación en tiempo real que utiliza la función map de sonificación para un solo valor, como se muestra a continuación.

Mapear y reproducir un único valor en una escala musical

La función map devuelve un número entero que corresponde a una escala musical específica en un número determinado de octavas, en un rango específico. Por ejemplo, el siguiente ejemplo asigna el valor light level del rango [0,255] a Do mayor central en 1 octava y lo reproduce durante 500 ms indefinidamente:

También se pueden usar otros sensores (incluidos sensores externos conectados mediante pines a la micro:bit) y diferentes rangos de entrada. Esto resulta útil para la sonificación en tiempo real, donde se procesan los datos simultáneamente a su recopilación.

Por ejemplo, el siguiente ejemplo asigna el valor del nivel de luz en el rango [0,255] a Do mayor central en 1 octava y lo reproduce durante 500 ms indefinidamente:

También se pueden usar otros sensores (incluidos sensores externos conectados mediante pines a la micro:bit) y diferentes rangos de entrada. Esto resulta útil para la sonificación en tiempo real, donde se procesan los datos simultáneamente a su recopilación.

Mapear y reproducir a escala personalizada

Puedes crear fácilmente tus propias escalas musicales con matrices y usarlas como entrada para las funciones de mapeo, que te permitirán reproducir cualquier valor numérico en tu escala personalizada. La matriz de entrada debe contener las relaciones de frecuencia con respecto a la frecuencia fundamental.

Por ejemplo, el siguiente código asigna el valor nivel de luz en el rango [0,255] al armónico de Do central en 1 octava y lo reproduce durante 500 ms:

donde armónico es una matriz de números que contiene las relaciones de frecuencia de la escala armónica. Dado que cada tono en la escala armónica está exactamente a una octava del tono anterior, cambiar el número de octava en este caso particular simplemente ampliará el rango de la serie armónica.

Sonificación mediante MIDI (El micro:bit como instrumento MIDI)

El sonido que produce el altavoz (zumbador) del micro:bit tiene poca potencia y no reproduce frecuencias bajas. El micro:bit también tiene una capacidad muy limitada para generar varios sonidos simultáneamente y sonidos con timbres más complejos. En el último ejemplo, utilizamos un truco para sonorizar valores de múltiples entradas. Usamos la pausa (duración del silencio entre sonidos consecutivos) como salida de sonorización. Es ingenioso, pero lo que realmente nos gustaría es que varios sonidos se reprodujeran simultáneamente y expresaran varias capas de datos. Podemos obtener una mejor calidad de sonido y tocar más instrumentos al mismo tiempo usando el protocolo MIDI.

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”.

Configurar el MIDI

El siguiente vídeo explica en detalle cómo conectar el micro:bit a tu DAW (estación de trabajo de audio digital) o sintetizador digital mediante MIDI en Windows:


Instrucciones paso a paso (ver el vídeo):

  1. Instala la extensión MIDI [5] para Makecode.
  1. Crea un programa [6] muy básico usando la extensión MIDI para probar la configuración.
  1. Instala Hairless MIDI, ábrelo y, en el menú desplegable de puerto serie, selecciona el puerto COM (puerto USB) al que está conectada la micro:bit.
  1. Instala loopMIDI, ábrelo y haz clic en el botón '+ en la esquina inferior izquierda para crear un nuevo puerto virtual.
  1. Vuelve a la ventana de HairlessMIDI y, en el menú desplegable de salida MIDI, selecciona puerto loopMIDI.
  2. Es posible que tengas que desconectar y volver a conectar la micro:bit para que funcione.
  3. ¡Estás listo para jugar!

Cómo funciona: El micro:bit envía mensajes MIDI mediante comunicación serial. Estos mensajes son recibidos por Hairless MIDI, que los reenvía a LoopMIDI. LoopMIDI, que actúa como un puerto MIDI virtual, hace que los mensajes MIDI sean accesibles para software informático o aplicaciones web (como estaciones de trabajo de audio digital o sintetizadores digitales) que reciben estos mensajes y generan los sonidos correspondientes, completando así la conexión.

Existen numerosas estaciones de trabajo de audio digital (DAW) gratuitas (y algunas de código abierto y multiplataforma) como LMMS que puedes descargar y configurar para reproducir entrada MIDI. El método más sencillo es reproducir directamente desde el navegador mediante una aplicación web como midi.city, Online Sequencer y muchas otras que puedes encontrar en línea. En principio, aplicaciones web como midi.city detectarán fácilmente tu instrumento MIDI (el micro:bit en este caso) y podrás empezar a reproducir tras otorgar al navegador los permisos necesarios para acceder a tu dispositivo (lo cual se te solicitará).

MIDI es una herramienta poderosa para la sonorización, ya que permite controlar una amplia gama de parámetros de sonido, como el tono, el volumen y el timbre. Esta configuración permite que varios Micro:bit envíen datos MIDI a un solo sintetizador, posibilitando la sonorización sincronizada de múltiples flujos de datos. También permite que un solo micro:bit envíe datos MIDI a través de múltiples canales MIDI.

Nota: En Linux, instale ttymidi en lugar de hairlesMIDI y loopMIDI.

Datos del sensor a través de MIDI

Los ejemplos anteriores que utilizan datos de sensores se pueden adaptar para enviar datos a través de MIDI con la extensión MIDI de Makecode, lo que significa que los sonidos se reproducirán no en el micro:bit sino a través de un software/aplicación web de computadora configurado correctamente. El siguiente ejemplo asigna el nivel de luz a notas MIDI y las envía a través del canal MIDI 1 [Note 1].

Explicación detallada del código:

Los bloques dentro del bloque on start se evalúan secuencialmente antes que cualquier otra cosa en el programa cuando se enciende el micro:bit.

  1. Muestra un elegante icono de nota musical en la pantalla LED para que se vea mejor.
  1. Asigna la variable Instrument_1 al canal MIDI 1. Por lo tanto, cualquier cambio en la variable Instrument_1 se aplicará al canal MIDI 1. # midi use raw serial permite que la micro:bit se comunique con el dispositivo de salida MIDI.

Los bloques dentro del bloque forever se evalúan secuencialmente en un bucle de arriba a abajo después de la secuencia on start:

  1. Asigna una nota MIDI a la variable Note mapeando el rango de valores posibles de light level al rango MIDI seleccionado de 40 a 85 (entre 0 y 128) mediante el bloque map.
  1. Establece el volumen de Instrument_1 (en el canal MIDI 1) a 100.
  2. Reproduce la nota MIDI Note (nivel de luz medido mapeado a MIDI) con Instrument_1 (en el canal MIDI 1).
  1. Pausa de 250 ms.
  1. Deja de reproducir la nota MIDI Note.
  1. Pausa de 100 ms.

Uso de múltiples canales MIDI

Este ejemplo asigna el nivel de luz a MIDI y utiliza múltiples canales MIDI, lo que permite elegir reproducir las notas con un botón o agitando el micro:bit [Note 1].

Explicación detallada del código:

La lógica de este ejemplo es muy similar a la del anterior. Sin embargo, se ha añadido un canal MIDI adicional, el 10 (que podría haber sido cualquier otro número entre 1 y 16), configurado como variable Instrumento_2 al inicio. Por lo tanto, cualquier cambio en esta variable se traduce en acciones sobre el canal MIDI 10. La asignación del nivel de luz al MIDI se mantiene dentro del bucle, pero los bloques relacionados con Instrumento_1 y las pausas se han trasladado al bloque de entrada al pulsar el botón B. El bloque de entrada al agitar simplemente repite el mismo código para Instrumento_2. Cabe destacar que, al reproducir una nota, independientemente del instrumento seleccionado, aparece y desaparece una nota musical de la pantalla LED.

Notas

  1. 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Haga clic en el botón "Simulador" en la barra superior para interactuar con un micro:bit virtual y probar el código. Puede editar el código haciendo clic en "Editar" en la esquina superior derecha.