Pachelbel의 캐논 연주


29

Pachelbel의 Canon에서 다음 발췌 부분을 오디오로 출력합니다.

파헬벨의 캐논 (D)

규칙

  • 이 과제를 만들기 전에 코덱이 존재하는 한 모든 형식 / 인코딩을 사용할 수 있습니다.
  • 모든 악기 (실제 악기, MIDI 합성 등)를 사용할 수 있습니다
  • 템포는 65 BPM이어야합니다 (악보에 표기되어 있음). 정확히 65 BPM을 얻을 수없는 경우 64.75-65.25 범위 내에서 템포를 사용할 수 있습니다.
  • 악보가 콘서트 피치에 있습니다
  • 동일한 온도 튜닝을 사용해야합니다 (특히 A4 = 440Hz 인 12-ET).

참고로 다음은 발췌 부분을 재생하는 스택 스 니펫입니다.


스 니펫은 다른 곳에서 다운로드 할 때 경쟁력이
Blue

4
@muddyfish 아니요. 외부 소스에서 출력을 가져 오는 것이 표준 허점이기 때문입니다.
Mego

오디오 대신 미디 파일을 출력 할 수 있습니까?
DJMcMayhem

@DJMcMayhem 예, MIDI 파일이 허용됩니다.
Mego

최종 코드 만 필요하다고 가정합니까? 즉, 효과적으로 비 화음 언어 / API의 금지
레벨 강 세인트

답변:


9

자바 스크립트 (ES7), 249 (242) 241 바이트

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)

바이트 절약을 위해 @Neil과 @PatrickRoberts에 감사드립니다!

설명

표기법은 각 문자가 기본 36 자리의 단일 메모 인 문자열에 포함됩니다. 음의 값은하기 식에 의해 결정된다 반음 수가 A5보다 작고 이다 십육 또는 떨게 대한. 끝은 정지 루프.(19 - pitch) * time + 1pitchtime1200for

템포는 65.22bpm입니다 편집 : 정확히 65bpm이며 2 바이트 이상 입니다.

