“Taps” oyna


31

Bugün, 11 Kasım 2015, Amerika Birleşik Devletleri'nde Gaziler Günü . " Musluklar " ABD askeri cenazelerinde oynanan bugle çağrısıdır :

( SoundCloud'dan üzerinde "Musluklar" dan vtmiller )

Basit bir melodi, sadece yirmi dört nota uzunluğunda ve sadece dört farklı nota kullanıyor. İşte notalar:

Notalar ( kaynak )

Meydan okuma

Herhangi bir ortak ses dosyası biçiminde (örneğin MP3, WAV, MIDI) "Taps" oynayan veya "Taps" adlı bir ses dosyası çıkaran bir program veya işlev yazın. Dilinizde mevcut olan herhangi bir cihaz veya bip sesini kullanarak herhangi bir tuşta çalınabilir. Örneğin, bir borazan yerine piyano gibi gelebilir. (Yine de hala sadece bir enstrüman türü kullanılmalıdır.)

Yirmi dört notanın tamamı doğru adım, süre ve aralıklarla çalınmalıdır. "Musluklar" ile aşina olan biri, kodunuzu çalıştırabilmeli ve çalınan şarkıyı kolayca tanıyabilmelidir.

Melodi süresi (ilk notanın başlangıcından son notanın sonuna kadar) 30 ila 70 saniye arasında olmalıdır. İsteğe bağlı olarak, ses dosyanızın başlangıcını ve / veya sonunu dolduran 5 saniyelik sessizliğe sahip olabilirsiniz, bu nedenle 80 saniyelik bir dosya izin verilen en uzun dosyadır.

Elbette, şarkıyı çevrimiçi olarak bir yerden indiremez veya örnek olarak almış olduğu bir ses kitaplığından çıkaramazsınız. Ancak, ayrı ayrı notaları çalabilecek / yazdırabilen ve ses dosyaları oluşturabilen ses kütüphaneleri kullanabilirsiniz.

puanlama

Bu , yani bayt cinsinden en kısa cevap kazanır. Ancak, bu özel zorluk için, bayt sayınıza, özellikle ses kalitesi pahasına odaklanmamanızı tavsiye ederim. Gönderimlerinizi golf yapın, ancak enstrüman seçiminiz veya ses çıkışı metodolojinizle yaratıcı olmanıza izin verin. Bu meydan okuma gazileri onurlandırmak anlamına geliyor, "Taps" ın zar zor tanınan bir versiyonunu gizlemekle ilgili değil.

Bağlantıyı boş bir satıra yapıştırarak SoundCloud ses dosyalarını doğrudan yayınlara götürebileceğinizi unutmayın . Bir SoundCloud hesabınız varsa bu, çıktınızı paylaşmanın harika bir yoludur.


ChucK'ı düşünüyorum.
The_Basset_Hound 11:15

4
Calvin, sakıncası yoksa, eski BASIC'lere birkaç golfy cevabı yazacağım ve PPCG'nin dışındaki bir Gaziler yardım kuruluşuna bağışta bulunacağım. Bunu yapmak için bana ilham verdin. BKW’de İngiltere’de Kasım ayında ikinci Pazar olan Anma Pazarımız var, bu yıl geçen Pazar olduğu anlamına geliyor. En eski anılarımdan biri, 2 dakikalık sessizliğin gözlemlendiği haşhaşlarla çevrili bir anıtın yanında duruyor. 3 yaşındaydım. Anneme neden hiç kimsenin konuşmadığını sorduğumda bana sessiz olmamı söyledi.
Seviye Nehri St

Fermataşların uzunlukları için herhangi bir kural var mı?
SirPython

@SirPython Bu sembolün ne anlama geldiğini bile bilmiyordum! En.wikipedia.org/wiki/Fermata 'ya göre "Ne kadar uzun süre tutulursa, sanatçının takdirine kalmıştır." Çıktıda takdir yetkisi kullanmak gerçekten codegolf ile uyuşmuyor, bu yüzden yazılı olarak oynadım. Nereye gittiğini görüyorum ... Noktalı ikinci notayı uzatmak, noktalı sekizinci notayı altıncı nota indirerek her şeyi daha basit hale getirebilir. Ama bence hile yapıyor :-)
Level River St

Yanıtlar:


4

qb64, 100 84 bayt

Eski Qbasic'in güncellenmiş sürümü, http://www.qb64.net/ adresinden indirilebilir.

Sayı, gerekli olmayan boşlukları hariç tutar ve yalnızca verileri netleştirmek için üç notalu ifadelere bölmek için kullanılır.

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

Oyun dizesindeki komutlar

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%

Golf tarihi:

İlk gönderi: 4/4 ila 4/2 arası zaman, yani bazı notlarım var ama on altıncı notum yok.

Düzenleme 1: Anahtar, C (GG aralığında) F (CC) olarak değiştirildi. Şimdi, daha önce olduğu gibi tüm düşük G'lerden ziyade yalnızca bir kez meydana gelen yüksek C için sadece bir kez oktav değişikliği yapmam gerekiyor.

Tüm bu oktav değişikliklerinden kurtulduğumda, golf oynamaktan daha fazlası olduğunu sanmıyorum. Toplam 20 L's var ama onlardan kaçınmanın açık bir yolu yok.

Son cümle (11 karakter) birinciyle aynıdır, ancak 11 karakterin altına iki defa eklemenin yolu yoktur. Baştakiler L4elenirse , tekrarlanan veriler yalnızca 9 karakter olacaktır (Varsayılan not uzunluğu çeyrek not gibi göründüğü için gereksiz görünmektedir, ancak belgelenmemiş, böylece bıraktım.)


9

JavaScript, 203 198 196 195 bayt

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

Dendrobium sayesinde 5 bayt , @PatrickRoberts sayesinde 1 bayt kaydedildi .

açıklama

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
      )

