康纳哈里斯:你好。 我康纳·哈里斯。 我是一个CS50 CA在哈佛。 斯蒂芬KREWSON:我是斯蒂芬Krewson。 我是一个TF的CS50在耶鲁大学。 康纳哈里斯:我们要谈 一些技术,你可能 想如果你有兴趣使用 在做最后的项目或真 任何与音乐。 我们将重点放在第一个 编程语言叫做哈斯克尔。 这是一个功能 语言,所以范式 从C或PHP很大的不同 或其他命令式语言 你已经使用,尤其是 写在哈斯克尔库 所谓Euterpea,它可以帮助人们 与音乐创作功能, 基本上。 而斯蒂芬将引导您 通过一个很好的例子。 在此之后,我将向您介绍 所谓LillyPond,这 是一家以技术为排版音乐。 这有点像乳胶 对于音乐,如果你们中的任何 已经使用乳胶数学课或 另一名P集类或你有什么。 所以,我给你,再一次, 那一些简单的例子 并指出你在一般 一些更好的资源的方向。 斯蒂芬KREWSON:在 此外,我们认为它 会很酷成立 提示一点点 朝之间的管道 Euterpea产生的MIDI文件 在LillyPond,所以我们提供 对脚本一些指令 要做到这一点是 设有LillyPond 只是为了保持开源 并获得了管道去。 康纳哈里斯:同样, 我们应该强调, 这两种技术,您 不必一起使用它们。 他们并没有设计工作 在一起,虽然他们做的非常漂亮。 斯蒂芬KREWSON:对。 并且完全免费。 康纳哈里斯: 确认,刚才读的。 斯蒂芬KREWSON:适当注意。 感谢那些人。 这是我会一直这样只是片刻。 安装过程 是有点棘手。 我们已经在GitHub上读我 你可以看一看。 只是给我发电子邮件,如果您有任何问题。 但我们会假设下运行此 这是工作的每一个人。 康纳哈里斯:如果你不能 得到LillyPond工作,没什么大不了的。 有没有现场编辑的 将参与,至少在我的结束。 斯蒂芬KREWSON:哈斯克尔和 LillyPond应该都有安装。 Euterpea被下载为 包,等等,等等。 因此,我们在谈论电脑音乐。 而这仅仅是一个 很50,000英尺的看法。 有它的几个不同的方面。 这是粗糙和是 要掩盖一些细节。 但是,我们能想到的东西 像算法组成, 使用的算法, 使用代码,以生成 一些类型of--也许自相似 笔记,或者音符序列 在某些限制。 然后将这些可能是 执行或解释 与模拟仪器 或类似的东西。 但该组合物是 算法完成。 不过,当然,也许是面积 电脑音乐或数字音乐 我们更熟悉的是数字 声音合成或数字采样 数字录音。 很多数字仪表都 通过数字采样完成。 事实上,我们将使用这些之一 健全字库后的形式。 但也有一些叫 说出来的数字合成 70年代末,进入“80年代用 雅马哈和约翰Chowning在斯坦福 做FM合成或 调频合成, 在这里你有一个载体 信号和调制信号 无论是在音频频谱。 但是,我们的重点 今天是一种叫MIDI, 和当然,算法组合物。 我们不会做仪器,但 我们反而要作出一些音乐, 然后,将获得解释 一些文书 是一致的 通用MIDI标准。 那么什么是MIDI? 我不会太深入了, 但MIDI是数据传输协议。 这是一种引导的跨越 不同的公司和行业 组织的声音或补丁。 所以我们会看到, 有一个MIDI标准 对于所有不同的打击乐器 声音和MIDI建议 对于各种不同类型的合成的或 不同类型的所有仪器 在一个乐队团体,说。 你可能熟悉 0到127 MIDI信息。 一个MIDI信号通常 一位指示 无论是数据还是 状态包,然后有 七比特的信号的。 并且这些可以控制 一切从量 该诉讼或压力 在一个特定的键 如果你正在执行一个MIDI 当然控制器以及, 笔记。 当然,MIDI具有 是非常有用的, 因为它是一种方法,丝 一起或菊花链 一堆MIDI硬件设备。 我有七八回我家。 它变得非常复杂, 但它真的很强大。 而且它是真的老了。 这是从80年代初,和 这是非常好的,小的。 康纳哈里斯:是的。 所有经典的任天堂 视频游戏大概会 对音乐的MIDI文件,例如。 斯蒂芬KREWSON:这里有一个 例如一般的MIDI, 显示MIDI作为一种 通用协议。 而且我认为,我们能想到的 该规范之间的差异 应该有类似 这些乐器的声音和实际 实现这些文书的声音 在一个健全的字体或某一特定MIDI 合成器作为是差 也许typeface--它说的, 在一般情况下,这是设计 这个特定的方式来表示 characters--和一个特定的字体 其具有具体的尺寸和音色, 并有实现the-- 康纳哈里斯:也许 更好的比较会 是Unicode标准says--它给 一个数字,每一个角色,真的 世界上所有的语言,或 一个巨大的一套语言的脚本 在世界上,然后将这些都是 渲染弄成图形 通过不同的字体包。 很显然,你能想到的 MIDI声音的Unicode的。 而且它只是一个of--大流列表 事件和文书,诸如此类的东西, 你必须有一个单独的 程序,如字体, 为渲染成 东西是听得见的。 斯蒂芬KREWSON:那么,为什么哈斯克尔? Haskell是一种函数式编程 语言,很先进, 从C很大的不同, 非常不同的PHP。 而且我们要看到,有一个 便于在Haskell函数组合 这将使我们能够一帆风顺, 编写或打字,抄写, 像雅克·弗里尔, 这个简单的歌 有很多部分在它的 是自相似或重复。 因此,这将是一些 动机为何 我们使用哈斯克尔,其中 函数是一等公民。 我想延长 这一点点。 这是一个有点容易 notate弗里尔雅克·哈斯克尔。 但是,如果我们想要什么 鼓的部分补充呢? 如果我们想尽量让 像罗兰808或909桶 机,你必须 约16个不同的步骤? 通常这些 认为是16分音符。 你可以控制全球 节奏,你可以挑选出 一堆不同的打击乐部分 低音鼓,一拍,不同的陷阱, 开启和关闭高帽子 这些排序渠道, 然后你就可以EQ或 调整音量。 我们会看到在一个不错的方式 代表这一步的哈斯克尔 音序器与所有的 各种很酷的事情在Haskell 我们可以产生做 列表和过滤过的列表, 以上列出的映射,映射 在功能列表。 和快速的道歉。 这是一个非常粗略的 和过于速写 的一些方面 哈斯克尔和Euterpea的, 这是一个特定领域的 嵌入式语言编写 在Haskell的音乐类型。 所以,请不要在网上查询出来的代码。 火起来了ghci,这是格拉斯哥 Haskell编译解释。 我会做一些 这在一点点 所以你可以看到它是如何做。 这允许你加载与 the--语法是冒号,然后 该命令。 您可以加载文件。 您可以对这些文件使用浏览 看到所有的函数 存在于一个特定的模块。 然后,我们会看到,类型和类型 类Haskell中如此重要, 所以你可以随时check--特别是 如果你工作在一个新的DSCL 像这样的,什么是音乐的类型? 我知道数字的方式 类型在Haskell工作, 但我不知道很多关于音乐。 但是你可以探索他们的方式 通过使用这种T或键入命令定义 然后调用在一个特定的 函数或数据对象。 康纳哈里斯:是的。 如果你认为C和锵 是hardass关于类型, 你不知道有关哈斯克尔。 关于哈斯克尔的好处是, 如果你能得到你的代码编译 如果Haskell的类型检查, 它可能是正确的, 因为该类型系统的要求非常严格。 斯蒂芬KREWSON:是的。 所以,我只想去 through--并再次, 这不是做justice--几个 哈斯克尔的特征是,至少 其creators--和它的创建 在20世纪80年代被一堆人迟到, 约20委员会 people--认为是非常重要的。 的第一件事情,他们 在一份文件中列出的 哈斯克尔描述的起源 在第一个20年左右 是,这是懒惰的。 所以,这是什么意思? 嗯,这意味着,当我们有某种 表达,我们需要评估它。 和Haskell这是否在通话 由需要的方式或者非精确方式。 也就是说,如果我们有一帮 我们表达的组成部分, 我们尽量拖延评价 这些子组件 直到绝对最后minute-- 这是直到我们真正需要他们。 因此,这是指:这是 真的很酷,尤其是 如果我们思考抽象 的音乐步进音序器。 你打开它,你开始 运行的一个步骤序列 - 如果你曾经有鼓工作 机 - 和它只是永远。 因此,这将是非常好的,如果我们 可以效仿,在哈斯克尔。 我们可以用无限做到这一点 值,特别是无限的名单。 这是很容易键入 无限的名单在Haskell。 你可以只使用语法下降 在这里,你看1〜3, 除去3 1点点,和 这是一个无限列表 所有自然数的延伸 作为远,你可以想像。 我想介绍一个 褶皱的概念的时候了。 再次,目的 这个研讨会不是 了解在Haskell倍 或高阶函数。 但我只想把它介绍给 给出了如何怪异的准确意义 Haskell是如何强大,它是。 特别是,我们要be-- 当我们做了不同的鼓的部分, 我们将要操纵名单 号,折叠它们在彼此上。 要做到这一点,我们将 是利用地图和褶皱。 有一个正确的关联 倍,这是这个正确的 这里 - 1减去数量,2 减去量,3减去0。 和的语法一个 折,你给一个折 碱值,然后一个operation-- 在这种情况下,加法或减法。 我已经展示了这两种情况。 然后还有一个累加器 日积月累的完整列表, 应用该运营商正或 减去,然后累积它。 因此,这将是the--如果它被称为 有褶皱的R加0,从0开始, 我们再总结所有 在该列表中的数字。 这就是从1到3的列表。 康纳哈里斯:那么换一种 这样,折R的三个参数。 还有一个功能, 本身有两个参数, 然后有一个启动值, 和有值列表。 而你要做的就是你拿 启动值,第一个值, 把它们变成功能。 你怎么出去, 拿去,供稿 进入的功能 第二个值,你所得到的, 拿去,牧养进入 函数进行的第三值。 然后,如果你走 这整个名单这种方式, 你会得到最终 一些奇异值的 相同类型的你开始的 出相同类型的带和 随着事情的清单,然后 这是倍R的返回结果 斯蒂芬KREWSON:那么特别, 这些都是高阶函数, 因为他们正在做另一 函数的参数之一。 康纳哈里斯:是的。 如果你使用某些其他 languages​​--我知道R,[听不清] 语言有这个,所谓的降低。 你可能有类似的功能 在其他语言中,只叫 不同的东西。 斯蒂芬KREWSON:和 什么是好的关于倍ṛ 在这种情况下是,折 R能够以无限列表的工作。 因此,在这种底,这个P5 正在生成的音符 在步骤序器被接通 一些鼓的部分,第五鼓声部, 也许这是一个康加 鼓什么的。 这是一个刻意 写这个的钝角的方式, 但它的乐趣,因为 它说明了很多 约哈斯克尔和Euterpea的事情。 因此,本折colon--结肠R是 只是推的东西操作 一起在一个叫上一个空的列表中 - 列表中,这仅仅是一个空的方括号。 而且我打电话说 在这无限的名单。 这实际上是两个列表 加在一起倒在这里。 该列表1逗号6点 点是1,6,11,16。 因此,在刚刚Haskell-- 几个大字,你 可以生成整个 数字序列 这五个号码分开 伸展到无穷大。 我在前面加上该 这种较短的小列表中 - 3,8,21--只是告诉你 你怎么可以连接列表。 然后我自身折叠。 而这最终只是成为一种 身份操作,但它是无穷的。 和褶皱R能够做到这一点,因为它 懒惰地评估,如在上述。 如果我们有一个1和2和3中,我们可以 只是括号关闭它的整个休息。 这不会为工作 减去或加上,但它 会为这个冒号 名单上的身份运行。 那么,我们如何实际使用,如果我们 对事物的无限长的名单? 那么,哈斯克尔提供 很多fun​​ctions--的 并期待更多的进入这些在 你自己的时间 - 比如拿 它说,好吧,我们 产生这种无限的名单, 但我们只是需要一些 它并在此case--数量 我们将看到这个以后 我们的鼓机代码 - 通用汽车只是某种全球 变量的步数 在序。 在卷式机我 向您介绍,这是典型的16, 但我已经有32来实现它。 这其实并不重要。 哈斯克尔也是纯洁的,所以它具有很强的 静态类型康纳一笔带过。 所以功能 数学在sense-- 他们更数学 他们正在保证 不要访问或更改任何种类的 变量或执行输入或输出。 所以,如果你有一个函数, 它的确定性。 它总是会返回相同的 在该方案的状态值 或保持不变。 还有,当然,一元的异常 这一点,但是这超出了我们的范围。 康纳哈里斯:是的。 这意味着,虽然是有 有几个重要的[听不清] 这个后果。 其中之一是,它很容易 并行Haskell程序。 因为如果你有, 说的一个函数 需要上万元的值进行操作,如果 你知道函数总是 给出了相同的值,如果 你给在一定value-- 如果你是[听不清]的F 1,F的 2,则f 3或whatnot--的F 1 是不会写出来 到文件或做某事 这将改变f2的值。 您可以在此功能只是分裂到 万种不同的机器还是一百万 不同的线程或什么的, 让所有的响应返回, 让所有的返回值 回来,然后就是这样。 所以很容易并行化的东西。 不足之处是输入 输出特别是 适合类型系统 在十分复杂的方式。 我们不会去,现在,但我 建议你看看一些资源 在网上,如果你想了解这一点。 斯蒂芬KREWSON:所以 键入classes--这 was--类的类型 被发明来解决 运算符重载的问题。 因此,我们希望有平等 不同类型的东西之间​​。 当然,我们可以认为of-- 数字类型之间的平等 很容易想到,但 怎么样列表之间的平等? 什么之间的平等 树脚的数据结构? 而这一切都是可能的 哈斯克尔因为类型的类。 因此,如果你定义一个特定的数据类型 - 这里,这些是音乐的间距。 我们终于得到 一些电脑音乐。 因此,我们有C,C锐利, 等,等等。 它们属于一帮 不同类型的类。 EQ--他们属于均衡器类型的类。 这意味着他们支持 平等操作。 所以,你可以评估一个人是否 音乐原语序列 是相同的不同的一个。 它们属于的序类。 这意味着有一个排序这些。 D受到C.后升C 来自℃之后也是如此。 它们属于类 显示,这意味着它们可以 被打印到控制台或终端。 它们属于 类枚举,其中 意味着,即使 这些人物, 他们有一个基本的数字 表示从0开始 并通过但会关闭 很多东西都在这里,20个左右, 或30或40,也许。 康纳哈里斯:当 我们有一个数据类型 与该关键字derives-- “deriving--”某种类型的类, 这意味着,编译器将尝试 自动构建的东西。 因此,也许你会想 不同的定义质量。 你要定义升C 如等于降D,例如。 采用这种结构 在这里,我不认为C调 和D平将是相等的,因为 编译器会自动 说的每一个不同的可能值 是从每一个其它不同。 因此它可以覆盖 默认的实现 这些类型的类。 再次,看看如果参考 要了解这一点。 斯蒂芬KREWSON:和 在这里,其实,这会 是我们以后的代码有帮助的。 我们看到一些缀运营商 对于顺序组合, 并行组合物,和因此 第四,这些长处和等号 周围有冒号。 这意味着我们可以玩些不同的 音乐元一个接一个。 这是顺序组合。 或者,我们可以发挥他们 平行的同时。 因此,我可以有一个音乐的价值, 然后这等于和冒号, 中缀并联组成运营商, 并发挥他们作为一种和弦。 我们要使用 这个时候我们结合 我们的鼓部分与我们 小雅克·弗里尔歌曲 发挥这两个序列 音乐的值在同一时间。 柯里is--库里最后 哈斯克尔库里的名谁 后Haskell的图像而得名。 这让我们一 当我们漂亮优雅 编写所有这些不同的 功能或过滤器,我们是 将是映射在我们的名单。 两个函数 arguments--˚Fx和y--的 可以被表示为 ˚Fx的施加到y。 因此,它的功能 一个参数返回 一个参数另一个函数。 因此,这意味着我们可以映射 x的函数f过的y的名单。 康纳哈里斯:旺旺 举这样的例子? 斯蒂芬KREWSON:是的。 我有一个例子,从这里 有些事情,我们会写。 所以复制2--好, 复制将采取 一个值,这是多少 次复制的东西, 然后它会采取value-- 通常一个列表或东西。 所以在这里,我们映射 2复制在另一个列表。 因此,如果我们映射复制2, 如果我们重复2申请 此列表中 - 的第一元件和 这些都是音乐phrases--名单 会产生两个“你们sleeping--” 所以你睡觉,你睡觉。 所以,现在我们有两个。 但是,重复使用两个 参数,但是因为我们是 钻营,然后映射, 我们可以代表重复2 为已被返回的函数 1 argument--只是复制了两次。 然后,我们将其应用于各 短语此列表的元素。 而CONCAT是一个Haskell 操作压扁的列表。 因为重复2意志 产生列表的列表。 这是这中间形式在这里。 因此我们就可以Concat的 或压平了两次。 康纳哈里斯:一个更简单 例如钻营的, 如果你like--想象f是只是一个 乘法函数,它有两个 参数和返回他们的产品。 所以,如果你有一个F 4 5,它是20。 但是你可以认为这是 also--你有一个函数f 4 这需要一个参数,并返回 四次这种argument--刚 部分应用程序, 只有一个参数4。 如果你进给量f 4 5,会给你20。 这是一个简单的 例如钻营的。 这是通常的教科书的一个。 斯蒂芬KREWSON拉姆达 表达式或匿名函数 是另一种哈斯克尔标志。 所以,如果我们要掀起一个 小功能重复的生活, 但说这是不是在 标准库, 我们可以用一个语法 类似于以下。 我们将陆风这一点。 有一件事,你会看到很多的 鼓机是我们拨打电话 到一种叫 过滤器,它像以前一样, 是一个函数的映射 在列表中,但它的 的布尔函数映射。 所以,我们这里有一个例子 的一个匿名 定义布尔函数 只需要一对夫妇的值。 这不是严格的说 匿名函数。 但它的定义与 该语法为简洁起见, 而这只是需要X组件N-- 康纳哈里斯:是的。 所以f是一个函数 两个参数n和p 返回的函数,其本身 一个参数的函数,即x即可。 斯蒂芬KREWSON:我 上述中缀运算符。 什么是中缀操作符? 那么,缀运营商的 我们代表操作正常的方式, 也就是说,在mathematics-- 2加 2,而不是操作者加 然后两个参数2和2。 康纳哈里斯:这就是所谓的 逆波兰式,这是 一个学期我怀疑你们任何人会知道。 斯蒂芬KREWSON:对。 逆波兰或前缀符号。 但哈斯克尔决定 使用中缀运算符。 所以,这些都是一些 自定义的那些 被定义为 Euterpea DSCL在Haskell。 因此,这是顺序组合。 这是并联组成,而这 被截断并联组成。 而我们需要的 与我们的鼓机, 因为我们将使用最后 运营商在小元组有 沿弹鼓机 我们弗里尔雅克·歌。 而我们的鼓机 将是无限的。 它只是扮演下去。 但是弗里尔雅克·歌是没有的。 这并不是说长。 这只是几个酒吧。 因此,我们需要停止鼓机的 一旦较短的音乐价值在于 结束。 这infixed运营商 是与超级有用的。 像和中间符号 这是种不错的, 因为说你有一样的功能 报价,这给整数除法 x除以东西else-- 对不起,应该是a和b。 你可以把它写成B的报价。 所以,如果你put--元素 这另一个例子。 X元素在某些列表中,如果你把 它在反引号,你可以使用它。 尽管它不是一个符号 像加或减或时间, 您可以使用一个名称 像在反引号功能 作为中缀操作符,这是很酷。 康纳哈里斯:这又是 一切只是语法糖,真的。 它不影响语言的核心。 斯蒂芬KREWSON:所以,我们在这里看到的 最后一句话我们弗里尔雅克·歌, 我打出了一些小和弦或 采用并联组成三分之二 运营商。 这句话的意思一些另一种方式 对我们刚才一直在说。 所以,你可以映射功能 一个参数超过列表。 康纳哈里斯:同样,参考 对于Haskell--入门教材 将所有的这在它。 斯蒂芬KREWSON:所以这里有一个相当 步序的重点线 我们就来看看使用 列表解析。 而我们在这里看到的是,元素 在固网运营商反引号。 因此,如果x是的列表的元素 X的,然后我们将调用PERC功能。 所以PERC只是一个打击乐器功能。 这需要一些值p那 有界集中所有的组成部分 在各种打击乐器的声音 我们在以前的幻灯片看到, 然后它给出了 持续的四分音符。 否则给它一个QNR和QNR 仅仅是一个四分音符休息。 因此,这是建立一件好事。 我们有元素的列表,并 我们会遍历从一个部分名单 我们的步进音序器的最大值。 而当我们在一个特定的我 一到最大值的该名单, 如果i是该一个构件 设置在此函数创建, 好,那我们把它 成敲击音符。 否则,我们只是起到休息,这 是说,我们只是保持沉默。 而且我们可以在这里看到,在 这个列表理解语法, x被填充这个 列表构建1 到定序的全球规模。 康纳哈里斯:是的。 对于基本语法 列表内涵是 支架,价值涉及 一些变量,酒吧, 变量的可能值 自己,封闭支架。 如果你已经做了设置建设者符号 在任何种类的数学课, 你可能已经设置2n个这样的 n为或n为Z轴。 类似件事 - 这个符号 就是要提示 那数学符号。 斯蒂芬KREWSON:你也可以 适用于多个谓词 在一个列表和多个过滤器 理解,这是相当不错的。 代数types--我们 不会长期逗留在这里。 有没有一个很好的概念, 哈斯克尔还是不错的,明显的概念 如何走,比方说,一个默认的 参数功能什么的。 在Python中,这是很容易的。 你可以只说有等于上 的函数的声明, 在一个默认值 情况下没有提供。 在Haskell中,也许你可以 使用也许是,也许类型, 这需要无论是什么 或类型的值只是一个。 因此,我们利用这个的鼓机 让我们给可选音量 参数到每个鼓部件。 所以,让我们有情商的一种方式 或在特定频道上的体积。 康纳哈里斯:在 其他哈斯克尔的例子, 您可能会看到可能用于 这可能会失败的功能。 这是一个常见的​​一种。 斯蒂芬KREWSON:你可以提供 某种错误消息的作为默认值。 这是特别方便,当 你正在做的I / O哈斯克尔。 这可以是花样。 康纳哈里斯:或为 类似的例子,认为 涉及分割的函数的 这可能是0的参数。 这功能,可以 返回也许什么。 所以,如果没有被零除 它会返回刚才什么。 并且如果存在除以 0,它会返回任何结果 作为信令错误的方法。 因为一个后果 Haskell的非常严格的打字 是,有没有real-- 例外的是尴尬的,基本上, 错误处理是尴尬。 这是一个非常 这样做的常见方式。 斯蒂芬KREWSON:所以现在我们得到 另一个令人费解的事情 有关Haskell的,这是模式 匹配和功能定义。 我在最后一张幻灯片显示您的 声明的步序 函数,它把一个可能值, 再一个int,那么整数的列表, 然后返回的序列 音乐价值有注解 与两个音调和音量。 所以,这三个参数可以是 图案匹配以下面的方式。 我们总是想,一定要 做一个基本情况或退出的情况下先。 而这些下划线 可以只解释 指任何值的存在。 因此,如果我们得到一个呼叫接续步 与一些值,其他值, 然后空列表,我们想要什么 返回只是沉默,休息0。 和而不是 作为一个空列表或0, 这是一个休息0,因为我们是 处理的音乐类型, 和着音乐的空列表 类型只是没有时间的休息。 这是没有音乐。 然后,我们看到,如果我们得到的一个步骤 序列一起一伏的体积参数, p表示预防仪器 参数,然后X的列表。 然后我们做一些东西。 特别是,我们应用 这个列表理解, 我们进行了一些 对可能价值操作 把它变成这样一个数值 它可以接着列举并用于 选择仪器。 同样,这是一个小 有点刻意inconcise 只是为了显示所有的奇怪的事情 你可以在Haskell做你 看看它在你自己的时间。 好吧。 因此,我们终于等到 做我们所要做的, 这使一些电脑中的音乐。 因此,我们要尝试 让雅克·弗里尔歌曲。 因此,有多少 在雅克·弗里尔短语? 四。 大。 这有什么好看的是, 他们都重复 相同数量的次数,这是两个。 因此,我们有四句话 各重复两次。 并且特别地,它们是在一个圆。 还有很多, 很多方法可以实现 圆,可能是有趣的事情。 我已经在做了 这里很简单的方法, 这是刚刚到construct--行 函数需要的音乐值的列表 并把它变成顺序组合 通过应用顺序组合 运营商。 然后,我耽误了不同地区 通过他们开始休息。 于是,我开始了两项措施休息, 然后四项措施休息, 和六然后休息 措施,然后将圆 工作,大家都知道这首歌。 我们看到两个注解或 音乐价值观的修改 中包含的这种顺序 音乐元素排列。 我们有一个附加的体积。 这是一个功能注释 音乐与特定体积。 这是一个很好的例子 一个MIDI信号运行 从0到127,七个位 可携带的信息。 而then--我们看到很 简要地,但一般的MIDI 所有不同乐器的列表。 还有的不是一大堆人。 如果您使用的是数字音频工作站, 像Ableton现场或Pro Tools, 有一个令人难以置信的范围更广 的合成器和VST乐器。 但MIDI标准只 有几个或几十个。 而他们中的一些有趣的。 我认为这将是有趣的,如果我们踢得 该仪器的MIDI乐器 直升机,然后 通过全面下一方式, 我们做了一个垫合成器,再 这个老生常谈牵头方波合成器, 然后语音软泥,这是一个 在我的坏MIDI有点恍 合成器,但他们确定。 然后我们看到这让 而在从Haskell语法, 然后我们玩 所有这些部分组合在一起 与并行复合算子。 我们大概可以显示出一些这方面的。 下面的代码。 你可以在C看到的,会是一个 大量的清嗓和设置 之前,你的表的代码 可以做音乐是这样。 还是有其他的编程 语言,你可能 必须用某种相互作用 库或API,并设置好一切, 然后你就必须清理。 但在这里Haskell是,我认为,一旦 你得到了它的窍门,令人难以置信 可读性和极具表现力。 因此,有落实 对弗里尔雅克。 好吧。 现在,我们要添加的打击乐, 这是一个有点混乱。 因此,让我们来看看幻灯片。 因此,最大的想法就是让 一串名单或部分。 在这些卷在机器内,有 是典型的约,也许8 10个节奏或敲击的部分。 然后用一堆技术。 我们已经讨论过these--使用 褶皱,过滤器,lambda函数, 映射在列表生成值 在一定范围内为1〜R,R为16, 或者在序32步。 然后,如果有在该列表中的值 因为我们正在通过序运行, 通过它在运行, 过去,原来关于这一点, 而且样品被触发。 这里有各种不同的怪异方式 我想出了产生音符。 尝试在自己的半总和。 它会听起来很酷。 如果时间允许,我们将通过这一点。 但现在,我猜想 我们要演示我们所拥有的。 让我们希望这正好确定。 因此,这是进入了ghci。 我们会加载一个文件 我有一个称为song.lhs, 这是我刚才给你看的文件。 太好了。 正如康纳刚才所说, 编译,这类型检查, 所以我能呼吸轻松了许多。 它不会炸毁我。 我想告诉你一些有用的东西。 你可以看到, 模块加载叫50。 您可以浏览该模块。 这是太好 关于doing--也许什么 你做的Haskell是不 所谓的软件开发, 但你可以做很多 有趣的东西你自己。 而工作流程是非常好的为 相比很多其他语言, 因为你可以在真正看到 可读的方式是怎么回事。 所以我们看到,我们有 所有的这些话,在 是音乐球场名单,然后我们 建立这些成更大的东西, 这是一个音乐歌曲。 这是一个音乐单元。 然后我们可以发挥这一切 用函数调用播放音乐。 你可以看到,到这里。 这只是玩。 我应该say--我没有谈 这个美元符号的无处不在。 美元符号是另一种缀操作符。 但它具有最低的优先级 任何操作者,从而有效的 意味着一切都在 美元符号的左 和美元符号的右边, 我们会在它之前得到评估。 因此,这有点像另一个 加括号的方式。 康纳哈里斯:它基本上是 函数组合。 它可以确保你不会,如果have-- 你有函数两侧或缀 对任何一方的运营商,他们不会 关联越过它,并给你 意想不到的效果。 斯蒂芬KREWSON:所以我们can-- 利用这一点,我们可以调用。 首先,我们将发挥它没有鼓。 这是直升机, 在MIDI直升机。 [音乐播放] 还有的方波。 声音软泥。 而你真的可以去野外与此有关。 我挑了一个非常简单的, 因为我知道我不应该贪 超过我能咀嚼。 只要保持它很简单 展示的主要思路。 但后来我想,我们已经 有一些鼓点加入到这一点。 仅仅因为这是一个 有点令人费解, 我没有用 鼓部件的名称, 我映射them--因为他们 该枚举类的一部分, 我映射他们整数。 一种是像一个低音鼓。 零是也。 七是很高的帽子。 而倒在这里,其中的 功能变得有点乱, 这些都是像康加鼓。 所以,如果你认为about--也许 有趣的方式来实现一个鼓机 使用起来非常有序 图案上的低音鼓。 因此,例如,在过滤过 名单的一切,还给 当它采取模块04 1。 所以我得到的1,5,9,13,17--所以这 是每一个小节的第一拍。 然后这是相同的 事移经两个步骤。 所以这是另类。 因此,这将是 像高礼帽。 再然后,到这里, 这是一个有点乱, 因为我们正在做的康加鼓。 而我有一些沙球到这里了。 所以,我可以打电话打的鼓机, 但它会永远持续下去, 它可能会开始抓起来 在我的系统的所有内存。 所以,我会打电话给这个函数 播放音乐,正如我们所看到的, 使用截断并联组成 发挥我们的小雅克·弗里尔歌曲 伴随着这个奇怪的鼓机。 因此,让我们一起来看看。 而且请不要提高自己的 所有的滚筒部件的安排。 不是我的专业,但我 有很多的乐趣。 [音乐播放] 所以,当然,这是所有 有点不一样的乐趣 如果我们不能把它转换 以一个分数,所以也许这 可被解释 由人的表演者。 所以,我不会跑在这里。 我已经生成的文件。 你可以看到,有一个 点LilyPond的file--这 将是我SEGUE过来 Connor--和点MIDI文件, 和点的PDF文件,它是什么 LilyPond的将最终产生。 但这些都是这些脚本,我会 只是在他们的帮助选项来运行它们。 如果你得到这些启动和运行 Euterpea,您可以生成一个MIDI文件。 然后从MIDI文件 与此MIDI 2LY程序, 你可以生成一个百合 池塘的文件,然后你 可以生成得分的PDF。 我们应该看看这个。 所以康纳可能会显示 你如何诠释这更好的, 但是这是雅克·弗里尔作为 通过我Euterpea产生。 它只是在C.我应该已经找到 出了什么破解它的实际研究。 但是,这是在管道 你怎么做到这一点这一点。 让我们再谈谈LilyPond的。 康纳哈里斯:好吧,让我们来看看。 你别说了解你的Haskell? 斯蒂芬KREWSON:哦,是的。 退房了解你哈斯克尔。 它的资源。 这就是我开始 学习,它的伟大。 不是哑巴学习。 康纳哈里斯:那是在网上。 所以,一个叫帅哥[听不清] learnyouahaskell.com,没有空格。 语法是生病了。 斯蒂芬KREWSON:这说明,太。 康纳哈里斯:那么,什么是LilyPond的? 这是一个声明式编程 语言的音乐排版。 所以declarative--可以 想到的事情,如HTML, 在这里你不是saying-- HTML 不说的网络浏览器应该如何 渲染页面一步一步来。 它只是说这 是文本描述 你想要什么的页面的样子。 然后它也是一个节目 该编译这种语言, 或者读它的,然后实际 做排版你, 它吐出这些 精彩看PDF得分。 您还可以得到PNG格式或什么的。 一个好方法思考 这是通过类比 是乳胶是有点像LillyPond, 但只是普通的排版。 因此,而不是of--它不是 所见即所得,你看到的 就是你一样,说 结局是,还是西贝柳斯, 或Microsoft Word,在那里你可以输入 实时草案东西实时 看到瞬间变化。 它是基于文本的。 你必须编译 用一个单独的程序分数 后来出去的PDF文件。 这是一个有点少 使用方便,如果你 试图直接写 成分数和你 试图撰写计算机。 但也有很多 的优势吧。 一,它看起来要好很多, 因为LillyPond实际上可以 花时间做 布局决定正确, 不像西贝柳斯或结局,其中有 使受损的算法,这样 它们可以显示 事情是实时的。 那么,为什么是LilyPond-- 计算机图形是困难的。 如果你正在做的音乐什么 并希望写出来的分数, 你不想写 出一切自己 首先是如何绘制 员工和如何绘制记事本。 这是非常困难的。 它已经做过的事情。 你会感觉良好。 如果您想使用大结局或西贝柳斯, 文件格式为那些事 是非常复杂的,而且你不能 真正使用它们编程。 您可以打开西贝柳斯与终曲 并转到文件,导出为PDF自己, 但你真的不能 调用从脚本。 LillyPond,你可以调用 从这些脚本。 你可以很容易重复 LillyPond乳胶。 我不会有那么多的时间去 在这些技术现在, 但它们的存在。 如果你想看看 成LillyPond书, 它自带的程序 您LillyPond分布, 而且它的迭代 LillyPond碎片进入乳胶 如果你想要做的事 就像一个大音乐学文件 用实例,例如。 这是一个不错的技能为 如果你正在做什么生活 音乐,不只是CS50。 我用LillyPond所有 我的组成项目 因为我基本上是一个 资深的高中。 因此,这里有一些简单的例子。 这基本上代表 难度的 大多数人会 面对它,他们正在 使用LilyPond的简单项目。 这第一个是初 由巴赫一个诗歌的序幕。 这下一个是摘录 从我自己的作品之一, 它只是在那里展示 你像[听不清] 把多条线路在同一 工作人员,怎么抒情undersetting工作。 歌词底图是一个东西,这是非常 易于使用的LilyPond的合唱。 所以,再有就是一些 在这里复杂的例子。 所有这些都在做 LilyPond的,他们是可行的。 这第一个摘录来自 [听不清]为[听不清]。 而这[听不清]来自 一块独奏低音 笛[听不清] 谁是longtime--谁 是的长期成员 音乐系在这里,我想。 我不知道,他已经走了过到。 但他是哈佛的顾问 作曲家协会很长一段时间。 了不起的人。 他写一些音乐,有很 复杂的符号,它LillyPond 还是能够处理非常不错。 所以,只是给你的感觉是什么 这件事情的能力are--所以 LillyPond的内部 是非常复杂的。 你也可以用它来 很长一段时间,包括 对于一些相当复杂 的事情,没有真正 不必知道了很多关于他们。 但基本思想是,在 最低水平,LillyPonds的原子 是的注意事项。 该票据包含 背景叫的声音。 所以声音环境 基本上对应 以复音单行。 然后使用右键即可 含分级 在更高层次那些 代表了比分员工 像以上的分组 钢琴的员工或员工合唱团, 然后最终 整个得分上下文。 你实际上可以包括 多的分数在一本书。 而每一个方面都有 附加雕刻机的数量。 如果你看一下通过 上下文内容 并打印一个特定符号或 某些类作为必要的符号。 所以,每一个声音的背景下, 有[听不清]注意事项 雕刻的,基本上是一个功能或 一个对象,写出所有的注意事项 头在页面的右边部分。 然后有一个裂口雕刻,这 写出裂的工作人员。 此外,还有一个节拍器 标志雕刻的 写出节拍器标记的得分。 而所有这些适合漂亮 早已进入的层次结构。 而这是非常,非常,非常 可定制的,您需要 如果你想获得这样的事情。 因此,所有的上下文有 许多不同的属性 你可以修改一切 从间距各种字体 选择事物的大小。 如果你想要做的,甚至 更复杂的东西, 有一个嵌入式脚本语言。 他们使用方案,该方案 是LISP的方言。 这些可能不 你什么意思。 但基本上,一个方案 另一个功能 编程语言,更多或更少。 斯蒂芬KREWSON:领带项。 康纳哈里斯:是的。 这是一个很好的搭配,我想。 而且它作为教学语言, 其实,倒质量大道在麻省理工学院。 而且它是非常方便的LillyPond 各种技术原因。 所以,如果你想简单 调整依赖于条件句, 对于example--有一定的 分条件满足真实的, 更改这一 布局或whatnot--然后 这些设施的存在。 他们是复杂的。 因此,这里是一个非常简单的代码示例。 这是五线。 基本上,我定义两个工作人员。 它的3/4。 第一个工作人员有一个 连接速度大关, 但是这实际上是 去到整个得分, 因为节奏标记 都在得分水平。 节拍器标记雕刻 附着到得分上下文。 有不同的钥匙, 因为[听不清]雕刻机 连接员工。 实际上,你可以做的是。 我写的样本 其实在C大调, 但它只是为 证明你可以有 不同的按键在不同的工作人员。 其基本语法是你写的 注意到E,F,G,无论名称。 如果你想要做的记号, 你后缀或ES。 这是从荷兰的 音乐学约定。 要做到八度跳跃,你必须使用 这些刻度线,逗号或撇号。 相对只是意味着 不管你有一张纸条, 它会自动在被plaec 八度最接近前一个。 如果你想跳多 一个fifth--说第五或缓慢 - 那么你必须使用[听不清]。 但除此之外,你也不必 指定每一个音符的八度。 而相对的C,总理和 C,你只需指定中央C 和底座下,特别是第一个音符。 那么你有这些员工的组织 这两种声音或音乐的样品, 和你有一个分数。 这看起来是这样的。 如果你想花时间 复制LillyPond的该样本 在以前的代码 滑下来这里,和你 可以写为LillyPond自己。 我知道我们已经得到的东西 这看起来很像这一点。 因此,有另一种技术 所谓的音乐XML维护 通过完全不同的人。 XML是一种文本数据结构 - 我 不应该说数据结构 - 说 比喻地图之类的。 它的设计,以容纳 分层数据非常好。 HTML,例如,是一个XML类型。 你可以告诉XML,因为他们 把所有的尖括号和角度 支架的斜杠标志 这个节目的数据字段。 我没有一个代码 例如,从音乐的XML。 你可以找到它自己。 基本上,原因你可能想 使用XML作为中间阶段 是,首先,它是 交换格式 对于基本every--我不该说 每一个,但很多不同的分数 作家。 所以,如果你在音乐写 XML中,不仅可以LillyPond 与此辅助的的帮助读 程序调用音乐的XML LY, 而且结局可以读 它,西贝柳斯可以读取它。 如何根据您的内部对象 层次工程代表音乐, 它可能会更容易写出来 音乐XML比LillyPond 而仅仅依靠音乐XML 以LY做转换。 我不认为[听不清]的音乐XML。 斯蒂芬KREWSON:它没有。 有人正在研究它,但。 康纳哈里斯:好的。 Euterpea不具有 音乐XML输出​​功能呢。 如果你想有一个最终的项目理念, 可能得到与人接触 斯蒂芬知道,和 他们可能需要你的帮助。 斯蒂芬KREWSON:我喜欢这一点。 康纳哈里斯:另外,基本上, 每一个编程语言 这是称职 已经有一个XML库, 这样你就可以在内部转换所有 你的音乐到某个对象的 该XML库可以写 指出,将需要更少的 改变你的内部结构 不管是什么音乐的对象,你就 希望不是写它来写 直接在LillyPond会。 然后,只需打印出来使用XML与 在XML库在你的语言, 这将保证,它的 语法正确的,一切, 然后将其转换为LillyPond。 所以,技术,你可能想 看看,如果你正在做的事情 喜欢这个。 [听不清],另一 auxilarry技术。 这基本上是技术作品 或技术工作室为LillyPond。 因此,它提供帮助 语法,使用模板 各种常见的 仪器的组合。 它允许分割画面观看这样 你可以有你的代码在一个窗口 和PDF的另一个窗口, 点击PDF中的地方 跳转到相关 点在源代码中。 如果你其实这是比较有用 写作LillyPond文件自己 比如果你正在生成 他们编程。 但同样,它的 一些有用的东西有。 大。 另外resources--我就 经过这个速度非常快。 LillyPond manuals-- LillyPond有 出色的文件在其网站上。 他们有一个教程。 他们有一个语法参考。 他们有数百个片断 各种小东西 哟可能需要做些什么来证明 各种能力。 如果你想使用 脚本语言 或者更广泛地 自定义,然后还有 内部在该URL引用。 如果你想用音乐的XML,有 该URL,musicxml.com/tutorial。 然后,如果你需要学习计划 因为你真的想使用 脚本设施LillyPond, 然后有一个[听不清]被称为 结构化解读 计算机程序, 这不仅在第二 最大的CS教科书曾经written-- 找我算账,如果你想知道 我认为一个最伟大is-- 但它也是一个非常好的 引进适当的语言。 你不会需要超过 前几节。 就是这样。 任何问题? 学生:我在哪里可以下载 您生成的弗里尔雅克· 这样我就可以把它放在我的iPod? 斯蒂芬KREWSON:嗯,你可以写 出在Euterpea一些wav文件。 而你的代码。 这是在GitHub上。 使自己的变化 雅克·弗里尔通过CS50蜂群思维。 这会很棒。 康纳哈里斯:还有其他人? 斯蒂芬KREWSON:我们需要 一个更好的低音鼓了。 这是非常糟糕的。 学生:Euterpea不仅 组成一面,但signal-- 斯蒂芬KREWSON:是的。 事实上,在工作中,我 在Euterpea没有当我 把this--有一个 研究生课程在耶鲁大学的 使用它 - 是在声音合成。 所以这是一个非常 使用箭头好方法 还有一些我们看到的记号 信号功能合成在一起。 特别是,对于低音最 他们仅仅是一个简单的正弦波。 但是,如果你开始撰写者 怪异编程的方​​式, 你可以得到疯狂的声音 效果,比如怪异的瀑布。 您可以创建非常坚韧不拔 听起来有很多调制。 我做了一个项目上的粒状 合成,这是 介于FM和取样之间。 你需要非常小的, 少的样品,然后 用某种组合它们 调制器和建立一个更丰富的声音。 我们也做了物理建模,所以 试着换位思考一下物理 和类似心理声学 小号和思考方式 声音反弹 小号的钟声 和声学 房间和建模 与该基本振荡器。 康纳哈里斯:非常感谢。 感谢你的到来。 而我总是愿意 通过email--的提问 connorharris@college.harvard.edu。 斯蒂芬KREWSON:是的。 stephen.krewson@yale.edu。 凉。