Конър HARRIS: Здравейте. Аз съм Connor Harris. Аз съм CS50 CA в Харвард. СТИВЪН KREWSON: Аз съм Стивън Krewson. Аз съм TF за CS50 в Йейл. Конър HARRIS: И ние ще говорим за някои технологии, които може да искате да използвате, ако проявявате интерес по този краен проект или наистина нещо с музика. Отиваме да се съсредоточи върху първата по- език за програмиране, наречен Haskell. Това е функционалната език, така парадигмата е много различен от C или PHP или други наложителни езици че сте използвали вече, и по-специално на библиотека написана на Haskell наречено Euterpea, които могат да помогнат на хората с написването на музика функционално, основно. И Стивън ще ходиш чрез един чудесен пример за това. След това, аз ще ви запозная с нещо, наречено LillyPond, които е технология за наборен музика. Това е нещо като LaTeX за музика, ако някой от вас Използвал LaTeX за математика класове или други P комплект класове или това, което имате. И така, аз ще ви дам, отново, Примери на някои прости, че и ви насочи в генералът посока на някои по-добри средства. СТИВЪН KREWSON: В Освен това, ние го помислих ще бъде готино да се създаде малко съвети към тръбопровод между Euterpea генерирано MIDI файлове в LillyPond, затова ние предлагаме някои инструкция за скриптове да се направи това, че са снабдена с LillyPond само за да я държи с отворен код и ще получите газопровод ще. Конър HARRIS: Отново, ние трябва да се подчертае, тези две технологии, ви не е нужно да ги използват заедно. Те не са проектирани да работят заедно, въпреки че те се справят много добре. СТИВЪН KREWSON: Точно така. И напълно безплатно. Конър HARRIS: Значи потвърждения, просто прочетете това. СТИВЪН KREWSON: Надлежно отбележи. Благодарение на тези хора. Това ще се проточат само за миг. В процеса на инсталиране е малко по-сложно. Ние сме един ми прочете на GitHub че можете да да разгледаме. Просто ми пишете, ако имате някакви въпроси. Но ние ще изпълня този при допускане че това е работа за всеки. Конър HARRIS: И ако не можете да получите LillyPond да работи, не е голяма работа. Няма по-живо компилация, че ще бъдат включени, поне в моя край. СТИВЪН KREWSON: Haskell и LillyPond трябва и двете имат монтажници. Euterpea е изтеглена като пакет, така нататък и така нататък. Така че ние не говорим за компютърна музика. И това е само един много изглед 50 000 фута. Има няколко различни аспекти от него. И това е груба и е ще закрие някои подробности. Но можем да измислим нещо като алгоритмична състав, използвайки алгоритми, използване на код, за да генерира някакъв вид of-- може би самоподобен поредица от бележки, или може би бележки под някаква принуда. И тогава тези, които биха могли да бъдат извършва или тълкува с аналогови инструменти или нещо подобно. Но състава е направено алгоритмично. Но, разбира се, може би областта на компютърна музика или цифрова музика ние сме по-запознати с е цифров синтез на звук или цифров вземане на проби и цифров запис. Много от дигитални инструменти са осъществява чрез цифрова извадка. В действителност, ние ще се използва един от тези в под формата на стабилна библиотека шрифт по-късно. Но има и нещо, наречено цифров синтез, които се появиха от края на 70-те и 80-те в с Yamaha и Джон Chowning в Станфорд правене на FM синтез или Синтез честотна модулация, където имаше носител сигнал и модулиране на сигнала както в аудио спектър. Но това, което ние сме фокусирани върху днес е нещо, наречено MIDI, и разбира се, алгоритмична състав. Ние няма да се уреди, но ние, вместо да става да се направят някои музика, и след това ще се интерпретира от някои инструменти, които са Съответстващ на обща MIDI стандарт. Така че това, което е MIDI? Аз няма да се получи прекалено дълбоко в нея, но MIDI е протокол за предаване на данни. Това е един вид наръчник цяла различни компании и индустрии за организиране на звуци или петна. Така че ние ще видим, че има стандартен MIDI за всички различни ударни инструменти звуци и препоръки MIDI за всички различни видове синт или различни видове всички инструмента групи в един оркестър, казват. Вие вероятно сте запознат с 0 до 127 MIDI съобщения. A MIDI сигнал е типично един бит показва независимо дали става дума за данни или Статус на пакети, а след това има седем бита на сигнал. И това може да контролира всичко от обема на действието или налягането за конкретен ключ ако се представят с MIDI контролер, както и, разбира се, бележки. И разбира се, има MIDI била изключително полезна, защото това е начин да се жица заедно или последователно свързване куп MIDI хардуерни устройства. Имам седем или осем обратно в къщата ми. Той получава много сложно, но това е наистина мощен. И това е много стар. Това е от началото на 80-те години, и това е много хубаво и малки. Конър HARRIS: Да. Всички класически Nintendo видео игри, ще вероятно имат MIDI файлове за музика, например. СТИВЪН KREWSON: Ето един Например от общ MIDI, показващ MIDI като един вид на общ протокол. И мисля, че можем да мислим за разлика между спецификацията че трябва да има нещо подобно тези инструменти звуци и действителната реализация на тези инструменти звуци в звука на шрифта или конкретен MIDI синтезатор като разликата между може би typeface-- която казва, като цяло, това е проектирането на този конкретен начин да представлява characters-- и конкретен шрифта че има определен размер и тембър, а има и реализация на the-- Конър HARRIS: Може би добро сравнение, ще е стандартът Unicode says-- тя дава номер на всеки герой, и наистина всеки език в света, или широк набор от скриптове на език в света, а след това са постановено в нещо графично от различни пакети с шрифтове. И очевидно, можеш да се сетиш MIDI като Unicode на звука. И това е просто един списък of-- голям поток на събития и инструменти и какво ли не, и вие трябва да имате отделна програма, като шрифт, да се направи, че в нещо, което е доловимо. СТИВЪН KREWSON: Така че, защо Haskell? Haskell е функционална програмиране език, много напреднал, много по-различна от С, много по-различна от PHP. И ние ще видим, че има един лекота на функция състав в Haskell която ще ни позволи да бриз през композиране или пишете до, записване, нещо като Frere Jacques, тази проста песен, която има много части в него, че самостоятелно подобна или повтаряне. Така че това ще бъде част от мотивацията за това защо ние използваме Haskell, в която функции са граждани първокласни. И аз исках да се удължи това е малко. Това е малко по-лесно да се отбележете Frere Jacques в Haskell. Но какво, ако искахме да добавите барабанна част към него? Какво става, ако искахме да се опитаме да направим нещо като Roland 808 или 909 барабан машина, където трябва около 16 различни стъпки? Обикновено това са мисли като 16-ти бележки. И вие можете да контролирате глобалното темпо, и можете да избирам куп различни ударни части на бас барабан, а пляскат, различни примки, отворени и затворени високи шапки на тези вид на канали, и след това можете да EQ или коригира обема им. И ние ще видим добър начин в Haskell на представляващ тази стъпка секвенатор с всички различни готини неща в Haskell можем да направим с генериране списъци и филтриране над списъци, картографиране над списъци, картографиране функции над списъци. И един бърз извинение. Това е един много бегъл и прекалено бърза скица на някои от аспектите на Haskell и Euterpea, който е специфичен домейн- вграден език писмено в Haskell за музикални видове. Така че, моля да проверите кода онлайн. Пожар GHCI, което е най-Glasgow Haskell Compiler Interpreter. И аз ще се правят някои за това в малко по- така че можете да видите как се прави. И това ви позволява да се зареди с the-- синтаксиса е дебелото черво и след това командата. Можете да заредите във файлове. Можете да използвате разглеждане на тези файлове за да видите всички функции, които съществува в даден модул. И тогава, както ще видим, видове и тип класове са толкова важни в Haskell, така че винаги можете check-- особено ако работите в нова DSCL по този начин, това, което е вид музика? Аз знам за начин цифрено типове работят в Haskell, но аз не знам много за музиката. Но можете да се запознаете на начина, по който сме определено с помощта на този тон или тип команда и след това се поставят под определен функция или обект от данни. Конър HARRIS: Да. Ако си мислите, C и трясък беше hardass за видовете, вие нямате представа за Haskell. Хубавото е, че Haskell ако можете да получите вашия код за съставяне и ако проверките тип Haskell, това е може би прав, защото системата тип е толкова строг. СТИВЪН KREWSON: Да. Така че аз просто искам да отида through-- и отново, това не се прави това, той justice-- няколко от характеристиките на Haskell, че най-малко да си creators-- и то е създадено в края на 1980 с един куп хора, комисия от около 20 people-- помисли бяха важни. И първото нещо, което изброени в статията, че описано генезиса на Haskell През първите 20 години, или така е, че е мързелив. И така, какво означава това? Е, това означава, че когато имаме някакъв вид на изразяване, ние трябва да го оцени. И Haskell прави това по време на разговор от нужда начин или не-строг начин. Това е, ако имаме куп ни компоненти на изразяване, ние се опитваме да се забави оценката на тези съставни до абсолютната миналата minute-- че е, докато ние всъщност се нуждаят от тях. Така че това, което е means-- наистина страхотно, особено ако си мислиш за черпене на музикална стъпка секвенсер. Можете включете го, и да започнете използвате стъпка sequence-- ако някога е работил с барабан machine-- и то просто отива завинаги. Така че би било много хубаво, ако можем може да подражават, че в Haskell. И ние можем да го направим с безкрайна стойности, по-специално на безкрайни списъци. Това е много лесно да напишете безкраен списък в Haskell. Можете просто да се използва синтаксисът надолу тук, където ще видите от 1 до 3, извадете 3 1 точка точка, и това е един безкраен списък на всички природни номерата на разширяване за толкова далеч, колкото можете да си представите. Искам да се въведе концепция на гънки веднага. И пак, с цел на този семинар, не е да се запознаят с гънки в Haskell или по-високи функции ред. Но аз просто искам да го представим на дават точна чувство за колко странно Haskell е и колко мощен е той. И по-специално, ние ще be-- Когато правим нашите различни барабанни части, ние ще трябва да се манипулира списъци на числа, сгъваеми им един върху друг. И за да направим това, ние ще да се използва карти и гънки. Има право асоциативен кратно, което е това едно право here-- 1 минус количеството, 2 минус количеството, 3 минус 0. И синтаксиса за кратно, ви даде кратно базова стойност и тогава operation-- в този случай, прибавяне или изваждане. Аз бях показан двата случая. И след това има акумулатор, че натрупва над целия списък, прилагането на този оператор на плюс или минус, а след това натрупване. Така че това ще бъде the-- ако тя се нарича с кратно г плюс 0, като се започне с 0, тогава ние ще обобщим всички числата в този списък. И това е списък от 1 до 3. Конър HARRIS: Така да го кажем по друг начин, кратно г отнема три аргумента. Има една функция, която Самата отнема два аргумента, тогава там е на стойност стартер, а има и списък със стойности. И това, което правите е да приемете стартер стойност, първа стойност, сложете ги в функцията. Какво искаш да се измъкнем, вземат това, че фуражите в функцията на втора стойност, която можете да се измъкнем, вземе, че се хранят, че в функция на третата стойност. И тогава, ако сляза Целият този списък по този начин, започваш да се получи в крайна сметка някои особена стойност, която е от същия вид на това, което сте започнали с и от същия вид тъй като нещата в списъка, а след това това е в резултат на връщане кратно R. СТИВЪН KREWSON: Така че по-специално, те са по-високи функции за поръчки, защото те са като друг функция като един от аргументите. Конър HARRIS: Да. Ако сте използвали някои други languages-- Знам R, [недоловим] език има тази, наречена Намалете. Може да се наложи подобни функции и на други езици, що се обади различни неща. СТИВЪН 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-- като вземе в която се казва, OK, ние сме генериране на този безкраен списък, но ние просто ще отнеме известно брой го И в този case-- ние ще видим това по-късно в нашата дръм машина code-- GM е просто някаква глобална променлива за броя на стъпките в секвенатор. На машините ролетни в I ти показа, че това е обикновено 16, но съм го реализира с 32. Това няма значение. Haskell е и чисто, така че има силна статично типизиране, че Конър намекнато. Така функции са математическата в sense-- те са по-математическата че те са гарантирани да не влезете или да промените каквито и да било променлива или да извърши вход или изход. Така че, ако имате функция, това е детерминирана. Тя винаги ще се върне на същото стойност в състоянието на програмата или остават същите. Има, разбира се, изключения монадно ' към това, но това е извън нашия обхват. Конър HARRIS: Да. Какво означава това, обаче, е налице са няколко важни [недоловим] последици от това. Един от тях е, че това е много лесно да се паралелизация Haskell програми. Защото, ако имате, се каже, че е функция на трябва да работят на един милион стойности, ако знаете ли, че функцията винаги ще дават една и съща стойност, ако те храня в определен value-- ако сте [недоловим] е на 1, е от 2, след това е на 3 или whatnot-- е на 1 няма да се напише във файл или да се направи нещо че да промени стойността на F2. Можете просто да разделим тази функция на милион различни машини или милион различни теми, или каквото и да, получите всички отговори обратно, получите всички стойности на връщане гърба, а след това е всичко. Така много лесно да паралелизация неща. Недостатъкът е, че входния и на изхода особено вписват в системата за типово в много сложни начини. Ние няма да отида в, че точно сега, но аз Приканваме ви да разгледаме някои ресурси онлайн, ако искате да научите повече за това. СТИВЪН KREWSON: Значи Типове classes-- и това was-- класове видове са измислени, за да се реши проблем на оператор претоварване. Така че ние искахме да има равенство между различните видове неща. Разбира се, бихме могли да мислим of-- равенството между числови типове Много е лесно да се мисли за това, но какво да кажем за равенство между списъци? Какво ще кажете за равенство между дървесни структури крака данни? И всичко това е възможно в Haskell заради тип класове. Така че, ако определят някакъв type-- данни и тук, това са музикални терени. Ние сме най-накрая става до известна компютърна музика. Така че ние имаме C, C остър, и така нататък и така нататък. Те принадлежат към един куп различни класове тип. EQ-- те принадлежат към класа на типа EQ. Това означава, че те подкрепят операции на половете. Така че можете да се прецени дали една поредица от музикални примитиви е същата като друга. Те принадлежат към поредния клас. Това означава, че има една поръчка за тях. D идва след C. C рязкото идва след C, както добре. Те принадлежат към класа покажем, което означава, че могат да бъде отпечатан на конзола или терминал. Те принадлежат към клас изброени, които означава, че въпреки че това са знаци, те имат в основата на цифровата представителство, започващи от 0 и излизането през обаче много неща са тук, 20, или така, или 30 или 40, може би. Конър HARRIS: И когато имаме тип данни че derives-- с тази ключова дума "deriving--" определен клас тип, това означава, че компилаторът ще се опитам за конструиране нещо автоматично. Така че може би ще искате да дефиниране на качеството по различен начин. Вие ще искате да се определи C рязкото като равен на D плоско, например. С тази конструкция тук, аз не мисля, C рязкото и D ще бъде равен плосък, защото компилаторът автоматично ще рекат, всеки различен възможна стойност е различен от всеки друг. Така че е възможно да се наложи над реализации по подразбиране на тези видове класове. Отново, погледнете позоваването ако Ако искате да научите за това. СТИВЪН KREWSON: И тук, в действителност, това ще да бъде от полза за по-късно, когато се кодира. Виждаме някои от операторите инфикса за пореден състав, успоредно състав, така и назад, тези плюсове и равни знаци заобиколен от колони. Това означава, че можем да играем тези различни музикални примитиви един след друг. Това е пореден състав. Или можем да ги играя в успоредно в същото време. Така че мога да имам музикална стойност, и след това се равнява и колони, инфикса паралелно оператор състав, и да ги играете като един вид акорд. И ние ще използваме това, когато ние комбинираме нашата барабанна част с нашите Малко Frere Jacques песен да играят тези две поредици от музикални стойности в същото време. Козина is-- Curry последно Име на Haskell Къри, които изображението Haskell е кръстен. И това ни позволява хубаво елегантност, когато сме писмено всички тези различни функции или филтри, че ние сме Ще бъде картографиране над нашите списъци. Функция на две arguments-- е на х и y-- може да бъде представена като е от X прилага Y. Така че това е функция на един аргумент, който се връща друга функция на един аргумент. Така че това означава, че ние може да присвоите функция е на х над списъка на у му. Конър HARRIS: Искате ли да дам един пример за това? СТИВЪН KREWSON: Да. Имам един пример тук от някои от нещата, които ще пишат. Така репликира 2-- добре, репликира ще вземе една стойност, която е колко пъти, за да възпроизвеждат нещо, и след това ще отнеме value-- Обикновено списък или нещо такова. Така че тук, ние сме картографиране репликира 2 над друг списък. Така че, ако ние карта репликира 2, ако ние репликира 2 се прилага на първия елемент на тази list-- и това са списъци на музикалното phrases-- ще произвежда два от "можете sleeping--" така спиш, спиш. Така че сега ние имаме две. Но точно копие нужни двама аргументи, а защото ние сме козина и след това картографиране, ние може да представлява точно копие 2 като са били върнати, като функция на една argument-- просто имитиране на два пъти. И тогава ние кандидатствате, че на всеки елемент от този списък на фрази. И Concat е Haskell операция за изправяне списък. Защото точно копие 2 воля съставят списък на списъци. И това е тази междинна форма тук. И така, тогава ние можем да CONCAT или изравнявам, че два пъти. Конър HARRIS: По-прост пример на кожи, ако искате да си представите е like-- е просто умножение функция, която използва две аргументи и връща техния продукт. Така че, ако имате е 4 5, това е 20. Но може да се мисли за това като also-- имате функция е 4 че приема аргумент, и се връща четири пъти тази argument-- просто частично приложение, което само един аргумент 4. И ако се хранят е на 4 5, която ще ви даде 20. И това е по-прост пример на кожи. Това е обикновено един от тези учебници. СТИВЪН KREWSON: Lambda изрази или анонимни функции са друг Haskell отличителен белег. Така че, ако ние трябва да привличам функция малък живот копие, но казват, че не е в стандартната библиотека, можем да използваме синтаксис подобно на следното. И ние ще бриз над това. Едно нещо, което вие ще видите много в дръм машина се правим на повиквания до нещо, наречено филтър, който като преди, е картографиране на функция над списък, но това е картографиране на булева функция. Така че ние имаме тук един пример на едно анонимно дефинирани Булева функция, която просто отнема няколко стойности. Това не е точно казано анонимна функция. Но това е да определи с че синтаксис за краткост, и това просто отнема х модул, N- Конър HARRIS: Да. Така е е функция на два аргумента п и р която връща функция, която от своя страна е функция на един аргумент, а именно х. СТИВЪН KREWSON: I горепосочените оператори инфикса. Какви са инфикса оператори? Е, инфикса оператори са на нормален начин ние представляваме операции, се каже, в mathematics-- 2 плюс 2 вместо оператора плюс и след това два аргумента 2 и 2. Конър HARRIS: Тя се нарича обратен полски нотация, която е термин, аз се съмнявам някой от вас да знае. СТИВЪН KREWSON: Точно така. Обратните Полски или префикс нотация. Но Haskell реши да използвате инфикса оператори. Така че това са някои от потребителски тези, които са определени за Euterpea DSCL в Haskell. Така че това е пореден състав. Това е паралелен състав и този се съкращава паралелно състав. И ние ще се нуждаем от това Нашият дръм машина, защото ние ще използваме последната оператор, в това малко кортеж има да играе на барабана машината заедно Нашият Frere Jacques песен. И нашата дръм машина е ще бъде безкраен. Той просто играе завинаги. Но Frere Jacques песента не е така. Това не е толкова дълго. Това е само няколко бара. Така че ние трябва да се спре на барабана машина като Веднага след като по-кратък музикален стойност идва към своя край. И това infixed оператор е супер полезно с това. И въвирам нотация като това е вид хубаво, защото казват, че имате функция като цитат, който дава дивизия число от х от нещо else-- Съжалявам, че трябва да бъде и б. Можете да го напиша като цитат на б. Така че, ако put-- елемент е друг пример за това. х елемент по някакъв списък, ако сложите то в Backticks, можете да го използвате. Въпреки, че това не е символ като плюс или минус или времена, можете да използвате името на една функция като тази в Backticks като оператор пъхам, което е много готино. Конър HARRIS: Отново, това е просто синтактична захар, наистина. Това не засяга същността на език. СТИВЪН KREWSON: Така ние виждаме тук за последна фраза на нашия Frere Jacques песни, Играх някои малки акорди или трети помощта на паралелно състава оператор. Това е друг начин да се каже някои от това, което току-що казаха. Така че можете да карта функции на един аргумент над списъци. Конър HARRIS: Отново препратки за Haskell-- уводните учебниците ще имате всичко това в него. СТИВЪН KREWSON: Така че тук е доста ключова линия на крачка секвенатор ние ще разгледаме в използването списък с разбиране. И ние виждаме тук е, че елемент в фиксиран оператор в гърба кавички. Така че, ако X е елемент от списъка на х, тогава ние ще се обаждат PERC функции. Така Perc е просто функция перкусии. Отнема известно стойност стр това е част от ограничената набор от всички различните звуци ударни които видяхме в предишния слайд, и след това се дава, че продължителност на една четвърт нота. Иначе тя му дава QNR и QNR е само една четвърт нота почивка. Така че това е изграждането на нещо хубаво. Имаме списък с елементи, и ние ще контур по някои списък от едно до максималната стойност на нашата стъпка секвенсер. И когато сме на по-специално аз в този списък от едно до максималната стойност, ако това аз е член на тази съвкупност, създадена в тази функция, добре, тогава можем да го включите в перкусии бележка. В противен случай, ние просто играят почивка, която е да се каже, че ние просто мълчи. И ние можем да видим, че тук в този списък с разбиране синтаксис, х е населена с това списък конструирана една на световната размера на секвенатор. Конър HARRIS: Да. Основния синтаксис за списък схващания е скоба, стойност, включваща някои променливи, бар, възможни стойности на променливите себе си, затворена скоба. И ако сте направили избран строител нотация в каквато и да е математика клас, може да са създали такава 2n че п е в или п е в Z. Подобна thing-- тази бройна система е трябвало да бъде показателен на тази математическа нотация. СТИВЪН KREWSON: И вие можете да прилага множество предикати и множество филтри в списък разбиране, което е доста приятно. Алгебрична имоти-- ние Няма да се бавим дълго тук. Там не е добра идея в Haskell или добър, очевидно понятие за това как да се вземат, да речем, по подразбиране параметър на функция или нещо такова. В Python, това е доста лесно. Можете просто да се каже със равнява на декларацията на функцията, стойност по подразбиране в При нито се доставя. В Haskell, бихте могли може би използвате може би, може би тип, който взема или нищо или стойност от тип просто. Така че ние се възползват от тази в барабана машина за да ни позволи да се даде избор на обема параметри на всяка от частите барабан. Така, че ни дава начин да има EQ или обем на определен канал. Конър HARRIS: В други примери Haskell, Може да видите може да бъде използван за функции, които могат да се провалят. Това е една обща. СТИВЪН KREWSON: И вие можете да доставяме някакво съобщение за грешка, както е по подразбиране. И това е особено полезно, когато правиш на I / O в Haskell. Това може да бъде трикове. Конър HARRIS: Или за Подобен пример, мисля, на функция, която включва разделяне на параметър, който може да бъде 0. И тази функция би могъл се върне, може би нещо такова. Така че, ако има няма разделение с 0, тя ще се върне точно каквото. И ако има разделяне с 0, тя ще се върне нищо като начин за сигнализация грешката. Тъй като една последица от Много строг пишете на Haskell е, че няма real-- изключения са неудобни, общо взето, обработка на грешки е неудобно. И това е една много общ начин да го направите. СТИВЪН KREWSON: Така че сега ние получаваме до друго нещо, оказващ влияние за Haskell, която е модел съвпадение и функционални дефиниции. Аз ви показахме в последния слайд декларация за последователност стъпка функция, която пое може би стойност, След едно цяло число, а след това списък с цели числа, след това се връща последователност от музикални стойности има анотирани както с катран и обем. Така че тези три аргументи могат да бъдат модел съвпадащи по следния начин. И ние винаги искате да бъдете сигурни, за да направя база случай или при излизане на първо място. И тези долни просто може да се интерпретира да означава всяка стойност, която е там. Така че, ако ние ще ви се обади, за да се засили последователността с някаква стойност, някаква друга стойност, и след това на празна списъка, това, което искаме за да се върнете е само тишина, почивка 0. И вместо, че е празен списък или 0, това е една почивка 0, защото ние сме занимаващи се с типа музика, и празния списък на музиката тип е просто почивка на не по продължителност. Това не е музика. И тогава ние да видим дали можем да получите една стъпка последователност с обем за аргумент обем, р за предпазна мярка инструмент аргумент, а след това списък на х в. Тогава ние правим някои неща. По-специално, ние прилагаме този списък с разбиране, и ние да изпълнява някои операции на стойност може би да го превърне в числова стойност, така че След това могат да бъдат изброени и се използва за да изберете инструмента. Отново, това е малко по- битов умишлено inconcise само за да покаже всички странни неща можете да направите в Haskell, колкото да разгледаме това по свой собствен път. Всичко е наред. Така че ние сме най-накрая стигне до правят това, което ние тръгнахме да правим, която е да направи някои компютърна музика. Така че ние ще се опитаме да направи Frere Jacques песента. Така че има колко фрази в Frere Жак? Four. Страхотен. И това, което е хубаво е, че всички те са се повтаря същото количество от време, което е два. Така че ние имаме четири фрази всеки повтаря два пъти. И по-специално, те са в един кръг. И има много, много начини за изпълнение кръгла, че може да бъде забавно да се направи. Правил съм го в доста прост начин тук, която е само за да construct-- линията функция отнема списък на музикални стойности и тя се превръща в пореден състав чрез прилагане, които последователно състав оператор. И тогава аз се забави различните части като ги започне с почивка. Така че аз се започне с почивка от две мерки, и след това почивка от четири мерки, и след това почивка от шест мерки, а след това на кръг работи, както всички знаем, тази песен. Виждаме два анотации или модификации на музикални стойности които се съдържат в това последователно подреждане на музикални елементи. Имаме обем добавка. Това е функция, за да поясняват музика с определен обем. Това е един добър пример на сигнал бягане MIDI от 0 до 127, седем бита информация, която може да се проведе. И then-- го видяхме много Накратко, но общото MIDI списък на всички различни инструменти. И там не е цяло много от тях. Ако използвате цифров аудио работна станция, като Ableton на живо или Pro Tools, има изключително широк кръг на синтезатори и VST инструменти. Но само стандарта MIDI има няколко, или няколко десетки. И някои от тях са смешни. Мислех, че ще е забавно, ако играхме инструмента инструмента MIDI хеликоптер, и след това следващия път през кръга, направихме подложка синт, а след това на това сълзливо преднината квадратна вълна синт, и след това да изразят тиня, които са по- малко неясно за моя лош MIDI синтезатор, но те OK. И тогава ние виждаме това нека и по синтаксис от Haskell, и след това ние играем всички тези части заедно с паралелно оператора състав. И може би бихме могли да покажем някои от това. Ето кода. И можете да видите в C, щеше да има по- Много от гърлото клиринг и настройка кода на маса, преди да биха могли да правят музика като тази. Или всеки друг програмиране език, щеше вероятно Трябва да си взаимодействат с някакъв вид библиотека или API и настроите всичко, и след това ще трябва да се почисти. Но тук, в Haskell е, мисля, веднъж като получите цаката на него, невероятно разбираема и много изразителен. Така че там е изпълнението на Frere Jacques. Всичко е наред. Сега искаме да добавим и перкусии, и това е малко по-объркана. Така че нека да погледнем на слайдовете. Така че голямата идея е да се направи куп списъци или части. По изложените ролетни в машини, има са обикновено около може би осем 10 ритъмни или ударни части. И след това да използвате един куп техники. И ние говорихме за these-- използвайки гънки, филтри, ламбда функции, картирани над списъци за генериране на стойности в някои от 1 до R, R е 16, или 32 стъпки в секвенатор. И след това, ако има стойност в този списък тъй като ние сме минава през секвенатор, минава през него отново и свършила, тя се превръща в тази бележка, и че пробата получава задейства. Това са всички различни странни начини Аз дойдох с да генерира бележки. Опитайте го на собствения си полу сума. Тя ще звучи готино. Time позволява, ще мине през това. Но за сега, предполагам ние трябва демо, което имаме. Да се ​​надяваме, това върви OK. Така че това е GHCI. И ние ще се зареди файл Имам наречени song.lhs, която е файла аз просто ти показах. ОК страхотно. Както Конър каза по-рано, тя съставена, тя проверява типа, за да мога да дишам много по-лесно. Това няма да се взриви на мен. Аз исках да ти покажа нещо полезно. Можете да видите, че модул зареден нарича 50. Можете да разглеждате този модул. И това е толкова хубаво около doing-- може би това, което което правиш в Haskell не е призова за разработка на софтуер, но можете да направите много забавни неща по своему. И на работния процес е много хубаво като в сравнение с много други езици, защото можете да видите в един наистина четлив начин какво се случва. Така ние виждаме, че имаме всички тези фрази, които са списъци от музикални терени, а след това ние изгради тези нагоре в нещо по-голямо, който е музика песен. Това е музикално устройство. И тогава можем да играем всичко това с функция, наречена игра музика. Можете да видите, че тук долу. Което е просто да играя. Аз трябва say-- аз не говоря за този знак за долар, който е навсякъде. Dollar знак е друг оператор пъхам. Но това е най-ниската предимство на всеки оператор, който ефективно означава, че всичко от лявата страна на знака за долар и правото на знака за долар, ние ще се оценява преди това. Така че това е нещо като друг начин за добавяне скоби. Конър HARRIS: Това е основно функция състав. И той гарантира, че вие ​​не have-- ако имате функции от двете страни или въвирам оператори от двете страни, те няма сдружават през него и ще ви даде неочаквани резултати. СТИВЪН KREWSON: Така че ние can-- използвайки, че можем да се обадите. На първо място, ние ще го играе без барабаните. Това е хеликоптерът, хеликоптера MIDI. [За възпроизвеждане на музика] Там е квадратна вълна. Тиня на глас. И наистина може да полудява с това. Взех доста проста, защото знаех, че не трябва да отхапе повече, отколкото можех да дъвче. Просто я държи доста проста да покаже основните идеи. Но тогава аз бях като, ние сме Трябва да се добавят някои барабани към това. Просто защото това е малко непроницаема, и аз не използвайте Името на части барабан, I картирани them--, защото те са част от които номерираните клас, Аз ги съпоставена с цели числа. Един от тях е като бас барабан. Нулева е, както добре. Seven е висока шапка. И предвидени в тук, където функции стават малко по-случайни, те са като конга барабани. Така че, ако мислите, че може би about-- забавен начин да се приложат дръм машина е да се използва много подреден модели на вашия бас барабан. Така например, за Филтриране през на списък с всичко, което се дава обратно 1, когато е взето модул 04. Така че мога да получа 1, 5, 9, 13, така че това 17-- е първият ритъма на всяка мярка. И тогава това е същото нещо се размърда в два етапа. Така че това е нестандартна. Така че това ще бъде нещо като висока шапка. И след това отново, тук долу, това е малко случаен, защото правим конга барабани. И аз имам някои маракаси тук, също. Така че мога да се обадя играта на дръм машина, но това ще продължи вечно, и тя може да започне измъкна нагоре всички паметта в моята система. Така че аз ще се обадя на тази функция възпроизвеждате музика, която, както ще видим, използвате скъсяване паралелно състав да играем нашата малка Frere Jacques песен заедно с този странен дръм машина. Така че нека да разгледаме. И моля, не се подобри в моя подреждане на всички части на барабаните. Не е моята специалност, но аз имаше много забавно да го прави. [За възпроизвеждане на музика] Така че, разбира се, това е всичко, малко не толкова забавно ако не можем да го конвертирате на полувремето така че може би това може да се тълкува от човек изпълнител. Така че аз няма да го стартирате тук. Аз вече генерирани файловете. Можете да видите, че има дот LilyPond file-- и това Ще ми бъде Segue към Connor-- и файл дот MIDI, и точка, PDF файл, което е това, LilyPond в крайна сметка ще генерира. Но това са тези скриптове, и аз ще просто да ги стартирате с тяхна помощ опции. Ако получите тези и се изпълняват с Euterpea, можете да генерирате файл MIDI. И тогава от MIDI файл с тази програма MIDI 2LY, можете да генерирате Lily Файл Pond, а след това ви може да генерира PDF от резултата. И ние трябва да погледнем на това. Така че Конър вероятно ще покаже как да поясняват това по-добре, но това е Frere Jacques като генерирани от мен в Euterpea. Това е просто в C. Трябваше да измисли какво рана това е всъщност инча Но това е процес на подготовка за как се прави това с това. Нека поговорим повече за LilyPond. Конър HARRIS: OK Нека да видим. Споменахте ли Научете Вие Haskell? СТИВЪН KREWSON: О, да. Вижте Научете Вие Haskell. Това е в ресурсите. Ето как аз започнах учене, и това е страхотно. Не е тъпо учене. Конър HARRIS: Така че е онлайн. Така че един човек на име [недоловим] learnyouahaskell.com, без интервали. Граматика е болен. СТИВЪН KREWSON: Това е илюстрирана, също. Конър HARRIS: И така, какво е LilyPond? Това е декларативен програмиране език за музика наборен. Така че можете да declarative-- мисли за неща като HTML, когато не сте saying-- HTML не казва как уеб браузъри трябва правят страници стъпка по стъпка. Това е просто казвам това е текстово описание на това, което искате на страницата, за да изглежда така. И тогава тя също е една програма че компилира този език, или да го прочетете му в и след това всъщност върши наборен за вас, и да го изплюе тях прекрасни търсят PDF резултати. Можете също така да получите PNG формат или нещо такова. Един добър начин да се мисли това е по аналогия е, че LaTeX е нещо като LillyPond, но само за обикновен набор. Така че, вместо of-- това не е WYSIWYG, това, което виждате , Това получавате, като, да речем Finale е, или Sibelius, или Microsoft Word, където можете да напишете в реално време и проекти на нещата в реално време и да видим промени мигновено. Тя се основава на текст. Вие трябва да компилирате партитури с помощта на отделна програма и да излезе на PDF файлове по-късно. Това е малко по-малко удобна за употреба, ако сте опитвайки се да пишете директно в резултат и сте опитвайки се да композира на компютъра. Но има много предимства за него. One, тя не изглежда много по-хубав, защото LillyPond може действително отделете време да се направи оформлението на решенията правилно, за разлика Sibelius или Finale, които имат да се направи така, компрометираните алгоритми че те могат да се покаже неща в реално време. Така че, защо е LilyPond-- компютърна графика е трудно. Ако правиш нещо с музика и искате да напишете резултати, вие не искате да напишете всичко от себе си като се започне с това как да се направи щабовете и как да се направи бележници. Много е труден. Това е било направено преди. Добре си. Ако искате да използвате Finale или Sibelius, файлови формати за тези неща, са доста сложни, и не можете да наистина ги използва програмно. Можете да се отворят Sibelius с Finale и отидете на Файл, Експорт като PDF себе си, но не можете да наистина обадя, че по сценарий. LillyPond, можете да се обадите от тези сценарии. Така лесно може да превъртите LillyPond с LaTeX. Аз няма да са толкова много време, за да отида в тези технологии точно сега, но те съществуват. Ако искате да изглеждате в книга LillyPond, това е програма, която идва с вашата дистрибуция LillyPond, и това е за итерации LillyPond фрагменти в LaTeX ако искате да направите нещо като голям музикознание документ с примери, например. И това е добра умение за живот, ако правиш нещо с музика, а не само CS50. Ползвал съм LillyPond за всички от моите състава проекти тъй като бях в основата на старши в гимназията. Ето някои прости примери. Това е в общи линии представител на нивото на трудност че повечето хора биха го кажем са се опитвали да използват LilyPond за прости проекти. Това първо един е началото да хорал прелюдия от Бах. Това отдолу един е откъс от един от моите собствени творби, и това е само там, за да се покаже вие, такива неща [недоловим] извеждането на няколко реда в една и съща персонала, как лиричен undersetting работи. Lyric настилки са нещо, което е много лесен за използване LilyPond за хорова музика. И така, след това има някои по- сложни примери тук. Всичко това се прави в LilyPond и те са осъществими. Този първи откъс е от [Недоловим] от [недоловим]. И това [недоловим] от парче за соло бас флейта от [недоловим], който е longtime-- които е дългогодишен член на музика отдел тук, мисля. Аз не съм сигурен къде е отишъл да. Но той беше съветник на Харвард Композитори асоциация за дълго време. Прекрасен човек. И той пише музика, която има много сложна система за означаване, че LillyPond все пак може да се справи много добре. Така че просто да ви даде усещане за това, което възможности това нещо е толкова are-- вътрешността на LillyPond са доста сложни. И вие можете да го използвате за дълго време, включително за някои доста сложно неща, без наистина да се налага да знаем много за тях. Но основната идея е, че на ниското ниво, атомите на LillyPonds са бележките. Бележките съдържат контекстни наречените гласове. Така контекста на глас основно съответства до един ред полифония. И тогава контекст може да бъде съдържаща се йерархично в по-високите нива, които означават щабовете на резултата или по-големи групи, като пиано щабове или хорови щабове, и след това евентуално цели резултатни контексти. И всъщност може да обхване няколко десетки в една книга. И всеки контекст има брой прикрепени гравьори. Ако погледнете през съдържание на контекста и отпечатване на определен символ или определен клас от символи като необходимо. Така че на всеки глас контекст Има [недоловим] бележки гравьор, който е в основата на функция или обект, който пише през цялото бележката главите на правилните части на една страница. Тогава там е една пукнатина гравьор, който пише на пукнатини на персонала. Тогава там е метроном марка гравьор, че пише на метроном марки в полувремето. И всичко това се поберат доста добре в йерархията. И това е много, много, много персонализация, която имате нужда ако искате да получите такива неща. Така че всички контексти имат всякакви други атрибути които можете да модифицирате за всичко от разстоянието на различни шрифта избор на размери на нещата. Ако искате да направите още по-сложни неща, има вграден скриптов език. Те използват схема, която е диалект на LISP. Това вероятно не правим означава нищо за вас. Но общо взето, схема друга функционална език за програмиране, повече или по-малко. СТИВЪН KREWSON: The вратовръзки в. Конър HARRIS: Да. Това е добра вратовръзки в, предполагам. И той се използва като език на преподаване, всъщност, надолу Mass Ave. В MIT. И това е много удобен за LillyPond за различни технически причини. И така, ако искате да направите проста ощипвам зависими от условностите, за example-- има определена състояние на полувремето, че е изпълнено, правят промени в оформление или whatnot-- тогава тези съоръжения са там. Те са сложни. Така че тук е доста проста примерен код. Това е пет линии. По принцип, аз съм определяне две тояги. Това е в 3/4. Първият състав има приложен темпо марки, но това е всъщност ще да преминете към цялата оценка, защото темпото марки са на нивото на полувремето. Гравьора The метроном марки е приложен за гол контекст. Има различни ключове, защото [недоловим] гравьора е прикрепена на щабовете. Всъщност можете да направите, е да. Пробата съм написал е всъщност в до мажор, но това е само за да докаже, че може да има различни ключове в различни екипи. И основния синтаксис е пишеш имайте предвид, имена с E, F, G, независимо. Ако искате да направите знаците, можете наставка Е или ES. Това е от холандски музиковедски конвенции. И да направя октава скокове, вие трябва да използвате тези кърлежи марки, запетая или апостроф. Роднината просто означава, каквото и да имаш бележка, той автоматично ще бъде plaec в октава най-близо до предишната. А ако искате да скочи повече от а fifth-- кажа една пета или MORE- тогава ще трябва да използвате [недоловим]. А иначе, не е нужно да зададени октава на всяка отделна нота. И относителна C, председател и C, можете само да уточним средната C и база C, особено първите ноти. След това имате тези щабове, които организират тези два гласа или образци от музика, и имате полувремето. И това изглежда така. Ако искате да отделите време да копирате, че извадка от LillyPond Код на предишния спускате тук, а ти може да го напиша за LillyPond себе си. Знам, че имаме нещо че много прилича на това. Така че има друга технология наречено Music XML поддържа от съвсем различни хора. XML е на текстови данни structure-- I не трябва да се каже данни structure-- казват метафора картата нещо. И тя е проектирана да държи йерархични данни много добре. HTML, например, е вид на XML. И вие можете да кажете на XML, защото те имаха всички скоби на ъгъла и ъгълът скоба наклонена черта марки че полета показват данни. Аз не разполагате с код Например от Music XML. Можете да го намерите себе си. По принцип, причината може да искате за използване като XML в междинния етап е, на първо място, това е формат за обмен на данни за основно every-- аз не трябва да се каже, всеки, но много различни полувремето писатели. Така че, ако напишете в Music XML, не само може да LillyPond го прочете с помощта на този Спомагателни програма, наречена Music XML да LY, но също така може да чете Finale тя, Sibelius може да го прочете. В зависимост от това как си вътрешен обект йерархия работи за представяне на музика, тя може да бъде по-лесно да се напише да Music XML, отколкото да LillyPond и просто да разчитат на Music XML да LY да направи превръщане. Не мисля, че [недоловим] има Music XML. СТИВЪН KREWSON: Това не го прави. Някой се работи по него, все пак. Конър HARRIS: OK. Euterpea не разполага с Функция Music XML изход все още. Ако искате окончателно идея за проект, може би се свържете с момчета че Стивън знае, и те биха могли да използват вашата помощ. СТИВЪН KREWSON: Много бих се радвал, че. Конър HARRIS: Също така, в общи линии, всеки езици за програмиране това е си заслужава вече има XML библиотека, така че можете да конвертирате всички вътрешно на музиката си в някакъв предмет че XML библиотеката може да напише , че ще изисква по-малко промени на вашата вътрешна структура за каквато и музиката, която възразява искам да пиша, отколкото да я пиша пряко във LillyPond би. След това просто да го отпечатате с XML с на XML библиотеки в своя език, което ще гарантира, че това е синтактично правилни и всичко, и след това да го конвертирате в LillyPond. Така че технологията може да искате да разгледа, ако правиш нещо Ето така. [Недоловим], друг auxilarry технология. Това е в общи линии Tech Works или Tech Студио за LillyPond. Така той предлага помощ с синтаксис, с шаблони за различни чести комбинации от инструменти. Тя позволява на разделен екран гледане, така можете да имате своя код в един прозорец и PDF в друг прозорец и кликнете върху места в PDF за да отидете в съответната петна в изходния си код. Това е по-полезно, ако сте в действителност писането LillyPond себе файлове отколкото ако се генерира ги програмно. Но отново, това е нещо полезно да има. Страхотен. Друг resources-- аз просто ще проверете това много бързо. LillyPond manuals-- LillyPond има отлична документация на своята интернет страница. Те имат един урок. Те имат референтен синтаксис. Те имат стотици откъси за различни малки неща йо може да се наложи да демонстрира направя различни възможности. Ако искате да използвате скриптов език или да направите по-обширни персонализации, тогава там е Вътрешни референтни по това URL. Ако искате да използвате Music XML, има че URL, musicxml.com/tutorial. И тогава, ако трябва да се научат схема защото вие действително искате да използвате съоръженията скриптови в LillyPond, тогава има [недоловим] нарича Структурирана Тълкуване на компютърни програми, която не само Второто голямото CS учебник някога written-- ме намери след това, ако искате да знаете това, което мисля, че най-голямото един is-- но тя също е много добър въведение към езика правилно. Не е нужно повече от първите няколко секции. И това е всичко. Някакви въпроси? STUDENT: Къде мога да изтеглите Вашата генериран Frere Jacques за да мога да го сложи на моя Ipod? СТИВЪН KREWSON: Е, можете да напишете до някои WAV файл в Euterpea. И вие имате кода. Това е на GitHub. Направете си собствени варианти на Frere Jacques от CS50 кошер ум. Би било чудесно. Конър HARRIS: Някой друг? СТИВЪН KREWSON: Нуждаем по-добър бас барабан, също. Това наистина е много зле. STUDENT: Euterpea има не само страна на състав, но signal-- СТИВЪН KREWSON: Да. Всъщност, до които аз направих в Euterpea когато взе this-- има завършат курс в Йейл, че използва it-- беше на синтез на звук. Така че има много приятен начин с помощта на стрелките и някои от нотацията видяхме на композиране заедно сигнални функции. По-специално, на бас за най- от тях е само един прост синусоида. Но ако започнете да композирате тези, в странни програмни начини, можете да получите луд звук ефекти, като странни каскади. Можете да създадете много трудна звучи с много модулация. Направих един проект за гранулиран синтез, което е някъде между FM и вземане на проби. Взимаш много малък, малки проби и след това да ги комбинира с някакъв вид модулатор и да изградят по-богат звук. Ние също направихме физическо моделиране, така опитвайки се да мисля за физика и психоакустика на нещо подобно тръба и да мисля за начина, по който звукът е подскачащи камбаната на тръбата и акустиката на стаята и моделиране че с основните осцилатори. Конър HARRIS: Благодаря много. Благодаря, че дойдохте. И аз съм винаги готов да предприеме въпроси от email-- connorharris@college.harvard.edu. СТИВЪН KREWSON: Да. stephen.krewson@yale.edu. Готино.