Gioca alcuni dei Canon di Pachelbel


29

Stampa il seguente estratto della Canon di Pachelbel in D come audio:

La Canon di Pachelbel in re

Regole

  • È possibile utilizzare qualsiasi formato / codifica, purché esistesse un codec prima della creazione di questa sfida
  • È possibile utilizzare qualsiasi strumento (uno strumento reale, sintesi MIDI, ecc.)
  • Il tempo deve essere di 65 BPM (come indicato nello spartito) - se non è possibile ottenere esattamente 65 BPM, è possibile utilizzare qualsiasi tempo all'interno dell'intervallo (compreso) 64,75 - 65,25
  • Gli spartiti sono in concerto
  • È necessario utilizzare la regolazione del temperamento uguale (in particolare 12-ET con A4 = 440 Hz)

Per riferimento, ecco uno snippet di stack che riprodurrà l'estratto:


Quel frammento sarebbe competitivo mentre lo scarica da altrove
Blue

4
@muddyfish No, perché recuperare l'output da una fonte esterna è una scappatoia standard.
Mego

Sarebbe accettabile l'output di un file MIDI anziché audio?
DJMcMayhem

@DJMcMayhem Sì, i file MIDI sono accettabili.
Mego

Presumo che l'ultimo (unico) accordo sia richiesto per intero? Ciò proibisce efficacemente le lingue / API non polifoniche
Level River St,

Risposte:


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)

Grazie a @Neil e @PatrickRoberts per alcuni risparmi di byte!

Spiegazione

La notazione è racchiusa nella stringa in cui ogni carattere è una singola nota come una cifra di base 36. I valori delle note sono determinati dalla formula in (19 - pitch) * time + 1cui pitchil numero di semitoni è inferiore a A5 ed timeè 1per un semi-acquaschera o 20per un tremolo. Alla 0fine interrompe il forciclo.

Il tempo è 65.22 bpm Modifica: esattamente 65 bpm ora, per altri 2 byte .

Questa spiegazione / demo utilizza Math.powinvece che **per la compatibilità del browser. Imposta inoltre il guadagno degli oscillatori in .3modo che l'accordo finale non ti faccia sanguinare le orecchie (il guadagno predefinito è 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
      )

Puoi premere il pulsante sopra per testarlo in qualsiasi browser che supporti l'API Web Web HTML5 .


880*2**(-~-n%20/12)dovrebbe salvarti qualche byte.
Neil,

@ Grazie Grazie. Sospetto di potermi sbarazzare -~-anche di questo modificando il formato del mio pacchetto di note (il + 1nella formula è lì solo perché ho bisogno 0di interrompere il forciclo ed ero troppo pigro per pensarci molto prima di pubblicare).
user81655

L'ho visto dopo che ho pubblicato la mia risposta, lol
Patrick Roberts,

È possibile salvare un altro byte sostituendo c=new AudioContext;con with(new AudioContext)e rimuovendo le due occorrenze di c.nel programma.
Patrick Roberts,

1
@ kamoroso94 No. L'esponente può essere una frazione, quindi se lo usassi lo casterebbe <<su un numero intero.
user81655

8

Mathematica, 212 152 139 135 byte

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

Emette un Soundoggetto che suona la Canon di Pachelbel in D quando viene premuto il pulsante Play. Lo strumento è lo strumento MIDI n. 41 "Violin".

The Audio

Cliccami!

Spiegazione

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

Trova i numeri delle lettere di ciascun carattere nella stringa ("a" -> 1, "b" -> 2 e così via), racchiusi in a List. (Questa stringa rappresenta la Canon di Pachelbel in D)

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

Impostato sper SoundNotefunzionare il cui strumento è # 41. Impostare la durata su 1 e mappare quella funzione su ciascun elemento in List(creando così SoundNoteoggetti primitivi).

{14,18,21}~s~16

Crea l'ultima triade. (La durata 16è lì per rendere l'ultima nota 16 volte più lunga - un'intera nota è sedici volte una sedicesima).

... ~Sound~18.5

Crea un Soundoggetto, 18.5secondi (perché il tempo è 65 bpm [5 misure di 4/4 con tempo 65 bpm = circa 18,5 secondi]).

Versione a 126 byte, non competitiva

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

Non competitiva perché l'output contiene due note sedicesime anziché un'ottava e la separazione è abbastanza evidente.


14
Davvero, Mathematica non ha un built-in per la Canon di Pachelbel?
Stewie Griffin,

1
@StewieGriffin Probabilmente l'intera cosa, e il costo del ritaglio sarebbe troppo alto.
Mego,

@StewieGriffin Sorprendentemente, non lo è.
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!..^...

Provalo online!

