Klangsynthesizer verwenden Hüllkurvengeneratoren, um zu steuern, wie sich bestimmte Parameter des Klangs (z. B. die Gesamtlautstärke) mit der Zeit ändern. In vielen Synthesizern wird eine Hüllkurve durch vier Parameter definiert, wie in der folgenden Abbildung aus Wikipedia dargestellt :
- Attack Time (A) : Zeit, die die Hüllkurve benötigt, um ihren Maximalpegel zu erreichen, beginnend mit Null, wenn die Taste zum ersten Mal gedrückt wird.
- Decay Time (D) : Zeit, die die Hüllkurve benötigt, um den angegebenen Sustain-Pegel zu erreichen.
- Sustain Level (S) : Level, der nach dem ersten Attack und Decay so lange gehalten wird, wie die Taste gedrückt wird.
- Release Time (R) : Zeit, die der Briefumschlag benötigt, um beim Loslassen der Taste Null zu erreichen.
Die Herausforderung
Geben Sie die vier Parameter A, D, S, R ein und zeichnen Sie die Hüllkurve .
Parameter sind ganzzahlige Werte von 0 bis 127 .
Das maximale Level (erreicht am Ende der Angriffsphase) wird mit 127 angenommen .
Es wird angenommen, dass das horizontale Segment auf dem Sustain-Pegel eine Dauer von 64 hat (im tatsächlichen Klang ist diese Dauer nicht festgelegt, sondern wird durch die Zeitdauer bestimmt, die die Taste gehalten wird).
Format und weitere Details
Die Ausgabe sollte ein Bild im Raster- oder Vektorformat sein. Wenn es sich um ein Raster handelt, sollte die polygonale Linie vertikal und horizontal mindestens 50 Pixel einnehmen.
Das Bild kann entweder angezeigt oder als Datei in einem Standardbildformat erstellt werden. Die Datei kann auf die Festplatte geschrieben werden, oder der genaue Inhalt kann entweder nach STDERR oder als Funktionsrückgabeargument ausgegeben werden.
Das Diagramm muss nur die polygonale Linie enthalten, die die Hüllkurve definiert. Der Maßstab jeder Achse kann frei gewählt werden. Andere Elemente wie Achsenlinien, numerische Beschriftungen oder Linienfarben sind optional.
Eingabemittel und Format sind wie gewohnt flexibel . Beispielsweise können Sie die vier Zahlen in beliebiger Reihenfolge oder ein Array mit ihnen nehmen. Ein Programm oder eine Funktion kann bereitgestellt werden. Standardlücken sind verboten.
Kürzester Code in Bytes gewinnt.
Testfälle
Die Eingabe erfolgt im Format [A D S R]
. Beachten Sie, dass der Maßstab in jeder Figur unterschiedlich ist (gemäß der Regel, dass der Maßstab frei gewählt werden kann)
[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]
quelle
Antworten:
MATL,
3122 BytesAkzeptiert vier getrennte Eingänge bestellt wie
A
,D
,R
,S
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
TikZ,
195193181177172167163160159 BytesVielen Dank an David Carlisle für seine hilfreiche Antwort hier
Ja, du hast richtig gehört, TikZ .
Erläuterung
Dabei werden einige Techniken verwendet, um das Ziel zu erreichen. Das erste ist die Eingabe. Die meisten Menschen wissen vielleicht nicht , dass L A T E X - Eingang erfolgen. Nun kann es. Dies wird mit dem Befehl erreicht
\typein
. Dadurch wird der Compiler angehalten und eine Eingabe vom Benutzer angefordert, um sie einer Variablen zuzuweisen.Die andere Haupttechnik ist die Verwendung von
\def
.\def
in Tikz ist absurd mächtig. Es definiert im Wesentlichen einen Code und fügt ihn überall dort ein, wo Sie die Variable aufrufen. In diesem Code definieren wir zwei Dinge,\typein[#1]{}
damit wir unsere Variablen ordnen können und)--(\a+\d
weil dieser Code in der ungolfed-Version einige Male auftaucht.Hier sind zwei Versionen des Codes (ohne den Wrapper):
Golf gespielt:
Ungolfed:
Bild:
Da ich ein PDF-Bild nicht direkt hochladen kann und die Konvertierung in ein anderes Format dazu führt, dass die Zeile nicht mehr angezeigt wird, sieht ein Bild möglicherweise folgendermaßen aus, wenn es in der Vorschau geöffnet wird (Eingabe für dieses Bild ist
[64 64 64 64]
):Wie Sie sehen, ist es sehr dünn. Da es sich jedoch um ein PDF-Bild und kein Rasterbild handelt, müssen die Dickenanforderungen nicht erfüllt werden.
quelle
input tikz\begin{document}
funktioniert?pdflatex adsr.tex
scheint nicht zu funktionieren. - Oh, warte, es funktioniert, ich hätte einfach nicht erwartet, dass es interaktive Eingaben erfordert!Python 2,
838079 BytesVersuchen Sie es online (83-BitVersion, weil es online läuft)
Beachten Sie, dass bestimmte Ausgaben mit Trinket aufgrund der Funktionsweise der Zeichenfläche möglicherweise nicht vollständig sichtbar sind. Sie müssen Python herunterladen und installieren, damit es besser funktioniert.
Ungolfed:
Diese Version funktioniert nicht in Trinket, da Trinket das Entpacken von Eingabewerten nicht unterstützt.
quelle
map
2 in Python: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
auf Trinket. Haben Sie bestätigt, dass es funktioniert? Ich bin mir nicht sicher, ob der Fehler nur bei Trinket auftritt oder nicht.Mathematica,
61-58Bytes
ist der Operator fürTranspose
und wirdT
von Mathematica als hochgestellt dargestellt .Übernimmt die Argumente in der Reihenfolge
S, R, A, D
und gibt ein Vektorgrafikobjekt zurück.Ergebnisse für alle sieben Testfälle:
Klicken Sie für eine größere Version.
quelle
ListLinePlot
:) Und es gibt auch eineListStepPlot
- so nützlich!R,
6663 BytesZeigt das Bild mit Achsenlabors als
cumsum(c(0,A,D,64,R))
undc(0,127,S,S,0)
sowie Achsenlinien und numerischen Beschriftungen an.Vielen Dank an @Zahiro Mor für das Abschneiden von 3 Bytes !
Vorherige Antwort:
quelle
cumsum(c(0,A,D,64,R))
, um den ersten Term im Plot zu ersetzen. mit cum brauchst du nicht den b trick undfunction(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 Bytes
Dies ergibt eine anonyme Funktion "ans", die als ans (A, D, S, R) bezeichnet werden muss.
quelle
JavaScript (ES6) + HTML, 126 + 23 = 149
Nimmt die Eingabe nacheinander in der Reihenfolge vor
A, S, D, R
.quelle
JavaScript (ES6),
114111 ByteGibt ein SVG-Bild zurück, das für geeignet ist
innerHTML
. Fügen Sie 18 Byte für gültiges XML hinzu.quelle
<input>
s Standardwerte hinzu ?64,64,64,64
. Normalerweise würde ich die richtige Ausgabe für die Standardeingabe festHaskell,
112110 BytesAnwendungsbeispiel:
(0#10) 50 80
.Dies nutzt die
Gloss
Bibliothek. Diedisplay
Funktion erwartet, dass ein Fenster""
geplottet wird (hier: ein Fenster ohne Titel ( ), Größe 600x300, Position(0,0)
auf dem Desktop), eine Hintergrundfarbe (red
) und ein Bild, das eine Linie entlang des Pfades ist, der durch Zippen der kumulativen Summe von erstellt wird[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
als erstellt wird x-Koordinaten und[0,127,s,s,0]
als y-Koordinaten.Edit: Danke @xnor für 2 Bytes!
quelle
scanl(+)0[a,d,64,r]
Verarbeitung,
134108 + 14 (Aufruf ansize
) =148122 BytesZuerst müssen wir
size
irgendwo im Programm aufrufen, damit die Ausgabe in das Fenster passt (Standard bei 100x100).Und hier ist die eigentliche Funktion:
Nenne es so
f(15,20,70,40);
Bildschirmfoto
Meine neuere Antwort ist einfacher als die ältere, aber ich mag die ältere mehr (auch wenn sie größer ist).
Alte Antwort (148 Bytes)
und die beiden Funktionen
Nenne es so
f(int_array_containing_values);
und das Ergebnis sieht ungefähr so aus:f(new int[]{15,20,70,40});
quelle
SmileBASIC, 90 Bytes
quelle
PHP,
149130 BytesNimmt Eingaben von Befehlszeilenargumenten entgegen und schreibt das Bild (PNG mit Grafik blau auf schwarz) in stdout. Benötigt PHP 7.1 oder höher.
Verwendung zB
+4 Bytes für älteres PHP: Ersetzen
[,$a,$d,$s,$r]
durchlist(,$a,$d,$s,$r)
.Da ist ein kleiner Hack drin: statt zu benutzen
imageopenpolygon
die Grundlinie auszublenden, wird die Endpolygonlinie außerhalb der Zeichenfläche gezeichnet. (y = 127 würde nur auf einem Bild mit einer Höhe> = 128 angezeigt.)Ich hätte mehr mit Farbe 99 oder 9 anstelle von 999 sparen können; aber diese sind auf Schwarz ziemlich schwer zu erkennen. :)
quelle
Bash + Grace , 70 Bytes
Das Skript schreibt, um
f
die Koordinaten jedes Punkts abzulegen, und xmgrace (die GUI-Version) liest die Datei und zeigt den Plot standardmäßig mit Linien an.Ausführen :
Ausgabe: (Bildschirm drucken)
Ich denke, dies kann direkt von einem Grace-Skript durchgeführt werden, wenn es Eingaben akzeptiert, aber ich bin mit seiner Syntax nicht vertraut. Ich werde es untersuchen.
Erläuterung:
quelle
Los,
947915506 BytesDies ist alles andere als optimiert, da versucht wird, die Sprache zu lernen, während an diesen Fragen teilgenommen wird. Sie können jederzeit darauf hinweisen, was ich tun kann.
Kondensiert:
Nicht kondensiert:
quelle
Gleichstrom, 120 Bytes
Anfangs dachte ich, ich kann nicht in dc antworten, aber ich sehe, dass das Drucken der Syntax eines Vektorbildes erlaubt ist.
Der Code berechnet die übersetzten Koordinaten jedes Punkts und generiert die SVG-Syntax für die Zeichnung. Da ein Bildeditor den Ursprung in der oberen linken Ecke hat, musste ich den subtrahieren
y
Werte vonheight
in diesem Fall 127 , damit das Bild so angezeigt wird, als ob der Ursprung in der linken unteren Ecke liegt.Beispiel ausführen : oder Online ausprobieren!
Ausgabe:
Um das Bilddiagramm anzuzeigen, speichern Sie die genaue Ausgabe in einer Datei und öffnen Sie sie beispielsweise mit Gimp, oder geben Sie den Text wie oben beschrieben in eine HTML-Seite ein.
Erläuterung:
dc
ist ein Reverse-Politur d esk c alculator Stapel SpracheDas Skript ist eine lange Verkettung der SVG-Syntaxzeichenfolge. Das Schlüsselwort
M
steht für Move to Coordinate undL
steht für Draw Line von der aktuellen Position zur angegebenen Koordinate .quelle