Слушать «Taps»


31

Сегодня, 11 ноября 2015 года, в Соединенных Штатах отмечается День ветеранов . « Отводы » - это вызов горючего на военных похоронах США:

( «Отводы» на SoundCloud от vtmiller )

Это простая мелодия, длиной всего двадцать четыре ноты и использующая только четыре разных ноты. Вот ноты:

Ноты ( источник )

Вызов

Напишите программу или функцию, которая воспроизводит «Taps» или выводит аудиофайл «Taps» в любом распространенном формате аудиофайлов (например, MP3, WAV, MIDI). Его можно играть на любой клавише, используя любой тип инструмента или звуковой сигнал, доступный для вашего языка. Например, это может звучать как пианино, а не как горн. (Хотя по-прежнему следует использовать только один тип инструмента.)

Все двадцать четыре ноты должны быть воспроизведены с точной высотой, длительностью и интервалом. Кто-то, кто знаком с «Taps», должен иметь возможность запустить ваш код и легко распознать воспроизводимую песню.

Продолжительность мелодии (от начала первой ноты до конца последней ноты) должна составлять от 30 до 70 секунд. При желании у вас может быть до 5 секунд тишины, дополняющих начало и / или конец вашего звукового файла, так что 80-секундный файл является самым длинным из допустимых.

Вы, конечно, не можете просто скачать песню где-нибудь онлайн или извлечь ее из аудио-библиотеки, в которой она есть в качестве образца. Однако вы можете использовать аудио библиотеки, которые могут воспроизводить / создавать отдельные заметки и создавать аудио файлы.

счет

Это , поэтому выигрывает самый короткий ответ в байтах. Тем не менее, для решения этой конкретной задачи я призываю вас не сосредотачиваться на количестве байтов, особенно в ущерб качеству звука. Гольф ваши представления, но позвольте себе быть творческим с вашим выбором инструмента или методологии вывода звука. Задача состоит в том, чтобы почтить память ветеранов, а не выкрикивать едва узнаваемую версию «Taps».

Обратите внимание, что вы можете встраивать аудиофайлы SoundCloud непосредственно в сообщения , просто вставив ссылку в пустую строку. Если у вас есть учетная запись SoundCloud, это будет отличным способом поделиться своими результатами.


Я думаю, Чук.
The_Basset_Hound

4
Кэлвин, если не возражаешь, я выложу пару ответов о гольфе в старом бейсике и сделаю пожертвование благотворительной организации ветеранов за пределами PPCG. Вы вдохновили меня на это. Кстати, в Великобритании у нас есть воскресенье памяти, второе воскресенье ноября, что означает, что в этом году это было последнее воскресенье. Одно из моих самых ранних воспоминаний стоит у памятника в окружении маков, где соблюдается 2 минуты молчания. Мне было около трех лет. Когда я спросил маму, почему никто не разговаривает, она сказала, чтобы я молчал.
Уровень реки St

Есть ли какие-либо правила для длины фермат?
SirPython

@SirPython Я даже не знал, что означает этот символ! Согласно en.wikipedia.org/wiki/Fermata «Точно, сколько времени он проводится, остается на усмотрение исполнителя». Использование усмотрения в выводе не совсем подходит для Codegolf, поэтому я сыграл это как написано. Хотя я вижу, куда вы идете ... Удлинение пунктирной второй ноты может сжать пунктирную восьмую ноту до шестнадцатой, что упростит задачу. Но я думаю, что это обман :-)
Level River St

Ответы:


4

qb64, 100 84 байта

Обновленная версия старого Qbasic, доступная для загрузки по адресу http://www.qb64.net/

Подсчет исключает пробелы, которые не требуются и только там, чтобы разбить данные на фразы из трех нот для ясности.

PLAY"T99L4C.L8CL1F. L4C.L8FL1A. L4CFL2A L4CFL2A L4CFL1A. L4F.L8AL1>C< L2AFL1C. L4C.L8CL1F."

Команды в игровой строке

T99     set tempo to 99 quarter notes per minute (default is 120, only just too short)
CDEFGAB play notes in the current octave
><      up or down one octave
Lx      following notes are of note of 1/x duration
.       extend previous note duration by 50%

История игры в гольф:

Первый пост: с 4/4 до 4/2, что означает, что у меня есть целые заметки, но нет шестнадцатых заметок.

Редактировать 1: Ключ изменен с C (диапазон GG) на F (диапазон CC). Теперь мне нужно выполнить изменение октавы только один раз для высокого C, который происходит только один раз, а не для всех низких G, как раньше.

