Buscando un lenguaje de programación musical de alto nivel

Estoy buscando un lenguaje de programación de alto nivel. Busqué en Google y encontré varios ejemplos (algunos resumidos aquí http://users.soe.ucsc.edu/~sasha/proj/musicpaper.pdf ) pero no he encontrado exactamente lo que necesito.

La característica clave que busco es que el lenguaje me permita crear música basada en algún material de entrada (una melodía), y luego me permita especificar el resto de la pieza como una serie de transformaciones en el material de entrada inicial. Los tipos de transformaciones que busco son fragmentación (especifique un subconjunto del original), transposición (cambio de tono), aumento y disminución (cambio de duración), inversión (cambio de dirección de los intervalos), retrógrado (cambio de orden).

Algo como eso existe?

ACTUALIZACIÓN: actualmente estoy intentando con music21 ( http://web.mit.edu/music21/ ). Probablemente me permitirá hacer esto, pero probablemente no de tal manera que sea fácil de editar o leer.

Estoy usando c++ en win32. No es la herramienta, es el proyecto que haces con ella. Ese es un proyecto bastante vagamente definido que tienes hasta ahora... Y seamos sinceros. La gente hace música mucho mejor que las computadoras. Y alguna vez lo hará.
@StephenHazel No estoy pidiendo un programa de computadora que genere música para mí. Estoy solicitando un programa de computadora que me permita expresar una composición como una serie de transformaciones basadas en mi entrada. Tu ejemplo de C++ no tiene sentido. Supongamos que estaría solicitando un programa que me permita extraer subcadenas basadas en un patrón de texto, entonces seguramente me recomendaría alguna biblioteca de expresiones regulares. Pues bien, estoy pidiendo un lenguaje que me permita crear música basada en una serie de manipulaciones bien definidas de la música de entrada.

Respuestas (12)

Además de Haskore, que ya se menciona en el documento al que se refiere y los mencionados por otros, están SuperCollider y Pure Data .

Entiendo perfectamente tu pregunta. Yo mismo he estado buscando algo de tan alto nivel. Aquí están mis pensamientos personales sobre esto:

No he encontrado nada bueno y llegué a la conclusión de que no existen abstracciones generalmente aceptadas y listas para usar. Probablemente esto se deba a que todo el mundo está de acuerdo en lo que es un filtro de retardo, de diente de sierra o de mantequilla, pero no existe un método generalmente aceptado para escribir música.

Entonces, su mejor apuesta es encontrar un lenguaje que tenga suficientes "poderes abstractos" para que pueda escribir sus propias abstracciones. No hay duda de que Haskell es una bestia, pero es difícil (aunque gratificante) de aprender.

Actualmente estoy jugando con Supercollider para llegar allí. Empecé hace solo unos días, así que no sé hasta dónde me llevará. Lo mínimo que hará por mí es liberarme del MIDI. Puedo controlar el sonido como quiera. Incluso si (como dice) solo está interesado en escribir transformaciones de secuencia de notas, puede superar rápidamente este enfoque, porque todo sonará igual. Entonces es posible que desee tener más control sobre los instrumentos de lo que Midi le permite. Al menos aquí es donde estoy ahora.

Pero también hay OSC-Bindings para Haskell, así que puedo usar Supercollider para la síntesis de sonido y Haskell para la síntesis de composición. También estoy reflexionando sobre una síntesis de jugador que iría entre los dos.

Martín, gracias! Echaré un vistazo a los productos que mencionas. Como dijiste, estoy empezando a creer que actualmente no hay nada que coincida con mis requisitos. Actualmente estoy buscando improvisarlo con JMusic o JFugue (ya que me siento cómodo con Java). Sin embargo, me aseguraré de considerar su sugerencia para Haskell.

Vea esta pregunta SO . No estoy seguro de si esto es exactamente lo que necesita, pero podría ayudar.

Debido a que solo estoy vinculando otra pregunta, normalmente pondría esto como un comentario. Sin embargo, no tengo permisos para comentar en este sitio (todavía).

¡Gracias! Bueno, esa pregunta tiene muchas respuestas, muchos más ejemplos que el documento al que me vinculé. Todavía no estoy seguro de si lo que estoy buscando está ahí, pero parece prometedor. ¡Gracias de nuevo!

Quizás te interese el lenguaje de programación CHucK.

https://www.coursera.org/course/chuck101

¿Puedes agregar un poco más de información sobre este idioma?
Gracias. Cuando redacté esta pregunta por primera vez, me topé con CHucK antes de publicarla. Jugué un poco con él, creo que es genial, pero es un nivel demasiado bajo para lo que tengo en mente. Por ejemplo, en CHucK no tengo métrica, ni escalas, ni siquiera notas. Solo sintetizadores y tiempo. Así que CHuck está una o dos capas demasiado abajo para lo que realmente necesito.

Entrar en el software de seguimiento podría ser otro enfoque. Podría considerar la notación de la puntuación del rastreador como el lenguaje de programación y el reproductor del rastreador como el compilador/intérprete.

Hay muchos módulos de música (canciones) que puedes cargar y tocar. Estos se comparten todo el tiempo.

Puede usar el software de seguimiento listo para usar para editar su 'música de entrada' (por ejemplo, OpenMPT ).

Hay muchas bibliotecas de código abierto que le permiten reproducir música en este formato, por ejemplo: http://xmp.sourceforge.net . Por lo tanto, tener en sus manos el código fuente de un reproductor puede ayudarlo a manipular aspectos de una canción a través de sus programas.

Así es como muchos juegos de computadora reproducían música (especialmente los juegos de arcade más antiguos donde la memoria era limitada y no podían permitirse la existencia de datos de muestra completos de las canciones finales).

Muchos reproductores de módulos de seguimiento ya permiten un control de canciones básico; silenciar instrumento, intercambiar instrumentos, silenciar pista, cambiar tempo, saltar a la posición de la canción. Los juegos ya pueden ejecutar el control de canciones en bruto en tiempo real en sincronización con los eventos del juego (saltar a la misma posición de patrón en un conjunto diferente de patrones o activar canales mientras el personaje del juego está usando un poder de invencibilidad, o para el final de -lucha de nivel contra el gran jefe).

Muchos editores de rastreadores también son de código abierto ( MilkyTracker , OpenMPT) y tendrán funciones para transponer partes de la canción (ya que son atajos de teclado dentro de la aplicación) así como para reproducir las canciones (ya que los editores de canciones también reproducen las canciones).

Con suerte, esto podría darte algunas ideas. A pesar de no ser un lenguaje de programación tradicional.

Se puede considerar que Lilypond encaja en este molde: aunque se centra más en componer música, puede generar una representación MIDI de la partitura. Sin embargo, encuentro que, en términos de uso básico, no es fácil lograr efectos expresivos en la salida midi. Además, no tiene capacidades en tiempo real. Lo menciono principalmente porque puede proporcionar ideas (o código) para implementar una interfaz de alto nivel si termina implementando su propio sistema.

Prueba OpenMusic , un lenguaje de programación visual para música simbólica. Es un poco aterrador al principio, pero el tutorial debería ayudarlo a comenzar bastante rápido.

No estoy seguro de si incluyen todas las funciones que necesita. Pero la biblioteca java jmusic es bastante extensa, creo que esa sería tu mejor opción.

En caso contrario otras opciones serían JFugue, music21 (python) o el lenguaje de programación visual CSound, de ircam, también muy extenso.

Édouard menciona OpenMusic, algo similar, y el descendiente de PatchWork es PWGL ( http://www2.siba.fi/PWGL/ ). Mirando lo que necesita de un idioma, podría ser útil, especialmente 'restringe' parte de PWGL. La curva de aprendizaje es empinada (LISP) pero vale la pena su tiempo. Algunas grandes bibliotecas externas para la manipulación del ritmo también. buena suerte

Creo que Overtone tiene lo que estás buscando y más. Es una biblioteca de Clojure que actúa como un poderoso front-end para SuperCollider. Puede tomar un tiempo aprender a usarlo (especialmente si es nuevo en Clojure), pero una vez que lo hace, es bastante poderoso y flexible. Puede hacer cosas como definir una melodía como una secuencia de intervalos de escala y luego combinarla con cualquier escala y secuencia particular de valores de duración de notas, lo que le da mucha libertad para jugar con variaciones sobre un tema. ¡Vale la pena echarle un vistazo, incluso si no estás familiarizado con Clojure!

FWIW, estoy trabajando en el desarrollo de mi propio front-end para Overtone (lo sé, sería un front-end para un front-end) que le permite aprovechar mucho de lo que es capaz, pero usando una sintaxis mucho más simple dirigida más hacia músicos/compositores que programadores. No está ni cerca de ser utilizable en este momento, pero con suerte lo estará algún día en un futuro cercano. Hasta entonces, recomiendo de todo corazón Overtone :)

Parece que quieres hacer algo similar a Andrew Sorensen, lo cual es asombroso. Utiliza un lenguaje llamado Extempore , similar a Lisp con un poco de C, que le permite definir y reproducir cosas en tiempo real. Puedes verlo en acción en este video , donde realiza una pieza haciendo codificación en vivo.

Supongo que puedes construir algo además de eso, solo algunas estructuras más como escalas, para que puedas manipular escalas en lugar de tener que trabajar directamente con semitonos todo el tiempo.
probablemente uno podría. Pero estoy buscando algo que ya tenga eso. Por lo que he visto hasta ahora, music21 es lo más cercano a lo que estoy buscando.

Hace años jugué con un lenguaje llamado KeyKit. Representa la música como objetos de frase y tiene conceptos de notas, acordes y un montón de funciones para manipular y generar música tanto a través de la codificación como mediante el uso de controladores gráficos integrados y simplificados. Creo que el idioma es bastante simple de aprender. Creo que el tipo que lo creó todavía lo usa e incluso podría obtener respuestas de él para preguntas:

http://nosuch.com/keykit/

Aparte, me pregunto si encontraste lo que estabas buscando. También estoy interesado en saber qué más hay que funcione bien para la composición musical simbólica / algorítmica.

Lo que podría estar buscando es Opusmodus . El lenguaje de programación es Common Lisp. Viene con una enorme biblioteca de funciones específicas para la composición, así como un OMN (Opusmodus Notation) que permite convertir la salida de sus funciones tanto en una partitura musical como en un reproductor MIDI interno o externo. Por último, pero no menos importante, tiene funciones de codificación en vivo y puede exportar en formato MIDI y MusicXML.