Sonando el pasado. Una guía para historiadores sobre la conversión de datos a sonido

Estoy cansado de mirar al pasado. Hay muchas guías para recrear la aparición de artefactos históricos, pero a menudo olvidamos que este es un acto creativo. Quizás estamos demasiado apegados a nuestras pantallas, le damos demasiada importancia a la apariencia. En cambio, tratemos de escuchar algo del pasado.

La rica literatura sobre arqueoacústica y paisajes sonoros ayuda a recrear el sonido del lugar tal como era (por ejemplo, ver la Catedral virtual de San Pablo o el trabajo de Jeff Veitch sobre la antigua Ostia ). Pero estoy interesado en "expresar" los datos en sí. Quiero definir la sintaxis para representar datos en forma de sonido para que estos algoritmos puedan usarse en la ciencia histórica. Drucker dijo la famosa frase de que "datos" no es realmente lo que se da, sino más bien lo que se captura, transforma, es decir, "capta". Al expresar datos, literalmente reproduzco el pasado en el presente. Por lo tanto, los supuestos y las transformaciones de estos datos salen a la luz. Los sonidos resultantes son una "actuación deformada" que te hace escuchar capas modernas de la historia de una manera nueva.

Quiero escuchar el significado del pasado, pero sé que esto es imposible. Sin embargo, cuando escucho el instrumento, puedo imaginar físicamente al músico; Por ecos y resonancias puedo distinguir el espacio físico. Siento el bajo, puedo moverme al ritmo. La música cubre mi cuerpo, toda mi imaginación. Las asociaciones con sonidos, música y tonos previamente escuchados crean una experiencia temporal profunda, un sistema de relaciones encarnadas entre mí y el pasado. Visualidad? Hemos tenido representaciones visuales del pasado durante tanto tiempo que estas gramáticas casi han perdido su expresividad artística y su aspecto performativo.

En esta lección, aprenderá a hacer ruido a partir de datos históricos. La importancia de este ruido, bueno ... depende de usted. Parte del punto es hacer que sus datos vuelvan a ser desconocidos. Al traducirlos, recodificarlos y restaurarlos , comenzamos a ver elementos de datos que permanecieron invisibles durante el examen visual. Esta deformación es consistente con los argumentos presentados, por ejemplo, por Mark Sample sobre la deformación de la sociedad o Bethany Nouwiski sobre la "resistencia de los materiales" . La puntuación nos lleva de los datos al "subtítulo", de las ciencias sociales al arte, de la falla a la estética . Veamos cómo se ve.

Contenido



Metas y objetivos


En este tutorial, analizaré tres formas de generar sonido o música a partir de sus datos.

Primero, utilizaremos el sistema de algoritmos musicales gratuito y abierto desarrollado por Jonathan Middleton. En él nos familiarizaremos con los problemas y términos clave. Luego, tomaremos una pequeña biblioteca de Python para "traducir" los datos al teclado de 88 teclas y aportar algo de creatividad al trabajo. Finalmente, suba los datos al programa de procesamiento de sonido y música en tiempo real de Sonic Pi, para el cual se han publicado muchos tutoriales y recursos de referencia.

Verá cómo trabajar con sonidos nos traslada de la visualización simple a un entorno realmente efectivo.

Las herramientas



Muestras de datos



Una pequeña introducción al doblaje


La sonificación es un método para traducir ciertos aspectos de los datos en señales de audio. En general, un método se puede llamar "puntuación" si cumple ciertas condiciones. Estos incluyen la reproducibilidad (otros investigadores pueden procesar los mismos datos de la misma manera y obtener los mismos resultados) y lo que se puede llamar "inteligibilidad" o "inteligibilidad", es decir, cuando elementos significativos de los datos originales se reflejan sistemáticamente en el sonido resultante (ver Hermann, 2008 ). El trabajo de Mark Last y Anna Usyskina (2015) describe una serie de experimentos para determinar qué tareas analíticas se pueden realizar al puntuar los datos. Sus resultados experimentales mostraron que incluso los estudiantes no capacitados (sin entrenamiento musical formal) pueden distinguir entre datos auditivos y sacar conclusiones útiles. Descubrieron que los oyentes podían realizar de oído las tareas generales de la minería de datos, como la clasificación y la agrupación (en sus experimentos transmitían datos científicos básicos en una escala de música occidental).

Last y Usyskina se centraron en la serie temporal. Según sus hallazgos, los datos de series temporales son particularmente adecuados para la puntuación, ya que aquí hay paralelos naturales. La música es consistente, tiene una duración y se desarrolla con el tiempo; también con datos de series temporales ( Last, Usyskina 2015: p. 424 ). Queda por comparar los datos con las salidas de audio correspondientes. En muchas aplicaciones, el método de mapeo de parámetros se utiliza para combinar los aspectos de datos de varias mediciones auditivas, como la altura, la forma variacional y el intervalo (inicio). El problema con este enfoque es que si no hay una conexión temporal (o, más bien, una conexión no lineal) entre los puntos de datos de origen, el sonido resultante puede resultar "confuso" ( 2015: 422 ).