Избавившись от всех этих изменений октавы, я не думаю, что есть больше в гольфе. Всего их 20 L, но нет очевидного способа их избежать.

Последняя фраза (11 символов) такая же, как и первая, но невозможно вставить ее дважды, начиная с 11 символов. Повторные данные были бы только 9 символами, если бы начальные L4были удалены (Это кажется ненужным, поскольку длина примечания по умолчанию, кажется, четверть примечания, но это не задокументировано, поэтому я оставил это.)


9

JavaScript, 203 198 196 195 байт

with(new AudioContext)for(t=i=0;n="301093301396202346202346202396331699464390301093"[i++];)with(createOscillator())i%2?l=n/2:(frequency.value=392+n*44,connect(destination),start(t+.1),stop(t+=l))

5 байтов сохранено благодаря Dendrobium и 1 благодаря @PatrickRoberts.

объяснение

with(new AudioContext)        // use HTML5 audio
  for(                        // iterate through the note pitches and lengths
    t=i=0;                    // t = current time to place the note
    n=                        // n = note pitch (or temporarily length)

    // This string contains the values of each note alternating between length and pitch
    //     (l1, p1, l2, p2, etc...)
    // Length value is in 16th notes (1 = 1/16th note, 2 = 1/8th, etc...)
    //     The longer notes are limited to 9 but I think it still sounds OK
    // Pitch value 0 = G4, 3 = C5, 6 = E5, 9 = G5 (multiples of 3 saves 1 byte)
    "301093301396202346202346202396331699464390301093"

  [i++];)
    with(createOscillator())  // create the note oscillator
      i%2?                    // alternate between length and pitch characters
        l=n/2                 // l = length (stored for use in the next iteration)
                              // dividing it by 2 sets the speed to 60 beats per minute
                              //     and casts it to a number
      :(
        frequency.value=392   // base note = G5 (392hz)
          +n*44,              // there is (conveniently) roughly 132hz between each note
        connect(destination), // send the note's sound through the speakers
        start(t               // schedule the note to sound
          +.1),               // short delay to distinguish two notes of the same pitch
        stop(t+=l)            // schedule the end of the note and increment the time
      )

Проверьте это здесь, в браузере! Работает в любом браузере, который поддерживает HTML5 Web Audio API .


1
-5 байт: c = новый AudioContext (); для (t = i = 0; n = "301093301396202346202346202396331699464390301093" [i ++];) с (c.createOscillator ()) i% 2? L = n / 2: (частота. значение = 392 + n * 44, подключение (c.destination), запуск (t + .1), останов (t + = l))
Дендробиум

Я бы сказал, что продолжительность (изменение 12 единиц на 9) является неточной; это усугубляется тем фактом, что на пунктирных половинках есть фермасы, и они должны быть на самом деле 12 или больше .
Lirtosiast

@ThomasKwa Да, это не идеально, но требование должно быть легко узнаваемым, поэтому я бы сказал, что оно проходит. (Также послушайте трек SoundCloud в вопросе, первая нота с точками наполовину ровно 10/16, так что, если мы перейдем к этой версии, она довольно близка!: P)
user81655

8

Mathematica, 361 287 285 байт

Я пошел на точность здесь. Выход в точности соответствует описанному в партитуре, сыгранной на трубе. Вы можете найти файл здесь .

"G"
e="E5";c="C5";EmitSound@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{%,8,17,%,24,20,c,2,23,%,8,26,c,24,29,e,2,32,%,12,35,c,12,38,e,6,41,%,12,44,c,12,47,e,6,50,%,12,53,c,12,56,e,2,59,c,8,62,e,24,65,"G5",3,68,e,6,170/3,c,6,136/3,%,2,34,%,8,34,%,24,34,c,2,34}~Partition~3]

Спасибо @ MartinBüttner за предложения по игре в гольф.


4
Ссылка не позволяет мне услышать песню. Кажется, он либо удален, либо недоступен для прослушивания из-за разрешений.
d0nut

2
Чтобы быть чрезмерно педантичным, вы не учитывали фермы!
wchargin

«Продолжительность мелодии должна быть от 30 до 70 секунд». Это немного коротко на 24 секунды.
Увлечения Келвина

4
@ Calvin'sHobbies Подождите ... Я делаю все это в рекомендуемых 50 ударов в минуту ... Я виню вас: |
LegionMammal978

