SuperCollider es un entorno y lenguaje de programación lanzado originalmente en 1996 por James McCartney para la síntesis de audio en tiempo real y la composición algorítmica . [4] [5]
Desde entonces, ha ido evolucionando hasta convertirse en un sistema utilizado y desarrollado por científicos y artistas que trabajan con el sonido. Es un lenguaje de programación dinámico que proporciona un marco para la investigación acústica , la música algorítmica , la programación interactiva y la codificación en vivo .
Originalmente publicado bajo los términos de la GPL-2.0 o posterior en 2002, y a partir de la versión 3.4 bajo la GPL-3.0 o posterior , SuperCollider es un software gratuito y de código abierto .
A partir de la versión 3, el entorno SuperCollider se ha dividido en dos componentes: un servidor , scsynth , y un cliente , sclang . Estos componentes se comunican mediante OSC ( Open Sound Control ). [6]
El lenguaje SC combina la estructura orientada a objetos de Smalltalk y características de los lenguajes de programación funcional con una sintaxis de la familia C. [6]
La aplicación SC Server admite API de complementos de C y C++ simples , lo que facilita la escritura de algoritmos de sonido eficientes ( generadores de unidades ), que luego se pueden combinar en gráficos de cálculos. Debido a que todo el control externo en el servidor se realiza a través de OSC, es posible usarlo con otros lenguajes o aplicaciones. [6]
La generación de sonido de SuperCollider está integrada en un ejecutable de línea de comandos optimizado (llamado scsynth ). En la mayoría de los casos, se controla desde el lenguaje de programación de SuperCollider, pero se puede utilizar de forma independiente. El servidor de audio tiene las siguientes características: [6]
Supernova, una implementación independiente de la arquitectura del servidor, [8] agrega soporte para múltiples procesadores a través de la agrupación paralela explícita de nodos de síntesis.
El lenguaje de programación SuperCollider es un lenguaje funcional , orientado a objetos, de herencia única , con tipos dinámicos y recolección de basura , similar a Smalltalk [5] , con una sintaxis similar a Lisp o al lenguaje de programación C. Su arquitectura logra un equilibrio entre las necesidades de computación en tiempo real y la flexibilidad y simplicidad de un lenguaje abstracto. Como muchos lenguajes funcionales, implementa funciones como objetos de primera clase , que pueden estar compuestos por . Las funciones y los métodos pueden tener valores de argumento predeterminados y listas de argumentos de longitud variable y pueden llamarse con cualquier orden de argumentos de palabras clave. Los cierres son léxicos y el alcance es tanto léxico como dinámico. Se admiten otras características típicas de los lenguajes funcionales, incluida la creación de cierres mediante aplicación parcial ( currying explícito ), optimización de llamadas de cola , comprensiones de listas y corrutinas . Los detalles específicos incluyen la expansión implícita de tuplas y el sistema de patrones sin estado. Su búsqueda de mensajes en tiempo constante y recolección de basura en tiempo real permite que los sistemas grandes sean eficientes y gestionen el procesamiento de señales de manera flexible. [6]
Al admitir métodos de programación reflexiva , conversacional y alfabetizada , SuperCollider facilita relativamente la búsqueda de nuevos algoritmos de sonido [9] y el desarrollo de software y marcos personalizados. Con respecto al conocimiento específico del dominio, es general (por ejemplo, permite la representación de propiedades como el tiempo y el tono en grados variables de abstracción) y tiene abundantes implementaciones de ejemplo para propósitos específicos. [6]
El lenguaje SuperCollider permite a los usuarios construir interfaces gráficas de usuario multiplataforma para aplicaciones. La biblioteca de clases estándar con componentes de interfaz de usuario puede ampliarse mediante una serie de marcos disponibles. Para la programación interactiva, el sistema admite el acceso programático a archivos de código de texto enriquecido. Puede utilizarse para generar gráficos vectoriales de forma algorítmica. [10]
Dado que el servidor se controla mediante Open Sound Control (OSC), se pueden utilizar diversas aplicaciones para controlar el servidor. Normalmente se utilizan entornos de lenguaje SuperCollider (ver a continuación), pero se pueden utilizar otros sistemas compatibles con OSC, como Pure Data . [6]
Existen clientes de "terceros" para el servidor SuperCollider, entre los que se incluyen rsc3, un cliente de Scheme , hsc3, basado en Haskell , ScalaCollider, [11] basado en Scala , Overtone, basado en Clojure , y Sonic Pi . [12] Estos se diferencian de los entornos de desarrollo mencionados a continuación porque no proporcionan una interfaz para el lenguaje de programación de SuperCollider, sino que se comunican directamente con el servidor de audio y proporcionan sus propios enfoques para facilitar la expresión del usuario. [6]
SuperCollider funciona en macOS , Linux , Windows y FreeBSD . Para cada uno de estos sistemas operativos existen múltiples entornos de edición de lenguaje y clientes que pueden usarse con SuperCollider (ver a continuación). [6]
También se ha demostrado que SuperCollider puede ejecutarse en Android [13] e iOS . [14]
El código de SuperCollider se edita y utiliza con mayor frecuencia desde su propio IDE multiplataforma, que está basado en Qt y es compatible con Linux, Mac y Windows.
Otros entornos de desarrollo compatibles con SuperCollider incluyen:
// reproduce una mezcla de ruido rosa y un tono sinusoidal de 800 Hz { SinOsc . ar ( 800 , 0 , 0.1 ) + PinkNoise . ar ( 0.01 ) }. play ;// modular la frecuencia del tono sinusoidal así como la amplitud de la señal de ruido con otra señal sinusoidal, // cuya frecuencia depende de la posición horizontal del puntero del ratón ( { var x = SinOsc . ar ( MouseX . kr ( 1 , 100 )); SinOsc . ar ( 300 * x + 800 , 0 , 0.1 ) + PinkNoise . ar ( 0.1 * x + 0.1 ) }. play ; )
// Iteración de lista: multiplica los elementos de una colección por sus índices [ 1 , 2 , 5 , 10 , - 3 ]. collect { | elem , idx | elem * idx };
// Función factorial f = { | x | if ( x == 0 ) { 1 } { f .( x - 1 ) * x } };
// «Emulación Pan Sonic - Katodivaihe - lahetys» - Miguel Negrão ( { var a , b , c , d , n , e , f , out ;a = Impulso . ar ( 8 ) * 1.5 ;b = Ruidoblanco . ar * Env ([ 1.0 , 1.0 , 0.0 ],[ 0.01 , 0.01 ], \step ). ar ( 0 , Impulso . ar ( 1 )) ; b = Verbolibre . ar ( b , 0.5 , 0.4 ) * 2.5 ;c = SinOsc . ar ( 40 ) * Env . perc ( 0.01 , 0.2 ). ar ( 0 , TDuty . ar ( Dseq ([ 1 / 4 , 1 / 2 , 1 / 8 , 1 / 8 ], inf ))); 5 . hacer { c = ( c . distorsionar + c ) * 0.75 }; c = c * 1.5 ;d = LPF . ar ( Saw . ar ([ 20 , 47 ] . suma , XLine . ar ( 4000 , 200 , 0.5 )) * Env . perc . ar ( 0 , Impulse . ar ( 1 / 16 )) * 0.5 ; d = ( GVerb . ar ( d , tamaño de la habitación : 10 , tiempo de revolución : 6 ) * 200 ). clip ( - 1.0 , 1.0 ) * 0.3 ;norte = 12 ; e = ( Saw . ar ( 40 * ( 1 .. n ) * ({ LFNoise1 . ar ( 0.1 ). rango ( 1 , 1.01 ) } ! n ) ) * ({ LFNoise1 . ar ( 0.1 ). rango ( 0.0 , 1.0 ) } ! norte )). suma * 10 ; e = PeineC . ar ( mi , 0,1 , 0,1 , 4 ) + mi ; mi = mi . tanh * 0,3 * SinOsc . ar ( 0,05 ). rango ( 0,5 , 1,0 ); mi = mi . duplicar ; mi = mi * SinOsc . ar ( 0,03 ). rango ( 0.2 , 1.0 ) * 0.5 ;f = Blip . ar ( 100 ) * Blip . ar ( 100 ) * Env ([ 0.0 , 0.0 , 1.0 ],[ 8 , 8 ],[ \step , \linear , \step ]) . ar ( 0 , Impulso . ar ( 1 / 16 )) * 2 ;salida = (( a + b + c + f ) ! 2 ) + d + e ; salida = salida * 0,2}. jugar )
Como lenguaje de programación dinámico versátil , SuperCollider se puede utilizar para codificación en vivo , es decir, actuaciones que implican que el intérprete modifique y ejecute código sobre la marcha. [18] Los tipos específicos de proxies sirven como marcadores de posición de alto nivel para objetos de síntesis que se pueden intercambiar dentro y fuera o modificar en tiempo de ejecución. Los entornos permiten compartir y modificar objetos y procesar declaraciones a través de redes. [19] Varias bibliotecas de extensión admiten diferentes abstracciones y accesos a objetos de sonido, por ejemplo, dewdrop_lib [20] permite la creación y modificación en vivo de pseudoclases y pseudoobjetos.