Mainkan “Taps”


31

Hari ini, 11 November 2015, adalah Hari Veteran di Amerika Serikat. " Taps " adalah panggilan terompet yang dimainkan di pemakaman militer AS:

( "Taps" di SoundCloud dari vtmiller )

Ini adalah melodi sederhana, panjangnya hanya dua puluh empat dan hanya menggunakan empat nada yang berbeda. Inilah lembaran musiknya:

Ketuk musik lembaran ( sumber )

Tantangan

Tulis program atau fungsi yang memainkan "Taps" atau mengeluarkan file audio "Taps" dalam format file audio apa pun yang umum (mis. MP3, WAV, MIDI). Itu dapat dimainkan dengan tombol apa saja, menggunakan segala jenis instrumen atau bunyi bip yang tersedia untuk bahasa Anda. Misalnya, mungkin terdengar seperti piano, bukan terompet. (Meskipun masih hanya satu jenis instrumen yang harus digunakan.)

Semua dua puluh empat not harus dimainkan dengan nada, durasi, dan jarak yang akurat. Seseorang yang terbiasa dengan "Taps" harus dapat menjalankan kode Anda dan dengan mudah mengenali lagu yang sedang diputar.

Durasi melodi (dari awal not pertama hingga akhir not terakhir) harus antara 30 dan 70 detik. Secara opsional, Anda mungkin memiliki 5 detik keheningan yang menyertai awal dan / atau akhir file suara Anda, sehingga file 80 detik adalah yang terlama.

Anda mungkin tidak, tentu saja, cukup mengunduh lagu secara online di suatu tempat atau mengekstraknya dari perpustakaan audio yang kebetulan memilikinya sebagai sampel. Namun, Anda dapat menggunakan pustaka audio yang dapat memutar / menulis catatan individual dan membuat file audio.

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang. Namun, untuk tantangan khusus ini saya mendorong Anda untuk tidak fokus pada jumlah byte Anda, terutama dengan mengorbankan kualitas suara. Golf kiriman Anda tetapi biarkan diri Anda menjadi kreatif dengan pilihan instrumen Anda atau metodologi output suara. Tantangan ini dimaksudkan untuk menghormati para veteran, bukan tentang memekik versi "Taps" yang nyaris tidak dikenali.

Perhatikan bahwa Anda dapat menyematkan file audio SoundCloud langsung ke posting dengan hanya menempelkan tautan pada baris kosong. Jika Anda memiliki akun SoundCloud, ini akan menjadi cara yang bagus untuk membagikan hasil Anda.


Saya sedang berpikir CHUCK.
The_Basset_Hound

4
Calvin, jika Anda tidak keberatan, saya akan memposting beberapa jawaban golf di BASIC lama dan memberikan sumbangan ke badan amal Veteran di luar PPCG. Anda telah mengilhami saya untuk melakukan itu. BTW di Inggris kami memiliki Remembrance Sunday, hari Minggu kedua di bulan November, yang berarti bahwa tahun ini adalah hari Minggu yang lalu. Salah satu kenangan saya yang paling awal adalah berdiri di dekat sebuah monumen yang dikelilingi bunga poppy di mana 2 menit keheningan diamati. Saya berumur sekitar 3. Ketika saya bertanya kepada ibu saya mengapa tidak ada yang berbicara, dia mengatakan kepada saya untuk diam.
Level River St

Apakah ada aturan untuk panjang fermatas?
SirPython

@ SirPython Saya bahkan tidak tahu apa arti simbol itu! Menurut en.wikipedia.org/wiki/Fermata "Persisnya berapa lama lagi tergantung pada kehendak pelaku." Menggunakan kebijaksanaan pada output tidak benar-benar cocok dengan codegolf, jadi saya memainkannya seperti yang tertulis. Saya melihat ke mana Anda akan pergi ... Memanjang not kedua bertitik bisa mengompres not kedelapan bertitik ke not keenam belas, membuat semuanya lebih sederhana. Tapi saya pikir itu curang :-)
Level River St

Jawaban:


4

qb64, 100 84 byte

Versi terbaru dari Qbasic lama, dapat diunduh di http://www.qb64.net/

Count tidak termasuk spasi, yang tidak diperlukan dan hanya ada di sana untuk membagi data menjadi frase tiga nada untuk kejelasan.

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