Questo è un hexdump (indietro con xxd -r) del codice sorgente. Il file MIDI che produce è il seguente (anche un 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 caratteri ASCII (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.

Revisionato per adattarsi al limite del tempo. Aggiornerà la spiegazione in seguito.

BBC BASIC, 123 caratteri ASCII (non competitivi come 60 BPM)

Scarica l'interprete su http://www.bbcbasic.co.uk/bbcwin/download.html

Riproduce il brano direttamente quando eseguito.

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

Spiegazione

jè una bandiera che indica se siamo nelle prime 4 battute o nell'accordo finale. VERO è-1 in BBC BASIC.

Il SOUND istruzione accetta 4 parametri:

CANALE: per le prime 4 battute questo è il canale 1. Per le 3 note dell'accordo nella quinta battuta, i numeri dei canali sono 201, 202 e 203 esadecimali (513,514 e 515 decimali). Questo significa suonare sui canali 1,2 e 3, il significato iniziale di 2 suona contemporaneamente con 2 note su altri canali (ovvero suona un accordo di 3 note).

VOLUME: dato come valore negativo perché i valori positivi rappresentano altri effetti (inviluppi sonori). Impostato su -9 (salirà a -15 che è il più forte.)

PITCH: per questo motivo, varia da D4 = 108 a A5 = 184. Ogni passo intero è 1/4 di un semitono. I valori vengono memorizzati come codici ASCII nell'intervallo da 54 a 92 e raddoppiati per rigenerare il valore corretto. Le note 1/8 sono memorizzate come note duplicate 1/16. L'accordo finale viene memorizzato come 3 tonalità separate e la lunghezza della nota varia da nota intera come di seguito.

DURATA: in 1/20 di secondo. La durata di 1/16 di nota è di 5/20 di secondo, quindi 60 1/4 di note al minuto (la risoluzione è insufficiente per rendere il tempo più preciso.) L'intera nota è 5 - (- 75) = 80 unità (4 secondi ) lungo.


Quindi questo non dovrebbe essere etichettato come non competitivo?
JungHwan Min

@JungHwanMin Per rispondere al testo originale del tuo commento: BPM è entro il 10% di 65. Non c'è alcun limite alla precisione nella domanda. Chiamata dell'OP.
Level River St,

60 bpm è udibilmente distinto da 65 bpm. Consentirò che ciò non sia competitivo poiché si tratta di una restrizione imposta dalla lingua.
Mego,

@Mego Inizialmente pensavo che la BBC Basic contasse per impostazione predefinita in centesimi di secondo, non mi rendevo conto che fosse grossa come 20 secondi di secondo. Ho regolato il mio codice su 100, quindi ora posso fare 65.215 BPM, va bene? Ci è voluto un po 'di tempo in più perché l'intera nota supera 256/100, quindi ho dovuto suonarla come due mezze note. Il 50 ° di secondo sarebbe un codice più breve ma 62,5 BPM non rappresenta un grande miglioramento.
Level River St,

A proposito, ci sono stati alcuni piccoli errori di trascrizione nel post originale. Potrebbe essere necessario modificare un po 'il codice. (Il codice attuale ha la versione sbagliata)
JungHwan Min

4

Befunge, 242 byte

La melodia è scritta su stdout nel formato di un file MIDI. Dovrai reindirizzare l'output su un file .mid per riprodurre l'estratto.

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

Provalo online! , anche se non credo sia attualmente possibile salvare l'output in modo tale da conservare l'integrità binaria dei dati.

Spiegazione

La prima riga è essenziale solo un'intestazione MIDI codificata, che viene emessa all'inizio della riga due. Il resto della riga due codifica la sequenza di note come i loro valori MIDI, che sono convenientemente ASCII. La terza riga scrive i comandi MIDI per suonare quelle note, con la durata che viene calcolata automaticamente (ogni nota è un semi-acqua a meno che i% 14 == 0). L'accordo finale viene gestito come un caso speciale sulle righe quattro e cinque (poiché ciò richiede che vengano premuti più tasti contemporaneamente) e la sesta riga scrive la fine MIDI finale del marker di traccia.


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

Questo produce una sequenza di campioni senza segno a 8 bit destinati a essere riprodotti a 8000 campioni al secondo. Se si dispone di un'installazione UNIX / Linux precedente, è possibile reindirizzare l'output a /dev/audio. Su alcune distribuzioni Linux più recenti, potrebbe essere necessario reindirizzare l'output al lettore della riga di comando ALSAaplay


così impressionante. Ottima soluzione!
Abel Tom il

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}

L'uso di uno strumento valido valeva 4 byte extra :)


Che cos'è lo strumento 305?
Pavel,

SmileBASIC ha tutti gli strumenti MIDI generali, ma ha anche un sacco di strumenti "segreti" non documentati. Ecco un esempio di una versione molto più complicata della Canon di Pachelbel riprodotta usando quello strumento: dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21

0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.