Это еженедельный вызов № 1. Тема: Обработка аудио
Ваша задача - написать программу, которая записывает аудиофайл на диск (в формате по вашему выбору), который содержит код Морзе для 2015
, т.е.
..--- ----- .---- .....
Вы можете выбрать любой тип звука для сегментов, например, одночастотную синусоидальную волну, аккорд, шум, какой-либо инструмент (например, с помощью файлов MIDI), если он слышен. Однако есть некоторые ограничения по срокам:
- Короткие сегменты должны быть длиной не менее 0,2 секунды.
- Длинные сегменты должны быть как минимум в 3 раза длиннее коротких.
- Разрывы между сегментами в пределах цифры должны быть такой же длины, что и короткие сегменты.
- Разрывы между цифрами должны быть такой же длины, как и длинные сегменты.
- Каждый сегмент и разрыв могут отклоняться до 10% от средней длины сегмента / разбиения этого типа.
- Весь аудиофайл не может быть длиннее 30 секунд.
Перерывы не должны быть абсолютно бесшумными, но сегменты Морзе должны быть слышно громче, чем разрывы.
Обратите внимание, что вы должны написать аудио файл. Вы не можете просто воспроизвести звук, например, используя системные гудки. Вы можете использовать любую библиотеку для обработки формата файла и генерации аудио, но вы не должны использовать встроенные функции для кодирования Морзе.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Пожалуйста, рассмотрите возможность ссылки на загрузку полученного аудиофайла (в SoundCloud или аналогичной), чтобы люди могли проверить результат без необходимости запуска вашего кода. Если вы загружаете в SoundCloud, убедитесь, что вы включили загрузку на вкладке Permissions трека.
Если ваш вывод использует довольно необычный формат файла, пожалуйста, добавьте некоторую информацию о том, как воспроизвести его и / или преобразовать в более распространенный формат и загрузить его.
Пример трека
Это пример сгенерированного вручную трека, который соответствует спецификации и использует шум для сегментов Морзе (точнее, фоновый шум микрофона). Вот ссылка на SoundCloud, если у вас не работает встроенный проигрыватель.
Баунти Детали
Я назначу награду за самую короткую заявку на языке звукового программирования , то есть на языке, предназначенном для синтеза звука. Этот список не полный, поэтому не стесняйтесь использовать другой язык звукового программирования, если вы его знаете. Если вы не уверены, что какой-либо язык, который вы хотите использовать, классифицируется как язык звукового программирования, пожалуйста, дайте мне знать в комментариях или в чате , и мы можем обсудить это.
Обратите внимание, что ваша заявка по-прежнему должна соответствовать всем правилам - в частности, она должна написать файл, что может быть невозможно на всех языках звукового программирования. Например, насколько я могу судить, гиббер может только воспроизводить звук, а не сохранять его в файл.
Ответы:
AWKBASH:66866774 байтаПо просьбе Мартина Бюттнера я добавил темп, поскольку после проверки стандарта нотации ABC кажется, что для этого нет определенного значения по умолчанию (спасибо Nutki за указание этого).
Я также записываю в файл на диске (а) вместо STDOUT, так как вопрос явно хотел "файл на диске".
Я установил темп 99, который заставляет аудио файл длиться 22 секунды; Это медленнее, чем моя предыдущая версия, но, по крайней мере, теперь она должна быть одинаковой длины на каждом ABC-плеере, и она подходит менее 30 секунд.
Это выглядит ... очень похоже на предыдущую версию, как вы можете видеть:
Вот новый миди-файл .
Первая версия BASH (темп отсутствует)
Почему я не подумал об этом первым ...: o)
Это на 22 байта меньше, чем с AWK, для того же результата
Как и предыдущая версия в AWK, в stdout записывается действительный файл обозначений «ABC» (спасибо Tobia за то, что выяснилось, что выражение «L» было необязательным)
Это выглядит так:
И это звучит так же, как в предыдущей версии .
Предыдущая версия в AWK (86 байт)
Вот новая версия; немного дольше, но с более точным временем. Я приведу первую версию ниже для сравнения / ссылки:
Это все еще действительный файл "abc", который выглядит так:
Вот новый миди-файл (я ускорил темп, чтобы не превышать 30 секунд).
Первая версия в AWK (66 байт):
Это намного менее интересно, чем мой предыдущий ответ , но это намного короче, поэтому:
В результате вы получите действительный файл «abc», который можно прочитать (в том числе) в EasyABC. Это будет выглядеть так:
и это будет звучать так (файл midi) . +
источник
Машинный код x86 (файл .COM):
121120113109 байтHexDump:
Может быть легко запущен под DosBox; выходной файл .SND с именем
SND
. Вот FLAC-версия его вывода (и здесь .COM-файл).Комментируемая сборка:
Выше
data.dat
приведено простое в использовании представление строки Морзе (младший бит: звук включен / выключен, верхние 7 бит: длина звука в сэмплах >> 4), сгенерированные скриптом Python:источник
a
Изa.snd
помещаются непосредственно перед заголовком СНДА, который начинается с.snd
последующим нулевым байтом, так что я получаю.snd
часть бесплатно и я перерабатываю его нулевой терминатор. Кроме того, тот факт, что заголовок начинается на один байт после имени файла, позволяет мне использовать ainc dx
для перехода к заголовку (1 байт) вместоmov dx, header
(3 байта). OTOH, если бы мне было позволено вызывать его в.snd
одиночку, я мог бы сохранить два байта, но я не уверен, что реальный DOS позволил бы это (обработка расширения под DOS была довольно своеобразной)..SND
: я попал.SND
на DosBox,SND~1
на FreeDOS, и я ожидаю чего-то другого на «настоящей» DOS; таким образом, это определенно область «неопределенного поведения». В итоге я согласился с вызовом файлаSND
(на 1 байт меньше из-за удаленногоa
, сохраняя стоимостьinc dx
- которая становитсяdec dx
).Mathematica - 130
Играть онлайн
источник
Export
, как"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
должен быть(b=None~s~#&)@.4
Кроме того , вы можете сохранить 3 символов с помощьюr = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
Perl 5: 94
122 140Файлы SND имеют более простые заголовки, не нужно печатать в двоичном формате. Эти версии производят моно SND-файл 8 кГц с именем «a»:
Файл результатов .
Старое решение. Создает 8-битный монофонический WAV-файл 1 кГц с именем «a»:
Файл результатов .
Чтобы получить 122 символа, мне пришлось вставить заголовок в двоичном виде вместо упаковки, что затрудняет копирование кода. Экранированная версия:
Кодирование Base64 фактического решения 122 байтов:
источник
.au
расширение, возможно. Отлично сработано!AWK:
172170 байт... и без использования какой-либо волновой библиотеки! (*)
Это выводит аудиофайл Sun au на стандартный вывод, который может быть воспроизведен vlc (среди прочего). Хотя формат файла au не имеет каких-либо ограничений частоты дискретизации, VLC отказывается воспроизводить любой файл с частотой дискретизации ниже 4096 Гц, поэтому я использовал эту частоту
РЕДАКТИРОВАТЬ: ссылка на полученный аудио файл на DropBox
(*) Не должно ли быть бонуса за это? ; О)
источник
d=d "\177
... конкатенации. Это сохраняет байт. Но когда я проигрываю полученный аудиофайл, звучит так, как будто ему не хватает последнего разряда 5.Питон, 155
Использует встроенный волновой модуль Python.
Пишет в файл с именем
n
.Спасибо Sp3000 за предложение использовать списки для цикла (это помогло удалить немного отступов).
Послушай это:
https://soundcloud.com/bitpwner/morse-the-new-year-2015
Вот ссылка на SoundCloud, если у вас не работает встроенный проигрыватель.
Код комментария:
источник
w
это побочный эффект, я думаю, что вы можете перечислить comp, чтобы сохранить два байта:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
C #,
556552536535516506503491483 байтаИспользует библиотеку Wav.Net .
Вывод в файл с именем
a
.Результат размещен на Dropbox
Ungolfed код:
источник
питон
32,191188174171 (нет библиотек)WAV файлы невероятно просты. Хотел попробовать без библиотек. По каким-то причинам мои файлы, похоже, приводят к сбою проигрывателя Windows Media. Quicktime
работаетошибки в середине файла. Преобразование в большую частоту дискретизации с помощью Audition исправляет это.Обновление : Реализованы некоторые оптимизации из ответа Perl. Теперь выходы только с именем
n
и в выборке 1000 Гц. Отредактировал информацию выше соответственно.Старая версия
источник
C # ~ 485 байт
Использование библиотеки Wav.Net .
И вот вывод.
Читаемая версия,
источник
C #
382333 байтаНе использует никаких нестандартных библиотек, записывает wav со скоростью 8 битов на семпл 44100 сэмплов в секунду, что, как я надеюсь, является допустимым заголовком (похоже, он хорошо воспроизводится / загружается в WMP / .NET / Audacity).
Заголовок кодируется в формате base64, а азбука Морзе кодируется как сигнал включения / выключения, который сохраняется в одном длинном (64 бита), поскольку последние 5 битов такие же, как и первый.
Результат можно найти здесь
Гольф-код:
С комментариями:
источник
.wav
, поэтому вы можете сохранить там 4 байта.Суперколлайдер ,
625605 байтПредставление аудио языка программирования!
Вывод записывается в файл
b
в формате AIFF. Проигрыватель Windows Media не может открыть его, но он прекрасно работает в VLC Media Player. Сгенерированный файлa
является файлом OSC .Я создал несколько функций SuperCollider:
f
генерирует короткий гудок,g
короткий перерыв,h
длинный гудок иi
длинный перерыв. SuperCollider нужны начальные позиции для каждой синусоидальной волны, а не длина, поэтому мне пришлось создавать функции, которые генерируют волну с правильной стартовой позицией, и я должен вызывать функции каждый раз, когда мне нужна синусоида. (Я не смог сохранить волну определенной длины в переменной для повторного использования).\w
Определение создается в конце блока кода.На моем компьютере с Windows он не сохранял аудиофайл в том же каталоге, что и мой код, но в этом каталоге:
Результат размещен на Dropbox
Код с отступом:
источник
Чук -
1195217201147145144ChucK - это язык аудио программирования. bitpwner помог мне уменьшить это с 201 байта до 147 байтов.
Вот прямая ссылка на SoundCloud, если встроенный плеер не работает для вас.
источник
WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
j
чтобы избежать массива?1016835
в двоичном виде есть11111000010000000011
.j
нужно просто отслеживать паузы между каждой цифрой2015
(каждая цифра имеет 5 звуков).Csound, 140 + 40 = 180
Аудио язык программирования.
Это файл оркестра:
и это файл Score:
Размеры рассчитываются без учета дополнительных пробелов, однострочного терминатора (UNIX) и без терминатора после последней строки.
Вы вызываете их с помощью команды csound:
который создаст выходной файл в текущем каталоге, по умолчанию с именем «test.aif»
https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq
Я мог бы побрить два или три байта, выбрав более уродливую форму волны, но мне нравится звучание традиционной синусоидальной волны Морзе.
PS: Я новичок в Csound, любые советы по игре в гольф приветствуются, особенно в отношении файла результатов!
источник
брейкфук , 649 байт
Это генерирует последовательность 8-битных сэмплов без знака, которые могут воспроизводиться со скоростью 8000 сэмплов в секунду с помощью такого инструмента, как
aplay
в Linux. Кредит в таблицу констант БФ .Попробуйте онлайн!
Несколько меньше в гольф
источник