Tarayıcıda burada test edin! HTML5 Web Audio API'sini destekleyen herhangi bir tarayıcıda çalışır .


1
-5 bayt: c = new AudioContext (); ((t = i = 0; n = "301093301396202346202346202396331699464390301093" [i ++];); değer = 392 + n * 44, bağlan (c.destination), start (t + .1), stop (t + = l))
Dendrobium

Sürenin (12 birimi 9'a değiştirerek) yanlış olduğunu söyleyebilirim; Noktalı yarım notaların üzerinde fermatalar olduğu ve 12 ya da daha uzun olması gerektiği daha da kötüleşmiştir .
lirtosiast

@ThomasKwa Evet, mükemmel değil, ancak gereksinim kolayca anlaşılabilir olmalı, bu yüzden geçtiğini söyleyebilirim. (Ayrıca, sorudaki SoundCloud parçasını da dinleyin, ilk noktalı yarım nota tam olarak 10 / 16'lar, bu yüzden eğer bu versiyona
geçersek

8

Mathematica, 361 287 285 bayt

Burada doğruluk için gittim. Çıktı tam trompet ile oynanan skorda açıklandığı gibidir. Dosyayı burada bulabilirsiniz .

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

Golf önerileri için @ MartinBüttner'e teşekkür ederiz.


4
Link şarkıyı duymama izin vermiyor. İzinleri nedeniyle dinlemek için kaldırılmış veya mevcut değil gibi görünüyor.
d0nut

2
Ekstra bilge olmak için, fermantaları hesaba katmadın!
wchargin

"Melodi süresi 30 ila 70 saniye arasında olmalıdır." Bu 24 saniyede biraz kısa.
Calvin'in Hobileri

4
@ Calvin's Hobbies Bekle ... Tüm bunları önerilen 50 BPM'de yapıyorum ... Seni suçluyorum: |
LegionMammal978 12:15

1
%1, %2Ve %%yapamaz herhangi birinin üzerine bayt aslında kaydet x="E5"-> x(değişkenleri kullanarak oldukça çok tasarruf aslında yapmanız gerekir ne sıklıkta kullandığınızı görerek, aslında). Sonra EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}en çok kullanılan notu kullanarak ve saklayarak tonlarca bayttan tasarruf edebilirsiniz %. Ve 24 notta, düz bir listeyi bölmek hala daha kısa olabilir:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Martin Ender

5

Sonic Pi, 899 bayt

Zamanlama biraz kapalı, ama bence sorun değil.

Hafifçe golf:

use_synth: Bıçak
use_synth_defaults sürekli: 0.70, sürüm: 0.0
oyun: G4, serbest: 0.05
0,75 bekle
oyun: G4 sürdürmek: 0.25
0,25 bekle
tutma = rrand_i (3,4)
oyun: C5 sürdürmek: tutma, serbest: 0.5
bekle + 0,5 bekle
oyun: G4, serbest: 0.05
0,75 bekle
oyun: C5 sürdürmek: 0.25
0.25 uyku
tutma = rrand_i (3,4)
oynamak: E5, sürdürmek: tutma, serbest bırakılması: 1.25
uyku tutma + 1.25
oyun: G4
0,70 uyu
oynamak: C5
0,70 uyu
2. kez yapmak
  oyun: E5, sürdürmek: 1, serbest: 0.25
  1.25 uyku
  oyun: G4
  0.7 uyu
  oynamak: C5
  0.7 uyu
son
tutma = rrand_i (3,5)
oynamak: E5, sürdürmek: tutma, serbest bırakılması: 0.75
uyku bekletme + 1
oyun: C5, serbest: 0.05
0,75 uyu
oyun: E5, sürdürmek: 0.25
0.25 uyku
oyun: G5, sürdürmek: 2.45, serbest: 0.05
2.5 uyku
oyun: E5, sürdürmek: 1, serbest: 0.25
1.25 uyku
oyun: C5 sürdürmek: 1, serbest: 0.25
1.25 uyku
tutma = rrand_i (3,5)
oyun: G4, sürdürmek: tutma, serbest: 0.5
uyku tutma + 0.5
oyun: G4, serbest: 0.05
0,75 uyu
oyun: G4 sürdürmek: 0.25
0.25 uyku
tutma = rrand_i (3,5)
oyun: C5 sürdürmek: tutma, serbest: 1.5

Evet, Sonic Pi kullanan biri!
Mega Man

H ile yeniden isimlendirme bekletme, serbest bırakma değiştirme: 0.0, serbest bırakma: 0 ve boşlukları kaldırma yoluyla hafifçe golf oynayabilir.
Mega Man

4

MATLAB, 338 327 262 258 230 bayt

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 bayt

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

Tüm notlar ve zamanlamalar doğrudur. Bir trompet kullandım çünkü MIDI'daki en yakın şey

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


1

Powershell, 183 175 159 bayt

Nostalji gezisi, kim bip sesi sevmez ?!

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


Açıklama (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
    )
}