Llenando los espacios en blanco


Al escuchar el sonido, una persona llena los momentos de silencio con sus expectativas. Considere un video donde el mp3 se convierte a MIDI y vuelve a mp3; la música se "aplana", de modo que toda la información de audio se reproduce con un instrumento (el efecto es similar a guardar una página web como .txt, abrirla en Word y luego guardarla nuevamente en formato .html). Todos los sonidos (incluidas las voces) se traducen a los valores de las notas correspondientes y luego se vuelven a mp3.

Esto es ruido, pero puedes captar el punto:


¿Qué está pasando aquí? Si conoces esta canción, probablemente hayas entendido las verdaderas "palabras". ¡Pero la canción no tiene palabras! Si no lo ha escuchado antes, entonces suena como una cacofonía sin sentido (más ejemplos en Sitio web de Andy Bayo). Este efecto a veces se llama alucinación auditiva. El ejemplo muestra cómo en cualquier representación de datos podemos escuchar / ver lo que, estrictamente hablando, no es. Llenamos el vacío con nuestras propias expectativas.

¿Qué significa esto para la historia? Si expresamos nuestros datos y comenzamos a escuchar patrones en sonidos o arrebatos extraños, entonces nuestras expectativas culturales para la música (recuerdos de fragmentos similares de música escuchados en ciertos contextos) influirán en nuestra interpretación. Diría que esto es cierto para todas las ideas sobre el pasado, pero la calificación es bastante diferente de los métodos estándar, por lo que esta autoconciencia ayuda a identificar o expresar ciertos patrones críticos en el (datos sobre) el pasado.

Consideraremos tres herramientas para calificar datos y observaremos cómo la elección de una herramienta afecta el resultado, y cómo resolver este problema al repensar los datos en otra herramienta. En última instancia, la calificación no es más objetiva que la visualización, por lo que el investigador debe estar listo para justificar su elección y hacer que esta opción sea transparente y reproducible. (Para que nadie piense que la partitura y la música generada algorítmicamente es algo nuevo, dirijo al lector interesado a Hedges, 1978 ).

Cada sección contiene una introducción conceptual, seguida de un recorrido utilizando datos arqueológicos o históricos.

Algoritmos musicales


Existe una amplia gama de herramientas para expresar datos. Por ejemplo, paquetes para el entorno estadístico R popular como playitbyR y AudiolyzR . Pero la primera no es compatible con la versión actual de R (la última actualización fue hace varios años), y para que la segunda funcione correctamente, se requiere una configuración seria de software adicional.

Por el contrario, el sitio web Musicalgorithms es bastante fácil de usar; ha estado funcionando durante más de diez años. Aunque el código fuente no ha sido publicado, es un proyecto de investigación a largo plazo en música computacional por Jonathan Middleton. Actualmente se encuentra en la tercera versión principal (las iteraciones anteriores están disponibles en Internet). Comencemos con Musicalalgorithms, porque nos permite descargar y configurar rápidamente nuestros datos para lanzar la presentación como archivos MIDI. Antes de comenzar, asegúrese de seleccionar la tercera versión .


Sitio web de Musicalgorithms a partir del 2 de febrero de 2016

Algoritmos musicales realiza una serie de transformaciones de datos. En el ejemplo a continuación (por defecto en el sitio) solo hay una fila de datos, aunque parece varias filas. Este patrón consta de campos separados por comas, que están separados internamente por espacios.

  # De voces, nombre del área de texto, datos del área de texto
 1, morphBox,
 , areaPitch1,2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3 6 0 2 8
 , dAreaMap1,2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3 6 0 2 8
 , mapArea1.20 69 11 78 20 78 11 78 20 78 40 49 88 1 40 49 20 30 49 30 59 1 20 78
 , dMapArea1.1 5 1 5 1 5 1 5 1 5 3 3 6 0 3 3 1 2 3 2 4 0 1 5
 , so_text_area1.20 69 11 78 20 78 11 78 20 78 40 49 88 1 40 49 20 30 49 30 59 1 20 78 

Estos números representan los datos de origen y sus conversiones. Compartir el archivo permite que otro investigador repita el trabajo o continúe procesando con otras herramientas. Si comienza desde el principio, solo necesita los datos de origen a continuación (lista de puntos de datos):

  # De voces, nombre del área de texto, datos del área de texto
 1, morphBox,
 , terreno de juego 1.24 72 12 84 21 81 14 81 24 81 44 51 94 01 44 51 24 31 5 43 61 04 21 81 

Para nosotros, la clave es el campo 'areaPitch1' con los datos de entrada, que están separados por espacios. Otros campos se completarán durante el trabajo con varias configuraciones de Algoritmos musicales. En los datos anteriores (por ejemplo, 24 72 12 84, etc.), los valores son los cálculos iniciales del número de inscripciones en ciudades británicas a lo largo de la calzada romana (más adelante practicaremos con otros datos).


