Pachelbel's Canon'un bir kısmını çal


29

Aşağıdaki alıntıyı Pachelbel'den Canon in D'den sesli olarak çıkarın:

Pachelbel'in Canon'daki D'si

kurallar

  • Bu zorluğun yaratılmasından önce bir kodlayıcı bulunduğunda herhangi bir format / kodlama kullanılabilir.
  • Herhangi bir enstrüman (gerçek bir enstrüman, MIDI sentezi, vb.) Kullanılabilir
  • Tempo 65 BPM olmalıdır (notalarda belirtildiği gibi) - eğer tam olarak 65 BPM alamazsanız (dahil) 64.75 - 65.25 aralığındaki herhangi bir tempoyu kullanabilirsiniz.
  • Notalar konser sahnesinde
  • Eşit mizaç ayarı kullanılmalıdır (özellikle A4 = 440 Hz ile 12-ET)

Başvuru için, burada alıntıyı oynayacak bir Yığın Parçacığı:


Bu pasaj başka bir yerden indirirken rekabetçi olur mu
Blue

4
@muddyfish Hayır, çünkü çıktıyı harici bir kaynaktan almak standart bir boşluktur.
Mego

Ses yerine bir midi dosyası çıkarmak kabul edilebilir mi?
DJMcMayhem

@DJMcMayhem Evet, MIDI dosyaları kabul edilebilir.
Mego

Son (sadece) akorun tam olarak gerekli olduğunu varsayıyorum? Polifonik olmayan dilleri / API'leri etkili bir şekilde yasaklar
Level River St

Yanıtlar:


9

JavaScript (ES7), 249 242 241 bayt

with(new AudioContext)for(t=i=0;n=parseInt('l43l431db98643o86ogfdbdfdgfdzbdzgigikigfdbzbdv98db9864311480'[i++],36);)with(createOscillator())frequency.value=880*2**(-~-n%20/12),connect(destination),start(t),stop(i>56?t+q*8:t+=n>20?q=6/13:q/2)

Bazı bayt tasarrufları için @Neil ve @PatrickRoberts'e teşekkürler!

açıklama

Not, her bir karakterin, baz-36 rakamı olarak tek bir nota olduğu dizgide paketlenir. Not değerleri, aşağıdaki formül ile belirlenir semitones sayısı A5 daha az olan ve bir bir semiquaver ya da bir tril için. Sonunda durur döngü.(19 - pitch) * time + 1pitchtime1200for

Tempo 65.22bpm'dir. Düzenleme: tam olarak 65bpm, 2 bayt için .

Bu açıklama / kullanımlarını demo Math.powyerine **tarayıcı uyumluluğu için. Ayrıca, osilatörlerin kazancını .3, son akorun kulağınızın kanamasına neden olmayacak şekilde ayarlar (varsayılan kazanç 1).

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=parseInt(                   // n = note pitch/length

      // Packed notation string
      'l43l431db98643o86ogfdbdfdgfdzbdzgigikigfdbzbdv98db9864311480'

    [i++],36);
  )
    with(createOscillator())      // create the note oscillator

      // Set the note frequency (using Math.pow for the demo).
      //frequency.value=880*2**(-~-n%20/12),
      frequency.value=880*Math.pow(2,-~-n%20/12),

      // Send the note's sound through the speakers (for the demo, we'll connect it to
      // a gain node so we can reduce the volume).
      //connect(destination),
      connect((g=createGain(),g.gain.value=.3,g.connect(destination),g)),

      start(t),                     // schedule the note to sound
      stop(                         // schedule the end of the note
        i>56?                       // if we are in the final chord
          t+                        //   do not increment the time
            q*8                     //   hard-code the length to a semibreve
        :t+=n>20?q=6/13:q/2         // else update the length based on the note value
      )

HTML5 Web Audio API'sini destekleyen herhangi bir tarayıcıda test etmek için yukarıdaki düğmeye basabilirsiniz .


880*2**(-~-n%20/12)sana bir kaç bayt kurtarmalıyım.
Neil

@Neil Teşekkürler. -~-Not paketimin biçimini değiştirerek de ondan kurtulabileceğimden şüpheleniyorum ( + 1Formülde sadece var çünkü döngüyü 0durdurmam gerekiyor forve göndermeden önce çok fazla düşünmek için tembeldim).
user81655 12

