Chơi Taps vòi


31

Hôm nay, ngày 11 tháng 11 năm 2015, là Ngày Cựu chiến binh tại Hoa Kỳ. " Taps " là cuộc gọi bugle được phát trong đám tang của quân đội Hoa Kỳ:

( "Vòi" trên SoundCloud từ vtmiller )

Đó là một giai điệu đơn giản, chỉ dài hai mươi bốn nốt và chỉ sử dụng bốn nốt khác nhau. Đây là bản nhạc:

Vòi nhạc ( nguồn )

Thử thách

Viết chương trình hoặc chức năng phát "Vòi" hoặc xuất tệp âm thanh của "Vòi" ở bất kỳ định dạng tệp âm thanh phổ biến nào (ví dụ MP3, WAV, MIDI). Nó có thể được phát trong bất kỳ phím nào, sử dụng bất kỳ loại nhạc cụ hoặc tiếng bíp nào có sẵn cho ngôn ngữ của bạn. Ví dụ, nó có thể phát ra âm thanh như đàn piano thay vì tiếng khúc khích. (Mặc dù vẫn chỉ nên sử dụng một loại nhạc cụ.)

Tất cả hai mươi bốn nốt nhạc phải được chơi với cao độ, thời lượng và khoảng cách chính xác. Ai đó quen thuộc với "Taps" sẽ có thể chạy mã của bạn và dễ dàng nhận ra bài hát đang được phát.

Thời lượng của giai điệu (từ khi bắt đầu nốt đầu tiên đến hết nốt cuối cùng) phải trong khoảng từ 30 đến 70 giây. Bạn có thể tùy chọn có tối đa 5 giây để đệm im lặng khi bắt đầu và / hoặc kết thúc tệp âm thanh của mình, vì vậy tệp 80 giây là thời gian dài nhất được phép.

Tất nhiên, bạn có thể không tải xuống bài hát trực tuyến ở đâu đó hoặc trích xuất nó từ thư viện âm thanh có thể lấy nó làm mẫu. Tuy nhiên, bạn có thể sử dụng các thư viện âm thanh có thể phát / soạn các ghi chú riêng lẻ và tạo các tệp âm thanh.

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng. Tuy nhiên, đối với thử thách đặc biệt này, tôi khuyến khích bạn không tập trung vào số byte của mình, đặc biệt là chi phí cho chất lượng âm thanh. Chơi bài nộp của bạn nhưng cho phép bản thân sáng tạo với lựa chọn nhạc cụ hoặc phương pháp đầu ra âm thanh. Thử thách này có nghĩa là nhằm tôn vinh các cựu chiến binh, chứ không phải là rít lên một phiên bản "Taps" hầu như không thể nhận ra.

Lưu ý rằng bạn có thể nhúng các tệp âm thanh SoundCloud trực tiếp vào bài đăng bằng cách chỉ dán liên kết trên một dòng trống. Nếu bạn có tài khoản SoundCloud, đây sẽ là một cách tuyệt vời để chia sẻ đầu ra của bạn.


Tôi đang nghĩ ChucK.
The_Basset_Hound

4
Calvin, nếu bạn không phiền, tôi sẽ đăng một vài câu trả lời golf trong BASIC cũ và quyên góp cho một tổ chức từ thiện Cựu chiến binh bên ngoài PPCG. Bạn đã truyền cảm hứng cho tôi để làm điều đó. BTW ở Anh, chúng ta có Chủ nhật Tưởng nhớ, Chủ nhật thứ hai vào tháng 11, có nghĩa là năm nay là Chủ nhật tuần trước. Một trong những ký ức đầu tiên của tôi là đứng bên một tượng đài được bao quanh bởi những cây anh túc nơi có 2 phút im lặng được quan sát. Tôi khoảng 3. Khi tôi hỏi mẹ tại sao không ai nói chuyện, mẹ bảo tôi im lặng.
Cấp sông St

Có bất kỳ quy tắc cho chiều dài của fermatas?
SirPython

@SirPython Tôi thậm chí còn không biết biểu tượng đó có nghĩa gì! Theo en.wikipedia.org/wiki/Fermata "Chính xác thì nó được giữ trong bao lâu tùy theo ý của người biểu diễn." Sử dụng thận trọng trên đầu ra không thực sự phù hợp với codegolf, vì vậy tôi đã chơi nó như được viết. Tôi thấy bạn đang đi đâu ... Kéo dài nốt thứ hai chấm có thể nén nốt thứ tám rải rác xuống nốt thứ mười sáu, làm cho mọi thứ đơn giản hơn. Nhưng tôi nghĩ đó là gian lận :-)
Level River St

Câu trả lời:


4

qb64, 100 84 byte

Phiên bản cập nhật của Qbasic cũ, có thể tải xuống tại http://www.qb64.net/

