Los sintetizadores de sonido usan generadores de envolvente para controlar cómo ciertos parámetros del sonido (como el volumen general) cambian con el tiempo. En muchos sintetizadores, una envolvente se define mediante cuatro parámetros, como se representa en la siguiente figura de Wikipedia :
- Tiempo de ataque (A) : tiempo que tarda el sobre en alcanzar su nivel máximo, comenzando desde cero, cuando se presiona la tecla por primera vez.
- Tiempo de caída (D) : tiempo que tarda la envoltura en alcanzar el nivel de sostenimiento especificado.
- Nivel de mantenimiento (S) : nivel que se mantiene, después del ataque inicial y la descomposición, mientras se mantenga presionada la tecla.
- Tiempo de liberación (R) : tiempo que tarda el sobre en llegar a cero cuando se suelta la tecla.
El reto
Ingrese los cuatro parámetros A, D, S, R y trace el sobre .
Los parámetros serán valores enteros de 0 a 127 .
Se supondrá que el nivel máximo (alcanzado al final de la fase de ataque) es 127 .
Se supondrá que el segmento horizontal en el nivel de sostenimiento tiene una duración 64 (en el sonido real, esta duración no es fija, sino que está determinada por la cantidad de tiempo que se mantiene presionada la tecla).
Formato y más detalles
El resultado debe ser una imagen en formato ráster o vectorial. Si es ráster, la línea poligonal debe ocupar al menos 50 píxeles verticalmente y horizontalmente.
La imagen se puede mostrar o producir como un archivo en un formato de imagen estándar. El archivo puede escribirse en el disco o su contenido exacto puede enviarse a STDERR o como argumento de retorno de función.
El gráfico solo necesita contener la línea poligonal que define la envolvente. La escala de cada eje se puede elegir libremente. Otros elementos como líneas de eje, etiquetas numéricas o colores de línea son opcionales.
Los medios de entrada y el formato son flexibles como de costumbre. Por ejemplo, puede tomar los cuatro números en cualquier orden o una matriz que los contenga. Se puede proporcionar un programa o una función . Las lagunas estándar están prohibidas.
El código más corto en bytes gana.
Casos de prueba
La entrada está en el formato [A D S R]
. Tenga en cuenta que la escala es diferente en cada figura (de acuerdo con la regla de que la escala se puede elegir libremente)
[15 30 70 40]
[64 64 64 64]
[0 10 50 80]
[0 0 90 80]
[5 50 0 0]
[5 50 0 80]
[24 32 127 48]
fuente
Respuestas:
MATL,
3122 bytesAcepta cuatro entradas separadas ordenados como
A
,D
,R
,S
Pruébelo en MATL Online
Explicación
fuente
TikZ,
195193181177172167163160159 bytesGracias a David Carlisle por su útil respuesta aquí.
Sí, escuchaste bien TikZ .
Explicación
Esto utiliza un par de técnicas para lograr su objetivo. Lo primero es la entrada. Es posible que la mayoría de la gente no sepa que L A T E X puede recibir información. Bien puede. Esto se logra con el comando
\typein
. Esto detendrá el compilador y solicitará la entrada del usuario al asignarlo a una variable.La otra técnica principal es el uso de
\def
.\def
en Tikz es absurdamente poderoso. Básicamente, define un fragmento de código y lo pega en todas partes donde llame a la variable. En este código definimos dos cosas\typein[#1]{}
para que podamos asignar nuestras variables a golfily y)--(\a+\d
porque este código aparece un montón de veces en la versión sin golf.Aquí hay dos versiones del código (sin el contenedor):
Golfizado:
Sin golf:
Imagen:
Como no puedo cargar una imagen pdf directamente, y convertirla a cualquier otro formato parece hacer que la línea desaparezca por completo, así es como podría verse una imagen cuando se abre en Vista previa (la entrada para esta imagen es
[64 64 64 64]
):Como puedes ver es muy delgado. Sin embargo, debido a que es una imagen PDF y no una imagen ráster, no tiene que cumplir con los requisitos de grosor.
fuente
input tikz\begin{document}
funcionapdflatex adsr.tex
no parece funcionar - Oh, espera, funciona, ¡simplemente no esperaba que solicitara una entrada interactiva!Python 2,
838079 bytesPruébelo en línea (versión de 83 bytes, porque se ejecuta en línea)
Tenga en cuenta que ciertas salidas pueden no ser completamente visibles usando Trinket, debido a la forma en que funciona el lienzo. Tendrá que descargar e instalar Python si desea que funcione mejor.
Sin golf:
Esta versión no funciona en Trinket, porque Trinket no admite el desempaquetado de valor de la entrada.
fuente
map
en Python 2:lambda A,D,S,R:map(goto,[A,A+D,A+D+64,A+D+R+64],[127,S,S,0])
SuspensionError: Cannot call a function that blocks or suspends here on line undefined in main.py
a Trinket. ¿Has confirmado que funciona? No estoy seguro de si el error es exclusivo de Trinket o no.Mathematica,
6158 bytes
es el operador paraTranspose
y se representa como un superíndiceT
por Mathematica.Toma los argumentos en el orden
S, R, A, D
y devuelve un objeto de gráficos vectoriales.Resultados para los siete casos de prueba:
Haga clic para una versión más grande.
fuente
ListLinePlot
:) Y también hay unaListStepPlot
, ¡tan útil!R,
6663 bytesMuestra la imagen, siendo los laboratorios de ejes
cumsum(c(0,A,D,64,R))
yc(0,127,S,S,0)
, así como líneas de eje y etiquetas numéricas.¡Gracias a @Zahiro Mor por recortar 3 bytes !
Respuesta anterior:
fuente
cumsum(c(0,A,D,64,R))
para reemplazar el primer término en la trama. con cumsum no necesitarás el truco b y aúnfunction(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 bytes
Esto produce una función anónima "ans" que debe llamarse como ans (A, D, S, R).
fuente
JavaScript (ES6) + HTML, 126 + 23 = 149
Toma una entrada a la vez en el orden
A, S, D, R
.fuente
JavaScript (ES6),
114111 bytesDevuelve una imagen SVG adecuada para
innerHTML
. Agregue 18 bytes para XML válido.fuente
<input>
s?64,64,64,64
. Normalmente codificaría la salida correcta para la entrada predeterminada, pero veo cómo sería difícil aquí ...Haskell,
112110 bytesEjemplo de uso:
(0#10) 50 80
.Esto usa la
Gloss
biblioteca. Ladisplay
función espera que se trace una ventana (aquí: una ventana sin título (""
), tamaño 600x300, posición(0,0)
en el escritorio), un color de fondo (red
) y una imagen de bruja es una línea a lo largo del camino realizado comprimiendo la suma acumulativa de[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
como coordenadas x y[0,127,s,s,0]
como las coordenadas y.Editar: ¡Gracias @xnor por 2 bytes!
fuente
scanl(+)0[a,d,64,r]
Procesamiento,
134108 + 14 (llamada asize
) =148122 bytesPrimero necesitamos una llamada a
size
algún lugar del programa para que la salida quepa en la ventana (por defecto a 100x100).Y aquí está la función real:
Llámalo como
f(15,20,70,40);
Captura de pantalla
Mi respuesta más nueva es más directa que la anterior, pero me gusta más la anterior (incluso si es más grande).
Respuesta anterior (148 bytes)
y las dos funciones
Llámalo así
f(int_array_containing_values);
y el resultado se verá así:f(new int[]{15,20,70,40});
fuente
SmileBASIC, 90 bytes
fuente
PHP,
149130 bytestoma datos de los argumentos de la línea de comandos, escribe la imagen (PNG con el gráfico azul sobre negro) en stdout. Requiere PHP 7.1 o posterior.
uso por ejemplo
+4 bytes para PHP anterior: reemplazar
[,$a,$d,$s,$r]
conlist(,$a,$d,$s,$r)
.Hay un pequeño truco allí: en lugar de usar
imageopenpolygon
para ocultar la línea base, la línea de polígono de acabado se dibuja fuera del lienzo. (y = 127 solo se mostraría en una imagen con altura> = 128.)Podría haber ahorrado más con el color 99 o 9 en lugar de 999; pero esos son bastante difíciles de ver en negro. :)
fuente
Bash + gracia , 70 bytes
El script escribe para archivar
f
las coordenadas de cada punto, y xmgrace (la versión de la GUI) lee el archivo y muestra el diagrama usando líneas por defecto.Ejecutar :
Salida: (pantalla de impresión)
Creo que esto puede hacerse directamente mediante un script de gracia, si puede aceptar entradas, pero no estoy familiarizado con su sintaxis. Lo miraré.
Explicación:
fuente
Go,
947915506 bytesEsto está lejos de ser optimizado, tratando de aprender el idioma mientras participa en estas preguntas. Siéntase libre de señalar lo que puedo hacer.
Condensado:
Sin condensación:
fuente
dc, 120 bytes
Inicialmente pensé que no podía responder en CC, pero veo que se permite imprimir la sintaxis de una imagen vectorial.
El código calcula las coordenadas traducidas de cada punto y genera la sintaxis SVG para el gráfico. Como un editor de imágenes tiene el origen en la esquina superior izquierda, tuve que restar el
y
valoresheight
, 127 en este caso, para que la imagen se muestre como si el origen estuviera en la esquina inferior izquierda.Ejecute el ejemplo: o ¡ Pruébelo en línea!
Salida:
Para mostrar el gráfico de la imagen, guarde ese resultado exacto en un archivo y ábralo con Gimp, por ejemplo, o ingrese el texto en una página html como lo hice anteriormente.
Explicación:
dc
es una polaca inversa d esk c lenguaje pila alculatorEl script es una larga concatenación de la cadena de sintaxis SVG. La palabra clave
M
significa movimiento para coordinar yL
representa la línea de dibujo desde la posición actual hasta la coordenada dada .fuente