Пограйте кілька канонів Pachelbel


29

Виведіть такий уривок із канону Pachelbel в D як аудіо:

Канон Пачельбеля в D

Правила

  • Будь-який формат / кодування може використовуватися до тих пір, поки кодек існував до створення цього виклику
  • Може використовуватися будь-який інструмент (реальний інструмент, синтез MIDI тощо)
  • Темп повинен бути 65 BPM (як зазначено в нотах) - якщо ви не можете отримати точно 65 BPM, ви можете використовувати будь-який темп в межах (включно) 64,75 - 65,25
  • Ноти в концертному тоні
  • Необхідно використовувати рівну настройку темпераменту (зокрема, 12-ET з A4 = 440 Гц)

Для довідки, ось фрагмент стека, який відтворить уривок:


Чи буде цей фрагмент конкурентоспроможним, оскільки він завантажує його з іншого місця
Blue

4
@muddyfish Ні, тому що отримання результату із зовнішнього джерела є стандартною лазівкою.
Мего

Чи прийнятним буде виведення файлу midi замість аудіо?
DJMcMayhem

@DJMcMayhem Так, файли MIDI прийнятні.
Мего

Я припускаю, що остаточний (лише) акорд потрібен повністю? Це фактично забороняє не поліфонічні мови / API
Level River St

Відповіді:


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 цифри. Значення нот визначаються за формулою, (19 - pitch) * time + 1де pitchкількість півтонів менша за А5 і timeє 1для напівквітки або 20для труси . На 0кінці зупиняється forпетля.

Темп - 65,22 проміжок часу. Редагувати: рівно 65 уд. / Хв., Ще на 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 веб-аудіо API .


880*2**(-~-n%20/12)має заощадити кілька байт.
Ніл

@Neil Дякую Я підозрюю, що я можу позбутися -~-занадто, змінивши формат упаковки заміток ( + 1Формула існує лише тому, що мені потрібно 0зупинити forцикл, і я був занадто ледачий, щоб багато про це думати, перш ніж я розмістив повідомлення).
користувач81655

Побачила це після того, як я опублікувала свою відповідь, хаха
Патрік Робертс

Ви можете зберегти інші байти, замінюючи c=new AudioContext;з with(new AudioContext)і відвернувши два входження c.в програмі.
Патрік Робертс

1
@ kamoroso94 Ні. Експонент може бути дробом, тому, якби я <<його використав, він би передавав це ціле число.
користувач81655

8

Mathematica, 212 152 139 135 байт

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

Виводить Soundоб'єкт, який відтворює Canon Pachelbel в D, коли натискається кнопка Play. Інструмент - інструмент MIDI № 41 "Скрипка".

Аудіо

Клацніть на мене!

Пояснення

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

Знайдіть номери букв кожного символу в рядку ("a" -> 1, "b" -> 2 тощо), обгорнутим символом a List. (Цей рядок представляє канон Пачельбеля в D)

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

Встановіть sдля SoundNoteфункції якого інструмент # 41. Встановіть тривалість на 1 і відображіть цю функцію на кожному елементі List(таким чином роблячи SoundNoteпримітивні об'єкти).

{14,18,21}~s~16

Складіть останню тріаду. (Тривалість 16є, щоб зробити останню нота в 16 разів довшою - ціла нота шістнадцять разів шістнадцята.)

... ~Sound~18.5

Створіть Soundоб’єкт 18.5довгими секундами (тому що темп - 65 bpm [5 заходів 4/4 з темпом 65 bpm = приблизно 18,5 секунд]).

126-байтна версія, неконкурентна

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

Неконкурентний, оскільки вихід містить дві шістнадцяті ноти замість восьмої ноти, і розділення є досить помітним.


14
Дійсно, у Mathematica немає вбудованого канона Пачельбеля?
Стюі Гріффін

1
@StewieGriffin Мабуть, тільки вся справа, і вартість її відсікання була б занадто високою.
Мего

@StewieGriffin Дивно, але це не так.
JungHwan Min

6