Bunu cevabımı yayınladıktan sonra gördüm, lol
Patrick Roberts

Sen değiştirerek başka byte kaydedebilirsiniz c=new AudioContext;ile with(new AudioContext)iki oluşumunu ve çıkarma c.programda.
Patrick Roberts

1
@ kamoroso94 Hayır. Üskü bir kesir olabilir, bu yüzden kullanırsam <<onu bir tamsayıya çevirir .
user81655

8

Mathematica, 212 152 139 135 bayt

{#~(s=##~SoundNote~41&)~1&/@LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu",{14,18,21}~s~16}~Sound~18.5

SoundOynat düğmesine basıldığında Pachelbel'in Canon'unu D modunda çalan bir nesneyi çıktılar . Enstrüman MIDI enstrümanı # 41 "Keman" dır.

Ses

Beni tıkla!

açıklama

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

Her karakterin harf numaralarını a ile sarılmış ("a" -> 1, "b" -> 2 vb.) Bulun List. (Bu dize Pachelbel’deki Canon’taki D’yi temsil eder)

#~(s=##~SoundNote~41&)~1&/@...

Set siçin SoundNotekimin enstrüman # 41 olduğunu fonksiyonu. Süreyi 1 olarak ayarlayın ve işlevdeki her öğeye eşleştirin List(böylece SoundNoteilkel nesneler yapın).

{14,18,21}~s~16

Son üçlüyü yap. ( 16Son notun 16 kat daha uzun olması için süre vardır - tam notun on altıda on altıncı notudur.)

... ~Sound~18.5

Bir Soundnesne, 18.5saniye uzunluğunda yapın (çünkü tempo 65 bpm [5 tempo 4 b / 4 ile 65 bpm = yaklaşık 18,5 saniye]).

126 bayt versiyonu, rakipsiz

Sound[{(s=SoundNote)/@LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu",{14,18,21}~s~16},240/13]

Rekabetçi değil çünkü çıktı, sekizinci bir notun yerine iki on altıncı notayı içeriyor ve ayırma oldukça dikkat çekici.


14
Gerçekten, Mathematica’nın Pachelbel’in Canon’u için yerleşik bir yeri yok mu?
Stewie Griffin,

1
@StewieGriffin Sadece muhtemelen her şey ve kırpma maliyeti çok yüksek olurdu.
Mego

@StewieGriffin Şaşırtıcı, öyle değil.
JungHwan Min

6

Bubblegum , 203 bayt

00000000: e002 2800 c35d 0026 9509 6f34 76f2 ffad  ..(..].&..o4v...
00000010: 4150 0893 a735 bd02 a1eb 1237 18fe 5498  AP...5.....7..T.
00000020: 120a 83e1 6662 8a5e 9709 fe8a 3430 0f48  ....fb.^....40.H
00000030: 5008 54af d19a b44f 2be9 fb3b bf9d 206d  P.T....O+..;.. m
00000040: abbf 12f0 2151 6dae 4712 8c18 4d8e f5cd  ....!Qm.G...M...
00000050: eb85 404c 17cd bd5c 2775 38bd eb50 ab88  ..@L...\'u8..P..
00000060: e015 fb7e 4b1e 5ddb 515b 144c fc5e c1be  ...~K.].Q[.L.^..
00000070: 3d5d 20cd e950 4a1d 256e b56e d364 188b  =] ..PJ.%n.n.d..
00000080: 6fa1 afcc 2100 0235 ada0 2f23 411d 95dd  o...!..5../#A...
00000090: 6665 3b45 041d cbe2 8e3b 2456 fb8d 4e4c  fe;E.....;$V..NL
000000a0: 1a7f b814 a6cf 850e 9b6c 9285 3a6f 1ec3  .........l..:o..
000000b0: 02ed 505c 996b eb4d 209c 2776 a8aa 8380  ..P\.k.M .'v....
000000c0: 42cc b779 218e e75e 8000 00              B..y!..^...

Çevrimiçi deneyin!

Bu, xxd -rkaynak kodun bir hexdump (tersi ) 'dir. Ürettiği MIDI dosyası aşağıdaki gibidir (ayrıca bir hexdump):

00000000: 4d54 6864 0000 0006 0001 0002 01e0 4d54  MThd..........MT
00000010: 726b 0000 0019 00ff 5902 0200 00ff 5804  rk......Y.....X.
00000020: 0402 1808 00ff 5103 0e15 c500 ff2f 004d  ......Q....../.M
00000030: 5472 6b00 0001 f200 c000 00ff 0405 5069  Trk...........Pi
00000040: 616e 6f00 9051 5f81 5880 5100 1890 4e5f  ano..Q_.X.Q...N_
00000050: 6c80 4e00 0c90 4f5f 6c80 4f00 0c90 515f  l.N...O_l.O...Q_
00000060: 8158 8051 0018 904e 5f6c 804e 000c 904f  .X.Q...N_l.N...O
00000070: 5f6c 804f 000c 9051 5f6c 8051 000c 9045  _l.O...Q_l.Q...E
00000080: 5f6c 8045 000c 9047 5f6c 8047 000c 9049  _l.E...G_l.G...I
00000090: 5f6c 8049 000c 904a 5f6c 804a 000c 904c  _l.I...J_l.J...L
000000a0: 5f6c 804c 000c 904e 5f6c 804e 000c 904f  _l.L...N_l.N...O
000000b0: 5f6c 804f 000c 904e 5f81 5880 4e00 1890  _l.O...N_.X.N...
000000c0: 4a5f 6c80 4a00 0c90 4c5f 6c80 4c00 0c90  J_l.J...L_l.L...
000000d0: 4e5f 8158 804e 0018 9042 5f6c 8042 000c  N_.X.N...B_l.B..
000000e0: 9043 5f6c 8043 000c 9045 5f6c 8045 000c  .C_l.C...E_l.E..
000000f0: 9047 5f6c 8047 000c 9045 5f6c 8045 000c  .G_l.G...E_l.E..
00000100: 9043 5f6c 8043 000c 9045 5f6c 8045 000c  .C_l.C...E_l.E..
00000110: 9042 5f6c 8042 000c 9043 5f6c 8043 000c  .B_l.B...C_l.C..
00000120: 9045 5f6c 8045 000c 9043 5f81 5880 4300  .E_l.E...C_.X.C.
00000130: 1890 475f 6c80 4700 0c90 455f 6c80 4500  ..G_l.G...E_l.E.
00000140: 0c90 435f 8158 8043 0018 9042 5f6c 8042  ..C_.X.C...B_l.B
00000150: 000c 9040 5f6c 8040 000c 9042 5f6c 8042  ...@_l.@...B_l.B
00000160: 000c 9040 5f6c 8040 000c 903e 5f6c 803e  ...@_l.@...>_l.>
00000170: 000c 9040 5f6c 8040 000c 9042 5f6c 8042  ...@_l.@...B_l.B
00000180: 000c 9043 5f6c 8043 000c 9045 5f6c 8045  ...C_l.C...E_l.E
00000190: 000c 9047 5f6c 8047 000c 9043 5f81 5880  ...G_l.G...C_.X.
000001a0: 4300 1890 475f 6c80 4700 0c90 455f 6c80  C...G_l.G...E_l.
000001b0: 4500 0c90 475f 8158 8047 0018 9049 5f6c  E...G_.X.G...I_l
000001c0: 8049 000c 904a 5f6c 804a 000c 9045 5f6c  .I...J_l.J...E_l
000001d0: 8045 000c 9047 5f6c 8047 000c 9049 5f6c  .E...G_l.G...I_l
000001e0: 8049 000c 904a 5f6c 804a 000c 904c 5f6c  .I...J_l.J...L_l
000001f0: 804c 000c 904e 5f6c 804e 000c 904f 5f6c  .L...N_l.N...O_l
00000200: 804f 000c 9051 5f6c 8051 000c 904a 5f00  .O...Q_l.Q...J_.
00000210: 904e 5f00 9051 5f8e 4c80 4a00 0080 4e00  .N_..Q_.L.J...N.
00000220: 0080 5100 8360 ff2f 00                   ..Q..`./.

6

BBC BASIC, 141 ASCII karakterleri (65.217BPM)

*TEMPO1
F.i=2TO71j=i>65SOUND1-j*(479+i/2),-9,ASCM." \\VX\\VX\DHLNRVXVVNRVV>@DHD@D>@D@@HD@@>:>:6:>@DH@@HDHHLNLDHLNRVXNNVV\\",i)*2,23-j*161N.

Tempo sınırına uyması için revize edildi. Açıklama daha sonra güncellenecek.

BBC BASIC, 123 ASCII karakter (60BPM olarak rekabet etmeyen)

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

Çalıştırıldığında şarkıyı doğrudan çalar.

F.i=1TO67j=i>64SOUND1-j*(447+i),-9,ASCM."\\VX\\VX\DHLNRVXVVNRVV>@DHD@D>@D@@HD@@>:>:6:>@DH@@HDHHLNLDHLNRVXNV\",i)*2,5-j*75N.

Ungolfed

  FOR i = 1 TO 67
    j = i > 64: REM j=0 for the first four bars composed of 16th notes, j=-1 for the final chord (whole note)
    SOUND 1 - j * (447 + i), -9, ASC(MID$("\\VX\\VX\DHLNRVXVVNRVV>@DHD@D>@D@@HD@@>:>:6:>@DH@@HDHHLNLDHLNRVXNV\", i)) * 2, 5 - j * 75
  NEXT i

açıklama

jilk 4 barda mı yoksa son akorda mı olduğumuzu gösteren bir bayrak. TRUE, -1BBC BASIC'te.

SOUNDİfadesi 4 parametre alır:

KANAL: ilk 4 çubuk için bu kanal 1'dir. 5. çubuktaki akorun 3 nota için, kanal sayıları 201, 202 ve 203 hex'dir (513,514 ve 515 ondalık). Bu, kanal 1,2 ve Şekil 3'te, ilk 2 anlamı, diğer kanallardaki 2 nota ile aynı anda çalınır (3 nota akor çalınır).

SES: Olumsuz değerler diğer efektleri (ses zarfları) temsil ettiğinden, negatif bir değer olarak verilir. -9'a ayarlayın (en yüksek olan -15'e kadar çıkacaktır).

PITCH: Bu ayar için D4 = 108 - A5 = 184 arasındadır. Her tamsayı adımı, yarı tonun 1 / 4'üdür. Değerler 54 ila 92 aralığında ASCII kodları olarak saklanır ve doğru değeri yeniden oluşturmak için iki katına çıkarılır. 1 / 8'inci notlar 1 / 16'ncı kopyalar olarak saklanır. Son akor 3 ayrı perde şeklinde saklanır ve nota uzunluğu aşağıdaki gibi tam nota değişmiştir.

SÜRE: saniyenin 1 / 20'sinde. 1 / 16'lık notun süresi saniyenin 5/20'si kadar, dakikada 60 1/4 nota (tempoyu daha kesin hale getirmek için yeterli çözünürlük yok.) Tüm not 5 - (- 75) = 80 ünite (4 saniye) ) uzun.


Öyleyse bu rekabetsiz olarak etiketlenmeli mi?
JungHwan Min

@JungHwanMin Yorumunuzun orijinal metnini cevaplamak için: BPM 65% 10 içindedir. Sorunun kesinliği ile ilgili bir sınır yoktur. OP'nin araması.
Seviye Nehri St

60 bpm, 65 bpm'den sesli olarak farklıdır. Dilin dayattığı bir kısıtlama olduğundan bunun rekabet etmemesine izin vereceğim.
Mego

@Mego Başlangıçta BBC Basic'in bir saniyenin 100'ünde varsayılan olarak sayıldığını düşündüm, saniyenin 20'si kadar kaba olduğunun farkında değildim. Kodumu 100'lere ayarlamıştım, şimdi 65.215BPM yapabilirim, tamam mı? Tüm not 256/100'ü aştığı için biraz fazladan işe yaradı, bu yüzden iki yarım nota çalmak zorunda kaldım. Saniyenin 50'si kısa kod olacaktır ancak 62.5BPM fazla bir gelişme değildir.
Level River St

Bu arada, asıl gönderide bazı küçük transkripsiyon hataları vardı. Kodunuzu biraz değiştirmeniz gerekebilir. (Geçerli kod yanlış sürümde)
JungHwan Min 26:06

4

Befunge, 242 bayt

Ayar bir MIDI dosyası biçiminde stdout'a yazılmıştır. Bu alıntıyı oynatmak için bu çıktısını bir .mid dosyasına yönlendirmeniz gerekir .

<v:"MThd"0006000101"MTrk"001+"~e"0*3"UQ"30*5"-\"9
v>9#:-#,_0"QONLJIGEJIGEGCGECB@>@B@BCEGCECBECEGECBNLJNONLJIGEQONQONQ"0\:
_v#:\%+77+1,"@",\,*8*82,+3*4!*-3::\,"@",:,*:*62,1
v>"QNJQNJ"0\:
_v#:\+1,"@",\,-**82/3\*:*62:,+!\**97!-3::\
@>,\"/U"3*,,,

Çevrimiçi deneyin! Her ne kadar çıktıyı verilerin ikili bütünlüğünü koruyacak şekilde kaydetmenin mümkün olduğunu sanmıyorum.

açıklama

İlk satır, ikinci satırın başında çıkarılan sadece kodlanmış bir MIDI başlığıdır. İkinci satırın geri kalanı, notaların sırasını, uygun şekilde ASCII olan MIDI değerleri olarak kodlar. Üçüncü satır, bu notların çalınması için MIDI komutlarını yazar, süre otomatik olarak hesaplanır (her not,% 14 == 0 olmadıkça bir semiquaver'dır). Son akor, dördüncü ve beşinci satırlarda (aynı anda birden fazla tuşa basılmasını gerektirdiğinden) özel bir durum olarak ele alınır ve altıncı satır, iz işaretçisinin son MIDI sonunu yazar.


4

C, 248 228 210 198 193 191 bayt

#define y(x)cos(.346*t*exp(x/17.))
d=1846,t;main(c){for(;t++<d*80;putchar(c=((t<d*64?y(("TTQRTTQRTHJLMOQRQQMOQQEFHJHFHEFHFFJHFFECECACEFHJFFJHJJLMHJLMOQRT"[t/d]-72)):y(12)+y(9)+y(5))+3)*42));}

Bu, saniyede 8000 örnekte çalınması amaçlanan bir 8 bit işaretsiz numune dizisi üretir. Daha eski bir UNIX / Linux kurulumunuz varsa, çıkışı yönlendirebilirsiniz /dev/audio. Bazı yeni Linux dağıtımlarında, çıkışı ALSA komut satırı oynatıcısına aktarmanız gerekebiliraplay


çok harika. Harika çözüm!
Abel Tom

1

SmileBASIC, 115 bayt

BGMPLAY"@305T65L16[A8F+G]2A{r}F#8>F#GABAGAF#GAG8BAG8F#EF#EDEF#GABG8BAB8<C#D{r}AA1:1[R1]4F#1:2[R1]4D1{r=>AB<C#DEF#G}

Güzel bir enstrüman kullanmak 4 ekstra byte değerinde idi :)


Enstrüman 305 nedir?
Pavel,

SmileBASIC, tüm genel MIDI enstrümanlarına sahiptir, fakat aynı zamanda bir sürü "gizli" belgesiz enstrümana da sahiptir. İşte Pachelbel'in Canon'un bu enstrümanı kullanarak oynadığı çok daha karmaşık versiyonunun bir örneği: dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21

0

WAV.js , 325 bayt kullanarak JavaScript (ES6)

w=new WAV();w.addProgression(btoa9‘¹9‘¹8€¹‘9‘¹‘y‘9‘y¸€x¸x€8¸€8¸888¸€x¸€8€xù€xù‘y9`.replace(/[CF]./g,'$&#').split(/(?=[A-G])/g).map((f=t=>n=>({note:n,time:t}))(15/65)));['D5','F5#','A5'].map(n=>w.addNote(f(48/13)(n),.3,[],1,1));new Audio(URL.createObjectURL(w.toBlob())).play()
<script src="https://cdn.rawgit.com/patrickroberts/3b065ab94ce5094baacf45ed23e2a16e/raw/9c367e292fbee8341e1019d0d5953a2234449882/wav.babel.js"></script>

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.