Mainkan beberapa Canon Pachelbel

29

Keluarkan kutipan berikut dari Pachelbel's Canon dalam D sebagai audio:

Canon Pachelbel dalam D

Aturan

  • Format / pengodean apa pun dapat digunakan, asalkan ada codec sebelum penciptaan tantangan ini
  • Semua instrumen (instrumen nyata, sintesis MIDI, dll.) Dapat digunakan
  • Temponya harus 65 BPM (seperti yang tertulis di lembaran musik) - jika Anda tidak bisa mendapatkan 65 BPM, Anda dapat menggunakan tempo apa pun dalam kisaran (termasuk) 64.75 - 65.25
  • Lembaran musik ada di nada konser
  • Penyeteman temperamen yang sama harus digunakan (khususnya 12-ET dengan A4 = 440 Hz)

Untuk referensi, berikut ini adalah Stack Snippet yang akan memainkan kutipannya:

Mego
sumber
Apakah potongan itu kompetitif karena mengunduhnya dari tempat lain
Biru
4
@muddyfish Tidak, karena mengambil output dari sumber eksternal adalah celah standar.
Mego
Apakah mengeluarkan file midi bukannya audio bisa diterima?
DJMcMayhem
@DJMcMayhem Ya, file MIDI dapat diterima.
Mego
Saya berasumsi bahwa akord terakhir (hanya) diperlukan secara penuh? Yang secara efektif melarang bahasa non-polifonik / API
Level River St

Jawaban:

9

JavaScript (ES7), 249 242 241 byte

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)

Terima kasih kepada @Neil dan @PatrickRoberts untuk beberapa penghematan byte!

Penjelasan

Notasi dikemas ke dalam string di mana setiap karakter adalah satu catatan sebagai basis-36 digit. Nilai-nilai catatan ditentukan oleh rumus (19 - pitch) * time + 1mana pitchadalah jumlah semitone kurang dari A5 dan timeadalah 1untuk seperenam belas atau 20untuk getaran a. Pada 0akhirnya menghentikan forloop.

Tempo yang digunakan adalah 65.22bpm. Edit: tepatnya 65bpm sekarang, untuk 2 byte lebih .

Penjelasan / demo ini digunakan Math.powalih-alih **untuk kompatibilitas browser. Ini juga mengatur penguatan osilator .3sehingga akord akhir tidak membuat telinga Anda berdarah (gain standarnya adalah 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
      )

Anda dapat menekan tombol di atas untuk mengujinya di browser apa pun yang mendukung HTML5 Web Audio API .

pengguna81655
sumber
880*2**(-~-n%20/12)harus menghemat beberapa byte.
Neil
@Neil Terima kasih. Saya curiga saya dapat membuangnya -~-juga dengan mengubah format pengepakan catatan saya ( + 1Rumusnya hanya ada di sana karena saya harus 0menghentikan forloop dan saya terlalu malas untuk memikirkannya sebelum saya memposting).
user81655
Lihat ini setelah saya memposting jawaban saya, lol
Patrick Roberts
Anda dapat menyimpan byte lain dengan mengganti c=new AudioContext;dengan with(new AudioContext)dan menghapus dua kejadian c.dalam program ini.
Patrick Roberts
1
@ kamoroso94 Tidak. Eksponen dapat berupa pecahan, jadi jika saya menggunakannya <<akan melemparkannya ke integer.
user81655
8

Mathematica, 212 152 139 135 byte

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

Output Soundobjek yang memainkan Pachelbel's Canon dalam D ketika tombol Play ditekan. Instrumennya adalah instrumen MIDI # 41 "Violin".

Audio

Klik saya

Penjelasan

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

Temukan nomor huruf setiap karakter dalam string ("a" -> 1, "b" -> 2, dan seterusnya), dibungkus dengan a List. (String ini mewakili Canon Pachelbel dalam D)

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

Setel ske SoundNotefungsi yang instrumennya # 41. Atur durasi ke 1 dan petakan yang berfungsi untuk setiap elemen dalam List(sehingga membuat SoundNoteobjek primitif).

{14,18,21}~s~16

Buat triad terakhir. (Durasi 16ada di sana untuk membuat catatan terakhir 16 kali lebih lama - seluruh nada adalah enam belas kali nada keenam belas.)

... ~Sound~18.5

Buat sebuah Soundobjek, 18.5detik panjang (karena tempo 65 bpm [5 ukuran 4/4 dengan tempo 65 bpm = sekitar 18,5 detik]).

Versi 126 byte, tidak bersaing

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

Non-bersaing karena output berisi dua not keenam belas alih-alih not ke delapan, dan pemisahannya cukup mencolok.

JungHwan Min
sumber
14
Sungguh, Mathematica tidak memiliki built-in untuk Canon Pachelbel?
Stewie Griffin
1
@StewieGriffin Hanya semuanya mungkin, dan biaya memotongnya akan terlalu tinggi.
Mego
@StewieGriffin Anehnya, tidak.
JungHwan Min
6

Bubblegum , 203 byte

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!..^...

Cobalah online!