Bubblegum , 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) вихідного коду. Файл MIDI, який він створює, виглядає наступним чином (також шістнадцятковий):

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.217 фунтів. Хвилин)

*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 барах, або в заключному акорді. ІСТИНА - -1в БАЗі БІБ.

SOUNDОператор приймає 4 параметра:

КАНАЛ: для перших 4 барів це канал 1. Для 3 нот акорд у 5-му рядку номери каналів складають 201, 202 та 203 шістнадцяткових (513,514 та 515 десятків.) Це означає, що грає на каналах 1,2 та 3, початкове 2 значення, що грає одночасно з 2 нотами на інших каналах (тобто відтворення 3 акорда ноти).

ОБ'ЯЗОК: Дається як негативне значення, оскільки позитивні значення представляють інші ефекти (звукові конверти.). Встановіть значення -9 (піднімається до -15, що найгучніше.)

PITCH: Для цієї мелодії, від D4 = 108 до A5 = 184. Кожен цілий крок становить 1/4 півтона. Значення зберігаються як ASCII-коди в діапазоні від 54 до 92 і подвоюються, щоб відновити правильне значення. 1/8-ма нотатки зберігаються як копії 1/16 нотаток. Заключний акорд зберігається у вигляді 3 окремих пітчів, а довжина ноти змінюється на цілу ноту, як показано нижче.

ТРЕБА: через 1/20 секунди. Тривалість 1/16 ноти становить 5/20 секунди, тому 60 1/4 нот в хвилину (недостатня роздільна здатність, щоб зробити темп більш точним.) Уся нота становить 5 - (- 75) = 80 одиниць (4 секунди ) довго.


Чи не слід це позначати як неконкурентні?
JungHwan Min

@JungHwanMin Щоб відповісти на оригінальний текст вашого коментаря: BPM знаходиться в межах 10% від 65. Точність у питанні не обмежена. Дзвінок ОП.
Рівень річки Св.

60 об / хв чутно відрізняються від 65 об / хв. Я дозволю це не змагатися, оскільки це обмеження, накладене мовою.
Мего

@Mego Я спочатку думав, що BBC Basic за замовчуванням рахує 100 соток секунди, я не розумів, що це так грубо, як 20-ті секунди. Я відкоригував свій код на 100, і тепер я можу робити 65.215 проміле, що це нормально? Це займе трохи додаткового підгортання, оскільки вся нота перевищує 256/100, тому мені довелося відтворити її як дві половини ноти. 50-та частина секунди була б коротшим кодом, але 62.5BPM - це не надто покращення.
Рівень р. Св.

До речі, в початковій публікації були деякі незначні помилки транскрипції. Можливо, вам доведеться трохи змінити код. (У поточному коді неправильна версія)
JungHwan Min

4

Befunge, 242 байти

Мелодія записується до stdout у форматі 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, який виводиться на початку другого рядка. Решта другого рядка кодує послідовність приміток як їх значення MIDI, які зручно ASCII. Третій рядок записує команди MIDI для відтворення цих нот, при цьому тривалість автоматично обчислюється (кожна нота є напівквалінкою, якщо я% 14 == 0). Заключний акорд обробляється як окремий випадок на рядках чотирьох і п'яти (оскільки для цього потрібно одночасно натискати кілька клавіш), а шостий рядок записує остаточний кінець маркера MIDI.


4

C, 248 228 210 198 193 191 байт

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

Це створює послідовність 8-бітових неподписаних зразків, призначених для відтворення при 8000 пробах в секунду. Якщо у вас є старіші установки UNIX / Linux, ви можете перенаправити вихід на /dev/audio. У деяких новіших дистрибутивах Linux, можливо, доведеться передавати висновок програвачу командного рядка ALSAaplay


такий чудовий. Чудове рішення!
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?
Павло

SmileBASIC має всі загальні інструменти MIDI, але також має купу "секретних" незадокументованих інструментів. Ось приклад набагато складнішої версії Canon
Pachelbel,

0

JavaScript (ES6), використовуючи WAV.js , 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.