Spielen Sie einen Teil von Pachelbels Canon

29

Geben Sie den folgenden Auszug aus Pachelbels Canon in D als Audio aus:

Pachelbels Kanon in D

Regeln

  • Jedes Format / jede Codierung kann verwendet werden, solange vor der Erstellung dieser Herausforderung ein Codec vorhanden war
  • Jedes Instrument (ein echtes Instrument, MIDI-Synthese usw.) kann verwendet werden
  • Das Tempo muss 65 BPM betragen (wie in den Noten angegeben). Wenn Sie nicht genau 65 BPM erreichen können, können Sie ein beliebiges Tempo im Bereich (einschließlich) 64,75 - 65,25 verwenden
  • Die Noten sind in Konzertpitch
  • Es muss gleiches Temperament verwendet werden (speziell 12-ET mit A4 = 440 Hz)

Als Referenz ist hier ein Stack-Snippet, das den Auszug wiedergibt:

Mego
quelle
Wäre dieses Snippet wettbewerbsfähig, wenn es von einem anderen Ort heruntergeladen würde
Blue
4
@muddyfish Nein, da das Abrufen der Ausgabe von einer externen Quelle eine Standardlücke ist.
Mego
Wäre die Ausgabe einer MIDI-Datei anstelle von Audio akzeptabel?
DJMcMayhem
@DJMcMayhem Ja, MIDI-Dateien sind akzeptabel.
Mego
Ich gehe davon aus, dass der letzte (einzige) Akkord vollständig benötigt wird. Das verbietet effektiv nicht-polyphone Sprachen / APIs
Level River St

Antworten:

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)

Vielen Dank an @Neil und @PatrickRoberts für ein paar Byte-Einsparungen!

Erläuterung

Die Notation wird in den String gepackt, wobei jedes Zeichen eine einzelne Note als Base-36-Ziffer darstellt. Die Notenwerte sind durch die Formel bestimmt , (19 - pitch) * time + 1wobei pitchdie Anzahl von Halbtönen kleiner als A5 und timeist 1für ein Sechzehntel oder 20für ein Achtel. Das 0am Ende stoppt die forSchleife.

Das Tempo ist 65.22bpm Edit: jetzt genau 65bpm, für 2 weitere Bytes .

Diese Erklärung / Demo wird Math.powstatt aus **Gründen der Browserkompatibilität verwendet. Außerdem wird die Verstärkung der Oszillatoren .3so eingestellt, dass der Schlussakkord Ihre Ohren nicht bluten lässt (die Standardverstärkung ist 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
      )

Sie können die Schaltfläche oben drücken, um sie in jedem Browser zu testen , der die HTML5-Web-Audio-API unterstützt .

user81655
quelle
880*2**(-~-n%20/12)sollten Sie ein paar Bytes sparen.
Neil
@ Neil Danke. Ich vermute, ich kann das auch loswerden, -~-indem ich das Format meiner Notizverpackung ändere (Die + 1in der Formel ist nur da, weil ich 0die forSchleife anhalten muss und ich zu faul war, um viel darüber nachzudenken, bevor ich gepostet habe).
User81655
Sah dies, nachdem ich meine Antwort gepostet hatte, lol
Patrick Roberts
Sie können durch das Ersetzen ein weiteres Byte speichern c=new AudioContext;mit with(new AudioContext)und Entfernen der beiden Vorkommen c.im Programm.
Patrick Roberts
1
@ kamoroso94 Nein. Der Exponent kann ein Bruch sein. Wenn ich ihn also verwende <<, wird er in eine Ganzzahl umgewandelt.
user81655
8

Mathematica, 212 152 139 135 Bytes

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

Gibt ein SoundObjekt aus, das Pachelbels Canon in D wiedergibt, wenn die Wiedergabetaste gedrückt wird. Das Instrument ist das MIDI-Instrument Nr. 41 "Violine".

Das Audio

Klick mich!

