Zagraj w część Kanonu Pachelbela


29

Wydrukuj następujący fragment z Kanonu Pachelbela w D jako audio:

Pachelbel's Canon in D

Zasady

  • Można użyć dowolnego formatu / kodowania, o ile kodek istniał przed utworzeniem tego wyzwania
  • Można użyć dowolnego instrumentu (prawdziwy instrument, synteza MIDI itp.)
  • Tempo musi wynosić 65 BPM (jak zapisano w nuty) - jeśli nie możesz uzyskać dokładnie 65 BPM, możesz użyć dowolnego tempa w zakresie (włącznie) 64,75 - 65,25
  • Nuty są w trakcie koncertu
  • Należy zastosować strojenie jednakowego temperamentu (w szczególności 12-ET z A4 = 440 Hz)

Dla odniesienia, oto fragment kodu, który odtworzy fragment:


Czy ten fragment byłby konkurencyjny, ponieważ pobiera go z innego miejsca
Blue

4
@muddyfish Nie, ponieważ pobieranie danych wyjściowych ze źródła zewnętrznego jest standardową luką.
Mego

Czy wyjście pliku midi zamiast dźwięku byłoby dopuszczalne?
DJMcMayhem

@DJMcMayhem Tak, pliki MIDI są dopuszczalne.
Mego

Zakładam, że ostatni akord jest wymagany w całości? To skutecznie zakazuje używania niepolifonicznych języków / API
Level River St

Odpowiedzi:


9

JavaScript (ES7), 249 242 241 bajtów

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)

Dzięki @Neil i @PatrickRoberts za oszczędność bajtów!

Wyjaśnienie

Notacja jest pakowana w ciąg, w którym każdy znak jest pojedynczą nutą jako podstawowa cyfra 36. Wartości nut są określone przez wzór, w (19 - pitch) * time + 1którym pitchliczba półtonów jest mniejsza niż A5 i timedotyczy 1półtorgody lub 20ósemki. Na 0końcu zatrzymuje forpętlę.

Tempo wynosi 65,22 uderzeń na minutę Edytuj: teraz dokładnie 65 uderzeń na minutę, dla 2 kolejnych bajtów .

To wyjaśnienie / wersja demonstracyjna używa Math.powzamiast **do kompatybilności przeglądarki. Ustawia również wzmocnienie oscylatorów, aby .3ostatni akord nie powodował krwawienia w uszach (wzmocnienie domyślne to 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
      )

Możesz nacisnąć powyższy przycisk, aby przetestować go w dowolnej przeglądarce obsługującej interfejs API HTML5 Web Audio .


880*2**(-~-n%20/12)powinien zaoszczędzić kilka bajtów.
Neil,

@Neil Thanks. Podejrzewam, że mogę się tego -~-także pozbyć, zmieniając format pakowania notatek ( + 1w formule jest tylko dlatego, że muszę 0zatrzymać forpętlę i byłem zbyt leniwy, aby o tym dużo myśleć, zanim opublikowałem).
user81655,

Zobaczyłem to po opublikowaniu mojej odpowiedzi, lol
Patrick Roberts,

Można zapisać kolejny bajt zastępując c=new AudioContext;ze with(new AudioContext)i usuwając dwa występujące c.w programie.
Patrick Roberts

1
@ kamoroso94 Nie. Wykładnik może być ułamkiem, więc gdybym <<go użył , wyrzuciłby go na liczbę całkowitą.
user81655

8

Mathematica, 212 152 139 135 bajtów

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

Wysyła Soundobiekt, który odtwarza Kanał Pachelbela w D po naciśnięciu przycisku Play. Instrumentem jest instrument MIDI nr 41 „Skrzypce”.

Audio

Kliknij!

Wyjaśnienie

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

Znajdź numery liter każdego znaku w ciągu („a” -> 1, „b” -> 2 itd.), Owinięte znakiem List. (Ten ciąg reprezentuje Kanon Pachelbela w D)

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

Ustaw sdo SoundNotefunkcji, której instrumentem jest # 41. Ustaw czas trwania na 1 i odwzoruj funkcję każdego elementu w List(tworząc w ten sposób SoundNoteprymitywne obiekty).

{14,18,21}~s~16

Zrób ostatnią triadę. (Czas trwania 16jest taki, aby ostatnia nuta była 16 razy dłuższa - cała nuta jest szesnaście razy szesnasta).

... ~Sound~18.5

Zrób Soundobiekt o 18.5długości kilku sekund (ponieważ tempo wynosi 65 uderzeń na minutę [5 taktów 4/4 z tempem 65 uderzeń na minutę = około 18,5 sekundy]).

Wersja 126-bajtowa, niekonkurująca

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

Niekonkurencyjny, ponieważ wyjście zawiera dwie szesnastkowe nuty zamiast ósmej nuty, a separacja jest dość zauważalna.


14
Naprawdę, Mathematica nie ma wbudowanego Canona Pachelbela?
Stewie Griffin,

1
@StewieGriffin Prawdopodobnie cała sprawa, a koszt jej przycięcia byłby zbyt wysoki.
Mego

@StewieGriffin Zaskakujące, że nie.
JungHwan Min.

6

Bubblegum , 203 bajty

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

Wypróbuj online!

To jest zrzut heksowy (odwrotnie z xxd -r) kodu źródłowego. Plik MIDI, który tworzy, jest następujący (również zrzut heksowy):

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 znaków 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.

