CONNOR HARRIS: Hola. Sóc Connor Harris. Sóc un CA CS50 a Harvard. STEPHEN Krewson: Sóc Stephen Krewson. Sóc un TF per CS50 a Yale. CONNOR HARRIS: I parlarem sobre algunes tecnologies que podrien voleu fer servir si t'interessa en fer un projecte final o realment res amb la música. Centrarem en una primera llenguatge de programació anomenat Haskell. És un funcional idioma, de manera que el paradigma és molt diferent de C o PHP o altres llenguatges imperatius que vostè ha utilitzat ja, i especialment en una llibreria escrita en Haskell anomenada Euterpea, que pot ajudar a les persones amb l'escriptura de la música funcional, bàsicament. I Stephen us guiarà a a través d'un gran exemple d'això. Després d'això, vaig a presentar a cosa que es diu LillyPond, que és una tecnologia per a la música arxius de text. És una cosa així com LaTeX per la música si algun de vostès han fet servir LaTeX per a les classes de matemàtiques o altres classes P lloc o el que sigui. I així et donaré, un cop més, alguns exemples senzills que i assenyalar en la general, direcció d'alguns recursos millors. STEPHEN Krewson: En A més, pensem que seria genial per configurar una mica de consells cap a un oleoducte entre Arxius MIDI Euterpea generats en LillyPond, de manera que oferim alguna instrucció en guions per fer això que són proporcionat amb LillyPond només per mantenir-lo de codi obert i obtenir una canonada que va. CONNOR HARRIS: Un cop més, cal destacar, aquestes dues tecnologies, que no han de utilitzar-los junts. No estan dissenyats per treballar junts, encara que ho fan molt bé. STEPHEN Krewson: Correcte. I totalment gratis. CONNOR HARRIS: Així agraïments, que acaba de llegir. STEPHEN Krewson: Degudament assenyalar. Gràcies a aquesta gent. Això em va quedar-se a només un moment. El procés d'instal·lació és una mica complicat. Tenim un llegir-me en la GitHub que es pot fer una ullada a. Tot just envieu-me un correu electrònic si vostè té alguna pregunta. Però anem a córrer aquesta sota el supòsit que això està treballant per a tothom. CONNOR HARRIS: ¿I si no pot obtenir LillyPond funcioni, no és gran cosa. No hi ha recopilatori en viu que estarà involucrat, almenys en el meu final. STEPHEN Krewson: Haskell i LillyPond hauria dos tenen instal·ladors. Euterpea es descarrega com un paquet, així successivament i així successivament. Així que estem parlant de música per ordinador. I això és només una molt vista 50.000 peus. Hi ha alguns aspectes diferents de la mateixa. I això és dur i és va a amagar alguns detalls. Però podríem pensar en alguna cosa com la composició algorítmica, utilitzant algoritmes, utilitzant el codi, per generar algun tipus de-- potser un acte-similar seqüència de notes, o potser les notes sota alguna restricció. I a continuació, els que podrien ser realitzat o interpretat amb instruments analògics ni res d'això. No obstant això, la composició era fet algorítmicament. Però, és clar, potser l'àrea de la música de l'ordinador o de la música digital estem més familiaritzats amb és digital síntesi de so o mostreig digital i la gravació digital. Una gran quantitat d'instruments digitals són fet a través de mostreig digital. De fet, estarem usant un dels de la forma d'una biblioteca de fonts de so més tard. Però també hi ha una cosa anomenada síntesi digital que va sortir de finals dels anys 70 i en els anys 80 amb Yamaha i John Chowning a Stanford fer síntesi FM o Síntesi de modulació de freqüència, en el qual va tenir un portador senyal i un senyal de modulació tant en l'espectre d'àudio. Però el que estem enfocats en avui dia és una cosa que es diu MIDI, i per descomptat, la composició algorísmica. No farem instruments, però estem en lloc d'anar a fer una mica de música, i després que obtindrà interpretat per alguns instruments que són conformes a la Norma General MIDI. Llavors, què és MIDI? No vaig a aprofundir massa en ell, però MIDI és un protocol de transferència de dades. És una espècie de guia a través de diferents empreses i indústries per a l'organització dels sons o pegats. Així que veurem que hi ha un estàndard MIDI per a tots els diferents percussió sons i recomanacions MIDI per a tots els diferents tipus de sintetitzador o diferents tipus de tot l'instrument grups en una orquestra, diuen. Probablement vostè està familiaritzat amb 0 a 127 missatges MIDI. Un senyal MIDI és típicament un bit que indica si es tracta d'una dada o un paquet d'estat, i després hi set bits d'un senyal. I aquests poden controlar tot de volum a l'acció o la pressió sobre una clau particular si vostè està fent amb un MIDI controlador, així com, per descomptat, notes. I, per descomptat, MIDI té estat de gran utilitat, perquè és una forma de fil junts o cadena un grup de dispositius de maquinari MIDI. Tinc set o vuit anys enrere a casa meva. Es posa molt complicat, però és molt poderós. I és molt vell. És a partir dels anys 80, i que és molt bonic i petit. CONNOR HARRIS: Sí. Tot el clàssic de Nintendo videojocs faria probablement tenir arxius MIDI per a la música, per exemple. STEPHEN Krewson: Heus aquí un exemple de MIDI general mostrant MIDI com una mena del protocol general. I crec que podem pensar en el diferència entre l'especificació que ha d'haver alguna cosa així com sona aquests instruments i el real realització d'aquests instruments sona en una font de so o un MIDI en particular sintetitzador com la diferència entre potser un typeface-- que diu: en general, aquest és el disseny de d'aquesta manera particular, per a representar characters-- i una font en particular que té una mida i timbre específic, i no hi ha realització d'ell-- CONNOR HARRIS: Potser una millor comparació seria ser l'estàndard Unicode says-- dóna un nombre per a cada personatge, i realment tots els idiomes del món, o un vast conjunt d'scripts del llenguatge al món, i llavors aquestes són dictada en alguna cosa gràfica per diversos paquets de fonts. I, òbviament, que es pugui imaginar MIDI com l'Unicode de so. I és només una llista de-- un gran corrent dels esdeveniments i els instruments i tot això, i cal tenir una separada programa, com un tipus de lletra, per fer això en cosa que és audible. STEPHEN Krewson: Llavors, per Haskell? Haskell és una programació funcional idioma, molt avançat, molt diferent de C, molt diferent de PHP. I veurem que hi ha una facilitat de composició de funcions en Haskell que ens permetrà passar ràpidament per compondre o escriure a dalt, transcriure, una mena de Frere Jacques, aquesta cançó simple que té una gran quantitat de parts en aquest moment que són auto-similar o repetir. Així que això va a ser alguns la motivació de per què estem usant Haskell, en el qual funcions són ciutadans de primera classe. I jo volia ampliar això una mica. És una mica fàcil anotar Frere Jacques en Haskell. Però el que si volíem afegir una part de bateria a ella? El que si volíem intentar fer una mena tambor de Roland 808 o 909 equip en el qual vostè ha aproximadament 16 diferents passos? En general, aquests són pensat en notes com 16. I vostè pot controlar el global tempo, i es pot seleccionar un munt de diferents parts de percussió de bombo, un aplaudiment, diferents trampes, barrets alts oberts i tancats en aquest tipus de canals, i llavors vostè pot equalitzar o ajustar el seu volum. I anem a veure d'una manera agradable a Haskell de representar aquest pas seqüenciador amb tota la diverses coses interessants a Haskell que podem fer amb generar llistes i filtrat de més de llistes, mapatge sobre llistes, la cartografia funcions més llistes. I una disculpa ràpida. Aquesta és una molt succinta i esbós excessivament ràpida d'alguns dels aspectes d'Haskell i Euterpea, que és un domini específic- llenguatge incrustat escrit en Haskell per a aquest tipus de música. Així que si us plau revisar el codi en línia. Arrenca GHCi, que és el Glasgow Haskell Compiler intèrpret. I vaig a estar fent alguns d'això en una mica perquè pugui veure com es fa. I això li permet carregar amb ell-- la sintaxi és dos punts i després la comanda. Pot carregar en els arxius. Feu servir navegar en aquests arxius per veure totes les funcions que existir en un mòdul particular. I després, com veurem, els tipus i el tipus classes són tan importants en Haskell, perquè sempre pugui check-- especialment si està treballant en una nova DSCL així, el que és un tipus de música? El que sé sobre la forma numèrica tipus treballen en Haskell, però jo no sé molt de música. Però vostè pot explorar la forma en què són definit per l'ús d'aquest tipus de comandament o t i després trucar a un particular, funció o un objecte de dades. CONNOR HARRIS: Sí. Si pensaves C i Clang va ser hardass sobre els tipus, vostè no té idea sobre Haskell. El millor és que Haskell si vostè pot aconseguir el seu codi per compilar i si els controls de tipus Haskell, és probable que sigui correcte, pel fet que el sistema de tipus és tan estricta. STEPHEN Krewson: Sí. Així que només vull anar through-- i una altra, això no ho està fent justice-- algunes de les característiques d'Haskell que, almenys al seu creators-- i va ser creat a finals de 1980 per un grup de persones, una comissió d'al voltant de 20 persones-- pensat eren importants. I el primer que figuren en un document que es descriu la gènesi d'Haskell durant els primers 20 anys més o menys va ser que era mandrós. Llavors, què vol dir això? Bé, significa que quan tenim algun tipus d'expressió, cal avaluar-lo. I Haskell fa d'una trucada per la necessitat manera o d'una manera no estricta. És a dir, si tenim un munt de components de la nostra expressió, tractem de retardar l'avaluació d'aquests subcomponents fins que l'absoluta última minut-- és a dir, fins que realment els necessitem. Així que aquest designa totes que és realment genial, especialment si estem pensant en l'abstracció d'un pas seqüenciador musical. Tu ho fas possible, i comences l'execució d'un pas sequence-- si alguna vegada va treballar amb un tambor automático-- i que només serveix per sempre. Així que seria molt bo si ens podrien emular que en Haskell. I podem fer-ho amb infinita valors, en particular les llistes infinites. És molt fàcil d'escriure un llista infinita en Haskell. Vostè només pot utilitzar la sintaxi baix aquí, on es veu 1 a 3, treure el punt punt 3 1, i és a dir una llista infinita de tots els nombres naturals que s'estén en la mesura del que puguis imaginar. Vull introduir un concepte de plecs immediatament. I de nou, el propòsit d'aquest seminari no és per aprendre sobre plecs en Haskell o funcions d'ordre superior. Però jo només vull presentar a donar un sentit exacte del que és estrany Haskell és i el poderós que és. I en particular, anem a ser-- quan fem les nostres diferents parts de bateria, estarem manipulant llistes de nombres, doblegar una sobre l'altra. I per fer això, anem a ser l'ús de mapes i plecs. Hi ha un dret associatiu plec, que és aquest dret aquí-- 1 menys la quantitat, 2 menys la quantitat, 3 minus 0. I la sintaxi d'una vegades, li dónes un plec un valor base i després una operation-- en aquest cas, addició o sostracció. He mostrat tots dos casos. I després hi ha un acumulador que acumula més de tota la llista, aplicar aquest plus operador o menys i, a continuació, l'acumulació de la mateixa. Així que aquest serà ell-- si fos cridat amb plec r plus de 0, començant amb 0, tindríem llavors resumir tot els números en aquesta llista. I això és una llista d'1 a 3. CONNOR HARRIS: Així que per dir-ho d'una altra manera, plec r pren tres arguments. Hi ha una funció que si pren dos arguments, llavors hi ha un valor d'arrencada, i hi ha una llista de valors. I el que es fa és prendre valor d'arrencada, primer valor, posar-los en la funció. Què s'obté a terme, prendre això, alimentació que en la funció de la segon valor, el que s'obté, haver d'alimentar que en el funció de la tercera valor. I llavors si vostè va avall tota aquesta llista d'aquesta manera, vostè va a aconseguir amb el temps algun valor singular que és del mateix tipus del que vas començar amb i del mateix tipus com coses a la llista i, a continuació això és el resultat de retorn del plec R. STEPHEN Krewson: Així que, en particular, aquestes són funcions d'ordre superior, perquè estan prenent un altre funció com un dels arguments. CONNOR HARRIS: Sí. Si ha utilitzat alguns altres Les Llengües sé R, [inaudible] llenguatge té aquesta, anomenada Reduir. És possible que tingui funcions similars en altres idiomes, acaba de trucar coses diferents. STEPHEN Krewson: I el bo de plec R en aquest cas és que vegades R pot treballar amb llistes infinites. Així que en aquest fons, aquest P5 està generant les notes que s'encenen en el seqüenciador per passos per a alguna part de bateria, la cinquena part de bateria, i potser es tracta d'una conga tambor o alguna cosa així. I aquesta és una forma deliberada manera obtusa d'escriure això, però és divertit, perquè demostra una gran quantitat coses sobre Haskell i Euterpea. Així plec R d'aquesta colon-- de còlon és Només un operador que empeny coses junts en un pel·lícules-- demanat a un buit llista, que és només els suports buits. I estic trucant al fet que en aquesta llista infinita. Això és en realitat dues llistes sumen aquí. La llista 1 comes 6 punts dot és 1, 6, 11, 16. Així Haskell-- en només uns pocs caràcters, pot generar la totalitat seqüència de nombres que són cinc números separats s'estén fins a l'infinit. I jo Anteposar perquè aquest petit pel·lícules-- més curt 3, 8, 21-- només per mostrar com es pot concatenar llistes. I llavors he doblegat sobre si mateix. I això acaba simplement ser una mena de operació d'identitat, però és infinita. I doble R pot fer això, perquè mandrosament avalua, com en l'anterior. Si tenim un 1 i un 2 i 3, podem simplement posar entre parèntesis la totalitat de la resta d'ella. Això no funcionarà per menys o més, però treballarà per a aquest de còlon operació de la identitat a la llista. Llavors, com fem servir pràcticament que si tenir una infinitament llarga llista de coses? Bé, Haskell proporciona una gran quantitat de functions-- i mirar més en aquests en seva temps-- com prendre que diu, està bé, estem generar aquesta llista infinita, però només anem a portar el número de la mateixa i en aquest cas-- ja veurem això més endavant en la nostra code-- caixa de ritmes GM és només una espècie de mundial variable per al nombre de passos en el seqüenciador. En les màquines de corró-in me que van mostrar, això és en general 16, però he implementat amb 32. En realitat no importa. Haskell també és pur, pel que té una forta tipus estàtics que Connor al·ludit. Així funcions són matemàtica en el sentit-- són més matemàtica que estan garantits a no accedir o canviar qualsevol tipus de variable o realitzar entrada o sortida. Així que si vostè té una funció, és determinista. Sempre va a tornar el mateix valor en l'estat del programa o sent el mateix. Hi ha, per descomptat, excepcions monádicos a això, però això és més enllà del nostre abast. CONNOR HARRIS: Sí. El que això significa, però, hi és són alguns importants [inaudible] conseqüències d'això. Una d'elles és que és molt fàcil paralelizar programes Haskell. Perquè si vostè té, dir, una funció d'aquest ha d'operar en un milió de valors, si vostè sap que la funció serà sempre donar a conèixer el mateix valor si vostè alimenta una certa value-- si vostè és [inaudible] f 1, f de 2, llavors f de 3 o whatnot-- f d'1 no va a escriure en un arxiu o fer alguna cosa que alterarà el valor de f2. Vostè només pot dividir aquesta funció a un milió de màquines diferents o un milió diferents fils o el que sigui, obtenir totes les respostes de tornada, obtenir tots els valors de retorn esquena, i després ja està. Així que és molt fàcil de paral·lelitzar coses. El dolent és que d'entrada i la sortida especialment encaixar en el sistema de tipus en formes molt complicades. No entrarem en això ara mateix, però jo l'animem a mirar alguns recursos en línia si vostè vol aprendre sobre això. STEPHEN Krewson: Així escrigui classes-- i això era-- classes de tipus es van inventar per resoldre un problema de la sobrecàrrega d'operadors. Així que volíem tenir la igualtat entre els diferents tipus de coses. Per descomptat, podríem pensar de-- igualtat entre tipus numèrics és molt fàcil de pensar, però ¿Què passa amb la igualtat entre les llistes? Què passa amb la igualtat entre estructures de dades cama arbre? I tot això és possible en Haskell per classes de tipus. Així que si es defineix un determinat type-- dades i aquí, aquests són tons musicals. Finalment estem aconseguint una mica de música d'ordinador. Així que tenim C, C aguda, i així successivament i així successivament. Pertanyen a un grup de diferents classes de tipus. EQ-- que pertanyen a la classe de tipus d'EQ. Això vol dir que ells donen suport operacions d'igualtat. Així que vostè pot avaluar si un sol seqüència de primitives musicals és el mateix que un de diferent. Pertanyen a la classe ordinal. Això vol dir que hi ha un ordre per a aquests. D es produeix després C. C aguda ve després de C també. Pertanyen a la classe mostrar, el que significa que poden imprimir-se a una consola o terminal. Pertanyen a la classe enumerat, que significa que encara que aquests són els personatges, tenen una numèric subjacent representació a partir de les 0 i sortir a través d'embargament moltes coses són aquí, 20 més o menys, o 30 o 40, potser. CONNOR HARRIS: I quan tenim un tipus de dades que derives-- amb aquesta paraula clau "deriving--" una certa classe de tipus, vol dir que el compilador intentarà construir alguna cosa automàticament. Així que potser voldràs definir una qualitat diferent. Vostè voldrà definir Do sostingut com igual a D plana, per exemple. Amb aquesta construcció aquí, no crec Do sostingut i plànol D serà igual, perquè el compilador automàticament dir que cada valor diferent possible és diferent de tots els altres. Pel que és possible anul·lar les implementacions per defecte d'aquests tipus de classes. Un cop més, mira la referència si vols aprendre sobre això. STEPHEN Krewson: I aquí, en realitat, això va a ser útil per quan codifiquem després. Veiem alguns dels operadors infixos per a la composició seqüencial, composició paral·lela, i per tant successivament, aquests avantatges i signes d'igual envoltada per dos punts. Això vol dir que podem jugar aquests diferents primitives musicals un darrere l'altre. Aquesta és la composició seqüencial. O podem reproduir-los en paral·lel al mateix temps. Així que puc tenir un valor musical, i després això és igual i dos punts, infix operador de composició paral·lela, i reproduir-los com una mena de d'acord. I utilitzarem això quan combinem la nostra part de bateria amb el nostre cançoneta Frere Jacques jugar aquestes dues seqüències de valors musicals al mateix temps. Currying Curry és-- per última vegada nom d'Haskell Curry, qui la imatge Haskell es nomena després. I això ens permet una agradable elegància quan estem escriure tots aquests diferents funcions o filtres que estem serà la cartografia sobre les nostres llistes. Una funció de dues arguments-- f de x i I- es pot representar com f de x s'aplica a i. Així que és una funció de la un argument que retorna una altra funció d'un argument. Així que això significa que podem assignar una funció f de x sobre la llista de i de. CONNOR HARRIS: Vols donar un exemple d'això? STEPHEN Krewson: Sí. Tinc un exemple aquí des algunes de les coses que anem a escriure. Així replicar 2-- així, replicar tindrà un valor, que és quants vegades per replicar alguna cosa, i després prendrà 1 value-- en general una llista o alguna cosa. Així que aquí, estem mapatge replicar 2 sobre una altra llista. Així que si mapeamos replicar 2, si repliquem 2 s'aplica al primer element d'aquest pel·lícules-- i aquests són llistes de phrases-- musical produirà 2 de "vostè sleeping--" així que estàs dormint, estàs dormint. Així que ara tenim dos. Però la rèplica necessiten 2 arguments, sinó perquè estem currying i després mapatge, podem representar la rèplica 2 com una vegada tornada com una funció de un sol argument-- simplement replicant dues vegades. I després estem aplicant això a cadascun element d'aquesta llista de frases. I concat és un Haskell operació per aplanar una llista. A causa de que la rèplica febrer voluntat produir una llista de llistes. I aquesta és la forma intermèdia aquí. I així llavors podem concat o aplanar que fos dues vegades. CONNOR HARRIS: Un simple exemple de currificación, si haguessis com-- imaginar f és només un funció de multiplicació que triga de dos arguments i retorna el seu producte. Així que si vostè té una f maig 4, és 20. Però vostè pot pensar en això com També- vostè té una funció f 4 que pren un argument i devolucions quatre vegades aquest argument-- només aplicació parcial que només un argument abril. I si vostè alimenta f de 4 5, que li donarà 20. I això és una simple exemple de currificación. En general és un dels llibres de text. STEPHEN Krewson: Lambda expressions o funcions anònimes són un altre segell distintiu de Haskell. Així que si hem de preparar una petita rèplica vida funció, però diuen que no està en la biblioteca estàndard, podem utilitzar una sintaxi similar a la següent. I anem a brisa sobre això. Una cosa que vostè veurà un munt de al caixa de ritmes és que estem fent trucades a una cosa anomenada filtrar, que igual que abans, és una assignació d'una funció més d'una llista, però és una assignació d'una funció booleana. Així que aquí tenim un exemple d'una manera anònima funció booleana que defineix només pren un parell de valors. Això no és estrictament parlant una funció anònima. Però és definir amb que la sintaxi per raons de brevetat, i això només es necessita x mòdul N-- CONNOR HARRIS: Sí. Així que f és una funció de dos arguments n i p que retorna una funció que és en si mateixa una funció d'un argument, és a dir, x. STEPHEN Krewson: I operadors infixos esmentat. Quins són els operadors infixos? Bé, operadors infixos són els forma normal representem operacions, dir, en matemàtiques-- 2 més 2 en lloc de l'operador més i després dos arguments 2 i 2. CONNOR HARRIS: Es diu notació polonesa inversa, que és un terme dubto algun de vostès sabria. STEPHEN Krewson: Correcte. Notació polonesa inversa o prefix. Però Haskell decidir utilitzar operadors infixos. Així que aquests són alguns els personalitzats que es defineixen per a la Euterpea DSCL en Haskell. Així que aquesta era la composició seqüencial. Aquest va ser composició paral·lela, i això va ser truncant composició paral·lela. I necessitarem que amb la nostra caixa de ritmes, perquè utilitzarem l'última operador en aquest petit tupla no a tocar la caixa de ritmes al llarg amb la nostra cançó Frere Jacques. I la nostra caixa de ritmes és serà infinit. Simplement juga sempre. Però la cançó Frere Jacques no ho és. No és tant de temps. És només un parell de bars. Així que hem de detenir la caixa de ritmes com aviat com el valor musical més curta ve a la seva fi. I aquest operador infix és super servicial amb això. I infix notació com això és una mica agradable, perquè diu que té una funció com cita, la qual dóna la divisió entera de x per alguna cosa else-- ho sento, això hauria de ser a i b. Es pot escriure com una cita de b. Així que si vostè és element put-- Un altre exemple d'això. x element d'alguna llista, si poses en accents oberts, vostè pot utilitzar-lo. Tot i que no és un símbol com més o menys o els temps, es pot utilitzar el nom d'una funció com la d'accents oberts com a operador infix, que està molt bé. CONNOR HARRIS: Un cop més, això és tot el sucre només sintàctica, la veritat. No afecta el nucli del llenguatge. STEPHEN Krewson: Així que veiem aquí pel última frase de la nostra cançó Frere Jacques, Vaig jugar alguns petits acords o terceres parts que utilitzen la composició paral·lela operador. Aquesta és una altra manera de dir alguna del que hem estat dient. Així que vostè pot assignar funcions d'un argument sobre llistes. CONNOR HARRIS: Un cop més, les referències els llibres de text introductoris Haskell-- tindrà tot això en el mateix. STEPHEN Krewson: Així que aquí està una molt línia clau del seqüenciador per passos anem a fer una ullada a utilitzar una comprensió llista. I veiem aquí és que l'element en l'operador fixa entre cometes esquena. Així que si x és un element de la llista de xi, llavors ens van a cridar a funcions perc. Així perc és només una funció de percussió. Es necessita una mica de valor de p que és part del conjunt acotat de tots els diferents sons de percussió que vam veure en una diapositiva anterior, i després es dóna aquesta durada d'una negra. En cas contrari li dóna un regions QNR i regions QNR és només un descans negra. Així que això és la construcció d'alguna cosa agradable. Tenim una llista d'elements, i Anem a llaç sobre alguna llista d'un al valor màxim de la nostra seqüenciador per passos. I quan estem en un i particular aquesta llista d'un al valor màxim, si i és un membre d'aquesta conjunt creat en aquesta funció, bé, llavors ens convertim en una nota de percussió. Altrament, només juguem un descans, que és a dir, només guardem silenci. I podem veure aquí que en aquesta sintaxi comprensió llista, x està poblada per aquesta Llista construït un sol amb la mida global del seqüenciador. CONNOR HARRIS: Sí. La sintaxi bàsica de llistes per comprensió és suport, el valor de la participació Algunes variables, bar, possibles valors de les variables si mateixos, tancat suport. I si vostè ha fet fixar la notació constructor en qualsevol tipus de classe de matemàtiques, és possible que hi hagi configurat 2n tals que n és en o n està en z. Similar cosa-- aquesta notació està destinat a ser suggerent que la notació matemàtica. STEPHEN Krewson: I vostè pot aplicar múltiples predicats i diversos filtres en una llista comprensió, que és bastant agradable. Algebraica que tipus-- no perdurarà molt de temps aquí. No és una bona idea en Haskell o una bona noció òbvia de com prendre, diguem, un default paràmetre a una funció o alguna cosa així. En Python, això és bastant fàcil. Vostè només pot dir amb iguals en la declaració de la funció, un valor per defecte en cas que cap es subministra. En Haskell, podria potser utilitzar potser el tipus, potser, que té ja sigui res o un valor de tipus només un. Així que aprofitem això a la caixa de ritmes que ens permeti donar volum opcional paràmetres a cadascuna de les parts de bateria. Així que això ens dóna una manera de tenir EQ o un volum en un canal en particular. CONNOR HARRIS: En Altres exemples Haskell, És possible que vegi pot ser usat per funcions que poden fallar. Aquesta és una pregunta comuna. STEPHEN Krewson: I vostè pot subministrar algun tipus de missatge d'error per defecte. I això és especialment útil quan que està fent la I / S en Haskell. Això pot ser trucs. CONNOR HARRIS: O per a un exemple similar, pensa d'una funció que implica la divisió d'un paràmetre que podria ser 0. I aquesta funció podia tornar potser el que sigui. Així que si no hi ha divisió per 0, tornarà simplement el que sigui. I si hi ha divisió per 0, retornarà res com una forma de senyalització de l'error. A causa que una de les conseqüències de Molt estricta tipificació d'Haskell és que no hi ha real-- excepcions són maldestres, bàsicament, maneig d'errors és maldestre. I aquesta és una molt forma comuna de fer-ho. STEPHEN Krewson: Així que ara tenim a una altra cosa endimoniada sobre Haskell, que és el patró definicions coincidents i funció. He mostrat en l'última diapositiva del declaració de la seqüència de passos funció, que va tenir un millor valor, a continuació, un int, a continuació, una llista d'enters, a continuació, retorna una seqüència de els valors de la música allà anotats tant amb el to i volum. Així que els tres arguments poden ser patró aparellat de la següent manera. I sempre volem estar segurs que fer un cas base o caixa de sortida primer. I aquests guions baixos només pot interpretar-se per referir-se a qualsevol valor que hi és. Així que si rebem una trucada al pas de seqüència amb algun valor, algun altre valor, i després la llista buida, el que volem tornar és només silenci, una resta 0. I en lloc que sent una llista buida o 0, és una resta 0, perquè som tractar amb el tipus de música, i la llista buida de la música tipus és només una resta de cap durada. No és la música. I després veiem si aconseguim un pas seqüenciar amb un v per l'argument de volum, p per a instrument de precaució argument, i després una llista de les x. A continuació fem algunes coses. En particular, s'aplica aquesta llista per comprensió, i vam realitzar alguns operacions sobre el valor potser per convertir-lo en un valor numèric perquè es podria llavors va enumerar i utilitzat per seleccionar l'instrument. Un cop més, això és una mica poc deliberadament inconcise només per mostrar totes les coses rares vostè pot fer en Haskell com vostè fer una ullada a ell en el seu propi temps. Tot bé. Així que estem finalment arribar a fem el que ens vam proposar fer, que és fer una mica de música per ordinador. Així que anem a tractar de fer la cançó Frere Jacques. Així que hi ha quants frases en Frere Jacques? Quatre. Gran. I el que és interessant és que tots estan repetits la mateixa quantitat de vegades, que és de dos. Així que tenim quatre frases cada repetirà dues vegades. I, en particular, estan en una ronda. I n'hi ha molts, moltes maneres d'implementar una ronda que podria ser divertit de fer. Ho he fet en un bonica forma senzilla aquí, que és només per construct-- la línia funció pren una llista de valors de la música i el converteix en la composició seqüencial mitjançant l'aplicació d'aquesta composició seqüencial operador. I llavors em demoro les diferents parts fent-los comencen amb un descans. Així que començo amb un descans de dues mesures, i després una resta de quatre mesures, i després una resta de les sis mesures, i després la ronda funciona, com tots sabem aquesta cançó. Veiem dues anotacions o modificacions dels valors de la música que estan continguts en aquest seqüencial disposició dels elements de la música. Tenim un volum add. Aquesta és una funció per anotar música amb un volum particular. Aquest és un bon exemple d'un senyal de funcionament MIDI de 0 a 127, els set bits de informació que pot ser portat. I llavors-- ho vam veure molt breument, però el general MIDI llista de tots els diferents instruments. I no hi ha un munt d'ells. Si utilitzeu una estació de treball d'àudio digital, com Ableton Live o Pro Tools, hi ha una gamma molt àmplia de sintetitzadors i instruments VST. Però només l'estàndard MIDI té una dotzena de pocs, o varis. I alguns d'ells són divertits. Vaig pensar que seria divertit si juguem l'instrument de l'instrument MIDI helicòpter, i després el el proper pas a través de la ronda, vam fer un sintetitzador coixinet, i després de aquest plom cursi sintetitzador d'ona quadrada, i després expressar exsudat, que són una mica confús en la meva mala MIDI sintetitzador, però a D'acord. I després veiem aquest let i en la sintaxi d'Haskell, i llavors ens estem jugant totes aquestes parts juntes amb l'operador de composició paral·lela. I probablement podríem mostrar una mica d'això. Aquí està el codi. I es pot veure en C, que hi hauria un gran quantitat d'aclarir la gola i l'ajust el codi de la taula abans de podria fer música com aquesta. O qualsevol altra programació idioma, el que probablement haver d'interactuar amb algun tipus de biblioteca o API i configurar tot, i llavors vostè ha de netejar. Però aquí, a Haskell és, crec, un cop que el pengi d'ella, increïblement llegible i molt expressiu. Així que no és la implementació de Frere Jacques. Tot bé. Ara volem afegir percussió, i això és una mica més desordenat bits. Així que donem una ullada a les diapositives. Així que la gran idea és fer un munt de llistes o parts. En les màquines de corró-in, eren típicament d'aproximadament uns vuit 10 de ritme o percussió parts. I a continuació, utilitzar un munt de tècniques. I hem parlat de these-- usant plecs, filtres, funcions lambda, assignada sobre les llistes de generar valors en cert rang d'1 a r, r és 16, o 32 passos en el seqüenciador. I després si hi ha un valor a la llista ja que estem corrent pel seqüenciador, corrent a través d'una i més, es converteix en aquesta nota, i que la mostra es desencadena. Li mostrem les diferents maneres estranyes Es va acudir per generar notes. Prova-ho en la teva pròpia suma semi. Va a sonar fresc. El temps ho permet, anirem a través d'aquest. Però per ara, suposo hem demostració del que tenim. Esperem que això va en D'acord. Així que això és GHCi. I anem a carregar un fitxer He trucat song.lhs, que és l'arxiu que acabo de mostrar. D'acord perfecte. Com Connor va dir anteriorment, compilat, tipus marcada, així que puc respirar molt més fàcil. No va a esclatar en mi. Jo vull mostrar alguna cosa útil. Es pot veure que un mòdul carregat diu 50. Vostè pot navegar a aquest mòdul. I això és tan agradable sobre doing-- potser el que estàs fent en Haskell no és anomenat desenvolupament de programari, però es pot fer un munt de diversió coses pel seu compte. I el flux de treball és molt agradable ja en comparació amb un munt d'altres llengües, perquè es pot veure en una realitat forma llegible pel que està passant. Així veiem que tenim totes aquestes frases, que són llistes de llançaments de música i, a continuació, ens construir aquestes amunt en alguna cosa més gran, que és una cançó de la música. És una unitat musical. I després podem jugar tot això amb una funció anomenada reproducció de música. Es pot veure que aquí baix. Que s'acaba de jugar. He de dir-- Jo no parlo de aquest signe de dòlars que està a tot arreu. Signe de dòlar és altre operador infix. Però té la prioritat més baixa de qualsevol operador, el que efectivament significa que tot en l'esquerra del signe de dòlar i la dreta de la mostra de dòlar, aconseguirem avaluat abans. Així que és una cosa així com una altra manera d'afegir parèntesis. CONNOR HARRIS: És bàsicament composició de funcions. I assegura que no tener-- si Té funcions de cada costat o infix operadors de banda i banda, no ho faran associar a través d'ella i donar-li resultats inesperats. STEPHEN Krewson: Així que can-- utilitzar això, podem trucar. En primer lloc, anem a jugar sense els tambors. Aquest és l'helicòpter, l'helicòpter MIDI. [REPRODUCCIÓ DE MÚSICA] Aquí està l'ona quadrada. El exsudat veu. I realment es pot anar salvatge amb aquest. Vaig triar un molt simple, perquè sabia que no havia de mossegar més del que podia mastegar. Només has de mantenir bastant simple per mostrar les idees principals. Però llavors jo estava com, tenim ha d'afegir alguns tambors per això. El fet que es tracta d'una poc impenetrable, i jo no vaig fer ús de la nom de les parts de bateria, Em assignen ells-- perquè són part d'aquesta classe enumerat, Jo els assignen a ints. Un d'ells és com un bombo. Zero és així. Set és un barret alt. I fins aquí on el funcions es posen una mica més a l'atzar, aquests són com les congues. Així que si vostè pensa sobre-- potser un forma divertida de posar en pràctica una caixa de ritmes és utilitzar molt ordenat patrons al bombo. Així, per exemple, en el filtrat sobre el llista amb tot el que li dóna l'esquena gener 1 quan es pren del mòdul 04. Així que em surt 1, 5, 9, 13, 17-- de manera que aquest és el primer temps de cada compàs. I llavors aquest és el mateix cosa va canviar en dues etapes. Així que aquesta és la poc convencional. Així que això seria una mena barret alt. I, de nou, aquí baix, que és una mica a l'atzar, perquè estem fent congues. I tinc algunes maraques baix, també. Així que podria cridar a joc caixa de ritmes, però seria seguir per sempre, i podria començar a agafar fins tota la memòria en el meu sistema. Així que vaig a cridar a aquesta funció reproduir música, que com veurem, utilitzar la composició paral·lela truncant jugar la nostra petita cançó Frere Jacques juntament amb aquesta caixa de ritmes rar. Així que anem a fer una ullada. I per favor, millorar la meva disposició de totes les parts de bateria. No és la meva especialitat, però jo tenia un munt de diversió de fer-ho. [REPRODUCCIÓ DE MÚSICA] Així que per descomptat, tot això és una mica, no tan divertit si no podem convertir- a una puntuació així que potser podria interpretar- per un intèrpret humà. Així que no vaig a córrer aquí. Jo ja he generat els arxius. Es pot veure que hi ha un dot LilyPond file-- i això serà el meu segue a Connor-- i un arxiu de punts MIDI, i un arxiu PDF de punts, que és el que LilyPond en última instància generar. Però aquests són els guions, i vaig a simplement córrer amb les seves opcions d'ajuda. Si rep aquests marxa amb Euterpea, pot generar un arxiu MIDI. I a continuació, des de l'arxiu MIDI amb aquest programa MIDI 2LY, pot generar un lliri Arxiu de la bassa, i llavors vostè pot generar un PDF de la partitura. I hauríem fer una ullada a això. Així que Connor probablement mostrar com anotar això millor, però això és Frere Jacques com generada per mi en Euterpea. És només en C. Jo hauria d'haver figurat el que el hack en realitat a. Però aquesta és la canonada per com es fa això amb això. Anem a parlar més sobre LilyPond. CONNOR HARRIS: OK Anem a veure. Sabia vostè esmenta Aprendre Vostè Haskell? STEPHEN Krewson: Ah, sí. Consulteu Aprendre Vostè Haskell. Està en els recursos. Així és com vaig començar aprenentatge, i és genial. L'aprenentatge no ximple. CONNOR HARRIS: Així que és en línia. Així que un tipus anomenat [inaudible] learnyouahaskell.com, sense espais. La gramàtica és malalt. STEPHEN Krewson: És il·lustrat, també. CONNOR HARRIS: Llavors, què és LilyPond? És una programació declarativa idioma per compondre tipus de música. Així declarative-- puguis pensar en coses com HTML, on no hi ets dient-- HTML no diu com els navegadors web ha render pàgines pas a pas. És només dir això és una descripció textual del que vol la pàgina perquè sembli. I llavors és també un programa que compila aquesta llengua, o llegir el seu endins i després en realitat fa la composició tipogràfica per a vostè, i escup aquests meravelloses que busquen partitures en format PDF. També pot obtenir el format PNG o el que sigui. Una bona manera de pensar d'això és per analogia és que LaTeX és una cosa així com LillyPond, però per només tipografia ordinària. Així que en lloc de-- no és WYSIWYG, el que veus És el que obtens, com, per exemple Finale és, o Sibelius, o Microsoft Word, on pot escriure en temps real i els projectes de les coses en temps real i veure els canvis de forma immediata. Es basa text. Vostè ha de compilar el puntuacions utilitzant un programa separat i sortir arxius PDF més tard. Això és una mica menys convenient per a l'ús si ets tractant d'escriure directament en una puntuació i ja està tractant de compondre en l'equip. Però hi ha una gran quantitat d'avantatges per a això. Un, que té un aspecte molt més agradable, perquè LillyPond pot en realitat prendre el temps per fer les decisions de disseny de forma adequada, a diferència de Sibelius o Finale, que tenen per fer algoritmes compromesos de manera que poden mostrar coses en temps real. Així que per què és LilyPond-- gràfics per ordinador és difícil. Si vostè està fent alguna cosa amb la música i vol escriure partitures, vostè no desitja escriure terme tot per si mateix començant per com dibuixar personal i com dibuixar quaderns. És molt difícil. S'ha fet abans. Estàs bé. Si voleu utilitzar Finale o Sibelius, els formats d'arxiu per a aquestes coses són molt complicats, i no es pot realment utilitzar mitjançant programació. Podeu obrir Sibelius amb Finale i aneu a Fitxer, Exporta com a PDF a tu mateix, però vostè no pot realment trucar a que a partir d'un guió. LillyPond, pot trucar al d'aquests guions. Vostè podria repetir fàcilment LillyPond amb LaTeX. No tindré molt de temps per anar en aquestes tecnologies en aquest moment, però existeixen. Si vostè vol veure en un llibre LillyPond, és un programa que ve amb la seva distribució LillyPond, i és per a la iteració Fragments LillyPond en LaTeX si vols fer alguna cosa com un document gran musicologia amb exemples, per exemple. I és una bona habilitat per vida si estàs fent res amb la música, no només CS50. He fet servir LillyPond per a tots dels meus projectes de composició des que era bàsicament un últim any de secundària. Així que aquí estan alguns exemples senzills. Això és bàsicament representativa del nivell de dificultat que la majoria de la gent enfrontar estaven tractant utilitzar LilyPond per a projectes simples. Aquest primer és el principi a un preludi coral de Bach. Aquest fons és un extracte d'un dels meus pròpies obres, i és just allà per mostrar vostè coses com [inaudible] posant diverses línies en el mateix personal, com lletra undersetting funciona. Underlays lírics són una cosa que és molt fàcil d'usar LilyPond per a la música coral. I llavors hi ha alguna cosa més exemples complicats aquí. Tot això es fa en LilyPond i són factibles. Aquest primer extracte és de [Inaudible] per [inaudible]. I això [inaudible] de una peça per al baix solista flauta per [inaudible], que és un longtime-- que era un membre de llarg termini de la departament de música aquí, crec. No estic segur d'on ha anat a. Però ell era l'assessor de la Universitat de Harvard Associació de Compositors durant molt de temps. Home meravellós. I escriu una mica de música que té molt notació complicada que LillyPond no obstant això, pot gestionar molt bé. Així que per donar-li un sentit del les capacitats d'aquesta cosa tan són-- el funcionament intern de LillyPond són molt complicats. I vostè pot utilitzar-lo per molt de temps, incloent per a alguns bastant complicat coses, sense realment haver de saber molt sobre ells. Però la idea bàsica és que en el nivell més baix, els àtoms de LillyPonds són les notes. Les notes contenen una context anomenats veus. Així el context de veu bàsicament correspon a una sola línia de la polifonia. I després context pot ser continguda jeràrquicament en els de més alt nivell que representar personal en la puntuació o agrupacions més grans, com personal de piano o el personal del cor, i després, eventualment contextos puntuació senceres. I en realitat es pot abastar múltiples comptes en un llibre. I cada context té una nombre de gravadors connectats. Si es mira a través de la contingut d'un context i imprimir un cert símbol o un certa classe de símbols com a necessari. Així que per a tots els contextos de veu, hi ha [inaudible] notes gravador que és bàsicament una funció o un objecte que escriu tota la nota caps en les parts correctes d'una pàgina. Després hi ha un gravador leporí, que escriu terme esquerdes en el personal. Llavors hi ha un metrònom marca gravador que escriu a terme indicacions de metrònom en una partitura. I tots aquests encaixen bastant bé en la jerarquia. I és molt, molt, molt personalitzable, el que vostè necessita si vostè vol aconseguir coses per l'estil. Així que tots els contextos tenen un gran quantitat de diferents atributs que es pot modificar per a tot, a partir de la separació a diversos font selecció de mides de coses. Si vols fer encara les coses més complicades, hi ha un llenguatge de scripting encastat. Utilitzen esquema, que és el dialecte de LISP. Aquests probablement no ho fan significa res per a tu. Però, bàsicament, un esquema una altra funcional llenguatge de programació, més o menys. STEPHEN Krewson: El tie-in. CONNOR HARRIS: Sí. És un bon tie-in, suposo. I s'utilitza com a llengua d'ensenyament, de fet, fins a la missa Ave Al MIT. I és molt útil per LillyPond per diverses raons tècniques. I pel que si vol fer senzilla ajustos que depenen dels condicionals, per exemple-- que hi ha certa condició d'una partitura que es va reunir, realitzar modificacions a la disseny o whatnot-- continuació aquestes instal·lacions hi són. Són complicats. Així que aquí està un exemple de codi bastant simple. És cinc línies. Bàsicament, estic definint dues personals. Està en 3.4. El primer equip compta amb una adjunta marca el tempo, però això és en realitat va per passar a tota la partitura, perquè les marques de tempo estan en el marcador equilibrat. El gravador marca de metrònom S'adjunta per anotar context. Hi ha diferents claus, perquè el [inaudible] gravador S'adjunta el personal. En realitat es pot fer és. La mostra que vaig escriure és realitat en do major, però és només per a demostrar que pot tenir diferents claus en diferents vares. I la sintaxi bàsica és que escrius assenyalar noms amb E, F, G, el que sigui. Si vostè vol fer alteracions, vostè sufix és o ES. Això és d'holandès convencions musicològics. I per fer salts d'octava, vostè ha d'utilitzar aquestes paparres marques, coma o apòstrof. La relativa només significa el que tinguis una nota, automàticament es plaec al vuitena més propera a l'anterior. I si vostè vol saltar més 1 fifth-- dir un cinquè o més-- llavors vostè ha d'utilitzar el [inaudible]. Però d'altra banda, no ha de especificar la vuitena de cada nota. I en relació C, primer i C, que acaba d'especificar Do central i la base C, especialment primeres notes. Llavors vostè té aquestes vares que organitzen aquestes dues veus o mostres de música, i vostè té un compte. I això es veu així. Si vostè vol prendre el temps per copiar aquesta mostra de LillyPond codi de l'anterior lliscar per aquí, i vostè pot escriure per LillyPond tu mateix. Jo sé que tenim alguna cosa que s'assembla molt a això. Així que hi ha una altra tecnologia va mantenir anomenat XML Música per persones completament diferents. XML és que unes dades textuals structure-- No hauria de dir les dades structure-- diuen mapa metàfora més o menys. I està dissenyat per mantenir dades jeràrquics molt bé. HTML, per exemple, és un tipus de XML. I es pot dir XML perquè tenia tots els suports d'angle i angle marques de barra suport que els camps de dades mostren. Jo no tinc un codi exemple de Música XML. Vostè pot trobar vostè mateix. Bàsicament, la raó és possible que vulgueu per utilitzar XML com l'etapa intermèdia és, primer de tot, és un format d'intercanvi per bàsicament every-- no hauria de dir tots, però un munt de puntuació diferent escriptors. Així que si vostè escriu a la Música XML, no només pot LillyPond llegir amb l'ajuda d'aquest auxilary programa anomenat XML Música per LY, sinó també Finale pot llegir que, Sibelius pot llegir-lo. Depenent de com el seu objecte intern jerarquia treballa per a la representació de la música, podria ser més fàcil que escriure la música XML que a LillyPond i només es basen en XML Música a LY per fer la conversió. No crec que [inaudible] té XML Música. STEPHEN Krewson: No ho fa. Algú està treballant en això, però. CONNOR HARRIS: OK. Euterpea no té Funció de sortida XML Música encara. Si vols una idea final del projecte, potser posar-se en contacte amb els nois que Esteban ho sap, i que podrien utilitzar la seva ajuda. STEPHEN Krewson: M'encantaria això. CONNOR HARRIS: També, bàsicament, cada llenguatges de programació això és que es preï ja compta amb una biblioteca de XML, el que pot convertir internament tot de la seva música en un objecte que la biblioteca XML pot escriure que requeriria menys alteracions en la seva estructura interna per qualsevol música que objectes vull escriure que escriure- directament en LillyPond faria. A continuació, només imprimir-lo amb XML amb les biblioteques XML en el seu idioma, que garanteixi que és sintàcticament correcta i tot, i després convertir-lo a LillyPond. Així que la tecnologia és possible que vulgueu mirar si vostè està fent alguna cosa així. [Inaudible], un altre tecnologia auxilarry. Això és bàsicament Tech Obres o Tech Estudi a LillyPond. Per tant, ofereix ajuda amb sintaxi, amb plantilles comú per a diversos combinacions d'instruments. Permet pantalla dividida de visualització de manera vostè pot tenir el seu codi en una finestra i pdf en una finestra i feu clic sobre els llocs al PDF per saltar a la corresponent llocs en el seu codi font. Això és més útil si vostè està realment escriptura LillyPond arxius a tu mateix que si vostè està generant mitjançant programació. Però, de nou, és alguna cosa útil a tenir. Gran. Una altra resources-- només vaig a passar per això molt ràpidament. LillyPond manuals-- LillyPond té excel·lent documentació al seu lloc web. Tenen un tutorial. Tenen una referència de sintaxi. Tenen centenars de fragments per diverses coses petites jo pot ser que necessiti fer per demostrar diverses capacitats. Si voleu utilitzar el llenguatge de scripting o fer més extensa personalitzacions, llavors no funcionament intern de referència a aquesta URL. Si voleu utilitzar XML Música, hi ha aquesta URL, musicxml.com/tutorial. I llavors, si vostè necessita aprendre esquema perquè en realitat es vol utilitzar les instal·lacions de scripting en LillyPond, llavors hi ha una [inaudible] diu Interpretació Estructurat de programes d'ordinador, que no només és la segona major llibre de text CS mai written-- trobar-me després si vostè vol saber el que crec que el més gran és-- però també és una molt bona introducció a la llengua pròpia. Vostè no necessitarà més de les primeres seccions. I això és tot. Qualsevol pregunta? ESTUDIANT: On puc descarregar el teu generada Frere Jacques perquè pugui posar-la en el meu iPod? STEPHEN Krewson: Bé, pot escriure a algun arxiu wav a Euterpea. I vostè té el codi. És en GitHub. Faci les seves pròpies variacions de Frere Jacques per CS50 ment rusc. Seria molt bo. CONNOR HARRIS: Algú més? STEPHEN Krewson: Necessitem una millor bombo, també. És realment dolent. ESTUDIANT: Euterpea té no només el costat composició, però signal-- STEPHEN Krewson: Sí. De fet, el treball que va fer en Euterpea quan prendre esto-- hi ha una Curs de Postgrau en la Universitat de Yale que utilitza it-- era a la síntesi de so. Així que hi ha una realitat bona manera d'utilitzar les fletxes i alguns de la notació que vam veure de compondre junts funcions de senyal. En particular, el baix per a la majoria d'ells és només una ona sinusoïdal simple. Però si comences a compondre els en formes programàtiques estranys, vostè pot aconseguir so boig efectes, com cascades estranys. Podeu crear molt valent sons amb una gran quantitat de modulació. Vaig fer un projecte sobre granular síntesi, que és en algun lloc entre FM i mostreig. Es pren molt petita, petites mostres, i després combinar-los amb algun tipus de modulador i crear un so més ric. També vam fer el modelatge físic, per la qual cosa tractant de pensar sobre la física i psicoacústica d'una cosa així com una trompeta, i pensant en el camí el so aquesta saltant la campana de la trompeta i l'acústica de l'habitació i el modelatge que amb els oscil·ladors bàsics. CONNOR HARRIS: Moltes gràcies. Gràcies per venir. I jo sempre estic disposat a respondre preguntes per email-- connorharris@college.harvard.edu. STEPHEN Krewson: Sí. stephen.krewson@yale.edu. Fresc.