Erläuterung

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

Suchen Sie die Buchstaben der einzelnen Zeichen in der Zeichenfolge ("a" -> 1, "b" -> 2 usw.), umhüllt mit a List. (Diese Zeichenfolge repräsentiert Pachelbels Canon in D)

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

Stellen Sie sdie SoundNoteFunktion ein, deren Instrument # 41 ist. Setzen Sie die Dauer auf 1 und ordnen Sie diese Funktion jedem Element in der zu List(wodurch SoundNoteprimitive Objekte entstehen).

{14,18,21}~s~16

Bilden Sie die letzte Triade. (Die Dauer 16ist dazu da, die letzte Note 16-mal länger zu machen - eine ganze Note ist 16-mal eine Sechzehntelnote.)

... ~Sound~18.5

Erstellen Sie ein sekundenlanges SoundObjekt 18.5(weil das Tempo 65 Schläge pro Minute beträgt [5 Takte zu 4/4 bei Tempo 65 Schläge pro Minute = ca. 18,5 Sekunden]).

126-Byte-Version, nicht konkurrierend

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

Nicht konkurrierend, da die Ausgabe zwei Sechzehntelnoten anstelle einer Achtelnote enthält und die Trennung deutlich erkennbar ist.

JungHwan min
quelle
14
Wirklich, Mathematica hat kein eingebautes Programm für Pachelbels Canon?
Stewie Griffin
1
@StewieGriffin Wahrscheinlich nur das Ganze, und die Kosten für das Ausschneiden wären zu hoch.
Mego
@ StewieGriffin Überraschenderweise nicht.
JungHwan Min
6

Bubblegum , 203 Bytes

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

Probieren Sie es online!

Dies ist ein Hexdump (umgekehrt mit xxd -r) des Quellcodes. Die erzeugte MIDI-Datei sieht wie folgt aus (auch ein 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
quelle
6

BBC BASIC, 141 ASCII-Zeichen (65,217 BPM)

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

Überarbeitet, um dem Tempolimit Rechnung zu tragen. Wird die Erklärung später aktualisieren.

BBC BASIC, 123 ASCII-Zeichen (nicht konkurrierend als 60BPM)

Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/download.html herunter

Spielt den Song direkt ab, wenn er ausgeführt wird.

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

Erläuterung

jist eine Flagge, die anzeigt, ob wir uns in den ersten 4 Takten oder im letzten Akkord befinden. WAHR ist -1in BBC BASIC.

Die SOUNDAnweisung akzeptiert 4 Parameter:

CHANNEL: Für die ersten 4 Takte ist dies Kanal 1. Für die 3 Noten des Akkords im 5. Takt lauten die Kanalnummern 201, 202 und 203 hexadezimal (513.514 und 515 dezimal). Dies bedeutet, dass auf den Kanälen 1,2 und 1 gespielt wird 3, die anfängliche 2 bedeutet, spielen gleichzeitig mit 2 Noten auf anderen Kanälen (dh spielen Sie einen 3-Noten-Akkord).

VOLUME: Wird als negativer Wert angegeben, da positive Werte andere Effekte (Klanghüllkurven) darstellen. Setze auf -9 (wird auf -15 angehoben, was am lautesten ist.)

PITCH: Für diese Melodie reicht von D4 = 108 bis A5 = 184. Jeder Ganzzahlschritt ist 1/4 eines Halbtons. Die Werte werden als ASCII-Codes im Bereich von 54 bis 92 gespeichert und verdoppelt, um den korrekten Wert wiederherzustellen. 1/8-Noten werden doppelt als 1/16-Noten gespeichert. Der Schlussakkord wird in 3 separaten Tonhöhen gespeichert und die Notenlänge variiert zu der ganzen Note wie unten.

DAUER: in 1/20 Sekunde. Die Dauer einer 1/16-Note beträgt 5/20 Sekunden, also 60 1/4 Noten pro Minute (es gibt keine ausreichende Auflösung, um das Tempo genauer zu machen.) Die gesamte Note ist 5 - (- 75) = 80 Einheiten (4 Sekunden) ) lang.