1
%1, %2И %%фактически не сохранить любой байт над x="E5"-> x(на самом деле, видя , как часто вы используете их , вы должны фактически сохранить довольно много с помощью переменных). Затем вы можете сохранить тонны байтов, используя EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}и сохраняя наиболее часто используемые заметки в %. И на 24 нотах было бы еще короче разделить плоский список:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Мартин Эндер

5

Соник Пи, 899 байт

Время немного отклонено, но я думаю, что все в порядке.

Слегка гольф

use_synth: лезвие
use_synth_defaults Sustain: 0,70, выпуск: 0,0
играть: G4, выпуск: 0.05
подожди 0,75
играть: G4, поддерживать: 0,25
подождите 0,25
удержания = rrand_i (3,4)
играть: C5, поддерживать: удержание, релиз: 0.5
подождите + 0,5
играть: G4, выпуск: 0.05
подожди 0,75
играть: С5, поддерживать: 0,25
спать 0,25
удержания = rrand_i (3,4)
играть: E5, поддерживать: удержание, выпуск: 1.25
удержание сна + 1,25
игра: G4
спать 0,70
играть: C5
спать 0,70
2 раза сделать
  играть: Е5, поддерживать: 1, выпуск: 0,25
  сон 1.25
  игра: G4
  спать 0,7
  играть: C5
  спать 0,7
конец
удержания = rrand_i (3,5)
играть: E5, поддерживать: удержание, освобождение: 0.75
удержание сна + 1
играть: C5, выпуск: 0.05
спать 0,75
играть: Е5, поддерживать: 0,25
спать 0,25
играть: G5, поддерживать: 2.45, выпуск: 0,05
спать 2,5
играть: Е5, поддерживать: 1, выпуск: 0,25
сон 1.25
играть: С5, поддерживать: 1, выпуск: 0,25
сон 1.25
удержания = rrand_i (3,5)
играть: G4, поддерживают: удержание, релиз: 0.5
удержание сна + 0,5
играть: G4, выпуск: 0.05
спать 0,75
играть: G4, поддерживать: 0,25
спать 0,25
удержания = rrand_i (3,5)
играть: C5, поддерживать: удержание, релиз: 1.5

Да, кто-то использует Sonic Pi!
Mega Man

Может быть слегка изменено путем переименования удержания с помощью h, изменения релиза: 0.0 в релиз: 0 и удаления пробелов.
Mega Man

4

MATLAB, 338 327 262 258 230 байтов

o=@(L,f)sin(pi*.11*2^(f/12))*(1:600*L))
sound([o(3,-1) o(1,-1) o(12,2) o(3,-1) o(1,2) o(12,4) o(2,-1) o(2,2) o(4,4) o(2,-1) o(2,2) o(4,4) o(2,-1) o(2,2) o(12,4) o(3,2) o(1,4) o(8,6) o(4,4) o(4,2) o(12,-1) o(3,-1) o(1,-1) o(12,4)])

2

SmileBASIC, 73 байта

BGMPLAY"@56T50L2.G8.G16B+G8.<C16E>[G8<C8E4>]2G8<C8EC8.E16G2E4C4>GG8.G16B+

Все заметки и сроки верны. Я использовал трубу, потому что это самая близкая вещь в MIDI

<audio autoplay controls src="//12me21.github.io/resources/taps.mp3"></audio>


1

Powershell, 183 175 159 байт

Ностальгия, кто не любит гудки ?!

foreach($i in 0..23){[console]::beep((196,262,330,392)[(001012012012012123210001-split'')[$i]],(3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12)[$i]*400)}


Объяснение (sortof)

foreach($i in 0..23) { # foreach loop which ranges from 0 to 23
    [console]::beep( # [console]::beep(Pitch, Duration)
        (196,262,330,392) # the notes in Hertz
            [ # select which note to use
                (001012012012012123210001-split'') # -split '' creates an array of [0,0,1,0,1 ...], spaces can be omitted
                [$i] # select the n-th element
            ],
        (3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12) # array of durations
        [$i]*400 # duration in milliseconds * 400
    )
}


Это будет играть примерно через 45 секунд.

Я впервые использую Windows Powershell, любые советы по игре в гольф - это welome.


Старые версии

175

foreach($i in(0..23)){[console]::beep((196,262,330,392)[(0,0,1,0,1,2,0,1,2,0,1,2,0,1,2,1,2,3,2,1,0,0,0,1)[$i]],(3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12)[$i]*400)}

