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 CA在哈佛。 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 我们将重点放在第一个 编程语言叫做哈斯克尔。 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 你已经使用,尤其是 写在哈斯克尔库 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 这有点像乳胶 对于音乐,如果你们中的任何 20 00:00:50,830 --> 00:00:57,530 已经使用乳胶数学课或 另一名P集类或你有什么。 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:哈斯克尔和 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 而这仅仅是一个 很50,000英尺的看法。 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年代用 雅马哈和约翰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 是一致的 通用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 所有经典的任天堂 视频游戏大概会 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:那么,为什么哈斯克尔? 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 像雅克·弗里尔, 这个简单的歌 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 我们使用哈斯克尔,其中 函数是一等公民。 128 00:06:59,400 --> 00:07:01,120 >> 我想延长 这一点点。 129 00:07:01,120 --> 00:07:08,800 这是一个有点容易 notate弗里尔雅克·哈斯克尔。 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 >> 我们会看到在一个不错的方式 代表这一步的哈斯克尔 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 的一些方面 哈斯克尔和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编译解释。 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 但是你可以探索他们的方式 通过使用这种T或键入命令定义 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和锵 是hardass关于类型, 166 00:09:09,820 --> 00:09:11,230 你不知道有关哈斯克尔。 167 00:09:11,230 --> 00:09:14,230 关于哈斯克尔的好处是, 如果你能得到你的代码编译 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--几个 哈斯克尔的特征是,至少 173 00:09:27,160 --> 00:09:31,780 其creators--和它的创建 在20世纪80年代被一堆人迟到, 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 哈斯克尔描述的起源 在第一个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 你打开它,你开始 运行的一个步骤序列 - 187 00:10:16,740 --> 00:10:20,010 如果你曾经有鼓工作 机 - 和它只是永远。 188 00:10:20,010 --> 00:10:24,650 因此,这将是非常好的,如果我们 可以效仿,在哈斯克尔。 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 这里 - 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--如果它被称为 有褶皱的R加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 康纳哈里斯:那么换一种 这样,折R的三个参数。 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 语言有这个,所谓的降低。 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:和 什么是好的关于倍ṛ 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 约哈斯克尔和Euterpea的事情。 239 00:13:14,460 --> 00:13:20,650 >> 因此,本折colon--结肠R是 只是推的东西操作 240 00:13:20,650 --> 00:13:25,700 一起在一个叫上一个空的列表中 - 列表中,这仅仅是一个空的方括号。 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 我在前面加上该 这种较短的小列表中 - 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 那么,哈斯克尔提供 很多fun​​ctions--的 257 00:14:26,500 --> 00:14:29,450 并期待更多的进入这些在 你自己的时间 - 比如拿 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 我们将看到这个以后 我们的鼓机代码 - 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 >> 哈斯克尔也是纯洁的,所以它具有很强的 静态类型康纳一笔带过。 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 如果你是[听不清]的F 1,F的 2,则f 3或whatnot--的F 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 而这一切都是可能的 哈斯克尔因为类型的类。 301 00:16:43,130 --> 00:16:48,000 >> 因此,如果你定义一个特定的数据类型 - 这里,这些是音乐的间距。 302 00:16:48,000 --> 00:16:50,960 我们终于得到 一些电脑音乐。 303 00:16:50,960 --> 00:16:57,420 因此,我们有C,C锐利, 等,等等。 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.后升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 你要定义升C 如等于降D,例如。 324 00:18:09,450 --> 00:18:11,560 采用这种结构 在这里,我不认为C调 325 00:18:11,560 --> 00:18:14,940 和D平将是相等的,因为 编译器会自动 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 我们的鼓部分与我们 小雅克·弗里尔歌曲 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--库里最后 哈斯克尔库里的名谁 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--˚Fx和y--的 351 00:19:42,810 --> 00:19:46,630 可以被表示为 ˚Fx的施加到y。 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 因此,这意味着我们可以映射 x的函数f过的y的名单。 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 此列表中 - 的第一元件和 这些都是音乐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 为已被返回的函数 1 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--想象f是只是一个 乘法函数,它有两个 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 如果你进给量f 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 是另一种哈斯克尔标志。 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 而这只是需要X组件N-- 400 00:22:28,007 --> 00:22:28,840 康纳哈里斯:是的。 401 00:22:28,840 --> 00:22:31,330 所以f是一个函数 两个参数n和p 402 00:22:31,330 --> 00:22:35,440 返回的函数,其本身 一个参数的函数,即x即可。 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 但哈斯克尔决定 使用中缀运算符。 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 沿弹鼓机 我们弗里尔雅克·歌。 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 但是弗里尔雅克·歌是没有的。 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 这infixed运营商 是与超级有用的。 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 x除以东西else-- 对不起,应该是a和b。 432 00:24:01,010 --> 00:24:04,740 你可以把它写成B的报价。 433 00:24:04,740 --> 00:24:09,670 所以,如果你put--元素 这另一个例子。 434 00:24:09,670 --> 00:24:14,730 X元素在某些列表中,如果你把 它在反引号,你可以使用它。 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:所以,我们在这里看到的 最后一句话我们弗里尔雅克·歌, 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 因此,如果x是的列表的元素 X的,然后我们将调用PERC功能。 452 00:25:23,030 --> 00:25:25,100 所以PERC只是一个打击乐器功能。 453 00:25:25,100 --> 00:25:30,200 这需要一些值p那 有界集中所有的组成部分 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 如果i是该一个构件 设置在此函数创建, 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 x被填充这个 列表构建1 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个这样的 n为或n为Z轴。 473 00:26:45,999 --> 00:26:48,290 类似件事 - 这个符号 就是要提示 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 有没有一个很好的概念, 哈斯克尔还是不错的,明显的概念 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 >> 康纳哈里斯:在 其他哈斯克尔的例子, 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哈斯克尔。 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 所以,如果没有被零除 它会返回刚才什么。 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 然后,我们看到,如果我们得到的一个步骤 序列一起一伏的体积参数, 523 00:29:51,460 --> 00:29:57,290 p表示预防仪器 参数,然后X的列表。 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 同样,这是一个小 有点刻意inconcise 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 因此,我们要尝试 让雅克·弗里尔歌曲。 536 00:30:32,250 --> 00:30:35,220 因此,有多少 在雅克·弗里尔短语? 537 00:30:35,220 --> 00:30:38,790 538 00:30:38,790 --> 00:30:39,680 四。 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现场或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 因此,有落实 对弗里尔雅克。 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 在这些卷在机器内,有 是典型的约,也许8 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--使用 褶皱,过滤器,lambda函数, 597 00:34:14,889 --> 00:34:19,429 映射在列表生成值 在一定范围内为1〜R,R为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 这是直升机, 在MIDI直升机。 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 当它采取模块04 1。 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 使用截断并联组成 发挥我们的小雅克·弗里尔歌曲 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 但是这是雅克·弗里尔作为 通过我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 退房了解你哈斯克尔。 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--它不是 所见即所得,你看到的 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 不像西贝柳斯或结局,其中有 使受损的算法,这样 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 >> 如果您想使用大结局或西贝柳斯, 文件格式为那些事 757 00:43:26,200 --> 00:43:30,180 是非常复杂的,而且你不能 真正使用它们编程。 758 00:43:30,180 --> 00:43:35,020 您可以打开西贝柳斯与终曲 并转到文件,导出为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碎片进入乳胶 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 我写的样本 其实在C大调, 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--说第五或缓慢 - 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,总理和 C,你只需指定中央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是一种文本数据结构 - 我 不应该说数据结构 - 说 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 与此辅助的的帮助读 程序调用音乐的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 >> 我不认为[听不清]的音乐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 这基本上是技术作品 或技术工作室为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 >> 学生:我在哪里可以下载 您生成的弗里尔雅克· 947 00:52:57,972 --> 00:53:01,050 这样我就可以把它放在我的iPod? 948 00:53:01,050 --> 00:53:07,574 >> 斯蒂芬KREWSON:嗯,你可以写 出在Euterpea一些wav文件。 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 使自己的变化 雅克·弗里尔通过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 使用它 - 是在声音合成。 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