Os sintetizadores de som usam geradores de envelope para controlar como certos parâmetros do som (como o volume geral) mudam com o tempo. Em muitos sintetizadores, um envelope é definido por quatro parâmetros, conforme representado na figura a seguir da Wikipedia :
- Tempo de ataque (A) : tempo necessário para o envelope atingir seu nível máximo, começando do zero, quando a tecla é pressionada pela primeira vez.
- Tempo de decaimento (D) : tempo necessário para o envelope atingir o nível de sustentação especificado.
- Nível de sustentação (S) : nível que é mantido, após o ataque e deterioração inicial, enquanto a tecla estiver sendo pressionada.
- Tempo de liberação (R) : tempo necessário para o envelope chegar a zero quando a tecla é liberada.
O desafio
Insira os quatro parâmetros A, D, S, R e plote o envelope .
Os parâmetros serão valores inteiros de 0 a 127 .
O nível máximo (atingido no final da fase de ataque) será assumido como 127 .
O segmento horizontal ao nível sustentar será assumido como tendo duração de 64 (o som real, a sua duração não é fixo, mas é determinada pela quantidade de tempo que a tecla é mantida).
Formato e mais detalhes
A saída deve ser uma imagem em formato raster ou vetorial. Se for raster, a linha poligonal deve ocupar pelo menos 50 pixels na vertical e na horizontal.
A imagem pode ser exibida ou produzida como um arquivo em um formato de imagem padrão. O arquivo pode ser gravado no disco ou seu conteúdo exato pode ser gerado para STDERR ou como argumento de retorno da função.
O gráfico precisa conter apenas a linha poligonal que define o envelope. A escala de cada eixo pode ser escolhida livremente. Outros elementos, como linhas de eixo, etiquetas numéricas ou cores de linha, são opcionais.
Os meios e o formato de entrada são flexíveis, como de costume. Por exemplo, você pode pegar os quatro números em qualquer ordem ou em uma matriz que os contenha. Um programa ou uma função pode ser fornecida. As brechas padrão são proibidas.
O menor código em bytes vence.
Casos de teste
A entrada está no formato [A D S R]
. Observe que a escala é diferente em cada figura (de acordo com a regra de que a escala pode ser escolhida livremente)
[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]
fonte
Respostas:
MATL,
3122 bytesAceita quatro entradas separadas encomendado como
A
,D
,R
,S
Experimente no MATL Online
Explicação
fonte
TikZ,
195193181177172167163160159 bytesAgradecemos a David Carlisle por sua resposta útil aqui
Sim, você ouviu o TikZ certo .
Explicação
Isso usa algumas técnicas para atingir seu objetivo. A primeira coisa é entrada. A maioria das pessoas pode não saber que L A T E X pode receber informações. Bem, pode. Isto é conseguido com o comando
\typein
. Isso interromperá o compilador e solicitará a entrada do usuário como atribuída a uma variável.A outra técnica principal é o uso de
\def
.\def
em Tikz é absurdamente poderoso. Essencialmente, ele define um pedaço de código e o cola em todos os lugares que você chama de variável. Neste código, definimos duas coisas\typein[#1]{}
para que possamos atribuir nossas variáveis de forma golfificada e)--(\a+\d
porque esse código aparece várias vezes na versão não-armazenada.Aqui estão duas versões do código (sem o wrapper):
Golfe:
Ungolfed:
Imagem:
Como não consigo fazer upload de uma imagem em PDF diretamente, e convertê-la para qualquer outro formato parece fazer com que a linha desapareça completamente, eis a aparência de uma imagem quando aberta na Visualização (a entrada para esta imagem é
[64 64 64 64]
):Como você pode ver, é muito fino. No entanto, por ser uma imagem PDF e não uma imagem raster, não precisa atender aos requisitos de espessura.
fonte
input tikz\begin{document}
funciona?pdflatex adsr.tex
parece não funcionar. - Ah, espere, funciona, eu simplesmente não esperava que solicitasse informações interativas!Python 2,
838079 bytesExperimente online (versão de 83 bytes, porque funciona online)
Observe que determinadas saídas podem não estar completamente visíveis usando o Trinket, devido à maneira como a tela funciona. Você precisará baixar e instalar o Python, se quiser que ele funcione melhor.
Ungolfed:
Esta versão não funciona no Trinket, porque o Trinket não suporta a descompactação de valor da entrada.
fonte
map
no 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
no Trinket. Você confirmou que funciona? Não tenho certeza se o erro é exclusivo do Trinket ou não.Mathematica,
6158 bytes
é o operadorTranspose
e é renderizado como um sobrescritoT
pelo Mathematica.Recebe os argumentos na ordem
S, R, A, D
e retorna um objeto de gráficos vetoriais.Resultados para todos os sete casos de teste:
Clique para uma versão maior.
fonte
ListLinePlot
:) E também há umaListStepPlot
- tão útil!R,
6663 bytesExibe a imagem, com laboratórios de eixos sendo ,
cumsum(c(0,A,D,64,R))
ec(0,127,S,S,0)
também linhas de eixo e etiquetas numéricas.Obrigado a @Zahiro Mor por cortar 3 bytes !
Resposta anterior:
fonte
cumsum(c(0,A,D,64,R))
para substituir o primeiro termo na plotagem. com cumSum você não vai precisar o truque b e ainda raspar 3 bytes :)function(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 bytes
Isso gera uma função anônima "ans" que deve ser chamada como ans (A, D, S, R).
fonte
JavaScript (ES6) + HTML, 126 + 23 = 149
Recebe uma entrada de cada vez na ordem
A, S, D, R
.fonte
JavaScript (ES6),
114111 bytesRetorna uma imagem SVG adequada para
innerHTML
. Adicione 18 bytes para XML válido.fonte
<input>
s?64,64,64,64
. Normalmente eu codificar a saída correta para a entrada padrão, mas não vejo como isso seria difícil aqui ...Haskell,
112110 bytesExemplo de uso:
(0#10) 50 80
.Isso usa a
Gloss
biblioteca. Adisplay
função espera que uma janela seja""
plotada (aqui: uma janela sem título ( ), tamanho 600x300, posição(0,0)
na área de trabalho), uma cor de plano de fundo (red
) e uma figura que seja uma linha ao longo do caminho feita ao compactar a soma cumulativa de[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
como o coordenadas x e[0,127,s,s,0]
como as coordenadas y.Edit: Obrigado @xnor por 2 bytes!
fonte
scanl(+)0[a,d,64,r]
Processando,
134108 + 14 (ligue parasize
) =148122 bytesPrimeiro, precisamos de uma chamada para
size
algum lugar do programa para que a saída caiba na janela (padrão em 100x100).E aqui está a função real:
Chame como
f(15,20,70,40);
Captura de tela
Minha resposta mais recente é mais direta do que a resposta mais antiga, mas eu gosto mais da mais antiga (mesmo que seja maior).
Resposta antiga (148 bytes)
e as duas funções
Chame assim
f(int_array_containing_values);
e o resultado será algo como:f(new int[]{15,20,70,40});
fonte
SmileBASIC, 90 bytes
fonte
PHP,
149130 bytesrecebe entrada dos argumentos da linha de comando, grava a imagem (PNG com gráfico azul no preto) no stdout. Requer PHP 7.1 ou posterior.
uso por exemplo
+4 bytes para o PHP mais antigo: Substitua
[,$a,$d,$s,$r]
porlist(,$a,$d,$s,$r)
.Há um pequeno corte lá: em vez de usar
imageopenpolygon
para ocultar a linha de base, a linha de polígono final é desenhada fora da tela. (y = 127 seria exibido apenas em uma imagem com altura> = 128.)Eu poderia ter economizado mais com a cor 99 ou 9 em vez de 999; mas esses são bem difíceis de ver no preto. :)
fonte
Bash + graça , 70 bytes
O script grava para arquivar
f
as coordenadas de cada ponto, e o xmgrace (a versão da GUI) lê o arquivo e exibe o gráfico usando linhas por padrão.Execute :
Saída: (tela de impressão)
Eu acho que isso pode ser feito diretamente por um script de graça, se ele aceita entrada, mas não estou familiarizado com sua sintaxe. Eu vou dar uma olhada.
Explicação:
fonte
Go,
947915506 bytesIsso está longe de ser otimizado, tentando aprender o idioma enquanto participa dessas perguntas. Sinta-se livre para apontar o que eu posso fazer.
Condensado:
Incondicional:
fonte
dc, 120 bytes
Inicialmente, pensei que não poderia responder em CC, mas vejo que a impressão da sintaxe de uma imagem vetorial é permitida.
O código calcula as coordenadas traduzidas de cada ponto e gera a sintaxe SVG para o gráfico. Como um editor de imagens tem a origem no canto superior esquerdo, tive que subtrair os
y
valores deheight
127 nesse caso, para que a imagem seja mostrada como se a origem estivesse no canto inferior esquerdo.Execute o exemplo: ou Experimente Online!
Resultado:
Para exibir o gráfico da imagem, salve a saída exata em um arquivo e abra-o no Gimp, por exemplo, ou digite o texto em uma página html, como fiz acima.
Explicação:
dc
é uma linguagem de pilha do d esk c alculator com polimento reversoO script é uma concatenação longa da cadeia de sintaxe SVG. A palavra-chave
M
significa mover para coordenar eL
significa desenhar linha da posição atual para a coordenada especificada .fonte