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