Đếm loại trừ các khoảng trắng, không bắt buộc và chỉ có ở đó để phân chia dữ liệu thành các cụm từ ba ghi chú cho rõ ràng.

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

Các lệnh trong chuỗi chơi

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%

Lịch sử chơi gôn:

Bài đầu tiên: 4/4 lần đến 4/2 thời gian, có nghĩa là tôi có một số ghi chú toàn bộ, nhưng không có ghi chú thứ mười sáu.

Chỉnh sửa 1: Khóa đã thay đổi từ C (phạm vi GG) thành F (phạm vi CC). Bây giờ tôi chỉ phải thực hiện thay đổi quãng tám một lần, đối với C cao, chỉ xảy ra một lần, thay vì tất cả các G thấp như trước đây.

Đã thoát khỏi tất cả những thay đổi quãng tám, tôi không nghĩ có thêm môn đánh gôn nào nữa. Có tổng số 20 Lnhưng không có cách nào rõ ràng để tránh chúng.

Cụm từ cuối cùng (11 ký tự) giống như cụm từ đầu tiên, nhưng không có cách nào để chèn nó hai lần vào dưới 11 ký tự. Dữ liệu lặp lại sẽ chỉ có 9 ký tự nếu L4loại bỏ chữ cái đầu tiên (Có vẻ như không cần thiết vì độ dài ghi chú mặc định dường như là ghi chú quý, nhưng nó không được ghi lại nên tôi để nó lại.)


9

JavaScript, 203 198 196 195 byte

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 byte được lưu nhờ Dendrobium và 1 nhờ @PatrickRoberts.

Giải trình

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
      )

Kiểm tra nó ở đây trong trình duyệt! Hoạt động trên mọi trình duyệt hỗ trợ API âm thanh Web HTML5 .


1
-5 byte: c = new AudioContext (); for (t = i = 0; n = "301093301394202346202346202394331699464390301093" [i ++];) với (c.createOscillator ()) i% 2? value = 392 + n * 44, kết nối (c.destination), start (t + .1), stop (t + = l))
Dendrobium

Tôi muốn nói rằng thời lượng (thay đổi 12 đơn vị thành 9) là không chính xác; nó trở nên tồi tệ hơn bởi thực tế là các nốt nửa chấm có fermatas trên chúng và thực sự phải là 12 hoặc dài hơn .
lirtosiast

@ThomasKwa Vâng, nó không hoàn hảo, nhưng yêu cầu là phải dễ nhận biết nên tôi nói nó sẽ qua. (Cũng nghe bản nhạc SoundCloud trong câu hỏi, nửa nốt chấm đầu tiên chính xác là 10/16 vì vậy nếu chúng ta đi theo phiên bản đó thì nó khá gần !: P)
user81655

8

Toán học, 361 287 285 byte

Tôi đã đi cho chính xác ở đây. Đầu ra chính xác như được mô tả trong bản nhạc, được chơi với kèn. Bạn có thể tìm thấy các tập tin ở đây .

"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]

Cảm ơn @ MartinBüttner cho các đề xuất chơi gôn.


4
Liên kết không cho phép tôi nghe bài hát. Nó dường như bị xóa hoặc không có sẵn để nghe do quyền.
d0nut

2
Để được thêm phạm vi, bạn đã không tính đến các fermatas!
wchargein

"Thời lượng của giai điệu phải trong khoảng từ 30 đến 70 giây." Đây là một chút ngắn ở 24 giây.
Sở thích của Calvin

4
@ Calvin'sHobbies Chờ ... Tôi đang làm tất cả điều này ở mức 50 BPM được đề xuất ... Tôi đổ lỗi cho bạn: |
LegionMammal978

1
%1, %2%%không thực sự tiết kiệm bất kỳ byte trên x="E5"-> x(trên thực tế, khi nhìn thấy mức độ thường xuyên bạn sử dụng chúng, bạn nên thực sự tiết kiệm khá nhiều bằng cách sử dụng các biến). Sau đó, bạn có thể tiết kiệm hàng tấn byte bằng cách sử dụng EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}và lưu trữ ghi chú được sử dụng nhiều nhất trong %. Và ở 24 ghi chú, có thể vẫn còn ngắn hơn để phân vùng một danh sách phẳng:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Martin Ender

5

Sonic Pi, 899 byte

Thời gian là một chút, nhưng tôi nghĩ rằng nó ổn.

Chơi golf nhẹ:

