パッヘルベルのキヤノンをプレイ


29

Dのパッヘルベルのキャノンからの次の抜粋を音声として出力します。

パッヘルベルのカノンD

ルール

  • このチャレンジの作成前にコーデックが存在する限り、任意の形式/エンコーディングを使用できます
  • 任意の楽器(実際の楽器、MIDI合成など)を使用できます。
  • テンポは65 BPMである必要があります(楽譜で表記)-65 BPMを正確に取得できない場合は、64.75〜65.25の範囲内の任意のテンポを使用できます。
  • 楽譜はコンサートピッチにあります
  • 平均律チューニングを使用する必要があります(具体的には、A4 = 440 Hzの12-ET)

参考のために、抜粋を再生するスタックスニペットを以下に示します。


それは別の場所からそれをダウンロードして競争力がスニペットう
ブルー

4
@muddyfishいいえ、外部ソースからの出力の取得は標準的な抜け穴だからです。
メゴ

オーディオの代わりにMIDIファイルを出力することは受け入れられますか?
DJMcMayhem

@DJMcMayhemはい、MIDIファイルは使用できます。
メゴ

最終的な(唯一の)コードが完全に必要だと思いますか?それは効果的に非ポリフォニック言語/ APIのを禁止している
レベル川セント

回答:


9

JavaScript(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未満であり、ある16分音符または震えのために。最後には停止しループを。(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)数バイト節約できます。
ニール

@ニールありがとう。私-~-はメモのパッキングの形式を変更することでそれを取り除くことができると思います(+ 1式にあるのはループ0を停止する必要があり、for投稿する前に考えるのが面倒だったからです)。
user81655 16

答えを投稿した後、これを見ました、笑
パトリックロバーツ

プログラム内の2つのオカレンスを置き換えc=new AudioContext;with(new AudioContext)削除することにより、別のバイトを保存できますc.
パトリックロバーツ

1
@ kamoroso94いいえ。指数は小数になる可能性があるため、使用<<すると整数にキャストされます。
user81655

8

Mathematica 212 152 139 135バイト

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

SoundPlayボタンが押されたときにPachelbelのCanonをDで再生するオブジェクトを出力します。楽器はMIDI楽器#41「バイオリン」です。

オーディオ

クリックしてください!

説明

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

文字列内の各文字の文字番号(「a」-> 1、「b」-> 2など)をaでラップして検索しListます。(この文字列はDのパッヘルベルのキャノンを表します)

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

楽器が#41の関数に設定sSoundNoteます。期間を1に設定し、その関数をList(したがって、SoundNoteプリミティブオブジェクトを作成します)。

{14,18,21}~s~16

最後のトライアドを作成します。(デュレーション16は、最後の音を16倍長くするためにあります。音全体は16分音符の16倍です。)

... ~Sound~18.5

作る Sound18.5数秒の長さのオブジェクトます(テンポは65 bpm [テンポが65 bpmの4/4の5小節=約18.5秒]であるため)。

126バイトバージョン、非競合

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

出力には8分音符ではなく16分音符が2つ含まれており、分離が非常に顕著であるため、競合しません。


14
本当に、MathematicaにはPachelbelのCanonの組み込み機能がありませんか?
スチューウィーグリフィン

1
@StewieGriffinたぶん全部と、それをクリッピングするコストが高すぎるでしょう。
メゴ

@StewieGriffin驚いたことに、そうではありません。
ジョンファンミン

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ファイルは次のとおりです(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 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は-1 BBC BASICにあります。

SOUNDステートメントは4つのパラメーターを取ります。

チャンネル:最初の4小節の場合、これはチャンネル1です。5小節の和音の3つの音の場合、チャンネル番号は201、202、203 hex(513、514、515 10進数)です。これは、チャンネル1、2、 3、最初の2つは、他のチャンネルの2つの音と同時に再生することを意味します(つまり、3つの音のコードを演奏します)。

VOLUME:正の値は他の効果(サウンドエンベロープ)を表すため、負の値として指定されます。-9に設定します(最大-15になります)。

PITCH:この曲では、D4 = 108からA5 = 184の範囲です。各整数ステップは、半音の1/4です。値は54〜92の範囲のASCIIコードとして保存され、正しい値を再生成するために2倍にされます。1/8分音符は1/16分音符の複製として保存されます。最終的なコードは3つの別々のピッチとして保存され、音符の長さは次のように音符全体に変化します。

期間:1/20秒。1/16分音符の長さは5/20秒であるため、1分あたり60 1/4音符(テンポを正確にするには解像度が不十分です。)全音符は5-(-75)= 80単位(4秒) ) 長いです。


では、これは非競合とラベル付けされるべきではないでしょうか?
ジョンファンミン

@JungHwanMinコメントの元のテキストに答えるには:BPMは65の10%以内です。質問の精度に制限はありません。OPの呼び出し。
レベルリバーセント

60 bpmは、65 bpmとは聞き分けられます。これは、言語によって課せられる制限なので、競合しないようにします。
メゴ

@Mego BBC Basicはデフォルトで100分の1秒でカウントされると当初考えていましたが、20秒のように粗いことに気づきませんでした。コードを100分の1に調整したので、65.215BPMを実行できるようになりました。大丈夫ですか?音符全体が256/100を超えるため、少し余分な手間がかかりました。そのため、2つの半音として演奏する必要がありました。50分の1秒は短いコードですが、62.5BPMはそれほど改善されません。
レベルリバーセント

ところで、元の投稿にはいくつかの小さな転写エラーがありました。コードを少し変更する必要があるかもしれません。(現在のコードのバージョンが間違っています)
ジョンファンミン

4

Befunge、242バイト

曲は、MIDIファイルの形式で標準出力に書き込まれます。抜粋を再生するには、その出力を.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行目の開始時に出力されます。2行目の残りの部分は、一連のノートをMIDI値としてエンコードします。これはASCIIが便利です。3行目は、これらのノートを演奏するためのMIDIコマンドを書き出し、デュレーションは自動的に計算されます(i%14 == 0でない限り、すべてのノートは半四分音符です)。最後のコードは、4行目と5行目の特別なケースとして処理されます(複数のキーを同時に押す必要があるため)。6行目は、MIDIの最後のトラックマーカーを書き出します。


4

C、248228210198193193バイト

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

これにより、1秒あたり8000サンプルで再生される8ビットの符号なしサンプルのシーケンスが生成されます。古いUNIX / Linuxセットアップがある場合、出力をにリダイレクトできます/dev/audio。一部の新しいLinuxディストリビューションでは、出力をALSAコマンドラインプレーヤーにパイプする必要があります。aplay


非常にすばらしい。素晴らしい解決策!
アベルトム

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とは?
パベル

SmileBASICにはすべての一般的なMIDI楽器がありますが、文書化されていない「秘密の」楽器もたくさんあります。以下は、その楽器を使用して演奏されたパッヘルベルのキヤノンのはるかに複雑なバージョンの例です。dropbox.com
s

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.