Level River St
quelle
Sollte dies dann nicht als nicht konkurrierend bezeichnet werden?
JungHwan Min
@JungHwanMin So beantworten Sie den Originaltext Ihres Kommentars: BPM liegt innerhalb von 10% von 65. Die Genauigkeit der Frage ist nicht eingeschränkt. OPs Anruf.
Level River St
60 Schläge pro Minute unterscheiden sich hörbar von 65 Schlägen pro Minute. Ich werde zulassen, dass dies nicht konkurriert, da es sich um eine durch die Sprache auferlegte Einschränkung handelt.
Mego
@Mego Ich dachte anfangs, BBC Basic würde standardmäßig in Hundertstelsekunden gezählt, aber ich wusste nicht, dass es so grob ist wie Zwanzigstelsekunden. Ich habe meinen Code auf 100 eingestellt, damit ich jetzt 65.215BPM machen kann. Ist das in Ordnung? Es dauerte ein wenig länger, bis die ganze Note 256/100 überschritt und ich sie als zwei halbe Noten spielen musste. 50stel Sekunden wären kürzerer Code, aber 62.5BPM sind keine große Verbesserung.
Level River St
Übrigens gab es im Originalbeitrag einige geringfügige Übertragungsfehler. Möglicherweise müssen Sie Ihren Code ein wenig ändern. (Der aktuelle Code hat die falsche Version)
JungHwan Min
4

Befunge, 242 Bytes

Die Melodie wird im Format einer MIDI-Datei auf stdout geschrieben. Sie müssen diese Ausgabe in eine .mid- Datei umleiten, um den Auszug abzuspielen.

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

Probieren Sie es online! , obwohl ich glaube, dass es derzeit nicht möglich ist, die Ausgabe so zu speichern, dass die binäre Integrität der Daten erhalten bleibt.

Erläuterung

Die erste Zeile ist nur ein fest codierter MIDI-Header, der am Anfang der zweiten Zeile ausgegeben wird. Der Rest der zweiten Zeile codiert die Sequenz der Noten als ihre MIDI-Werte, die zweckmäßigerweise ASCII-Werte sind. In der dritten Zeile werden die MIDI-Befehle zum Spielen dieser Noten geschrieben, wobei die Dauer automatisch berechnet wird (jede Note ist ein Semiquaver, es sei denn, i% 14 == 0). Der letzte Akkord wird in den Zeilen vier und fünf als Sonderfall behandelt (da hierfür mehrere Tasten gleichzeitig gedrückt werden müssen), und die sechste Zeile gibt den letzten MIDI-Endemarker aus.

James Holderness
quelle
4

C 248 228 210 198 193 191 Bytes

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

Dies erzeugt eine Sequenz von 8-Bit-Samples ohne Vorzeichen, die mit 8000 Samples pro Sekunde abgespielt werden sollen. Wenn Sie ein älteres UNIX / Linux-Setup haben, können Sie die Ausgabe an umleiten /dev/audio. In einigen neueren Linux-Distributionen müssen Sie die Ausgabe möglicherweise an den ALSA-Befehlszeilen-Player leitenaplay

Ceilingcat
quelle
so genial. Tolle Lösung!
Abel Tom
1

SmileBASIC, 115 Bytes

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}

Die Verwendung eines schönen Instruments war 4 zusätzliche Bytes wert :)

12Me21
quelle
Was ist Instrument 305?
Pavel
SmileBASIC verfügt über alle allgemeinen MIDI-Instrumente, aber auch über eine Reihe von "geheimen" undokumentierten Instrumenten. Hier ist ein Beispiel einer viel komplizierteren Version von Pachelbels Canon, die mit diesem Instrument gespielt wurde: dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21
0

JavaScript (ES6) mit 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
quelle