Звуковые синтезаторы используют генераторы огибающей для управления тем, как определенные параметры звука (например, общая громкость) меняются со временем. Во многих синтезаторах оболочка определяется четырьмя параметрами, как показано на следующем рисунке из Википедии :
- Время атаки (A) : время, необходимое для того, чтобы конверт достиг максимального уровня, начиная с нуля, при первом нажатии клавиши.
- Время затухания (D) : время, необходимое конверту для достижения заданного уровня сустейна.
- Уровень сустейна (S) : уровень, который поддерживается после первоначальной атаки и затухания в течение всего времени нажатия клавиши.
- Время выпуска (R) : время, необходимое для достижения конвертом нуля при отпускании ключа.
Соревнование
Введите четыре параметра A, D, S, R и нанесите огибающую .
Параметры будут целочисленными значениями от 0 до 127 .
Максимальный уровень будет предполагаться (достигнуто в конце фазы атаки) , чтобы быть 127 .
Предполагается, что горизонтальный сегмент на уровне сустейна имеет длительность 64 (в реальном звуке эта длительность не является фиксированной, а определяется количеством времени, в течение которого удерживается клавиша).
Формат и дальнейшие детали
На выходе должно быть изображение в растровом или векторном формате. Если это растр, то полигональная линия должна занимать не менее 50 пикселей по вертикали и по горизонтали.
Изображение может отображаться или создаваться в виде файла в стандартном формате изображения. Файл может быть записан на диск, или его точное содержимое может быть выведено либо в STDERR, либо в качестве аргумента возврата функции.
Граф должен содержать только многоугольную линию, которая определяет оболочку. Масштаб каждой оси может быть выбран произвольно. Другие элементы, такие как оси линий, числовые метки или цвета линий, являются необязательными.
Средства ввода и формат, как обычно, гибки . Например, вы можете взять четыре числа в любом порядке или массив, содержащий их. Программа или функция может быть предоставлена. Стандартные лазейки запрещены.
Самый короткий код в байтах побеждает.
Контрольные примеры
Ввод в формате [A D S R]
. Обратите внимание, что масштаб отличается на каждом рисунке (в соответствии с правилом, что масштаб может быть выбран произвольно)
[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]
источник
Ответы:
MATL,
3122 байтаПринимает четыре отдельных входа заказан как
A
,D
,R
,S
Попробуйте это в MATL Online
объяснение
источник
TikZ,
195193181177172167163160159 байтСпасибо Дэвиду Карлайлу за его полезный ответ здесь
Да, вы правильно слышали TikZ .
объяснение
Это использует несколько методов для достижения своей цели. Первое - это ввод. Большинство людей могут не знать, что L A T E X может принять участие. Ну, это может. Это достигается с помощью команды
\typein
. Это остановит компилятор и запросит ввод от пользователя, так как назначит его переменной.Другой основной метод - это использование
\def
.\def
в тикзе это абсурдно мощно. По сути, он определяет кусок кода и вставляет его везде, где вы вызываете переменную. В этом коде мы определяем две вещи,\typein[#1]{}
так что мы можем назначить наши переменные по-гольфистски, и)--(\a+\d
потому что этот код появляется несколько раз в неуправляемой версии.Вот две версии кода (без оболочки):
Golfed:
Ungolfed:
Образ:
Поскольку я не могу загрузить изображение в формате PDF напрямую, и преобразование его в любой другой формат, по-видимому, приводит к тому, что строка полностью исчезает, вот как может выглядеть изображение при открытии в Preview (вход для этого изображения
[64 64 64 64]
):Как видите, он очень тонкий. Однако, поскольку это изображение PDF, а не растровое изображение, оно не должно соответствовать требованиям по толщине.
источник
input tikz\begin{document}
работает?pdflatex adsr.tex
не похоже на работу. - Ой, подождите, это работает, я просто не ожидал, что он запросит интерактивный ввод!Python 2,
838079 байтовПопробуйте онлайн (83-байтовая версия, потому что он работает онлайн)
Обратите внимание, что некоторые выходные данные могут быть не полностью видны при использовании Trinket из-за того, как работает холст. Вам нужно будет скачать и установить Python, если вы хотите, чтобы он работал лучше.
Ungolfed:
Эта версия не работает в Trinket, потому что Trinket не поддерживает распаковку значений ввода.
источник
map
в 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
. Вы подтвердили, что это работает? Я не уверен, является ли ошибка уникальной для Брелка или нет.Mathematica,
6158 байт
является оператором дляTranspose
и представляется как верхний индексT
Mathematica.Принимает аргументы в порядке
S, R, A, D
и возвращает объект векторной графики.Результаты для всех семи тестовых случаев:
Нажмите для увеличения версии.
источник
ListLinePlot
:) И еще есть -ListStepPlot
так полезно!R,
6663 байтаОтображает изображение, с осью лаборатории является
cumsum(c(0,A,D,64,R))
иc(0,127,S,S,0)
, а также осевые линии и числовые метки.Спасибо @Zahiro Mor за то, что сбрил 3 байта !
Предыдущий ответ:
источник
cumsum(c(0,A,D,64,R))
чтобы заменить первый термин в сюжете. с cumsum вам не понадобится трюк b и все равноfunction(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 байтов
Это дает анонимную функцию «ans», которая должна называться ans (A, D, S, R).
источник
JavaScript (ES6) + HTML, 126 + 23 = 149
Принимает ввод по одному в заказе
A, S, D, R
.источник
JavaScript (ES6),
114111 байтВозвращает SVG-изображение, подходящее для
innerHTML
. Добавьте 18 байтов для правильного XML.источник
<input>
s?64,64,64,64
. Обычно я бы жестко закодировал правильный вывод для ввода по умолчанию, но я вижу, как это было бы трудно здесь ...Haskell,
112110 байтовПример использования:
(0#10) 50 80
.Это использует
Gloss
библиотеку.display
Функция ожидает окно замышляет (здесь: окно без заголовка (""
), размера 600x300, положение(0,0)
на рабочем столе), цвет фона (red
) и изображение ведьму является линией , вдоль пути , сделанного проносясь кумулятивной суммы[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
как координаты х и[0,127,s,s,0]
в качестве координат у.Редактировать: Спасибо @xnor за 2 байта!
источник
scanl(+)0[a,d,64,r]
Обработка,
134108 + 14 (вызовsize
) =148122 байтаСначала нам нужно вызвать
size
куда-нибудь в программе, чтобы вывод уместился в окне (по умолчанию 100x100).И вот фактическая функция:
Назови это как
f(15,20,70,40);
Скриншот
Мой новый ответ более прост, чем старый, но мне больше нравится старый (даже если он больше).
Старый ответ (148 байт)
и две функции
Назовите это как,
f(int_array_containing_values);
и результат будет выглядеть примерно так:f(new int[]{15,20,70,40});
источник
SmileBASIC, 90 байт
источник
PHP,
149130 байтпринимает входные данные из аргументов командной строки, записывает изображение (PNG с графиком синим на черном) в стандартный вывод. Требуется PHP 7.1 или более поздняя версия.
например, использование
+4 байта для старого PHP: заменить
[,$a,$d,$s,$r]
наlist(,$a,$d,$s,$r)
.Там есть небольшой хак: вместо того,
imageopenpolygon
чтобы скрывать базовую линию, завершающая линия многоугольника рисуется вне холста. (y = 127 будет отображаться только на изображении с высотой> = 128.)Я мог бы сохранить больше с цветом 99 или 9 вместо 999; но это довольно трудно увидеть на черном. :)
источник
Bash + Grace , 70 байт
Сценарий записывает в файл
f
координаты каждой точки, а xmgrace (версия с графическим интерфейсом) считывает файл и отображает график с использованием линий по умолчанию.Выполнить :
Вывод: (печать экрана)
Я думаю, что это может быть сделано непосредственно с помощью сценария «льготный», если он может принимать ввод, но я не знаком с его синтаксисом. Я посмотрю на это.
Объяснение:
источник
Go,
947915506 байтЭто далеко не оптимизировано, пытаясь выучить язык, участвуя в этих вопросах. Не стесняйтесь указывать, что я могу сделать.
Сгущенное:
Uncondenced:
источник
постоянный ток, 120 байтов
Сначала я думал, что не могу ответить в dc, но вижу, что печать синтаксиса векторного изображения разрешена.
Код вычисляет переведенные координаты каждой точки и генерирует синтаксис SVG для графика. Поскольку редактор изображений имеет начало координат в верхнем левом углу, мне пришлось вычесть
y
значения изheight
127 в этом случае, чтобы изображение отображалось так, как если бы источник находился в нижнем левом углу.Запустите пример: или попробуйте онлайн!
Выход:
Чтобы отобразить графическое изображение, сохраните этот точный вывод в файл и, например, откройте его в Gimp или введите текст на html-странице, как я делал выше.
Объяснение:
dc
является обратным для ногтей д ESK с alculator языком стекаСкрипт представляет собой длинную конкатенацию синтаксической строки SVG. Ключевое слово
M
обозначает перемещение в координату иL
обозначает рисование линии от текущей позиции до заданной координаты .источник