Después de cargar los datos en la barra de menú superior, puede seleccionar varias operaciones. En la captura de pantalla, al pasar el mouse sobre la información se muestra una explicación de lo que sucede cuando selecciona la operación de división para escalar los datos al rango de nota seleccionado

Ahora, al ver varias pestañas en la interfaz (duración, traducción de altura, traducción de duración, opciones de escala), hay varias transformaciones disponibles. En el mapeo de tono, hay una serie de opciones matemáticas para traducir datos a un teclado de piano completo de 88 teclas (en una traducción lineal, el valor promedio se traduce al promedio C, es decir, 40). También puede elegir el tipo de escala: menor o mayor, y así sucesivamente. En este punto, después de seleccionar varias transformaciones, debe guardar el archivo de texto. En la pestaña Archivo → Reproducir, puede descargar el archivo midi. Su programa de audio predeterminado debería poder reproducir midi (a menudo las notas de piano se usan por defecto). Se asignan herramientas midi más sofisticadas en programas de mezcla como GarageBand (Mac) o LMMS (Windows, Mac, Linux). Sin embargo, el uso de GarageBand y LMMS está más allá del alcance de esta guía: un video tutorial de LMMS está disponible aquí , y los tutoriales de GarageBand están completos en Internet. Por ejemplo, una gran guía en Lynda.com.

Sucede que para los mismos puntos hay varias columnas de datos. Digamos, en nuestro ejemplo de Gran Bretaña, también queremos expresar el cálculo de los tipos de cerámica para las mismas ciudades. Luego puede volver a cargar la siguiente fila de datos, realizar transformaciones y comparaciones, y crear otro archivo MIDI. Como GarageBand y LMMS le permiten superponer voces, puede crear secuencias musicales complejas.


Captura de pantalla de GarageBand, donde los archivos midi son temas del diario de John Adams. En la interfaz de GarageBand (y LMMS), cada archivo midi se arrastra con el mouse al lugar apropiado. El kit de herramientas de cada archivo midi (es decir, pista) se selecciona en el menú GarageBand. Las etiquetas de seguimiento se han cambiado para reflejar las palabras clave en cada tema. El área verde a la derecha es una visualización de las notas en cada pista. Puedes ver esta interfaz en acción y escuchar música aquí.

¿Qué conversiones usar? Si tiene dos columnas de datos, estos son dos votos. Quizás, en nuestros datos hipotéticos, tiene sentido reproducir la primera voz en voz alta como la principal: al final, las inscripciones nos "hablan" de alguna manera (las inscripciones romanas literalmente se refieren a los transeúntes: "Oh, tú que pasas ..."). Y la cerámica es quizás un artefacto más modesto que se puede comparar con el extremo inferior de la escala o aumentar la duración de las notas, lo que refleja su ubicuidad entre los representantes de diferentes clases en esta región.

No existe una única forma "correcta" de traducir datos en sonido , al menos no todavía. Pero incluso en este simple ejemplo, vemos cómo aparecen sombras de significado e interpretación en los datos y su percepción.

¿Pero qué hay del tiempo? Los datos históricos a menudo tienen un enlace de fecha determinada. Por lo tanto, debe considerarse el lapso de tiempo entre dos puntos de datos. Aquí es donde nuestra próxima herramienta se vuelve útil si los puntos de datos están relacionados entre sí en el espacio de tiempo. Estamos comenzando a pasar de la puntuación (puntos de datos) a la música (relaciones entre puntos).

Practica