Bu yaklaşık 45 saniye içinde oynayacak.

Bu benim Windows Powershell kullanarak ilk kez, bu golf hakkında herhangi bir ipucu oldukça.


Eski versiyonlar

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

Tercümanı http://www.bbcbasic.co.uk/bbcwin/bbcwin.html adresinden indirin.

Puan, zorunlu olmayan ve okunabilirlik için eklenen boşluk ve satırsonlarını hariç tutar

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

Oldukça standart sıkıştırma, not başına 1 ASCII karakter. Parametreleri SOUNDaşağıdaki gibidir:

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)

Sadece 4 tanesi kullanılsa bile şarkının menzili 13 nota. Bu sayıyı 95 sayıdaki yazdırılabilir ASCII aralığına dahil etmek için süreyi 7 tamsayı aralığına sıkmak ve modulo 7'yi almak zorunda kaldım. kullanılan): 1,2,3,4,6,8,12. Bu sayıları üretmek için, 12'ye bir güçle sqrt(2)(yaklaşık 1.4) kesip kısma fikrine değiniyorum.

Bu SOUND1,0,1,1, 12 bayta mal olan bir sıkıntıdır. Aynı zift notları arasında bir duraklama sağlamak gereklidir.


1

Ruby + bip sesi, 178 bayt

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

Bunu yapmak biraz zamanımı aldı, sanırım tekneyi özledim, ama her neyse.

fkullanılan dört frekansı tutar. nkullanılan beş nota uzunluğunu, 16 no'lu katların katlarında tutar.

a="00101...Tüm nota aralıklarını takip eder, ardından tüm nota uzunluklarını takip eder ve ilgili notaları indeksler. ldaha sonra 24. indise ayarlanır ve sonrasına doğru a. Ardından, yukarıdakilerin tümünü yineleyerek bir bip komutu oluşturulur ve yürütülür.


0

C - (Ham: 318 | WAV: 437)

8 bit (işaretsiz) mono PCM 44800 Hz'de, 33.60 saniye.

Mezzo forte, fortissimo ve forte dinamikleri biraz sanatsal olarak uygulanmaktadır. Fermatas daha iyi olabilirdi.

Kod unsigned long long8 oktet ve sistem endian endian olmasına dayanır .

#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

Derleme ve benzeri bir şeyle çalıştırın:

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

-DRAWDerleme satırına ham değişken için ekleyin .

Ham çıktı örneğin SoX ile oynatılabilir play:

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.