1 00:00:00,000 --> 00:00:05,180 2 00:00:05,180 --> 00:00:05,930 Коннор Харрис: Привет. 3 00:00:05,930 --> 00:00:06,820 Я Коннор Харрис. 4 00:00:06,820 --> 00:00:09,729 Я CS50 Калифорния в Гарварде. 5 00:00:09,729 --> 00:00:11,270 СТИВЕН KREWSON: Я Стивен Krewson. 6 00:00:11,270 --> 00:00:12,582 Я TF для CS50 в Йельском университете. 7 00:00:12,582 --> 00:00:15,790 Коннор Харрис: И мы будем говорить о некоторых технологиях, которые вы, возможно, 8 00:00:15,790 --> 00:00:18,880 хотите использовать, если вы заинтересованы в делать окончательный проект или действительно 9 00:00:18,880 --> 00:00:20,920 что-нибудь с музыкой. 10 00:00:20,920 --> 00:00:24,400 Мы собираемся концентрироваться на первом а Язык программирования Haskell называется. 11 00:00:24,400 --> 00:00:26,280 Это функциональный язык, поэтому парадигма 12 00:00:26,280 --> 00:00:29,620 очень отличается от C или PHP или другие императивные языки 13 00:00:29,620 --> 00:00:33,450 что вы использовали уже, и особенно в библиотеке, написанной в Haskell 14 00:00:33,450 --> 00:00:40,240 называется Euterpea, которые могут помочь людям с написания музыки функционально, 15 00:00:40,240 --> 00:00:40,780 в основном. 16 00:00:40,780 --> 00:00:43,400 А Стефан, вы пройдете через большой пример этого. 17 00:00:43,400 --> 00:00:46,423 >> После этого, я познакомлю вас с то, что называется LillyPond, что 18 00:00:46,423 --> 00:00:48,370 это технология верстки музыки. 19 00:00:48,370 --> 00:00:50,830 Это вроде как LaTeX для музыки, если любой из вас 20 00:00:50,830 --> 00:00:57,530 использовали латекс для математических классов или другие Р набор классов или что там у вас. 21 00:00:57,530 --> 00:01:00,440 И поэтому я дам вам, опять же, некоторые простые примеры, что 22 00:01:00,440 --> 00:01:03,640 и указать вам в общем Направление некоторых лучших ресурсов. 23 00:01:03,640 --> 00:01:04,319 >> СТИВЕН KREWSON: В Кроме того, мы думали, это 24 00:01:04,319 --> 00:01:06,720 было бы здорово, чтобы настроить немного намеков 25 00:01:06,720 --> 00:01:10,780 к трубопроводу между Euterpea генерируемые MIDI файлы 26 00:01:10,780 --> 00:01:13,910 в LillyPond, поэтому мы предоставляем некоторые инструкции по сценариев 27 00:01:13,910 --> 00:01:16,310 сделать это, которые являются снабжены LillyPond 28 00:01:16,310 --> 00:01:19,160 просто держать его открытым исходным кодом и получить трубопровод собирается. 29 00:01:19,160 --> 00:01:20,910 Коннор Харрис: Опять же, следует подчеркнуть,, 30 00:01:20,910 --> 00:01:23,100 эти две технологии, вы не должны использовать их вместе. 31 00:01:23,100 --> 00:01:25,370 Они не предназначены для работы вместе, хотя они очень красиво. 32 00:01:25,370 --> 00:01:26,362 >> СТИВЕН KREWSON: Верно. 33 00:01:26,362 --> 00:01:30,116 И совершенно бесплатно. 34 00:01:30,116 --> 00:01:32,240 Коннор Харрис: Так подтверждения, только что прочитал, что. 35 00:01:32,240 --> 00:01:33,406 СТИВЕН KREWSON: Должным образом отметить. 36 00:01:33,406 --> 00:01:36,360 Благодаря этим людей. 37 00:01:36,360 --> 00:01:39,180 Это я задерживаться на только на мгновение. 38 00:01:39,180 --> 00:01:41,560 Процесс установки это немного сложнее. 39 00:01:41,560 --> 00:01:45,420 Мы чтения меня на GitHub что вы можете взглянуть на. 40 00:01:45,420 --> 00:01:47,840 Просто напишите мне, если у вас есть какие-либо вопросы. 41 00:01:47,840 --> 00:01:52,829 Но мы будем запускать этот в предположении, что это работает для всех. 42 00:01:52,829 --> 00:01:55,620 Коннор Харрис: А если вы не можете получить LillyPond не работать, не страшно. 43 00:01:55,620 --> 00:02:00,139 Там нет живой сборник, что будет участвовать, по крайней мере, с моей стороны. 44 00:02:00,139 --> 00:02:02,930 СТИВЕН KREWSON: Haskell и LillyPond должны оба имеют инсталляторов. 45 00:02:02,930 --> 00:02:08,497 Euterpea загружается как Пакет, так далее, и так далее. 46 00:02:08,497 --> 00:02:10,080 Таким образом, мы говорим о компьютерной музыки. 47 00:02:10,080 --> 00:02:12,990 И это всего лишь очень вид 50000 футов. 48 00:02:12,990 --> 00:02:15,700 Там в несколько различных аспектов этого. 49 00:02:15,700 --> 00:02:18,120 И это является грубым и собирается скрывать некоторые подробности. 50 00:02:18,120 --> 00:02:22,090 Но мы могли бы придумать что-нибудь как алгоритмического состава, 51 00:02:22,090 --> 00:02:24,920 с использованием алгоритмов, с помощью кода, чтобы генерировать 52 00:02:24,920 --> 00:02:30,280 некоторый тип может быть of-- самоподобным последовательность нот, или возможно нот 53 00:02:30,280 --> 00:02:33,330 под какой-то ограничения. 54 00:02:33,330 --> 00:02:35,350 И тогда те, может быть выполнены или интерпретировать 55 00:02:35,350 --> 00:02:38,390 с аналоговых инструментов или что-нибудь подобное. 56 00:02:38,390 --> 00:02:42,010 Но состав был сделано алгоритмически. 57 00:02:42,010 --> 00:02:45,120 >> Но, конечно, может быть, область компьютерная музыка или цифровой музыкальный 58 00:02:45,120 --> 00:02:48,870 мы больше знакомы с цифровой синтез звука или цифровой дискретизации 59 00:02:48,870 --> 00:02:51,160 и цифровая запись. 60 00:02:51,160 --> 00:02:55,650 Много цифровых инструментов являются осуществляется через цифровой дискретизации. 61 00:02:55,650 --> 00:03:00,110 На самом деле, мы будем использовать один из тех, кто в форма звуковой библиотеки шрифта позже. 62 00:03:00,110 --> 00:03:02,850 >> Но есть также нечто, называемое цифровой синтез, который вышел 63 00:03:02,850 --> 00:03:08,650 из конца 70-х и в 80-х с Yamaha и Джон Chowning в Стэнфорде 64 00:03:08,650 --> 00:03:11,990 делает синтез FM или Синтез частоты модуляции, 65 00:03:11,990 --> 00:03:15,100 где вы были носитель и сигнал модуляции 66 00:03:15,100 --> 00:03:18,270 как в звукового спектра. 67 00:03:18,270 --> 00:03:22,570 Но то, что мы сосредоточены на сегодня то, что называется MIDI, 68 00:03:22,570 --> 00:03:25,040 и, конечно, алгоритмическая композиция. 69 00:03:25,040 --> 00:03:30,940 >> Мы не собираемся делать инструменты, но мы вместо собираюсь сделать музыку, 70 00:03:30,940 --> 00:03:33,940 а затем, что будет интерпретируются некоторые инструменты, которые 71 00:03:33,940 --> 00:03:38,300 являются совместимую к General MIDI Стандарт. 72 00:03:38,300 --> 00:03:40,830 Так что MIDI-? 73 00:03:40,830 --> 00:03:45,550 Я не собираюсь слишком глубоко в нее, но это MIDI-протокол передачи данных. 74 00:03:45,550 --> 00:03:49,250 Это своего рода гидом по различные компании и отрасли 75 00:03:49,250 --> 00:03:52,250 для организации звуков или патчи. 76 00:03:52,250 --> 00:03:54,170 Таким образом, мы увидим, что есть стандартный MIDI- 77 00:03:54,170 --> 00:03:57,500 для всех различных ударных звуки и MIDI рекомендации 78 00:03:57,500 --> 00:04:01,360 для всех различных типов синтезатор или Различные типы всех прибора 79 00:04:01,360 --> 00:04:03,650 группы в оркестре, скажем. 80 00:04:03,650 --> 00:04:08,916 >> Вы, наверное, знакомы с От 0 до 127 MIDI сообщения. 81 00:04:08,916 --> 00:04:12,920 MIDI-сигнал, как правило, один бит, указывающий 82 00:04:12,920 --> 00:04:16,130 это ли данные или пакет положение, и тогда есть 83 00:04:16,130 --> 00:04:18,589 семь бит сигнала. 84 00:04:18,589 --> 00:04:21,430 И они могут контролировать все от объема 85 00:04:21,430 --> 00:04:25,330 к действию давления или на определенном ключе 86 00:04:25,330 --> 00:04:29,400 если вы выполняете с MIDI Контроллер, а также, конечно, 87 00:04:29,400 --> 00:04:31,250 заметки. 88 00:04:31,250 --> 00:04:33,450 И, конечно, имеет MIDI- был чрезвычайно полезным, 89 00:04:33,450 --> 00:04:37,550 потому что это способ провода вместе или ромашка цепи 90 00:04:37,550 --> 00:04:41,570 куча устройств MIDI. 91 00:04:41,570 --> 00:04:44,050 У меня есть семь или восемь назад в моем доме. 92 00:04:44,050 --> 00:04:46,610 Это становится действительно сложно, но это очень мощный. 93 00:04:46,610 --> 00:04:47,460 И это на самом деле старый. 94 00:04:47,460 --> 00:04:51,117 Это от начала 80-х, и это действительно красиво и мало. 95 00:04:51,117 --> 00:04:51,950 Коннор Харрис: Да. 96 00:04:51,950 --> 00:04:54,230 Все классические Nintendo видео игры, вероятно, будет 97 00:04:54,230 --> 00:04:56,088 есть MIDI файлы для музыки, например. 98 00:04:56,088 --> 00:04:59,550 99 00:04:59,550 --> 00:05:01,740 >> СТИВЕН KREWSON: Вот Пример общей MIDI, 100 00:05:01,740 --> 00:05:06,520 показывая MIDI в качестве своего рода общего протокола. 101 00:05:06,520 --> 00:05:13,280 И я думаю, что мы можем думать о Разница между спецификацией 102 00:05:13,280 --> 00:05:17,830 что там должна быть что-то вроде это звучит инструмент и фактическое 103 00:05:17,830 --> 00:05:21,740 Реализация этих документов звучит в звуковой шрифт или конкретного MIDI 104 00:05:21,740 --> 00:05:25,740 синтезатор как разница может быть, между typeface--, который говорит, 105 00:05:25,740 --> 00:05:30,350 в общем, это дизайн именно этот способ представления 106 00:05:30,350 --> 00:05:35,907 characters-- и конкретный шрифт который имеет определенный размер и тембр, 107 00:05:35,907 --> 00:05:37,240 и есть реализация the-- 108 00:05:37,240 --> 00:05:39,156 >> Коннор Харрис: Может быть, лучше бы сравнение 109 00:05:39,156 --> 00:05:43,430 быть стандарт Unicode says-- это дает номер для каждого символа, и действительно 110 00:05:43,430 --> 00:05:46,830 каждый язык в мире, или обширный набор сценариев языка 111 00:05:46,830 --> 00:05:51,310 в мире, а затем те оказана в нечто графической 112 00:05:51,310 --> 00:05:53,710 различными пакетами шрифтов. 113 00:05:53,710 --> 00:05:56,630 И очевидно, что вы можете думать о MIDI-как Unicode звука. 114 00:05:56,630 --> 00:06:03,250 И это всего лишь список of-- большой поток событий и документов и еще много чего, 115 00:06:03,250 --> 00:06:06,090 и вы должны иметь отдельный Программа, как шрифт, 116 00:06:06,090 --> 00:06:08,537 оказывать, что в то, что это слышно. 117 00:06:08,537 --> 00:06:12,360 118 00:06:12,360 --> 00:06:13,780 >> СТИВЕН KREWSON: Так почему Haskell? 119 00:06:13,780 --> 00:06:19,110 Haskell является функциональное программирование язык, очень продвинутые, 120 00:06:19,110 --> 00:06:22,770 очень отличается от C, очень отличается от PHP. 121 00:06:22,770 --> 00:06:28,120 И мы собираемся, чтобы увидеть, что есть более простота композиции функций в Haskell 122 00:06:28,120 --> 00:06:37,640 что позволит нам ветер через сочинять или печатая, переписывание, 123 00:06:37,640 --> 00:06:42,160 что-то вроде Frere Жак, это просто песня, 124 00:06:42,160 --> 00:06:46,815 есть много деталей в нем, что автомодельны или повторять. 125 00:06:46,815 --> 00:06:49,740 126 00:06:49,740 --> 00:06:53,250 Так что это будет несколько мотивация, почему 127 00:06:53,250 --> 00:06:59,400 мы используем Haskell, в котором Функции являются гражданами первого класса. 128 00:06:59,400 --> 00:07:01,120 >> И я хотел, чтобы расширить это немного. 129 00:07:01,120 --> 00:07:08,800 Это немного легко нотами FRERE Жака в Haskell. 130 00:07:08,800 --> 00:07:12,100 Но что, если мы хотели добавить партию ударных для него? 131 00:07:12,100 --> 00:07:17,320 Что делать, если мы хотели, чтобы попытаться сделать что-то вроде Роланд 808 или 909 барабана 132 00:07:17,320 --> 00:07:20,970 машина, где вы должны около 16 различных шагов? 133 00:07:20,970 --> 00:07:24,590 Как правило, это думал как 16 нот. 134 00:07:24,590 --> 00:07:28,640 И вы можете контролировать глобальное темп, и вы можете выбрать 135 00:07:28,640 --> 00:07:34,620 куча разных частях ударных бас барабана, хлопок, различные ловушки, 136 00:07:34,620 --> 00:07:37,540 открытые и закрытые высокие шляпы на эти рода каналов, 137 00:07:37,540 --> 00:07:41,600 а затем вы можете EQ или настроить их объем. 138 00:07:41,600 --> 00:07:45,290 >> И мы увидим хороший способ в Haskell представления на этот шаг 139 00:07:45,290 --> 00:07:48,810 секвенсор со всеми различные классные вещи в Haskell 140 00:07:48,810 --> 00:07:53,100 мы можем сделать с генерации списки и списки фильтрации более, 141 00:07:53,100 --> 00:07:56,060 отображение над списками, отображение функции над списками. 142 00:07:56,060 --> 00:07:59,530 143 00:07:59,530 --> 00:08:00,760 И быстрый извинения. 144 00:08:00,760 --> 00:08:05,300 Это очень поверхностный и чрезмерно быстрый набросок 145 00:08:05,300 --> 00:08:07,620 некоторые из аспектов из Haskell и Euterpea, 146 00:08:07,620 --> 00:08:11,760 что предметно-ориентированный встроенный язык написано 147 00:08:11,760 --> 00:08:14,970 в Haskell для музыкальных типов. 148 00:08:14,970 --> 00:08:17,350 Поэтому, пожалуйста, проверить код в Интернете. 149 00:08:17,350 --> 00:08:22,404 Запустите GHCI, что Глазго Haskell Compiler Переводчик. 150 00:08:22,404 --> 00:08:24,320 И я буду делать некоторые это в немного 151 00:08:24,320 --> 00:08:25,880 так что вы можете увидеть, как это делается. 152 00:08:25,880 --> 00:08:31,021 >> И это позволяет загрузить в с the-- синтаксис толстой кишки, а затем 153 00:08:31,021 --> 00:08:31,520 команда. 154 00:08:31,520 --> 00:08:33,510 Вы можете загрузить в файлы. 155 00:08:33,510 --> 00:08:36,840 Вы можете использовать просматривать эти файлы на чтобы увидеть все функции, которые 156 00:08:36,840 --> 00:08:39,169 существовать в определенном модуле. 157 00:08:39,169 --> 00:08:43,850 И то, как мы увидим, типы и тип классы настолько важны в Haskell, 158 00:08:43,850 --> 00:08:48,850 так что вы всегда можете check-- особенно если вы работаете в новой DSCL 159 00:08:48,850 --> 00:08:51,600 как это, то, что тип музыки? 160 00:08:51,600 --> 00:08:55,114 Я знаю, о пути числовой типы работают в Haskell, 161 00:08:55,114 --> 00:08:56,530 но я не знаю много о музыке. 162 00:08:56,530 --> 00:09:01,280 Но вы можете изучить, как они определяется с помощью этого типа или т команду 163 00:09:01,280 --> 00:09:04,577 и затем вызвать в частности функция или объект данных. 164 00:09:04,577 --> 00:09:05,410 Коннор Харрис: Да. 165 00:09:05,410 --> 00:09:09,820 Если вы думали, C и Clang был hardass о типах, 166 00:09:09,820 --> 00:09:11,230 Вы понятия не имеете о Haskell. 167 00:09:11,230 --> 00:09:14,230 Хорошая вещь о Haskell является то, что если вы можете получить код для компиляции 168 00:09:14,230 --> 00:09:16,790 и если чеки типа Haskell, это, наверное, правильно, 169 00:09:16,790 --> 00:09:18,675 потому что система тип так строги. 170 00:09:18,675 --> 00:09:20,090 >> СТИВЕН KREWSON: Да. 171 00:09:20,090 --> 00:09:21,980 Так что я просто хочу, чтобы пойти through-- и снова, 172 00:09:21,980 --> 00:09:27,160 это не делает его justice-- несколько особенности Haskell, что, по крайней мере, 173 00:09:27,160 --> 00:09:31,780 его creators-- и он был создан в конце 1980-х группой людей, 174 00:09:31,780 --> 00:09:34,610 комитет 20 people-- считали важным. 175 00:09:34,610 --> 00:09:36,850 И первое, что они перечисленные в документе, который 176 00:09:36,850 --> 00:09:41,890 описал генезис Haskell в течение первых 20 лет или около того 177 00:09:41,890 --> 00:09:43,390 было то, что был ленив. 178 00:09:43,390 --> 00:09:44,990 Итак, что же это значит? 179 00:09:44,990 --> 00:09:49,860 >> Ну, это значит, когда у нас есть какой-то выражения, мы должны оценить его. 180 00:09:49,860 --> 00:09:54,390 И Haskell делает это в вызове по необходимости так или нестрогим образом. 181 00:09:54,390 --> 00:09:57,250 То есть, если у нас есть куча составляющие нашего выражения, 182 00:09:57,250 --> 00:10:00,660 мы стараемся, чтобы задержать оценку из тех подкомпонентами 183 00:10:00,660 --> 00:10:05,300 до абсолютного прошлого minute-- что пока мы не их действительно нужно. 184 00:10:05,300 --> 00:10:08,480 >> Таким образом, это означает: что действительно здорово, особенно 185 00:10:08,480 --> 00:10:13,200 если мы думаем о абстракции музыкального пошаговый секвенсор. 186 00:10:13,200 --> 00:10:16,740 Вы включите его, и вы начинаете работает шаг sequence-- 187 00:10:16,740 --> 00:10:20,010 если вы когда-либо работал с барабаном machine--, и он просто идет навсегда. 188 00:10:20,010 --> 00:10:24,650 Поэтому было бы очень хорошо, если мы может эмулировать, что в Haskell. 189 00:10:24,650 --> 00:10:31,040 И мы можем сделать это с бесконечным значения, в частности бесконечных списков. 190 00:10:31,040 --> 00:10:35,860 Это очень легко введите бесконечный список в Haskell. 191 00:10:35,860 --> 00:10:39,230 Вы могли бы просто использовать синтаксис вниз здесь, где вы видите с 1 по 3, 192 00:10:39,230 --> 00:10:42,440 удалить 3 1 точка точка, и что это бесконечный список 193 00:10:42,440 --> 00:10:46,960 всех натуральных чисел продления от того, насколько вы можете себе представить. 194 00:10:46,960 --> 00:10:49,925 >> Я хочу, чтобы ввести Концепция складок сразу. 195 00:10:49,925 --> 00:10:51,800 И опять, цель это не семинар 196 00:10:51,800 --> 00:10:55,770 чтобы узнать о складок в Haskell или высшие функции порядка. 197 00:10:55,770 --> 00:10:59,640 Но я просто хочу, чтобы ввести его в дать точную чувство, как странно 198 00:10:59,640 --> 00:11:03,700 Haskell и как мощный это. 199 00:11:03,700 --> 00:11:08,000 И в частности, мы собираемся be-- когда мы делаем наши различные части барабана, 200 00:11:08,000 --> 00:11:12,790 мы собираемся быть манипулирования списками число, складывая их друг на друга. 201 00:11:12,790 --> 00:11:17,290 И чтобы сделать это, мы будем быть с использованием карт и складки. 202 00:11:17,290 --> 00:11:21,770 >> Там это право ассоциативный раз, что это одно право 203 00:11:21,770 --> 00:11:26,990 here-- 1 минус количество, 2 минус количество, 3 минус 0. 204 00:11:26,990 --> 00:11:29,170 И синтаксис для раз, вы даете раз 205 00:11:29,170 --> 00:11:34,680 базовое значение и затем operation-- В этом случае сложение или вычитание. 206 00:11:34,680 --> 00:11:36,280 Я показал оба случая. 207 00:11:36,280 --> 00:11:41,760 А тут еще, что аккумулятор накапливается в течение всего списка, 208 00:11:41,760 --> 00:11:46,330 применения этого оператора плюс или минус, а затем накапливать его. 209 00:11:46,330 --> 00:11:52,680 Так что это будет the--, если он был вызван с кратным г плюс 0, начиная с 0, 210 00:11:52,680 --> 00:11:54,720 мы тогда подвести все числа в этом списке. 211 00:11:54,720 --> 00:11:57,134 И это список от 1 до 3. 212 00:11:57,134 --> 00:12:00,050 Коннор Харрис: Так, говоря другими способ, раз г принимает три аргумента. 213 00:12:00,050 --> 00:12:02,540 Там функция, которая Сам принимает два аргумента, 214 00:12:02,540 --> 00:12:05,400 то есть значение стартер, и есть список значений. 215 00:12:05,400 --> 00:12:08,570 И то, что вы делаете, это вы берете стартер значение, первое значение, 216 00:12:08,570 --> 00:12:09,850 положить их в функцию. 217 00:12:09,850 --> 00:12:11,607 Что вы выйти, Возьмите это, канал, который 218 00:12:11,607 --> 00:12:13,940 в функции от Второе значение, что вы получаете из, 219 00:12:13,940 --> 00:12:16,690 принять, что учитывать их в Функция третьего значения. 220 00:12:16,690 --> 00:12:18,740 И потом, если вы идете вниз Весь этот список таким образом, 221 00:12:18,740 --> 00:12:22,970 Вы собираетесь получить в конечном итоге некоторые сингулярное это 222 00:12:22,970 --> 00:12:25,720 того же типа, что вы начали с и того же типа 223 00:12:25,720 --> 00:12:29,147 как вещи в списке, а затем это возвращение результат кратного R. 224 00:12:29,147 --> 00:12:31,980 СТИВЕН KREWSON: Таким образом, в частности, это высшие функции порядка, 225 00:12:31,980 --> 00:12:34,460 потому что они берут другой Функция в качестве одного из аргументов. 226 00:12:34,460 --> 00:12:34,770 >> Коннор Харрис: Да. 227 00:12:34,770 --> 00:12:37,820 Если вы использовали некоторые другие languages-- Я знаю, R, [неразборчиво] 228 00:12:37,820 --> 00:12:41,510 язык имеет это, называется Reduce. 229 00:12:41,510 --> 00:12:45,460 Вы могли бы иметь аналогичные функции на других языках, просто называется 230 00:12:45,460 --> 00:12:48,160 разные вещи. 231 00:12:48,160 --> 00:12:50,680 >> СТИВЕН KREWSON: И то, что приятно об кратным R 232 00:12:50,680 --> 00:12:53,880 в данном случае является то, что складка R может работать с бесконечными списками. 233 00:12:53,880 --> 00:12:59,490 Так что в этом дне, в этом P5 генерирует ноты, 234 00:12:59,490 --> 00:13:03,120 включены в пошаговый секвенсор для некоторые ударных, пятый барабан часть, 235 00:13:03,120 --> 00:13:05,480 и, возможно, это конга барабан или что-то. 236 00:13:05,480 --> 00:13:09,719 И это намеренно тупой способ написания этого 237 00:13:09,719 --> 00:13:11,510 но это весело, потому что он демонстрирует много 238 00:13:11,510 --> 00:13:14,460 вещей, о Haskell и Euterpea. 239 00:13:14,460 --> 00:13:20,650 >> Так складываются R этого colon-- толстой кишки только оператор, который толкает вещи 240 00:13:20,650 --> 00:13:25,700 вместе на list-- призвал пустой Список, который находится всего в пустые скобки. 241 00:13:25,700 --> 00:13:28,250 И я звоню, что на этой бесконечной списка. 242 00:13:28,250 --> 00:13:31,570 Это на самом деле два списка суммируются здесь. 243 00:13:31,570 --> 00:13:37,150 Список 1 запятая 6 точка Точка 1, 6, 11, 16. 244 00:13:37,150 --> 00:13:39,750 Так Haskell-- всего несколько символов, вы 245 00:13:39,750 --> 00:13:42,420 может генерировать цельные Последовательность чисел 246 00:13:42,420 --> 00:13:46,240 что пять чисел друг от друга растяжения на в бесконечность. 247 00:13:46,240 --> 00:13:49,860 И я к тому, что предварять это короче немного list-- 248 00:13:49,860 --> 00:13:54,370 3, 8, 21-- чтобы показать вам, как вы можете объединить списки. 249 00:13:54,370 --> 00:13:55,790 >> И потом, я сложил на себе. 250 00:13:55,790 --> 00:14:01,510 И это заканчивается просто быть своего рода операция идентичности, но это бесконечно. 251 00:14:01,510 --> 00:14:06,070 И раз R может это сделать, потому что это лениво оценивает, как в описанном выше. 252 00:14:06,070 --> 00:14:10,582 Если у нас есть 1 и 2 и 3, мы можем просто скобки от всей остальное. 253 00:14:10,582 --> 00:14:12,290 Это не будет работать для минус или плюс, но это 254 00:14:12,290 --> 00:14:17,760 будет работать на этой толстой кишки операция идентичности в списке. 255 00:14:17,760 --> 00:14:24,620 >> Так как мы практически использовать, что, если мы есть бесконечно длинный список вещей? 256 00:14:24,620 --> 00:14:26,500 Ну, Haskell обеспечивает много functions-- 257 00:14:26,500 --> 00:14:29,450 и выглядят более в эти в самостоятельно time-- как принимает 258 00:14:29,450 --> 00:14:32,200 в котором говорится, ладно, мы генерации эту бесконечный список, 259 00:14:32,200 --> 00:14:35,950 но мы только собираемся принять некоторые Количество его и в этом case-- 260 00:14:35,950 --> 00:14:38,410 мы увидим это позже в наш драм-машина code-- 261 00:14:38,410 --> 00:14:43,740 ГМ просто какой-то глобальных переменная для числа шагов 262 00:14:43,740 --> 00:14:44,610 в секвенсор. 263 00:14:44,610 --> 00:14:47,630 На машинах с рулонной в Я показал вам, что это, как правило, 16, 264 00:14:47,630 --> 00:14:51,475 но я реализовал его с 32. 265 00:14:51,475 --> 00:14:54,470 Это действительно не имеет значения. 266 00:14:54,470 --> 00:15:00,230 >> Haskell также чисто, поэтому она имеет сильное статическая типизация, что Коннор упоминал. 267 00:15:00,230 --> 00:15:03,220 Так функции Математическая в sense-- 268 00:15:03,220 --> 00:15:06,600 они более математическое что они гарантированно 269 00:15:06,600 --> 00:15:11,530 не доступ или изменить любую переменная или выполнить вход или выход. 270 00:15:11,530 --> 00:15:14,420 Так что, если у вас есть функция, это детерминированным. 271 00:15:14,420 --> 00:15:17,400 Он всегда будет вернуться в тот же Значение в состоянии программы 272 00:15:17,400 --> 00:15:19,310 или остаются неизменными. 273 00:15:19,310 --> 00:15:22,940 Есть, конечно, исключения монадические на это, но это выходит за рамки нашей. 274 00:15:22,940 --> 00:15:23,900 >> Коннор Харрис: Да. 275 00:15:23,900 --> 00:15:26,946 Что это означает, однако, есть несколько важных [неразборчиво] 276 00:15:26,946 --> 00:15:27,820 Последствия этого. 277 00:15:27,820 --> 00:15:30,940 Одним из них является, что это очень легко распараллелить программы на Haskell. 278 00:15:30,940 --> 00:15:32,773 Потому что, если у вас есть, сказать, что функции 279 00:15:32,773 --> 00:15:36,064 должен работать на миллион значений, если Вы знаете, что функция всегда будет 280 00:15:36,064 --> 00:15:39,280 выдавать и то же значение, если Вы кормите на определенном value-- 281 00:15:39,280 --> 00:15:43,055 если вы [неразборчиво] е 1, е из 2, то F 3 или F whatnot-- из 1 282 00:15:43,055 --> 00:15:45,180 не собирается выписывать в файл или сделать что-то 283 00:15:45,180 --> 00:15:46,850 что будет изменять значение f2. 284 00:15:46,850 --> 00:15:50,220 Вы можете просто разделить эту функцию к миллион разных машин или миллион 285 00:15:50,220 --> 00:15:54,720 различные темы или что, получить все ответы обратно, 286 00:15:54,720 --> 00:15:56,900 получить все возвращаемые значения назад, а затем это все. 287 00:15:56,900 --> 00:15:59,780 Так очень легко распараллелить вещи. 288 00:15:59,780 --> 00:16:03,140 >> Недостатком является то, что вход и выход, особенно 289 00:16:03,140 --> 00:16:05,720 вписываются в систему типа в очень сложных отношениях. 290 00:16:05,720 --> 00:16:09,010 Мы не будем вдаваться в это прямо сейчас, но я Рекомендую вам взглянуть на некоторые ресурсы 291 00:16:09,010 --> 00:16:11,175 в Интернете, если вы хотите узнать об этом. 292 00:16:11,175 --> 00:16:13,960 293 00:16:13,960 --> 00:16:16,550 >> СТИВЕН KREWSON: Так введите classes-- и это 294 00:16:16,550 --> 00:16:21,610 was-- классы типов были изобретены, чтобы решить 295 00:16:21,610 --> 00:16:24,160 проблема перегрузки операторов. 296 00:16:24,160 --> 00:16:27,590 Таким образом, мы хотели, чтобы равенство между различными типами вещей. 297 00:16:27,590 --> 00:16:31,040 Конечно, мы могли бы подумать of-- равенство между числовыми типами 298 00:16:31,040 --> 00:16:34,720 очень легко думать об этом, но то, что о равенстве между списками? 299 00:16:34,720 --> 00:16:37,610 Что о равенстве между древовидные структуры данных нога? 300 00:16:37,610 --> 00:16:43,130 И все это возможно в Haskell из классов типа. 301 00:16:43,130 --> 00:16:48,000 >> Так что, если вы определяете некий type-- данных и вот, это музыкальные площадки. 302 00:16:48,000 --> 00:16:50,960 Мы наконец-то в какой-то компьютерной музыки. 303 00:16:50,960 --> 00:16:57,420 Итак, мы имеем С, диез, и так далее и тому подобное. 304 00:16:57,420 --> 00:17:01,080 Они принадлежат к связке различные классы типа. 305 00:17:01,080 --> 00:17:03,510 EQ-- они принадлежат к классу типа эквалайзера. 306 00:17:03,510 --> 00:17:06,780 Это означает, что они поддерживают Операции равенства. 307 00:17:06,780 --> 00:17:12,650 Таким образом, вы можете оценить, насколько один последовательность музыкальных примитивов 308 00:17:12,650 --> 00:17:15,400 такой же, как другой. 309 00:17:15,400 --> 00:17:17,280 >> Они принадлежат к порядковому класса. 310 00:17:17,280 --> 00:17:19,479 Это означает, что есть упорядочение к ним. 311 00:17:19,479 --> 00:17:27,670 D приходит после С.-диез приходит после C, а также. 312 00:17:27,670 --> 00:17:29,840 Они принадлежат к классу показать, что означает, что они могут 313 00:17:29,840 --> 00:17:33,000 быть напечатаны на консоль или терминал. 314 00:17:33,000 --> 00:17:36,090 Они принадлежат к класс перечислил, что 315 00:17:36,090 --> 00:17:39,770 означает, что даже при том, эти персонажи, 316 00:17:39,770 --> 00:17:45,340 в их основе лежит числовой представление, начиная с 0 317 00:17:45,340 --> 00:17:48,960 и собирается покинуть через однако многие вещи здесь, 20 или около того, 318 00:17:48,960 --> 00:17:51,770 или 30, или 40, может быть. 319 00:17:51,770 --> 00:17:54,259 >> Коннор Харрис: А когда у нас есть тип данных 320 00:17:54,259 --> 00:17:57,050 что derives-- с этого ключевого слова "deriving--" определенный тип класса, 321 00:17:57,050 --> 00:18:01,160 это означает, что компилятор будет пытаться построить что-то автоматически. 322 00:18:01,160 --> 00:18:05,120 Так, может быть, вы хотите, чтобы определить качество по-разному. 323 00:18:05,120 --> 00:18:09,450 Вы хотите, чтобы определить диез равным ре-бемоль, например. 324 00:18:09,450 --> 00:18:11,560 При такой конструкции здесь, я не думаю, что диез 325 00:18:11,560 --> 00:18:14,940 и ре-бемоль будут равны, потому что компилятор автоматически 326 00:18:14,940 --> 00:18:19,670 говорят каждый другой возможное значение отличается от любой другой. 327 00:18:19,670 --> 00:18:22,930 >> Таким образом, можно переопределить Реализации по умолчанию 328 00:18:22,930 --> 00:18:25,730 из этих типов классов. 329 00:18:25,730 --> 00:18:28,640 Опять же, посмотрите на ссылки, если Вы хотите, чтобы узнать об этом. 330 00:18:28,640 --> 00:18:31,767 331 00:18:31,767 --> 00:18:33,600 СТИВЕН KREWSON: И здесь, на самом деле, это буду 332 00:18:33,600 --> 00:18:36,930 быть полезным, когда мы код позже. 333 00:18:36,930 --> 00:18:42,150 Мы видим, некоторые из операторов инфиксные для последовательного соединения 334 00:18:42,150 --> 00:18:46,570 параллельной композицией, и так вперед, эти плюсы и равные знаки 335 00:18:46,570 --> 00:18:48,620 в окружении двоеточиями. 336 00:18:48,620 --> 00:18:53,330 Это означает, что мы можем играть эти разные музыкальные примитивы один за другим. 337 00:18:53,330 --> 00:18:54,590 Это последовательная композиция. 338 00:18:54,590 --> 00:18:57,170 >> Или мы можем играть их в параллельно в то же время. 339 00:18:57,170 --> 00:19:05,100 Так что я могу иметь музыкальную ценность, и тогда это равняется и двоеточия, 340 00:19:05,100 --> 00:19:09,669 инфиксными оператора параллельной композиции, и играть их как своего рода аккордом. 341 00:19:09,669 --> 00:19:11,460 И мы собираемся использовать это, когда мы объединяем 342 00:19:11,460 --> 00:19:15,080 наш ударных с нашим немного Frere Жак песня 343 00:19:15,080 --> 00:19:19,460 играть в эти две последовательности музыкальные ценности, в то же время. 344 00:19:19,460 --> 00:19:24,520 345 00:19:24,520 --> 00:19:29,250 >> Карринг is-- Карри было в прошлом наименование Haskell Curry, который 346 00:19:29,250 --> 00:19:31,850 изображение Haskell назван в честь. 347 00:19:31,850 --> 00:19:34,330 И это позволяет нам приятно элегантность, когда мы 348 00:19:34,330 --> 00:19:36,880 пишу все эти разные функции или фильтры, которые мы 349 00:19:36,880 --> 00:19:39,330 будет отображение на наши списки. 350 00:19:39,330 --> 00:19:42,810 Функция двух arguments-- е х и y-- 351 00:19:42,810 --> 00:19:46,630 может быть представлена ​​в виде е х применяться у. 352 00:19:46,630 --> 00:19:49,800 Так что это функция один аргумент, который возвращает 353 00:19:49,800 --> 00:19:51,240 другая функция одного аргумента. 354 00:19:51,240 --> 00:19:56,962 Таким образом, это означает, что мы можете подключить Функция F х над списком значений у. 355 00:19:56,962 --> 00:19:58,920 Коннор Харрис: Хотите Приведем пример этого? 356 00:19:58,920 --> 00:19:59,836 СТИВЕН KREWSON: Да. 357 00:19:59,836 --> 00:20:05,390 У меня есть пример прямо здесь от некоторые из вещей, которые мы будем писать. 358 00:20:05,390 --> 00:20:10,500 Так повторить 2-- хорошо, повторить состоится 359 00:20:10,500 --> 00:20:13,040 одно значение, которое, сколько раз повторить то, 360 00:20:13,040 --> 00:20:16,690 а затем он будет принимать value-- как правило, список или что-то. 361 00:20:16,690 --> 00:20:23,450 Так вот, мы отображение повторить 2 над другом списке. 362 00:20:23,450 --> 00:20:27,440 >> Так что, если мы карте повторить 2, если мы повторить 2 применяются 363 00:20:27,440 --> 00:20:31,890 на первый элемент этого list-- и эти списки музыкальной phrases-- 364 00:20:31,890 --> 00:20:37,650 будет производить два "вы sleeping--" так ты спишь, спишь. 365 00:20:37,650 --> 00:20:40,040 Так что теперь у нас есть два. 366 00:20:40,040 --> 00:20:42,570 Но реплику занимает два Аргументы, а потому, что мы 367 00:20:42,570 --> 00:20:47,100 выделки, а затем отображение, мы можем представить копировщика 2 368 00:20:47,100 --> 00:20:52,310 как будто они были возвращены в зависимости от одним argument-- просто тиражирование в два раза. 369 00:20:52,310 --> 00:20:57,010 А потом мы применяем, что каждому элемент в этом списке фраз. 370 00:20:57,010 --> 00:21:01,900 >> И CONCAT является Haskell работа для выравнивания список. 371 00:21:01,900 --> 00:21:04,400 Потому повторной 2 воле составить список списков. 372 00:21:04,400 --> 00:21:06,660 И это это промежуточная форма здесь. 373 00:21:06,660 --> 00:21:10,365 И так, то мы можем Concat или сгладить, что дважды. 374 00:21:10,365 --> 00:21:12,240 Коннор Харрис: Более простой Пример карирования 375 00:21:12,240 --> 00:21:15,323 если вы хотите представить like-- е это просто Функция умножения, который принимает два 376 00:21:15,323 --> 00:21:16,840 Аргументы и возвращает их продукт. 377 00:21:16,840 --> 00:21:19,320 Так что, если у вас есть F 4 5, это 20. 378 00:21:19,320 --> 00:21:22,670 Но вы можете думать об этом как also-- у вас есть функция F 4 379 00:21:22,670 --> 00:21:25,560 который принимает аргумент и возвращает четыре раза в этом argument-- только 380 00:21:25,560 --> 00:21:27,870 частичное применение которых только один аргумент 4. 381 00:21:27,870 --> 00:21:31,182 И если вы кормите е из 4 5, что даст вам 20. 382 00:21:31,182 --> 00:21:32,890 И это проще, Пример выделки. 383 00:21:32,890 --> 00:21:34,473 Это, как правило, один из них учебников. 384 00:21:34,473 --> 00:21:38,860 385 00:21:38,860 --> 00:21:42,110 >> СТИВЕН KREWSON: Лямбда выражения или анонимные функции 386 00:21:42,110 --> 00:21:47,330 еще один признак Haskell. 387 00:21:47,330 --> 00:21:51,242 Так что, если мы должны сделать на скорую руку маленькая функция повторной жизнь, 388 00:21:51,242 --> 00:21:52,950 но сказать, что это не стандартная библиотека, 389 00:21:52,950 --> 00:21:56,150 мы можем использовать синтаксис похожий на следующий. 390 00:21:56,150 --> 00:21:58,730 И мы будем над этим ветер. 391 00:21:58,730 --> 00:22:02,160 Одна вещь, вы увидите много в барабан машины мы звонков 392 00:22:02,160 --> 00:22:05,790 в то, что называется фильтр, который, как и прежде, 393 00:22:05,790 --> 00:22:08,185 это отображение функции по списку, но это 394 00:22:08,185 --> 00:22:10,260 отображение булевой функции. 395 00:22:10,260 --> 00:22:13,390 >> Таким образом, мы имеем здесь пример в А анонимно 396 00:22:13,390 --> 00:22:19,150 определяется булева функция, что просто берет пару значений. 397 00:22:19,150 --> 00:22:22,990 Это, строго говоря анонимная функция. 398 00:22:22,990 --> 00:22:25,850 Но это определение с что синтаксис для краткости, 399 00:22:25,850 --> 00:22:28,007 и это только берет х модуль N-- 400 00:22:28,007 --> 00:22:28,840 Коннор Харрис: Да. 401 00:22:28,840 --> 00:22:31,330 Так е является функцией два аргумента п р и 402 00:22:31,330 --> 00:22:35,440 что возвращает функцию, которая сама функция одного аргумента, а именно х. 403 00:22:35,440 --> 00:22:38,815 404 00:22:38,815 --> 00:22:40,690 СТИВЕН KREWSON: Я вышеуказанные операторы инфиксные. 405 00:22:40,690 --> 00:22:42,642 Какие операторы инфиксные? 406 00:22:42,642 --> 00:22:45,710 Ну, операторы инфиксные являются нормальный способ мы представляем операций, 407 00:22:45,710 --> 00:22:49,910 говорят, в mathematics-- 2 плюс 2 вместо оператора плюс 408 00:22:49,910 --> 00:22:51,202 а затем два аргумента 2 и 2. 409 00:22:51,202 --> 00:22:53,701 Коннор Харрис: Это называется обратной польской нотации, которая является 410 00:22:53,701 --> 00:22:55,330 термин, который я сомневаюсь, что любой из вас знают. 411 00:22:55,330 --> 00:22:56,288 >> СТИВЕН KREWSON: Верно. 412 00:22:56,288 --> 00:22:58,290 Обратный польский или префикс обозначения. 413 00:22:58,290 --> 00:23:01,412 Но Haskell решил использовать операторы инфиксные. 414 00:23:01,412 --> 00:23:03,120 Так вот некоторые из пользовательские те, которые 415 00:23:03,120 --> 00:23:07,770 определяются для Euterpea DSCL в Haskell. 416 00:23:07,770 --> 00:23:10,730 Так что это было последовательная композиция. 417 00:23:10,730 --> 00:23:16,340 Это было параллельно композиции, и это был усечения параллельной композиции. 418 00:23:16,340 --> 00:23:18,710 И мы должны, что с нашей драм-машины, 419 00:23:18,710 --> 00:23:22,640 потому что мы будем использовать последний оператор в этой маленькой кортежа там 420 00:23:22,640 --> 00:23:26,330 играть драм-машину вместе с нашей Frere Жака песни. 421 00:23:26,330 --> 00:23:28,650 И наша машина барабанного будет бесконечным. 422 00:23:28,650 --> 00:23:30,920 Это просто играет вечно. 423 00:23:30,920 --> 00:23:32,692 Но песня Frere Жак нет. 424 00:23:32,692 --> 00:23:33,510 Это не так долго. 425 00:23:33,510 --> 00:23:36,610 Это только несколько баров. 426 00:23:36,610 --> 00:23:43,030 Таким образом, мы должны остановить машину, как барабан только короче музыкальный значение приходит 427 00:23:43,030 --> 00:23:43,700 к концу. 428 00:23:43,700 --> 00:23:46,980 И, что оператор инфиксальный супер полезно с этим. 429 00:23:46,980 --> 00:23:50,090 >> И инфиксный обозначения, как это отчасти хорошо, 430 00:23:50,090 --> 00:23:57,095 потому что у вас есть функции, как цитата, которая дает целочисленное деление 431 00:23:57,095 --> 00:24:01,010 х что-то else-- извините, что должно быть, и б. 432 00:24:01,010 --> 00:24:04,740 Вы могли бы написать его в качестве цитатой Ь. 433 00:24:04,740 --> 00:24:09,670 Так что если вы put-- элемент Другой пример. 434 00:24:09,670 --> 00:24:14,730 х элемент некоторого списка, если вы положили он в обратные кавычки, вы можете использовать его. 435 00:24:14,730 --> 00:24:20,400 Даже если это не символ как плюс или минус или времени, 436 00:24:20,400 --> 00:24:24,630 Вы можете использовать имя функции, как, что в обратные кавычки 437 00:24:24,630 --> 00:24:27,045 а инфиксной оператора, который является довольно прохладно. 438 00:24:27,045 --> 00:24:29,670 Коннор Харрис: Опять же, это Все просто синтаксический сахар, на самом деле. 439 00:24:29,670 --> 00:24:32,310 Это не влияет на ядро ​​языка. 440 00:24:32,310 --> 00:24:37,440 >> СТИВЕН KREWSON: Итак, мы видим здесь для Последняя фраза нашего Frere Жака песни, 441 00:24:37,440 --> 00:24:45,740 Я сыграл несколько маленьких аккорды или трети, используя параллельный состав 442 00:24:45,740 --> 00:24:46,240 оператором. 443 00:24:46,240 --> 00:24:50,680 444 00:24:50,680 --> 00:24:54,950 Это еще один способ сказать некоторые что мы только что говорили. 445 00:24:54,950 --> 00:24:59,986 Таким образом, вы можете подключить функции одного аргумента за списки. 446 00:24:59,986 --> 00:25:02,860 Коннор Харрис: Снова, ссылки для Haskell-- вступительных учебников 447 00:25:02,860 --> 00:25:04,680 будут иметь все это в нем. 448 00:25:04,680 --> 00:25:07,790 >> СТИВЕН KREWSON: Так вот довольно Ключевым направлением в пошаговый секвенсор 449 00:25:07,790 --> 00:25:12,820 мы взглянем на использовании список понимание. 450 00:25:12,820 --> 00:25:17,810 И мы видим, что здесь элемент в оператора фиксированной в обратные кавычки. 451 00:25:17,810 --> 00:25:23,030 Таким образом, если х является элементом списка х годов, то мы будем называть себя функции Проц. 452 00:25:23,030 --> 00:25:25,100 Так PERC это просто функция перкуссии. 453 00:25:25,100 --> 00:25:30,200 Это занимает некоторое значение р, что это часть ограниченного множества всех 454 00:25:30,200 --> 00:25:35,310 различные звуки ударных что мы видели в предыдущем слайде, 455 00:25:35,310 --> 00:25:38,840 и затем она дает, что Продолжительность четвертной ноты. 456 00:25:38,840 --> 00:25:43,190 Иначе это дает ему QNR и QNR просто на четверть тона отдых. 457 00:25:43,190 --> 00:25:44,970 >> Так что это что-то строить хороший. 458 00:25:44,970 --> 00:25:52,110 У нас есть список элементов, и мы будем цикл по какой-то список из одного 459 00:25:52,110 --> 00:25:54,540 в максимальное значение нашей пошаговый секвенсор. 460 00:25:54,540 --> 00:25:58,290 И когда мы в частности, я в что список от одного до максимального значения, 461 00:25:58,290 --> 00:26:02,970 если я является членом этого Набор создан в этой функции, 462 00:26:02,970 --> 00:26:06,040 Ну, тогда мы превращаем его в ударных ноты. 463 00:26:06,040 --> 00:26:10,960 В противном случае, мы просто играем отдохнуть, что есть, мы просто молчать. 464 00:26:10,960 --> 00:26:16,050 И мы видим, что в здесь этот список синтаксис понимание, 465 00:26:16,050 --> 00:26:20,030 х населен это Список построен один 466 00:26:20,030 --> 00:26:22,462 в глобальной размера секвенсор. 467 00:26:22,462 --> 00:26:23,295 Коннор Харрис: Да. 468 00:26:23,295 --> 00:26:26,340 Основной синтаксис для списочные является 469 00:26:26,340 --> 00:26:30,810 кронштейн, стоимость привлечения некоторые переменные, бар, 470 00:26:30,810 --> 00:26:34,260 Возможные значения переменных сами закрыт кронштейн. 471 00:26:34,260 --> 00:26:38,545 И если вы сделали набор строителя обозначения в какой-либо класс математики, 472 00:26:38,545 --> 00:26:45,999 Вы, возможно, установить такие 2n что п в и н г в. 473 00:26:45,999 --> 00:26:48,290 Похожие thing-- этой записи предназначается, чтобы быть наводящим 474 00:26:48,290 --> 00:26:49,630 этой математической нотации. 475 00:26:49,630 --> 00:26:51,880 СТИВЕН KREWSON: И вы можете применить несколько предикатов 476 00:26:51,880 --> 00:26:56,250 и несколько фильтров в списке понимание, что очень приятно. 477 00:26:56,250 --> 00:27:01,800 Алгебраическая types-- мы не будет задерживаться долго здесь. 478 00:27:01,800 --> 00:27:04,840 Там не очень хорошая идея в Haskell или хороший, очевидно, понятие 479 00:27:04,840 --> 00:27:10,720 о том, как принять, скажем, по умолчанию параметр функции или что-то. 480 00:27:10,720 --> 00:27:13,370 В Python, это довольно легко. 481 00:27:13,370 --> 00:27:18,460 Вы можете просто сказать, равна по декларация функции, 482 00:27:18,460 --> 00:27:21,420 значение по умолчанию в когда ни одна не поставляется. 483 00:27:21,420 --> 00:27:27,010 >> В Haskell, вы могли бы, может быть, использовать, может быть, может быть, введите, 484 00:27:27,010 --> 00:27:32,190 который не принимает ни ничего или значение типа просто. 485 00:27:32,190 --> 00:27:38,630 Так мы используем это в драм-машины чтобы нам дать дополнительный объем 486 00:27:38,630 --> 00:27:40,730 Параметры для каждой из барабанных деталей. 487 00:27:40,730 --> 00:27:46,160 488 00:27:46,160 --> 00:27:54,680 Так что дает нам способ иметь эквалайзер или объем на определенном канале. 489 00:27:54,680 --> 00:27:56,440 >> Коннор Харрис: В другие примеры в Haskell, 490 00:27:56,440 --> 00:28:00,450 Вы можете увидеть, может быть, для Функции, которые могут выйти из строя. 491 00:28:00,450 --> 00:28:03,470 Это является общим. 492 00:28:03,470 --> 00:28:07,010 >> СТИВЕН KREWSON: И вы можете поставить своего рода сообщения об ошибке по умолчанию. 493 00:28:07,010 --> 00:28:11,020 И это особенно удобно, когда вы делаете I / O в Haskell. 494 00:28:11,020 --> 00:28:12,044 Это может быть трюки. 495 00:28:12,044 --> 00:28:13,960 Коннор Харрис: Или для Аналогичный пример, думаю, 496 00:28:13,960 --> 00:28:17,460 функции, что предполагает разделение параметра, которые могут быть 0. 497 00:28:17,460 --> 00:28:20,020 И, что функция может вернуться, может быть, что угодно. 498 00:28:20,020 --> 00:28:22,802 Так что, если нет деления на 0, он вернется только угодно. 499 00:28:22,802 --> 00:28:25,010 А если есть деление на 0, то не будет ничего возвращать 500 00:28:25,010 --> 00:28:26,910 как способ сигнализации об ошибке. 501 00:28:26,910 --> 00:28:30,330 Потому что одним из следствий Очень жесткая типизация в Haskell 502 00:28:30,330 --> 00:28:34,100 является то, что нет real-- Исключением являются неловко, в основном, 503 00:28:34,100 --> 00:28:36,160 обработка ошибок неудобно. 504 00:28:36,160 --> 00:28:39,440 И это одна очень распространенный способ сделать это. 505 00:28:39,440 --> 00:28:42,990 >> СТИВЕН KREWSON: Так что теперь мы получаем на другой галлюциногенный вещи 506 00:28:42,990 --> 00:28:49,160 о Haskell, которая является картина соответствия и функциональные определения. 507 00:28:49,160 --> 00:28:53,390 Я показал вам, в прошлом слайде Декларация последовательности шагов 508 00:28:53,390 --> 00:28:58,170 функция, которая взяла возможно ценность, затем INT, то список целых чисел, 509 00:28:58,170 --> 00:29:03,850 затем возвращает последовательность музыка значения есть аннотированный 510 00:29:03,850 --> 00:29:05,375 и с высоты и объема. 511 00:29:05,375 --> 00:29:08,030 512 00:29:08,030 --> 00:29:11,820 >> Так что те три аргумента может быть образец соответствует следующим образом. 513 00:29:11,820 --> 00:29:16,660 И мы всегда хотим быть уверены, что сделать базовый случай или выхода случай первым. 514 00:29:16,660 --> 00:29:19,690 И эти подчеркивания может быть просто интерпретировать 515 00:29:19,690 --> 00:29:22,340 означает любое значение, там. 516 00:29:22,340 --> 00:29:26,580 Так что, если мы получаем вызов к шагу последовательность с некоторым значением, некоторое другое значение, 517 00:29:26,580 --> 00:29:32,210 а затем пустой список, то, что мы хотим вернуться только тишина, отдых 0. 518 00:29:32,210 --> 00:29:35,110 >> И вместо того, что будучи пустой список или 0, 519 00:29:35,110 --> 00:29:38,150 это отдых 0, потому что мы дело с типом музыки, 520 00:29:38,150 --> 00:29:43,230 и пустой список музыки тип просто остальные не срок. 521 00:29:43,230 --> 00:29:45,680 Это не музыка. 522 00:29:45,680 --> 00:29:51,460 И тогда мы видим, если мы получим шаг последовательность с V по объему аргумент, 523 00:29:51,460 --> 00:29:57,290 р для предосторожности инструмента Аргумент, а затем список х годов. 524 00:29:57,290 --> 00:29:58,360 >> Затем мы делаем некоторые вещи. 525 00:29:58,360 --> 00:30:01,290 В частности, мы применяем этот список понимание, 526 00:30:01,290 --> 00:30:05,700 и мы выполнить некоторые операции на возможно значения 527 00:30:05,700 --> 00:30:10,050 чтобы превратить его в числовое значение, так что это может быть затем перечислены и использованы 528 00:30:10,050 --> 00:30:12,300 чтобы выбрать инструмент. 529 00:30:12,300 --> 00:30:16,730 Опять же, это немного немного сознательно неточной 530 00:30:16,730 --> 00:30:20,580 просто чтобы показать все странные вещи вы можете сделать в Haskell, как вы 531 00:30:20,580 --> 00:30:23,170 взглянуть на него на вашем собственном времени. 532 00:30:23,170 --> 00:30:23,802 >> Отлично. 533 00:30:23,802 --> 00:30:26,010 Так мы, наконец, добраться до делать то, что мы намеревались сделать, 534 00:30:26,010 --> 00:30:28,820 что сделать некоторые компьютерную музыку. 535 00:30:28,820 --> 00:30:32,250 Итак, мы собираемся, чтобы попытаться сделать песню Frere Жак. 536 00:30:32,250 --> 00:30:35,220 Таким образом, есть, сколько фразы в Frere Жак? 537 00:30:35,220 --> 00:30:38,790 538 00:30:38,790 --> 00:30:39,680 4. 539 00:30:39,680 --> 00:30:40,460 Отлично. 540 00:30:40,460 --> 00:30:42,490 И, что приятно, что они все повторяется 541 00:30:42,490 --> 00:30:46,990 то же самое количество раз, что в два. 542 00:30:46,990 --> 00:30:50,730 >> Таким образом, мы имеем четыре фразы каждый повторяют два раза. 543 00:30:50,730 --> 00:30:53,590 И в частности, они в туре. 544 00:30:53,590 --> 00:30:55,340 И есть много, много способов для реализации 545 00:30:55,340 --> 00:30:57,520 круглый, которые могли бы быть забавно. 546 00:30:57,520 --> 00:31:00,260 Я сделал это в довольно простой способ здесь, 547 00:31:00,260 --> 00:31:05,760 который просто construct-- линию Функция принимает список музыкальных ценностей 548 00:31:05,760 --> 00:31:10,390 и превращает его в последовательном состава путем применения последовательной композиции, что 549 00:31:10,390 --> 00:31:13,000 оператором. 550 00:31:13,000 --> 00:31:19,540 >> И тогда я задержать различные части делая их начинают с остальной. 551 00:31:19,540 --> 00:31:22,770 Так что я начать с остальной двух мер, а затем остальные четыре меры, 552 00:31:22,770 --> 00:31:26,160 а затем остальные шесть меры, а затем круглый 553 00:31:26,160 --> 00:31:32,290 работает, как мы все знаем, эту песню. 554 00:31:32,290 --> 00:31:37,180 Мы видим два аннотации или модификации музыкальных ценностей 555 00:31:37,180 --> 00:31:43,150 , которые содержатся в этом последовательном аранжировка музыки элементов. 556 00:31:43,150 --> 00:31:44,810 У нас есть объем надстройки. 557 00:31:44,810 --> 00:31:48,960 Эта функция, чтобы комментировать музыка с определенной объема. 558 00:31:48,960 --> 00:31:51,320 Это хороший пример сигнального подряд MIDI 559 00:31:51,320 --> 00:31:57,510 от 0 до 127, семь бит информация, которая может быть выполнена. 560 00:31:57,510 --> 00:32:00,650 >> И then-- мы видели его очень кратко, но общий MIDI- 561 00:32:00,650 --> 00:32:02,310 Список всех различных инструментов. 562 00:32:02,310 --> 00:32:04,450 И там не намного от них. 563 00:32:04,450 --> 00:32:11,230 Если вы используете цифровой аудио рабочей станции, как Ableton Live или Pro Tools, 564 00:32:11,230 --> 00:32:17,560 есть невероятно широкий диапазон синтезаторов и VST инструментов. 565 00:32:17,560 --> 00:32:21,510 Но стандарт MIDI только имеет несколько, или несколько десятков. 566 00:32:21,510 --> 00:32:22,799 И некоторые из них смешные. 567 00:32:22,799 --> 00:32:25,840 Я думал, что это будет весело, если мы играли инструмент инструмент MIDI- 568 00:32:25,840 --> 00:32:30,550 Вертолет, а затем Следующий способ раунда, 569 00:32:30,550 --> 00:32:37,980 мы сделали площадку синтезатор, а затем это банально ведущий меандр синтезатор, 570 00:32:37,980 --> 00:32:44,240 а затем высказать ил, которые являются немного нечеткие на мой плохой MIDI 571 00:32:44,240 --> 00:32:46,410 синтезатор, но они ОК. 572 00:32:46,410 --> 00:32:50,030 >> И тогда мы видим, этот Пусть и в синтаксисе из Haskell, 573 00:32:50,030 --> 00:32:54,030 а затем мы играем все эти части вместе 574 00:32:54,030 --> 00:32:56,265 с оператором параллельной композиции. 575 00:32:56,265 --> 00:33:00,260 576 00:33:00,260 --> 00:33:02,296 И мы могли бы, вероятно, покажут некоторые из этого. 577 00:33:02,296 --> 00:33:07,674 578 00:33:07,674 --> 00:33:08,340 Вот код. 579 00:33:08,340 --> 00:33:14,960 И вы можете видеть в C, есть был бы много очистки горла и установка 580 00:33:14,960 --> 00:33:19,760 Код таблицы перед вами может сделать музыку, как это. 581 00:33:19,760 --> 00:33:22,080 Или любой другой программирования язык, вы, вероятно, 582 00:33:22,080 --> 00:33:27,210 должны взаимодействовать с какой-то библиотеки или API, и установить все, 583 00:33:27,210 --> 00:33:28,725 и тогда вам придется убирать. 584 00:33:28,725 --> 00:33:33,810 Но здесь, в Haskell, я думаю, что, как только вы получите повесить его, невероятно 585 00:33:33,810 --> 00:33:35,770 читается и очень выразительным. 586 00:33:35,770 --> 00:33:38,930 587 00:33:38,930 --> 00:33:43,240 Так что реализация из Frere Жак. 588 00:33:43,240 --> 00:33:43,740 Отлично. 589 00:33:43,740 --> 00:33:47,557 Теперь мы хотим, чтобы добавить ударные, и это немного грязнее. 590 00:33:47,557 --> 00:33:49,015 Итак, давайте взглянем на слайдах. 591 00:33:49,015 --> 00:33:56,880 592 00:33:56,880 --> 00:34:00,540 Таким образом, большая идея, чтобы сделать куча списков или их частей. 593 00:34:00,540 --> 00:34:04,140 На этих машинах Передвижной есть были, как правило, может быть, восемь о 594 00:34:04,140 --> 00:34:08,670 10 ритм ударных или частей. 595 00:34:08,670 --> 00:34:10,159 И затем использовать связку методов. 596 00:34:10,159 --> 00:34:14,889 И мы говорили о these-- помощью складок, фильтры, лямбда функции, 597 00:34:14,889 --> 00:34:19,429 отображается над списками для генерации значений в некотором диапазоне от 1 до г, г 16, 598 00:34:19,429 --> 00:34:20,699 или 32 шагов в секвенсоре. 599 00:34:20,699 --> 00:34:23,810 600 00:34:23,810 --> 00:34:29,920 >> И потом, если есть значение в этом списке как мы бежим через секвенсор, 601 00:34:29,920 --> 00:34:34,190 проходит через него снова и более, оказывается на этой ноте, 602 00:34:34,190 --> 00:34:36,060 и что образец сработал. 603 00:34:36,060 --> 00:34:42,810 604 00:34:42,810 --> 00:34:47,110 Вот все разные странные способы Я придумал для генерации примечания. 605 00:34:47,110 --> 00:34:48,940 Попробуйте это на свой страх и полу суммы. 606 00:34:48,940 --> 00:34:50,360 Это будет звучать круто. 607 00:34:50,360 --> 00:34:53,066 608 00:34:53,066 --> 00:34:54,690 Если позволит время, мы будем проходить через это. 609 00:34:54,690 --> 00:34:59,200 Но сейчас, я думаю, мы должны демо, что у нас есть. 610 00:34:59,200 --> 00:35:01,380 Будем надеяться, что это идет ОК. 611 00:35:01,380 --> 00:35:02,670 >> Так что это GHCI. 612 00:35:02,670 --> 00:35:06,580 613 00:35:06,580 --> 00:35:09,121 И мы будем загружать файл Я назвал song.lhs, 614 00:35:09,121 --> 00:35:10,620 что файл я только что показал вам. 615 00:35:10,620 --> 00:35:11,470 Ок, отлично. 616 00:35:11,470 --> 00:35:15,010 Как сказал Коннор ранее, составлен, его тип установлен, 617 00:35:15,010 --> 00:35:18,380 так что я могу дышать намного легче. 618 00:35:18,380 --> 00:35:20,010 Это не собирается взорвать на меня. 619 00:35:20,010 --> 00:35:22,720 >> Я хочу показать вам что-то полезное. 620 00:35:22,720 --> 00:35:25,900 Вы можете видеть, что Модуль загружен называется 50. 621 00:35:25,900 --> 00:35:28,240 Вы можете просмотреть этот модуль. 622 00:35:28,240 --> 00:35:32,092 И это так приятно о doing-- возможно, что 623 00:35:32,092 --> 00:35:34,550 вы делаете в Haskell не называется разработка программного обеспечения, 624 00:35:34,550 --> 00:35:36,980 но вы можете сделать много забавный материал по своему усмотрению. 625 00:35:36,980 --> 00:35:42,410 И рабочий процесс на самом деле хорошо, как по сравнению с много других языков, 626 00:35:42,410 --> 00:35:45,872 потому что вы можете увидеть в действительно читаемый способ, что происходит. 627 00:35:45,872 --> 00:35:47,830 Таким образом, мы видим, что у нас есть все эти фразы, которые 628 00:35:47,830 --> 00:35:53,760 списки музыкальных площадках, и тогда мы построить эти вверх в нечто большее, 629 00:35:53,760 --> 00:35:55,220 которая представляет собой музыка песня. 630 00:35:55,220 --> 00:35:58,450 Это музыкальный блок. 631 00:35:58,450 --> 00:36:05,545 И тогда мы можем играть все это с функцией называется играть музыку. 632 00:36:05,545 --> 00:36:09,040 Вы можете видеть, что здесь. 633 00:36:09,040 --> 00:36:11,310 Который просто играть. 634 00:36:11,310 --> 00:36:15,040 >> Я должен say-- я не говорить о это знак доллара, что везде. 635 00:36:15,040 --> 00:36:17,980 Доллар знак другого оператора инфиксный. 636 00:36:17,980 --> 00:36:22,500 Но он имеет самый низкий приоритет любого оператора, который эффективно 637 00:36:22,500 --> 00:36:24,960 означает, что все на Слева от знака доллара 638 00:36:24,960 --> 00:36:28,460 и право на знак доллара, мы собираемся, чтобы оценить до него. 639 00:36:28,460 --> 00:36:31,430 Так что это вроде как другой способ добавления скобки. 640 00:36:31,430 --> 00:36:33,980 641 00:36:33,980 --> 00:36:36,220 >> Коннор Харрис: Это в основном композиция функций. 642 00:36:36,220 --> 00:36:40,026 И это гарантирует, что вы не have-- если у вас есть функции либо сторону или инфикс 643 00:36:40,026 --> 00:36:42,900 Операторы по обе стороны, они не будут связать по нему и дать вам 644 00:36:42,900 --> 00:36:46,030 неожиданные результаты. 645 00:36:46,030 --> 00:36:49,790 >> СТИВЕН KREWSON: Таким образом, мы can-- используя, что мы можем назвать. 646 00:36:49,790 --> 00:36:51,415 Во-первых, мы будем играть без барабанов. 647 00:36:51,415 --> 00:37:00,330 648 00:37:00,330 --> 00:37:03,170 Это вертолет, миди вертолет. 649 00:37:03,170 --> 00:37:05,495 >> [Играет музыка] 650 00:37:05,495 --> 00:37:08,525 651 00:37:08,525 --> 00:37:09,525 Там же меандр. 652 00:37:09,525 --> 00:37:24,520 653 00:37:24,520 --> 00:37:25,490 Голос ил. 654 00:37:25,490 --> 00:37:27,630 И вы действительно можете идти дикой природы с этим. 655 00:37:27,630 --> 00:37:30,872 Я выбрал довольно простой, потому что я знал, я не должен откусить 656 00:37:30,872 --> 00:37:31,830 больше, чем я мог жевать. 657 00:37:31,830 --> 00:37:36,460 Просто держать его довольно просто показать основные идеи. 658 00:37:36,460 --> 00:37:39,952 Но тогда я был как, мы получил добавить на барабанах на это. 659 00:37:39,952 --> 00:37:41,910 Просто потому, что это немного непроницаемой, 660 00:37:41,910 --> 00:37:45,790 и я не использовать Название барабанных партий, 661 00:37:45,790 --> 00:37:49,490 Я отображаются them--, потому что они часть перечисленного класса, 662 00:37:49,490 --> 00:37:51,500 Я отображаются их целых чисел. 663 00:37:51,500 --> 00:37:53,120 Одним из них является, как бас-барабана. 664 00:37:53,120 --> 00:37:54,370 Ноль также. 665 00:37:54,370 --> 00:37:56,000 Семь высокая шляпа. 666 00:37:56,000 --> 00:38:00,920 И вот здесь, где Функции получить немного больше случайных, 667 00:38:00,920 --> 00:38:02,100 это как конго барабаны. 668 00:38:02,100 --> 00:38:08,360 >> Так что, если вы думаете, может быть, about-- интересный способ реализации драм-машину 669 00:38:08,360 --> 00:38:12,830 является использование очень организованно узоры на вашей бас-барабана. 670 00:38:12,830 --> 00:38:17,640 Так, например, на фильтрации над Список со всем, что дает обратно 671 00:38:17,640 --> 00:38:20,590 1, когда он взял модуль 04. 672 00:38:20,590 --> 00:38:27,190 Так что я получить 1, 5, 9, 13, 17-- так что это первый удар каждого такта. 673 00:38:27,190 --> 00:38:32,860 >> И тогда это то же самое вещь перешла двух шагов. 674 00:38:32,860 --> 00:38:33,850 Так что это необычный. 675 00:38:33,850 --> 00:38:37,480 Так что это будет что-то вроде высокой шляпе. 676 00:38:37,480 --> 00:38:39,640 И опять же, здесь, это немного случайным, 677 00:38:39,640 --> 00:38:41,080 потому что мы делаем Конга барабаны. 678 00:38:41,080 --> 00:38:44,180 И у меня есть некоторые маракасы сюда, тоже. 679 00:38:44,180 --> 00:38:50,280 >> Так что я мог позвонить воспроизведения драм-машины, но она будет идти вечно, 680 00:38:50,280 --> 00:38:53,700 и он может начать захват до вся память в моей системе. 681 00:38:53,700 --> 00:38:57,090 Так что я буду называть эту функцию играть музыку, которая, как мы увидим, 682 00:38:57,090 --> 00:39:02,020 использовать усечение параллельной композиции играть наш маленький Frere Жак песню 683 00:39:02,020 --> 00:39:04,200 наряду с этим странным драм-машины. 684 00:39:04,200 --> 00:39:06,190 Итак, давайте взглянем. 685 00:39:06,190 --> 00:39:10,920 И, пожалуйста, улучшить мой расположение всех частей барабана. 686 00:39:10,920 --> 00:39:13,375 Не моя специальность, но я было много веселья делает его. 687 00:39:13,375 --> 00:39:17,678 688 00:39:17,678 --> 00:39:20,654 >> [Играет музыка] 689 00:39:20,654 --> 00:39:52,260 690 00:39:52,260 --> 00:39:56,980 >> Поэтому, конечно, это все немного не так весело, 691 00:39:56,980 --> 00:40:01,100 если мы не можем преобразовать его в счет, так, может быть, это 692 00:40:01,100 --> 00:40:04,650 может быть истолковано по исполнителю человека. 693 00:40:04,650 --> 00:40:06,535 Поэтому я не буду работать здесь. 694 00:40:06,535 --> 00:40:07,910 Я уже сгенерировали файлы. 695 00:40:07,910 --> 00:40:10,280 Вы можете видеть, что есть точка LilyPond file-- и это 696 00:40:10,280 --> 00:40:14,500 будет мой Segue к Connor-- и файл MIDI точка, 697 00:40:14,500 --> 00:40:18,610 и точка в формате PDF файл, который есть что LilyPond, в конечном счете произвести. 698 00:40:18,610 --> 00:40:23,770 >> Но это те сценарии, и я буду просто запустить их с вариантами помощь. 699 00:40:23,770 --> 00:40:28,090 Если вы получаете эти и работает с Euterpea, вы можете генерировать MIDI файл. 700 00:40:28,090 --> 00:40:31,160 А потом из MIDI-файла с этой программой MIDI-2LY, 701 00:40:31,160 --> 00:40:34,930 Вы можете создать Лили Пруд файл, а затем вы 702 00:40:34,930 --> 00:40:37,974 может генерировать PDF партитуры. 703 00:40:37,974 --> 00:40:39,390 И мы должны взглянуть на это. 704 00:40:39,390 --> 00:40:52,599 705 00:40:52,599 --> 00:40:55,140 Так Коннор, вероятно, покажут Вы, как комментировать это лучше, 706 00:40:55,140 --> 00:41:02,570 но это, как Жак Frere генерируется мной в Euterpea. 707 00:41:02,570 --> 00:41:07,300 Это просто в C. Я должен понял из того, что взломать это на самом деле в. 708 00:41:07,300 --> 00:41:11,090 Но это трубопровод для как это делать, с этим. 709 00:41:11,090 --> 00:41:12,950 Давайте больше поговорить о LilyPond. 710 00:41:12,950 --> 00:41:15,780 >> Коннор Харрис: ОК Давайте посмотрим. 711 00:41:15,780 --> 00:41:19,480 712 00:41:19,480 --> 00:41:21,419 Разве вы упоминаете Узнайте у вас Haskell? 713 00:41:21,419 --> 00:41:22,460 СТИВЕН KREWSON: О, да. 714 00:41:22,460 --> 00:41:23,480 Проверьте научит вас Haskell. 715 00:41:23,480 --> 00:41:24,410 Это в ресурсах. 716 00:41:24,410 --> 00:41:26,830 Вот как я начал обучение, и это здорово. 717 00:41:26,830 --> 00:41:27,580 Не тупой обучения. 718 00:41:27,580 --> 00:41:28,829 >> Коннор Харрис: Так что это в Интернете. 719 00:41:28,829 --> 00:41:34,760 Таким образом, парень по имени [неразборчиво] learnyouahaskell.com, без пробелов. 720 00:41:34,760 --> 00:41:37,065 Грамматика болен. 721 00:41:37,065 --> 00:41:38,690 СТИВЕН KREWSON: Это иллюстрированный тоже. 722 00:41:38,690 --> 00:41:39,440 Коннор Харрис: Так что LilyPond? 723 00:41:39,440 --> 00:41:42,480 Это декларативное программирование язык музыки верстки. 724 00:41:42,480 --> 00:41:45,480 Так declarative-- вы можете думать о таких вещах, как HTML, 725 00:41:45,480 --> 00:41:50,900 где вы не saying-- HTML не сказать, как веб-браузеры должны 726 00:41:50,900 --> 00:41:52,180 делают страницы шаг за шагом. 727 00:41:52,180 --> 00:41:54,096 Это просто говорю, что это это текстовое описание 728 00:41:54,096 --> 00:41:56,100 что вы хотите, чтобы страница выглядеть. 729 00:41:56,100 --> 00:41:59,310 >> И тогда это также программа что компилирует этот язык, 730 00:41:59,310 --> 00:42:02,300 или прочитать его по прибытии, а затем фактически делает верстку для вас, 731 00:42:02,300 --> 00:42:05,570 и он выплевывает их прекрасные глядя забивает PDF. 732 00:42:05,570 --> 00:42:08,250 Вы также можете получить формат PNG или что-то. 733 00:42:08,250 --> 00:42:10,300 Хороший способ думать это по аналогии 734 00:42:10,300 --> 00:42:16,620 является то, что латекс вроде LillyPond, но только обычной верстки. 735 00:42:16,620 --> 00:42:20,360 Таким образом, вместо of-- это не WYSIWYG, что вы видите 736 00:42:20,360 --> 00:42:22,960 Что вы получаете, как, скажем, Финал есть, или Сибелиуса, 737 00:42:22,960 --> 00:42:27,430 или Microsoft Word, где вы можете ввести в режиме реального времени и проекты вещи в реальном времени 738 00:42:27,430 --> 00:42:31,340 и увидеть изменения мгновенно. 739 00:42:31,340 --> 00:42:32,140 >> Это текстовый. 740 00:42:32,140 --> 00:42:35,290 Вы должны скомпилировать оценки, использующие отдельную программу 741 00:42:35,290 --> 00:42:37,090 и выйти PDF-файлов позже. 742 00:42:37,090 --> 00:42:43,320 Это немного меньше, удобно для использования, если вы 743 00:42:43,320 --> 00:42:46,520 пытаюсь написать непосредственно в счет, и вы 744 00:42:46,520 --> 00:42:48,620 пытаются составить на компьютере. 745 00:42:48,620 --> 00:42:50,830 Но есть много преимуществ для него. 746 00:42:50,830 --> 00:42:56,110 Один из них, это выглядит намного лучше, потому что на самом деле LillyPond может 747 00:42:56,110 --> 00:42:58,210 взять время, чтобы сделать компоновочных решений должным образом, 748 00:42:58,210 --> 00:43:02,380 в отличие от Сибелиуса или Finale, которые имеют сделать взломанных алгоритмов так 749 00:43:02,380 --> 00:43:05,020 что они могут отображать вещи в режиме реального времени. 750 00:43:05,020 --> 00:43:07,660 >> Так почему LilyPond-- компьютерная графика трудно. 751 00:43:07,660 --> 00:43:10,535 Если вы делаете что-нибудь с музыкой и вы хотите, чтобы написать оценки, 752 00:43:10,535 --> 00:43:13,900 Вы не хотите, чтобы написать из все сами 753 00:43:13,900 --> 00:43:19,040 начиная с как рисовать штабы и как рисовать. блокноты 754 00:43:19,040 --> 00:43:21,020 Это очень сложно. Это было сделано раньше. 755 00:43:21,020 --> 00:43:22,170 Ты в порядке. 756 00:43:22,170 --> 00:43:26,200 >> Если вы хотите использовать Finale или Sibelius, форматы файлов для тех вещей, 757 00:43:26,200 --> 00:43:30,180 очень сложны, и вы не можете реально использовать их программно. 758 00:43:30,180 --> 00:43:35,020 Вы можете открыть Сибелиус с Finale и перейдите в меню Файл, Экспорт в PDF самостоятельно, 759 00:43:35,020 --> 00:43:37,600 но вы не можете действительно назвать это из сценария. 760 00:43:37,600 --> 00:43:40,440 LillyPond, вы можете позвонить от этих скриптов. 761 00:43:40,440 --> 00:43:44,397 Вы можете легко перебирать LillyPond латексом. 762 00:43:44,397 --> 00:43:47,230 Я не так много времени, чтобы пойти в этих технологий прямо сейчас, 763 00:43:47,230 --> 00:43:48,321 но они существуют. 764 00:43:48,321 --> 00:43:50,070 Если вы хотите посмотреть в книге LillyPond, 765 00:43:50,070 --> 00:43:53,760 это программа, которая поставляется с Ваш дистрибутив LillyPond, 766 00:43:53,760 --> 00:43:57,030 и это для перебора LillyPond фрагменты в LaTeX 767 00:43:57,030 --> 00:44:00,340 если вы хотите сделать что-то как большой музыковедение документа 768 00:44:00,340 --> 00:44:02,289 с примерами, например. 769 00:44:02,289 --> 00:44:04,580 И это хороший навык для жизнь, если вы делаете что-нибудь 770 00:44:04,580 --> 00:44:05,770 с музыкой, а не только CS50. 771 00:44:05,770 --> 00:44:09,320 Я использовал LillyPond для всех из моих проектов состава 772 00:44:09,320 --> 00:44:11,880 так как я был в основном старший в средней школе. 773 00:44:11,880 --> 00:44:13,455 >> Так вот некоторые простые примеры. 774 00:44:13,455 --> 00:44:17,490 775 00:44:17,490 --> 00:44:21,060 Это, в основном представитель уровня сложности 776 00:44:21,060 --> 00:44:23,481 что большинство людей будет глаза они пытались 777 00:44:23,481 --> 00:44:24,980 использовать LilyPond для простых проектов. 778 00:44:24,980 --> 00:44:29,519 Этот первый начало в Хоральная прелюдия Баха. 779 00:44:29,519 --> 00:44:31,810 Это нижняя отрывок от одного из моих собственных работ, 780 00:44:31,810 --> 00:44:34,650 и это только там, чтобы показать вы такие вещи, как [неразборчиво] 781 00:44:34,650 --> 00:44:38,550 положить несколько строк в том же персонал, как лирическая undersetting работает. 782 00:44:38,550 --> 00:44:41,350 783 00:44:41,350 --> 00:44:46,110 Лирика подкладки являются вещью, что очень простой в использовании LilyPond в хоровой музыке. 784 00:44:46,110 --> 00:44:48,814 >> И так, то есть несколько больше сложные примеры здесь. 785 00:44:48,814 --> 00:44:50,980 Все это делается в LilyPond и они возможно. 786 00:44:50,980 --> 00:44:55,280 Это первое выдержка от [Неразборчиво] по [неразборчиво]. 787 00:44:55,280 --> 00:44:58,860 И это [неразборчиво] из пьеса для сольного бас 788 00:44:58,860 --> 00:45:03,550 флейта [неразборчиво], который является longtime-- которые 789 00:45:03,550 --> 00:45:07,101 был давний членом музыкальный отдел здесь, я думаю. 790 00:45:07,101 --> 00:45:08,600 Я не уверен, где он ушел в. 791 00:45:08,600 --> 00:45:12,410 Но он был советником Гарвард Ассоциация Композиторы в течение длительного времени. 792 00:45:12,410 --> 00:45:13,530 Замечательный человек. 793 00:45:13,530 --> 00:45:16,920 И он пишет музыку, которая имеет очень сложный обозначения, что LillyPond 794 00:45:16,920 --> 00:45:20,500 тем не менее, может работать с очень красиво. 795 00:45:20,500 --> 00:45:26,030 >> Так что просто дать вам ощущение того, что Возможности Эта вещь are-- так 796 00:45:26,030 --> 00:45:28,960 внутренности LillyPond очень сложны. 797 00:45:28,960 --> 00:45:31,060 И вы можете использовать его для долгое время, в том числе 798 00:45:31,060 --> 00:45:32,520 для некоторых довольно сложным вещи, на самом деле не 799 00:45:32,520 --> 00:45:34,060 зная о них много. 800 00:45:34,060 --> 00:45:38,720 Но основная идея в том, что на низкий уровень, атомы LillyPonds 801 00:45:38,720 --> 00:45:39,970 являются ноты. 802 00:45:39,970 --> 00:45:42,761 Примечания содержат контекстные называемые голоса. 803 00:45:42,761 --> 00:45:44,510 Так контексте голосовой в основном соответствует 804 00:45:44,510 --> 00:45:47,410 к одной линии полифонии. 805 00:45:47,410 --> 00:45:49,410 И тогда контекст может быть содержащиеся иерархически 806 00:45:49,410 --> 00:45:53,590 в более высоких уровней, что представляют штабы на счет 807 00:45:53,590 --> 00:45:56,750 или более крупные группировки, как фортепианные штабы или хор штабы, 808 00:45:56,750 --> 00:45:58,990 и затем в конечном счете целые контексты оценка. 809 00:45:58,990 --> 00:46:02,260 И вы можете на самом деле охватывают несколько баллов в книге. 810 00:46:02,260 --> 00:46:05,770 >> И каждый контекст имеет Количество вложенных граверов. 811 00:46:05,770 --> 00:46:08,340 Если вы посмотрите через Содержание контексте 812 00:46:08,340 --> 00:46:14,410 и распечатать определенную символ или определенный класс символов, как это необходимо. 813 00:46:14,410 --> 00:46:17,840 Таким образом, чтобы каждый контексте голосовой, есть [неразборчиво] замечания 814 00:46:17,840 --> 00:46:24,270 резчик, что является в основном функцией или объект, который выписывает все сведению 815 00:46:24,270 --> 00:46:26,290 головы на правой части страницы. 816 00:46:26,290 --> 00:46:29,510 Тогда есть расщелина гравер, который выписывает расщелины на персонал. 817 00:46:29,510 --> 00:46:31,517 Тогда есть метроном Знак гравера, что 818 00:46:31,517 --> 00:46:33,100 выписывает метронома знаки в счет. 819 00:46:33,100 --> 00:46:36,410 И все это вписывается в значительной а в иерархии. 820 00:46:36,410 --> 00:46:39,500 И это очень, очень, очень настраиваемый, что вам нужно 821 00:46:39,500 --> 00:46:42,880 если вы хотите, чтобы получить такие вещи, как, что. 822 00:46:42,880 --> 00:46:45,730 >> Таким образом, все контексты имеют много различных атрибутов 823 00:46:45,730 --> 00:46:52,410 что вы можете изменить на все от расстояния до различных шрифта 824 00:46:52,410 --> 00:46:54,942 Выбор размерам вещей. 825 00:46:54,942 --> 00:46:56,900 Если вы хотите, чтобы сделать еще более сложные вещи, 826 00:46:56,900 --> 00:46:59,210 есть встроенный скриптовый язык. 827 00:46:59,210 --> 00:47:01,820 Они используют схему, которая это диалект Lisp. 828 00:47:01,820 --> 00:47:04,960 Они, вероятно, не значит тебе что-нибудь. 829 00:47:04,960 --> 00:47:06,900 Но в принципе, схема другой функциональный 830 00:47:06,900 --> 00:47:09,500 Язык программирования, более или менее. 831 00:47:09,500 --> 00:47:10,800 >> СТИВЕН KREWSON: Галстук в. 832 00:47:10,800 --> 00:47:12,690 >> Коннор Харрис: Да. 833 00:47:12,690 --> 00:47:15,390 Это хороший галстук-во, я полагаю. 834 00:47:15,390 --> 00:47:20,150 И он используется в качестве языка преподавания, на самом деле, вниз Массачусетс-авеню В Массачусетском технологическом институте. 835 00:47:20,150 --> 00:47:26,590 И это очень удобно для LillyPond по различным техническим причинам. 836 00:47:26,590 --> 00:47:30,317 >> И поэтому, если вы хотите, чтобы просто хитрости, зависящие от условных, 837 00:47:30,317 --> 00:47:32,900 для example-- есть определенная Состояние счетом, который встретился, 838 00:47:32,900 --> 00:47:36,495 внесение изменений в макет или whatnot-- то 839 00:47:36,495 --> 00:47:37,620 эти объекты есть. 840 00:47:37,620 --> 00:47:38,667 Они сложнее. 841 00:47:38,667 --> 00:47:40,250 Так вот довольно простой пример кода. 842 00:47:40,250 --> 00:47:43,810 Это пять линий. 843 00:47:43,810 --> 00:47:46,120 В принципе, я определяю два жезла. 844 00:47:46,120 --> 00:47:46,904 Это в 3/4. 845 00:47:46,904 --> 00:47:48,695 Первый состав имеет прилагается темп знак, 846 00:47:48,695 --> 00:47:51,110 но это на самом деле происходит перейти к всей счет, 847 00:47:51,110 --> 00:47:54,960 потому что темп марок находятся на уровне рекордов. 848 00:47:54,960 --> 00:47:59,044 Метроном знак гравер прикреплена забить контекст. 849 00:47:59,044 --> 00:48:01,460 Есть разные ключи, потому что [неразборчиво] гравера 850 00:48:01,460 --> 00:48:02,710 прилагается штабы. 851 00:48:02,710 --> 00:48:04,441 Вы действительно можете сделать, это. 852 00:48:04,441 --> 00:48:06,190 Образец я написал это на самом деле в мажор, 853 00:48:06,190 --> 00:48:07,990 но это просто продемонстрировать вы можете иметь 854 00:48:07,990 --> 00:48:09,570 различные ключи в различных штабах. 855 00:48:09,570 --> 00:48:15,710 И основной синтаксис вы пишете обратите внимание, имена с E, F, G, какой. 856 00:48:15,710 --> 00:48:18,910 Если вы хотите сделать случайности, Вы суффикс или ES. 857 00:48:18,910 --> 00:48:22,640 Это от голландцев музыковедческих конвенций. 858 00:48:22,640 --> 00:48:28,290 >> И сделать октавы прыжки, вы должны использовать это отметок, запятую или апостроф. 859 00:48:28,290 --> 00:48:30,580 Относительная просто означает, все, что вы есть заметка, 860 00:48:30,580 --> 00:48:34,080 он будет автоматически plaec в октавы ближе к предыдущим. 861 00:48:34,080 --> 00:48:37,624 И если вы хотите, чтобы прыгать больше, чем fifth-- сказать пятый или more-- 862 00:48:37,624 --> 00:48:39,165 то вы должны использовать [неразборчиво]. 863 00:48:39,165 --> 00:48:42,580 Но в противном случае, вы не должны указать октаву каждой ноте. 864 00:48:42,580 --> 00:48:46,130 >> И относительно С, премьер и С, вы просто указать средний C 865 00:48:46,130 --> 00:48:48,630 и основание С, особенно первые ноты. 866 00:48:48,630 --> 00:48:55,020 Тогда у вас есть эти штабы, которые организуют эти два голоса или образцы музыки, 867 00:48:55,020 --> 00:48:56,730 и у вас есть счет. 868 00:48:56,730 --> 00:48:58,440 И, что выглядит это. 869 00:48:58,440 --> 00:49:01,780 870 00:49:01,780 --> 00:49:05,380 >> Если вы хотите, чтобы занять время, чтобы скопировать этот образец LillyPond 871 00:49:05,380 --> 00:49:07,530 Код на предыдущем скользить вниз здесь, и вы 872 00:49:07,530 --> 00:49:09,030 можете написать его на LillyPond самостоятельно. 873 00:49:09,030 --> 00:49:11,280 Я знаю, что у нас есть что-то что выглядит много, как это. 874 00:49:11,280 --> 00:49:17,236 875 00:49:17,236 --> 00:49:19,610 Так что еще одна технология называется Музыка XML поддерживается 876 00:49:19,610 --> 00:49:22,030 совсем другие люди. 877 00:49:22,030 --> 00:49:28,150 XML является текстовые данные structure-- я не должны говорить данные structure-- сказать 878 00:49:28,150 --> 00:49:29,580 Метафора карту рода. 879 00:49:29,580 --> 00:49:33,800 И он предназначен для хранения иерархические данные очень хорошо. 880 00:49:33,800 --> 00:49:37,050 HTML, например, представляет собой тип XML. 881 00:49:37,050 --> 00:49:41,090 И вы можете сказать XML, потому что они была все угловые скобки и угол 882 00:49:41,090 --> 00:49:44,700 Кронштейн слэшей что поля показаны данные. 883 00:49:44,700 --> 00:49:47,390 >> Я не есть код Пример из музыки XML. 884 00:49:47,390 --> 00:49:50,450 Вы можете найти его самостоятельно. 885 00:49:50,450 --> 00:49:53,735 В основном, причиной вы можете использовать XML в качестве промежуточного этапа 886 00:49:53,735 --> 00:49:55,980 это, в первую очередь, это формат обмена 887 00:49:55,980 --> 00:50:02,301 для в основном every-- я не должен сказать каждый, но много разных счетом 888 00:50:02,301 --> 00:50:02,800 писатели. 889 00:50:02,800 --> 00:50:04,966 Так что, если вы пишете в музыке XML, можно не только LillyPond 890 00:50:04,966 --> 00:50:08,080 читать с помощью этого вспомогательная Программа называется Music XML для LY, 891 00:50:08,080 --> 00:50:11,360 но также может читать Финал это, Сибелиус можете прочитать его. 892 00:50:11,360 --> 00:50:14,770 В зависимости от того, как внутренний объект Иерархия работает для представления музыку, 893 00:50:14,770 --> 00:50:18,820 это может быть проще выписать Муз XML, чем в LillyPond 894 00:50:18,820 --> 00:50:22,410 и полагаться только на музыкальном XML чтобы LY сделать преобразование. 895 00:50:22,410 --> 00:50:24,282 >> Я не думаю, что [неразборчиво] имеет Music XML. 896 00:50:24,282 --> 00:50:25,490 СТИВЕН KREWSON: Это не так. 897 00:50:25,490 --> 00:50:26,340 Кто-то работает над этим, хотя. 898 00:50:26,340 --> 00:50:27,090 >> Коннор Харрис: ОК. 899 00:50:27,090 --> 00:50:31,040 Euterpea не имеет Функция выхода Музыка XML еще. 900 00:50:31,040 --> 00:50:35,340 Если вы хотите окончательное представление проекта, может быть, войти в контакт с ребятами 901 00:50:35,340 --> 00:50:38,620 что Стивен знает, и они могли бы использовать вашу помощь. 902 00:50:38,620 --> 00:50:40,992 >> СТИВЕН KREWSON: Я хотел бы, что. 903 00:50:40,992 --> 00:50:43,450 Коннор Харрис: Кроме того, в основном, каждые языки программирования 904 00:50:43,450 --> 00:50:46,610 что стоит его соли уже имеет библиотеку XML, 905 00:50:46,610 --> 00:50:51,030 так что вы можете конвертировать все внутри вашей музыки в какой-то объект 906 00:50:51,030 --> 00:50:54,120 что библиотека XML можете написать что потребует меньше 907 00:50:54,120 --> 00:50:57,470 изменения во внутреннюю структуру по какой музыка объекты, 908 00:50:57,470 --> 00:51:00,310 хочу написать, чем писать его прямо в LillyPond бы. 909 00:51:00,310 --> 00:51:04,380 Затем просто распечатать его с XML с XML-библиотеки на русском языке, 910 00:51:04,380 --> 00:51:07,260 который будет гарантировать, что это синтаксически правильно, и все, 911 00:51:07,260 --> 00:51:08,720 а затем преобразовать его в LillyPond. 912 00:51:08,720 --> 00:51:11,060 Таким образом, технологии вы можете искать в, если вы делаете что-то 913 00:51:11,060 --> 00:51:11,650 как это. 914 00:51:11,650 --> 00:51:14,490 915 00:51:14,490 --> 00:51:16,370 >> [Неразборчиво], другой auxilarry технологии. 916 00:51:16,370 --> 00:51:21,700 Это в основном Tech Работы или Технология Студия LillyPond. 917 00:51:21,700 --> 00:51:25,380 Так он предлагает помощь с Синтаксис, с шаблонами 918 00:51:25,380 --> 00:51:28,770 для различных общего комбинации приборов. 919 00:51:28,770 --> 00:51:32,780 Это позволяет разделить экран просмотра так Вы можете иметь свой код в одном окне 920 00:51:32,780 --> 00:51:37,350 и PDF в другом окне и нажмите на местах в PDF 921 00:51:37,350 --> 00:51:40,650 чтобы перейти к соответствующей пятна в исходном коде. 922 00:51:40,650 --> 00:51:45,330 Это более полезно, если вы на самом деле написание LillyPond файлы самостоятельно 923 00:51:45,330 --> 00:51:47,400 чем если бы вы генерации их программно. 924 00:51:47,400 --> 00:51:51,230 Но опять же, это то полезно иметь. 925 00:51:51,230 --> 00:51:51,970 >> Отлично. 926 00:51:51,970 --> 00:51:55,860 Еще resources-- я просто пройти через это очень быстро. 927 00:51:55,860 --> 00:52:01,270 LillyPond manuals-- LillyPond имеет отличная документация на своем сайте. 928 00:52:01,270 --> 00:52:02,270 Они есть учебник. 929 00:52:02,270 --> 00:52:03,478 Они имеют ссылку синтаксиса. 930 00:52:03,478 --> 00:52:07,010 Они имеют сотни фрагментов для различных мелких вещей 931 00:52:07,010 --> 00:52:09,930 лет, возможно, необходимо сделать, чтобы продемонстрировать различные возможности. 932 00:52:09,930 --> 00:52:12,250 Если вы хотите использовать скриптовый язык 933 00:52:12,250 --> 00:52:14,740 или сделать более обширный настройки, то есть 934 00:52:14,740 --> 00:52:16,730 внутренние ссылки на этом URL. 935 00:52:16,730 --> 00:52:21,950 Если вы хотите использовать музыкальный XML, есть что URL-адрес, musicxml.com/tutorial. 936 00:52:21,950 --> 00:52:27,960 >> И потом, если вам нужно узнать схему потому что вы на самом деле хотите использовать 937 00:52:27,960 --> 00:52:30,960 создания скриптов в LillyPond, то есть [неразборчиво] называется 938 00:52:30,960 --> 00:52:32,918 Структурированная Интерпретация компьютерных программ, 939 00:52:32,918 --> 00:52:35,820 который является не только второй Наибольшее CS учебник никогда written-- 940 00:52:35,820 --> 00:52:39,770 найти меня потом, если вы хотите знать, что я думаю, самым великим is-- 941 00:52:39,770 --> 00:52:43,580 но это также очень хороший введение в язык правильной. 942 00:52:43,580 --> 00:52:46,630 Вам не нужно будет больше, чем первые несколько разделов. 943 00:52:46,630 --> 00:52:47,827 >> Вот и все. 944 00:52:47,827 --> 00:52:48,410 Любые вопросы? 945 00:52:48,410 --> 00:52:54,068 946 00:52:54,068 --> 00:52:57,972 >> СТУДЕНТ: Где я могу скачать Ваш генерируется Frere Жак 947 00:52:57,972 --> 00:53:01,050 так что я могу поставить его на айподе? 948 00:53:01,050 --> 00:53:07,574 >> СТИВЕН KREWSON: Ну, вы можете написать к какой-то файл WAV в Euterpea. 949 00:53:07,574 --> 00:53:08,490 И у вас есть код. 950 00:53:08,490 --> 00:53:10,000 Это на GitHub. 951 00:53:10,000 --> 00:53:15,590 Сделайте свои собственные вариации Frere Жак с CS50 коллективного разума. 952 00:53:15,590 --> 00:53:17,095 Было бы здорово. 953 00:53:17,095 --> 00:53:18,220 Коннор Харрис: Кто-нибудь еще? 954 00:53:18,220 --> 00:53:20,261 СТИВЕН KREWSON: Мы должны лучше бас-барабан, тоже. 955 00:53:20,261 --> 00:53:21,935 Это действительно плохо. 956 00:53:21,935 --> 00:53:26,565 >> СТУДЕНТ: Euterpea имеет не только сторона композиции, но signal-- 957 00:53:26,565 --> 00:53:27,440 СТИВЕН KREWSON: Да. 958 00:53:27,440 --> 00:53:30,100 На самом деле, работа, которую я сделал в Euterpea, когда я 959 00:53:30,100 --> 00:53:33,450 взял this-- есть аспирантуру в Йельском университете, что 960 00:53:33,450 --> 00:53:35,900 использует it-- был на синтез звука. 961 00:53:35,900 --> 00:53:39,810 Так что это действительно хороший способ с помощью стрелок 962 00:53:39,810 --> 00:53:46,150 и некоторые обозначения мы видели составляя вместе функции сигнала. 963 00:53:46,150 --> 00:53:50,610 В частности, бас для большинства из них всего лишь простой синусоиды. 964 00:53:50,610 --> 00:53:54,240 Но если вы начнете сочинять тех, в странных программных способов, 965 00:53:54,240 --> 00:54:00,010 Вы можете сойти с ума звук эффекты, такие как странные каскадов. 966 00:54:00,010 --> 00:54:04,640 Вы можете создать очень твердый звучит с большим модуляции. 967 00:54:04,640 --> 00:54:07,730 >> Я сделал проект по гранулированных Синтез, который 968 00:54:07,730 --> 00:54:12,290 где-то между FM и отбора проб. 969 00:54:12,290 --> 00:54:15,230 Вы берете очень мало, маленькие образцы, а затем 970 00:54:15,230 --> 00:54:20,440 объединить их с какой-то модулятор и создать богатый звук. 971 00:54:20,440 --> 00:54:24,900 Мы также сделали физическое моделирование, так пытаюсь думать о физике 972 00:54:24,900 --> 00:54:29,410 и психоакустика что-то вроде труба, и думать о том, как 973 00:54:29,410 --> 00:54:32,320 звук отскакивая колокол трубы 974 00:54:32,320 --> 00:54:35,200 и акустика номер и моделирование 975 00:54:35,200 --> 00:54:40,195 что с основными генераторов. 976 00:54:40,195 --> 00:54:47,690 977 00:54:47,690 --> 00:54:48,940 Коннор Харрис: спасибо. 978 00:54:48,940 --> 00:54:50,140 Спасибо, что пришли. 979 00:54:50,140 --> 00:54:52,400 И я всегда готов на вопросы по email-- 980 00:54:52,400 --> 00:54:55,020 connorharris@college.harvard.edu. 981 00:54:55,020 --> 00:54:57,020 >> СТИВЕН KREWSON: Да. stephen.krewson@yale.edu. 982 00:54:57,020 --> 00:54:58,810 983 00:54:58,810 --> 00:55:00,360 Круто. 984 00:55:00,360 --> 00:55:01,667