CONNOR HARRIS: Oi.
Eu sou Connor Harris.
Eu sou um CA CS50 em Harvard.
STEPHEN Krewson: Eu sou Stephen Krewson.
Eu sou um TF para CS50 em Yale.
CONNOR HARRIS: E nós estamos indo falar sobre algumas tecnologias que você pode
deseja usar, se você estiver interessado em fazer um projeto final ou realmente
nada com a música.
Nós estamos indo para se concentrar em um primeiro linguagem de programação chamada Haskell.
É uma funcional língua, de modo que o paradigma
é muito diferente do C ou PHP ou outras linguagens imperativas
que você já tenha usado e, especialmente, numa biblioteca escrita em Haskell
Euterpea chamado, o que pode ajudar as pessoas com a escrita de música funcionalmente,
basicamente.
E Stephen irá orientá-lo através de um grande exemplo disso.
>> Depois disso, eu vou apresentá-lo a algo chamado LillyPond, que
é uma tecnologia para a música de composição.
É uma espécie de como LaTeX para a música se algum de vocês
LaTeX ter usado para aulas de matemática ou outras classes conjunto P ou o que você tem.
E então eu vou dar-lhe, mais uma vez, alguns exemplos simples de que
e apontá-lo na geral direção de alguns recursos melhores.
>> STEPHEN Krewson: Em Adicionalmente, nós pensamos que
seria legal para definir-se um pouco de sugestões
em direção a um gasoduto entre Arquivos MIDI gerados pelo Euterpea
em LillyPond, por isso oferecemos alguma instrução em scripts
para fazer isso que são fornecida com LillyPond
apenas para mantê-lo open source e obter um gasoduto vai.
CONNOR HARRIS: Mais uma vez, devemos enfatizar,
essas duas tecnologias, você não tem que usá-los juntos.
Eles não são projetados para trabalhar juntos, embora eles fazem muito bem.
>> STEPHEN Krewson: Certo.
E totalmente gratuito.
CONNOR HARRIS: Então, reconhecimentos, basta ler isso.
STEPHEN Krewson: Devidamente anotado.
Graças a essas pessoas.
Isso eu vou ficar em apenas por um momento.
O processo de instalação é um pouco complicado.
Temos um me ler no GitHub que você pode dar uma olhada.
Apenas envie-me se você tiver quaisquer perguntas.
Mas vamos executar este sob o pressuposto que este está a funcionar para todos.
CONNOR HARRIS: E se você não puder obter LillyPond para trabalhar, não é grande coisa.
Não há nenhuma compilação ao vivo que estarão envolvidos, pelo menos no meu fim.
STEPHEN Krewson: Haskell e LillyPond deve ambos têm instaladores.
Euterpea é baixado como um pacote, assim por diante e assim por diante.
Então, nós estamos falando de música de computador.
E este é apenas um muito vista de 50.000 pés.
Há alguns aspectos diferentes do mesmo.
E isso é duro e é indo a obscurecer algum detalhe.
Mas poderíamos pensar em algo como composição algorítmica,
utilizando algoritmos, usando o código, para gerar
algum tipo de-- talvez um auto-similar seqüência de notas, ou talvez notas
sob alguma restrição.
E então aqueles poderia ser executado ou interpretada
com instrumentos analógicos ou qualquer coisa assim.
Mas a composição era feito através de algoritmos.
>> Mas, claro, talvez a área de música de computador ou de música digital
estamos mais familiarizados com é digital síntese de som ou de amostragem digital
e gravação digital.
Um monte de instrumentos digitais são feito através de amostragem digital.
Na verdade, nós estaremos usando um dos que estão no a forma de uma biblioteca de fontes de som mais tarde.
>> Mas também há algo chamado síntese digital que saiu
dos anos 70 e nos anos 80 com 'final Yamaha e John Chowning em Stanford
fazendo síntese FM ou Síntese de modulação de frequência,
onde você teve uma transportadora sinal e um sinal de modulação
tanto no espectro de áudio.
Mas o que estamos focados em hoje é algo chamado MIDI,
e, claro, composição algorítmica.
>> Nós não estamos indo para fazer instrumentos, mas nós estamos indo em vez de fazer alguma música,
e, em seguida, que vai se interpretado pelo que alguns instrumentos
são conformidade com o padrão geral MIDI.
Então o que é MIDI?
Eu não vou ficar muito fundo nele, mas MIDI é um protocolo de transferência de dados.
É uma espécie de um guia em frente diferentes empresas e indústrias
para a organização de sons ou patches.
Então, vamos ver que há um padrão MIDI
para todos os diferentes percussão sons e recomendações MIDI
para todos os diferentes tipos de sintetizadores ou diferentes tipos de todo o instrumento
grupos em uma orquestra, dizem.
>> Você provavelmente está familiarizado com 0 a 127 mensagens MIDI.
Um sinal MIDI é tipicamente um bit indicando
se é um de dados ou um pacote de estado, e depois há
sete bits de um sinal.
E estes podem controlar tudo a partir do volume
à pressão ou acção em uma chave especial
se você estiver executando com um MIDI controlador, assim como, naturalmente,
notas.
E, claro, tem MIDI foi extremamente útil,
porque é uma maneira de arame juntos ou em cadeia
um monte de dispositivos de hardware MIDI.
Eu tenho sete ou oito de volta na minha casa.
Fica realmente complicado, mas é realmente poderoso.
E é realmente velho.
É do início dos anos 80, e é muito bom e pequeno.
CONNOR HARRIS: Yeah.
Tudo o clássico Nintendo jogos de vídeo seria, provavelmente,
tem arquivos MIDI para a música, por exemplo.
>> STEPHEN Krewson: Aqui está um exemplo de MIDI geral,
mostrando MIDI como uma espécie de protocolo geral.
E eu penso que nós podemos pensar no diferença entre a especificação
que deve haver algo como estes sons de instrumentos eo real
realização desses instrumentos sons em uma fonte de som ou um MIDI especial
sintetizador como sendo a diferença entre talvez um typeface-- que diz:
Em geral, este é o desenho de Desta forma especial para representar
de caráteres e uma fonte específica que tem um tamanho e timbre específico,
e não há realização de as--
>> CONNOR HARRIS: Talvez um melhor comparação seria
ser o padrão Unicode says-- dá- um número para cada personagem, e realmente
todas as línguas do mundo, ou um vasto conjunto de scripts de linguagem
em todo o mundo, e, em seguida, são aqueles rendido em algo gráfica
por vários pacotes de fontes.
E, obviamente, você pode pensar MIDI como o Unicode de som.
E isso é apenas uma lista de-- um grande fluxo de eventos e instrumentos e outros enfeites,
e você tem que ter um separado programa, como um tipo de letra,
para tornar isso em algo que é audível.
>> STEPHEN Krewson: Então, por que Haskell?
Haskell é uma programação funcional língua, muito avançado,
muito diferente de C, muito diferente do PHP.
E vamos ver que há uma facilidade de composição de função em Haskell
que nos permitirá brisa através compondo ou digitando-se, transcrever,
algo como Frere Jacques, esta canção simples que
tem um monte de peças em que ela são auto-similar ou repetir.
Então, isso vai ser alguns dos a motivação para isso
estamos usando Haskell, em que funções são cidadãos de primeira classe.
>> E eu queria estender isso um pouco.
É um pouco fácil anotar Frere Jacques em Haskell.
Mas o que se quiséssemos adicionar uma parte da bateria para ele?
O que se queria para tentar fazer algo como um tambor Roland 808 ou 909
máquina em que você tem cerca de 16 diferentes etapas?
Normalmente, estas são pensou em notas como 16o.
E você pode controlar o mundial tempo, e você pode escolher
um monte de diferentes partes de percussão de bumbo, uma salva de palmas, diferentes armadilhas,
abertas e fechadas chapéus altos sobre este tipo de canais,
e então você pode ou EQ ajustar o seu volume.
>> E nós vamos ver uma maneira agradável em Haskell de representar esta etapa
sequenciador com toda a várias coisas legais em Haskell
o que podemos fazer com a geração listas e mais listas de filtragem,
mapeamento sobre listas, mapeamento funções mais listas.
E um rápido pedido de desculpas.
Este é um muito superficial e esboço excessivamente rápida
de alguns dos aspectos de Haskell e Euterpea,
que é um domínio específico linguagem embutida escrito
em Haskell para tipos musicais.
Então, por favor, verifique o código online.
Fogo até GHCI, que é o Glasgow Haskell Compiler intérprete.
E eu vou estar fazendo alguns isso em um pouco
assim você pode ver como ele é feito.
>> E isso permite que você carregue em com as-- a sintaxe é cólon e então
o comando.
Você pode carregar em arquivos.
Você pode usar browse nesses arquivos para ver todas as funções que
existir em um módulo em particular.
E então, como vamos ver, tipos e tipo classes são tão importantes em Haskell,
assim você sempre pode check-- especialmente se você está trabalhando em uma nova DSCL
como este, que é um tipo de música?
Eu sei sobre o modo numérico tipos trabalhar em Haskell,
mas eu não sei muito sobre música.
Mas você pode explorar a forma como eles são definida usando o comando t ou tipo
e, em seguida, chamar em um determinado função ou um objeto de dados.
CONNOR HARRIS: Yeah.
Se você pensou C e Clang foi hardass sobre tipos,
você não tem idéia sobre Haskell.
A coisa boa sobre Haskell é que se você pode obter o seu código para compilar
e se verificações de tipo Haskell, ele provavelmente está certo,
porque o sistema de tipo é tão rigoroso.
>> STEPHEN Krewson: Yeah.
Então, eu só quero ir through-- e novamente,
este não está fazendo isso justice-- algumas das as características de Haskell que, pelo menos
a sua creators-- e foi criado no final de 1980 por um grupo de pessoas,
uma comissão de cerca de 20 pessoas-- pensei que eram importantes.
E a primeira coisa que eles listados em um documento que
descreveu a gênese de Haskell ao longo dos primeiros 20 anos ou mais
é que era preguiçoso.
Então o que isso significa?
>> Bem, isso significa que quando temos algum tipo de expressão, precisamos avaliá-lo.
E Haskell faz isso de uma chamada por meio necessidade ou uma maneira que não seja estrita.
Ou seja, se nós temos um monte de componentes de nossa expressão,
nós tentar atrasar a avaliação desses subcomponentes
até o último minute-- absoluta ou seja, até nós realmente precisamos deles.
>> Portanto, este means-- que é muito legal, especialmente
se nós estamos pensando sobre a abstração de um seqüenciador passo a passo musical.
Você ligá-lo, e você começa executando um passo sequence--
Se você nunca trabalhou com um tambor machine-- e ele só vai para sempre.
Por isso, seria muito bom se nós poderia emular que em Haskell.
E podemos fazê-lo com infinita valores, em listas infinitas particulares.
É muito fácil de digitar um lista infinita em Haskell.
Você pode simplesmente usar a sintaxe para baixo aqui, onde você vê de 1 a 3,
remover o 3 1 ponto a ponto, e que é uma lista infinita
de todos os números naturais estendendo em tanto quanto você pode imaginar.
>> Eu quero apresentar uma conceito de dobras de imediato.
E, novamente, o propósito Este seminário não é
para aprender sobre dobras em Haskell ou funções de ordem superior.
Mas eu só quero apresentá-lo ao dar um sentido preciso de como estranho
Haskell é e como ele é poderoso.
E, em particular, vamos ser-- quando fazemos nossas diferentes partes de bateria,
vamos estar manipulando listas de números, dobrando-os uns sobre os outros.
E para fazer isso, vamos estar usando mapas e dobras.
>> Há um associativos à direita dobrar, o que é esta uma direita
aqui-- 1 menos a quantidade, 2 menos a quantidade, 3 menos 0.
E a sintaxe para uma vezes, você dá uma dobra
um valor base e, em seguida, um operation-- Neste caso, a adição ou subtracção.
Eu mostrei ambos os casos.
E depois há um acumulador que acumula ao longo do toda a lista,
aplicação que além de operador ou menos, e, em seguida, acumulando-lo.
Portanto, este será as-- se ele foi chamado com R dobra mais de 0, começando com 0,
teríamos então resumir tudo os números nessa lista.
E isso é uma lista 1-3.
CONNOR HARRIS: Então, dito de outra maneira, dobra r recebe três argumentos.
Há uma função que em si leva dois argumentos,
então há um valor de arranque, e há uma lista de valores.
E o que você faz é tomar valor starter, primeiro valor,
colocá-los para a função.
O que você sair, tomar que, de alimentação que
para a função do segundo valor, o que você sair,
levar isso, alimente essa para o função do terceiro valor.
E então, se você vai para baixo esta lista inteira desta forma,
você está indo para obter, eventualmente, algum valor singular que é
do mesmo tipo do que você começou com e do mesmo tipo
como as coisas na lista e, em seguida que é o resultado de retorno de dobra R.
STEPHEN Krewson: Então, em particular, estes são as funções de ordem superior,
porque eles estão tomando outro função como um dos argumentos.
>> CONNOR HARRIS: Yeah.
Se você já usou alguns outros languages-- Sei R, [inaudível]
língua tem isso, chamado Reduzir.
Você pode ter funções semelhantes em outros idiomas, apenas chamado
coisas diferentes.
>> STEPHEN Krewson: E o que é agradável sobre dobra R
neste caso é que dobra R pode trabalhar com listas infinitas.
Portanto, neste fundo, este P5 está gerando as notas que
são ativados no seqüenciador passo para alguma parte da bateria, a quinta parte da bateria,
e talvez seja uma conga tambor ou algo assim.
E este é um deliberadamente obtuso maneira de escrever isto,
mas é divertido, porque ele demonstra uma grande quantidade
de coisas sobre Haskell e Euterpea.
>> Então dobra R deste cólon é colon-- apenas um operador que empurra as coisas
juntos em um lista-- chamado em um vazio lista, que é apenas os colchetes vazios.
E eu estou chamando que nesta lista infinita.
Isto é, na verdade, duas listas somados até aqui.
A lista uma vírgula 6 dot ponto é 1, 6, 11, 16.
Assim Haskell-- em apenas alguns caracteres,
pode gerar o inteiro sequência de números
que são cinco números além esticando o infinito.
E que a preceder este pequeno curto lista--
3, 8, 21-- apenas para mostrar-lhe como você pode concatenar listas.
>> E então eu tenho dobrado sobre si mesmo.
E isso acaba sendo apenas um tipo de operação de identidade, mas é infinito.
E dobre R pode fazer isso, porque preguiçosamente avalia, como no exemplo acima.
Se temos um 1 e um 2 e 3, podemos apenas entre parênteses fora todo o resto.
Isso não vai funcionar para menos ou mais, mas
irá trabalhar para isso cólon operação de identidade na lista.
>> Então, como podemos usar praticamente que se nós tem um infinitamente longa lista de coisas?
Bem, Haskell fornece um monte de funções no passado:
e olhar mais para estas em seu próprio tempo-- como tomar
que diz: OK, nós estamos gerar esta lista infinita,
mas nós estamos apenas vai levar algum número de la E neste case--
vamos ver isso mais tarde em nossa code-- drum machine
GM é apenas uma espécie de mundial variável para o número de passos
no seqüenciador.
Nas máquinas de rolo-in I mostrou você, que é tipicamente 16,
mas eu não a aplicaram com 32.
Realmente não importa.
>> Haskell também é puro, por isso, tem forte tipagem estática que Connor aludido.
Assim, são funções matemático no sense--
eles são mais matemática que está garantido
para não acessar ou alterar qualquer tipo de variável ou executar entrada ou saída.
Então se você tem uma função, é determinista.
Ele sempre retornará o mesmo valor no estado do programa
ou permanecer a mesma.
Existem, naturalmente, excepções monádicos para isso, mas isso está além do nosso alcance.
>> CONNOR HARRIS: Yeah.
O que isto significa, no entanto, está lá são alguns importantes [inaudível]
consequências desta.
Uma delas é que é muito fácil de paralelizar programas Haskell.
Porque se você tem, dizer, uma função de que
necessita de operar sobre um milhão de valores, se você sabe que a função sempre
dar o mesmo valor se você alimenta em um determinado value--
se você é [inaudível] f de 1, f de 2, depois de 3 ou f f de 1 whatnot--
não vai escrever para um arquivo ou fazer algo
que irá alterar o valor de f2.
Você pode simplesmente dividir essa função para uma milhões de máquinas diferentes, ou um milhão
diferentes tópicos ou qualquer outra coisa, obter todas as respostas de volta,
obter todos os valores de retorno para trás, e, em seguida, é isso.
Então, muito fácil de paralelizar coisas.
>> A desvantagem é que a entrada e saída especialmente
se encaixar no sistema de tipos de formas muito complicadas.
Nós não vamos entrar nisso agora, mas eu Encorajo-vos a olhar para alguns recursos
online, se você quiser saber mais sobre isso.
>> STEPHEN Krewson: Então, e este tipo classes--
as classes de tipos foi-- foram inventados para resolver
um problema de sobrecarga de operadores.
Então, nós queríamos ter igualdade entre diferentes tipos de coisas.
Claro, poderíamos pensar de-- igualdade entre tipos numéricos
É muito fácil pensar, mas que sobre a igualdade entre listas?
E sobre a igualdade entre árvore de estruturas de dados perna?
E tudo isso é possível em Haskell porque de classes de tipo.
>> Então, se você define uma certa type-- dados e aqui, estes são passos musicais.
Nós estamos finalmente começando um pouco de música de computador.
Portanto, temos C, C sharp, e assim por diante.
Elas pertencem a um grupo de diferentes classes de tipo.
EQ-- eles pertencem à classe tipo de EQ.
Isso significa que eles suportam operações de igualdade.
Assim, você pode avaliar se um sequência de primitivas musicais
é o mesmo que um diferente.
>> Eles pertencem à classe ordinal.
Isso significa que há uma ordenação a estes.
D vem depois de C. C sharp C vem depois, bem.
Eles pertencem à classe mostrar, o que significa que eles podem
ser impresso para um console ou terminal.
Eles pertencem à classe enumerados, que
significa que, embora estes são personagens,
eles têm um numérica subjacente representação começando em 0
e saindo através contudo muitas coisas estão aqui, 20 ou assim,
ou 30 ou 40, talvez.
>> CONNOR HARRIS: E quando nós temos um tipo de dados
que derives-- com essa palavra-chave "deriving--" um certo tipo de classe,
isso significa que o compilador tentará para construir algo automaticamente.
Então, talvez você vai querer definir uma qualidade diferente.
Você vai querer definir C sharp como sendo igual a D plana, por exemplo.
Com esta construção aqui, eu não acho que C sharp
e D plana irá ser igual, porque o compilador irá automaticamente
dizer que cada valor diferente possível é distinto de todos os outros.
>> Por isso, é possível substituir as implementações padrão
destes tipos de classes.
Mais uma vez, olhar para a referência se você quiser saber mais sobre isso.
STEPHEN Krewson: E aqui, na verdade, isso vai
ser útil para quando nós código mais tarde.
Vemos alguns dos operadores infixas para a composição seqüencial,
composição paralela, e assim por diante, estes aspectos positivos e sinais de igual
cercado por dois pontos.
Isso significa que podemos jogar esses diferentes primitivas musicais um após o outro.
Isso é composição seqüencial.
>> Ou nós podemos reproduzi-los em paralelo ao mesmo tempo.
Então eu posso ter um valor musical, e, em seguida, o que equivale a dois pontos e,
infix operador composição paralela, e reproduzi-los como uma espécie de corda.
E nós estamos indo para usar isso quando nós combinamos
nossa parte da bateria com a nossa musiquinha Frere Jacques
jogar estas duas sequências de valores musicais ao mesmo tempo.
>> Currying Curry é-- foi passado Nome do Haskell Curry, que
a imagem Haskell é nomeado após.
E isso nos permite uma agradável elegância quando estamos
escrevendo todos esses diferentes funções ou filtros que estamos
vai ser mapeamento sobre nossas listas.
A função de dois arguments-- f de x e y--
pode ser representada como f de x para y aplicada.
Portanto, é uma função de um argumento que retorna
outra função de um argumento.
Então, isso significa que podemos mapear uma f função de x lista de y acabou.
CONNOR HARRIS: Quer dar um exemplo disto?
STEPHEN Krewson: Yeah.
Eu tenho um exemplo certo aqui de algumas das coisas que vamos escrever.
Então replicar 2-- bem, replicar tomará
um valor, que é quantas vezes para replicar algo,
e então vai demorar um value-- geralmente uma lista ou algo assim.
Então, aqui, estamos mapeamento replicar 2 sobre a outra lista.
>> Então, se nós mapear replicar 2, se replicar aplicar 2
para o primeiro elemento e desta lista-- estas são listas de phrases-- musical
irá produzir dois de "você sleeping--" então você está dormindo, você está dormindo.
Portanto, agora temos dois.
Mas replicar leva dois argumentos, mas porque somos
currying e, em seguida, mapeamento, podemos representar repetição 2
como tendo sido devolvido como uma função de um argument-- apenas replicando duas vezes.
E então estamos aplicando que a cada elemento desta lista de frases.
>> E é uma concatenação Haskell operação para aplainar uma lista.
Porque replicar 2 vontade produzir uma lista de listas.
E este é essa forma intermediária aqui.
E então podemos concat ou achatar que duas vezes.
CONNOR HARRIS: A mais simples exemplo de currying,
se você imaginar como-- f é apenas um função de multiplicação que leva dois
argumentos e retorna seu produto.
Então, se você tem uma f 4 5, é 20.
Mas você pode pensar nisso como Também-- você tem uma função f 4
que leva um argumento e retorna quatro vezes este argument-- apenas
aplicação parcial que apenas um argumento 4.
E se você alimentá-f de 4 5, que lhe dará 20.
E isso é uma simples exemplo de currying.
Geralmente é um dos livros didáticos.
>> STEPHEN Krewson: Lambda expressões ou funções anônimas
são outra marca registrada Haskell.
Então, se temos de preparar uma pouco replicar vida função,
mas dizem que não é em a biblioteca padrão,
podemos usar uma sintaxe semelhante à que se segue.
E nós vamos brisa sobre isso.
Uma coisa que você vai ver um monte de na drum machine é que estamos a fazer chamadas
a algo chamado filtrar, que, como antes,
é um mapeamento de uma função sobre uma lista, mas é
um mapeamento de uma função booleana.
>> Portanto, temos aqui um exemplo de um um anonimamente
função booleana definida que leva apenas valores casal.
Esta não é a rigor uma função anônima.
Mas é definir com que a sintaxe para a brevidade,
e isso só leva x módulo n--
CONNOR HARRIS: Yeah.
Então F é uma função de dois argumentos n e p
que retorna uma função que é própria uma função de um argumento, ou seja, x.
STEPHEN Krewson: I operadores infixas mencionados.
Quais são os operadores infixas?
Bem, os operadores estão a infixas forma normal que representam operações,
dizer, em mathematics-- 2 mais 2, em vez de o operador mais
e, em seguida, dois argumentos 2 e 2.
CONNOR HARRIS: Chama- inverter notação polonês, que é
um termo que eu duvido que qualquer um de vocês saberia.
>> STEPHEN Krewson: Certo.
Inverter notação polonês ou prefixo.
Mas Haskell decidiu usar operadores infixas.
Então, essas são algumas das os personalizados que
são definidos para a Euterpea DSCL em Haskell.
Portanto, esta foi a composição seqüencial.
Esta foi a composição paralela, e este foi truncando composição paralela.
E vamos precisar que com a nossa máquina de tambor,
porque nós vamos usar o último operador em que há pouco tupla
jogar a bateria eletrônica ao longo com a nossa música Frere Jacques.
E a nossa máquina de tambor é vai ser infinito.
Ele só toca para sempre.
Mas a música Frere Jacques não é.
Não é que muito tempo.
É apenas alguns bares.
Por isso, precisamos de parar a máquina de tambor como Assim que o valor musical menor vem
ao fim.
E esse operador infixada é super útil com isso.
>> E notação infix como este é o tipo de Nice,
porque dizer que você tem uma função como citações, o que dá a divisão inteira
de x por algo else-- pesaroso, que deve ser um e b.
Você pode escrevê-lo como um orçamento de b.
Então, se você é elemento put-- outro exemplo disso.
x elemento em alguma lista, se você colocar -lo em Backticks, você pode usá-lo.
Mesmo que ele não é um símbolo como mais ou menos ou tempos,
você pode usar o nome de uma função como que em Backticks
como operador infixo, que é muito legal.
CONNOR HARRIS: Mais uma vez, este é todo o açúcar apenas sintática, realmente.
Ele não afecta o núcleo da linguagem.
>> STEPHEN Krewson: Então nós vemos aqui para a última frase da nossa canção Frere Jacques,
Joguei alguns acordes ou pequenos terços, usando a composição paralela
operador.
Esta é outra maneira de dizer alguma do que temos vindo a dizer apenas.
Então você pode mapear funções de uma discussão sobre listas.
CONNOR HARRIS: Mais uma vez, as referências para manuais introdutórios Haskell--
terá tudo isso nele.
>> STEPHEN Krewson: Então aqui está um bonito linha chave do seqüenciador passo a passo
vamos dar uma olhada usando uma compreensão da lista.
E vemos aqui é esse elemento na operadora fixa em citações para trás.
Portanto, se X é um elemento de uma lista de X, então vamos chamar funções perc.
Então perc é apenas uma função de percussão.
Demora algum valor p que é parte do conjunto limitado de tudo
os diferentes sons de percussão que vimos em um slide anterior,
e, em seguida, ele dá que duração de uma semínima.
Então ele lhe dá um qnr, e qnr é apenas um descanso nota de um quarto.
>> Portanto, este é construir algo agradável.
Temos uma lista de elementos, e nós vamos loop sobre alguma lista de um
para o valor máximo de nosso seqüenciador passo a passo.
E quando estamos em um i particular que lista de um para o valor máximo,
se que i é um membro desta conjunto criado nesta função,
bem, então podemos transformá-lo em uma nota percussão.
Caso contrário, nós apenas jogar um descanso, que Quer dizer, nós simplesmente permanecer em silêncio.
E podemos ver aqui que, em esta sintaxe compreensão da lista,
x é preenchido por este lista construído um
para o tamanho global do sequenciador.
CONNOR HARRIS: Yeah.
A sintaxe básica para compreensões lista é
suporte, envolvendo valor algumas variáveis, bar,
possíveis valores das variáveis eles próprios, o suporte fechados.
E se você tiver feito definir notação construtor em qualquer tipo de aula de matemática,
você pode ter configurado tal 2n em que n é ou em que n é z.
Similar coisa-- esta notação pretende ser sugestivo
de que notação matemática.
STEPHEN Krewson: E você pode aplicar vários predicados
e vários filtros em uma lista compreensão, que é bastante agradável.
Algébrica types-- não vai demorar muito tempo aqui.
Não é uma boa idéia em Haskell ou um bom, noção óbvia
de como tirar, digamos, um padrão parâmetro para uma função ou algo assim.
Em Python, isso é muito fácil.
Você pode apenas dizer com igual em a declaração da função,
um valor padrão em caso nada é fornecido.
>> Em Haskell, você poderia talvez usar talvez o tipo talvez,
que leva tanto nada ou um valor de apenas um tipo.
Então, nós explorar esta na bateria eletrônica para nos permitir dar de volume opcional
parâmetros para cada uma das partes de bateria.
Então isso nos dá uma maneira de ter EQ ou um volume de um canal em particular.
>> Connor HARRIS: Em outros exemplos Haskell,
você pode ver talvez usado para funções que podem falhar.
Esta é uma pergunta comum.
>> STEPHEN Krewson: E você pode fornecer algum tipo de mensagem de erro como um padrão.
E isso é particularmente útil quando você está fazendo o I / O em Haskell.
Isso pode ser truques.
CONNOR HARRIS: Ou para um exemplo semelhante, pense
de uma função que envolve divisão de um parâmetro que pode ser 0.
E essa função poderia voltar talvez seja o que for.
Então, se não há nenhuma divisão por 0, ele retornará apenas o que quer.
E se há divisão por 0, ele irá retornar nada
como uma forma de sinalização do erro.
Porque uma das consequências da Muito estrita de tipos de Haskell
é que não há nenhuma real-- excepções são difíceis, basicamente,
manipulação de erro é estranho.
E este é um muito forma comum de fazê-lo.
>> STEPHEN Krewson: Então agora temos a outra coisa alucinante
sobre Haskell, que é padrão definições de harmonização e função.
Eu mostrei no último slide da declaração da sequência passo
função, que teve um valor talvez, em seguida, um int, então uma lista de inteiros,
em seguida, retorna uma seqüência de valores música não anotada
tanto com tom e volume.
>> Então esses três argumentos podem ser padrão correspondente da seguinte maneira.
E nós sempre queremos ter a certeza de fazer um caso base ou caso saia primeiro.
E estes sublinhados pode apenas ser interpretada
significa qualquer valor que está lá.
Então, se nós receber uma chamada para a etapa sequência com algum valor, algum outro valor,
e, em seguida, a lista vazia, o que queremos para voltar é apenas silêncio, um descanso 0.
>> E em vez de que sendo uma lista vazia ou 0,
é um descanso 0, porque somos lidar com o tipo de música,
ea lista vazia da música tipo é apenas um resto de nenhuma duração.
Não é nenhuma música.
E, depois, ver se temos um passo sequenciar com um v para o argumento de volume,
p para o instrumento precaução argumento, e, em seguida, uma lista de X.
>> Em seguida, fazer algumas coisas.
Em particular, nós aplicamos esta compreensão da lista,
e nós executar alguns operações no valor talvez
para transformá-lo em um valor numérico para que que poderia ser utilizado e, em seguida enumerados
para seleccionar o instrumento.
Novamente, isto é um pouco bit deliberadamente inconcise
só para mostrar todas as coisas estranhas você pode fazer em Haskell como você
dê uma olhada em seu próprio tempo.
>> Tudo certo.
Então, nós estamos finalmente começando a fazer o que nos propusemos a fazer,
que é fazer um pouco de música de computador.
Então, nós estamos indo para tentar fazer a música Frere Jacques.
Portanto, há quantas frases em Frere Jacques?
Quatro.
Ótimo.
E o que é bom é que eles estão todos repetido
a mesma quantidade de vezes, que é dois.
>> Portanto, temos quatro frases cada repetido duas vezes.
E, em particular, eles estão em uma rodada.
E há muitos, muitas maneiras de implementar
uma partida que poderia ser divertido de fazer.
Já fiz isso em um bonito forma simples aqui,
que é apenas para a linha construct-- função recebe uma lista de valores de música
e transforma-lo em composição seqüencial através da aplicação desta composição seqüencial
operador.
>> E então eu atrasar as diferentes partes fazendo-os começar com um descanso.
Então eu começar com um descanso de duas medidas, e, em seguida, um resto de quatro medidas,
e, em seguida, um resto de seis medidas e, em seguida, a rodada
funciona, como todos sabemos, esta canção.
Vemos duas anotações ou modificações dos valores de música
que estão contidas neste seqüencial arranjo de elementos de música.
Nós temos um volume add.
Esta é uma função para anotar música com um volume específico.
Este é um bom exemplo de um sinal MIDI em execução
de 0 a 127, os bits de sete informação que pode ser transportado.
>> E entăo-- vimo-lo muito brevemente, mas o MIDI geral
lista de todos os diferentes instrumentos.
E não há um monte deles.
Se você usar uma estação de trabalho de áudio digital, como o Pro Tools Ableton Live ou,
há uma gama mais ampla incrivelmente de sintetizadores e instrumentos VST.
Mas o padrão MIDI única tem alguns, ou vários dúzia.
E alguns deles são engraçados.
Eu pensei que seria divertido se nós jogamos o instrumento do instrumento MIDI
helicóptero, e, em seguida, o próximo caminho através do round,
fizemos um synth pad, e depois de essa liderança brega synth onda quadrada,
e então a voz lodo, que são um pouco indistinta no meu mau MIDI
sintetizador, mas OK.
>> E então vemos isso let e na sintaxe de Haskell,
e, em seguida, nós estamos jogando todas estas partes em conjunto
com o operador de composição paralela.
E nós provavelmente poderia mostrar um pouco isso.
Aqui está o código.
E você pode ver em C, que haveria uma monte de pigarro e definição
o código de tabela antes de poderia fazer música como esta.
Ou qualquer outra programação língua, você provavelmente
tem que interagir com algum tipo de biblioteca ou API e configurar tudo,
e então você tem que limpar.
Mas aqui em Haskell é, penso eu, uma vez você pegar o jeito dele, incrivelmente
legível e muito expressivo.
Portanto, há a implementação de Frere Jacques.
Tudo certo.
Agora queremos adicionar percussão, e isso é um pouco mais confusa pouco.
Então, vamos dar uma olhada nos slides.
Assim, a grande idéia é fazer um monte de listas ou peças.
Pelos máquinas roll-in, não eram tipicamente cerca de talvez oito
10 de ritmo ou de percussão partes.
E, em seguida, usar um monte de técnicas.
E nós falamos sobre these-- usando pregas, filtros, funções lambda,
mapeado sobre listas de gerar valores em algum intervalo de 1 a r, r é 16,
ou 32 passos no seqüenciador.
>> E, em seguida, se houver um valor nessa lista como nós estamos correndo através do sequenciador,
que passa por ele uma e mais, verifica-se nessa nota,
e que a amostra é acionado.
Aqui estão todas as diferentes maneiras estranhas Eu vim com a gerar notas.
Experimente-o em seu próprio soma semi.
Vai soar legal.
Se o tempo permitir, vamos passar por isso.
Mas, por agora, eu acho devemos demonstração que temos.
Vamos esperar que isso vai OK.
>> Portanto, este é GHCI.
E nós vamos carregar um arquivo Eu tenho chamado song.lhs,
que é o arquivo que acabei de mostrar.
OK ótimo.
Como Connor disse anteriormente, compilado, tipo marcada,
para que eu possa respirar muito mais fácil.
Não vai explodir em mim.
>> Eu queria mostrar-lhe algo útil.
Você pode ver que um módulo carregado chamado 50.
Você pode procurar esse módulo.
E isto é tão bom sobre doing-- talvez o que
você está fazendo em Haskell não é chamado de desenvolvimento de software,
mas você pode fazer um monte de diversão no seu próprio país.
E o fluxo de trabalho é realmente bom, como em comparação com um monte de outras línguas,
porque você pode ver em um realmente forma legível o que está acontecendo.
Assim, vemos que temos Todas essas frases, as quais
são listas de arremessos de música, e então nós construir estes acima em algo maior,
que é uma canção de música.
É uma unidade musical.
E então podemos jogar isso tudo com uma função chamada reprodução de música.
Você pode ver que aqui em baixo.
Que é apenas jogar.
>> Eu deveria dizer-- eu não falar sobre este sinal de dólar que está em toda parte.
Sinal de dólar é outro operador infixo.
Mas tem o menor precedência de qualquer operador, o que efetivamente
significa que tudo no à esquerda do sinal de dólar
e à direita do sinal de dólar, nós estamos indo para obter avaliados antes dele.
Portanto, é uma espécie de como outro maneira de adicionar parêntesis.
>> CONNOR HARRIS: É basicamente composição de função.
E garante que você não se have-- você tem funções de cada lado ou infix
operadores de ambos os lados, eles não vão associar através dele e dar-lhe
resultados inesperados.
>> STEPHEN Krewson: Então nós can-- usando esse, podemos chamar.
Primeiro, vamos jogá-lo sem a bateria.
Esse é o helicóptero, o helicóptero MIDI.
>> [Música tocando]
Há a onda quadrada.
O lodo de voz.
E você pode realmente ir selvagens com este.
Eu escolhi um bem simples, porque eu sabia que não deveria morder
mais do que podia mastigar.
Basta mantê-lo muito simples para mostrar as idéias principais.
Mas, então, eu era como, nós temos tem que adicionar alguns tambores para isso.
Só porque este é um pouco impenetrável,
e eu não utilizar o NOME DO partes de bateria,
Eu mapeados eles-- porque eles são parte dessa classe enumerado,
I mapeado-los para ints.
Uma delas é como um tambor.
Zero é assim.
Sete é um chapéu alto.
E para baixo aqui onde o funções de ficar um pouco mais aleatório,
estes são como atabaques.
>> Então, se você acha que talvez um about-- divertida maneira de implementar uma bateria eletrônica
é usar muito ordenada padrões em seu bumbo.
Assim, por exemplo, por filtração através da lista com tudo o que lhe dá de volta
a 1 quando ele é tomado módulo 04.
Então eu fico 1, 5, 9, 13, de modo que este 17-- é o primeiro tempo de cada compasso.
>> E então este é o mesmo coisa mudou ao longo de dois passos.
Então esse é o pouco frequente.
Portanto, este seria algo como um chapéu alto.
E então, novamente, aqui em baixo, é um pouco aleatório,
porque nós estamos fazendo atabaques.
E eu tenho algumas maracas para baixo também.
>> Então, eu poderia chamar drum machine jogo, mas seria ir para sempre,
e que poderia começar a agarrar-se toda a memória no meu sistema.
Então, eu vou chamar essa função tocar música, que, como veremos,
usar a composição paralela truncando para jogar a nossa pequena canção Frere Jacques
juntamente com esta máquina tambor estranho.
Então, vamos dar uma olhada.
E por favor não melhorar no meu arranjo de todas as partes de bateria.
Não a minha especialidade, mas eu tinha um monte de divertimento fazê-lo.
>> [Música tocando]
>> Então, é claro, isso é tudo um pouco não tão divertido
se não podemos convertê-lo a uma pontuação talvez por isso,
Pode ser interpretada por um performer humano.
Então eu não vou executá-lo aqui.
Eu já gerou os arquivos.
Você pode ver que há uma dot LilyPond file-- e este
será o meu segue até Connor-- e um arquivo ponto MIDI,
e um ficheiro PDF ponto, que é o que LilyPond que acabará por gerar.
>> Mas estes são os scripts, e eu vou apenas executá-los com as suas opções de ajuda.
Se você obtém esses instalado e funcionando com Euterpea, você pode gerar um arquivo MIDI.
E, em seguida, a partir do arquivo MIDI com este programa MIDI 2LY,
você pode gerar um lírio Arquivo Pond, e então você
pode gerar um PDF da partitura.
E devemos dar uma olhada nisso.
Então Connor provavelmente mostrar como para anotar isso melhor,
mas este é Frere Jacques como gerado por mim em Euterpea.
É apenas em C. Eu deveria ter figurado o que a cortá-lo, na verdade, no.
Mas isso é o gasoduto para como você fazer isso com isso.
Vamos falar mais sobre LilyPond.
>> CONNOR HARRIS: OK Vamos ver.
Você mencionou Saiba Você Haskell?
STEPHEN Krewson: Oh yeah.
Confira Saiba Você Haskell.
É nos recursos.
É assim que eu comecei aprendizagem, e isso é ótimo.
Aprendizagem não mudo.
>> CONNOR HARRIS: Então é online.
Então, um cara chamado [inaudível] learnyouahaskell.com, sem espaços.
A gramática é doente.
STEPHEN Krewson: É ilustrado, também.
CONNOR HARRIS: Então, qual é LilyPond?
É uma programação declarativa idioma para diagramação música.
Então você pode declarative-- pensar em coisas como HTML,
onde você não está dizendo-- HTML não diz como navegadores da Web devem
processar páginas passo a passo.
É só dizer isto é uma descrição textual
do que você deseja que a página para olhar como.
>> E então é também um programa de que compila essa linguagem,
ou ler o seu e, em seguida, na verdade, faz a diagramação para você,
e ele cospe estes maravilhosas partituras em PDF procura.
Você também pode obter formato PNG ou o que quer.
Uma boa maneira de pensar isto é, por analogia
LaTeX é que é uma espécie de LillyPond, mas por apenas typesetting comum.
Então, ao invés de-- não é WYSIWYG, o que você vê
É o que você, como, digamos Finale é, ou Sibelius,
ou Microsoft Word, onde você pode digitar tempo real e projectos de coisas em tempo real
e ver as mudanças instantaneamente.
>> Ele é baseado em texto.
Você tem que compilar o seu escores usando um programa separado
e sair PDFs mais tarde.
Isto é um pouco menos conveniente para o uso se você estiver
tentando escrever diretamente em uma pontuação e você está
tentar compor no computador.
Mas há uma série de vantagens para ele.
Um deles, que se parece muito mais agradável, porque pode realmente LillyPond
tomar o tempo para fazê- decisões de layout propriamente,
ao contrário de Sibelius ou Finale, que têm para fazer algoritmos tão comprometidos
que eles podem exibir as coisas em tempo real.
>> Então, por que é LilyPond-- computação gráfica é difícil.
Se você estiver fazendo qualquer coisa com música e você quer escrever partituras,
você não quer escrever fora tudo sozinho
começando com como desenhar equipes de funcionários e como desenhar notepads.
É muito difícil. Isso já foi feito antes.
Você está bem.
>> Se você quiser usar Finale ou Sibelius, os formatos de arquivo para essas coisas
são muito complicado, e você não pode realmente usá-los de forma programática.
Você pode abrir Sibelius com Finale e vá em File, Export as PDF mesmo,
mas você não pode realmente chamar isso de um script.
LillyPond, você pode chamar a partir desses scripts.
Você poderia facilmente fazer uma iteração LillyPond com LaTeX.
Eu não vou ter muito tempo para ir para essas tecnologias de agora,
mas eles existem.
Se você quer olhar em um livro LillyPond,
é um programa que vem com sua distribuição LillyPond,
e é para a iteração Fragmentos LillyPond em LaTeX
se você quiser fazer alguma coisa como um documento de grande musicologia
com exemplos, por exemplo.
E é uma boa habilidade para vida se você está fazendo nada
com música, não apenas CS50.
Eu usei LillyPond para todos dos meus projetos de composição
desde que eu era basicamente um sénior na escola.
>> Então, aqui estão alguns exemplos simples.
Este é basicamente representante do nível de dificuldade
que a maioria das pessoas enfrentá-lo que eles estavam tentando
usar LilyPond para projetos simples.
Este primeiro é o início a um prelúdio coral de Bach.
Este fundo é um excerto de uma de minhas próprias obras,
e é só lá para mostrar lhe coisas como [inaudível]
colocando várias linhas na mesma equipe, como lyric undersetting funciona.
Underlays líricos são uma coisa que é muito fácil de usar para LilyPond música coral.
>> E então há um pouco mais exemplos complicadas aqui.
Todos estes são feitos em LilyPond e eles são viáveis.
Este primeiro trecho é de [Inaudível] por [inaudível].
E isso [inaudível] de uma peça para baixo a solo
flauta por [inaudível], que é um longtime-- que
era um membro de longa data do departamento de música aqui, eu acho.
Eu não tenho certeza para onde ele foi para fora.
Mas ele era o conselheiro do Harvard Associação compositores por um longo tempo.
Homem maravilhoso.
E ele escreve uma música que tem muito notação complicado que LillyPond
pode, no entanto, lidar muito bem.
>> Então, só para lhe dar uma noção do que capacidades desta coisa tão é--
os internos do LillyPond são muito complicadas.
E você pode usá-lo para um longo período de tempo, incluindo
para alguns bastante complicado coisas, sem realmente
ter que saber muito sobre eles.
Mas a ideia básica é que na nível mais baixo, os átomos de LillyPonds
são as notas.
As notas contêm uma Contexto da chamada vozes.
Assim, o contexto de voz basicamente corresponde
a uma única linha de polifonia.
E, em seguida, pode ser contexto continham hierarquicamente
em os de nível superior que representam equipes na pontuação
ou agrupamentos maiores, como equipes de piano ou equipes coro,
e depois, eventualmente, contextos de pontuação inteiras.
E você pode realmente abranger várias dezenas em um livro.
>> E cada contexto tem um número de gravadores conectados.
Se você olhar através da conteúdo de um contexto
e imprimir um certo símbolo ou um certa classe de símbolos como necessário.
Então, para todos os contextos de voz, há [inaudível] notas
gravador que é basicamente uma função ou um objeto que escreve para fora toda a nota
cabeças sobre as peças certas de uma página.
Então há um gravador fenda, que escreve fissuras na pauta.
Depois, há um metrônomo marca de gravador que
escreve marcas metrônomo em uma pontuação.
E todos eles se encaixam bastante bem dentro da hierarquia.
E é muito, muito, muito customizável, o que você precisa
se você quiser fazer as coisas assim.
>> Assim, todos os contextos têm um monte de diferentes atributos
que você pode modificar para tudo do espaçamento para várias opções de fonte
seleção de tamanhos de coisas.
Se você quiser fazer ainda as coisas mais complicadas,
há uma linguagem de script embutido.
Eles usam esquema, que é dialeto do LISP.
Estes provavelmente não fazer significa nada para você.
Mas, basicamente, um esquema de outro funcional
linguagem de programação, mais ou menos.
>> STEPHEN Krewson: O tie-in.
>> CONNOR HARRIS: Yeah.
É um bom tie-in, eu suponho.
E ele é usado como língua de ensino, na verdade, para baixo Mass Ave. No MIT.
E é muito útil para LillyPond por várias razões técnicas.
>> E por isso, se você quiser fazer simples tweaks dependentes condicionais,
para example-- há certa condição de uma pontuação que conheceu,
fazer alterações ao layout ou então whatnot--
as instalações estão lá.
Eles são complicados.
Então aqui está um exemplo de código bem simples.
É cinco linhas.
Basicamente, eu estou definindo duas equipes.
É em 3/4.
A primeira equipe tem um anexado marca de tempo,
mas que está realmente acontecendo para ir para toda a partitura,
porque marcas de andamento estão no nível pontuação.
O gravador marca metrônomo está ligado a marcar contexto.
Há chaves diferentes, porque o [inaudível] gravador
está ligado as equipes.
Você pode realmente fazer é.
A amostra que eu escrevi é na verdade, em C major,
mas é apenas a demonstrar que você pode ter
chaves diferentes em diferentes equipes.
E a sintaxe básica é que você escreve Observe nomes com E, F, G, qualquer que seja.
Se você quer fazer acidentes, você sufixo é ou ES.
Este é de Holandês convenções musicologia.
>> E para fazer saltos de oitava, você tem que usar estas marcas de escala, vírgula ou apóstrofo.
A relativa significa apenas o que você tem uma nota,
ele será automaticamente plaec no oitava mais próximo da anterior.
E se você quiser saltar mais do que um fifth-- dizer um quinto ou more--
então você tem que usar o [inaudível].
Mas caso contrário, você não tem que especificar a oitava de cada nota.
>> E relativa C, prima, e C, você apenas especificar meio C
e base de C, especialmente primeiras notas.
Então você tem essas equipes que organizam estas duas vozes ou amostras de música,
e você tem uma pontuação.
E que se parece com isso.
>> Se você quiser ter o tempo para copiar esse exemplo de LillyPond
no código anterior deslize para baixo aqui, e você
pode escrever para LillyPond-se.
Eu sei que tenho algo que se parece muito com isso.
Portanto, há uma outra tecnologia XML chamado Música mantida
por pessoas completamente diferentes.
XML é um conjunto de dados textuais structure-- I não deveria dizer dados structure-- dizer
mapa metáfora mais ou menos.
E é projetado para segurar dados hierárquicos muito bem.
HTML, por exemplo, é um tipo de XML.
E você pode dizer XML porque eles tinha todos os sinais de menor e ângulo
marcas de suporte de barra que os campos com os dados.
>> Eu não tenho um código exemplo de XML Music.
Você pode encontrá-lo você mesmo.
Basicamente, a razão pela qual você pode querer usar XML como o estágio intermediário
é, antes de mais nada, é um formato de intercâmbio
para basicamente every-- eu não deveria dizer todos, mas um monte de pontuação diferente
escritoras.
Então, se você escrever em Música XML, não só pode LillyPond
lê-lo com a ajuda deste auxilary programa chamado XML Música para LY,
mas também pode ler Finale ele, Sibelius pode lê-lo.
Dependendo de como o objeto interno hierarquia trabalha para representar música,
pode ser mais fácil para escrever Música para XML do que LillyPond
e confiar apenas em XML Música LY para fazer a conversão.
>> Eu não acho que [inaudível] tem XML Music.
STEPHEN Krewson: Não faz.
Alguém está trabalhando nele, no entanto.
>> CONNOR HARRIS: OK.
Não Euterpea não tem um Função de saída XML da música no entanto.
Se você quer ter uma idéia final do projeto, talvez entrar em contato com caras
que Stephen sabe, e eles poderiam usar sua ajuda.
>> STEPHEN Krewson: Eu adoraria isso.
CONNOR HARRIS: Também, basicamente, cada linguagens de programação
que vale o seu sal já tem uma biblioteca XML,
assim você pode converter todo internamente de suas músicas em algum objeto
que a biblioteca XML pode escrever que exigiria menos
alterações à sua estrutura interna por qualquer música objetos você
quero escrever do que escrevê-lo diretamente no LillyPond faria.
Em seguida, basta imprimi-lo com XML com as bibliotecas XML em seu idioma,
que vai garantir que ele é sintaticamente correto e tudo mais,
e, em seguida, convertê-lo para LillyPond.
Assim, a tecnologia que você pode querer olhar em se você está fazendo algo
como isso.
>> [Inaudível], outro tecnologia auxilarry.
Este é basicamente Works tecnologia ou tecnologia Studio for LillyPond.
Por isso, oferece ajuda com sintaxe, com modelos
para vários comum combinações de instrumentos.
Ele permite a visualização de tela dividida de modo você pode ter o seu código em uma janela
e PDF em outra janela e clique em lugares do PDF
para saltar para a relevante spots em seu código-fonte.
Isso é mais útil se você está realmente escrita LillyPond arquivos você mesmo
do que se você está gerando -los programaticamente.
Mas, novamente, é algo útil para ter.
>> Ótimo.
Outra resources-- eu vou apenas passar por isso muito rapidamente.
LillyPond manuals-- LillyPond tem excelente documentação em seu site.
Eles têm um tutorial.
Eles têm uma referência de sintaxe.
Eles têm centenas de trechos para várias coisas pequenas
yo pode precisar fazer para demonstrar várias capacidades.
Se você deseja usar a linguagem de script
ou fazer mais extensa personalizações, então não há
internos de referência a que URL.
Se você quiser usar XML Music, há que URL, musicxml.com/tutorial.
>> E então se você precisa aprender esquema porque você realmente quer usar
as instalações de script em LillyPond, em seguida, há um [inaudível] chamado
Interpretação estruturado de Programas de Computador,
que é não só o segundo maior livro de CS nunca written--
encontrar-me mais tarde se você quer saber o que eu acho que o maior deles é--
mas também é muito bom introdução à linguagem adequada.
Você não vai precisar mais do que as primeiras seções.
>> E é isso.
Alguma pergunta?
>> ALUNO: Onde posso baixar Frere Jacques sua gerado
para que eu possa colocá-lo no meu iPod?
>> STEPHEN Krewson: Bem, você pode escrever para algum arquivo wav em Euterpea.
E você tem o código.
É no GitHub.
Faça as suas próprias variações de Frere Jacques por CS50 mente da colmeia.
Seria ótimo.
CONNOR HARRIS: Mais alguém?
STEPHEN Krewson: Precisamos uma melhor bumbo também.
É muito ruim.
>> ALUNO: Euterpea tem não só lado a composição, mas signal--
STEPHEN Krewson: Sim.
Na verdade, o trabalho que eu fez em Euterpea quando eu
tomou isto-- há uma graduar curso em Yale que
utiliza ele-- foi em síntese de som.
Portanto, não há realmente um maneira agradável usando as setas
e alguns da notação vimos de compondo juntos funções de sinal.
Em particular, o baixo para a maioria um deles é apenas uma onda senoidal simples.
Mas se você começar a compor aqueles de maneiras programáticas estranhos,
você pode obter som louco efeitos, como cascatas estranhas.
Você pode criar muito corajoso sons com uma grande quantidade de modulação.
>> Eu fiz um projeto sobre granular síntese, que é
em algum lugar entre FM e amostragem.
Você toma muito pequeno, amostras pequenas, e em seguida
combiná-los com algum tipo de modulador e construir-se um som mais rico.
Nós também fizemos modelagem física, de modo tentando pensar sobre a física
e psicoacústica de algo como trombeta, e pensar sobre a maneira
o som está saltando fora o sino da trombeta
e a acústica de o quarto e modelagem
com que os osciladores de base.
CONNOR HARRIS: Thanks so much.
Obrigado por terem vindo.
E eu estou sempre disposto a a perguntas por email--
connorharris@college.harvard.edu.
>> STEPHEN Krewson: Yeah. stephen.krewson@yale.edu.
Frio.