이 설명 / 데모는 브라우저 호환성 Math.pow대신 사용 합니다 **. 또한 .3최종 화음이 귀에서 피가 나지 않도록 오실레이터의 게인을 설정합니다 (기본 게인은 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를 지원하는 모든 브라우저 에서 위의 버튼을 눌러 테스트 할 수 있습니다 .


880*2**(-~-n%20/12)몇 바이트를 절약해야합니다.
Neil

@ 닐 감사합니다. -~-노트 패킹의 형식을 변경 하여 너무 제거 할 수 있다고 생각 + 1합니다 (공식 0에는 for루프 를 중지 해야 하기 때문에 게시가 게시되기 전에 너무 게으 르기 때문에 수식이 있습니다 ).
user81655

내 대답을 게시 한 후, 롤이 톱
패트릭 로버츠

당신은 대체하여 다른 바이트를 저장할 수 있습니다 c=new AudioContext;with(new AudioContext)의 두 발생과 제거 c.프로그램에서.
Patrick Roberts

1
@ kamoroso94 아니요. 지수는 분수 일 수 있으므로 사용 <<하면 정수로 캐스팅합니다.
user81655

8

매쓰, 212 152 139 135 바이트

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

Sound재생 버튼을 누르면 Pachelbel의 Canon을 D로 재생 하는 객체를 출력합니다 . 악기는 MIDI 악기 # 41 "바이올린"입니다.

오디오

클릭 해주세요!

설명

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

문자열로 각 문자의 문자 번호 ( "a"-> 1, "b"-> 2 등)를 a로 묶습니다 List. (이 문자열은 D에서 Pachelbel의 Canon을 나타냅니다)

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

설정 sSoundNote그 기기 기능 # 41. 지속 시간을 1로 설정하고 해당 기능을 List( SoundNote기본 오브젝트 작성) 의 각 요소에 맵핑하십시오 .

{14,18,21}~s~16

마지막 트라이어드를 만드십시오. (지속 시간 16은 마지막 음표를 16 배 길게 만듭니다. 전체 음표는 16 분 음표의 16 배입니다.)

... ~Sound~18.5

템포가 65bpm (템포가 65bpm 인 경우 4/4의 5 소절 = 약 18.5 초)이므로 초 단위 로 Sound물체를 만듭니다 18.5.

126 바이트 버전, 비경쟁

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

출력에 8 분 음표 대신 2 분의 16 분 음표가 포함되어있어 경쟁이되지 않으며 분리가 눈에 able니다.


14
실제로 Mathematica는 Pachelbel의 Canon에 내장되어 있지 않습니까?
Stewie Griffin

1
@StewieGriffin 아마 모든 것, 그리고 클리핑 비용이 너무 높을 것입니다.
Mego

@StewieGriffin 놀랍게도 그렇지 않습니다.
JungHwan Min

6

풍선 껌 , 203 바이트

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

온라인으로 사용해보십시오!

이것은 xxd -r소스 코드 의 16 진 덤프 (와 반대로 )입니다. 생성하는 MIDI 파일은 다음과 같습니다 (또한 16 진 덤프).

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 문자 (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.

템포 제한을 수용하도록 수정되었습니다. 나중에 설명을 업데이트합니다.

BBC BASIC, 123 ASCII 문자 (비경쟁 60BPM)

http://www.bbcbasic.co.uk/bbcwin/download.html 에서 통역사 다운로드

실행할 때 직접 노래를 재생합니다.

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.

언 골프

  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

설명

j는 우리가 처음 4 개의 바에 있는지 또는 마지막 화음에 있는지를 나타내는 플래그입니다. TRUE는 -1BBC BASIC에 있습니다.

SOUND문장은 4 가지 매개 변수를 취합니다.

CHANNEL : 처음 4 개의 바에서 이것은 채널 1입니다. 5 번째 바에서 코드의 3 음표의 채널 번호는 201, 202 및 203 hex (십진수 513,514 및 515)입니다. 이는 채널 1, 2 및 2에서 연주됨을 의미합니다. 도 3에서, 초기 2 의미는 다른 채널상에서 2 개의 음과 동시에 연주된다 (즉, 3 개의 음을 연주한다).

음량 : 양수 값은 다른 효과 (사운드 엔벨로프)를 나타내므로 음수 값으로 나타납니다. -9로 설정하십시오 (가장 큰 -15까지).

피치 :이 튜닝의 범위는 D4 = 108에서 A5 = 184 사이입니다. 각 정수 단계는 반음의 1/4입니다. 값은 54-92 범위의 ASCII 코드로 저장되고 올바른 값을 재생성하기 위해 두 배가됩니다. 1/8 번째 음표는 1/16 번째 음표로 중복 저장됩니다. 최종 코드는 3 개의 개별 피치로 저장되며 음표 길이는 아래와 같이 전체 음표에 따라 다릅니다.

지속 시간 : 1/20 초 1/16 음의 지속 시간은 초당 5/20이므로 분당 60 1/4 음 (템포를 더 정확하게하기에는 해상도가 충분하지 않습니다.) 전체 음은 5-(-75) = 80 단위 (4 초)입니다. ) 길게.


그러면 경쟁이 아닌 것으로 표시되어서는 안됩니까?
JungHwan Min

@JungHwanMin 의견의 원본에 답하려면 : BPM은 65의 10 % 이내입니다. 질문의 정밀도에는 제한이 없습니다. OP의 전화.
Level River St

60bpm은 65bpm과 구별됩니다. 언어에 의해 부과되는 제한이기 때문에 비경쟁이 될 수 있습니다.
Mego

@ Mego 나는 기본적으로 BBC Basic이 기본적으로 100 초의 초에 있다고 생각했지만, 그것이 초의 20 초만큼 거칠다는 것을 몰랐습니다. 코드를 100 번째로 조정 했으므로 이제 65.215BPM을 수행 할 수 있습니다. 괜찮습니까? 전체 음표가 256/100을 초과하기 때문에 약간의 여유가 필요했습니다. 50 분의 1 초는 더 짧은 코드이지만 62.5BPM은 크게 개선되지 않습니다.
Level River St

그건 그렇고, 원래 게시물에 약간의 전사 오류가있었습니다. 코드를 약간 변경해야 할 수도 있습니다. (현재 코드의 버전이 잘못되었습니다)
JungHwan Min

4

펀드, 242 바이트

곡은 MIDI 파일 형식으로 stdout에 기록됩니다. 발췌를 재생하려면 해당 출력을 .mid 파일 로 리디렉션해야합니다 .

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

온라인으로 사용해보십시오! 비록 데이터의 바이너리 무결성을 유지하는 방식으로 출력을 저장할 수는 없다고 생각합니다.

설명

첫 번째 줄은 하드 코딩 된 MIDI 헤더로 필수이며, 두 번째 줄의 시작 부분에 출력됩니다. 나머지 2 행은 일련의 음표를 MIDI 값으로 인코딩하며 이는 편리하게 ASCII입니다. 세 번째 줄은 해당 음표 연주를위한 MIDI 명령을 작성하며, 지속 시간은 자동으로 계산됩니다 (모든 음표는 i % 14 == 0이 아닌 한 반사 변형입니다). 마지막 코드는 4 번과 5 번 라인에서 특수한 경우로 처리되며 (여러 키를 동시에 눌러야하기 때문에) 6 번째 줄은 트랙 미디 어의 최종 MIDI 끝을 씁니다.


4

C, 248228210 19893191 바이트

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

이는 초당 8000 개의 샘플에서 재생되도록 8 비트 부호없는 샘플 시퀀스를 생성합니다. 이전 UNIX / Linux 설정이있는 경우 출력을로 리디렉션 할 수 있습니다 /dev/audio. 일부 최신 Linux 배포판에서는 ALSA 명령 줄 플레이어로 출력을 파이프해야 할 수도 있습니다.aplay


대단해 훌륭한 솔루션!
Abel Tom

1

SmileBASIC, 115 바이트

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}

좋은 악기를 사용하면 4 바이트가 더 필요했습니다 :)


계기 305는 무엇입니까?
Pavel

SmileBASIC에는 모든 일반 MIDI 악기가 있지만 "비밀"문서화되지 않은 악기가 많이 있습니다. 다음은이 악기를 사용하여 연주 한 Pachelbel Canon의 훨씬 더 복잡한 버전의 예입니다. dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21

0

WAV.js를 사용하는 JavaScript (ES6) , 325 바이트

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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.