En la primera columna del conjunto de datos se encuentra el número de monedas romanas y el número de otros materiales de las mismas ciudades. Información tomada del esquema de antigüedades portátiles del Museo Británico. El procesamiento de estos datos puede revelar algunos aspectos de la situación económica a lo largo de Watling Street, la ruta principal a través de la Gran Bretaña romana. Los puntos de datos están ubicados geográficamente de noroeste a sureste; así, a medida que se reproduce el sonido, escuchamos movimiento en el espacio. Cada nota representa cada parada en el camino.

  1. Abra thesonification-roman-data.csv en una hoja de cálculo. Copie la primera columna en un editor de texto. Elimine las terminaciones de línea para que todos los datos estén en la misma línea.
  2. Agregue la siguiente información:

      # De voces, nombre del área de texto, datos del área de texto
     1, morphBox,
     , areaPitch1, 

    ... entonces sus datos siguen inmediatamente después de la última coma (como pltcm ). Guarde el archivo con un nombre significativo, por ejemplo, coinsounds1.csv .
  3. Vaya al sitio web Musicalgorithms (tercera versión) y haga clic en el botón 'Cargar'. En la ventana emergente, haga clic en el botón azul 'Cargar' y seleccione el archivo guardado en el paso anterior. El sitio cargará sus materiales y, si tiene éxito, mostrará una marca de verificación verde. Si este no es el caso, asegúrese de que los valores estén separados por espacios e inmediatamente siga la última coma en el bloque de código. Puede intentar descargar el archivo de demostración de esta guía .


    Después de hacer clic en "Cargar", este cuadro de diálogo aparece en la pantalla principal. Luego haga clic en 'Cargar archivo CSV'. Seleccione su archivo, aparecerá en el campo. Luego haga clic en el botón 'Cargar' en la parte inferior.
  4. Haga clic en 'Pitch Input' y verá los valores de sus datos. No seleccione opciones adicionales en esta página en este momento (por lo tanto, se aplican los valores predeterminados).
  5. Haga clic en 'Entrada de duración'. No seleccione ninguna opción aquí todavía . Estas opciones harán varias transformaciones de sus datos con un cambio en la duración de cada nota. Hasta que te preocupes por estas opciones, sigue adelante.
  6. Haga clic en 'Asignación de tono'. Esta es la opción más importante, ya que traduce (es decir, escala) sus datos sin formato a las teclas del teclado. Deje la mapping en el valor de 'división' (otros parámetros son traducción modular o logarítmica). El parámetro Range de 1 a 88 usa la longitud total del teclado de 88 teclas; así, el valor más bajo corresponderá a la nota más profunda en el piano, y el valor más alto a la nota más alta. En cambio, puede limitar la música a un rango alrededor de C central, luego ingresar un rango de 25 a 60. La salida cambiará de la siguiente manera: 31,34,34,34,25,28,30,60,28,25,26,26,25,25,60,25,25,38,33,26,25,25,25 . Estos no son sus números, sino las notas en el teclado.


    Haga clic en el campo 'Rango' e ingrese 25. Los valores a continuación cambiarán automáticamente. En el campo 'a', configure 60. Si va a otro campo, los valores se actualizarán
  7. Haga clic en 'Mapeo de duración'. Al igual que con la traducción de altura, aquí el programa toma el rango de tiempo especificado y usa varios parámetros matemáticos para traducir este rango en notas. Si pasa el mouse sobre i , verá qué números corresponden a notas enteras, cuartos, octavos, etc. Deje los valores predeterminados por ahora.
  8. Haga clic en 'Opciones de escala'. Aquí comenzamos a trabajar con lo que corresponde en cierto sentido al aspecto "emocional". Por lo general, la escala mayor se percibe como "alegre" y la menor, como "triste"; Una discusión detallada de este tema se puede encontrar aquí . Por ahora, deje 'escalar por: mayor'. Deje 'escala' en C.

Entonces, ¡anunciamos una columna de datos! Haga clic en 'Guardar', luego 'Guardar CSV'.


Cuadro de diálogo "Guardar"

Obtendrá algo como este archivo:

  # De voces, nombre del área de texto, datos del área de texto
 1, morphBox,
 , área de paso 1.80 128 128 128 1 40 77 495 48 2 21 19 1 1 500 1 3 190 115 13 5 1 3
 , dAreaMap1,2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3 6 0 2
 , mapArea1.31 34 34 34 25 28 30 60 28 25 26 26 25 25 60 25 25 38 33 26 25 25 25
 , dMapArea1.1 5 1 5 1 5 1 5 1 5 3 3 6 0 3 3 1 2 3 2 4 0 1
 , so_text_area1.32 35 35 35 25 28 30 59 28 25 27 27 25 25 59 25 25 39 33 27 25 25 25 

Los datos originales permanecieron en el campo 'areaPitch1', y luego las asignaciones creadas van más allá. El sitio le permite generar en un archivo MIDI hasta cuatro voces a la vez. Según los instrumentos que desee usar más adelante, puede elegir generar un archivo MIDI a la vez. Comencemos la música: haga clic en 'Reproducir'. Aquí eliges el ritmo y el instrumento. Puede escuchar sus datos en un navegador o guardarlos como un archivo MIDI con el botón azul 'Guardar archivo MIDI'.

Volvamos al principio y carguemos ambas columnas de datos en esta plantilla:

  # De voces, nombre del área de texto, datos del área de texto
 2, morphBox,
 , areaPitch1,
 , areaPitch2, 


Aquí estamos en la página con los parámetros 'entrada de tono'. En la parte superior de la ventana, especifique dos votos, ahora en cualquier página con parámetros abiertos dos ventanas para dos votos. Como antes, cargamos los datos en formato CSV, pero el archivo debe estar formateado para que los valores 'areaPitch1' y 'areaPitch2' se indiquen allí. Los datos para la primera voz aparecerán a la izquierda y la segunda, a la derecha

Si tenemos varios votos, ¿qué se debe destacar? Tenga en cuenta que con este enfoque, nuestra actuación de voz no tiene en cuenta la distancia entre puntos en el mundo real. Si lo considera, afectará en gran medida el resultado. Por supuesto, la distancia no tiene que estar vinculada a la geografía, sino al tiempo. La siguiente herramienta indicará explícitamente este factor al puntuar.