183

$d=3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12;$n=0,0,1,0,1,2,0,1,2,0,1,2,0,1,2,1,2,3,2,1,0,0,0,1;foreach($i in(0..23)){[console]::beep((196,262,330,392)[$n[$i]],$d[$i]*400)}

1

BBC Basic, 111

Скачать переводчик можно по адресу http://www.bbcbasic.co.uk/bbcwin/bbcwin.html.

Оценка исключает пробелы и символы новой строки, которые не являются необходимыми и добавлены для удобства чтения

FORk=1TO24
  x=ASC(MID$("')F'Lb(Ke(Ke(KbJhxeI#')F",k))
  SOUND1,-9,x DIV7*4+60,INT(12/1.4^(x MOD7))*5
  SOUND1,0,1,1
NEXT

Довольно стандартное сжатие, 1 символ ASCII на ноту. Параметры SOUNDследующие:

Channel (always 1 for the purposes of this challenge)
Amplitude (negative for on, 0 for off, positive is an envelope index)
Pitch (in increments of 1/4 semitone, with middle C at 100)
Duration (20ths of a second)

Диапазон песни составляет 13 нот, хотя используются только 4. Чтобы получить этот диапазон в диапазоне для печати ASCII из 95 чисел, мне пришлось сжать длительность в целочисленный диапазон 7 и взять его по модулю 7. Используются следующие длительности (в шестнадцатых) (за исключением 6, которое никогда не бывает используется): 1,2,3,4,6,8,12. Чтобы получить эти числа, я натолкнулся на идею деления 12 на степень sqrt(2)(приблизительно 1,4) и усечения.

Это SOUND1,0,1,1раздражает, стоит 12 байтов. Необходимо обеспечить паузу между нотами одинакового тона.


1

Рубин + гудок, 178 байт

f=[260,346,416,499]
n=[12,*1..4]
l=(a="001012012012012123210001310310224224220318440310".chars.map(&:to_i))[24..-1]
`beep#{24.times.map{|i|" -f#{f[a[i]]} -l#{n[l[i]]}00"}*" -n"}`

Мне потребовалось некоторое время, чтобы сделать это, я думаю, что пропустил лодку, но что угодно.

fсодержит четыре используемые частоты. nсодержит пять использованных длин нот, кратных 16-м нотам.

a="00101...содержит все высоты нот, сопровождаемые всеми длинами нот, в качестве индексов для соответствующих массивов. lзатем устанавливается 24-й индекс и далее a. Затем создается звуковая команда путем итерации всего вышеперечисленного и выполняется


0

C - (Raw: 318 | WAV: 437)

8-битный (без знака) моно PCM с частотой 44800 Гц, 33,60 секунды.

Меццо-форте, фортиссимо и форте-динамика несколько художественно реализованы. Фермас может быть лучше.

Код опирается на unsigned long long8 октетов и систему с прямым порядком байтов.

#include<stdio.h>
#include<math.h>
#ifdef RAW
main(){unsigned long long D[]={0x422422c13c13,0xc13c44813c22},X[]={27863,37193,46860,55727},O=0x406e64924910,i=0,j;float Z,A,U=40,P;for(;i<24;D[i++/12]>>=4){Z=X[O&3]/1e6;P=0;O>>=2;A=i>18?--U:i<14?U+i/2:U+30;for(j=(D[i/12]&15)*13440;j;A-=--j<7e3&&A>0?.01:0)putchar(A*sin(P+=Z)+128);}}
#else
main(){unsigned long long D[]={0x422422c13c13,0xc13c44813c22},X[]={27863,37193,46860,55727},O=0x406e64924910,i=0,j;float Z,A,U=40,P;int W[]={0x46464952,1570852,0x45564157,544501094,16,65537,44800,44800,524289,0x61746164,1505280};fwrite(W,4,11,stdout);for(;i<24;D[i++/12]>>=4){Z=X[O&3]/1e6;P=0;O>>=2;A=i>18?--U:i<14?U+i/2:U+30;for(j=(D[i/12]&15)*13440;j;A-=--j<7e3&&A>0?.01:0)putchar(A*sin(P+=Z)+128);}}
#endif

Скомпилируйте и запустите что-то вроде:

gcc -std=c99 -o taps taps.c -lm
./taps > taps.wav
play taps.wav

Добавить -DRAWв строку компиляции для необработанного варианта.

Сырой вывод можно воспроизвести, например, с помощью SoX play:

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.