Perintah dalam string bermain

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%

Sejarah golf:

Posting pertama: 4/4 kali menjadi 4/2 kali, yang berarti saya memiliki beberapa catatan utuh, tetapi tidak ada catatan keenam belas.

Sunting 1: Kunci diubah dari C (rentang GG) ke F (rentang CC). Sekarang saya hanya perlu melakukan perubahan oktaf sekali, untuk C tinggi, yang hanya terjadi sekali, daripada semua G rendah seperti sebelumnya.

Setelah menyingkirkan semua perubahan oktaf itu, saya pikir tidak ada lagi golf. Ada total 20 L-an tetapi tidak ada cara yang jelas untuk menghindarinya.

Frasa terakhir (11 karakter) sama dengan yang pertama, tetapi tidak ada cara untuk memasukkannya dua kali di bawah 11 karakter. Data yang diulang akan hanya 9 karakter jika inisial L4dihilangkan (Tampaknya tidak perlu karena panjang nada default tampaknya seperempat catatan, tetapi tidak didokumentasikan jadi saya meninggalkannya.)


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 disimpan berkat Dendrobium dan 1 berkat @PatrickRoberts.

Penjelasan

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
      )

Uji di sini di browser! Bekerja pada browser apa pun yang mendukung API Audio Web HTML5 .


1
-5 byte: c = new AudioContext (); untuk (t = i = 0; n = "301093301396202346202346202396331699464390301093" [i ++];) dengan (c.createOscillator ()) i% 2? L = n / 2: (frekuensi. nilai = 392 + n * 44, hubungkan (c. penentuan), mulai (t + .1), berhenti (t + = l))
Dendrobium

Saya akan mengatakan durasi (mengubah 12 unit menjadi 9) tidak akurat; itu diperburuk oleh fakta bahwa setengah catatan bertitik memiliki fermatas pada mereka dan harus benar-benar 12 atau lebih lama .
lirtosiast

@ThomasKwa Ya, itu tidak sempurna, tetapi persyaratannya harus mudah dikenali jadi saya akan mengatakan itu berlalu. (Juga dengarkan trek SoundCloud dalam pertanyaan, setengah catatan bertitik pertama persis 10/16 jadi jika kita pergi dengan versi itu cukup dekat!: P)
user81655

8

Mathematica, 361 287 285 bytes

Saya mencari akurasi di sini. Keluarannya persis seperti yang dijelaskan dalam skor, dimainkan dengan trompet. Anda dapat menemukan file di sini .

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

Terima kasih kepada @ MartinBüttner untuk saran bermain golf.


4
Tautan tidak memungkinkan saya untuk mendengarkan lagu. Tampaknya dihapus atau tidak tersedia untuk mendengarkan karena izin.
d0nut

2
Untuk menjadi lebih bertele-tele, Anda tidak memperhitungkan fermatas!
wchargin

"Durasi melodi harus antara 30 dan 70 detik." Ini agak pendek pada 24 detik.
Hobi Calvin

4
@ Calvin'sHobbies Tunggu ... Saya melakukan semua ini pada 50 BPM yang disarankan ... Saya menyalahkan Anda: |
LegionMammal978

1
%1, %2dan %%jangan benar-benar menyimpan byte lebih dari x="E5"-> x(pada kenyataannya, melihat seberapa sering Anda menggunakannya, Anda sebenarnya harus menyimpan cukup banyak dengan menggunakan variabel). Kemudian Anda dapat menghemat banyak byte dengan menggunakan EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}dan menyimpan catatan yang paling sering digunakan %. Dan pada 24 catatan mungkin masih lebih pendek untuk mempartisi daftar datar:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Martin Ender

5

Sonic Pi, 899 byte

Waktunya sedikit mati, tapi saya pikir tidak apa-apa.

Golf ringan:

