Les synthétiseurs sonores utilisent des générateurs d'enveloppe pour contrôler la manière dont certains paramètres du son (tels que le volume général) changent avec le temps. Dans de nombreux synthétiseurs, une enveloppe est définie par quatre paramètres, comme indiqué dans la figure suivante de Wikipedia :
- Temps d'attaque (A) : temps nécessaire pour que l'enveloppe atteigne son niveau maximum, à partir de zéro, lorsque la touche est enfoncée pour la première fois.
- Temps de chute (D) : temps mis par l'enveloppe pour atteindre le niveau de maintien spécifié.
- Sustain level (S) : niveau qui est maintenu, après l'attaque initiale et la décroissance, tant que la touche est enfoncée.
- Temps de relâchement (R) : temps nécessaire pour que l’enveloppe atteigne zéro lorsque la touche est relâchée.
Le défi
Entrez les quatre paramètres A, D, S, R et tracez l'enveloppe .
Les paramètres seront des valeurs entières comprises entre 0 et 127 .
Le niveau maximum (atteint à la fin de la phase d’attaque) sera de 127 .
La durée du segment horizontal au niveau de l'effet Sustain sera supposée être de 64 (dans le son réel, cette durée n'est pas fixée, elle est déterminée par la durée pendant laquelle la touche est enfoncée).
Format et détails supplémentaires
La sortie doit être une image au format raster ou vectoriel. Si c'est un raster, la ligne polygonale doit occuper au moins 50 pixels verticalement et horizontalement.
L'image peut être affichée ou produite sous forme de fichier dans un format d'image standard. Le fichier peut être écrit sur le disque ou son contenu exact peut être exporté soit dans STDERR, soit en tant qu'argument de retour de fonction.
Le graphique doit uniquement contenir la ligne polygonale qui définit l'enveloppe. L'échelle de chaque axe peut être choisie librement. D'autres éléments tels que des lignes d'axe, des étiquettes numériques ou des couleurs de ligne sont facultatifs.
Les moyens d'entrée et le format sont flexibles comme d'habitude. Par exemple, vous pouvez prendre les quatre nombres dans n'importe quel ordre ou un tableau les contenant. Un programme ou une fonction peut être fourni. Les failles standard sont interdites.
Le code le plus court en octets gagne.
Cas de test
L'entrée est dans le format [A D S R]
. Notez que l'échelle est différente dans chaque figure (conformément à la règle selon laquelle l'échelle peut être choisie librement)
[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]
la source
Réponses:
MATL,
3122 octetsAccepte quatre entrées distinctes commandées en
A
,D
,R
,S
Essayez-le sur MATL Online
Explication
la source
TikZ,
195193181177172167163160 160159 octetsMerci à David Carlisle pour sa réponse utile ici
Oui, vous avez bien entendu TikZ .
Explication
Cela utilise quelques techniques pour atteindre son objectif. La première chose est l'entrée. La plupart des gens ne savent peut-être pas que L A T E X peut prendre des contributions. Eh bien ça peut. Ceci est réalisé avec la commande
\typein
. Cela arrêtera le compilateur et demandera une entrée à l'utilisateur en l'affectant à une variable.L'autre technique principale est l'utilisation de
\def
.\def
dans Tikz est absurdement puissant. Il définit essentiellement un morceau de code et le colle partout où vous appelez la variable. Dans ce code, nous définissons deux choses\typein[#1]{}
pour pouvoir affecter nos variables de manière amusante et)--(\a+\d
parce que ce code apparaît plusieurs fois dans la version non-golfée.Voici deux versions du code (sans le wrapper):
Golfé:
Ungolfed:
Image:
Étant donné que je ne peux pas télécharger directement une image pdf et que la convertir en un autre format semble entraîner la disparition complète de la ligne, voici à quoi une image pourrait ressembler lorsqu'elle est ouverte dans Aperçu (l'entrée est pour cette image
[64 64 64 64]
):Comme vous pouvez le voir, c'est très mince. Cependant, étant donné qu’il s’agit d’une image PDF et non d’une image raster, il n’est pas nécessaire de respecter les exigences d’épaisseur.
la source
input tikz\begin{document}
marche pas ?pdflatex adsr.tex
ne semble pas fonctionner. - Oh, attends, ça marche, je ne m'attendais pas à ce que cela demande une entrée interactive!Python 2,
838079 octetsEssayez-le en ligne (version de 83 octets, car il fonctionne en ligne)
Notez que certaines sorties peuvent ne pas être complètement visibles à l'aide de Trinket, en raison du fonctionnement du canevas. Vous devrez télécharger et installer Python si vous voulez que cela fonctionne mieux.
Ungolfed:
Cette version ne fonctionne pas dans Trinket, car Trinket ne prend pas en charge la valeur de décompression des entrées.
la source
map
dans 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
sur bibelot Avez-vous confirmé que cela fonctionne? Je ne sais pas si l'erreur est propre à Trinket ou non.Mathematica,
6158 octets
est l'opérateurTranspose
et est rendu en exposantT
par Mathematica.Prend les arguments dans l'ordre
S, R, A, D
et retourne un objet graphique vectoriel.Résultats pour les sept cas de test:
Cliquez pour agrandir.
la source
ListLinePlot
:) Et il y en a unListStepPlot
aussi - si utile!R,
6663 octetsAffiche l'image, les laboratoires d'axes étant
cumsum(c(0,A,D,64,R))
etc(0,127,S,S,0)
, ainsi que les lignes d'axe et les étiquettes numériques.Merci à @Zahiro Mor d'avoir réduit de 3 octets !
Réponse précédente:
la source
cumsum(c(0,A,D,64,R))
pour remplacer le premier terme du graphique. avec cumsum vous n'aurez pas besoin de la ruse b et vous aurez encore 3function(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 octets
Cela donne une fonction anonyme "ans" qui doit être appelée comme ans (A, D, S, R).
la source
JavaScript (ES6) + HTML, 126 + 23 = 149
Prend une entrée à la fois dans l'ordre
A, S, D, R
.la source
JavaScript (ES6),
114111 octetsRenvoie une image SVG appropriée pour
innerHTML
. Ajoutez 18 octets pour un code XML valide.la source
<input>
s?64,64,64,64
. Normalement, je coderais correctement la sortie correcte pour l'entrée par défaut, mais je vois à quel point ce serait difficile ici ...Haskell,
112110 octetsExemple d'utilisation:
(0#10) 50 80
.Cela utilise la
Gloss
bibliothèque. Ladisplay
fonction attend une fenêtre dans laquelle tracer (ici: une fenêtre sans titre (""
), taille 600x300, position(0,0)
sur le bureau), une couleur de fond (red
) et une image qui est une ligne le long du chemin créé en zippant la somme cumulée de[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
comme le coordonnées x et[0,127,s,s,0]
comme les coordonnées y.Edit: Merci @xnor pour 2 octets!
la source
scanl(+)0[a,d,64,r]
Traitement,
134108 + 14 (appel àsize
) =148122 octetsNous avons d’abord besoin d’un appel
size
quelque part dans le programme pour que la sortie tienne dans la fenêtre (valeur par défaut de 100x100).Et voici la fonction réelle:
Appelez ça comme
f(15,20,70,40);
Capture d'écran
Ma réponse la plus récente est plus simple que la réponse plus ancienne, mais j'aime davantage la réponse la plus ancienne (même si elle est plus grande).
Ancienne réponse (148 octets)
et les deux fonctions
Appelez-le comme
f(int_array_containing_values);
et le résultat ressemblera à quelque chose comme:f(new int[]{15,20,70,40});
la source
SmileBASIC, 90 octets
la source
PHP,
149 à130 octetsprend les arguments de la ligne de commande, écrit l'image (PNG avec le graphe bleu sur noir) sur la sortie standard. Nécessite PHP 7.1 ou une version ultérieure.
utilisation par exemple
+4 octets pour les anciens PHP: Remplacez
[,$a,$d,$s,$r]
parlist(,$a,$d,$s,$r)
.Il y a un petit hack dedans: au lieu d'utiliser
imageopenpolygon
pour masquer la ligne de base, la ligne de polygone de finition est dessinée à l'extérieur du canevas. (y = 127 ne s'afficherait que sur une image de hauteur> = 128.)J'aurais pu économiser plus avec la couleur 99 ou 9 au lieu de 999; mais ceux-ci sont assez difficiles à voir en noir. :)
la source
Bash + Grace , 70 octets
Le script écrit pour
f
archiver les coordonnées de chaque point et xmgrace (la version de l'interface graphique) lit le fichier et affiche le tracé en utilisant des lignes par défaut.Run :
Sortie: (écran d'impression)
Je pense que cela peut être fait directement par un script de grâce, s'il accepte les entrées, mais je ne connais pas bien sa syntaxe. Je vais y regarder.
Explication:
la source
Go,
947915506 octetsC'est loin d'être optimisé, essayer d'apprendre la langue tout en participant à ces questions. N'hésitez pas à préciser ce que je peux faire.
Condensé:
Sans condition:
la source
dc, 120 octets
Au départ, je pensais que je ne pouvais pas répondre en courant continu, mais je constate que l’impression de la syntaxe d’une image vectorielle est autorisée.
Le code calcule les coordonnées traduites de chaque point et génère la syntaxe SVG du tracé. Comme un éditeur d'image a son origine dans le coin supérieur gauche, il a fallu soustraire les
y
valeurs deheight
127, dans ce cas, pour que l'image soit affichée comme si l'origine était dans le coin inférieur gauche.Exécuter un exemple: ou l' essayer en ligne!
Sortie:
Pour afficher le tracé de l'image, enregistrez cette sortie exacte dans un fichier et ouvrez-le avec Gimp, par exemple, ou entrez le texte dans une page HTML comme je l'ai fait ci-dessus.
Explication:
dc
est un inverse de polissage d esk c alculator langue de la pileLe script est une longue concaténation de la chaîne de syntaxe SVG. Le mot - clé
M
est synonyme de mouvement pour coordonner etL
représente la ligne de tirage au sort de la position actuelle de coordonnées données .la source