Configuración de Python brevemente


Esta sección del manual requerirá Python. Si no ha experimentado con este idioma, tendrá que dedicar un tiempo a conocer la línea de comandos . Consulte también la guía de instalación rápida para módulos .

Python ya está instalado en Mac. Puede verificar: presione COMMAND y un espacio, ingrese terminal en el cuadro de búsqueda y haga clic en la aplicación de terminal. El $ type python —version mostrará qué versión de Python ha instalado. En este artículo estamos trabajando con Python 2.7, el código no ha sido probado en Python 3.

Los usuarios de Windows necesitan instalar Python por su cuenta: comience desde esta página , aunque es un poco más complicado de lo que dice. Primero, debe descargar el archivo .msi (Python 2.7). Ejecute el instalador, se instalará en un nuevo directorio, por ejemplo, C:\Python27\ . Luego debe registrar este directorio en las rutas, es decir, indicarle a Windows dónde buscar Python cuando ejecuta el programa Python. Hay varias formas de hacer esto. Quizás la forma más fácil de encontrar Powershell en su computadora (escriba 'powershell' en la barra de búsqueda de Windows). Abra Powershell y en el símbolo del sistema, pegue todo esto:

  [Entorno] :: SetEnvironmentVariable ("Ruta", "$ env: Ruta; C: \ Python27 \; C: \ Python27 \ Scripts \", "Usuario") 

Si no sucede nada presionando Enter, entonces el comando ha funcionado. Para verificar, abra un símbolo del sistema (aquí hay 10 formas de hacerlo ) e ingrese python --version . Debería ver una respuesta que indica Python 2.7.10 o una versión similar.

La última pieza del rompecabezas es un programa llamado Pip . Los usuarios de Mac pueden instalarlo con el comando en el terminal sudo easy_install pip . Los usuarios de Windows tendrán un poco más complicado. En primer lugar, haga clic derecho y guarde el archivo mediante este enlace (si solo hace clic en el enlace, el código get-pip.py se abrirá en el navegador). Mantenlo en algún lugar a la mano. Abra un símbolo del sistema en el directorio donde guardó get-pip.py . Luego escriba python get-pip.py en el símbolo del sistema de python get-pip.py .

Cuando tenga el código de Python que desea ejecutar, péguelo en un editor de texto y guarde el archivo con la extensión .py . Este es un archivo de texto, pero la extensión del archivo le dice a la computadora que use Python para interpretarlo. Se inicia desde la línea de comandos, donde se indica primero el nombre del intérprete y luego el nombre del archivo: python my-cool-script.py .

MIDITime


MIDITime es un paquete de Python desarrollado por Reveal News (anteriormente llamado Centro de Periodismo de Investigación). Repositorio en Github . MIDITime está específicamente diseñado para procesar series de tiempo (es decir, una secuencia de observaciones recopiladas a lo largo del tiempo).

Si bien los algoritmos musicales tienen una interfaz más o menos intuitiva, la ventaja aquí es el código abierto. Más importante aún, la herramienta anterior no puede tener en cuenta los datos teniendo en cuenta el tiempo histórico. MIDITime le permite agrupar información sobre este factor.

Supongamos que tenemos un diario histórico al que se ha aplicado un modelo temático . El resultado resultante puede contener entradas de diario en forma de líneas, y en las columnas habrá una contribución porcentual de cada tema. En este caso, escuchar los valores ayudará a comprender tales patrones de pensamiento desde el diario que es imposible transmitir en forma de gráfico. Escuchar arrebatos inmediatamente perceptibles o repetir patrones musicales que no son visibles en la tabla.

Configuración de MIDITime


Instalación con un comando pip :

 $ pip install miditime 

para las amapolas;

 $ sudo pip install miditime 

bajo Linux;

 > python pip install miditime 

bajo Windows (si la instrucción no funciona, puede probar esta utilidad para instalar Pip).

Practica


Considere un script de ejemplo. Abra un editor de texto, copie y pegue este código:

 #!/usr/bin/python from miditime.miditime import MIDITime # NOTE: this import works at least as of v1.1.3; for older versions or forks of miditime, you may need to use # from miditime.MIDITime import MIDITime # Instantiate the class with a tempo (120bpm is the default) and an output file destination. mymidi = MIDITime(120, 'myfile.mid') # Create a list of notes. Each note is a list: [time, pitch, attack, duration] midinotes = [ [0, 60, 200, 3], #At 0 beats (the start), Middle C with attack 200, for 3 beats [10, 61, 200, 4] #At 10 beats (12 seconds from start), C#5 with attack 200, for 4 beats ] # Add a track with those notes mymidi.add_track(midinotes) # Output the .mid file mymidi.save_midi() 

Guarde el guión como music1.py . En una terminal o línea de comando, ejecútelo:

 $ python music1.py 

Se myfile.mid un nuevo archivo myfile.mid en el myfile.mid . Puede abrirlo para escuchar con Quicktime o Windows Media Player (y agregar herramientas allí en GarageBand o LMMS ).

Music1.py importa miditime (recuerde instalarlo antes de ejecutar el script: pip install miditime ). Luego marca el ritmo. Todas las notas se enumeran por separado, donde el primer número es el tiempo de inicio de la reproducción, la altura (es decir, la nota en sí misma), qué tan fuerte o ritmo se toca la nota (ataque) y su duración. Luego, las notas se graban en la pista, y la pista misma se graba en el archivo myfile.mid .

Juega con el guión, agrega más notas. Aquí están las notas para la canción 'Baa Baa Black Sheep':

  D, D, A, A, B, B, B, B, A
 Baa, Baa, negro, oveja, ¿tienes alguna lana? 

¿Puedes escribir instrucciones para que la computadora toque una melodía (aquí hay un diagrama para ayudar)?

Por cierto Hay un formato de archivo de texto especial para describir música llamado notación ABC . Está más allá del alcance de este artículo, pero puede escribir un guión para calificar, por ejemplo, en hojas de cálculo, comparar los valores de las notas en notación ABC (si alguna vez ha utilizado la construcción IF - THEN en Excel, tiene una idea de cómo hacerlo), y luego a través de sitios como este, la notación ABC se convierte en un archivo .mid.

Subiendo sus propios datos


Este archivo contiene una muestra del modelo de tema de diario John Adams para el sitio web de Macroscope . Aquí solo se dejaron las señales más fuertes, redondeando los valores en las columnas a dos decimales. Para insertar estos datos en el script de Python, debe formatearlos de una manera especial. Lo más difícil es con el campo de fecha.

Para este tutorial, dejemos los nombres de las variables y el resto sin cambios del script de ejemplo. Un ejemplo está diseñado para procesar datos de terremotos; por lo tanto, aquí la "magnitud" puede representarse como nuestra "contribución del tema".

  my_data = [
     {'event_date': <datetime object>, 'magnitude': 3.4},
     {'event_date': <datetime object>, 'magnitude': 3.2},
     {'event_date': <datetime object>, 'magnitude': 3.6},
     {'event_date': <datetime object>, 'magnitude': 3.0},
     {'event_date': <objeto de fecha y hora>, 'magnitud': 5.6},
     {'event_date': <datetime object>, 'magnitude': 4.0}
 ] 

Se pueden usar expresiones regulares para formatear los datos, y aún más fácil: hojas de cálculo. Copie el elemento con el valor de contribución del tema en una nueva hoja y deje las columnas a izquierda y derecha. En el siguiente ejemplo, lo puse en la columna D y luego completé el resto:

UnBCDE
1{'event_date': datetime(1753,6,8), 'magnitud':0.0024499630},
2
3

Luego copie y pegue los elementos inmutables, completando la columna completa. El artículo con la fecha debe estar en el formato (año, mes, día). Después de llenar la tabla, puede copiarla y pegarla en un editor de texto, haciéndola parte de la matriz my_data , por ejemplo:

  my_data = [
 {'event_date': datetime (1753,6,8), 'magnitude': 0.0024499630},
 {'event_date': datetime (1753,6,9), 'magnitude': 0.0035766320},
 {'event_date': datetime (1753,6,10), 'magnitude': 0.0022171550},
 {'event_date': datetime (1753,6,11), 'magnitude': 0.0033220150},
 {'event_date': datetime (1753,6,12), 'magnitude': 0.0046445900},
 {'event_date': datetime (1753,6,13), 'magnitude': 0.0035766320},
 {'event_date': datetime (1753,6,14), 'magnitude': 0.0042241550}
 ] 

Tenga en cuenta que no hay coma al final de la última línea.

El script final se verá más o menos así si usa el ejemplo de la página de Miditime (los fragmentos de código a continuación están interrumpidos por comentarios, pero deben insertarse juntos como un solo archivo en un editor de texto):

 from miditime.MIDITime import MIDITime from datetime import datetime import random mymidi = MIDITime(108, 'johnadams1.mid', 3, 4, 1) 

Los valores después de MIDITime se establecen como MIDITime(108, 'johnadams1.mid', 3, 4, 1) , aquí:

  • número de latidos por minuto (108),
  • archivo de salida ('johnadams1.mid'),
  • el número de segundos en la música para representar un año en la historia (3 segundos por año calendario, por lo que las entradas del diario durante 50 años se escalan a una melodía de 50 × 3 segundos, es decir, dos minutos y medio),
  • octava básica para música (el promedio de C generalmente se representa como C5, por lo que aquí 4 corresponde a una octava más baja que la referencia),
  • y el número de octavas para comparar alturas.

Ahora pasamos los datos al script cargándolos en la matriz my_data :

 my_data = [ {'event_date': datetime(1753,6,8), 'magnitude':0.0024499630}, {'event_date': datetime(1753,6,9), 'magnitude':0.0035766320}, 

... aquí insertamos todos los datos y no olvidemos eliminar la coma al final de la última línea de event_date , y después de los datos event_date el corchete final en una línea separada:

 {'event_date': datetime(1753,6,14), 'magnitude':0.0042241550} ] 

luego inserte el tiempo:

 my_data_epoched = [{'days_since_epoch': mymidi.days_since_epoch(d['event_date']), 'magnitude': d['magnitude']} for d in my_data] my_data_timed = [{'beat': mymidi.beat(d['days_since_epoch']), 'magnitude': d['magnitude']} for d in my_data_epoched] start_time = my_data_timed[0]['beat'] 

Este código establece el tiempo entre diferentes entradas de diario; si las entradas del diario están cercanas entre sí a tiempo, entonces las notas correspondientes también estarán más cerca. Finalmente, determinamos cómo se comparan los datos con la altura. Los valores iniciales se indican como un porcentaje en el rango de 0.01 (es decir, 1%) a 0.99 (99%), por lo que establecemos scale_pct entre 0 y 1. Si no tenemos porcentajes, entonces usamos el más bajo y el más alto valores Por lo tanto, insertamos el siguiente código:

 def mag_to_pitch_tuned(magnitude): scale_pct = mymidi.linear_scale_pct(0, 1, magnitude) # Pick a range of notes. This allows you to play in a key. c_major = ['C', 'C#', 'D', 'D#', 'E', 'E#', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', 'B#'] #Find the note that matches your data point note = mymidi.scale_to_note(scale_pct, c_major) #Translate that note to a MIDI pitch midi_pitch = mymidi.note_to_midi_pitch(note) return midi_pitch note_list = [] for d in my_data_timed: note_list.append([ d['beat'] - start_time, mag_to_pitch_tuned(d['magnitude']), random.randint(0,200), # attack random.randint(1,4) # duration, in beats ]) 

y el último fragmento para guardar datos en un archivo:

 # Add a track with those notes mymidi.add_track(midinotes) # Output the .mid file mymidi.save_midi() 

Guarde este archivo con un nuevo nombre y extensión .py .

¡Para cada columna en los datos de origen creamos un script único y no olvidemos cambiar el nombre del archivo de salida ! Luego puede cargar archivos midi individuales a GarageBand o LMMS para instrumentación. Aquí está el diario completo de John Adams .

Sonic pi


Procesar midi único en GarageBand u otro editor de música significa pasar del simple doblaje al arte musical. Esta sección final del artículo no es una guía completa sobre el uso de Sonic Pi , sino más bien una introducción a un entorno que permite la codificación y reproducción de datos en tiempo real en forma de música (vea el video para ver un ejemplo de codificación con reproducción en tiempo real). Los tutoriales integrados en el programa mostrarán cómo usar una computadora como instrumento musical (ingresa el código Ruby en el editor incorporado, y el intérprete reproduce inmediatamente el resultado).

¿Por qué se necesita esto? Como puede entender de esta guía, a medida que lee los datos, comienza a tomar decisiones sobre cómo traducir los datos al sonido. Estas decisiones reflejan decisiones implícitas o explícitas sobre qué datos importan. Hay un continuo de "objetividad", si lo desea. Por un lado, los datos históricos expresados, por el otro, una idea del pasado, es tan emocionante y personal como cualquier conferencia pública bien hecha. El sondeo le permite escuchar realmente los datos almacenados en los documentos: este es un tipo de historia pública. La interpretación musical de nuestros datos ... ¡solo imagínense!

Aquí propongo un fragmento de código para importar datos, que es solo una lista de valores almacenados como csv. Gracias a la bibliotecaria de la Universidad George Washington, Laura Vrubel, quien publicó sus experimentos sobre las operaciones de la biblioteca de sondeo en gist.github.com .

Hay dos temas en esta muestra (el modelo temático generado a partir de la relación jesuita ). En la primera línea, los encabezados son 'topic1' y 'topic2'.

Practica


Siga los tutoriales integrados de Sonic Pi hasta que se familiarice con la interfaz y las características (todos estos tutoriales se compilan aquí ; también puede escuchar una entrevista con Sam Aaron, creador de Sonic Pi). Luego copie el siguiente código en un nuevo búfer (ventana del editor) (nuevamente, se deben recopilar fragmentos separados en un script):

 require 'csv' data = CSV.parse(File.read("/path/to/your/directory/data.csv"), {:headers => true, :header_converters => :symbol}) use_bpm 100 

Recuerde que la path/to/your/directory/ es la ubicación real de sus datos en la computadora. Asegúrese de que el archivo realmente se llame data.csv , o edite esta línea en el código.

Ahora cargue estos datos en la composición musical:

 #this bit of code will run only once, unless you comment out the line with #'live_loop', and also comment out the final 'end' at the bottom # of this code block #'commenting out' means removing the # sign. # live_loop :jesuit do data.each do |line| topic1 = line[:topic1].to_f topic2 = line[:topic2].to_f use_synth :piano play topic1*100, attack: rand(0.5), decay: rand(1), amp: rand(0.25) use_synth :piano play topic2*100, attack: rand(0.5), decay: rand(1), amp: rand(0.25) sleep (0.5) end 

Las primeras filas cargan las columnas de datos; luego indicamos qué muestra de sonido queremos usar (piano), y luego indicamos tocar el primer tema (tema1) de acuerdo con los criterios especificados: para la fuerza de la nota (ataque), se selecciona un valor aleatorio de menos de 0.5; para la descomposición: un valor aleatorio menor que 1; para amplitud, un valor aleatorio de menos de 0.25.

¿Ves una línea multiplicada por cien ( *100 )? Toma nuestro valor de datos (decimal) y lo convierte en un número entero. En este fragmento, el número se equipara directamente a una nota. Si la nota más baja es 88 y la más alta es 1, entonces este enfoque es un poco problemático: ¡en realidad no mostramos ningún tono aquí! En este caso, puede usar Musicalgorithms para mostrar la altura y luego pasar estos valores nuevamente a Sonic Pi. Además, dado que este código es Ruby más o menos estándar, puede utilizar los métodos habituales de normalización de datos y luego hacer una comparación lineal de sus valores con un rango de 1–88. Para empezar, es bueno ver el trabajo de Steve Lloyd para expresar datos meteorológicos con Sonic Pi.

Y lo último a tener en cuenta aquí: el valor de 'rand' (aleatorio) le permite agregar un poco de "humanidad" a la música en términos de dinámica. Hacemos lo mismo para 'topic2'.

También puede especificar el ritmo (latidos por minuto), bucles, muestras y otros efectos que admite Sonic Pi. La ubicación del código afecta la reproducción: por ejemplo, si se coloca delante del bloque de datos anterior, se reproducirá primero. Por ejemplo, si use_bpm 100inserta lo siguiente después de una línea :

 #intro bit sleep 2 sample :ambi_choir, attack: 2, sustain: 4, rate: 0.25, release: 1 sleep 6 

... obtienes una pequeña introducción musical. El programa espera 2 segundos, reproduce la muestra 'ambi_choir', luego espera otros 6 segundos antes de comenzar a reproducir nuestros datos. Si desea agregar un poco de un tambor ominoso a lo largo de la melodía, coloque este bit a continuación (frente a sus propios datos):

 #bit that keeps going throughout the music live_loop :boom do with_fx :reverb, room: 0.5 do sample :bd_boom, rate: 1, amp: 1 end sleep 2 end 

El código es bastante sencillo: la muestra en bucle 'bd_boom' con el efecto de sonido de la reverb a cierta velocidad. La pausa entre ciclos es de 2 segundos.

En cuanto a la "codificación en tiempo real", esto significa que puede realizar cambios en el código mientras reproduce esos cambios . ¿No te gusta lo que oyes? ¡Cambie el código de inmediato!

Explorar Sonic Pi puede comenzar con este taller . Vea también el informe de Laura Vrubel sobre asistir al seminario, que también describe su trabajo en esta área y el trabajo de sus colegas.

Nada nuevo bajo el sol


Y repito nuevamente: no es necesario pensar que nosotros, con nuestro enfoque algorítmico, estamos a la vanguardia de la ciencia. En 1978, se publicó un artículo científico sobre los "juegos musicales de dados" del siglo XVIII, donde los rollos de dados determinaron la recombinación de piezas musicales previamente escritas. Robin Newman estudió y codificó algunos de estos juegos para Sonic Pi . Para la notación musical, Newman usa una herramienta que se puede describir como Markdown + Pandoc, y para convertirla en notas, Lilypond . ¡Todos los temas de nuestro blog The Programming Historian tienen una larga historia!

Conclusión


Al expresar, vemos que nuestros datos a menudo reflejan no tanto la historia como su interpretación en nuestro desempeño. Esto se debe en parte a la novedad y la naturaleza artística necesarias para traducir los datos en sonido. Pero esto distingue en gran medida la interpretación del sonido de la visualización tradicional. Tal vez los sonidos generados nunca lleguen al nivel de "música"; pero si ayudan a cambiar nuestra comprensión del pasado e influyen en otros, entonces el esfuerzo vale la pena. Como diría Trevor Owens, "sonar es un descubrimiento de lo nuevo, no una justificación de lo conocido ".

Términos


  • MIDI : . , ( ). . MIDI- , .
  • MP3 : , .
  • : ( C . .)
  • :
  • : ( , , . .)
  • :
  • Amplitud : en términos generales, volumen de notas

Source: https://habr.com/ru/post/454318/


All Articles