Коннор Харріс: Привіт. Я Коннор Харріс. Я CS50 Каліфорнія в Гарварді. СТІВЕН KREWSON: Я Стівен Krewson. Я TF для CS50 в Єльському університеті. Коннор Харріс: І ми будемо говорити про деякі технології, які ви, можливо, хочете використовувати, якщо ви зацікавлені в робити остаточний проект або дійсно що-небудь з музикою. Ми збираємося концентруватися на першому а Мова програмування Haskell називається. Це функціональний мову, тому парадигма дуже відрізняється від C або PHP або інші імперативні мови що ви використовували вже, і особливо в бібліотеці, написаної в Haskell називається Euterpea, які можуть допомогти людям з написання музики функціонально, в основному. А Стефан, ви пройдете через великий приклад цього. Після цього, я познайомлю вас з те, що називається LillyPond, що це технологія верстки музики. Це ніби як LaTeX для музики, якщо кожен з вас використовували латекс для математичних класів або інші Р набір класів або що там у вас. І тому я дам вам, знову ж, деякі прості приклади, що і вказати вам загалом Напрямок деяких кращих ресурсів. СТІВЕН KREWSON: У Крім того, ми думали, це було б здорово, щоб налаштувати трохи натяків до трубопроводу між Euterpea генеруються MIDI файли в LillyPond, тому ми надаємо деякі інструкції по сценаріїв зробити це, які є забезпечені LillyPond просто тримати його відкритим вихідним кодом і отримати трубопровід збирається. Коннор Харріс: Знову ж таки, слід підкреслити ,, ці дві технології, ви не повинні використовувати їх разом. Вони не призначені для роботи разом, хоча вони дуже красиво. СТІВЕН KREWSON: Вірно. І абсолютно безкоштовно. Коннор Харріс: Так підтвердження, щойно прочитав, що. СТІВЕН KREWSON: Належним чином відзначити. Завдяки цим людей. Це я затримуватися на тільки на мить. Процес установки це трохи складніше. Ми читання мене на GitHub що ви можете поглянути на. Просто напишіть мені, якщо у вас є які-небудь питання. Але ми будемо запускати цей в припущенні, що це працює для всіх. Коннор Харріс: А якщо ви не можете отримати LillyPond не працювати, не страшно. Там немає живої збірник, що буде брати участь, принаймні, з мого боку. СТІВЕН KREWSON: Haskell і LillyPond повинні обидва мають інсталяторів. Euterpea завантажується як Пакет, так далі, і так далі. Таким чином, ми говоримо про комп'ютерної музики. І це всього лише дуже вид 50000 футів. Там в кілька різних аспектів цього. І це є грубим і збирається приховувати деякі подробиці. Але ми могли б придумати що-небудь як алгоритмічного складу, з використанням алгоритмів, за допомогою коду, щоб генерувати деякий тип може бути of-- самоподібним послідовність нот, або можливо нот під якийсь обмеження. І тоді ті, може бути виконані або інтерпретувати з аналогових інструментів або що-небудь подібне. Але склад був зроблено алгоритмічно. Але, звичайно, може бути, область комп'ютерна музика чи цифровий музичний ми більше знайомі з цифровою синтез звуку або цифровий дискретизації і цифровий запис. Багато цифрових інструментів є здійснюється через цифровий дискретизації. Насправді, ми будемо використовувати один з тих, хто в форма звукової бібліотеки шрифту пізніше. Але є також щось, зване цифровий синтез, який вийшов з кінця 70-х і в 80-х з Yamaha і Джон Chowning в Стенфорді робить синтез FM або Синтез частоти модуляції, де ви були носій і сигнал модуляції як в звукового спектру. Але те, що ми зосереджені на сьогодні те, що називається MIDI, і, звичайно, алгоритмічна композиція. Ми не збираємося робити інструменти, але ми замість збираюся зробити музику, а потім, що буде інтерпретуються деякі інструменти, які є сумісну до General MIDI Стандарт. Так що MIDI-? Я не збираюся занадто глибоко в неї, але це MIDI-протокол передачі даних. Це свого роду гідом по різні компанії і галузі для організації звуків або патчі. Таким чином, ми побачимо, що є стандартний MIDI- для всіх різних ударних звуки і MIDI рекомендації для всіх різних типів синтезатор або Різні типи всіх приладу групи в оркестрі, скажімо. Ви, напевно, знайомі з Від 0 до 127 MIDI повідомлення. MIDI-сигнал, як правило, один біт, який вказує це чи дані або пакет положення, і тоді є сьомій біт сигналу. І вони можуть контролювати все від обсягу до дії тиску або на певному ключі якщо ви виконуєте з MIDI Контролер, а також, звичайно, Примітки. І, звичайно, має MIDI- був надзвичайно корисним, бо це спосіб дроти разом або ромашка ланцюга купа пристроїв MIDI. У мене є сім чи вісім тому в моєму домі. Це стає дійсно складно, але це дуже потужний. І це насправді старий. Це від початку 80-х, і це дійсно красиво і мало. Коннор Харріс: Так. Всі класичні Nintendo відео ігри, ймовірно, буде є MIDI файли для музики, наприклад. СТІВЕН KREWSON: Ось Приклад загальної MIDI, показуючи MIDI в якості свого роду загального протоколу. І я думаю, що ми можемо думати про Різниця між специфікацією що там має бути щось на зразок це звучить інструмент і фактичне Реалізація цих документів звучить в звуковий шрифт або конкретного MIDI синтезатор як різниця може бути, між typeface--, який говорить, загалом, це дизайн саме цей спосіб представлення characters-- і конкретний шрифт який має певний розмір і тембр, і є реалізація the-- Коннор Харріс: Може бути, краще б порівняння бути стандарт Unicode says-- це дає номер для кожного символу, і дійсно кожна мова в світі, або великий набір сценаріїв мови у світі, а потім ті надана в щось графічної різними пакетами шрифтів. І очевидно, що ви можете думати про MIDI-як Unicode звуку. І це всього лише список of-- великий потік подій і документів і ще багато чого, і ви повинні мати окремий Програма, як шрифт, надавати, що в те, що це чути. СТІВЕН KREWSON: Так чому Haskell? Haskell є функціональне програмування мову, дуже просунуті, дуже відрізняється від C, дуже відрізняється від PHP. І ми збираємося, щоб побачити, що є більш простота композиції функцій в Haskell що дозволить нам вітер через складати або друкуючи, переписування, щось на зразок Frere Жак, це просто пісня, є багато деталей в ньому, що автомодельного або повторювати. Так що це буде кілька мотивація, чому ми використовуємо Haskell, в якому Функції є громадянами першого класу. І я хотів, щоб розширити це небагато. Це трохи легко нотами FRERE Жака в Haskell. Але що, якщо ми хотіли додати партію ударних для нього? Що робити, якщо ми хотіли, щоб спробувати зробити щось на зразок Роланд 808 або 909 барабана машина, де ви повинні близько 16 різних кроків? Як правило, це думав як 16 нот. І ви можете контролювати глобальне темп, і ви можете вибрати купа різних частинах ударних бас барабана, бавовна, різні пастки, відкриті і закриті високі капелюхи на ці роду каналів, а потім ви можете EQ або налаштувати їх обсяг. І ми побачимо хороший спосіб в Haskell подання на цей крок секвенсор з усіма різні класні речі в Haskell ми можемо зробити з генерації списки і списки фільтрації більше, відображення над списками, відображення функції над списками. І швидкий вибачення. Це дуже поверхневий і надмірно швидкий начерк деякі з аспектів з Haskell і Euterpea, що предметно-орієнтований вбудовану мову написано в Haskell для музичних типів. Тому, будь ласка, перевірити код в Інтернеті. Запустіть GHCI, що Глазго Haskell Compiler Перекладач. І я буду робити деякі це в трохи так що ви можете побачити, як це робиться. І це дає змогу завантажити в с the-- синтаксис товстої кишки, а потім команда. Ви можете завантажити в файли. Ви можете використовувати переглядати ці файли на щоб побачити всі функції, які існувати в певному модулі. І те, як ми побачимо, типи і тип класи настільки важливі в Haskell, так що ви завжди можете check-- особливо якщо ви працюєте в новій DSCL як це, те, що тип музики? Я знаю, про шлях числовий типи працюють в Haskell, але я не знаю багато про музику. Але ви можете вивчити, як вони визначається за допомогою цього типу або т команду і потім викликати зокрема функція або об'єкт даних. Коннор Харріс: Так. Якщо ви думали, C і Clang був hardass про типи, Ви поняття не маєте про Haskell. Гарна річ про Haskell є те, що якщо ви можете отримати код для компіляції і якщо чеки типу Haskell, це, напевно, правильно, тому що система тип так строгі. СТІВЕН KREWSON: Так. Так що я просто хочу, щоб піти through-- і знову, це не робить його justice-- кілька особливості Haskell, що, принаймні, його creators-- і він був створений в кінці 1980-х групою людей, комітет 20 people-- вважали важливим. І перше, що вони перераховані в документі, який описав генезис Haskell протягом перших 20 років або близько того було те, що був ледачий. Отже, що ж це означає? Ну, це значить, коли у нас є якийсь вирази, ми повинні оцінити його. І Haskell робить це у виклику по необхідності так чи нестрогим чином. Тобто, якщо у нас є купа складові нашого вирази, ми намагаємося, щоб затримати оцінку з тих подкомпоненте до абсолютного минулого minute-- що поки ми не їх дійсно потрібно. Таким чином, це означає: що дійсно здорово, особливо якщо ми думаємо про абстракції музичного покроковий секвенсор. Ви включите його, і ви починаєте працює крок sequence-- якщо ви коли-небудь працював з барабаном machine--, і він просто йде назавжди. Тому було б дуже добре, якщо ми може емулювати, що в Haskell. І ми можемо зробити це з нескінченним значення, зокрема нескінченних списків. Це дуже легко введіть нескінченний список в Haskell. Ви могли б просто використовувати синтаксис вниз тут, де ви бачите з 1 по 3, зняти 3 1 точка точка, і що це нескінченний список всіх натуральних чисел продовження від того, наскільки ви можете собі уявити. Я хочу, щоб ввести Концепція складок відразу. І знову, мета це не семінар щоб дізнатися про складок в Haskell або вищі функції порядку. Але я просто хочу, щоб ввести його в дати точну почуття, як дивно Haskell і як потужний це. І, зокрема, ми збираємося be-- коли ми робимо наші різні частини барабана, ми збираємося бути маніпулювання списками число, складаючи їх один на одного. І щоб зробити це, ми будемо бути з використанням карт і складки. Там це право асоціативний раз, що це одне право here-- 1 мінус кількість, 2 мінус кількість, 3 мінус 0. І синтаксис для раз, ви даєте раз базове значення і потім operation-- У цьому випадку додавання чи віднімання. Я показав обидва випадки. А тут ще, що акумулятор накопичується протягом усього списку, застосування цього оператора плюс або мінус, а потім накопичувати його. Так що це буде the--, якщо він був викликаний з кратним г плюс 0, починаючи з 0, ми тоді підвести всі числа в цьому списку. І це список від 1 до 3. Коннор Харріс: Так, говорячи іншими спосіб, раз г приймає три аргументи. Там функція, яка Сам приймає два аргументи, тобто значення стартер, і є список значень. І те, що ви робите, це ви берете стартер значення, перше значення, покласти їх у функцію. Що ви вийти, Візьміть це, канал, який у функції від Друге значення, що ви отримуєте з, прийняти, що враховувати їх у Функція третій значення. І потім, якщо ви йдете вниз Весь цей список таким чином, Ви збираєтеся отримати в кінцевому підсумку деякі сингулярне це того ж типу, що ви почали з того самого типу як речі в списку, а потім це повернення результат кратного R. СТІВЕН KREWSON: Таким чином, зокрема, це вищі функції порядку, тому що вони беруть інший Функція в якості одного з аргументів. Коннор Харріс: Так. Якщо ви використовували деякі інші languages-- Я знаю, R, [нерозбірливо] мова має це, називається Reduce. Ви могли б мати аналогічні функції на інших мовах, просто називається різні речі. СТІВЕН KREWSON: І те, що приємно про кратним R в даному випадку є те, що складка R може працювати з нескінченними списками. Так що в цьому дні, в цьому P5 генерує ноти, включені в покроковий секвенсор для деякі ударних, п'ятий барабан частина, і, можливо, це Конга барабан або щось. І це навмисно тупий спосіб написання цього але це весело, тому що він демонструє багато речей, про Haskell і Euterpea. Так складаються R цього colon-- товстої кишки тільки оператор, який штовхає речі разом на list-- закликав порожній Список, який знаходиться всього в порожні дужки. І я дзвоню, що на цій нескінченній списку. Це насправді два списки підсумовуються тут. Список 1 кома 6 точка Точка 1, 6, 11, 16. Так Haskell-- всього кілька символів, ви може генерувати цільні Послідовність чисел що п'ять чисел один від одного розтягування на в нескінченність. І я до того, що випереджати це коротше трохи list-- 3, 8, 21-- щоб показати вам, як ви можете об'єднати списки. І потім, я склав на собі. І це закінчується просто бути свого роду операція ідентичності, але це нескінченно. І раз R може це зробити, тому що це ліниво оцінює, як в описаному вище. Якщо у нас є 1 і 2 і 3, ми можемо просто дужки від усієї інше. Це не буде працювати для мінус або плюс, але це буде працювати на цій товстої кишки операція ідентичності в списку. Так як ми практично використовувати, що, якщо ми є нескінченно довгий список речей? Ну, Haskell забезпечує багато functions-- і виглядають більш в ці в самостійно time-- як приймає в якому говориться, гаразд, ми генерації цю нескінченний список, але ми тільки збираємося прийняти деякі Кількість його і в цьому case-- ми побачимо це пізніше в наш драм-машина code-- ГМ просто якийсь глобальних змінна для числа кроків в секвенсор. На машинах з рулонної в Я показав вам, що це, як правило, 16, але я реалізував його з 32. Це дійсно не має значення. Haskell також чисто, тому вона має сильне статична типізація, що Коннор згадував. Так функції Математична в sense-- вони більш математичне що вони гарантовано не доступний або змінити будь-яку змінна або виконати вхід або вихід. Так що, якщо у вас є функція, це детермінованим. Він завжди буде повернутися в той же Значення в змозі програми або залишаються незмінними. Є, звичайно, винятки монадичну на це, але це виходить за рамки нашої. Коннор Харріс: Так. Що це означає, однак, є кілька важливих [нерозбірливо] Наслідки цього. Одним з них є, що це дуже легко распараллелить програми на Haskell. Тому що, якщо у вас є, сказати, що функції повинен працювати на мільйон значень, якщо Ви знаєте, що функція завжди буде видавати і те ж значення, якщо Ви годуєте на певному value-- якщо ви [нерозбірливо] е 1, е з 2, то F 3 або F whatnot-- з 1 не збирається виписувати у файл або зробити щось що буде змінювати значення f2. Ви можете просто розділити цю функцію до мільйон різних машин або мільйон різні теми або що, отримати всі відповіді назад, отримати всі повертаються значення назад, а потім це все. Так дуже легко распараллелить речі. Недоліком є ​​те, що вхід і вихід, особливо вписуються в систему типу в дуже складних відносинах. Ми не будемо вдаватися в це прямо зараз, але я Рекомендую вам поглянути на деякі ресурси в Інтернеті, якщо ви хочете дізнатися про це. СТІВЕН KREWSON: Так введіть classes-- і це was-- класи типів були винайдені, щоб вирішити проблема перевантаження операторів. Таким чином, ми хотіли, щоб рівність між різними типами речей. Звичайно, ми могли б подумати of-- рівність між числовими типами дуже легко думати про це, але те, що про рівність між списками? Що про рівність між деревовидні структури даних нога? І все це можливо в Haskell з класів типу. Так що, якщо ви визначаєте якийсь type-- даних і ось, це музичні майданчики. Ми нарешті в якійсь комп'ютерної музики. Отже, ми маємо С, дієз, і так далі, і так далі. Вони належать до зв'язці різні класи типу. EQ-- вони належать до класу типу еквалайзера. Це означає, що вони підтримують Операції рівності. Таким чином, ви можете оцінити, наскільки одна послідовність музичних примітивів такий же, як інший. Вони належать до порядковому класу. Це означає, що є впорядкування до них. D приходить після С.-дієз приходить після C, а також. Вони належать до класу показати, що означає, що вони можуть бути надруковані на консоль або термінал. Вони належать до клас перерахував, що означає, що навіть при тому, ці персонажі, в їх основі лежить числовий уявлення, починаючи з 0 і збирається покинути через проте багато речей тут, 20 або близько того, або 30, або 40, може бути. Коннор Харріс: А коли у нас є тип даних що derives-- з цього ключового слова "deriving--" певний тип класу, це означає, що компілятор буде намагатися побудувати щось автоматично. Так, може бути, ви хочете, щоб визначити якість по-різному. Ви хочете, щоб визначити дієз рівним ре-бемоль, наприклад. При такій конструкції тут, я не думаю, що дієз і ре-бемоль будуть рівні, тому що компілятор автоматично кажуть кожен інший можливе значення відрізняється від будь-якої іншої. Таким чином, можна перевизначити Реалізації за замовчуванням з цих типів класів. Знову ж таки, подивіться на посилання, якщо Ви хочете, щоб дізнатися про це. СТІВЕН KREWSON: І тут, насправді, це буду бути корисним, коли ми код пізніше. Ми бачимо, деякі з операторів інфіксной для послідовного з'єднання паралельної композицією, і так вперед, ці плюси і рівні знаки в оточенні двоєточиямі. Це означає, що ми можемо грати ці різні музичні примітиви один за іншим. Це послідовна композиція. Або ми можемо грати їх у паралельно в той же час. Так що я можу мати музичну цінність, і тоді це дорівнює і двокрапки, інфіксной оператора паралельної композиції, і грати їх як свого роду акордом. І ми збираємося використовувати це, коли ми об'єднуємо наш ударних з нашим трохи Frere Жак пісня грати в ці дві послідовності музичні цінності, в той же час. Каррінг is-- Каррі було в минулому найменування Haskell Curry, який зображення Haskell названий на честь. І це дозволяє нам приємно елегантність, коли ми пишу всі ці різні функції або фільтри, які ми буде відображення на наші списки. Функція двох arguments-- е х і y-- може бути представлена ​​у вигляді е х застосовуватися у. Так що це функція один аргумент, який повертає інша функція одного аргументу. Таким чином, це означає, що ми можете підключити Функція F х над списком значень у. Коннор Харріс: Хочете Наведемо приклад цього? СТІВЕН KREWSON: Так. У мене є приклад прямо тут від деякі з речей, які ми будемо писати. Так повторити 2-- добре, повторити відбудеться одне значення, яке, скільки раз повторити те, а потім він буде приймати value-- як правило, список або щось. Так от, ми відображення повторити 2 над іншому списку. Так що, якщо ми мапі повторити 2, якщо ми повторити 2 застосовуються на перший елемент цього list-- і ці списки музичної phrases-- буде виробляти два "ви sleeping--" так ти спиш, спиш. Так що тепер у нас є два. Але репліку займає два Аргументи, а тому, що ми вичинки, а потім відображення, ми можемо уявити копіювальника 2 як ніби вони були повернуті в залежності від одним argument-- просто тиражування в два рази. А потім ми застосовуємо, що кожному елемент в цьому списку фраз. І CONCAT є Haskell робота для вирівнювання список. Тому повторної 2 волі скласти список списків. І це це проміжна форма тут. І так, то ми можемо Concat або згладити, що двічі. Коннор Харріс: Більш простий Приклад карірованія якщо ви хочете представити like-- е це просто Функція множення, який приймає два Аргументи і повертає їх продукт. Так що, якщо у вас є F 4, 5, це 20. Але ви можете думати про це як also-- у вас є функція F 4 який приймає аргумент і повертає чотири рази в цьому argument-- тільки часткове застосування яких тільки один аргумент 4. І якщо ви годуєте е з 4 5, що дасть вам 20. І це простіше, Приклад вичинки. Це, як правило, один з них підручників. СТІВЕН KREWSON: Лямбда вирази або анонімні функції ще одна ознака Haskell. Так що, якщо ми повинні зробити на швидку руку маленька функція повторної життя, але сказати, що це не стандартна бібліотека, ми можемо використовувати синтаксис схожий на наступний. І ми будемо над цим вітер. Одна річ, ви побачите багато в барабан машини ми дзвінків в те, що називається фільтр, який, як і колись, це відображення функції за списком, але це відображення булевої функції. Таким чином, ми маємо тут приклад в А анонімно визначається булева функція, що просто бере пару значень. Це, строго кажучи анонімна функція. Але це визначення з що синтаксис для стислості, і це тільки бере х модуль N-- Коннор Харріс: Так. Так е є функцією два аргументи п р і що повертає функцію, яка сама функція одного аргументу, а саме х. СТІВЕН KREWSON: Я вищевказані оператори інфіксной. Які оператори інфіксной? Ну, оператори інфіксной є нормальний спосіб ми представляємо операцій, кажуть, в mathematics-- 2 плюс 2 замість оператора плюс а потім два аргументи 2 і 2. Коннор Харріс: Це називається зворотної польської нотації, яка є термін, який я сумніваюся, що кожен з вас знають. СТІВЕН KREWSON: Вірно. Зворотний польський чи префікс позначення. Але Haskell вирішив використовувати оператори інфіксной. Так ось деякі з користувальницькі ті, які визначаються для Euterpea DSCL в Haskell. Так що це було послідовна композиція. Це було паралельно композиції, і це був усічення паралельної композиції. І ми повинні, що з нашою драм-машини, бо ми будемо використовувати останній оператор в цій маленькій кортежу там грати драм-машину разом з нашою Frere Жака пісні. І наша машина барабанного буде нескінченним. Це просто грає вічно. Але пісня Frere Жак немає. Це не так довго. Це тільки декілька барів. Таким чином, ми повинні зупинити машину, як барабан тільки коротше музичний значення приходить до кінця. І, що оператор інфіксальний супер корисно з цим. І інфіксной позначення, як це частково добре, тому що у вас є функції, як цитата, яка дає цілочисельне ділення х щось else-- вибачте, що має бути, і б. Ви могли б написати його в якості цитатою Ь. Так що якщо ви put-- елемент Інший приклад. х елемент деякого списку, якщо ви поклали він в зворотні лапки, ви можете використовувати його. Навіть якщо це не символ як плюс або мінус або часу, Ви можете використовувати ім'я функції, як, що в зворотні лапки а інфіксной оператора, який є досить прохолодно. Коннор Харріс: Знову ж таки, це Все просто синтаксичний цукор, насправді. Це не впливає на ядро ​​мови. СТІВЕН KREWSON: Отже, ми бачимо тут для Остання фраза нашого Frere Жака пісні, Я зіграв кілька маленьких акорди або третини, використовуючи паралельний склад оператором. Це ще один спосіб сказати деякі що ми тільки що говорили. Таким чином, ви можете підключити функції одного аргументу за списки. Коннор Харріс: Знову, посилання для Haskell-- вступних підручників будуть мати все це в ньому. СТІВЕН KREWSON: Так от досить Ключовим напрямком в покроковий секвенсор ми поглянемо на використанні список розуміння. І ми бачимо, що тут елемент в оператора фіксованого в зворотні лапки. Таким чином, якщо х є елементом списку х років, то ми будемо називати себе функції Проц. Так PERC це просто функція перкусії. Це займає деякий значення р, що це частина обмеженої множини всіх різні звуки ударних що ми бачили в попередньому слайді, і потім вона дає, що Тривалість четвертний ноти. Інакше це дає йому QNR і QNR просто на чверть тони відпочинок. Так що це щось будувати хороший. У нас є список елементів, і ми будемо цикл з якоїсь список з одного в максимальне значення нашої покроковий секвенсор. І коли ми зокрема, я в що список від одного до максимального значення, якщо я є членом цього Набір створений в цій функції, Ну, тоді ми перетворюємо його в ударних ноти. В іншому випадку, ми просто граємо відпочити, що Тобто, ми просто мовчати. І ми бачимо, що в тут цей список синтаксис розуміння, х населений це Список побудований один в глобальній розміру секвенсор. Коннор Харріс: Так. Основний синтаксис для спискові є кронштейн, вартість залучення деякі змінні, бар, Можливі значення змінних самі закритий кронштейн. І якщо ви зробили набір будівельника позначення в який-небудь клас математики, Ви, можливо, встановити такі 2n що п в і н г в. Схожі thing-- цього запису призначається, щоб бути навідним цієї математичної нотації. СТІВЕН KREWSON: І ви можете застосувати кілька предикатів і кілька фільтрів в списку розуміння, що дуже приємно. Алгебраїчна types-- ми не затримуватиме довго тут. Там не дуже гарна ідея в Haskell або хороший, очевидно, поняття про те, як прийняти, скажімо, за замовчуванням параметр функції або щось. У Python, це досить легко. Ви можете просто сказати, дорівнює по декларація функції, значення за замовчуванням в коли жодна не поставляється. У Haskell, ви могли б, можливо, використовувати, може бути, може бути, введіть, який не приймає ні нічого або значення типу просто. Так ми використовуємо це в драм-машини щоб нам дати додатковий обсяг Параметри для кожної з барабанних деталей. Так що дає нам спосіб мати еквалайзер або обсяг на певному каналі. Коннор Харріс: У інші приклади в Haskell, Ви можете побачити, може бути, для Функції, які можуть вийти з ладу. Це є загальним. СТІВЕН KREWSON: І ви можете поставити свого роду повідомлення про помилку за замовчуванням. І це особливо зручно, коли ви робите I / O в Haskell. Це може бути трюки. Коннор Харріс: Або для Аналогічний приклад, думаю, функції, що припускає поділ параметра, які можуть бути 0. І, що функція може повернутися, може бути, що завгодно. Так що, якщо немає поділу на 0, він повернеться тільки завгодно. А якщо є поділ на 0, то не буде нічого повертати як спосіб сигналізації про помилку. Тому що одним з наслідків Дуже жорстка типізація в Haskell є те, що немає real-- Винятком є ​​ніяково, в основному, обробка помилок незручно. І це одна дуже поширений спосіб зробити це. СТІВЕН KREWSON: Так що тепер ми отримуємо на інший галюциногенний речі про Haskell, яка є картина відповідності та функціональні визначення. Я показав вам, минулого слайді Декларація послідовності кроків функція, яка взяла можливо цінність, потім INT, то список цілих чисел, потім повертає послідовність музика значення є анотований і з висоти та об'єму. Так що ті три аргументи може бути зразок відповідає наступним чином. І ми завжди хочемо бути впевнені, що зробити базовий випадок або виходу випадок перший. І ці підкреслення може бути просто інтерпретувати означає будь-яке значення, там. Так що, якщо ми отримуємо виклик до кроку послідовність з деяким значенням, деяке інше значення, а потім порожній список, те, що ми хочемо повернутися тільки тиша, відпочинок 0. І замість того, що будучи порожньою список або 0, це відпочинок 0, тому що ми справу з типом музики, і порожній список музики тип просто інші не термін. Це не музика. І тоді ми бачимо, якщо ми отримаємо крок послідовність з V за обсягом аргумент, р для обережності інструменту Аргумент, а потім список х років. Потім ми робимо деякі речі. Зокрема, ми застосовуємо цей список розуміння, і ми виконати деякі операції на можливо значення щоб перетворити його в числове значення, так що це може бути потім перераховані і використані щоб вибрати інструмент. Знову ж таки, це трохи трохи свідомо неточної просто щоб показати всі дивні речі ви можете зробити в Haskell, як ви поглянути на нього на вашому власному часу. Добре. Так ми, нарешті, дістатися до робити те, що ми мали намір зробити, що зробити деякі комп'ютерну музику. Отже, ми збираємося, щоб спробувати зробити пісню Frere Жак. Таким чином, є, скільки фрази в Frere Жак? Чотири. Відмінно. І, що приємно, що вони все повторюється те ж саме кількість разів, що в два. Таким чином, ми маємо чотирьох фрази кожен повторюють два рази. І, зокрема, вони в турі. І є багато, багато способів для реалізації круглий, які могли б бути забавно. Я зробив це в досить простий спосіб тут, який просто construct-- лінію Функція приймає список музичних цінностей і перетворює його в послідовному складу шляхом застосування послідовної композиції, що оператором. І тоді я затримати різні частини роблячи їх починають з рештою. Так що я почати з рештою двох заходів, а потім інші чотири заходи, а потім інші шість заходи, а потім круглий працює, як ми всі знаємо, цю пісню. Ми бачимо два анотації або модифікації музичних цінностей , Які містяться в цьому послідовному аранжування музики елементів. У нас є обсяг надбудови. Ця функція, щоб коментувати музика з певною обсягу. Це хороший приклад сигнального поспіль MIDI від 0 до 127, сьомій біт інформація, яка може бути виконана. І then-- ми бачили його дуже коротко, але загальний MIDI- Список всіх різних інструментів. І там не набагато від них. Якщо ви використовуєте цифровий аудіо робочої станції, як Ableton Live або Pro Tools, є неймовірно широкий діапазон синтезаторів і VST інструментів. Але стандарт MIDI тільки має кілька, або кілька десятків. І деякі з них смішні. Я думав, що це буде весело, якщо ми грали інструмент інструмент MIDI- Вертоліт, а потім Наступний спосіб раунду, ми зробили майданчик синтезатор, а потім це банально провідний меандр синтезатор, а потім висловити мул, які є трохи нечіткі на мій поганий MIDI синтезатор, але вони ОК. І тоді ми бачимо, цей Нехай і в синтаксисі з Haskell, а потім ми граємо всі ці частини разом з оператором паралельної композиції. І ми могли б, ймовірно, покажуть деякі з цього. Ось код. І ви можете бачити в C, тобто був би багато очищення горла і установка Код таблиці перед вами може зробити музику, як це. Або будь-який інший програмування мову, ви, ймовірно, повинні взаємодіяти з якоюсь бібліотеки або API, і встановити все, і тоді вам доведеться прибирати. Але тут, в Haskell, я думаю, що, як тільки ви отримаєте повісити його, неймовірно читається і дуже виразним. Так що реалізація з Frere Жак. Добре. Тепер ми хочемо, щоб додати ударні, і це трохи брудніше. Отже, давайте поглянемо на слайдах. Таким чином, велика ідея, щоб зробити купа списків або їх частин. На цих машинах Пересувний є були, як правило, може бути, вісім про 10 ритм ударних або частин. І потім використовувати зв'язку методів. І ми говорили про these-- допомогою складок, фільтри, лямбда функції, відображається над списками для генерації значень в деякому діапазоні від 1 до г, г 16, або 32 кроків у секвенсорі. І потім, якщо є значення в цьому списку як ми біжимо через секвенсор, проходить через нього знову і більш, виявляється на цій ноті, і що зразок спрацював. Ось всі різні дивні способи Я придумав для генерації примітки. Спробуйте це на свій страх і підлозі суми. Це звучатиме круто. Якщо дозволить час, ми будемо проходити через це. Але зараз, я думаю, ми повинні демо, що у нас є. Будемо сподіватися, що це йде ОК. Так що це GHCI. І ми будемо завантажувати файл Я назвав song.lhs, що файл я тільки що показав вам. ОК здорово. Як сказав Коннор раніше, складений, його тип встановлений, так що я можу дихати набагато легше. Це не збирається підірвати на мене. Я хочу показати вам щось корисне. Ви можете бачити, що Модуль завантажений називається 50. Ви можете переглянути цей модуль. І це так приємно про doing-- можливо, що ви робите в Haskell НЕ називається розробка програмного забезпечення, але ви можете зробити багато забавний матеріал на свій розсуд. І робочий процес насправді добре, як в порівнянні з багато інших мов, тому що ви можете побачити в дійсно читаний спосіб, що відбувається. Таким чином, ми бачимо, що у нас є всі ці фрази, які списки музичних майданчиках, і тоді ми побудувати ці вгору в щось більше, яка представляє собою музика пісня. Це музичний блок. І тоді ми можемо грати все це з функцією називається грати музику. Ви можете бачити, що тут. Який просто грати. Я повинен say-- я не говорити про це знак долара, що скрізь. Долар знак іншого оператора інфіксной. Але він має найнижчий пріоритет будь-якого оператора, який ефективно означає, що всі на Зліва від знака долара і право на знак долара, ми збираємося, щоб оцінити до нього. Так що це ніби як другий спосіб додавання дужки. Коннор Харріс: Це в основному композиція функцій. І це гарантує, що ви не have-- якщо у вас є функції небудь сторону або Інфікси Оператори по обидві сторони, вони не будуть зв'язати по ньому і дати вам несподівані результати. СТІВЕН KREWSON: Таким чином, ми can-- використовуючи, що ми можемо назвати. По-перше, ми будемо грати без барабанів. Це вертоліт, міді вертоліт. [Грає музика] Там же меандр. Голос мул. І ви дійсно можете йти дикої природи з цим. Я вибрав досить простий, тому що я знав, я не повинен відкусити більше, ніж я міг жувати. Просто тримати його досить просто показати основні ідеї. Але тоді я був як, ми отримав додати на барабанах на це. Просто тому, що це трохи непроникною, і я не використовувати Назва барабанних партій, Я відображаються them--, тому що вони частина перерахованого класу, Я відображаються їх цілих чисел. Одним з них є, як бас-барабана. Нуль також. Сім висока капелюх. І ось тут, де Функції отримати трохи більше випадкових, це як конго барабани. Так що, якщо ви думаєте, може бути, about-- цікавий спосіб реалізації драм-машину є використання дуже організовано візерунки на вашій бас-барабана. Так, наприклад, на фільтрації над Список з усім, що дає назад 1, коли він узяв модуль 04. Так що я отримати 1, 5, 9, 13, 17-- так що це перший удар кожного такту. І тоді це те ж саме річ перейшла двох кроків. Так що це незвичайний. Так що це буде щось на зразок високому капелюсі. І знову ж, тут, це трохи випадковим, бо ми робимо Конга барабани. І у мене є деякі маракаси сюди, теж. Так що я міг подзвонити відтворення драм-машини, але вона буде йти вічно, і він може почати захоплення до вся пам'ять в моїй системі. Так що я буду називати цю функцію грати музику, яка, як ми побачимо, використовувати усічення паралельної композиції грати наш маленький Frere Жак пісню поряд з цим дивним драм-машини. Отже, давайте поглянемо. І, будь ласка, поліпшити мій розташування всіх частин барабана. Не моя спеціальність, але я було багато веселощів робить його. [Грає музика] Тому, звичайно, це все трохи не так весело, якщо ми не можемо перетворити його в рахунок, так, може бути, це може бути витлумачено по виконавцю людини. Тому я не буду працювати тут. Я вже згенерували файли. Ви можете бачити, що є точка LilyPond file-- і це буде мій Segue до Connor-- і файл MIDI точка, і крапка у форматі PDF файл, який є що LilyPond, в кінцевому рахунку призвести. Але це ті сценарії, і я буду просто запустити їх з варіантами допомогу. Якщо ви отримуєте ці та працює з Euterpea, ви можете генерувати MIDI файл. А потім з MIDI-файлу з цією програмою MIDI-2LY, Ви можете створити Лілі Ставок файл, а потім ви може генерувати PDF партитури. І ми повинні поглянути на це. Так Коннор, ймовірно, покажуть Ви, як коментувати це краще, але це, як Жак Frere генерується мною в Euterpea. Це просто в C. Я повинен зрозумів з того, що зламати це насправді в. Але це трубопровід для як це робити, з цим. Давайте більше поговорити про LilyPond. Коннор Харріс: ОК Давайте подивимося. Хіба ви згадуєте Дізнайтеся у вас Haskell? СТІВЕН KREWSON: О, так. Перевірте навчить вас Haskell. Це в ресурсах. Ось як я почав навчання, і це здорово. Чи не тупий навчання. Коннор Харріс: Так що це в Інтернеті. Таким чином, хлопець на ім'я [нерозбірливо] learnyouahaskell.com, без пробілів. Граматика хворий. СТІВЕН KREWSON: Це ілюстрований теж. Коннор Харріс: Так що LilyPond? Це декларативне програмування мова музики верстки. Так declarative-- ви можете думати про такі речі, як HTML, де ви не saying-- HTML не сказати, як веб-браузери повинні роблять сторінки крок за кроком. Це просто кажу, що це це текстовий опис що ви хочете, щоб сторінка виглядати. І тоді це також програма що компілює цю мову, або прочитати його після прибуття, а потім фактично робить верстку для вас, і він випльовує їх прекрасні дивлячись забиває PDF. Ви також можете отримати формат PNG або щось. Хороший спосіб думати це за аналогією є те, що латекс начебто LillyPond, але тільки звичайної верстки. Таким чином, замість of-- це не WYSIWYG, що ви бачите Що ви отримуєте, як, скажімо, Фінал є, або Сібеліуса, або Microsoft Word, де ви можете ввести в режимі реального часу і проекти речі в реальному часі і побачити зміни миттєво. Це текстовий. Ви повинні cкомпілювати оцінки, що використовують окрему програму і вийти PDF-файлів пізніше. Це трохи менше, зручно для використання, якщо ви намагаюся написати безпосередньо в рахунок, і ви намагаються скласти на комп'ютері. Але є багато переваг для нього. Один з них, це виглядає набагато краще, бо насправді LillyPond може взяти час, щоб зробити компонувальних рішень належним чином, на відміну від Сібеліуса або Finale, які мають зробити зламаних алгоритмів так що вони можуть відображати речі в режимі реального часу. Так чому LilyPond-- комп'ютерна графіка важко. Якщо ви робите що-небудь з музикою і ви хочете, щоб написати оцінки, Ви не хочете, щоб написати з все самі починаючи з як малювати штаби і як малювати. блокноти Це дуже важко. Це було зроблено раніше. Ти в порядку. Якщо ви хочете використовувати Finale або Sibelius, формати файлів для тих речей, дуже складні, і ви не можете реально використовувати їх програмно. Ви можете відкрити Сібеліус з Finale і перейдіть в меню Файл, Експорт у PDF самостійно, але ви не можете дійсно назвати це зі сценарію. LillyPond, ви можете зателефонувати від цих скриптів. Ви можете легко перебирати LillyPond латексом. Я не так багато часу, щоб піти в цих технологій прямо зараз, але вони існують. Якщо ви хочете подивитися в книзі LillyPond, це програма, яка поставляється з Ваш дистрибутив LillyPond, і це для перебору LillyPond фрагменти в LaTeX якщо ви хочете зробити щось як великий музикознавство документа з прикладами, наприклад. І це хороший навик для життя, якщо ви робите що-небудь з музикою, а не тільки CS50. Я використовував LillyPond для всіх з моїх проектів складу так як я був в основному старший в середній школі. Так ось деякі прості приклади. Це, в основному представник рівня складності що більшість людей буде очі вони намагалися використовувати LilyPond для простих проектів. Цей перший початок в Хоральна прелюдія Баха. Це нижня уривок від одного з моїх власних робіт, і це тільки там, щоб показати ви такі речі, як [нерозбірливо] покласти кілька рядків у тому ж персонал, як лірична undersetting працює. Лірика підкладки є річчю, що дуже простий у використанні LilyPond в хоровій музиці. І так, тобто дещо більше складні приклади тут. Все це робиться в LilyPond і вони можливо. Це перше витримка від [Нерозбірливо] по [нерозбірливо]. І це [нерозбірливо] з п'єса для сольного бас флейта [нерозбірливо], який є longtime-- які був давній членом музичний відділ тут, я думаю. Я не впевнений, де він пішов у. Але він був радником Гарвард Асоціація Композитори протягом тривалого часу. Чудова людина. І він пише музику, яка має дуже складний позначення, що LillyPond тим не менш, може працювати з дуже красиво. Так що просто дати вам відчуття того, що Можливості Ця річ are-- так нутрощі LillyPond дуже складні. І ви можете використовувати його для довгий час, у тому числі для деяких досить складним речі, насправді не знаючи про них багато. Але основна ідея в тому, що на низький рівень, атоми LillyPonds є ноти. Примітки містять контекстні звані голосу. Так контексті голосової в основному відповідає до однієї лінії поліфонії. І тоді контекст може бути містяться ієрархічно в більш високих рівнів, що представляють штаби на рахунок або більш великі угруповання, як фортепіанні штаби або хор штаби, і потім в кінцевому рахунку цілі контексти оцінка. І ви можете насправді охоплюють кілька балів у книзі. І кожен контекст має Кількість вкладених граверів. Якщо ви подивіться через Зміст контексті і роздрукувати певну символ або певний клас символів, як це необхідно. Таким чином, щоб кожен контексті голосової, є [нерозбірливо] зауваження різьбяр, що є в основному функцією або об'єкт, який виписує все відома голови на правій частині сторінки. Тоді є ущелина гравер, який виписує ущелини на персонал. Тоді є метроном Знак гравера, що виписує метронома знаки в рахунок. І все це вписується в значній а в ієрархії. І це дуже, дуже, дуже настроюється, що вам потрібно якщо ви хочете, щоб отримати такі речі, як, що. Таким чином, всі контексти мають багато різних атрибутів що ви можете змінити на всі від відстані до різних шрифту Вибір розмірами речей. Якщо ви хочете, щоб зробити ще більш складні речі, є вбудований скриптова мова. Вони використовують схему, яка це діалект Lisp. Вони, ймовірно, не значить тобі що-небудь. Але в принципі, схема другий функціональний Мова програмування, більш-менш. СТІВЕН KREWSON: Краватка в. Коннор Харріс: Так. Це хороший краватку-во, я вважаю. І він використовується в якості мови викладання, насправді, вниз Массачусетс-авеню У Массачусетському технологічному інституті. І це дуже зручно для LillyPond з різних технічних причин. І тому, якщо ви хочете, щоб просто хитрості, залежні від умовних, для example-- є певна Стан рахунком, який зустрівся, внесення змін до макет або whatnot-- то ці об'єкти є. Вони складніше. Так от досить простий приклад коду. Це п'ять ліній. В принципі, я визначаю два киї. Це в 3/4. Перший склад має додається темп знак, але це насправді відбувається перейти до всієї рахунок, бо темп марок знаходяться на рівні рекордів. Метроном знак гравер прикріплена забити контекст. Є різні ключі, бо [нерозбірливо] гравера додається штаби. Ви дійсно можете зробити, це. Зразок я написав це насправді в мажор, але це просто продемонструвати ви можете мати різні ключі в різних штабах. І основний синтаксис ви пишете зверніть увагу, імена з E, F, G, який. Якщо ви хочете зробити випадковості, Ви суфікс чи ES. Це від голландців музикознавчих конвенцій. І зробити октави стрибки, ви повинні використовувати це відміток, кому або апостроф. Відносна просто означає, все, що ви є замітка, він буде автоматично plaec в октави ближче до попереднім. І якщо ви хочете, щоб стрибати більше, ніж fifth-- сказати п'ятий чи more-- то ви повинні використовувати [нерозбірливо]. Але в іншому випадку, ви не повинні вказати октаву кожній ноті. І відносно С, прем'єр і С, ви просто вказати середній C і підстава С, особливо перші ноти. Тоді у вас є ці штаби, які організовують ці два голоси або зразки музики, і у вас є рахунок. І, що виглядає це. Якщо ви хочете, щоб зайняти час, щоб скопіювати цей зразок LillyPond Код на попередньому ковзати вниз тут, і ви можете написати його на LillyPond самостійно. Я знаю, що у нас є щось що виглядає багато, як це. Так що ще одна технологія називається Музика XML підтримується зовсім інші люди. XML є текстові дані structure-- я не повинні говорити дані structure-- сказати Метафора карту роду. І він призначений для зберігання ієрархічні дані дуже добре. HTML, наприклад, являє собою тип XML. І ви можете сказати XML, тому що вони була все кутові дужки і кут Кронштейн Слеш що поля показані дані. Я не є код Приклад з музики XML. Ви можете знайти його самостійно. В основному, причиною ви можете використовувати XML в якості проміжного етапу це, в першу чергу, це формат обміну для в основному every-- я не повинен сказати кожен, але багато різних рахунком письменники. Так що, якщо ви пишете в музиці XML, можна не тільки LillyPond читати за допомогою цього допоміжна Програма називається Music XML для LY, але також може читати Фінал це, Сібеліус можете прочитати його. Залежно від того, як внутрішній об'єкт Ієрархія працює для представлення музику, це може бути простіше виписати Муз XML, ніж у LillyPond і покладатися тільки на музичному XML щоб LY зробити перетворення. Я не думаю, що [нерозбірливо] має Music XML. СТІВЕН KREWSON: Це не так. Хтось працює над цим, хоча. Коннор Харріс: ОК. Euterpea не має Функція виходу Музика XML ще. Якщо ви хочете остаточне уявлення проекту, може бути, увійти в контакт з хлопцями що Стівен знає, і вони могли б використовувати вашу допомогу. СТІВЕН KREWSON: Я хотів би, що. Коннор Харріс: Крім того, в основному, кожні мови програмування що варто його солі вже має бібліотеку XML, так що ви можете конвертувати все всередині вашої музики в якийсь об'єкт що бібліотека XML можете написати що потребують менше зміни у внутрішню структуру за якою музика об'єкти, хочу написати, ніж писати його прямо в LillyPond б. Потім просто роздрукувати його з XML з XML-бібліотеки російською мовою, який буде гарантувати, що це синтаксично правильно, і все, а потім перетворити його в LillyPond. Таким чином, технології ви можете шукати в, якщо ви робите щось подобається це. [Нерозбірливо], інший auxilarry технології. Це в основному Tech Роботи або Технологія Студія LillyPond. Так він пропонує допомогу з Синтаксис, з шаблонами для різних загального комбінації приладів. Це дозволяє розділити екран перегляду так Ви можете мати свій код в одному вікні і PDF в іншому вікні і натисніть на місцях в PDF щоб перейти до відповідної плями у вихідному коді. Це більш корисно, якщо ви насправді написання LillyPond файли самостійно ніж якщо б ви генерації їх програмно. Але знову ж, це то корисно мати. Відмінно. Ще resources-- я просто пройти через це дуже швидко. LillyPond manuals-- LillyPond має відмінна документація на своєму сайті. Вони є підручник. Вони мають посилання синтаксису. Вони мають сотні фрагментів для різних дрібних речей років, можливо, необхідно зробити, щоб продемонструвати різні можливості. Якщо ви хочете використовувати скриптова мова або зробити більш обширний настройки, тобто внутрішні посилання на цьому URL. Якщо ви хочете використовувати музичний XML, є що URL-адресу, musicxml.com/tutorial. І потім, якщо вам потрібно дізнатися схему тому що ви насправді хочете використовувати створення скриптів в LillyPond, тобто [нерозбірливо] називається Структурована Інтерпретація комп'ютерних програм, який є не тільки другий Найбільше CS підручник ніколи written-- знайти мене потім, якщо ви хочете знати, що я думаю, найвеличнішим is-- але це також дуже хороший введення в мову правильною. Вам не потрібно буде більше, ніж перші кілька розділів. І це все. Які-небудь питання? СТУДЕНТ: Де я можу скачати Ваш генерується Frere Жак так що я можу поставити його на айпод? СТІВЕН KREWSON: Ну, ви можете написати до якоїсь файл WAV в Euterpea. І у вас є код. Це на GitHub. Зробіть свої власні варіації Frere Жак з CS50 колективного розуму. Це було б здорово. Коннор Харріс: Хто-небудь ще? СТІВЕН KREWSON: Ми повинні краще бас-барабан, теж. Це дійсно погано. СТУДЕНТ: Euterpea має не тільки сторона композиції, але signal-- СТІВЕН KREWSON: Так. Насправді, робота, яку я зробив у Euterpea, коли я взяв this-- є аспірантуру в Єльському університеті, що використовує it-- був на синтез звуку. Так що це дійсно хороший спосіб за допомогою стрілок і деякі позначення ми бачили складаючи разом функції сигналу. Зокрема, бас для більшості з них всього лише простий синусоїди. Але якщо ви почнете складати тих, в дивних програмних способів, Ви можете зійти з розуму звук ефекти, такі як дивні каскадів. Ви можете створити дуже твердий звучить з великим модуляції. Я зробив проект по гранульованих Синтез, який десь між FM та відбору проб. Ви берете дуже мало, маленькі зразки, а потім об'єднати їх з якоюсь модулятор і створити багатий звук. Ми також зробили фізичне моделювання, так намагаюся думати про фізику і Психоакустика щось на зразок труба, і думати про те, як звук відскакуючи дзвін труби і акустика номер і моделювання що з основними генераторів. Коннор Харріс: спасибі. Дякую, що прийшли. І я завжди готовий на питання по email-- connorharris@college.harvard.edu. СТІВЕН KREWSON: Так. stephen.krewson@yale.edu. Прохолодний.