Ini adalah hexdump (terbalik dengan xxd -r) dari kode sumber. File MIDI yang dihasilkannya adalah sebagai berikut (juga 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  ...@[email protected]_l.B
00000160: 000c 9040 5f6c 8040 000c 903e 5f6c 803e  ...@_l.@...>_l.>
00000170: 000c 9040 5f6c 8040 000c 9042 5f6c 8042  ...@[email protected]_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..`./.
Mego
sumber
6

BBC BASIC, 141 karakter ASCII (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.

Direvisi untuk mengakomodasi batas tempo. Akan memperbarui penjelasan nanti.

BBC BASIC, 123 karakter ASCII (tidak bersaing sebagai 60BPM)

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

Memutar lagu langsung saat dijalankan.

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.

Tidak disatukan

  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

Penjelasan

jadalah bendera yang menunjukkan apakah kita berada di 4 bar pertama atau akord terakhir. TRUE ada -1di BBC BASIC.

The SOUNDpernyataan butuh 4 parameter:

CHANNEL: untuk 4 bilah pertama ini adalah saluran 1. Untuk 3 nada chord di bilah ke-5, nomor salurannya adalah 201, 202 dan hex hex (513.514 dan 515 desimal.) Ini berarti bermain di saluran 1,2 dan 3, 2 makna awal diputar bersamaan dengan 2 nada pada saluran lain (yaitu memainkan nada 3 not).

VOLUME: Diberikan sebagai nilai negatif karena nilai positif mewakili efek lain (amplop suara). Set -9 (akan naik ke -15 yang paling keras.)

PITCH: Untuk nada ini, berkisar dari D4 = 108 hingga A5 = 184. Setiap langkah integer adalah 1/4 dari semitone. Nilai disimpan sebagai kode ASCII dalam kisaran 54 hingga 92 dan digandakan untuk menghasilkan kembali nilai yang benar. Catatan 1/8 disimpan sebagai duplikat catatan 1/16. Akor terakhir disimpan sebagai 3 nada terpisah dan panjang nada bervariasi untuk seluruh nada seperti di bawah ini.

DURASI: dalam 1/20 detik. Durasi 1/16 note adalah 5/20 detik sehingga 60 1/4 note per menit (ada resolusi yang tidak cukup untuk membuat tempo lebih tepat.) Keseluruhan note adalah 5 - (- 75) = 80 unit (4 detik) ) panjang.

Level River St
sumber
Bukankah ini seharusnya dilabeli sebagai non-bersaing?
JungHwan Min
@JungHwanMin Untuk menjawab teks asli komentar Anda: BPM berada dalam 10% dari 65. Tidak ada batasan pada ketepatan dalam pertanyaan. Panggilan OP.
Level River St
60 bpm jelas berbeda dari 65 bpm. Saya akan mengizinkan ini untuk tidak bersaing karena ini merupakan pembatasan yang diberlakukan oleh bahasa.
Mego
@Mego Awalnya saya pikir BBC Basic dihitung dalam 100 detik, secara default, saya tidak menyadari itu sama kasarnya dengan 20 detik. Saya telah menyesuaikan kode saya ke 100, jadi sekarang saya dapat melakukan 65.215BPM, apakah itu OK? Butuh sedikit mengutak-atik karena keseluruhan catatan melebihi 256/100 jadi saya harus memainkannya sebagai dua catatan setengah. 50 per detik akan menjadi kode yang lebih pendek tetapi 62.5BPM tidak banyak perbaikan.
Level River St
Ngomong-ngomong, ada beberapa kesalahan transkripsi kecil di posting asli. Anda mungkin perlu mengubah sedikit kode Anda. (Kode saat ini memiliki versi yang salah)
JungHwan Min
4

Befunge, 242 byte

Lagu ini ditulis untuk stdout dalam format file MIDI. Anda harus mengarahkan keluaran itu ke file .mid untuk memutar kutipan.

<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*,,,

Cobalah online! , meskipun saya pikir saat ini tidak mungkin untuk menyimpan output sedemikian rupa sehingga akan mempertahankan integritas data biner.

Penjelasan

Baris pertama sangat penting hanya header MIDI kode keras, yang merupakan output pada awal baris dua. Sisa baris dua mengkodekan urutan catatan sebagai nilai MIDI mereka, yang nyaman ASCII. Baris ketiga menuliskan perintah MIDI untuk memainkan catatan itu, dengan durasi yang dihitung secara otomatis (setiap nada adalah semiquaver kecuali i% 14 == 0). Akord terakhir ditangani sebagai case khusus pada jalur empat dan lima (karena itu membutuhkan beberapa tombol ditekan secara bersamaan), dan baris keenam menuliskan akhir MIDI akhir dari penanda trek.

James Holderness
sumber
4

C, 248 228 210 198 193 191 byte

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

Ini menghasilkan urutan 8 bit sampel yang tidak ditandatangani yang dimaksudkan untuk dimainkan pada 8000 sampel per detik. Jika Anda memiliki pengaturan UNIX / Linux yang lebih lama, Anda dapat mengalihkan hasilnya /dev/audio. Pada beberapa distro Linux baru, Anda mungkin harus menyalurkan output ke pemutar baris perintah ALSAaplay

plafon
sumber
sangat mengagumkan. Solusi hebat!
Abel Tom
1

SmileBASIC, 115 byte

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}

Menggunakan instrumen yang bagus bernilai 4 byte tambahan :)

12Me21
sumber
Apa instrumen 305?
Pavel
SmileBASIC memiliki semua instrumen MIDI umum, tetapi juga memiliki banyak instrumen tanpa dokumen "rahasia". Berikut adalah contoh dari versi yang jauh lebih rumit dari Canon Pachelbel yang dimainkan menggunakan instrumen itu: dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21
0

JavaScript (ES6) menggunakan WAV.js , 325 byte

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>

Patrick Roberts
sumber