use_synth: phiến
use_synth_defaults bền vững: 0,70, phát hành: 0,0
chơi: G4, phát hành: 0,05
chờ 0,75
chơi: G4, duy trì: 0,25
chờ 0,25
giữ = rrand_i (3,4)
chơi: C5, bền vững: giữ, phát hành: 0,5
chờ giữ + 0,5
chơi: G4, phát hành: 0,05
chờ 0,75
chơi: C5, duy trì: 0,25
ngủ 0,25
giữ = rrand_i (3,4)
chơi: E5, bền vững: giữ, phát hành: 1.25
giữ giấc ngủ + 1,25
chơi: G4
ngủ 0,70
chơi: C5
ngủ 0,70
2. đôi khi làm
  chơi: E5, duy trì: 1, phát hành: 0,25
  ngủ 1,25
  chơi: G4
  ngủ 0,7
  chơi: C5
  ngủ 0,7
kết thúc
giữ = rrand_i (3,5)
chơi: E5, bền vững: giữ, phát hành: 0,75
giữ giấc ngủ + 1
chơi: C5, phát hành: 0,05
ngủ 0,75
chơi: E5, duy trì: 0,25
ngủ 0,25
chơi: G5, duy trì: 2,45, phát hành: 0,05
ngủ 2,5
chơi: E5, duy trì: 1, phát hành: 0,25
ngủ 1,25
chơi: C5, duy trì: 1, phát hành: 0,25
ngủ 1,25
giữ = rrand_i (3,5)
chơi: G4, bền vững: giữ, phát hành: 0,5
giữ giấc ngủ + 0,5
chơi: G4, phát hành: 0,05
ngủ 0,75
chơi: G4, duy trì: 0,25
ngủ 0,25
giữ = rrand_i (3,5)
chơi: C5, bền vững: giữ, phát hành: 1.5

Vâng, ai đó đang sử dụng Sonic Pi!
Mega Man

Có thể được đánh gôn một chút thông qua đổi tên giữ bằng h, thay đổi phát hành: 0,0 thành phát hành: 0 và xóa khoảng trắng.
Mega Man

4

MATLAB, 338 327 262 258 230 byte

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 byte

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

Tất cả các ghi chú và thời gian là chính xác. Tôi đã sử dụng một cây kèn vì đó là thứ gần nhất trong MIDI

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


1

Powershell, 183 175 159 byte

Chuyến đi nỗi nhớ, ai không thích tiếng bíp?!

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)}


Giải thích (sắp xếp)

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
    )
}


Điều này sẽ chơi trong khoảng 45 giây.

Đây là lần đầu tiên tôi sử dụng Powershell của Windows, bất kỳ lời khuyên nào về việc chơi golf này đều rất hấp dẫn.


phiên bản cũ

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 cơ bản, 111

Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Điểm không bao gồm khoảng trắng và dòng mới, những thứ không cần thiết và được thêm vào để dễ đọc

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

Nén khá chuẩn, 1 ký tự ASCII mỗi ghi chú. Các thông số của SOUNDnhư sau:

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)

Phạm vi của bài hát là 13 nốt nhạc, mặc dù chỉ có 4 nốt được sử dụng. Để đưa phạm vi này vào phạm vi 95 số ASCII có thể in được, tôi đã phải nén thời lượng thành một phạm vi số nguyên là 7 và lấy nó theo mô đun 7. Các khoảng thời gian sau (trong mười sáu) được sử dụng (ngoại trừ 6 không bao giờ đã sử dụng): 1,2,3,4,6,8,12. Để tạo ra những con số này, tôi đã dựa trên ý tưởng chia 12 cho một lũy thừa sqrt(2)(xấp xỉ 1,4) và cắt ngắn.

Đây SOUND1,0,1,1là một phiền toái, chi phí 12 byte. Nó là cần thiết để cung cấp một khoảng dừng giữa các nốt của cao độ giống hệt nhau.


1

Ruby + tiếng bíp, 178 byte

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"}`

Mất một lúc để làm điều này, tôi nghĩ rằng tôi đã bỏ lỡ chiếc thuyền, nhưng bất cứ điều gì.

fgiữ bốn tần số được sử dụng. ngiữ năm độ dài ghi chú được sử dụng, trong bội số của ghi chú thứ 16.

a="00101...giữ tất cả các nốt ghi chú theo sau bởi tất cả các độ dài ghi chú, như các chỉ mục vào các mảng tương ứng. lsau đó được đặt thành chỉ số thứ 24 trở đi a. Sau đó, một tiếng bíp được xây dựng bằng cách lặp qua tất cả các điều trên và được thực thi


0

C - (Nguyên: 318 | WAV: 437)

PCM đơn âm 8 bit (không dấu) ở tốc độ 44800 Hz, 33,60 giây.

Các động lực của mezzo, fortissimo và forte được thực hiện một cách nghệ thuật. Các fermatas có thể tốt hơn.

Mã dựa trên unsigned long long8 octet và hệ thống endian nhỏ.

#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

Biên dịch và chạy với một cái gì đó như:

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

Thêm -DRAWvào biên dịch dòng cho biến thể thô.

Đầu ra thô có thể được phát với ví dụ SoX playnhư:

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.