CONNOR HARRIS: Hola. Soy Connor Harris. Soy un CA CS50 en Harvard. STEPHEN Krewson: Soy Stephen Krewson. Soy un TF para CS50 en Yale. CONNOR HARRIS: Y vamos a hablar acerca de algunas tecnologías que podrían desee utilizar si te interesa en hacer un proyecto final o realmente nada con la música. Vamos a centrar en una primera lenguaje de programación llamado Haskell. Es un funcional idioma, por lo que el paradigma es muy diferente de C o PHP u otros lenguajes imperativos que usted ha utilizado ya, y en especial en una librería escrita en Haskell llamada Euterpea, que puede ayudar a las personas con la escritura de la música funcional, básicamente. Y Stephen le guiará a a través de un gran ejemplo de eso. Después de esto, voy a presentarles a algo que se llama LillyPond, que es una tecnología para la música archivos de texto. Es algo así como LaTeX por la música si alguno de ustedes han usado LaTeX para las clases de matemáticas o otras clases P puesto o lo que sea. Y así te voy a dar, una vez más, algunos ejemplos sencillos de que y señalarle en la general, dirección de algunos recursos mejores. STEPHEN Krewson: En Además, pensamos que sería genial para configurar un poco de consejos hacia un oleoducto entre Archivos MIDI Euterpea generados en LillyPond, por lo que ofrecemos alguna instrucción en guiones para hacer eso que son proporcionado con LillyPond sólo para mantenerlo de código abierto y obtener una tubería que va. CONNOR HARRIS: Una vez más, hay que destacar, estas dos tecnologías, que no tienen que utilizarlos juntos. No están diseñados para trabajar juntos, aunque lo hacen muy bien. STEPHEN Krewson: Correcto. Y totalmente gratis. CONNOR HARRIS: Así agradecimientos, que acaba de leer. STEPHEN Krewson: Debidamente señaló. Gracias a esa gente. Esto me va a quedarse en sólo un momento. El proceso de instalación es un poco complicado. Tenemos un leerme en la GitHub que se puede echar un vistazo a. Apenas envíeme un correo electrónico si usted tiene alguna pregunta. Pero vamos a correr esta bajo el supuesto que esto está trabajando para todo el mundo. CONNOR HARRIS: ¿Y si no puede obtener LillyPond funcione, no es gran cosa. No hay recopilatorio en vivo que estará involucrado, al menos en mi final. STEPHEN Krewson: Haskell y LillyPond debería ambos tienen instaladores. Euterpea se descarga como un paquete, así sucesivamente y así sucesivamente. Así que estamos hablando de música por ordenador. Y esto es sólo una muy vista 50.000 pies. Hay algunos aspectos diferentes de la misma. Y esto es duro y es va a ocultar algunos detalles. Pero podríamos pensar en algo como la composición algorítmica, utilizando algoritmos, utilizando el código, para generar algún tipo de-- tal vez un auto-similar secuencia de notas, o tal vez las notas bajo alguna restricción. Y a continuación, los que podrían ser realizado o interpretado con instrumentos analógicos ni nada de eso. Sin embargo, la composición era hecho algorítmicamente. Pero, por supuesto, tal vez el área de la música del ordenador o de la música digital estamos más familiarizados con es digital síntesis de sonido o muestreo digital y la grabación digital. Una gran cantidad de instrumentos digitales son hecho a través de muestreo digital. De hecho, vamos a estar usando uno de los de la forma de una biblioteca de fuentes de sonido más tarde. Pero también hay algo llamado síntesis digital que salió de finales de los años 70 y en los años 80 con Yamaha y John Chowning en Stanford hacer síntesis FM o Síntesis de modulación de frecuencia, en el que tuvo un portador señal y una señal de modulación tanto en el espectro de audio. Pero lo que estamos enfocados en hoy en día es algo que se llama MIDI, y por supuesto, la composición algorítmica. No vamos a hacer instrumentos, pero estamos en lugar de ir a hacer un poco de música, y luego de que obtendrá interpretado por algunos instrumentos que son conformes a la Norma General MIDI. Entonces, ¿qué es MIDI? No voy a profundizar demasiado en él, pero MIDI es un protocolo de transferencia de datos. Es una especie de guía a través de diferentes empresas e industrias para la organización de los sonidos o parches. Así que veremos que hay un estándar MIDI para todos los diferentes percusión sonidos y recomendaciones MIDI para todos los diferentes tipos de sintetizador o diferentes tipos de todo el instrumento grupos en una orquesta, dicen. Probablemente usted está familiarizado con 0 a 127 mensajes MIDI. Una señal MIDI es típicamente un bit que indica si se trata de un dato o una paquete de estado, y luego está siete bits de una señal. Y estos pueden controlar todo de volumen a la acción o la presión sobre una clave particular si usted está realizando con un MIDI controlador, así como, por supuesto, notas. Y, por supuesto, MIDI tiene sido de gran utilidad, porque es una forma de hilo juntos o cadena un grupo de dispositivos de hardware MIDI. Tengo siete u ocho años atrás en mi casa. Se pone muy complicado, pero es muy poderoso. Y es muy viejo. Es a partir de los años 80, y que es muy bonito y pequeño. CONNOR HARRIS: Sí. Todo el clásico de Nintendo videojuegos haría probablemente tener archivos MIDI para la música, por ejemplo. STEPHEN Krewson: He aquí un ejemplo de MIDI general mostrando MIDI como una especie del protocolo general. Y creo que podemos pensar en el diferencia entre la especificación que debe haber algo así como suena estos instrumentos y el real realización de esos instrumentos suena en una fuente de sonido o un MIDI en particular sintetizador como la diferencia entre tal vez un typeface-- que dice: en general, este es el diseño de de esta manera particular, para representar characters-- y una fuente en particular que tiene un tamaño y timbre específico, y no hay realización de el-- CONNOR HARRIS: Tal vez un mejor comparación sería ser el estándar Unicode says-- da un número para cada personaje, y realmente todos los idiomas del mundo, o un vasto conjunto de scripts del lenguaje en el mundo, y entonces esas son dictada en algo gráfica por diversos paquetes de fuentes. Y, obviamente, que se pueda imaginar MIDI como el Unicode de sonido. Y es sólo una lista de-- una gran corriente de los acontecimientos y los instrumentos y todo eso, y hay que tener una separada programa, como un tipo de letra, para hacer esto en algo que es audible. STEPHEN Krewson: Entonces, ¿por Haskell? Haskell es una programación funcional idioma, muy avanzado, muy diferente de C, muy diferente de PHP. Y vamos a ver que hay una facilidad de composición de funciones en Haskell que nos permitirá pasar rápidamente por componer o escribir arriba, transcribir, algo así como Frere Jacques, esta canción simple que tiene una gran cantidad de partes en este momento que son auto-similar o repetir. Así que esto va a ser algunos de la motivación de por qué estamos usando Haskell, en el que funciones son ciudadanos de primera clase. Y yo quería ampliar esto un poco. Es un poco fácil anotar Frere Jacques en Haskell. Pero lo que si queríamos añadir una parte de batería a ella? Lo que si queríamos intentar hacer algo así como un tambor de Roland 808 o 909 equipo en el que usted tiene aproximadamente 16 diferentes pasos? Por lo general, estos son pensado en notas como 16. Y usted puede controlar lo global tempo, y se puede seleccionar un montón de diferentes partes de percusión de bombo, un aplauso, diferentes trampas, sombreros altos abiertos y cerrados en este tipo de canales, y entonces usted puede ecualizar o ajustar su volumen. Y vamos a ver de una manera agradable en Haskell de representación de este paso secuenciador con toda la varias cosas interesantes en Haskell que podemos hacer con generar listas y filtrado de más de listas, mapeo sobre listas, la cartografía funciones más listas. Y una disculpa rápida. Esta es una muy somera y boceto excesivamente rápida de algunos de los aspectos de Haskell y Euterpea, que es un dominio específico- lenguaje incrustado escrito en Haskell para este tipo de música. Así que por favor revisar el código en línea. Arranca GHCi, que es el Glasgow Haskell Compiler intérprete. Y voy a estar haciendo algunos de esto en un poco para que pueda ver cómo se hace. Y esto le permite cargar con el-- la sintaxis es dos puntos y después El comando. Puede cargar en los archivos. Puede usar navegar en esos archivos para ver todas las funciones que existir en un módulo particular. Y luego, como veremos, los tipos y el tipo clases son tan importantes en Haskell, para que siempre pueda check-- especialmente si está trabajando en una nueva DSCL así, lo que es un tipo de música? Lo que sé sobre la forma numérica tipos trabajan en Haskell, pero yo no sé mucho de música. Pero usted puede explorar la forma en que son definido por el uso de este tipo de comando o t y luego llamar a un particular, función o un objeto de datos. CONNOR HARRIS: Sí. Si pensabas C y Clang fue hardass acerca de los tipos, usted no tiene idea acerca de Haskell. Lo bueno es que Haskell si usted puede conseguir su código para compilar y si los controles de tipo Haskell, es probable que sea correcto, debido a que el sistema de tipos es tan estricta. STEPHEN Krewson: Sí. Así que sólo quiero ir through-- y otra vez, esto no lo está haciendo justice-- algunas de las características de Haskell que, al menos a su creators-- y fue creado a finales de 1980 por un grupo de personas, una comisión de alrededor de 20 personas-- pensado eran importantes. Y lo primero que figuran en un documento que descrito la génesis de Haskell durante los primeros 20 años más o menos fue que era perezoso. Entonces, ¿qué significa esto? Bueno, significa que cuando tenemos algún tipo de expresión, hay que evaluarlo. Y Haskell hace de una llamada por la necesidad manera o de una manera no estricta. Es decir, si tenemos un montón de componentes de nuestra expresión, tratamos de retrasar la evaluación de esos subcomponentes hasta que la absoluta última minuto-- es decir, hasta que realmente los necesitamos. Así que este designa todas que es realmente genial, especialmente si estamos pensando en la abstracción de un paso secuenciador musical. Tu lo haces posible, y empiezas la ejecución de un paso sequence-- si alguna vez trabajó con un tambor automático-- y que sólo sirve para siempre. Así que sería muy bueno si nos podrían emular que en Haskell. Y podemos hacerlo con infinita valores, en particular las listas infinitas. Es muy fácil de escribir un lista infinita en Haskell. Usted sólo puede utilizar la sintaxis abajo aquí, donde se ve 1 a 3, quitar el punto punto 3 1, y es decir una lista infinita de todos los números naturales que se extiende en la medida de lo que puedas imaginar. Quiero introducir un concepto de pliegues de inmediato. Y de nuevo, el propósito de este seminario no es para aprender acerca de pliegues en Haskell o funciones de orden superior. Pero yo sólo quiero presentar a dar un sentido exacto de lo extraño Haskell es y lo poderoso que es. Y en particular, vamos a ser-- cuando hacemos nuestras diferentes partes de batería, vamos a estar manipulando listas de números, doblarlos una sobre otra. Y para hacer eso, vamos a ser el uso de mapas y pliegues. Hay un derecho asociativo pliegue, que es este derecho aquí-- 1 menos la cantidad, 2 menos la cantidad, 3 minus 0. Y la sintaxis de una veces, le das un pliegue un valor base y luego una operation-- en este caso, adición o sustracción. He mostrado ambos casos. Y luego está un acumulador que acumula más de toda la lista, aplicar ese plus operador o menos y, a continuación, la acumulación de la misma. Así que este será el-- si fuera llamado con pliegue r plus de 0, comenzando con 0, tendríamos entonces resumir todo los números en esa lista. Y eso es una lista de 1 a 3. CONNOR HARRIS: Así que para decirlo de otra manera, pliegue r toma tres argumentos. Hay una función que sí toma dos argumentos, entonces hay un valor de arranque, y hay una lista de valores. Y lo que se hace es tomar valor de arranque, primer valor, ponerlos en la función. ¿Qué se obtiene a cabo, tomar eso, alimentación que en la función de la segundo valor, lo que se obtiene, tener que alimentar que en el función de la tercera valor. Y entonces si usted va abajo toda esta lista de esta manera, usted va a conseguir con el tiempo algún valor singular que es del mismo tipo de lo que empezaste con y del mismo tipo como cosas en la lista y, a continuación eso es el resultado de retorno del pliegue R. STEPHEN Krewson: Así que, en particular, éstas son funciones de orden superior, porque están tomando otro función como uno de los argumentos. CONNOR HARRIS: Sí. Si ha utilizado algunos otros Las Lenguas sé R, [inaudible] lenguaje tiene esta, llamada Reducir. Es posible que tenga funciones similares en otros idiomas, acaba de llamar cosas diferentes. STEPHEN Krewson: Y lo bueno de pliegue R en este caso es que veces R puede trabajar con listas infinitas. Así que en este fondo, este P5 está generando las notas que se encienden en el secuenciador por pasos para alguna parte de batería, la quinta parte de batería, y tal vez se trata de una conga tambor o algo así. Y esta es una forma deliberada manera obtusa de escribir esto, pero es divertido, porque demuestra una gran cantidad cosas sobre Haskell y Euterpea. Así pliegue R de esta colon-- de colon es Sólo un operador que empuja cosas juntos en un películas-- pedido a un vacío lista, que es sólo los soportes vacíos. Y estoy llamando a que en esta lista infinita. Esto es en realidad dos listas suman aquí. La lista 1 comas 6 puntos dot es 1, 6, 11, 16. Así Haskell-- en solo unos pocos caracteres, puede generar la totalidad secuencia de números que son cinco números separados se extiende hasta el infinito. Y yo Anteponer para que este pequeño películas-- más corto 3, 8, 21-- sólo para mostrar cómo se puede concatenar listas. Y entonces he doblado sobre sí mismo. Y esto termina simplemente ser una especie de operación de identidad, pero es infinita. Y doble R puede hacer eso, porque perezosamente evalúa, como en el anterior. Si tenemos un 1 y un 2 y 3, podemos simplemente poner entre paréntesis la totalidad del resto de ella. Eso no va a funcionar para menos o más, pero trabajará para este de colon operación de la identidad en la lista. Entonces, ¿cómo usamos prácticamente que si tener una infinitamente larga lista de cosas? Bueno, Haskell proporciona una gran cantidad de functions-- y mirar más en estos en su tiempo-- como tomar que dice, está bien, estamos generar esta lista infinita, pero sólo vamos a tomar algún número de la misma y en este caso-- ya veremos esto más adelante en nuestra code-- caja de ritmos GM es sólo una especie de mundial variable para el número de pasos en el secuenciador. En las máquinas de rodillo-in me que mostraron, eso es por lo general 16, pero he implementado con 32. En realidad no importa. Haskell también es puro, por lo que tiene una fuerte tipos estáticos que Connor aludido. Así funciones son matemática en el sentido-- son más matemática que están garantizados a no acceder o cambiar cualquier tipo de variable o realizar entrada o salida. Así que si usted tiene una función, es determinista. Siempre va a devolver el mismo valor en el estado del programa o siendo el mismo. Hay, por supuesto, excepciones monádicos a esto, pero eso es más allá de nuestro alcance. CONNOR HARRIS: Sí. Lo que esto significa, sin embargo, está ahí son algunos importantes [inaudible] consecuencias de esto. Una de ellas es que es muy fácil paralelizar programas Haskell. Porque si usted tiene, decir, una función de ese tiene que operar en un millón de valores, si usted sabe que la función será siempre dar a conocer el mismo valor si usted alimenta a una cierta value-- si usted es [inaudible] f 1, f de 2, entonces f de 3 o whatnot-- f de 1 no va a escribir en un archivo o hacer algo que alterará el valor de f2. Usted sólo puede dividir esta función a un millón de máquinas diferentes o un millón diferentes hilos o lo que sea, obtener todas las respuestas de vuelta, obtener todos los valores de retorno espalda, y luego ya está. Así que es muy fácil de paralelizar cosas. Lo malo es que de entrada y la salida especialmente encajar en el sistema de tipos en formas muy complicadas. No vamos a entrar en eso ahora mismo, pero yo le animamos a mirar algunos recursos en línea si usted quiere aprender acerca de eso. STEPHEN Krewson: Así escriba classes-- y esto era-- clases de tipos se inventaron para resolver un problema de la sobrecarga de operadores. Así que queríamos tener la igualdad entre los diferentes tipos de cosas. Por supuesto, podríamos pensar de-- igualdad entre tipos numéricos es muy fácil de pensar, pero ¿qué pasa con la igualdad entre las listas? ¿Qué pasa con la igualdad entre estructuras de datos pierna árbol? Y todo esto es posible en Haskell por clases de tipos. Así que si se define un determinado type-- datos y aquí, estos son tonos musicales. Finalmente estamos consiguiendo un poco de música de ordenador. Así que tenemos C, C aguda, y así sucesivamente y así sucesivamente. Pertenecen a un grupo de diferentes clases de tipos. EQ-- que pertenecen a la clase de tipo de EQ. Eso significa que ellos apoyan operaciones de igualdad. Así que usted puede evaluar si un solo secuencia de primitivas musicales es el mismo que uno diferente. Pertenecen a la clase ordinal. Eso significa que hay un orden para estos. D se produce después de C. C aguda viene después de C también. Pertenecen a la clase mostrar, lo que significa que pueden imprimirse a una consola o terminal. Pertenecen a la clase enumerado, que significa que aunque estos son los personajes, tienen una numérico subyacente representación a partir de las 0 y salirse a través de embargo muchas cosas están aquí, 20 más o menos, o 30 o 40, tal vez. CONNOR HARRIS: Y cuando tenemos un tipo de datos que derives-- con esa palabra clave "deriving--" una cierta clase de tipo, significa que el compilador intentará construir algo automáticamente. Así que tal vez querrás definir una calidad diferente. Usted querrá definir Do sostenido como igual a D plana, por ejemplo. Con esta construcción aquí, no creo Do sostenido y plano D será igual, porque el compilador automáticamente decir que cada valor diferente posible es distinto de todos los demás. Por lo que es posible anular las implementaciones por defecto de estos tipos de clases. Una vez más, mira la referencia si quieres aprender sobre eso. STEPHEN Krewson: Y aquí, en realidad, esto va a ser útil para cuando codificamos después. Vemos algunos de los operadores infijos para la composición secuencial, composición paralela, y por lo tanto sucesivamente, estas ventajas y signos de igual rodeada por dos puntos. Eso significa que podemos jugar estos diferentes primitivas musicales uno tras otro. Esa es la composición secuencial. O podemos reproducirlos en paralelo al mismo tiempo. Así que puedo tener un valor musical, y luego esto es igual y dos puntos, infijo operador de composición paralela, y reproducirlos como un tipo de acorde. Y vamos a utilizar esto cuando combinamos nuestra parte de batería con nuestro cancioncita Frere Jacques jugar estas dos secuencias de valores musicales al mismo tiempo. Currying Curry es-- por última vez nombre de Haskell Curry, quien la imagen Haskell se nombra después. Y esto nos permite una agradable elegancia cuando estamos escribir todos estos diferentes funciones o filtros que estamos va a ser la cartografía sobre nuestras listas. Una función de dos arguments-- f de x e Y- se puede representar como f de x aplica a y. Así que es una función de la un argumento que devuelve otra función de un argumento. Así que esto significa que podemos asignar una función f de x sobre la lista de y de. CONNOR HARRIS: ¿Quieres dar un ejemplo de esto? STEPHEN Krewson: Sí. Tengo un ejemplo aquí desde algunas de las cosas que vamos a escribir. Así replicar 2-- así, replicar tendrá un valor, que es cuántos veces para replicar algo, y luego tomará un value-- por lo general una lista o algo. Así que aquí, estamos mapeo replicar 2 sobre otra lista. Así que si mapeamos replicar 2, si replicamos 2 aplica al primer elemento de este películas-- y estos son listas de phrases-- musical producirá dos de "usted sleeping--" así que estás durmiendo, estás durmiendo. Así que ahora tenemos dos. Pero la réplica necesitan dos argumentos, sino porque estamos currying y luego mapeo, podemos representar la réplica 2 como habiendo sido devuelta como una función de un solo argument-- simplemente replicando dos veces. Y luego estamos aplicando eso a cada uno elemento de esta lista de frases. Y concat es un Haskell operación para aplanar una lista. Debido a que la réplica 2 voluntad producir una lista de listas. Y esta es la forma intermedia aquí. Y así entonces podemos concat o aplanar que fuera dos veces. CONNOR HARRIS: Un simple ejemplo de currificación, si hubieras como-- imaginar f es sólo un función de multiplicación que tarda de dos argumentos y devuelve su producto. Así que si usted tiene una f 4 5, es 20. Pero usted puede pensar en esto como También-- usted tiene una función f 4 que toma un argumento y devoluciones cuatro veces este argument-- solo aplicación parcial que sólo un argumento 4. Y si usted alimenta f de 4 5, que le dará 20. Y eso es una simple ejemplo de currificación. Por lo general es uno de los libros de texto. STEPHEN Krewson: Lambda expresiones o funciones anónimas son otro sello distintivo de Haskell. Así que si tenemos que preparar una pequeña réplica vida función, pero dicen que no está en la biblioteca estándar, podemos utilizar una sintaxis similar a la siguiente. Y vamos a brisa sobre esto. Una cosa que usted verá un montón de en el caja de ritmos es que estamos haciendo llamadas a algo llamado filtrar, que al igual que antes, es una asignación de una función más de una lista, pero es una asignación de una función booleana. Así que aquí tenemos un ejemplo de una forma anónima función booleana que define sólo toma un par de valores. Esto no es estrictamente hablando una función anónima. Pero es definir con que la sintaxis por razones de brevedad, y esto sólo se necesita x módulo n-- CONNOR HARRIS: Sí. Así que f es una función de dos argumentos n y p que devuelve una función que es en sí misma una función de un argumento, a saber, x. STEPHEN Krewson: I operadores infijos mencionado. ¿Cuáles son los operadores infijos? Bueno, operadores infijos son los forma normal representamos operaciones, decir, en matemáticas-- 2 más 2 en lugar del operador más y luego dos argumentos 2 y 2. CONNOR HARRIS: Se llama notación polaca inversa, que es un término dudo alguno de ustedes sabría. STEPHEN Krewson: Correcto. Notación polaca inversa o prefijo. Pero Haskell decidió utilizar operadores infijos. Así que estos son algunos de los personalizados que se definen para la Euterpea DSCL en Haskell. Así que esta era la composición secuencial. Este fue composición paralela, y esto fue truncando composición paralela. Y necesitaremos que con nuestra caja de ritmos, porque vamos a utilizar la última operador en ese pequeño tupla no a tocar la caja de ritmos a lo largo con nuestra canción Frere Jacques. Y nuestra caja de ritmos es va a ser infinito. Simplemente juega siempre. Pero la canción Frere Jacques no lo es. No es tanto tiempo. Es sólo un par de bares. Así que tenemos que detener la caja de ritmos como pronto como el valor musical más corta viene a su fin. Y ese operador infijo es super servicial con eso. Y infijo notación como esto es un poco agradable, porque dice que tiene una función como cita, la cual da la división entera de x por algo else-- lo siento, eso debería ser a y b. Se puede escribir como una cita de b. Así que si usted es elemento put-- Otro ejemplo de esto. x elemento de alguna lista, si pones en acentos abiertos, usted puede utilizarlo. A pesar de que no es un símbolo como más o menos o los tiempos, se puede utilizar el nombre de una función como la de acentos abiertos como operador infijo, que está muy bien. CONNOR HARRIS: Una vez más, esto es todo el azúcar solo sintáctica, la verdad. No afecta el núcleo del lenguaje. STEPHEN Krewson: Así que vemos aquí por el última frase de nuestra canción Frere Jacques, Jugué algunos pequeños acordes o terceras partes que utilizan la composición paralela operador. Esta es otra forma de decir alguna de lo que hemos estado diciendo. Así que usted puede asignar funciones de un argumento sobre listas. CONNOR HARRIS: Una vez más, las referencias los libros de texto introductorios Haskell-- tendrá todo esto en el mismo. STEPHEN Krewson: Así que aquí está un muy línea clave del secuenciador por pasos vamos a echar un vistazo a utilizar una comprensión lista. Y vemos aquí es que el elemento en el operador fija entre comillas espalda. Así que si x es un elemento de la lista de xy, entonces nos van a llamar a funciones perc. Así perc es sólo una función de percusión. Se necesita algo de valor de p que es parte del conjunto acotado de todos los diferentes sonidos de percusión que vimos en una diapositiva anterior, y luego se da esa duración de una negra. De lo contrario le da un regiones QNR y regiones QNR es sólo un descanso negra. Así que esto es la construcción de algo agradable. Tenemos una lista de elementos, y Vamos a lazo sobre alguna lista de uno al valor máximo de nuestra secuenciador por pasos. Y cuando estamos en un i particular esa lista de uno al valor máximo, si i es un miembro de esta conjunto creado en esta función, bien, entonces nos convertimos en una nota de percusión. De lo contrario, sólo jugamos un descanso, que es decir, sólo guardamos silencio. Y podemos ver aquí que en esta sintaxis comprensión lista, x está poblada por esta Lista construido un solo con el tamaño global del secuenciador. CONNOR HARRIS: Sí. La sintaxis básica de listas por comprensión es soporte, el valor de la participación Algunas variables, bar, posibles valores de las variables sí mismos, cerrado soporte. Y si usted ha hecho fijar la notación constructor en cualquier tipo de clase de matemáticas, es posible que haya configurado 2n tales que n es en o n está en z. Similar cosa-- esta notación está destinado a ser sugerente de que la notación matemática. STEPHEN Krewson: Y usted puede aplicar múltiples predicados y varios filtros en una lista comprensión, que es bastante agradable. Algebraica que Tipos-- no perdurará mucho tiempo aquí. No es una buena idea en Haskell o una buena noción obvia de cómo tomar, digamos, un default parámetro a una función o algo así. En Python, esto es bastante fácil. Usted sólo puede decir con iguales en la declaración de la función, un valor por defecto en caso de que ninguno se suministra. En Haskell, podría tal vez utilizar tal vez el tipo, tal vez, que tiene ya sea nada o un valor de tipo sólo una. Así que aprovechamos esto en la caja de ritmos que nos permita dar volumen opcional parámetros a cada una de las partes de batería. Así que eso nos da una manera de tener EQ o un volumen en un canal en particular. CONNOR HARRIS: En Otros ejemplos Haskell, Es posible que vea puede ser usado para funciones que pueden fallar. Esta es una pregunta común. STEPHEN Krewson: Y usted puede suministrar algún tipo de mensaje de error por defecto. Y eso es especialmente útil cuando que está haciendo la E / S en Haskell. Eso puede ser trucos. CONNOR HARRIS: O para un ejemplo similar, piensa de una función que implica la división de un parámetro que podría ser 0. Y esa función podía volver tal vez lo que sea. Así que si no hay división por 0, volverá simplemente lo que sea. Y si hay división por 0, devolverá nada como una forma de señalización del error. Debido a que una de las consecuencias de Muy estricta tipificación de Haskell es que no hay real-- excepciones son torpes, básicamente, manejo de errores es torpe. Y esta es una muy forma común de hacerlo. STEPHEN Krewson: Así que ahora tenemos a otra cosa endiablada sobre Haskell, que es el patrón definiciones coincidentes y función. He mostrado en la última diapositiva del declaración de la secuencia de pasos función, que tuvo un mejor valor, a continuación, un int, a continuación, una lista de enteros, a continuación, devuelve una secuencia de los valores de la música allí anotados tanto con el tono y volumen. Así que los tres argumentos pueden ser patrón emparejado de la siguiente manera. Y siempre queremos estar seguros de que hacer un caso base o caja de salida primero. Y estos guiones bajos solo puede interpretarse para referirse a cualquier valor que está ahí. Así que si recibimos una llamada al paso de secuencia con algún valor, algún otro valor, y luego la lista vacía, lo que queremos volver es sólo silencio, un resto 0. Y en lugar de que siendo una lista vacía o 0, es un resto 0, porque somos tratar con el tipo de música, y la lista vacía de la música tipo es sólo un resto de ninguna duración. No es la música. Y luego vemos si conseguimos un paso secuenciar con un v para el argumento de volumen, p para instrumento de precaución argumento, y luego una lista de las x. A continuación hacemos algunas cosas. En particular, se aplica esta lista por comprensión, y realizamos algunos operaciones sobre el valor tal vez para convertirlo en un valor numérico para que se podría entonces enumeró y utilizado para seleccionar el instrumento. Una vez más, esto es un poco poco deliberadamente inconcise sólo para mostrar todas las cosas raras usted puede hacer en Haskell como usted echar un vistazo a él en su propio tiempo. Correcto. Así que estamos finalmente llegar a hacemos lo que nos propusimos hacer, que es hacer algo de música por ordenador. Así que vamos a tratar de hacer la canción Frere Jacques. Así que hay cuántos frases en Frere Jacques? Cuatro. Excelente. Y lo que es interesante es que todos están repetidos la misma cantidad de veces, que es de dos. Así que tenemos cuatro frases cada repetirá dos veces. Y, en particular, están en una ronda. Y hay muchos, muchas maneras de implementar una ronda que podría ser divertido de hacer. Lo he hecho en un bonita forma sencilla aquí, que es sólo para construct-- la línea función toma una lista de valores de la música y lo convierte en la composición secuencial mediante la aplicación de esa composición secuencial operador. Y entonces me demoro las diferentes partes haciéndoles comienzan con un descanso. Así que empiezo con un descanso de dos medidas, y luego un resto de cuatro medidas, y luego un resto de las seis medidas, y luego la ronda funciona, como todos sabemos esta canción. Vemos dos anotaciones o modificaciones de los valores de la música que están contenidos en este secuencial disposición de los elementos de la música. Tenemos un volumen add. Esta es una función para anotar música con un volumen particular. Este es un buen ejemplo de una señal de funcionamiento MIDI de 0 a 127, los siete bits de información que puede ser llevado. Y entonces-- lo vimos muy brevemente, pero el general MIDI lista de todos los diferentes instrumentos. Y no hay un montón de ellos. Si utiliza una estación de trabajo de audio digital, como Ableton Live o Pro Tools, hay una gama muy amplia de sintetizadores e instrumentos VST. Pero sólo el estándar MIDI tiene una docena de pocos, o varios. Y algunos de ellos son divertidos. Pensé que sería divertido si jugamos el instrumento del instrumento MIDI helicóptero, y luego el el próximo paso a través de la ronda, hicimos un sintetizador almohadilla, y luego de este plomo cursi sintetizador de onda cuadrada, y luego expresar exudado, que son una poco confuso en mi mala MIDI sintetizador, pero en Aceptar. Y luego vemos este let y en la sintaxis de Haskell, y entonces nos estamos jugando todas estas partes juntas con el operador de composición paralela. Y probablemente podríamos mostrar algo de esto. Aquí está el código. Y se puede ver en C, que habría un gran cantidad de aclarar la garganta y el ajuste el código de la tabla antes de podría hacer música como esta. O cualquier otra programación idioma, lo que probablemente tener que interactuar con algún tipo de biblioteca o API y configurar todo, y entonces usted tiene que limpiar. Pero aquí, en Haskell es, creo, una vez que el cuelgue de ella, increíblemente legible y muy expresivo. Así que no es la implementación de Frere Jacques. Correcto. Ahora queremos añadir percusión, y esto es un poco más desordenado bits. Así que echemos un vistazo a las diapositivas. Así que la gran idea es hacer un montón de listas o partes. En las máquinas de rodillo-in, eran típicamente de aproximadamente unos ocho 10 de ritmo o percusión partes. Y a continuación, utilizar un montón de técnicas. Y hemos hablado de these-- usando pliegues, filtros, funciones lambda, asignada sobre las listas de generar valores en cierto rango de 1 a r, r es 16, o 32 pasos en el secuenciador. Y luego si hay un valor en la lista ya que estamos corriendo por el secuenciador, corriendo a través de una y más, se convierte en esa nota, y que la muestra se desencadena. Le mostramos las diferentes maneras extrañas Se me ocurrió para generar notas. Pruébalo en tu propia suma semi. Va a sonar fresco. El tiempo lo permite, vamos a ir a través de este. Pero por ahora, supongo debemos demostración de lo que tenemos. Esperemos que esto va en Aceptar. Así que esto es GHCi. Y vamos a cargar un archivo He llamado song.lhs, que es el archivo que acabo de mostrar. Vale genial. Como Connor dijo anteriormente, compilado, tipo marcada, así que puedo respirar mucho más fácil. No va a estallar en mí. Yo quiero mostrarte algo útil. Se puede ver que un módulo cargado llama 50. Usted puede navegar a ese módulo. Y esto es tan agradable acerca doing-- quizá lo que estás haciendo en Haskell no es llamado desarrollo de software, pero se puede hacer un montón de diversión cosas por su cuenta. Y el flujo de trabajo es muy agradable ya en comparación con un montón de otras lenguas, porque se puede ver en una realidad forma legible por lo que está pasando. Así vemos que tenemos todas estas frases, que son listas de lanzamientos de música y, a continuación, nos construir estas arriba en algo más grande, que es una canción de la música. Es una unidad musical. Y luego podemos jugar todo esto con una función llamada reproducción de música. Se puede ver que aquí abajo. Que se acaba de jugar. Debo decir-- Yo no hablo de este signo de dólares que está en todas partes. Signo de dólar es otro operador infijo. Pero tiene la prioridad más baja de cualquier operador, lo que efectivamente significa que todo en la izquierda del signo de dólar y la derecha de la muestra de dólar, vamos a conseguir evaluado antes. Así que es algo así como otra manera de añadir paréntesis. CONNOR HARRIS: Es básicamente composición de funciones. Y asegura que no tener-- si Tiene funciones de cada lado o infijo operadores de ambos lados, no lo harán asociar a través de ella y darle resultados inesperados. STEPHEN Krewson: Así que can-- usar eso, podemos llamar. En primer lugar, vamos a jugar sin los tambores. Ese es el helicóptero, el helicóptero MIDI. [REPRODUCCIÓN DE MÚSICA] Ahí está la onda cuadrada. El exudado voz. Y realmente se puede ir salvaje con este. Elegí un muy simple, porque sabía que no debía morder más de lo que podía masticar. Sólo tienes que mantener bastante simple para mostrar las ideas principales. Pero entonces yo estaba como, tenemos tiene que añadir algunos tambores para esto. El hecho de que se trata de una poco impenetrable, y yo no hice uso de la nombre de las partes de batería, Me asignan ellos-- porque son parte de esa clase enumerado, Yo les asignan a ints. Uno de ellos es como un bombo. Cero es así. Siete es un sombrero alto. Y hasta aquí donde el funciones se ponen un poco más al azar, estos son como las congas. Así que si usted piensa sobre-- tal vez un forma divertida de poner en práctica una caja de ritmos es utilizar muy ordenado patrones en el bombo. Así, por ejemplo, en el filtrado sobre el lista con todo lo que le da la espalda un 1 cuando se toma del módulo 04. Así que me sale 1, 5, 9, 13, 17-- por lo que este es el primer tiempo de cada compás. Y entonces este es el mismo cosa cambió en dos etapas. Así que esa es la poco convencional. Así que esto sería algo así como un sombrero alto. Y, de nuevo, aquí abajo, que es un poco al azar, porque estamos haciendo congas. Y tengo algunas maracas abajo, también. Así que podría llamar a juego caja de ritmos, pero sería seguir para siempre, y podría empezar a agarrar hasta toda la memoria en mi sistema. Así que voy a llamar a esta función reproducir música, que como veremos, utilizar la composición paralela truncando jugar nuestra pequeña canción Frere Jacques junto con esta caja de ritmos raro. Así que vamos a echar un vistazo. Y por favor, mejorar mi disposición de todas las partes de batería. No es mi especialidad, pero yo tenía un montón de diversión de hacerlo. [REPRODUCCIÓN DE MÚSICA] Así que por supuesto, todo esto es un poco, no tan divertido si no podemos convertirlo a una puntuación así que tal vez podría interpretarse por un intérprete humano. Así que no voy a correr aquí. Yo ya he generado los archivos. Se puede ver que hay un dot LilyPond file-- y esto será mi segue a Connor-- y un archivo de puntos MIDI, y un archivo PDF de puntos, que es lo que LilyPond en última instancia generar. Pero estos son los guiones, y voy a simplemente correr con sus opciones de ayuda. Si recibe estos marcha con Euterpea, puede generar un archivo MIDI. Y a continuación, desde el archivo MIDI con este programa MIDI 2LY, puede generar un lirio Archivo de la charca, y entonces usted puede generar un PDF de la partitura. Y deberíamos echar un vistazo a esto. Así que Connor probablemente mostrar cómo anotar esto mejor, pero esto es Frere Jacques como generada por mí en Euterpea. Es sólo en C. Yo debería haber figurado lo que el hack en realidad en. Pero esa es la tubería para cómo se hace eso con eso. Vamos a hablar más sobre LilyPond. CONNOR HARRIS: OK Vamos a ver. ¿Sabía usted menciona Aprenda Usted Haskell? STEPHEN Krewson: Ah, sí. Echa un vistazo a Aprender Usted Haskell. Está en los recursos. Así es como empecé aprendizaje, y es genial. El aprendizaje no tonto. CONNOR HARRIS: Así que es en línea. Así que un tipo llamado [inaudible] learnyouahaskell.com, sin espacios. La gramática es enfermo. STEPHEN Krewson: Es ilustrado, también. CONNOR HARRIS: Entonces, ¿qué es LilyPond? Es una programación declarativa idioma para componer tipo de música. Así declarative-- puedas pensar en cosas como HTML, donde no estás diciendo-- HTML no dice cómo los navegadores web debe render páginas paso a paso. Es sólo decir esto es una descripción textual de lo que quiere la página para que parezca. Y entonces es también un programa que compila esta lengua, o leer su adentro y luego en realidad hace la composición tipográfica para usted, y escupe estos maravillosas que buscan partituras en formato PDF. También puede obtener el formato PNG o lo que sea. Una buena manera de pensar de esto es por analogía es que LaTeX es algo así como LillyPond, pero por sólo tipografía ordinaria. Así que en lugar de-- no es WYSIWYG, lo que ves Es lo que obtienes, como, por ejemplo Finale es, o Sibelius, o Microsoft Word, donde puede escribir en tiempo real y los proyectos de las cosas en tiempo real y ver los cambios instantáneamente. Se basa texto. Usted tiene que compilar su puntajes utilizando un programa separado y salir archivos PDF más tarde. Esto es un poco menos conveniente para el uso si eres tratando de escribir directamente en una puntuación y ya está tratando de componer en el equipo. Pero hay una gran cantidad de ventajas para ello. Uno, que tiene un aspecto mucho más agradable, porque LillyPond puede en realidad tomar el tiempo para hacer las decisiones de diseño de forma adecuada, a diferencia de Sibelius o Finale, que tienen para hacer algoritmos comprometidos de manera que pueden mostrar cosas en tiempo real. Así que ¿por qué es LilyPond-- gráficos por ordenador es difícil. Si usted está haciendo algo con la música y quiere escribir partituras, usted no desea escribir cabo todo por sí mismo empezando por cómo dibujar personal y cómo dibujar cuadernos. Es muy difícil. Se ha hecho antes. Estás bien. Si desea utilizar Finale o Sibelius, los formatos de archivo para esas cosas son muy complicados, y no se puede realmente utilizarlos mediante programación. Puede abrir Sibelius con Finale y vaya a Archivo, Exportar como PDF a ti mismo, pero usted no puede realmente llamar a que a partir de un guión. LillyPond, puede llamar al de esos guiones. Usted podría repetir fácilmente LillyPond con LaTeX. No voy a tener mucho tiempo para ir en estas tecnologías en este momento, pero existen. Si usted quiere ver en un libro LillyPond, es un programa que viene con su distribución LillyPond, y es para la iteración Fragmentos LillyPond en LaTeX si quieres hacer algo como un documento grande musicología con ejemplos, por ejemplo. Y es una buena habilidad para vida si estás haciendo nada con la música, no sólo CS50. He usado LillyPond para todos de mis proyectos de composición desde que era básicamente un último año de secundaria. Así que aquí están algunos ejemplos sencillos. Esto es básicamente representativa del nivel de dificultad que la mayoría de la gente enfrentarlo estaban tratando utilizar LilyPond para proyectos simples. Este primero es el principio a un preludio coral de Bach. Este fondo es un extracto de uno de mis propias obras, y es justo allí para mostrar usted cosas como [inaudible] poniendo varias líneas en el mismo personal, cómo letra undersetting funciona. Underlays líricos son una cosa que es muy fácil de usar LilyPond para la música coral. Y entonces hay algo más ejemplos complicados aquí. Todo esto se hace en LilyPond y son factibles. Este primer extracto es de [Inaudible] por [inaudible]. Y esto [inaudible] de una pieza para el bajo solista flauta por [inaudible], que es un longtime-- que era un miembro de largo plazo de la departamento de música aquí, creo. No estoy seguro de dónde ha ido a. Pero él era el asesor de la Universidad de Harvard Asociación de Compositores durante mucho tiempo. Hombre maravilloso. Y escribe un poco de música que tiene muy notación complicada que LillyPond no obstante, puede manejar muy bien. Así que para darle un sentido de lo las capacidades de esta cosa tan son-- el funcionamiento interno de LillyPond son muy complicados. Y usted puede utilizarlo para un largo tiempo, incluyendo para algunos bastante complicado cosas, sin realmente tener que saber mucho acerca de ellos. Pero la idea básica es que en el nivel más bajo, los átomos de LillyPonds son las notas. Las notas contienen una contexto llamados voces. Así el contexto de voz básicamente corresponde a una sola línea de la polifonía. Y luego contexto puede ser contenida jerárquicamente en los de más alto nivel que representar personal en la puntuación o agrupaciones más grandes, como personal de piano o el personal del coro, y luego, eventualmente contextos puntuación enteras. Y en realidad se puede abarcar múltiples cuentas en un libro. Y cada contexto tiene una número de grabadores conectados. Si se mira a través de la contenido de un contexto e imprimir un cierto símbolo o una cierta clase de símbolos como necesario. Así que para todos los contextos de voz, hay [inaudible] notas grabador que es básicamente una función o un objeto que escribe toda la nota cabezas en las partes correctas de una página. Luego hay un grabador leporino, que escribe cabo hendiduras en el personal. Entonces hay un metrónomo marca grabador que escribe a cabo indicaciones de metrónomo en una partitura. Y todos éstos encajan bastante bien en la jerarquía. Y es muy, muy, muy personalizable, lo que usted necesita si usted quiere conseguir cosas por el estilo. Así que todos los contextos tienen un gran cantidad de diferentes atributos que se puede modificar para todo, a partir de la separación a diversos fuente selección de tamaños de cosas. Si quieres hacer aún las cosas más complicadas, hay un lenguaje de scripting embebido. Utilizan esquema, que es el dialecto de LISP. Estos probablemente no lo hacen significa nada para ti. Pero, básicamente, un esquema otra funcional lenguaje de programación, más o menos. STEPHEN Krewson: El tie-in. CONNOR HARRIS: Sí. Es un buen tie-in, supongo. Y se utiliza como lengua de enseñanza, de hecho, hasta la misa Ave. En el MIT. Y es muy útil para LillyPond por diversas razones técnicas. Y por lo que si usted desea hacer sencilla ajustes que dependen de los condicionales, por ejemplo-- que hay cierta condición de una partitura que se reunió, realizar modificaciones a la diseño o whatnot-- continuación esas instalaciones están ahí. Son complicados. Así que aquí está un ejemplo de código bastante simple. Es cinco líneas. Básicamente, estoy definiendo dos personales. Está en 3.4. El primer equipo cuenta con una adjunta marca el tempo, pero eso es en realidad va para pasar a toda la partitura, porque las marcas de tempo están en el marcador equilibrado. El grabador marca de metrónomo Se adjunta para anotar contexto. Hay diferentes llaves, porque el [inaudible] grabador Se adjunta el personal. En realidad se puede hacer es. La muestra que escribí es realidad en do mayor, pero es sólo para demostrar que puede tener diferentes claves en diferentes varas. Y la sintaxis básica es que escribes señalar nombres con E, F, G, lo que sea. Si usted quiere hacer alteraciones, usted sufijo es o ES. Esto es de holandés convenciones musicológicos. Y para hacer saltos de octava, usted tiene que utilizar estas garrapatas marcas, coma o apóstrofo. La relativa sólo significa lo que tengas una nota, automáticamente se plaec en el octava más cercana a la anterior. Y si usted quiere saltar más un fifth-- decir un quinto o más-- entonces usted tiene que utilizar el [inaudible]. Pero por lo demás, no tiene que especificar la octava de cada nota. Y en relación C, primer y C, que acaba de especificar Do central y la base C, especialmente primeras notas. Entonces usted tiene estas varas que organizan estas dos voces o muestras de música, y usted tiene una cuenta. Y eso se ve así. Si usted quiere tomar el tiempo para copiar esa muestra de LillyPond código de la anterior deslizarse por aquí, y usted puede escribirlo para LillyPond ti mismo. Yo sé que tenemos algo que se parece mucho a esto. Así que hay otra tecnología mantuvo llamado XML Música por personas completamente diferentes. XML es que unos datos textuales structure-- No debería decir los datos structure-- dicen mapa metáfora más o menos. Y está diseñado para mantener datos jerárquicos muy bien. HTML, por ejemplo, es un tipo de XML. Y se puede decir XML porque tenía todos los soportes de ángulo y ángulo marcas de barra soporte que los campos de datos muestran. Yo no tengo un código ejemplo de Música XML. Usted puede encontrar usted mismo. Básicamente, la razón es posible que desee para usar XML como la etapa intermedia es, primero de todo, es un formato de intercambio para básicamente every-- no debería decir todos, pero un montón de puntuación diferente escritores. Así que si usted escribe en la Música XML, no sólo puede LillyPond leer con la ayuda de este auxilary programa llamado XML Música para LY, sino también Finale puede leer que, Sibelius puede leerlo. Dependiendo de cómo su objeto interno jerarquía trabaja para la representación de la música, podría ser más fácil que escribir la música XML que a LillyPond y sólo se basan en XML Música a LY para hacer la conversión. No creo que [inaudible] tiene XML Música. STEPHEN Krewson: No lo hace. Alguien está trabajando en ello, sin embargo. CONNOR HARRIS: OK. Euterpea no tiene Función de salida XML Música todavía. Si quieres una idea final del proyecto, tal vez ponerse en contacto con los chicos que Esteban lo sabe, y que podrían utilizar su ayuda. STEPHEN Krewson: Me encantaría eso. CONNOR HARRIS: También, básicamente, cada lenguajes de programación eso es que se precie ya cuenta con una biblioteca de XML, lo que puede convertir internamente todo de su música en un objeto que la biblioteca XML puede escribir que requeriría menos alteraciones en su estructura interna por cualquier música que objetos quiero escribir que escribirlo directamente en LillyPond haría. A continuación, sólo imprimirlo con XML con las bibliotecas XML en su idioma, que garantice que es sintácticamente correcta y todo, y luego convertirlo a LillyPond. Así que la tecnología es posible que desee mirar en si usted está haciendo algo Me gusta esto. [Inaudible], otro tecnología auxilarry. Esto es básicamente Tech Obras o Tech Estudio en LillyPond. Por lo tanto, ofrece ayuda con sintaxis, con plantillas común para varios combinaciones de instrumentos. Permite pantalla dividida de visualización de manera usted puede tener su código en una ventana y pdf en una ventana y haga clic sobre los lugares en el PDF para saltar a la correspondiente lugares en su código fuente. Esto es más útil si usted está realmente escritura LillyPond archivos a ti mismo que si usted está generando mediante programación. Pero, de nuevo, es algo útil a tener. Excelente. Otra resources-- sólo voy a pasar por esto muy rápidamente. LillyPond manuals-- LillyPond tiene excelente documentación en su sitio web. Tienen un tutorial. Tienen una referencia de sintaxis. Tienen cientos de fragmentos para varias cosas pequeñas yo puede ser que necesite hacer para demostrar diversas capacidades. Si desea utilizar el lenguaje de scripting o hacer más extensa personalizaciones, entonces no funcionamiento interno de referencia a esa URL. Si desea utilizar XML Música, hay esa URL, musicxml.com/tutorial. Y entonces, si usted necesita aprender esquema porque en realidad se desea utilizar las instalaciones de scripting en LillyPond, entonces hay una [inaudible] llama Interpretación Estructurado de programas de ordenador, que no sólo es la segunda mayor libro de texto CS nunca written-- encontrarme después si usted quiere saber lo que creo que el más grande es-- pero también es una muy buena introducción a la lengua propia. Usted no necesitará más de las primeras secciones. Y eso es. ¿Alguna pregunta? ESTUDIANTE: ¿Dónde puedo descargar tu generada Frere Jacques para que pueda ponerla en mi iPod? STEPHEN Krewson: Bueno, puede escribir a algún archivo wav en Euterpea. Y usted tiene el código. Es en GitHub. Haga sus propias variaciones de Frere Jacques por CS50 mente colmena. Sería grandioso. CONNOR HARRIS: ¿Alguien más? STEPHEN Krewson: Necesitamos una mejor bombo, también. Es realmente malo. ESTUDIANTE: Euterpea tiene no sólo el lado composición, pero signal-- STEPHEN Krewson: Sí. De hecho, el trabajo que hizo en Euterpea cuando tomó esto-- hay una Curso de Postgrado en la Universidad de Yale que utiliza it-- estaba en la síntesis de sonido. Así que hay una realidad buena manera de utilizar las flechas y algunos de la notación que vimos de componer juntos funciones de señal. En particular, el bajo para la mayoría de ellos es sólo una onda sinusoidal simple. Pero si empiezas a componer los en formas programáticas extraños, usted puede conseguir sonido loco efectos, como cascadas extraños. Puede crear muy valiente sonidos con una gran cantidad de modulación. Hice un proyecto sobre granular síntesis, que es en algún lugar entre FM y muestreo. Se toma muy pequeña, pequeñas muestras, y luego combinarlos con algún tipo de modulador y crear un sonido más rico. También hicimos el modelado físico, por lo que tratando de pensar acerca de la física y psicoacústica de algo así como una trompeta, y pensando en el camino el sonido esta saltando la campana de la trompeta y la acústica de la habitación y el modelado que con los osciladores básicos. CONNOR HARRIS: Muchas gracias. Gracias por venir. Y yo siempre estoy dispuesto a responder preguntas por email-- connorharris@college.harvard.edu. STEPHEN Krewson: Sí. stephen.krewson@yale.edu. Guay.