Zmieniono w celu dostosowania limitu tempa. Zaktualizuje wyjaśnienie później.

BBC BASIC, 123 znaki ASCII (niekonkurencyjny jako 60BPM)

Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/download.html

Odtwarza utwór bezpośrednio po uruchomieniu.

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.

Nie golfił

  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

Wyjaśnienie

jto flaga wskazująca, czy znajdujemy się w pierwszych 4 taktach, czy w ostatnim akordie. TRUE jest -1w BBC BASIC.

SOUNDOświadczenie trwa 4 parametrów:

CHANNEL: dla pierwszych 4 taktów jest to kanał 1. Dla 3 nut akordu w 5 takcie numery kanałów to 201, 202 i 203 hex (513,514 i 515 miejsc dziesiętnych). Oznacza to odtwarzanie na kanałach 1,2 i 3, początkowe 2 oznacza grać jednocześnie z 2 nutami na innych kanałach (tj. Grać akord 3 nutowy).

GŁOŚNOŚĆ: Podana jako wartość ujemna, ponieważ wartości dodatnie reprezentują inne efekty (obwiednie dźwięku). Ustaw na -9 (wzrośnie do -15, co jest najgłośniejsze).

PITCH: W tym melodii zakres od D4 = 108 do A5 = 184. Każdy krok liczby całkowitej to 1/4 półtonu. Wartości są przechowywane jako kody ASCII w zakresie od 54 do 92 i podwojone, aby wygenerować poprawną wartość. Notatki 1/8 są przechowywane jako duplikaty notatek 1/16. Ostatni akord jest przechowywany jako 3 oddzielne wysokości, a długość nuty różni się dla całej nuty, jak poniżej.

CZAS TRWANIA: za 1/20 sekundy. Czas trwania 1/16 nuty wynosi 5/20 sekundy, więc 60 1/4 nut na minutę (rozdzielczość jest niewystarczająca, aby uściślić tempo). Cała nuta to 5 - (- 75) = 80 jednostek (4 sekundy ) długie.


Czy nie powinno to być oznaczone jako niekonkurujące?
JungHwan Min

@JungHwanMin Aby odpowiedzieć na oryginalny tekst komentarza: BPM zawiera się w granicach 10% od 65. Dokładność pytania nie jest ograniczona. Wezwanie OP.
Level River St

60 uderzeń na minutę różni się wyraźnie od 65 uderzeń na minutę. Pozwolę, aby było to niekonkurencyjne, ponieważ jest to ograniczenie narzucone przez język.
Mego

@Mego Początkowo myślałem, że BBC Basic domyślnie liczy się w setnych częściach sekundy, nie zdawałem sobie sprawy, że jest tak gruby jak 20-sekundowe. Dostosowałem swój kod do setnych, więc teraz mogę zrobić 65.215BPM, czy to w porządku? Zajęło mi to trochę dodatkowego skrzypienia, ponieważ cała nuta przekracza 256/100, musiałem więc zagrać jako dwie półnuty. 50-ta sekundy byłaby krótszym kodem, ale 62,5BPM nie stanowi znacznej poprawy.
Level River St

Nawiasem mówiąc, w oryginalnym poście wystąpiły niewielkie błędy transkrypcji. Być może trzeba trochę zmienić kod. (Obecny kod ma niewłaściwą wersję)
JungHwan Min

4

Befunge, 242 bajty

Melodia jest zapisywana w standardzie w formacie pliku MIDI. Musisz przekierować to wyjście do pliku .mid , aby odtworzyć fragment.

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

Wypróbuj online! , chociaż nie sądzę, że obecnie można zapisać dane wyjściowe w taki sposób, aby zachowały one binarną integralność danych.

Wyjaśnienie

Pierwszy wiersz jest niezbędny tylko zakodowany na stałe nagłówek MIDI, który jest wyprowadzany na początku drugiego wiersza. Reszta drugiego wiersza koduje sekwencję nut jako ich wartości MIDI, które są dogodnie ASCII. Trzeci wiersz wypisuje polecenia MIDI do odtwarzania tych nut, przy czym czas trwania jest automatycznie obliczany (każda nuta jest półokolem, chyba że i% 14 == 0). Ostatni akord jest traktowany jako specjalny przypadek na liniach czwartej i piątej (ponieważ wymaga to jednoczesnego naciśnięcia wielu klawiszy), a szósta linia zapisuje końcowy koniec znacznika ścieżki MIDI.


4

C, 248 228 210 198 193 191 bajtów

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

Daje to sekwencję 8-bitowych próbek bez znaku, które mają być odtwarzane z prędkością 8000 próbek na sekundę. Jeśli masz starszą konfigurację UNIX / Linux, możesz przekierować dane wyjściowe do /dev/audio. W niektórych nowszych dystrybucjach Linuksa może być konieczne przesłanie danych wyjściowych do odtwarzacza linii poleceń ALSAaplay


niesamowite. Świetne rozwiązanie!
Abel Tom

1

SmileBASIC, 115 bajtów

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}

Korzystanie z ładnego instrumentu było warte 4 dodatkowe bajty :)


Co to jest instrument 305?
Pavel

SmileBASIC ma wszystkie ogólne instrumenty MIDI, ale ma także wiele „tajnych” nieudokumentowanych instrumentów. Oto przykład znacznie bardziej skomplikowanej wersji Canona Pachelbela granego przy użyciu tego instrumentu: dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21

0

JavaScript (ES6) przy użyciu WAV.js , 325 bajtów

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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.