1 00:00:00,000 --> 00:00:05,180 2 00:00:05,180 --> 00:00:05,930 CONNOR HARRIS: Oi. 3 00:00:05,930 --> 00:00:06,820 Eu sou Connor Harris. 4 00:00:06,820 --> 00:00:09,729 Eu sou um CA CS50 em Harvard. 5 00:00:09,729 --> 00:00:11,270 STEPHEN Krewson: Eu sou Stephen Krewson. 6 00:00:11,270 --> 00:00:12,582 Eu sou um TF para CS50 em Yale. 7 00:00:12,582 --> 00:00:15,790 CONNOR HARRIS: E nós estamos indo falar sobre algumas tecnologias que você pode 8 00:00:15,790 --> 00:00:18,880 deseja usar, se você estiver interessado em fazer um projeto final ou realmente 9 00:00:18,880 --> 00:00:20,920 nada com a música. 10 00:00:20,920 --> 00:00:24,400 Nós estamos indo para se concentrar em um primeiro linguagem de programação chamada Haskell. 11 00:00:24,400 --> 00:00:26,280 É uma funcional língua, de modo que o paradigma 12 00:00:26,280 --> 00:00:29,620 é muito diferente do C ou PHP ou outras linguagens imperativas 13 00:00:29,620 --> 00:00:33,450 que você já tenha usado e, especialmente, numa biblioteca escrita em Haskell 14 00:00:33,450 --> 00:00:40,240 Euterpea chamado, o que pode ajudar as pessoas com a escrita de música funcionalmente, 15 00:00:40,240 --> 00:00:40,780 basicamente. 16 00:00:40,780 --> 00:00:43,400 E Stephen irá orientá-lo através de um grande exemplo disso. 17 00:00:43,400 --> 00:00:46,423 >> Depois disso, eu vou apresentá-lo a algo chamado LillyPond, que 18 00:00:46,423 --> 00:00:48,370 é uma tecnologia para a música de composição. 19 00:00:48,370 --> 00:00:50,830 É uma espécie de como LaTeX para a música se algum de vocês 20 00:00:50,830 --> 00:00:57,530 LaTeX ter usado para aulas de matemática ou outras classes conjunto P ou o que você tem. 21 00:00:57,530 --> 00:01:00,440 E então eu vou dar-lhe, mais uma vez, alguns exemplos simples de que 22 00:01:00,440 --> 00:01:03,640 e apontá-lo na geral direção de alguns recursos melhores. 23 00:01:03,640 --> 00:01:04,319 >> STEPHEN Krewson: Em Adicionalmente, nós pensamos que 24 00:01:04,319 --> 00:01:06,720 seria legal para definir-se um pouco de sugestões 25 00:01:06,720 --> 00:01:10,780 em direção a um gasoduto entre Arquivos MIDI gerados pelo Euterpea 26 00:01:10,780 --> 00:01:13,910 em LillyPond, por isso oferecemos alguma instrução em scripts 27 00:01:13,910 --> 00:01:16,310 para fazer isso que são fornecida com LillyPond 28 00:01:16,310 --> 00:01:19,160 apenas para mantê-lo open source e obter um gasoduto vai. 29 00:01:19,160 --> 00:01:20,910 CONNOR HARRIS: Mais uma vez, devemos enfatizar, 30 00:01:20,910 --> 00:01:23,100 essas duas tecnologias, você não tem que usá-los juntos. 31 00:01:23,100 --> 00:01:25,370 Eles não são projetados para trabalhar juntos, embora eles fazem muito bem. 32 00:01:25,370 --> 00:01:26,362 >> STEPHEN Krewson: Certo. 33 00:01:26,362 --> 00:01:30,116 E totalmente gratuito. 34 00:01:30,116 --> 00:01:32,240 CONNOR HARRIS: Então, reconhecimentos, basta ler isso. 35 00:01:32,240 --> 00:01:33,406 STEPHEN Krewson: Devidamente anotado. 36 00:01:33,406 --> 00:01:36,360 Graças a essas pessoas. 37 00:01:36,360 --> 00:01:39,180 Isso eu vou ficar em apenas por um momento. 38 00:01:39,180 --> 00:01:41,560 O processo de instalação é um pouco complicado. 39 00:01:41,560 --> 00:01:45,420 Temos um me ler no GitHub que você pode dar uma olhada. 40 00:01:45,420 --> 00:01:47,840 Apenas envie-me se você tiver quaisquer perguntas. 41 00:01:47,840 --> 00:01:52,829 Mas vamos executar este sob o pressuposto que este está a funcionar para todos. 42 00:01:52,829 --> 00:01:55,620 CONNOR HARRIS: E se você não puder obter LillyPond para trabalhar, não é grande coisa. 43 00:01:55,620 --> 00:02:00,139 Não há nenhuma compilação ao vivo que estarão envolvidos, pelo menos no meu fim. 44 00:02:00,139 --> 00:02:02,930 STEPHEN Krewson: Haskell e LillyPond deve ambos têm instaladores. 45 00:02:02,930 --> 00:02:08,497 Euterpea é baixado como um pacote, assim por diante e assim por diante. 46 00:02:08,497 --> 00:02:10,080 Então, nós estamos falando de música de computador. 47 00:02:10,080 --> 00:02:12,990 E este é apenas um muito vista de 50.000 pés. 48 00:02:12,990 --> 00:02:15,700 Há alguns aspectos diferentes do mesmo. 49 00:02:15,700 --> 00:02:18,120 E isso é duro e é indo a obscurecer algum detalhe. 50 00:02:18,120 --> 00:02:22,090 Mas poderíamos pensar em algo como composição algorítmica, 51 00:02:22,090 --> 00:02:24,920 utilizando algoritmos, usando o código, para gerar 52 00:02:24,920 --> 00:02:30,280 algum tipo de-- talvez um auto-similar seqüência de notas, ou talvez notas 53 00:02:30,280 --> 00:02:33,330 sob alguma restrição. 54 00:02:33,330 --> 00:02:35,350 E então aqueles poderia ser executado ou interpretada 55 00:02:35,350 --> 00:02:38,390 com instrumentos analógicos ou qualquer coisa assim. 56 00:02:38,390 --> 00:02:42,010 Mas a composição era feito através de algoritmos. 57 00:02:42,010 --> 00:02:45,120 >> Mas, claro, talvez a área de música de computador ou de música digital 58 00:02:45,120 --> 00:02:48,870 estamos mais familiarizados com é digital síntese de som ou de amostragem digital 59 00:02:48,870 --> 00:02:51,160 e gravação digital. 60 00:02:51,160 --> 00:02:55,650 Um monte de instrumentos digitais são feito através de amostragem digital. 61 00:02:55,650 --> 00:03:00,110 Na verdade, nós estaremos usando um dos que estão no a forma de uma biblioteca de fontes de som mais tarde. 62 00:03:00,110 --> 00:03:02,850 >> Mas também há algo chamado síntese digital que saiu 63 00:03:02,850 --> 00:03:08,650 dos anos 70 e nos anos 80 com 'final Yamaha e John Chowning em Stanford 64 00:03:08,650 --> 00:03:11,990 fazendo síntese FM ou Síntese de modulação de frequência, 65 00:03:11,990 --> 00:03:15,100 onde você teve uma transportadora sinal e um sinal de modulação 66 00:03:15,100 --> 00:03:18,270 tanto no espectro de áudio. 67 00:03:18,270 --> 00:03:22,570 Mas o que estamos focados em hoje é algo chamado MIDI, 68 00:03:22,570 --> 00:03:25,040 e, claro, composição algorítmica. 69 00:03:25,040 --> 00:03:30,940 >> Nós não estamos indo para fazer instrumentos, mas nós estamos indo em vez de fazer alguma música, 70 00:03:30,940 --> 00:03:33,940 e, em seguida, que vai se interpretado pelo que alguns instrumentos 71 00:03:33,940 --> 00:03:38,300 são conformidade com o padrão geral MIDI. 72 00:03:38,300 --> 00:03:40,830 Então o que é MIDI? 73 00:03:40,830 --> 00:03:45,550 Eu não vou ficar muito fundo nele, mas MIDI é um protocolo de transferência de dados. 74 00:03:45,550 --> 00:03:49,250 É uma espécie de um guia em frente diferentes empresas e indústrias 75 00:03:49,250 --> 00:03:52,250 para a organização de sons ou patches. 76 00:03:52,250 --> 00:03:54,170 Então, vamos ver que há um padrão MIDI 77 00:03:54,170 --> 00:03:57,500 para todos os diferentes percussão sons e recomendações MIDI 78 00:03:57,500 --> 00:04:01,360 para todos os diferentes tipos de sintetizadores ou diferentes tipos de todo o instrumento 79 00:04:01,360 --> 00:04:03,650 grupos em uma orquestra, dizem. 80 00:04:03,650 --> 00:04:08,916 >> Você provavelmente está familiarizado com 0 a 127 mensagens MIDI. 81 00:04:08,916 --> 00:04:12,920 Um sinal MIDI é tipicamente um bit indicando 82 00:04:12,920 --> 00:04:16,130 se é um de dados ou um pacote de estado, e depois há 83 00:04:16,130 --> 00:04:18,589 sete bits de um sinal. 84 00:04:18,589 --> 00:04:21,430 E estes podem controlar tudo a partir do volume 85 00:04:21,430 --> 00:04:25,330 à pressão ou acção em uma chave especial 86 00:04:25,330 --> 00:04:29,400 se você estiver executando com um MIDI controlador, assim como, naturalmente, 87 00:04:29,400 --> 00:04:31,250 notas. 88 00:04:31,250 --> 00:04:33,450 E, claro, tem MIDI foi extremamente útil, 89 00:04:33,450 --> 00:04:37,550 porque é uma maneira de arame juntos ou em cadeia 90 00:04:37,550 --> 00:04:41,570 um monte de dispositivos de hardware MIDI. 91 00:04:41,570 --> 00:04:44,050 Eu tenho sete ou oito de volta na minha casa. 92 00:04:44,050 --> 00:04:46,610 Fica realmente complicado, mas é realmente poderoso. 93 00:04:46,610 --> 00:04:47,460 E é realmente velho. 94 00:04:47,460 --> 00:04:51,117 É do início dos anos 80, e é muito bom e pequeno. 95 00:04:51,117 --> 00:04:51,950 CONNOR HARRIS: Yeah. 96 00:04:51,950 --> 00:04:54,230 Tudo o clássico Nintendo jogos de vídeo seria, provavelmente, 97 00:04:54,230 --> 00:04:56,088 tem arquivos MIDI para a música, por exemplo. 98 00:04:56,088 --> 00:04:59,550 99 00:04:59,550 --> 00:05:01,740 >> STEPHEN Krewson: Aqui está um exemplo de MIDI geral, 100 00:05:01,740 --> 00:05:06,520 mostrando MIDI como uma espécie de protocolo geral. 101 00:05:06,520 --> 00:05:13,280 E eu penso que nós podemos pensar no diferença entre a especificação 102 00:05:13,280 --> 00:05:17,830 que deve haver algo como estes sons de instrumentos eo real 103 00:05:17,830 --> 00:05:21,740 realização desses instrumentos sons em uma fonte de som ou um MIDI especial 104 00:05:21,740 --> 00:05:25,740 sintetizador como sendo a diferença entre talvez um typeface-- que diz: 105 00:05:25,740 --> 00:05:30,350 Em geral, este é o desenho de Desta forma especial para representar 106 00:05:30,350 --> 00:05:35,907 de caráteres e uma fonte específica que tem um tamanho e timbre específico, 107 00:05:35,907 --> 00:05:37,240 e não há realização de as-- 108 00:05:37,240 --> 00:05:39,156 >> CONNOR HARRIS: Talvez um melhor comparação seria 109 00:05:39,156 --> 00:05:43,430 ser o padrão Unicode says-- dá- um número para cada personagem, e realmente 110 00:05:43,430 --> 00:05:46,830 todas as línguas do mundo, ou um vasto conjunto de scripts de linguagem 111 00:05:46,830 --> 00:05:51,310 em todo o mundo, e, em seguida, são aqueles rendido em algo gráfica 112 00:05:51,310 --> 00:05:53,710 por vários pacotes de fontes. 113 00:05:53,710 --> 00:05:56,630 E, obviamente, você pode pensar MIDI como o Unicode de som. 114 00:05:56,630 --> 00:06:03,250 E isso é apenas uma lista de-- um grande fluxo de eventos e instrumentos e outros enfeites, 115 00:06:03,250 --> 00:06:06,090 e você tem que ter um separado programa, como um tipo de letra, 116 00:06:06,090 --> 00:06:08,537 para tornar isso em algo que é audível. 117 00:06:08,537 --> 00:06:12,360 118 00:06:12,360 --> 00:06:13,780 >> STEPHEN Krewson: Então, por que Haskell? 119 00:06:13,780 --> 00:06:19,110 Haskell é uma programação funcional língua, muito avançado, 120 00:06:19,110 --> 00:06:22,770 muito diferente de C, muito diferente do PHP. 121 00:06:22,770 --> 00:06:28,120 E vamos ver que há uma facilidade de composição de função em Haskell 122 00:06:28,120 --> 00:06:37,640 que nos permitirá brisa através compondo ou digitando-se, transcrever, 123 00:06:37,640 --> 00:06:42,160 algo como Frere Jacques, esta canção simples que 124 00:06:42,160 --> 00:06:46,815 tem um monte de peças em que ela são auto-similar ou repetir. 125 00:06:46,815 --> 00:06:49,740 126 00:06:49,740 --> 00:06:53,250 Então, isso vai ser alguns dos a motivação para isso 127 00:06:53,250 --> 00:06:59,400 estamos usando Haskell, em que funções são cidadãos de primeira classe. 128 00:06:59,400 --> 00:07:01,120 >> E eu queria estender isso um pouco. 129 00:07:01,120 --> 00:07:08,800 É um pouco fácil anotar Frere Jacques em Haskell. 130 00:07:08,800 --> 00:07:12,100 Mas o que se quiséssemos adicionar uma parte da bateria para ele? 131 00:07:12,100 --> 00:07:17,320 O que se queria para tentar fazer algo como um tambor Roland 808 ou 909 132 00:07:17,320 --> 00:07:20,970 máquina em que você tem cerca de 16 diferentes etapas? 133 00:07:20,970 --> 00:07:24,590 Normalmente, estas são pensou em notas como 16o. 134 00:07:24,590 --> 00:07:28,640 E você pode controlar o mundial tempo, e você pode escolher 135 00:07:28,640 --> 00:07:34,620 um monte de diferentes partes de percussão de bumbo, uma salva de palmas, diferentes armadilhas, 136 00:07:34,620 --> 00:07:37,540 abertas e fechadas chapéus altos sobre este tipo de canais, 137 00:07:37,540 --> 00:07:41,600 e então você pode ou EQ ajustar o seu volume. 138 00:07:41,600 --> 00:07:45,290 >> E nós vamos ver uma maneira agradável em Haskell de representar esta etapa 139 00:07:45,290 --> 00:07:48,810 sequenciador com toda a várias coisas legais em Haskell 140 00:07:48,810 --> 00:07:53,100 o que podemos fazer com a geração listas e mais listas de filtragem, 141 00:07:53,100 --> 00:07:56,060 mapeamento sobre listas, mapeamento funções mais listas. 142 00:07:56,060 --> 00:07:59,530 143 00:07:59,530 --> 00:08:00,760 E um rápido pedido de desculpas. 144 00:08:00,760 --> 00:08:05,300 Este é um muito superficial e esboço excessivamente rápida 145 00:08:05,300 --> 00:08:07,620 de alguns dos aspectos de Haskell e Euterpea, 146 00:08:07,620 --> 00:08:11,760 que é um domínio específico linguagem embutida escrito 147 00:08:11,760 --> 00:08:14,970 em Haskell para tipos musicais. 148 00:08:14,970 --> 00:08:17,350 Então, por favor, verifique o código online. 149 00:08:17,350 --> 00:08:22,404 Fogo até GHCI, que é o Glasgow Haskell Compiler intérprete. 150 00:08:22,404 --> 00:08:24,320 E eu vou estar fazendo alguns isso em um pouco 151 00:08:24,320 --> 00:08:25,880 assim você pode ver como ele é feito. 152 00:08:25,880 --> 00:08:31,021 >> E isso permite que você carregue em com as-- a sintaxe é cólon e então 153 00:08:31,021 --> 00:08:31,520 o comando. 154 00:08:31,520 --> 00:08:33,510 Você pode carregar em arquivos. 155 00:08:33,510 --> 00:08:36,840 Você pode usar browse nesses arquivos para ver todas as funções que 156 00:08:36,840 --> 00:08:39,169 existir em um módulo em particular. 157 00:08:39,169 --> 00:08:43,850 E então, como vamos ver, tipos e tipo classes são tão importantes em Haskell, 158 00:08:43,850 --> 00:08:48,850 assim você sempre pode check-- especialmente se você está trabalhando em uma nova DSCL 159 00:08:48,850 --> 00:08:51,600 como este, que é um tipo de música? 160 00:08:51,600 --> 00:08:55,114 Eu sei sobre o modo numérico tipos trabalhar em Haskell, 161 00:08:55,114 --> 00:08:56,530 mas eu não sei muito sobre música. 162 00:08:56,530 --> 00:09:01,280 Mas você pode explorar a forma como eles são definida usando o comando t ou tipo 163 00:09:01,280 --> 00:09:04,577 e, em seguida, chamar em um determinado função ou um objeto de dados. 164 00:09:04,577 --> 00:09:05,410 CONNOR HARRIS: Yeah. 165 00:09:05,410 --> 00:09:09,820 Se você pensou C e Clang foi hardass sobre tipos, 166 00:09:09,820 --> 00:09:11,230 você não tem idéia sobre Haskell. 167 00:09:11,230 --> 00:09:14,230 A coisa boa sobre Haskell é que se você pode obter o seu código para compilar 168 00:09:14,230 --> 00:09:16,790 e se verificações de tipo Haskell, ele provavelmente está certo, 169 00:09:16,790 --> 00:09:18,675 porque o sistema de tipo é tão rigoroso. 170 00:09:18,675 --> 00:09:20,090 >> STEPHEN Krewson: Yeah. 171 00:09:20,090 --> 00:09:21,980 Então, eu só quero ir through-- e novamente, 172 00:09:21,980 --> 00:09:27,160 este não está fazendo isso justice-- algumas das as características de Haskell que, pelo menos 173 00:09:27,160 --> 00:09:31,780 a sua creators-- e foi criado no final de 1980 por um grupo de pessoas, 174 00:09:31,780 --> 00:09:34,610 uma comissão de cerca de 20 pessoas-- pensei que eram importantes. 175 00:09:34,610 --> 00:09:36,850 E a primeira coisa que eles listados em um documento que 176 00:09:36,850 --> 00:09:41,890 descreveu a gênese de Haskell ao longo dos primeiros 20 anos ou mais 177 00:09:41,890 --> 00:09:43,390 é que era preguiçoso. 178 00:09:43,390 --> 00:09:44,990 Então o que isso significa? 179 00:09:44,990 --> 00:09:49,860 >> Bem, isso significa que quando temos algum tipo de expressão, precisamos avaliá-lo. 180 00:09:49,860 --> 00:09:54,390 E Haskell faz isso de uma chamada por meio necessidade ou uma maneira que não seja estrita. 181 00:09:54,390 --> 00:09:57,250 Ou seja, se nós temos um monte de componentes de nossa expressão, 182 00:09:57,250 --> 00:10:00,660 nós tentar atrasar a avaliação desses subcomponentes 183 00:10:00,660 --> 00:10:05,300 até o último minute-- absoluta ou seja, até nós realmente precisamos deles. 184 00:10:05,300 --> 00:10:08,480 >> Portanto, este means-- que é muito legal, especialmente 185 00:10:08,480 --> 00:10:13,200 se nós estamos pensando sobre a abstração de um seqüenciador passo a passo musical. 186 00:10:13,200 --> 00:10:16,740 Você ligá-lo, e você começa executando um passo sequence-- 187 00:10:16,740 --> 00:10:20,010 Se você nunca trabalhou com um tambor machine-- e ele só vai para sempre. 188 00:10:20,010 --> 00:10:24,650 Por isso, seria muito bom se nós poderia emular que em Haskell. 189 00:10:24,650 --> 00:10:31,040 E podemos fazê-lo com infinita valores, em listas infinitas particulares. 190 00:10:31,040 --> 00:10:35,860 É muito fácil de digitar um lista infinita em Haskell. 191 00:10:35,860 --> 00:10:39,230 Você pode simplesmente usar a sintaxe para baixo aqui, onde você vê de 1 a 3, 192 00:10:39,230 --> 00:10:42,440 remover o 3 1 ponto a ponto, e que é uma lista infinita 193 00:10:42,440 --> 00:10:46,960 de todos os números naturais estendendo em tanto quanto você pode imaginar. 194 00:10:46,960 --> 00:10:49,925 >> Eu quero apresentar uma conceito de dobras de imediato. 195 00:10:49,925 --> 00:10:51,800 E, novamente, o propósito Este seminário não é 196 00:10:51,800 --> 00:10:55,770 para aprender sobre dobras em Haskell ou funções de ordem superior. 197 00:10:55,770 --> 00:10:59,640 Mas eu só quero apresentá-lo ao dar um sentido preciso de como estranho 198 00:10:59,640 --> 00:11:03,700 Haskell é e como ele é poderoso. 199 00:11:03,700 --> 00:11:08,000 E, em particular, vamos ser-- quando fazemos nossas diferentes partes de bateria, 200 00:11:08,000 --> 00:11:12,790 vamos estar manipulando listas de números, dobrando-os uns sobre os outros. 201 00:11:12,790 --> 00:11:17,290 E para fazer isso, vamos estar usando mapas e dobras. 202 00:11:17,290 --> 00:11:21,770 >> Há um associativos à direita dobrar, o que é esta uma direita 203 00:11:21,770 --> 00:11:26,990 aqui-- 1 menos a quantidade, 2 menos a quantidade, 3 menos 0. 204 00:11:26,990 --> 00:11:29,170 E a sintaxe para uma vezes, você dá uma dobra 205 00:11:29,170 --> 00:11:34,680 um valor base e, em seguida, um operation-- Neste caso, a adição ou subtracção. 206 00:11:34,680 --> 00:11:36,280 Eu mostrei ambos os casos. 207 00:11:36,280 --> 00:11:41,760 E depois há um acumulador que acumula ao longo do toda a lista, 208 00:11:41,760 --> 00:11:46,330 aplicação que além de operador ou menos, e, em seguida, acumulando-lo. 209 00:11:46,330 --> 00:11:52,680 Portanto, este será as-- se ele foi chamado com R dobra mais de 0, começando com 0, 210 00:11:52,680 --> 00:11:54,720 teríamos então resumir tudo os números nessa lista. 211 00:11:54,720 --> 00:11:57,134 E isso é uma lista 1-3. 212 00:11:57,134 --> 00:12:00,050 CONNOR HARRIS: Então, dito de outra maneira, dobra r recebe três argumentos. 213 00:12:00,050 --> 00:12:02,540 Há uma função que em si leva dois argumentos, 214 00:12:02,540 --> 00:12:05,400 então há um valor de arranque, e há uma lista de valores. 215 00:12:05,400 --> 00:12:08,570 E o que você faz é tomar valor starter, primeiro valor, 216 00:12:08,570 --> 00:12:09,850 colocá-los para a função. 217 00:12:09,850 --> 00:12:11,607 O que você sair, tomar que, de alimentação que 218 00:12:11,607 --> 00:12:13,940 para a função do segundo valor, o que você sair, 219 00:12:13,940 --> 00:12:16,690 levar isso, alimente essa para o função do terceiro valor. 220 00:12:16,690 --> 00:12:18,740 E então, se você vai para baixo esta lista inteira desta forma, 221 00:12:18,740 --> 00:12:22,970 você está indo para obter, eventualmente, algum valor singular que é 222 00:12:22,970 --> 00:12:25,720 do mesmo tipo do que você começou com e do mesmo tipo 223 00:12:25,720 --> 00:12:29,147 como as coisas na lista e, em seguida que é o resultado de retorno de dobra R. 224 00:12:29,147 --> 00:12:31,980 STEPHEN Krewson: Então, em particular, estes são as funções de ordem superior, 225 00:12:31,980 --> 00:12:34,460 porque eles estão tomando outro função como um dos argumentos. 226 00:12:34,460 --> 00:12:34,770 >> CONNOR HARRIS: Yeah. 227 00:12:34,770 --> 00:12:37,820 Se você já usou alguns outros languages-- Sei R, [inaudível] 228 00:12:37,820 --> 00:12:41,510 língua tem isso, chamado Reduzir. 229 00:12:41,510 --> 00:12:45,460 Você pode ter funções semelhantes em outros idiomas, apenas chamado 230 00:12:45,460 --> 00:12:48,160 coisas diferentes. 231 00:12:48,160 --> 00:12:50,680 >> STEPHEN Krewson: E o que é agradável sobre dobra R 232 00:12:50,680 --> 00:12:53,880 neste caso é que dobra R pode trabalhar com listas infinitas. 233 00:12:53,880 --> 00:12:59,490 Portanto, neste fundo, este P5 está gerando as notas que 234 00:12:59,490 --> 00:13:03,120 são ativados no seqüenciador passo para alguma parte da bateria, a quinta parte da bateria, 235 00:13:03,120 --> 00:13:05,480 e talvez seja uma conga tambor ou algo assim. 236 00:13:05,480 --> 00:13:09,719 E este é um deliberadamente obtuso maneira de escrever isto, 237 00:13:09,719 --> 00:13:11,510 mas é divertido, porque ele demonstra uma grande quantidade 238 00:13:11,510 --> 00:13:14,460 de coisas sobre Haskell e Euterpea. 239 00:13:14,460 --> 00:13:20,650 >> Então dobra R deste cólon é colon-- apenas um operador que empurra as coisas 240 00:13:20,650 --> 00:13:25,700 juntos em um lista-- chamado em um vazio lista, que é apenas os colchetes vazios. 241 00:13:25,700 --> 00:13:28,250 E eu estou chamando que nesta lista infinita. 242 00:13:28,250 --> 00:13:31,570 Isto é, na verdade, duas listas somados até aqui. 243 00:13:31,570 --> 00:13:37,150 A lista uma vírgula 6 dot ponto é 1, 6, 11, 16. 244 00:13:37,150 --> 00:13:39,750 Assim Haskell-- em apenas alguns caracteres, 245 00:13:39,750 --> 00:13:42,420 pode gerar o inteiro sequência de números 246 00:13:42,420 --> 00:13:46,240 que são cinco números além esticando o infinito. 247 00:13:46,240 --> 00:13:49,860 E que a preceder este pequeno curto lista-- 248 00:13:49,860 --> 00:13:54,370 3, 8, 21-- apenas para mostrar-lhe como você pode concatenar listas. 249 00:13:54,370 --> 00:13:55,790 >> E então eu tenho dobrado sobre si mesmo. 250 00:13:55,790 --> 00:14:01,510 E isso acaba sendo apenas um tipo de operação de identidade, mas é infinito. 251 00:14:01,510 --> 00:14:06,070 E dobre R pode fazer isso, porque preguiçosamente avalia, como no exemplo acima. 252 00:14:06,070 --> 00:14:10,582 Se temos um 1 e um 2 e 3, podemos apenas entre parênteses fora todo o resto. 253 00:14:10,582 --> 00:14:12,290 Isso não vai funcionar para menos ou mais, mas 254 00:14:12,290 --> 00:14:17,760 irá trabalhar para isso cólon operação de identidade na lista. 255 00:14:17,760 --> 00:14:24,620 >> Então, como podemos usar praticamente que se nós tem um infinitamente longa lista de coisas? 256 00:14:24,620 --> 00:14:26,500 Bem, Haskell fornece um monte de funções no passado: 257 00:14:26,500 --> 00:14:29,450 e olhar mais para estas em seu próprio tempo-- como tomar 258 00:14:29,450 --> 00:14:32,200 que diz: OK, nós estamos gerar esta lista infinita, 259 00:14:32,200 --> 00:14:35,950 mas nós estamos apenas vai levar algum número de la E neste case-- 260 00:14:35,950 --> 00:14:38,410 vamos ver isso mais tarde em nossa code-- drum machine 261 00:14:38,410 --> 00:14:43,740 GM é apenas uma espécie de mundial variável para o número de passos 262 00:14:43,740 --> 00:14:44,610 no seqüenciador. 263 00:14:44,610 --> 00:14:47,630 Nas máquinas de rolo-in I mostrou você, que é tipicamente 16, 264 00:14:47,630 --> 00:14:51,475 mas eu não a aplicaram com 32. 265 00:14:51,475 --> 00:14:54,470 Realmente não importa. 266 00:14:54,470 --> 00:15:00,230 >> Haskell também é puro, por isso, tem forte tipagem estática que Connor aludido. 267 00:15:00,230 --> 00:15:03,220 Assim, são funções matemático no sense-- 268 00:15:03,220 --> 00:15:06,600 eles são mais matemática que está garantido 269 00:15:06,600 --> 00:15:11,530 para não acessar ou alterar qualquer tipo de variável ou executar entrada ou saída. 270 00:15:11,530 --> 00:15:14,420 Então se você tem uma função, é determinista. 271 00:15:14,420 --> 00:15:17,400 Ele sempre retornará o mesmo valor no estado do programa 272 00:15:17,400 --> 00:15:19,310 ou permanecer a mesma. 273 00:15:19,310 --> 00:15:22,940 Existem, naturalmente, excepções monádicos para isso, mas isso está além do nosso alcance. 274 00:15:22,940 --> 00:15:23,900 >> CONNOR HARRIS: Yeah. 275 00:15:23,900 --> 00:15:26,946 O que isto significa, no entanto, está lá são alguns importantes [inaudível] 276 00:15:26,946 --> 00:15:27,820 consequências desta. 277 00:15:27,820 --> 00:15:30,940 Uma delas é que é muito fácil de paralelizar programas Haskell. 278 00:15:30,940 --> 00:15:32,773 Porque se você tem, dizer, uma função de que 279 00:15:32,773 --> 00:15:36,064 necessita de operar sobre um milhão de valores, se você sabe que a função sempre 280 00:15:36,064 --> 00:15:39,280 dar o mesmo valor se você alimenta em um determinado value-- 281 00:15:39,280 --> 00:15:43,055 se você é [inaudível] f de 1, f de 2, depois de 3 ou f f de 1 whatnot-- 282 00:15:43,055 --> 00:15:45,180 não vai escrever para um arquivo ou fazer algo 283 00:15:45,180 --> 00:15:46,850 que irá alterar o valor de f2. 284 00:15:46,850 --> 00:15:50,220 Você pode simplesmente dividir essa função para uma milhões de máquinas diferentes, ou um milhão 285 00:15:50,220 --> 00:15:54,720 diferentes tópicos ou qualquer outra coisa, obter todas as respostas de volta, 286 00:15:54,720 --> 00:15:56,900 obter todos os valores de retorno para trás, e, em seguida, é isso. 287 00:15:56,900 --> 00:15:59,780 Então, muito fácil de paralelizar coisas. 288 00:15:59,780 --> 00:16:03,140 >> A desvantagem é que a entrada e saída especialmente 289 00:16:03,140 --> 00:16:05,720 se encaixar no sistema de tipos de formas muito complicadas. 290 00:16:05,720 --> 00:16:09,010 Nós não vamos entrar nisso agora, mas eu Encorajo-vos a olhar para alguns recursos 291 00:16:09,010 --> 00:16:11,175 online, se você quiser saber mais sobre isso. 292 00:16:11,175 --> 00:16:13,960 293 00:16:13,960 --> 00:16:16,550 >> STEPHEN Krewson: Então, e este tipo classes-- 294 00:16:16,550 --> 00:16:21,610 as classes de tipos foi-- foram inventados para resolver 295 00:16:21,610 --> 00:16:24,160 um problema de sobrecarga de operadores. 296 00:16:24,160 --> 00:16:27,590 Então, nós queríamos ter igualdade entre diferentes tipos de coisas. 297 00:16:27,590 --> 00:16:31,040 Claro, poderíamos pensar de-- igualdade entre tipos numéricos 298 00:16:31,040 --> 00:16:34,720 É muito fácil pensar, mas que sobre a igualdade entre listas? 299 00:16:34,720 --> 00:16:37,610 E sobre a igualdade entre árvore de estruturas de dados perna? 300 00:16:37,610 --> 00:16:43,130 E tudo isso é possível em Haskell porque de classes de tipo. 301 00:16:43,130 --> 00:16:48,000 >> Então, se você define uma certa type-- dados e aqui, estes são passos musicais. 302 00:16:48,000 --> 00:16:50,960 Nós estamos finalmente começando um pouco de música de computador. 303 00:16:50,960 --> 00:16:57,420 Portanto, temos C, C sharp, e assim por diante. 304 00:16:57,420 --> 00:17:01,080 Elas pertencem a um grupo de diferentes classes de tipo. 305 00:17:01,080 --> 00:17:03,510 EQ-- eles pertencem à classe tipo de EQ. 306 00:17:03,510 --> 00:17:06,780 Isso significa que eles suportam operações de igualdade. 307 00:17:06,780 --> 00:17:12,650 Assim, você pode avaliar se um sequência de primitivas musicais 308 00:17:12,650 --> 00:17:15,400 é o mesmo que um diferente. 309 00:17:15,400 --> 00:17:17,280 >> Eles pertencem à classe ordinal. 310 00:17:17,280 --> 00:17:19,479 Isso significa que há uma ordenação a estes. 311 00:17:19,479 --> 00:17:27,670 D vem depois de C. C sharp C vem depois, bem. 312 00:17:27,670 --> 00:17:29,840 Eles pertencem à classe mostrar, o que significa que eles podem 313 00:17:29,840 --> 00:17:33,000 ser impresso para um console ou terminal. 314 00:17:33,000 --> 00:17:36,090 Eles pertencem à classe enumerados, que 315 00:17:36,090 --> 00:17:39,770 significa que, embora estes são personagens, 316 00:17:39,770 --> 00:17:45,340 eles têm um numérica subjacente representação começando em 0 317 00:17:45,340 --> 00:17:48,960 e saindo através contudo muitas coisas estão aqui, 20 ou assim, 318 00:17:48,960 --> 00:17:51,770 ou 30 ou 40, talvez. 319 00:17:51,770 --> 00:17:54,259 >> CONNOR HARRIS: E quando nós temos um tipo de dados 320 00:17:54,259 --> 00:17:57,050 que derives-- com essa palavra-chave "deriving--" um certo tipo de classe, 321 00:17:57,050 --> 00:18:01,160 isso significa que o compilador tentará para construir algo automaticamente. 322 00:18:01,160 --> 00:18:05,120 Então, talvez você vai querer definir uma qualidade diferente. 323 00:18:05,120 --> 00:18:09,450 Você vai querer definir C sharp como sendo igual a D plana, por exemplo. 324 00:18:09,450 --> 00:18:11,560 Com esta construção aqui, eu não acho que C sharp 325 00:18:11,560 --> 00:18:14,940 e D plana irá ser igual, porque o compilador irá automaticamente 326 00:18:14,940 --> 00:18:19,670 dizer que cada valor diferente possível é distinto de todos os outros. 327 00:18:19,670 --> 00:18:22,930 >> Por isso, é possível substituir as implementações padrão 328 00:18:22,930 --> 00:18:25,730 destes tipos de classes. 329 00:18:25,730 --> 00:18:28,640 Mais uma vez, olhar para a referência se você quiser saber mais sobre isso. 330 00:18:28,640 --> 00:18:31,767 331 00:18:31,767 --> 00:18:33,600 STEPHEN Krewson: E aqui, na verdade, isso vai 332 00:18:33,600 --> 00:18:36,930 ser útil para quando nós código mais tarde. 333 00:18:36,930 --> 00:18:42,150 Vemos alguns dos operadores infixas para a composição seqüencial, 334 00:18:42,150 --> 00:18:46,570 composição paralela, e assim por diante, estes aspectos positivos e sinais de igual 335 00:18:46,570 --> 00:18:48,620 cercado por dois pontos. 336 00:18:48,620 --> 00:18:53,330 Isso significa que podemos jogar esses diferentes primitivas musicais um após o outro. 337 00:18:53,330 --> 00:18:54,590 Isso é composição seqüencial. 338 00:18:54,590 --> 00:18:57,170 >> Ou nós podemos reproduzi-los em paralelo ao mesmo tempo. 339 00:18:57,170 --> 00:19:05,100 Então eu posso ter um valor musical, e, em seguida, o que equivale a dois pontos e, 340 00:19:05,100 --> 00:19:09,669 infix operador composição paralela, e reproduzi-los como uma espécie de corda. 341 00:19:09,669 --> 00:19:11,460 E nós estamos indo para usar isso quando nós combinamos 342 00:19:11,460 --> 00:19:15,080 nossa parte da bateria com a nossa musiquinha Frere Jacques 343 00:19:15,080 --> 00:19:19,460 jogar estas duas sequências de valores musicais ao mesmo tempo. 344 00:19:19,460 --> 00:19:24,520 345 00:19:24,520 --> 00:19:29,250 >> Currying Curry é-- foi passado Nome do Haskell Curry, que 346 00:19:29,250 --> 00:19:31,850 a imagem Haskell é nomeado após. 347 00:19:31,850 --> 00:19:34,330 E isso nos permite uma agradável elegância quando estamos 348 00:19:34,330 --> 00:19:36,880 escrevendo todos esses diferentes funções ou filtros que estamos 349 00:19:36,880 --> 00:19:39,330 vai ser mapeamento sobre nossas listas. 350 00:19:39,330 --> 00:19:42,810 A função de dois arguments-- f de x e y-- 351 00:19:42,810 --> 00:19:46,630 pode ser representada como f de x para y aplicada. 352 00:19:46,630 --> 00:19:49,800 Portanto, é uma função de um argumento que retorna 353 00:19:49,800 --> 00:19:51,240 outra função de um argumento. 354 00:19:51,240 --> 00:19:56,962 Então, isso significa que podemos mapear uma f função de x lista de y acabou. 355 00:19:56,962 --> 00:19:58,920 CONNOR HARRIS: Quer dar um exemplo disto? 356 00:19:58,920 --> 00:19:59,836 STEPHEN Krewson: Yeah. 357 00:19:59,836 --> 00:20:05,390 Eu tenho um exemplo certo aqui de algumas das coisas que vamos escrever. 358 00:20:05,390 --> 00:20:10,500 Então replicar 2-- bem, replicar tomará 359 00:20:10,500 --> 00:20:13,040 um valor, que é quantas vezes para replicar algo, 360 00:20:13,040 --> 00:20:16,690 e então vai demorar um value-- geralmente uma lista ou algo assim. 361 00:20:16,690 --> 00:20:23,450 Então, aqui, estamos mapeamento replicar 2 sobre a outra lista. 362 00:20:23,450 --> 00:20:27,440 >> Então, se nós mapear replicar 2, se replicar aplicar 2 363 00:20:27,440 --> 00:20:31,890 para o primeiro elemento e desta lista-- estas são listas de phrases-- musical 364 00:20:31,890 --> 00:20:37,650 irá produzir dois de "você sleeping--" então você está dormindo, você está dormindo. 365 00:20:37,650 --> 00:20:40,040 Portanto, agora temos dois. 366 00:20:40,040 --> 00:20:42,570 Mas replicar leva dois argumentos, mas porque somos 367 00:20:42,570 --> 00:20:47,100 currying e, em seguida, mapeamento, podemos representar repetição 2 368 00:20:47,100 --> 00:20:52,310 como tendo sido devolvido como uma função de um argument-- apenas replicando duas vezes. 369 00:20:52,310 --> 00:20:57,010 E então estamos aplicando que a cada elemento desta lista de frases. 370 00:20:57,010 --> 00:21:01,900 >> E é uma concatenação Haskell operação para aplainar uma lista. 371 00:21:01,900 --> 00:21:04,400 Porque replicar 2 vontade produzir uma lista de listas. 372 00:21:04,400 --> 00:21:06,660 E este é essa forma intermediária aqui. 373 00:21:06,660 --> 00:21:10,365 E então podemos concat ou achatar que duas vezes. 374 00:21:10,365 --> 00:21:12,240 CONNOR HARRIS: A mais simples exemplo de currying, 375 00:21:12,240 --> 00:21:15,323 se você imaginar como-- f é apenas um função de multiplicação que leva dois 376 00:21:15,323 --> 00:21:16,840 argumentos e retorna seu produto. 377 00:21:16,840 --> 00:21:19,320 Então, se você tem uma f 4 5, é 20. 378 00:21:19,320 --> 00:21:22,670 Mas você pode pensar nisso como Também-- você tem uma função f 4 379 00:21:22,670 --> 00:21:25,560 que leva um argumento e retorna quatro vezes este argument-- apenas 380 00:21:25,560 --> 00:21:27,870 aplicação parcial que apenas um argumento 4. 381 00:21:27,870 --> 00:21:31,182 E se você alimentá-f de 4 5, que lhe dará 20. 382 00:21:31,182 --> 00:21:32,890 E isso é uma simples exemplo de currying. 383 00:21:32,890 --> 00:21:34,473 Geralmente é um dos livros didáticos. 384 00:21:34,473 --> 00:21:38,860 385 00:21:38,860 --> 00:21:42,110 >> STEPHEN Krewson: Lambda expressões ou funções anônimas 386 00:21:42,110 --> 00:21:47,330 são outra marca registrada Haskell. 387 00:21:47,330 --> 00:21:51,242 Então, se temos de preparar uma pouco replicar vida função, 388 00:21:51,242 --> 00:21:52,950 mas dizem que não é em a biblioteca padrão, 389 00:21:52,950 --> 00:21:56,150 podemos usar uma sintaxe semelhante à que se segue. 390 00:21:56,150 --> 00:21:58,730 E nós vamos brisa sobre isso. 391 00:21:58,730 --> 00:22:02,160 Uma coisa que você vai ver um monte de na drum machine é que estamos a fazer chamadas 392 00:22:02,160 --> 00:22:05,790 a algo chamado filtrar, que, como antes, 393 00:22:05,790 --> 00:22:08,185 é um mapeamento de uma função sobre uma lista, mas é 394 00:22:08,185 --> 00:22:10,260 um mapeamento de uma função booleana. 395 00:22:10,260 --> 00:22:13,390 >> Portanto, temos aqui um exemplo de um um anonimamente 396 00:22:13,390 --> 00:22:19,150 função booleana definida que leva apenas valores casal. 397 00:22:19,150 --> 00:22:22,990 Esta não é a rigor uma função anônima. 398 00:22:22,990 --> 00:22:25,850 Mas é definir com que a sintaxe para a brevidade, 399 00:22:25,850 --> 00:22:28,007 e isso só leva x módulo n-- 400 00:22:28,007 --> 00:22:28,840 CONNOR HARRIS: Yeah. 401 00:22:28,840 --> 00:22:31,330 Então F é uma função de dois argumentos n e p 402 00:22:31,330 --> 00:22:35,440 que retorna uma função que é própria uma função de um argumento, ou seja, x. 403 00:22:35,440 --> 00:22:38,815 404 00:22:38,815 --> 00:22:40,690 STEPHEN Krewson: I operadores infixas mencionados. 405 00:22:40,690 --> 00:22:42,642 Quais são os operadores infixas? 406 00:22:42,642 --> 00:22:45,710 Bem, os operadores estão a infixas forma normal que representam operações, 407 00:22:45,710 --> 00:22:49,910 dizer, em mathematics-- 2 mais 2, em vez de o operador mais 408 00:22:49,910 --> 00:22:51,202 e, em seguida, dois argumentos 2 e 2. 409 00:22:51,202 --> 00:22:53,701 CONNOR HARRIS: Chama- inverter notação polonês, que é 410 00:22:53,701 --> 00:22:55,330 um termo que eu duvido que qualquer um de vocês saberia. 411 00:22:55,330 --> 00:22:56,288 >> STEPHEN Krewson: Certo. 412 00:22:56,288 --> 00:22:58,290 Inverter notação polonês ou prefixo. 413 00:22:58,290 --> 00:23:01,412 Mas Haskell decidiu usar operadores infixas. 414 00:23:01,412 --> 00:23:03,120 Então, essas são algumas das os personalizados que 415 00:23:03,120 --> 00:23:07,770 são definidos para a Euterpea DSCL em Haskell. 416 00:23:07,770 --> 00:23:10,730 Portanto, esta foi a composição seqüencial. 417 00:23:10,730 --> 00:23:16,340 Esta foi a composição paralela, e este foi truncando composição paralela. 418 00:23:16,340 --> 00:23:18,710 E vamos precisar que com a nossa máquina de tambor, 419 00:23:18,710 --> 00:23:22,640 porque nós vamos usar o último operador em que há pouco tupla 420 00:23:22,640 --> 00:23:26,330 jogar a bateria eletrônica ao longo com a nossa música Frere Jacques. 421 00:23:26,330 --> 00:23:28,650 E a nossa máquina de tambor é vai ser infinito. 422 00:23:28,650 --> 00:23:30,920 Ele só toca para sempre. 423 00:23:30,920 --> 00:23:32,692 Mas a música Frere Jacques não é. 424 00:23:32,692 --> 00:23:33,510 Não é que muito tempo. 425 00:23:33,510 --> 00:23:36,610 É apenas alguns bares. 426 00:23:36,610 --> 00:23:43,030 Por isso, precisamos de parar a máquina de tambor como Assim que o valor musical menor vem 427 00:23:43,030 --> 00:23:43,700 ao fim. 428 00:23:43,700 --> 00:23:46,980 E esse operador infixada é super útil com isso. 429 00:23:46,980 --> 00:23:50,090 >> E notação infix como este é o tipo de Nice, 430 00:23:50,090 --> 00:23:57,095 porque dizer que você tem uma função como citações, o que dá a divisão inteira 431 00:23:57,095 --> 00:24:01,010 de x por algo else-- pesaroso, que deve ser um e b. 432 00:24:01,010 --> 00:24:04,740 Você pode escrevê-lo como um orçamento de b. 433 00:24:04,740 --> 00:24:09,670 Então, se você é elemento put-- outro exemplo disso. 434 00:24:09,670 --> 00:24:14,730 x elemento em alguma lista, se você colocar -lo em Backticks, você pode usá-lo. 435 00:24:14,730 --> 00:24:20,400 Mesmo que ele não é um símbolo como mais ou menos ou tempos, 436 00:24:20,400 --> 00:24:24,630 você pode usar o nome de uma função como que em Backticks 437 00:24:24,630 --> 00:24:27,045 como operador infixo, que é muito legal. 438 00:24:27,045 --> 00:24:29,670 CONNOR HARRIS: Mais uma vez, este é todo o açúcar apenas sintática, realmente. 439 00:24:29,670 --> 00:24:32,310 Ele não afecta o núcleo da linguagem. 440 00:24:32,310 --> 00:24:37,440 >> STEPHEN Krewson: Então nós vemos aqui para a última frase da nossa canção Frere Jacques, 441 00:24:37,440 --> 00:24:45,740 Joguei alguns acordes ou pequenos terços, usando a composição paralela 442 00:24:45,740 --> 00:24:46,240 operador. 443 00:24:46,240 --> 00:24:50,680 444 00:24:50,680 --> 00:24:54,950 Esta é outra maneira de dizer alguma do que temos vindo a dizer apenas. 445 00:24:54,950 --> 00:24:59,986 Então você pode mapear funções de uma discussão sobre listas. 446 00:24:59,986 --> 00:25:02,860 CONNOR HARRIS: Mais uma vez, as referências para manuais introdutórios Haskell-- 447 00:25:02,860 --> 00:25:04,680 terá tudo isso nele. 448 00:25:04,680 --> 00:25:07,790 >> STEPHEN Krewson: Então aqui está um bonito linha chave do seqüenciador passo a passo 449 00:25:07,790 --> 00:25:12,820 vamos dar uma olhada usando uma compreensão da lista. 450 00:25:12,820 --> 00:25:17,810 E vemos aqui é esse elemento na operadora fixa em citações para trás. 451 00:25:17,810 --> 00:25:23,030 Portanto, se X é um elemento de uma lista de X, então vamos chamar funções perc. 452 00:25:23,030 --> 00:25:25,100 Então perc é apenas uma função de percussão. 453 00:25:25,100 --> 00:25:30,200 Demora algum valor p que é parte do conjunto limitado de tudo 454 00:25:30,200 --> 00:25:35,310 os diferentes sons de percussão que vimos em um slide anterior, 455 00:25:35,310 --> 00:25:38,840 e, em seguida, ele dá que duração de uma semínima. 456 00:25:38,840 --> 00:25:43,190 Então ele lhe dá um qnr, e qnr é apenas um descanso nota de um quarto. 457 00:25:43,190 --> 00:25:44,970 >> Portanto, este é construir algo agradável. 458 00:25:44,970 --> 00:25:52,110 Temos uma lista de elementos, e nós vamos loop sobre alguma lista de um 459 00:25:52,110 --> 00:25:54,540 para o valor máximo de nosso seqüenciador passo a passo. 460 00:25:54,540 --> 00:25:58,290 E quando estamos em um i particular que lista de um para o valor máximo, 461 00:25:58,290 --> 00:26:02,970 se que i é um membro desta conjunto criado nesta função, 462 00:26:02,970 --> 00:26:06,040 bem, então podemos transformá-lo em uma nota percussão. 463 00:26:06,040 --> 00:26:10,960 Caso contrário, nós apenas jogar um descanso, que Quer dizer, nós simplesmente permanecer em silêncio. 464 00:26:10,960 --> 00:26:16,050 E podemos ver aqui que, em esta sintaxe compreensão da lista, 465 00:26:16,050 --> 00:26:20,030 x é preenchido por este lista construído um 466 00:26:20,030 --> 00:26:22,462 para o tamanho global do sequenciador. 467 00:26:22,462 --> 00:26:23,295 CONNOR HARRIS: Yeah. 468 00:26:23,295 --> 00:26:26,340 A sintaxe básica para compreensões lista é 469 00:26:26,340 --> 00:26:30,810 suporte, envolvendo valor algumas variáveis, bar, 470 00:26:30,810 --> 00:26:34,260 possíveis valores das variáveis eles próprios, o suporte fechados. 471 00:26:34,260 --> 00:26:38,545 E se você tiver feito definir notação construtor em qualquer tipo de aula de matemática, 472 00:26:38,545 --> 00:26:45,999 você pode ter configurado tal 2n em que n é ou em que n é z. 473 00:26:45,999 --> 00:26:48,290 Similar coisa-- esta notação pretende ser sugestivo 474 00:26:48,290 --> 00:26:49,630 de que notação matemática. 475 00:26:49,630 --> 00:26:51,880 STEPHEN Krewson: E você pode aplicar vários predicados 476 00:26:51,880 --> 00:26:56,250 e vários filtros em uma lista compreensão, que é bastante agradável. 477 00:26:56,250 --> 00:27:01,800 Algébrica types-- não vai demorar muito tempo aqui. 478 00:27:01,800 --> 00:27:04,840 Não é uma boa idéia em Haskell ou um bom, noção óbvia 479 00:27:04,840 --> 00:27:10,720 de como tirar, digamos, um padrão parâmetro para uma função ou algo assim. 480 00:27:10,720 --> 00:27:13,370 Em Python, isso é muito fácil. 481 00:27:13,370 --> 00:27:18,460 Você pode apenas dizer com igual em a declaração da função, 482 00:27:18,460 --> 00:27:21,420 um valor padrão em caso nada é fornecido. 483 00:27:21,420 --> 00:27:27,010 >> Em Haskell, você poderia talvez usar talvez o tipo talvez, 484 00:27:27,010 --> 00:27:32,190 que leva tanto nada ou um valor de apenas um tipo. 485 00:27:32,190 --> 00:27:38,630 Então, nós explorar esta na bateria eletrônica para nos permitir dar de volume opcional 486 00:27:38,630 --> 00:27:40,730 parâmetros para cada uma das partes de bateria. 487 00:27:40,730 --> 00:27:46,160 488 00:27:46,160 --> 00:27:54,680 Então isso nos dá uma maneira de ter EQ ou um volume de um canal em particular. 489 00:27:54,680 --> 00:27:56,440 >> Connor HARRIS: Em outros exemplos Haskell, 490 00:27:56,440 --> 00:28:00,450 você pode ver talvez usado para funções que podem falhar. 491 00:28:00,450 --> 00:28:03,470 Esta é uma pergunta comum. 492 00:28:03,470 --> 00:28:07,010 >> STEPHEN Krewson: E você pode fornecer algum tipo de mensagem de erro como um padrão. 493 00:28:07,010 --> 00:28:11,020 E isso é particularmente útil quando você está fazendo o I / O em Haskell. 494 00:28:11,020 --> 00:28:12,044 Isso pode ser truques. 495 00:28:12,044 --> 00:28:13,960 CONNOR HARRIS: Ou para um exemplo semelhante, pense 496 00:28:13,960 --> 00:28:17,460 de uma função que envolve divisão de um parâmetro que pode ser 0. 497 00:28:17,460 --> 00:28:20,020 E essa função poderia voltar talvez seja o que for. 498 00:28:20,020 --> 00:28:22,802 Então, se não há nenhuma divisão por 0, ele retornará apenas o que quer. 499 00:28:22,802 --> 00:28:25,010 E se há divisão por 0, ele irá retornar nada 500 00:28:25,010 --> 00:28:26,910 como uma forma de sinalização do erro. 501 00:28:26,910 --> 00:28:30,330 Porque uma das consequências da Muito estrita de tipos de Haskell 502 00:28:30,330 --> 00:28:34,100 é que não há nenhuma real-- excepções são difíceis, basicamente, 503 00:28:34,100 --> 00:28:36,160 manipulação de erro é estranho. 504 00:28:36,160 --> 00:28:39,440 E este é um muito forma comum de fazê-lo. 505 00:28:39,440 --> 00:28:42,990 >> STEPHEN Krewson: Então agora temos a outra coisa alucinante 506 00:28:42,990 --> 00:28:49,160 sobre Haskell, que é padrão definições de harmonização e função. 507 00:28:49,160 --> 00:28:53,390 Eu mostrei no último slide da declaração da sequência passo 508 00:28:53,390 --> 00:28:58,170 função, que teve um valor talvez, em seguida, um int, então uma lista de inteiros, 509 00:28:58,170 --> 00:29:03,850 em seguida, retorna uma seqüência de valores música não anotada 510 00:29:03,850 --> 00:29:05,375 tanto com tom e volume. 511 00:29:05,375 --> 00:29:08,030 512 00:29:08,030 --> 00:29:11,820 >> Então esses três argumentos podem ser padrão correspondente da seguinte maneira. 513 00:29:11,820 --> 00:29:16,660 E nós sempre queremos ter a certeza de fazer um caso base ou caso saia primeiro. 514 00:29:16,660 --> 00:29:19,690 E estes sublinhados pode apenas ser interpretada 515 00:29:19,690 --> 00:29:22,340 significa qualquer valor que está lá. 516 00:29:22,340 --> 00:29:26,580 Então, se nós receber uma chamada para a etapa sequência com algum valor, algum outro valor, 517 00:29:26,580 --> 00:29:32,210 e, em seguida, a lista vazia, o que queremos para voltar é apenas silêncio, um descanso 0. 518 00:29:32,210 --> 00:29:35,110 >> E em vez de que sendo uma lista vazia ou 0, 519 00:29:35,110 --> 00:29:38,150 é um descanso 0, porque somos lidar com o tipo de música, 520 00:29:38,150 --> 00:29:43,230 ea lista vazia da música tipo é apenas um resto de nenhuma duração. 521 00:29:43,230 --> 00:29:45,680 Não é nenhuma música. 522 00:29:45,680 --> 00:29:51,460 E, depois, ver se temos um passo sequenciar com um v para o argumento de volume, 523 00:29:51,460 --> 00:29:57,290 p para o instrumento precaução argumento, e, em seguida, uma lista de X. 524 00:29:57,290 --> 00:29:58,360 >> Em seguida, fazer algumas coisas. 525 00:29:58,360 --> 00:30:01,290 Em particular, nós aplicamos esta compreensão da lista, 526 00:30:01,290 --> 00:30:05,700 e nós executar alguns operações no valor talvez 527 00:30:05,700 --> 00:30:10,050 para transformá-lo em um valor numérico para que que poderia ser utilizado e, em seguida enumerados 528 00:30:10,050 --> 00:30:12,300 para seleccionar o instrumento. 529 00:30:12,300 --> 00:30:16,730 Novamente, isto é um pouco bit deliberadamente inconcise 530 00:30:16,730 --> 00:30:20,580 só para mostrar todas as coisas estranhas você pode fazer em Haskell como você 531 00:30:20,580 --> 00:30:23,170 dê uma olhada em seu próprio tempo. 532 00:30:23,170 --> 00:30:23,802 >> Tudo certo. 533 00:30:23,802 --> 00:30:26,010 Então, nós estamos finalmente começando a fazer o que nos propusemos a fazer, 534 00:30:26,010 --> 00:30:28,820 que é fazer um pouco de música de computador. 535 00:30:28,820 --> 00:30:32,250 Então, nós estamos indo para tentar fazer a música Frere Jacques. 536 00:30:32,250 --> 00:30:35,220 Portanto, há quantas frases em Frere Jacques? 537 00:30:35,220 --> 00:30:38,790 538 00:30:38,790 --> 00:30:39,680 Quatro. 539 00:30:39,680 --> 00:30:40,460 Ótimo. 540 00:30:40,460 --> 00:30:42,490 E o que é bom é que eles estão todos repetido 541 00:30:42,490 --> 00:30:46,990 a mesma quantidade de vezes, que é dois. 542 00:30:46,990 --> 00:30:50,730 >> Portanto, temos quatro frases cada repetido duas vezes. 543 00:30:50,730 --> 00:30:53,590 E, em particular, eles estão em uma rodada. 544 00:30:53,590 --> 00:30:55,340 E há muitos, muitas maneiras de implementar 545 00:30:55,340 --> 00:30:57,520 uma partida que poderia ser divertido de fazer. 546 00:30:57,520 --> 00:31:00,260 Já fiz isso em um bonito forma simples aqui, 547 00:31:00,260 --> 00:31:05,760 que é apenas para a linha construct-- função recebe uma lista de valores de música 548 00:31:05,760 --> 00:31:10,390 e transforma-lo em composição seqüencial através da aplicação desta composição seqüencial 549 00:31:10,390 --> 00:31:13,000 operador. 550 00:31:13,000 --> 00:31:19,540 >> E então eu atrasar as diferentes partes fazendo-os começar com um descanso. 551 00:31:19,540 --> 00:31:22,770 Então eu começar com um descanso de duas medidas, e, em seguida, um resto de quatro medidas, 552 00:31:22,770 --> 00:31:26,160 e, em seguida, um resto de seis medidas e, em seguida, a rodada 553 00:31:26,160 --> 00:31:32,290 funciona, como todos sabemos, esta canção. 554 00:31:32,290 --> 00:31:37,180 Vemos duas anotações ou modificações dos valores de música 555 00:31:37,180 --> 00:31:43,150 que estão contidas neste seqüencial arranjo de elementos de música. 556 00:31:43,150 --> 00:31:44,810 Nós temos um volume add. 557 00:31:44,810 --> 00:31:48,960 Esta é uma função para anotar música com um volume específico. 558 00:31:48,960 --> 00:31:51,320 Este é um bom exemplo de um sinal MIDI em execução 559 00:31:51,320 --> 00:31:57,510 de 0 a 127, os bits de sete informação que pode ser transportado. 560 00:31:57,510 --> 00:32:00,650 >> E entăo-- vimo-lo muito brevemente, mas o MIDI geral 561 00:32:00,650 --> 00:32:02,310 lista de todos os diferentes instrumentos. 562 00:32:02,310 --> 00:32:04,450 E não há um monte deles. 563 00:32:04,450 --> 00:32:11,230 Se você usar uma estação de trabalho de áudio digital, como o Pro Tools Ableton Live ou, 564 00:32:11,230 --> 00:32:17,560 há uma gama mais ampla incrivelmente de sintetizadores e instrumentos VST. 565 00:32:17,560 --> 00:32:21,510 Mas o padrão MIDI única tem alguns, ou vários dúzia. 566 00:32:21,510 --> 00:32:22,799 E alguns deles são engraçados. 567 00:32:22,799 --> 00:32:25,840 Eu pensei que seria divertido se nós jogamos o instrumento do instrumento MIDI 568 00:32:25,840 --> 00:32:30,550 helicóptero, e, em seguida, o próximo caminho através do round, 569 00:32:30,550 --> 00:32:37,980 fizemos um synth pad, e depois de essa liderança brega synth onda quadrada, 570 00:32:37,980 --> 00:32:44,240 e então a voz lodo, que são um pouco indistinta no meu mau MIDI 571 00:32:44,240 --> 00:32:46,410 sintetizador, mas OK. 572 00:32:46,410 --> 00:32:50,030 >> E então vemos isso let e na sintaxe de Haskell, 573 00:32:50,030 --> 00:32:54,030 e, em seguida, nós estamos jogando todas estas partes em conjunto 574 00:32:54,030 --> 00:32:56,265 com o operador de composição paralela. 575 00:32:56,265 --> 00:33:00,260 576 00:33:00,260 --> 00:33:02,296 E nós provavelmente poderia mostrar um pouco isso. 577 00:33:02,296 --> 00:33:07,674 578 00:33:07,674 --> 00:33:08,340 Aqui está o código. 579 00:33:08,340 --> 00:33:14,960 E você pode ver em C, que haveria uma monte de pigarro e definição 580 00:33:14,960 --> 00:33:19,760 o código de tabela antes de poderia fazer música como esta. 581 00:33:19,760 --> 00:33:22,080 Ou qualquer outra programação língua, você provavelmente 582 00:33:22,080 --> 00:33:27,210 tem que interagir com algum tipo de biblioteca ou API e configurar tudo, 583 00:33:27,210 --> 00:33:28,725 e então você tem que limpar. 584 00:33:28,725 --> 00:33:33,810 Mas aqui em Haskell é, penso eu, uma vez você pegar o jeito dele, incrivelmente 585 00:33:33,810 --> 00:33:35,770 legível e muito expressivo. 586 00:33:35,770 --> 00:33:38,930 587 00:33:38,930 --> 00:33:43,240 Portanto, há a implementação de Frere Jacques. 588 00:33:43,240 --> 00:33:43,740 Tudo certo. 589 00:33:43,740 --> 00:33:47,557 Agora queremos adicionar percussão, e isso é um pouco mais confusa pouco. 590 00:33:47,557 --> 00:33:49,015 Então, vamos dar uma olhada nos slides. 591 00:33:49,015 --> 00:33:56,880 592 00:33:56,880 --> 00:34:00,540 Assim, a grande idéia é fazer um monte de listas ou peças. 593 00:34:00,540 --> 00:34:04,140 Pelos máquinas roll-in, não eram tipicamente cerca de talvez oito 594 00:34:04,140 --> 00:34:08,670 10 de ritmo ou de percussão partes. 595 00:34:08,670 --> 00:34:10,159 E, em seguida, usar um monte de técnicas. 596 00:34:10,159 --> 00:34:14,889 E nós falamos sobre these-- usando pregas, filtros, funções lambda, 597 00:34:14,889 --> 00:34:19,429 mapeado sobre listas de gerar valores em algum intervalo de 1 a r, r é 16, 598 00:34:19,429 --> 00:34:20,699 ou 32 passos no seqüenciador. 599 00:34:20,699 --> 00:34:23,810 600 00:34:23,810 --> 00:34:29,920 >> E, em seguida, se houver um valor nessa lista como nós estamos correndo através do sequenciador, 601 00:34:29,920 --> 00:34:34,190 que passa por ele uma e mais, verifica-se nessa nota, 602 00:34:34,190 --> 00:34:36,060 e que a amostra é acionado. 603 00:34:36,060 --> 00:34:42,810 604 00:34:42,810 --> 00:34:47,110 Aqui estão todas as diferentes maneiras estranhas Eu vim com a gerar notas. 605 00:34:47,110 --> 00:34:48,940 Experimente-o em seu próprio soma semi. 606 00:34:48,940 --> 00:34:50,360 Vai soar legal. 607 00:34:50,360 --> 00:34:53,066 608 00:34:53,066 --> 00:34:54,690 Se o tempo permitir, vamos passar por isso. 609 00:34:54,690 --> 00:34:59,200 Mas, por agora, eu acho devemos demonstração que temos. 610 00:34:59,200 --> 00:35:01,380 Vamos esperar que isso vai OK. 611 00:35:01,380 --> 00:35:02,670 >> Portanto, este é GHCI. 612 00:35:02,670 --> 00:35:06,580 613 00:35:06,580 --> 00:35:09,121 E nós vamos carregar um arquivo Eu tenho chamado song.lhs, 614 00:35:09,121 --> 00:35:10,620 que é o arquivo que acabei de mostrar. 615 00:35:10,620 --> 00:35:11,470 OK ótimo. 616 00:35:11,470 --> 00:35:15,010 Como Connor disse anteriormente, compilado, tipo marcada, 617 00:35:15,010 --> 00:35:18,380 para que eu possa respirar muito mais fácil. 618 00:35:18,380 --> 00:35:20,010 Não vai explodir em mim. 619 00:35:20,010 --> 00:35:22,720 >> Eu queria mostrar-lhe algo útil. 620 00:35:22,720 --> 00:35:25,900 Você pode ver que um módulo carregado chamado 50. 621 00:35:25,900 --> 00:35:28,240 Você pode procurar esse módulo. 622 00:35:28,240 --> 00:35:32,092 E isto é tão bom sobre doing-- talvez o que 623 00:35:32,092 --> 00:35:34,550 você está fazendo em Haskell não é chamado de desenvolvimento de software, 624 00:35:34,550 --> 00:35:36,980 mas você pode fazer um monte de diversão no seu próprio país. 625 00:35:36,980 --> 00:35:42,410 E o fluxo de trabalho é realmente bom, como em comparação com um monte de outras línguas, 626 00:35:42,410 --> 00:35:45,872 porque você pode ver em um realmente forma legível o que está acontecendo. 627 00:35:45,872 --> 00:35:47,830 Assim, vemos que temos Todas essas frases, as quais 628 00:35:47,830 --> 00:35:53,760 são listas de arremessos de música, e então nós construir estes acima em algo maior, 629 00:35:53,760 --> 00:35:55,220 que é uma canção de música. 630 00:35:55,220 --> 00:35:58,450 É uma unidade musical. 631 00:35:58,450 --> 00:36:05,545 E então podemos jogar isso tudo com uma função chamada reprodução de música. 632 00:36:05,545 --> 00:36:09,040 Você pode ver que aqui em baixo. 633 00:36:09,040 --> 00:36:11,310 Que é apenas jogar. 634 00:36:11,310 --> 00:36:15,040 >> Eu deveria dizer-- eu não falar sobre este sinal de dólar que está em toda parte. 635 00:36:15,040 --> 00:36:17,980 Sinal de dólar é outro operador infixo. 636 00:36:17,980 --> 00:36:22,500 Mas tem o menor precedência de qualquer operador, o que efetivamente 637 00:36:22,500 --> 00:36:24,960 significa que tudo no à esquerda do sinal de dólar 638 00:36:24,960 --> 00:36:28,460 e à direita do sinal de dólar, nós estamos indo para obter avaliados antes dele. 639 00:36:28,460 --> 00:36:31,430 Portanto, é uma espécie de como outro maneira de adicionar parêntesis. 640 00:36:31,430 --> 00:36:33,980 641 00:36:33,980 --> 00:36:36,220 >> CONNOR HARRIS: É basicamente composição de função. 642 00:36:36,220 --> 00:36:40,026 E garante que você não se have-- você tem funções de cada lado ou infix 643 00:36:40,026 --> 00:36:42,900 operadores de ambos os lados, eles não vão associar através dele e dar-lhe 644 00:36:42,900 --> 00:36:46,030 resultados inesperados. 645 00:36:46,030 --> 00:36:49,790 >> STEPHEN Krewson: Então nós can-- usando esse, podemos chamar. 646 00:36:49,790 --> 00:36:51,415 Primeiro, vamos jogá-lo sem a bateria. 647 00:36:51,415 --> 00:37:00,330 648 00:37:00,330 --> 00:37:03,170 Esse é o helicóptero, o helicóptero MIDI. 649 00:37:03,170 --> 00:37:05,495 >> [Música tocando] 650 00:37:05,495 --> 00:37:08,525 651 00:37:08,525 --> 00:37:09,525 Há a onda quadrada. 652 00:37:09,525 --> 00:37:24,520 653 00:37:24,520 --> 00:37:25,490 O lodo de voz. 654 00:37:25,490 --> 00:37:27,630 E você pode realmente ir selvagens com este. 655 00:37:27,630 --> 00:37:30,872 Eu escolhi um bem simples, porque eu sabia que não deveria morder 656 00:37:30,872 --> 00:37:31,830 mais do que podia mastigar. 657 00:37:31,830 --> 00:37:36,460 Basta mantê-lo muito simples para mostrar as idéias principais. 658 00:37:36,460 --> 00:37:39,952 Mas, então, eu era como, nós temos tem que adicionar alguns tambores para isso. 659 00:37:39,952 --> 00:37:41,910 Só porque este é um pouco impenetrável, 660 00:37:41,910 --> 00:37:45,790 e eu não utilizar o NOME DO partes de bateria, 661 00:37:45,790 --> 00:37:49,490 Eu mapeados eles-- porque eles são parte dessa classe enumerado, 662 00:37:49,490 --> 00:37:51,500 I mapeado-los para ints. 663 00:37:51,500 --> 00:37:53,120 Uma delas é como um tambor. 664 00:37:53,120 --> 00:37:54,370 Zero é assim. 665 00:37:54,370 --> 00:37:56,000 Sete é um chapéu alto. 666 00:37:56,000 --> 00:38:00,920 E para baixo aqui onde o funções de ficar um pouco mais aleatório, 667 00:38:00,920 --> 00:38:02,100 estes são como atabaques. 668 00:38:02,100 --> 00:38:08,360 >> Então, se você acha que talvez um about-- divertida maneira de implementar uma bateria eletrônica 669 00:38:08,360 --> 00:38:12,830 é usar muito ordenada padrões em seu bumbo. 670 00:38:12,830 --> 00:38:17,640 Assim, por exemplo, por filtração através da lista com tudo o que lhe dá de volta 671 00:38:17,640 --> 00:38:20,590 a 1 quando ele é tomado módulo 04. 672 00:38:20,590 --> 00:38:27,190 Então eu fico 1, 5, 9, 13, de modo que este 17-- é o primeiro tempo de cada compasso. 673 00:38:27,190 --> 00:38:32,860 >> E então este é o mesmo coisa mudou ao longo de dois passos. 674 00:38:32,860 --> 00:38:33,850 Então esse é o pouco frequente. 675 00:38:33,850 --> 00:38:37,480 Portanto, este seria algo como um chapéu alto. 676 00:38:37,480 --> 00:38:39,640 E então, novamente, aqui em baixo, é um pouco aleatório, 677 00:38:39,640 --> 00:38:41,080 porque nós estamos fazendo atabaques. 678 00:38:41,080 --> 00:38:44,180 E eu tenho algumas maracas para baixo também. 679 00:38:44,180 --> 00:38:50,280 >> Então, eu poderia chamar drum machine jogo, mas seria ir para sempre, 680 00:38:50,280 --> 00:38:53,700 e que poderia começar a agarrar-se toda a memória no meu sistema. 681 00:38:53,700 --> 00:38:57,090 Então, eu vou chamar essa função tocar música, que, como veremos, 682 00:38:57,090 --> 00:39:02,020 usar a composição paralela truncando para jogar a nossa pequena canção Frere Jacques 683 00:39:02,020 --> 00:39:04,200 juntamente com esta máquina tambor estranho. 684 00:39:04,200 --> 00:39:06,190 Então, vamos dar uma olhada. 685 00:39:06,190 --> 00:39:10,920 E por favor não melhorar no meu arranjo de todas as partes de bateria. 686 00:39:10,920 --> 00:39:13,375 Não a minha especialidade, mas eu tinha um monte de divertimento fazê-lo. 687 00:39:13,375 --> 00:39:17,678 688 00:39:17,678 --> 00:39:20,654 >> [Música tocando] 689 00:39:20,654 --> 00:39:52,260 690 00:39:52,260 --> 00:39:56,980 >> Então, é claro, isso é tudo um pouco não tão divertido 691 00:39:56,980 --> 00:40:01,100 se não podemos convertê-lo a uma pontuação talvez por isso, 692 00:40:01,100 --> 00:40:04,650 Pode ser interpretada por um performer humano. 693 00:40:04,650 --> 00:40:06,535 Então eu não vou executá-lo aqui. 694 00:40:06,535 --> 00:40:07,910 Eu já gerou os arquivos. 695 00:40:07,910 --> 00:40:10,280 Você pode ver que há uma dot LilyPond file-- e este 696 00:40:10,280 --> 00:40:14,500 será o meu segue até Connor-- e um arquivo ponto MIDI, 697 00:40:14,500 --> 00:40:18,610 e um ficheiro PDF ponto, que é o que LilyPond que acabará por gerar. 698 00:40:18,610 --> 00:40:23,770 >> Mas estes são os scripts, e eu vou apenas executá-los com as suas opções de ajuda. 699 00:40:23,770 --> 00:40:28,090 Se você obtém esses instalado e funcionando com Euterpea, você pode gerar um arquivo MIDI. 700 00:40:28,090 --> 00:40:31,160 E, em seguida, a partir do arquivo MIDI com este programa MIDI 2LY, 701 00:40:31,160 --> 00:40:34,930 você pode gerar um lírio Arquivo Pond, e então você 702 00:40:34,930 --> 00:40:37,974 pode gerar um PDF da partitura. 703 00:40:37,974 --> 00:40:39,390 E devemos dar uma olhada nisso. 704 00:40:39,390 --> 00:40:52,599 705 00:40:52,599 --> 00:40:55,140 Então Connor provavelmente mostrar como para anotar isso melhor, 706 00:40:55,140 --> 00:41:02,570 mas este é Frere Jacques como gerado por mim em Euterpea. 707 00:41:02,570 --> 00:41:07,300 É apenas em C. Eu deveria ter figurado o que a cortá-lo, na verdade, no. 708 00:41:07,300 --> 00:41:11,090 Mas isso é o gasoduto para como você fazer isso com isso. 709 00:41:11,090 --> 00:41:12,950 Vamos falar mais sobre LilyPond. 710 00:41:12,950 --> 00:41:15,780 >> CONNOR HARRIS: OK Vamos ver. 711 00:41:15,780 --> 00:41:19,480 712 00:41:19,480 --> 00:41:21,419 Você mencionou Saiba Você Haskell? 713 00:41:21,419 --> 00:41:22,460 STEPHEN Krewson: Oh yeah. 714 00:41:22,460 --> 00:41:23,480 Confira Saiba Você Haskell. 715 00:41:23,480 --> 00:41:24,410 É nos recursos. 716 00:41:24,410 --> 00:41:26,830 É assim que eu comecei aprendizagem, e isso é ótimo. 717 00:41:26,830 --> 00:41:27,580 Aprendizagem não mudo. 718 00:41:27,580 --> 00:41:28,829 >> CONNOR HARRIS: Então é online. 719 00:41:28,829 --> 00:41:34,760 Então, um cara chamado [inaudível] learnyouahaskell.com, sem espaços. 720 00:41:34,760 --> 00:41:37,065 A gramática é doente. 721 00:41:37,065 --> 00:41:38,690 STEPHEN Krewson: É ilustrado, também. 722 00:41:38,690 --> 00:41:39,440 CONNOR HARRIS: Então, qual é LilyPond? 723 00:41:39,440 --> 00:41:42,480 É uma programação declarativa idioma para diagramação música. 724 00:41:42,480 --> 00:41:45,480 Então você pode declarative-- pensar em coisas como HTML, 725 00:41:45,480 --> 00:41:50,900 onde você não está dizendo-- HTML não diz como navegadores da Web devem 726 00:41:50,900 --> 00:41:52,180 processar páginas passo a passo. 727 00:41:52,180 --> 00:41:54,096 É só dizer isto é uma descrição textual 728 00:41:54,096 --> 00:41:56,100 do que você deseja que a página para olhar como. 729 00:41:56,100 --> 00:41:59,310 >> E então é também um programa de que compila essa linguagem, 730 00:41:59,310 --> 00:42:02,300 ou ler o seu e, em seguida, na verdade, faz a diagramação para você, 731 00:42:02,300 --> 00:42:05,570 e ele cospe estes maravilhosas partituras em PDF procura. 732 00:42:05,570 --> 00:42:08,250 Você também pode obter formato PNG ou o que quer. 733 00:42:08,250 --> 00:42:10,300 Uma boa maneira de pensar isto é, por analogia 734 00:42:10,300 --> 00:42:16,620 LaTeX é que é uma espécie de LillyPond, mas por apenas typesetting comum. 735 00:42:16,620 --> 00:42:20,360 Então, ao invés de-- não é WYSIWYG, o que você vê 736 00:42:20,360 --> 00:42:22,960 É o que você, como, digamos Finale é, ou Sibelius, 737 00:42:22,960 --> 00:42:27,430 ou Microsoft Word, onde você pode digitar tempo real e projectos de coisas em tempo real 738 00:42:27,430 --> 00:42:31,340 e ver as mudanças instantaneamente. 739 00:42:31,340 --> 00:42:32,140 >> Ele é baseado em texto. 740 00:42:32,140 --> 00:42:35,290 Você tem que compilar o seu escores usando um programa separado 741 00:42:35,290 --> 00:42:37,090 e sair PDFs mais tarde. 742 00:42:37,090 --> 00:42:43,320 Isto é um pouco menos conveniente para o uso se você estiver 743 00:42:43,320 --> 00:42:46,520 tentando escrever diretamente em uma pontuação e você está 744 00:42:46,520 --> 00:42:48,620 tentar compor no computador. 745 00:42:48,620 --> 00:42:50,830 Mas há uma série de vantagens para ele. 746 00:42:50,830 --> 00:42:56,110 Um deles, que se parece muito mais agradável, porque pode realmente LillyPond 747 00:42:56,110 --> 00:42:58,210 tomar o tempo para fazê- decisões de layout propriamente, 748 00:42:58,210 --> 00:43:02,380 ao contrário de Sibelius ou Finale, que têm para fazer algoritmos tão comprometidos 749 00:43:02,380 --> 00:43:05,020 que eles podem exibir as coisas em tempo real. 750 00:43:05,020 --> 00:43:07,660 >> Então, por que é LilyPond-- computação gráfica é difícil. 751 00:43:07,660 --> 00:43:10,535 Se você estiver fazendo qualquer coisa com música e você quer escrever partituras, 752 00:43:10,535 --> 00:43:13,900 você não quer escrever fora tudo sozinho 753 00:43:13,900 --> 00:43:19,040 começando com como desenhar equipes de funcionários e como desenhar notepads. 754 00:43:19,040 --> 00:43:21,020 É muito difícil. Isso já foi feito antes. 755 00:43:21,020 --> 00:43:22,170 Você está bem. 756 00:43:22,170 --> 00:43:26,200 >> Se você quiser usar Finale ou Sibelius, os formatos de arquivo para essas coisas 757 00:43:26,200 --> 00:43:30,180 são muito complicado, e você não pode realmente usá-los de forma programática. 758 00:43:30,180 --> 00:43:35,020 Você pode abrir Sibelius com Finale e vá em File, Export as PDF mesmo, 759 00:43:35,020 --> 00:43:37,600 mas você não pode realmente chamar isso de um script. 760 00:43:37,600 --> 00:43:40,440 LillyPond, você pode chamar a partir desses scripts. 761 00:43:40,440 --> 00:43:44,397 Você poderia facilmente fazer uma iteração LillyPond com LaTeX. 762 00:43:44,397 --> 00:43:47,230 Eu não vou ter muito tempo para ir para essas tecnologias de agora, 763 00:43:47,230 --> 00:43:48,321 mas eles existem. 764 00:43:48,321 --> 00:43:50,070 Se você quer olhar em um livro LillyPond, 765 00:43:50,070 --> 00:43:53,760 é um programa que vem com sua distribuição LillyPond, 766 00:43:53,760 --> 00:43:57,030 e é para a iteração Fragmentos LillyPond em LaTeX 767 00:43:57,030 --> 00:44:00,340 se você quiser fazer alguma coisa como um documento de grande musicologia 768 00:44:00,340 --> 00:44:02,289 com exemplos, por exemplo. 769 00:44:02,289 --> 00:44:04,580 E é uma boa habilidade para vida se você está fazendo nada 770 00:44:04,580 --> 00:44:05,770 com música, não apenas CS50. 771 00:44:05,770 --> 00:44:09,320 Eu usei LillyPond para todos dos meus projetos de composição 772 00:44:09,320 --> 00:44:11,880 desde que eu era basicamente um sénior na escola. 773 00:44:11,880 --> 00:44:13,455 >> Então, aqui estão alguns exemplos simples. 774 00:44:13,455 --> 00:44:17,490 775 00:44:17,490 --> 00:44:21,060 Este é basicamente representante do nível de dificuldade 776 00:44:21,060 --> 00:44:23,481 que a maioria das pessoas enfrentá-lo que eles estavam tentando 777 00:44:23,481 --> 00:44:24,980 usar LilyPond para projetos simples. 778 00:44:24,980 --> 00:44:29,519 Este primeiro é o início a um prelúdio coral de Bach. 779 00:44:29,519 --> 00:44:31,810 Este fundo é um excerto de uma de minhas próprias obras, 780 00:44:31,810 --> 00:44:34,650 e é só lá para mostrar lhe coisas como [inaudível] 781 00:44:34,650 --> 00:44:38,550 colocando várias linhas na mesma equipe, como lyric undersetting funciona. 782 00:44:38,550 --> 00:44:41,350 783 00:44:41,350 --> 00:44:46,110 Underlays líricos são uma coisa que é muito fácil de usar para LilyPond música coral. 784 00:44:46,110 --> 00:44:48,814 >> E então há um pouco mais exemplos complicadas aqui. 785 00:44:48,814 --> 00:44:50,980 Todos estes são feitos em LilyPond e eles são viáveis. 786 00:44:50,980 --> 00:44:55,280 Este primeiro trecho é de [Inaudível] por [inaudível]. 787 00:44:55,280 --> 00:44:58,860 E isso [inaudível] de uma peça para baixo a solo 788 00:44:58,860 --> 00:45:03,550 flauta por [inaudível], que é um longtime-- que 789 00:45:03,550 --> 00:45:07,101 era um membro de longa data do departamento de música aqui, eu acho. 790 00:45:07,101 --> 00:45:08,600 Eu não tenho certeza para onde ele foi para fora. 791 00:45:08,600 --> 00:45:12,410 Mas ele era o conselheiro do Harvard Associação compositores por um longo tempo. 792 00:45:12,410 --> 00:45:13,530 Homem maravilhoso. 793 00:45:13,530 --> 00:45:16,920 E ele escreve uma música que tem muito notação complicado que LillyPond 794 00:45:16,920 --> 00:45:20,500 pode, no entanto, lidar muito bem. 795 00:45:20,500 --> 00:45:26,030 >> Então, só para lhe dar uma noção do que capacidades desta coisa tão é-- 796 00:45:26,030 --> 00:45:28,960 os internos do LillyPond são muito complicadas. 797 00:45:28,960 --> 00:45:31,060 E você pode usá-lo para um longo período de tempo, incluindo 798 00:45:31,060 --> 00:45:32,520 para alguns bastante complicado coisas, sem realmente 799 00:45:32,520 --> 00:45:34,060 ter que saber muito sobre eles. 800 00:45:34,060 --> 00:45:38,720 Mas a ideia básica é que na nível mais baixo, os átomos de LillyPonds 801 00:45:38,720 --> 00:45:39,970 são as notas. 802 00:45:39,970 --> 00:45:42,761 As notas contêm uma Contexto da chamada vozes. 803 00:45:42,761 --> 00:45:44,510 Assim, o contexto de voz basicamente corresponde 804 00:45:44,510 --> 00:45:47,410 a uma única linha de polifonia. 805 00:45:47,410 --> 00:45:49,410 E, em seguida, pode ser contexto continham hierarquicamente 806 00:45:49,410 --> 00:45:53,590 em os de nível superior que representam equipes na pontuação 807 00:45:53,590 --> 00:45:56,750 ou agrupamentos maiores, como equipes de piano ou equipes coro, 808 00:45:56,750 --> 00:45:58,990 e depois, eventualmente, contextos de pontuação inteiras. 809 00:45:58,990 --> 00:46:02,260 E você pode realmente abranger várias dezenas em um livro. 810 00:46:02,260 --> 00:46:05,770 >> E cada contexto tem um número de gravadores conectados. 811 00:46:05,770 --> 00:46:08,340 Se você olhar através da conteúdo de um contexto 812 00:46:08,340 --> 00:46:14,410 e imprimir um certo símbolo ou um certa classe de símbolos como necessário. 813 00:46:14,410 --> 00:46:17,840 Então, para todos os contextos de voz, há [inaudível] notas 814 00:46:17,840 --> 00:46:24,270 gravador que é basicamente uma função ou um objeto que escreve para fora toda a nota 815 00:46:24,270 --> 00:46:26,290 cabeças sobre as peças certas de uma página. 816 00:46:26,290 --> 00:46:29,510 Então há um gravador fenda, que escreve fissuras na pauta. 817 00:46:29,510 --> 00:46:31,517 Depois, há um metrônomo marca de gravador que 818 00:46:31,517 --> 00:46:33,100 escreve marcas metrônomo em uma pontuação. 819 00:46:33,100 --> 00:46:36,410 E todos eles se encaixam bastante bem dentro da hierarquia. 820 00:46:36,410 --> 00:46:39,500 E é muito, muito, muito customizável, o que você precisa 821 00:46:39,500 --> 00:46:42,880 se você quiser fazer as coisas assim. 822 00:46:42,880 --> 00:46:45,730 >> Assim, todos os contextos têm um monte de diferentes atributos 823 00:46:45,730 --> 00:46:52,410 que você pode modificar para tudo do espaçamento para várias opções de fonte 824 00:46:52,410 --> 00:46:54,942 seleção de tamanhos de coisas. 825 00:46:54,942 --> 00:46:56,900 Se você quiser fazer ainda as coisas mais complicadas, 826 00:46:56,900 --> 00:46:59,210 há uma linguagem de script embutido. 827 00:46:59,210 --> 00:47:01,820 Eles usam esquema, que é dialeto do LISP. 828 00:47:01,820 --> 00:47:04,960 Estes provavelmente não fazer significa nada para você. 829 00:47:04,960 --> 00:47:06,900 Mas, basicamente, um esquema de outro funcional 830 00:47:06,900 --> 00:47:09,500 linguagem de programação, mais ou menos. 831 00:47:09,500 --> 00:47:10,800 >> STEPHEN Krewson: O tie-in. 832 00:47:10,800 --> 00:47:12,690 >> CONNOR HARRIS: Yeah. 833 00:47:12,690 --> 00:47:15,390 É um bom tie-in, eu suponho. 834 00:47:15,390 --> 00:47:20,150 E ele é usado como língua de ensino, na verdade, para baixo Mass Ave. No MIT. 835 00:47:20,150 --> 00:47:26,590 E é muito útil para LillyPond por várias razões técnicas. 836 00:47:26,590 --> 00:47:30,317 >> E por isso, se você quiser fazer simples tweaks dependentes condicionais, 837 00:47:30,317 --> 00:47:32,900 para example-- há certa condição de uma pontuação que conheceu, 838 00:47:32,900 --> 00:47:36,495 fazer alterações ao layout ou então whatnot-- 839 00:47:36,495 --> 00:47:37,620 as instalações estão lá. 840 00:47:37,620 --> 00:47:38,667 Eles são complicados. 841 00:47:38,667 --> 00:47:40,250 Então aqui está um exemplo de código bem simples. 842 00:47:40,250 --> 00:47:43,810 É cinco linhas. 843 00:47:43,810 --> 00:47:46,120 Basicamente, eu estou definindo duas equipes. 844 00:47:46,120 --> 00:47:46,904 É em 3/4. 845 00:47:46,904 --> 00:47:48,695 A primeira equipe tem um anexado marca de tempo, 846 00:47:48,695 --> 00:47:51,110 mas que está realmente acontecendo para ir para toda a partitura, 847 00:47:51,110 --> 00:47:54,960 porque marcas de andamento estão no nível pontuação. 848 00:47:54,960 --> 00:47:59,044 O gravador marca metrônomo está ligado a marcar contexto. 849 00:47:59,044 --> 00:48:01,460 Há chaves diferentes, porque o [inaudível] gravador 850 00:48:01,460 --> 00:48:02,710 está ligado as equipes. 851 00:48:02,710 --> 00:48:04,441 Você pode realmente fazer é. 852 00:48:04,441 --> 00:48:06,190 A amostra que eu escrevi é na verdade, em C major, 853 00:48:06,190 --> 00:48:07,990 mas é apenas a demonstrar que você pode ter 854 00:48:07,990 --> 00:48:09,570 chaves diferentes em diferentes equipes. 855 00:48:09,570 --> 00:48:15,710 E a sintaxe básica é que você escreve Observe nomes com E, F, G, qualquer que seja. 856 00:48:15,710 --> 00:48:18,910 Se você quer fazer acidentes, você sufixo é ou ES. 857 00:48:18,910 --> 00:48:22,640 Este é de Holandês convenções musicologia. 858 00:48:22,640 --> 00:48:28,290 >> E para fazer saltos de oitava, você tem que usar estas marcas de escala, vírgula ou apóstrofo. 859 00:48:28,290 --> 00:48:30,580 A relativa significa apenas o que você tem uma nota, 860 00:48:30,580 --> 00:48:34,080 ele será automaticamente plaec no oitava mais próximo da anterior. 861 00:48:34,080 --> 00:48:37,624 E se você quiser saltar mais do que um fifth-- dizer um quinto ou more-- 862 00:48:37,624 --> 00:48:39,165 então você tem que usar o [inaudível]. 863 00:48:39,165 --> 00:48:42,580 Mas caso contrário, você não tem que especificar a oitava de cada nota. 864 00:48:42,580 --> 00:48:46,130 >> E relativa C, prima, e C, você apenas especificar meio C 865 00:48:46,130 --> 00:48:48,630 e base de C, especialmente primeiras notas. 866 00:48:48,630 --> 00:48:55,020 Então você tem essas equipes que organizam estas duas vozes ou amostras de música, 867 00:48:55,020 --> 00:48:56,730 e você tem uma pontuação. 868 00:48:56,730 --> 00:48:58,440 E que se parece com isso. 869 00:48:58,440 --> 00:49:01,780 870 00:49:01,780 --> 00:49:05,380 >> Se você quiser ter o tempo para copiar esse exemplo de LillyPond 871 00:49:05,380 --> 00:49:07,530 no código anterior deslize para baixo aqui, e você 872 00:49:07,530 --> 00:49:09,030 pode escrever para LillyPond-se. 873 00:49:09,030 --> 00:49:11,280 Eu sei que tenho algo que se parece muito com isso. 874 00:49:11,280 --> 00:49:17,236 875 00:49:17,236 --> 00:49:19,610 Portanto, há uma outra tecnologia XML chamado Música mantida 876 00:49:19,610 --> 00:49:22,030 por pessoas completamente diferentes. 877 00:49:22,030 --> 00:49:28,150 XML é um conjunto de dados textuais structure-- I não deveria dizer dados structure-- dizer 878 00:49:28,150 --> 00:49:29,580 mapa metáfora mais ou menos. 879 00:49:29,580 --> 00:49:33,800 E é projetado para segurar dados hierárquicos muito bem. 880 00:49:33,800 --> 00:49:37,050 HTML, por exemplo, é um tipo de XML. 881 00:49:37,050 --> 00:49:41,090 E você pode dizer XML porque eles tinha todos os sinais de menor e ângulo 882 00:49:41,090 --> 00:49:44,700 marcas de suporte de barra que os campos com os dados. 883 00:49:44,700 --> 00:49:47,390 >> Eu não tenho um código exemplo de XML Music. 884 00:49:47,390 --> 00:49:50,450 Você pode encontrá-lo você mesmo. 885 00:49:50,450 --> 00:49:53,735 Basicamente, a razão pela qual você pode querer usar XML como o estágio intermediário 886 00:49:53,735 --> 00:49:55,980 é, antes de mais nada, é um formato de intercâmbio 887 00:49:55,980 --> 00:50:02,301 para basicamente every-- eu não deveria dizer todos, mas um monte de pontuação diferente 888 00:50:02,301 --> 00:50:02,800 escritoras. 889 00:50:02,800 --> 00:50:04,966 Então, se você escrever em Música XML, não só pode LillyPond 890 00:50:04,966 --> 00:50:08,080 lê-lo com a ajuda deste auxilary programa chamado XML Música para LY, 891 00:50:08,080 --> 00:50:11,360 mas também pode ler Finale ele, Sibelius pode lê-lo. 892 00:50:11,360 --> 00:50:14,770 Dependendo de como o objeto interno hierarquia trabalha para representar música, 893 00:50:14,770 --> 00:50:18,820 pode ser mais fácil para escrever Música para XML do que LillyPond 894 00:50:18,820 --> 00:50:22,410 e confiar apenas em XML Música LY para fazer a conversão. 895 00:50:22,410 --> 00:50:24,282 >> Eu não acho que [inaudível] tem XML Music. 896 00:50:24,282 --> 00:50:25,490 STEPHEN Krewson: Não faz. 897 00:50:25,490 --> 00:50:26,340 Alguém está trabalhando nele, no entanto. 898 00:50:26,340 --> 00:50:27,090 >> CONNOR HARRIS: OK. 899 00:50:27,090 --> 00:50:31,040 Não Euterpea não tem um Função de saída XML da música no entanto. 900 00:50:31,040 --> 00:50:35,340 Se você quer ter uma idéia final do projeto, talvez entrar em contato com caras 901 00:50:35,340 --> 00:50:38,620 que Stephen sabe, e eles poderiam usar sua ajuda. 902 00:50:38,620 --> 00:50:40,992 >> STEPHEN Krewson: Eu adoraria isso. 903 00:50:40,992 --> 00:50:43,450 CONNOR HARRIS: Também, basicamente, cada linguagens de programação 904 00:50:43,450 --> 00:50:46,610 que vale o seu sal já tem uma biblioteca XML, 905 00:50:46,610 --> 00:50:51,030 assim você pode converter todo internamente de suas músicas em algum objeto 906 00:50:51,030 --> 00:50:54,120 que a biblioteca XML pode escrever que exigiria menos 907 00:50:54,120 --> 00:50:57,470 alterações à sua estrutura interna por qualquer música objetos você 908 00:50:57,470 --> 00:51:00,310 quero escrever do que escrevê-lo diretamente no LillyPond faria. 909 00:51:00,310 --> 00:51:04,380 Em seguida, basta imprimi-lo com XML com as bibliotecas XML em seu idioma, 910 00:51:04,380 --> 00:51:07,260 que vai garantir que ele é sintaticamente correto e tudo mais, 911 00:51:07,260 --> 00:51:08,720 e, em seguida, convertê-lo para LillyPond. 912 00:51:08,720 --> 00:51:11,060 Assim, a tecnologia que você pode querer olhar em se você está fazendo algo 913 00:51:11,060 --> 00:51:11,650 como isso. 914 00:51:11,650 --> 00:51:14,490 915 00:51:14,490 --> 00:51:16,370 >> [Inaudível], outro tecnologia auxilarry. 916 00:51:16,370 --> 00:51:21,700 Este é basicamente Works tecnologia ou tecnologia Studio for LillyPond. 917 00:51:21,700 --> 00:51:25,380 Por isso, oferece ajuda com sintaxe, com modelos 918 00:51:25,380 --> 00:51:28,770 para vários comum combinações de instrumentos. 919 00:51:28,770 --> 00:51:32,780 Ele permite a visualização de tela dividida de modo você pode ter o seu código em uma janela 920 00:51:32,780 --> 00:51:37,350 e PDF em outra janela e clique em lugares do PDF 921 00:51:37,350 --> 00:51:40,650 para saltar para a relevante spots em seu código-fonte. 922 00:51:40,650 --> 00:51:45,330 Isso é mais útil se você está realmente escrita LillyPond arquivos você mesmo 923 00:51:45,330 --> 00:51:47,400 do que se você está gerando -los programaticamente. 924 00:51:47,400 --> 00:51:51,230 Mas, novamente, é algo útil para ter. 925 00:51:51,230 --> 00:51:51,970 >> Ótimo. 926 00:51:51,970 --> 00:51:55,860 Outra resources-- eu vou apenas passar por isso muito rapidamente. 927 00:51:55,860 --> 00:52:01,270 LillyPond manuals-- LillyPond tem excelente documentação em seu site. 928 00:52:01,270 --> 00:52:02,270 Eles têm um tutorial. 929 00:52:02,270 --> 00:52:03,478 Eles têm uma referência de sintaxe. 930 00:52:03,478 --> 00:52:07,010 Eles têm centenas de trechos para várias coisas pequenas 931 00:52:07,010 --> 00:52:09,930 yo pode precisar fazer para demonstrar várias capacidades. 932 00:52:09,930 --> 00:52:12,250 Se você deseja usar a linguagem de script 933 00:52:12,250 --> 00:52:14,740 ou fazer mais extensa personalizações, então não há 934 00:52:14,740 --> 00:52:16,730 internos de referência a que URL. 935 00:52:16,730 --> 00:52:21,950 Se você quiser usar XML Music, há que URL, musicxml.com/tutorial. 936 00:52:21,950 --> 00:52:27,960 >> E então se você precisa aprender esquema porque você realmente quer usar 937 00:52:27,960 --> 00:52:30,960 as instalações de script em LillyPond, em seguida, há um [inaudível] chamado 938 00:52:30,960 --> 00:52:32,918 Interpretação estruturado de Programas de Computador, 939 00:52:32,918 --> 00:52:35,820 que é não só o segundo maior livro de CS nunca written-- 940 00:52:35,820 --> 00:52:39,770 encontrar-me mais tarde se você quer saber o que eu acho que o maior deles é-- 941 00:52:39,770 --> 00:52:43,580 mas também é muito bom introdução à linguagem adequada. 942 00:52:43,580 --> 00:52:46,630 Você não vai precisar mais do que as primeiras seções. 943 00:52:46,630 --> 00:52:47,827 >> E é isso. 944 00:52:47,827 --> 00:52:48,410 Alguma pergunta? 945 00:52:48,410 --> 00:52:54,068 946 00:52:54,068 --> 00:52:57,972 >> ALUNO: Onde posso baixar Frere Jacques sua gerado 947 00:52:57,972 --> 00:53:01,050 para que eu possa colocá-lo no meu iPod? 948 00:53:01,050 --> 00:53:07,574 >> STEPHEN Krewson: Bem, você pode escrever para algum arquivo wav em Euterpea. 949 00:53:07,574 --> 00:53:08,490 E você tem o código. 950 00:53:08,490 --> 00:53:10,000 É no GitHub. 951 00:53:10,000 --> 00:53:15,590 Faça as suas próprias variações de Frere Jacques por CS50 mente da colmeia. 952 00:53:15,590 --> 00:53:17,095 Seria ótimo. 953 00:53:17,095 --> 00:53:18,220 CONNOR HARRIS: Mais alguém? 954 00:53:18,220 --> 00:53:20,261 STEPHEN Krewson: Precisamos uma melhor bumbo também. 955 00:53:20,261 --> 00:53:21,935 É muito ruim. 956 00:53:21,935 --> 00:53:26,565 >> ALUNO: Euterpea tem não só lado a composição, mas signal-- 957 00:53:26,565 --> 00:53:27,440 STEPHEN Krewson: Sim. 958 00:53:27,440 --> 00:53:30,100 Na verdade, o trabalho que eu fez em Euterpea quando eu 959 00:53:30,100 --> 00:53:33,450 tomou isto-- há uma graduar curso em Yale que 960 00:53:33,450 --> 00:53:35,900 utiliza ele-- foi em síntese de som. 961 00:53:35,900 --> 00:53:39,810 Portanto, não há realmente um maneira agradável usando as setas 962 00:53:39,810 --> 00:53:46,150 e alguns da notação vimos de compondo juntos funções de sinal. 963 00:53:46,150 --> 00:53:50,610 Em particular, o baixo para a maioria um deles é apenas uma onda senoidal simples. 964 00:53:50,610 --> 00:53:54,240 Mas se você começar a compor aqueles de maneiras programáticas estranhos, 965 00:53:54,240 --> 00:54:00,010 você pode obter som louco efeitos, como cascatas estranhas. 966 00:54:00,010 --> 00:54:04,640 Você pode criar muito corajoso sons com uma grande quantidade de modulação. 967 00:54:04,640 --> 00:54:07,730 >> Eu fiz um projeto sobre granular síntese, que é 968 00:54:07,730 --> 00:54:12,290 em algum lugar entre FM e amostragem. 969 00:54:12,290 --> 00:54:15,230 Você toma muito pequeno, amostras pequenas, e em seguida 970 00:54:15,230 --> 00:54:20,440 combiná-los com algum tipo de modulador e construir-se um som mais rico. 971 00:54:20,440 --> 00:54:24,900 Nós também fizemos modelagem física, de modo tentando pensar sobre a física 972 00:54:24,900 --> 00:54:29,410 e psicoacústica de algo como trombeta, e pensar sobre a maneira 973 00:54:29,410 --> 00:54:32,320 o som está saltando fora o sino da trombeta 974 00:54:32,320 --> 00:54:35,200 e a acústica de o quarto e modelagem 975 00:54:35,200 --> 00:54:40,195 com que os osciladores de base. 976 00:54:40,195 --> 00:54:47,690 977 00:54:47,690 --> 00:54:48,940 CONNOR HARRIS: Thanks so much. 978 00:54:48,940 --> 00:54:50,140 Obrigado por terem vindo. 979 00:54:50,140 --> 00:54:52,400 E eu estou sempre disposto a a perguntas por email-- 980 00:54:52,400 --> 00:54:55,020 connorharris@college.harvard.edu. 981 00:54:55,020 --> 00:54:57,020 >> STEPHEN Krewson: Yeah. stephen.krewson@yale.edu. 982 00:54:57,020 --> 00:54:58,810 983 00:54:58,810 --> 00:55:00,360 Frio. 984 00:55:00,360 --> 00:55:01,667