use_synth: blade
use_synth_defaults mempertahankan: 0.70, rilis: 0.0
main: G4, lepaskan: 0,05
tunggu 0,75
main: G4, pertahankan: 0,25
tunggu 0,25
tahan = rrand_i (3,4)
bermain: C5, mempertahankan: tahan, lepaskan: 0,5
tunggu + 0,5
main: G4, lepaskan: 0,05
tunggu 0,75
main: C5, pertahankan: 0,25
tidur 0,25
tahan = rrand_i (3,4)
bermain: E5, mempertahankan: tahan, lepaskan: 1.25
tahan tidur + 1,25
main: G4
tidur 0,70
main: C5
tidur 0,70
2. kali lakukan
  main: E5, pertahankan: 1, lepaskan: 0.25
  tidur 1,25
  main: G4
  tidur 0,7
  main: C5
  tidur 0,7
akhir
tahan = rrand_i (3,5)
bermain: E5, mempertahankan: tahan, lepaskan: 0,75
tahan tidur +1
main: C5, lepaskan: 0,05
tidur 0,75
main: E5, pertahankan: 0.25
tidur 0,25
main: G5, pertahankan: 2,45, lepaskan: 0,05
tidur 2.5
main: E5, pertahankan: 1, lepaskan: 0.25
tidur 1,25
main: C5, pertahankan: 1, lepaskan: 0.25
tidur 1,25
tahan = rrand_i (3,5)
bermain: G4, mempertahankan: tahan, lepaskan: 0,5
tahan tidur + 0,5
main: G4, lepaskan: 0,05
tidur 0,75
main: G4, pertahankan: 0,25
tidur 0,25
tahan = rrand_i (3,5)
bermain: C5, mempertahankan: tahan, lepaskan: 1.5

Ya, seseorang yang menggunakan Sonic Pi!
Mega Man

Bisa sedikit golf melalui penamaan penamaan ulang dengan h, mengubah rilis: 0,0 untuk melepaskan: 0 dan menghapus spasi.
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+

Semua catatan dan pengaturan waktu sudah benar. Saya menggunakan terompet karena itu adalah hal yang paling dekat di MIDI

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


1

Powershell, 183 175 159 byte

Perjalanan nostalgia, siapa yang tidak suka bip?

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


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


Ini akan diputar dalam waktu sekitar 45 detik.

Ini adalah pertama kalinya saya menggunakan Powershell Windows, setiap tips tentang bermain golf ini sangat menyenangkan.


versi lama

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

Unduh juru bahasa di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Skor mengecualikan spasi putih dan baris baru, yang tidak penting dan ditambahkan untuk dibaca

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

Kompresi yang cukup standar, 1 karakter ASCII per nada. Parameter SOUNDadalah sebagai berikut:

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)

Rentang lagunya adalah 13 not, meski hanya 4 yang digunakan. Untuk mendapatkan kisaran ini ke dalam kisaran nomor 95 dari ASCII yang dapat dicetak, saya harus menekan durasinya menjadi bilangan bulat 7 dan membawanya modulo 7. Durasi berikut (dalam enam belas) digunakan (dengan pengecualian 6 yang tidak pernah digunakan): 1,2,3,4,6,8,12. Untuk menghasilkan angka-angka ini, saya mendapat ide untuk membagi 12 dengan kekuatan sqrt(2)(kira-kira sebesar 1,4) dan memotong.

Ini SOUND1,0,1,1adalah gangguan, seharga 12 byte. Penting untuk memberikan jeda di antara nada-nada nada yang identik.


1

Ruby + bip, 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"}`

Butuh waktu beberapa saat untuk membuat ini, saya pikir saya ketinggalan perahu, tapi apa pun.

fmemegang empat frekuensi yang digunakan. nmemegang lima not yang digunakan, dalam kelipatan not ke-16.

a="00101...memegang semua nada not diikuti oleh semua panjang nada, sebagai indeks ke dalam array masing-masing. lkemudian diatur ke indice ke 24 dan seterusnya a. Kemudian perintah bip dibangun dengan mengulangi semua yang di atas, dan dieksekusi


0

C - (Raw: 318 | WAV: 437)

8-bit (unsigned) mono PCM pada 44800 Hz, 33,60 detik.

Dinamika mezzo, fortissimo dan forte agak artistik dilaksanakan. Fermatas bisa lebih baik.

Kode bergantung pada unsigned long long8 oktet dan sistem little endian.

#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

Kompilasi dan jalankan dengan sesuatu seperti:

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

Menambahkan -DRAW ke baris kompilasi untuk varian mentah.

Output mentah dapat dimainkan dengan mis. SoX playsebagai:

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.