CONNOR HARRIS: Hei. Jeg er Connor Harris. Jeg er en CS50 CA ved Harvard. STEPHEN KREWSON: Jeg er Stephen Krewson. Jeg er en TF for CS50 ved Yale. CONNOR HARRIS: Og vi kommer til å snakke om noen teknologier som du kanskje ønsker å bruke hvis du er interessert i å gjøre et avsluttende prosjekt eller virkelig noe med musikk. Vi kommer til å fokusere på først en programmeringsspråk kalt Haskell. Det er en funksjonell språk, så paradigmet er svært forskjellig fra C eller PHP eller andre imperative språk at du har brukt allerede, og spesielt på et bibliotek skrevet i Haskell kalt Euterpea, noe som kan hjelpe folk med å skrive musikk funksjonelt, i utgangspunktet. Og Stephen vil lede deg gjennom et godt eksempel på det. Etter dette, vil jeg introdusere deg til noe som kalles LillyPond, som er en teknologi for sats musikk. Det er liksom som LaTeX for musikk hvis noen av dere har brukt LaTeX for matematikk klasser eller andre P sett klasser eller hva har du. Og så skal jeg gi deg, igjen, noen enkle eksempler på at og peke deg i den generelle retning av noen bedre ressurser. STEPHEN KREWSON: I Dessuten tenkte vi at det ville være kult å sette opp en liten bit av tips mot en rørledning mellom Euterpea generert MIDI-filer i LillyPond, så vi gir noen instruksjon på skript for å gjøre det som befinner utstyrt med LillyPond bare for å holde den åpen kildekode og få en rørledning går. CONNOR HARRIS: Igjen, vi bør vektlegge, disse to teknologiene, du trenger ikke å bruke dem sammen. De er ikke laget for å fungere sammen, selv om de gjør veldig pent. STEPHEN KREWSON: Høyre. Og helt gratis. CONNOR HARRIS: So bekreftelser, bare les det. STEPHEN KREWSON: etterretning. Takket være de folkene. Dette vil jeg dvele på bare et øyeblikk. Installasjonen er litt kinkig. Vi har en leser meg på GitHub at du kan ta en titt på. Bare send meg hvis du har spørsmål. Men vi skal kjøre dette under forutsetning at dette fungerer for alle. CONNOR HARRIS: Og hvis du ikke kan få LillyPond å arbeide, ingen big deal. Det er ingen live kompilering som vil være involvert, i alle fall på min ende. STEPHEN KREWSON: Haskell og LillyPond bør begge har montører. Euterpea lastes ned som en pakke, så videre og så videre. Så vi snakker om datamaskinen musikk. Og dette er bare en svært 50000 fot visning. Det er noen forskjellige aspekter av det. Og dette er grov og er kommer til å skjule noen detalj. Men vi kunne tenke på noe som algoritmisk komposisjon, ved hjelp av algoritmer, ved hjelp av kode, for å generere noen type of-- kanskje en selv lignende sekvens av notater, eller kanskje notater under en begrensning. Og så de kunne være utføres eller tolket med analoge instrumenter eller noe sånt. Men sammensetningen var gjort algoritmer. Men selvfølgelig, kanskje på området datamaskin musikk eller digital musikk vi er mer kjent med er digital lydsyntese eller digital sampling og digital innspilling. Mange digitale instrumenter er gjort gjennom digital sampling. Faktisk vil vi være å bruke en av de i form av en lyd font bibliotek senere. Men det er også noe som heter digital syntese som kom ut på slutten av 70-tallet og inn på 80-tallet med Yamaha og John Chowning ved Stanford gjør FM syntese eller Frequency Modulation syntese, hvor du hadde en transportør signal og et modulasjonssignal både i lydspekteret. Men det vi er fokusert på i dag er noe som kalles MIDI, og selvfølgelig algoritmisk komposisjon. Vi kommer ikke til å lage instrumenter, men vi i stedet kommer til å gjøre litt musikk, og så vil det bli tolket av noen instrumenter som er i overenstemmelse med General MIDI-standarden. Så hva er MIDI? Jeg kommer ikke til å komme for dypt inn i det, men MIDI er dataoverføringsprotokoll. Det er en slags guide over ulike selskaper og bransjer for organisering av lyder eller patcher. Så får vi se at det er en MIDI standard for alle de forskjellige slag lyder og MIDI-anbefalinger for alle de forskjellige typer av synth eller ulike typer av hele instrumentet grupper i et orkester, sier. Du er sikkert kjent med 0 til 127 MIDI-meldinger. En MIDI signal er typisk en bit som indikerer enten det er en data eller en status pakke, og så er det syv biter av et signal. Og disse kan styre alt fra volum handlingen eller press på en bestemt tast hvis du utfører med en MIDI controller samt, selvfølgelig, notater. Og selvfølgelig, har MIDI vært svært nyttig, fordi det er en måte å tråd sammen eller kjede en haug med MIDI maskinvareenheter. Jeg har sju eller åtte tilbake på huset mitt. Det blir veldig komplisert, men det er veldig kraftig. Og det er virkelig gamle. Det er fra tidlig på 80-tallet, og det er veldig fint og små. CONNOR HARRIS: Yeah. All den klassiske Nintendo videospill ville trolig har MIDI-filer for musikk, for eksempel. STEPHEN KREWSON: Her er et eksempel på generell MIDI, viser MIDI som en slags av generell protokoll. Og jeg tror vi kan tenke på Forskjellen mellom spesifikasjonen at det skulle være noe sånt disse instrumentlyder og den faktiske realisering av disse instrumentene høres i en lyd skrift eller en bestemt MIDI synthesizer som forskjellen mellom kanskje en typeface-- som sier: Generelt er denne utformingen av denne måte å representere characters-- og en bestemt skrift som har en bestemt størrelse og klang, og det er realisering av the-- CONNOR HARRIS: Kanskje en bedre sammenligning ville være Unicode-standarden says-- det gir et nummer til hver karakter, og virkelig alle språk i verden, eller et stort sett av skript av språket i verden, og de er deretter gjengitt til noe grafisk av ulike skrift pakker. Og selvsagt kan du tenke på MIDI som Unicode av lyd. Og det er bare en liste of-- en stor bekk av hendelser og instrumenter og whatnot, og du må ha en egen Programmet, som en skrifttype, å gjengi det i noe som er hørbar. STEPHEN KREWSON: Så hvorfor Haskell? Haskell er en funksjonell programmering språk, svært avansert, svært forskjellig fra C, svært forskjellig fra PHP. Og vi kommer til å se at det er en enkel funksjon sammensetning i Haskell som vil tillate oss å vind gjennom komponere eller skrive opp, transkribering, noe som Frere Jacques, denne enkle sangen som har en rekke deler i det at er selv lignende eller gjentatt. Så dette vil være noen av motivasjonen for hvorfor vi bruker Haskell, der funksjonene er førsteklasses borgere. Og jeg ønsket å utvide dette litt. Det er litt lett å notere Frere Jacques i Haskell. Men hva hvis vi ønsket å legge en tromme del til det? Hva hvis vi ønsket å prøve å gjøre noe som en Roland 808 eller 909 trommel maskin der du har ca 16 forskjellige trinn? Vanligvis er disse tenkt som 16. notater. Og du kan styre den globale tempo, og du kan plukke ut en haug med forskjellige perkusjon deler av basstromme, en klapp, forskjellige snarer, åpne og lukkede høye hatter på disse slags kanaler, og deretter kan du EQ eller justere volumet. Og vi vil se en fin måte i Haskell representere dette trinnet sequencer med alle diverse kule ting i Haskell vi kan gjøre med å generere lister og filtrering enn lister, kartlegging i løpet av lister, kartlegging funksjoner enn lister. Og en rask unnskyldning. Dette er en meget overfladisk og altfor rask skisse av noen av aspektene for Haskell og Euterpea, som er en domene-spesifikk innebygd språket skriftlig i Haskell for musikalske typer. Så må du sjekke ut koden online. Fyr opp GHCI, som er Glasgow Haskell Compiler Interpreter. Og jeg kommer til å gjøre noen av denne i en liten bit slik at du kan se hvordan det gjøres. Og dette gjør at du kan laste inn med the-- syntaksen er kolon og deretter kommandoen. Du kan laste inn filer. Du kan bruke bla på disse filene for å se alle de funksjonene som finnes i en bestemt modul. Og så så vi får se, typer og typen klasser er så viktig i Haskell, så du kan alltid check-- spesielt Hvis du arbeider i en ny dscl som dette, hva er en type musikk? Jeg vet om måten numerisk typer jobber i Haskell, men jeg vet ikke mye om musikk. Men du kan utforske den måten de er definert ved hjelp av denne t eller type kommando og deretter ringer i en bestemt funksjon eller en dataobjekt. CONNOR HARRIS: Yeah. Hvis du trodde C og klang var hardass om typer, du har ingen anelse om Haskell. Den gode ting om Haskell er at Hvis du kan få koden til å kompilere og hvis Haskell typen kontroller, det er nok riktig, fordi den type system er så strenge. STEPHEN KREWSON: Yeah. Så jeg vil bare gå through-- og igjen, dette er ikke å gjøre det justice-- noen av funksjonene i Haskell at minst til sin creators-- og det ble opprettet på slutten av 1980-tallet av en haug med folk, en komité bestående av ca 20 people-- trodde var viktig. Og det første de oppført i et papir som beskrev genesis av Haskell i løpet av de første 20 årene eller så var at det var lat. Så hva betyr dette? Vel, det betyr når vi har en slags uttrykk, må vi vurdere det. Og Haskell gjør dette i en samtale ved behov måte eller en ikke-streng måte. Det vil si, hvis vi har en haug med komponentene i vår uttrykk, vi prøver å utsette evalueringen av disse delkomponenter til absolutt siste minute-- som er før vi faktisk trenger dem. Så dette means-- som er kult, spesielt hvis vi tenker om abstraksjon av en musikalsk sequencer. Du slår den på, og du begynner kjører et skritt sequence-- hvis du noen gang jobbet med en trommel maskin-- og det bare går alltid. Så det ville være veldig fint om vi kunne etterligne det i Haskell. Og vi kan gjøre det med uendelig verdier, spesielt uendelig lister. Det er veldig enkelt å skrive en uendelig liste i Haskell. Du kan bare bruke syntaksen ned her, der du ser en gjennom tre, fjerne tre en prikk prikk, og som er en uendelig liste av alle naturlige tall som strekker på så langt du kan forestille deg. Jeg ønsker å innføre en Konseptet med folder med en gang. Og igjen, hensikten med dette seminaret er ikke å lære om folder i Haskell eller høyere ordens funksjoner. Men jeg ønsker bare å introdusere det til gi en nøyaktig følelse av hvordan rare Haskell er og hvor kraftig den er. Og i særdeleshet, kommer vi til å be-- når vi gjør våre forskjellige tromme deler, vi kommer til å bli manipulere lister over tall, brette dem på hverandre. Og for å gjøre det, vil vi være å bruke kart og folder. Det er en riktig assosiativ fold, som er denne retten her-- en minus mengden, 2 minus den mengde, 3 minus 0. Og syntaksen for en fold, gi deg en fold en base verdi og deretter en operation-- i dette tilfellet, addisjon eller subtraksjon. Jeg har vist begge tilfeller. Og så er det en akkumulator som akkumuleres over hele listen, søknad som operatør pluss eller minus, og deretter akkumuleres det. Så dette vil være the-- hvis det ble kalt med fold r pluss fra 0, og starter med 0, vi vil da summere alle tallene i denne listen. Og det er en liste fra 1 til 3. CONNOR HARRIS: Så for å sette det på en annen måte, tar fold r tre argumenter. Det er en funksjon som selv tar to argumenter, så er det en startverdi, og det er en liste over verdier. Og hva du gjør er at du tar starter verdi, første verdien, sette dem inn i funksjonen. Hva får du ut, ta det, fôr som inn i funksjonen av andre verdi, hva du får ut, ta det, mate det inn i Funksjonen av den tredje verdien. Og så hvis du går ned hele denne listen på denne måten, du kommer til å få slutt noen entall verdi som er av samme type av hva man startet ut sammen med og av samme type som ting i listen, og deretter det er avkastningen resultat av fold R. STEPHEN KREWSON: Så spesielt, disse er høyere ordens funksjoner, fordi de tar en annen fungere som en av argumentene. CONNOR HARRIS: Yeah. Hvis du har brukt visse andre languages-- Jeg vet R, [uhørbart] språk har dette, kalt Reduce. Du har kanskje lignende funksjoner i andre språk, bare kalt forskjellige ting. STEPHEN KREWSON: And hva er fint om fold R i dette tilfellet er at fold R kan arbeide med uendelige lister. Så i denne bunnen, dette P5 genererer notater som er slått på i sequencer for noen trommeldelen, den femte trommeldelen, og kanskje det er en conga tromme eller noe. Og dette er en bevisst stumpe måte å skrive dette, men det er gøy, fordi det viser mye ting om Haskell og Euterpea. Så kaste R av dette colon-- kolon er bare en operatør som skyver ting sammen på en list-- heter på tom Listen, som er like de tomme parentes. Og jeg ringer som på denne uendelig liste. Dette er faktisk to lister lagt sammen her nede. Listen en komma seks dot dot er 1, 6, 11, 16. Så Haskell-- i bare noen få tegn, du kan generere hele tallsekvens som er fem tall fra hverandre strekker seg videre inn i uendeligheten. Og jeg foran til at dette kortere lille list-- 3, 8, 21-- bare for å vise deg hvordan du kan sette sammen lister. Og så har jeg kastet på seg selv. Og dette ender opp med bare å være en slags identitet operasjon, men det er uendelig. Og brett R kan gjøre det, fordi det dovent evaluerer, som i det ovenfor. Hvis vi har en 1 og 2 og 3, kan vi bare braketten av hele resten av den. Det vil ikke fungere for minus eller pluss, men det vil arbeide for tykktarms identitet operasjon på listen. Så hvordan skal vi praktisk talt bruke det hvis vi har en uendelig lang liste over ting? Vel, gir Haskell en masse functions-- og ser mer inn disse i din egen tid-- eksempel ta som sier, OK, vi er genererer dette uendelig liste, men vi er bare nødt til å ta noen rekke av det Og i dette case-- vi vil se dette senere i vår trommemaskin code-- GM er bare en slags global variabel for antall skritt i sequencer. På roll-in maskinene jeg viste deg, det er vanligvis 16, men jeg har implementert det med 32. Det spiller egentlig ingen rolle. Haskell er også ren, så det har sterk statisk typing at Connor antydet. Så funksjoner er matematisk i sense-- de er mer matematisk at de er garantert å ikke få tilgang til eller endre noen form for variabel eller utføre inngang eller utgang. Så hvis du har en funksjon, det er deterministisk. Det vil alltid returnere samme verdi i delstaten programmet eller forbli den samme. Det er, selvfølgelig, monadiske unntak til dette, men det er utenfor vår omfang. CONNOR HARRIS: Yeah. Hva dette betyr, skjønt, er det er noen viktig [uhørbart] Konsekvensene av dette. Det ene er at det er veldig lett å parallelize Haskell programmer. Fordi hvis du har, si, en funksjon av at må operere på en million verdier, hvis du vet at funksjonen vil alltid gi ut den samme verdi hvis du mate på et visst value-- hvis du er [uhørbart] f 1, f av 2, da f av tre eller av en f whatnot-- er ikke til å skrive ut til en fil eller gjøre noe som vil endre verdien av f2. Du kan bare dele opp denne funksjonen til en million forskjellige maskiner eller en million forskjellige tråder eller hva, få alle svar tilbake, få alle returverdier tilbake, og da det er det. Så veldig lett å parallelize ting. Ulempen er at inngangs og utgang spesielt passe inn i type system i svært kompliserte måter. Vi vil ikke gå inn på det akkurat nå, men jeg oppfordrer deg til å se på noen ressurser online hvis du ønsker å lære om det. STEPHEN KREWSON: So skriver classes-- og dette var-- klasser av typer ble oppfunnet for å løse et problem for operatøren overbelastning. Så vi ønsket å ha likestilling mellom forskjellige typer ting. Selvfølgelig kunne vi tenke of-- likestilling mellom talltyper er veldig lett å tenke på, men hva om likestilling mellom lister? Hva om likestilling mellom tre ben datastrukturer? Og dette er alt mulig i Haskell grunn av type klasser. Så hvis du definerer en viss data type-- og her, disse er musikalske plasser. Vi endelig får til noen datamaskin musikk. Så vi har C, C skarp, og så videre og så videre. De tilhører en gjeng med forskjellige type klasser. EQ-- de tilhører den EQ typen klasse. Det betyr at de støtter likestilling operasjoner. Så du kan vurdere om man sekvens av musikalske primitiver er det samme som en annen. De tilhører den klassen ordinal. Det betyr at det er en bestilling til disse. D kommer etter C. ciss kommer etter C i tillegg. De tilhører klassen viser, noe som betyr at de kan skrives til en konsoll eller terminal. De tilhører klasse nummerert, som betyr at selv om disse er tegn, de har en underliggende numerisk representasjon starter på 0 og går ut gjennom imidlertid mange ting er her, 20 eller så, eller 30 eller 40, kanskje. CONNOR HARRIS: Og når vi har en datatype at derives-- med dette søkeordet "deriving--" en viss type klasse, det betyr at kompilatoren vil prøve å konstruere noe automatisk. Så kanskje du vil definere en kvalitet annerledes. Det er lurt å definere ciss lik D flat, f.eks. Med denne konstruksjonen her, tror jeg ikke ciss og D flat vil være lik, fordi kompilatoren vil automatisk si hver annen mulig verdi er forskjellig fra alle andre. Så det er mulig å overstyre standard implementeringer av slike klasser. Igjen, se på referanse hvis Ønsker du å lære om det. STEPHEN KREWSON: And her, faktisk, vil dette være nyttig for når vi kode senere. Vi ser noen av de Infix operatører for sekvensiell sammensetning, parallelt sammensetning, og så videre, disse positive og likhetstegn omgitt av kolon. Det betyr at vi kan spille disse forskjellige musikalske primitiver ene etter den andre. Det er sekvensiell komposisjon. Eller vi kan spille dem i parallelt samtidig. Så jeg kan ha en musikalsk verdi, og så dette er lik og kolon, Infix parallelt sammensetning operatør, og spille dem som en slags akkord. Og vi kommer til å bruke dette når vi kombinerer vår trommel del med vår Litt Frere Jacques sang å spille disse to sekvenser av musikalske verdier på samme tid. Currying er-- Curry ble sist nevne for Haskell Curry, som Haskell bildet er oppkalt etter. Og dette gir oss en hyggelig eleganse når vi er skrive alle disse forskjellige funksjoner eller filtre som vi er kommer til å være kartlegging over våre lister. En funksjon av to arguments-- f av x og Y- kan representeres som f av x påført y. Så det er en funksjon av ett argument som returnerer en annen funksjon av en argument. Så dette betyr at vi kan kartlegge en funksjon f av x løpet liste over y-tallet. CONNOR HARRIS: Vil du gi et eksempel på dette? STEPHEN KREWSON: Yeah. Jeg har et eksempel her fra noen av de tingene vi skal skrive. Så gjenskape 2-- godt, replikere vil ta én verdi, som er hvor mange ganger for å gjenskape noe, og da vil det ta en value-- vanligvis en liste eller noe. Så her er vi kartlegging replikere to over en annen liste. Så hvis vi kartlegge replikere to, hvis vi gjenskape 2 gjelder til det første element i denne og list-- disse er lister over musikalsk phrases-- vil produsere to av "du sleeping--" så sover du, du sover. Så nå har vi to. Men replikere tar to argumenter, men fordi vi er currying og deretter kartlegging, vi kan representere replikere 2 som har blitt returnert som en funksjon av én argument-- bare replikere to ganger. Og så skal vi anvende det til hver element i denne listen over setninger. Og concat er en Haskell operasjon for flatere en liste. Fordi replikere to vilje produsere en liste av lister. Og dette er denne mellomform her. Og så da kan vi concat eller flate det ut to ganger. CONNOR HARRIS: En enklere eksempel på currying, hvis du vil like-- tenke f er bare en multiplikasjon funksjon som tar to argumenter og returnerer deres produkt. Så hvis du har en f 4 5, er det 20. Men du kan tenke på dette som also-- du har en funksjon f 4 som tar et argument og returnerer fire ganger denne argument-- bare delvis applikasjon som bare ett argument fire. Og hvis du mate f av 4 5, som vil gi deg 20. Og det er en enklere eksempel på currying. Det er vanligvis en av de lærebok seg. STEPHEN KREWSON: Lambda uttrykk eller anonyme funksjoner er en annen Haskell kjennetegn. Så hvis vi trenger å piske opp en liten funksjon livet replikere, men sier det ikke er i standard bibliotek, vi kan bruke en syntaks lik det følgende. Og vi vil bris over denne. En ting du vil se mye av i trommemaskin er vi å ringe til noe som kalles filter, som i likhet med tidligere, er en kartlegging av en funksjon over en liste, er men det en kartlegging av en boolsk funksjon. Så vi har her et eksempel av et anonymt definert boolsk funksjon som bare tar et par verdier. Dette er ikke strengt tatt en anonym funksjon. Men det er definere med som syntaks for korthets skyld og dette tar bare x modul N- CONNOR HARRIS: Yeah. Slik at f er en funksjon av to argumenter n og p som returnerer en funksjon som er i seg selv en funksjon av ett argument, nemlig x. STEPHEN KREWSON: Jeg nevnte Infix operatører. Hva er Infix operatørene? Vel, Infix operatører er det normal måte vi representerer operasjoner, si, i mathematics-- 2 pluss 2 i stedet for operatøren pluss og deretter to argumentene 2 og 2. CONNOR HARRIS: Det kalles omvendt polsk notasjon, som er et begrep jeg tviler på noen av dere ville vite. STEPHEN KREWSON: Høyre. Omvendt polish eller prefiks notasjon. Men Haskell besluttet å bruke Infix operatører. Så dette er noen av de egendefinerte de som er definert for Euterpea dscl i Haskell. Så dette var sekvensiell komposisjon. Dette var parallelle sammensetning, og denne ble avkorting parallelt sammensetning. Og vi trenger at med vår trommemaskin, fordi vi vil bruke den siste operatør i det lille tuppel det å spille trommemaskin sammen med vår Frere Jacques sang. Og vår trommemaskin er kommer til å være uendelig. Den spiller bare for alltid. Men Frere Jacques sangen er det ikke. Det er ikke så lenge. Det er bare noen få barer. Så vi trenger å stoppe trommemaskin som Når den kortere musikalsk verdien kommer til en slutt. Og at infiksert operatør er super nyttig med det. Og infiks notasjon som dette er slags hyggelig, fordi si du har en funksjon som sitat, som gir heltallsdivisjon av x ved noe else-- Beklager, det bør være a og b. Du kan skrive det som et sitat av b. Så hvis du put-- element er et annet eksempel på dette. x element i noen liste, hvis du setter det i Backticks, kan du bruke den. Selv om det ikke er et symbol som pluss eller minus eller tider, du kan bruke navnet på en funksjon sånn i Backticks som infiks operatør, noe som er ganske kult. CONNOR HARRIS: Igjen, dette er alle bare syntaktisk sukker, egentlig. Det påvirker ikke kjernen av språket. STEPHEN KREWSON: Så ser vi her for siste setning av vår Frere Jacques sang, Jeg spilte noen små akkorder eller tredeler bruker parallelt sammensetning operatør. Dette er en annen måte å si noe av det vi har nettopp vært å si. Så du kan kartlegge funksjoner av ett argument over lister. CONNOR HARRIS: Igjen, referanser for Haskell-- innledende lærebøker vil ha alt dette i det. STEPHEN KREWSON: Så her er en ganske nøkkel linjen i sequencer vi tar en titt på hjelp en liste forståelse. Og vi ser her er det elementet i fast operatør i rygg anførselstegn. Så hvis x er et element i en liste over x-er, så får vi ringe opp PERC funksjoner. Så perc er bare en slagfunksjon. Det tar noen verdi p det er en del av den avgrensede sett all de ulike perkusjonslyder som vi så i forrige slide, og da det gir som Varigheten av en fjerdedel notat. Else det gir det en QNR, og QNR er bare en fjerdedel notat resten. Så dette er å bygge opp noe fint. Vi har en liste over elementer, og vi vil sløyfe over noen liste fra ett til maks verdien av vår sequencer. Og når vi er på et bestemt jeg i at listen over én til max verdi, hvis at jeg er medlem av denne sett laget i denne funksjonen, vel, så vi slår det inn i en perkusjon notat. Ellers, vi bare spille en pause, som Det vil si, vi bare forbli taus. Og vi kan se her at i denne listen forståelse syntaks, x er befolket av dette liste konstruert én til den globale størrelsen av sequencer. CONNOR HARRIS: Yeah. Den grunnleggende syntaks for liste oppfattelser er brakett, verdi involverer noen variabler, bar, mulige verdier av de variable seg, lukket brakett. Og hvis du har gjort satt byggmester notasjon i noen form for matematikk klasse, du kanskje har satt 2n slik at n er i eller n er i z. Lignende thing-- denne notasjonen er ment å være tankevekkende av det matematisk notasjon. STEPHEN KREWSON: Og du kan bruke flere predikater og flere filtre i en liste forståelse, som er ganske fin. Algebraisk types-- vi vil ikke nøle lenge her. Det er ikke en god forestilling i Haskell eller en god, tydelig forestilling om hvordan man skal ta, sier en standard parameter til en funksjon eller noe. I Python, dette er ganske enkel. Du kan bare si med lik på erklæringen av funksjon, en standardverdi i Hvis ingen er levert. I Haskell, kunne du kanskje bruker kanskje kanskje skriver, som tar enten ingenting eller en verdi av typen bare en. Så vi utnytte dette i trommemaskin å tillate oss å gi ekstra volum parametere til hver av trommeldeler. Så det gir oss en måte å ha EQ eller et volum på en bestemt kanal. CONNOR HARRIS: I andre Haskell eksempler, du kan se kanskje brukt for funksjoner som kan mislykkes. Dette er en vanlig en. STEPHEN KREWSON: Og du kan levere en slags feilmelding som standard. Og det er spesielt nyttig når du gjør I / O i Haskell. Det kan være triks. CONNOR HARRIS: Eller for en lignende eksempel, tror av en funksjon som innebærer deling av en parameter som kan være 0. Og at funksjonen kunne returnere kanskje uansett. Så hvis det er ingen divisjon med 0, det vil returnere bare hva. Og hvis det er delingen av 0, vil den returnere ingenting som en måte å signalisere feilen. Fordi en konsekvens av Haskell er svært strenge typing er at det er ingen real-- Unntakene er vanskelig, i utgangspunktet, feilhåndtering er vanskelig. Og dette er en veldig vanlig måte å gjøre det. STEPHEN KREWSON: Så nå får vi til en annen psykologisk ting om Haskell, som er mønster matching og funksjonsdefinisjoner. Jeg viste deg i siste lysbildet erklæringen av trinn sekvens funksjon, som tok en kanskje verdi, da en int, deretter en liste over ints, deretter returnerer en sekvens av musikk verdier det kommentert med både stemme og volum. Så disse tre argumentene kan være mønster avstemt på følgende måte. Og vi alltid ønsker å være sikker på å gjøre en base case eller avslutte saken først. Og disse understrek kan bare tolkes å bety noen verdi som er der. Så hvis vi får en samtale til trinn sekvens med en viss verdi, en annen verdi, og deretter tom liste, hva vi ønsker for å gå tilbake er bare stillhet, en ro 0. Og i stedet for at å være en tom liste eller 0, det er en pause 0, fordi vi er håndteringen av type musikk, og den tomme listen over musikken typen er bare en resten av ingen varighet. Det er ingen musikk. Og så ser vi om vi får et skritt sekvens med en v for volum argument, p for forholdsregel instrument argument, og deretter en liste over x-tallet. Så vi gjør noen ting. Spesielt gjelder vi denne listen forståelse, og vi utfører noen operasjoner på kanskje verdien å gjøre det til en numerisk verdi, slik at det kan da nummerert og brukt å velge instrumentet. Igjen er dette en lite litt bevisst inconcise bare for å vise alle de rare tingene du kan gjøre i Haskell som du ta en titt på det på din egen tid. Greit. Så vi endelig får til gjøre hva vi ønsket å gjøre, som er å gjøre noen datamaskin musikk. Så vi kommer til å prøve å gjøre Frere Jacques sangen. Så det er hvor mange setninger i Frere Jacques? Fire. Flott. Og hva er hyggelig er at de er alle gjentatt det samme antall ganger, noe som er to. Så vi har fire setninger hver gjentatt to ganger. Og spesielt, er de i en runde. Og det er mange, mange måter å implementere en runde som kunne være morsomt å gjøre. Jeg har gjort det i et ganske enkel måte her, som er bare for å construct-- linjen funksjonen tar en liste over musikk verdier og gjør den til sekvensiell sammensetning ved å påføre som sekvensiell sammensetning operatør. Og da jeg utsette de ulike delene ved å gjøre begynne dem med en pause. Så jeg starter med en pause på to tiltak, og deretter en pause på fire tiltak og deretter en pause på seks tiltak, og deretter runde fungerer, som vi alle vet denne sangen. Vi ser to merknader eller modifikasjoner av musikk verdiene som er inneholdt i denne sekvensielle arrangement av musikkelementer. Vi har et tilleggsvolum. Dette er en funksjon for å kommentere musikk med et bestemt volum. Dette er et godt eksempel av en MIDI signal løping fra 0 til 127, de syv bitene i informasjon som kan gjennomføres. Og then-- vi så det veldig kort, men den generelle MIDI liste over alle de forskjellige instrumentene. Og det er ikke en hel masse av dem. Hvis du bruker en digital audio arbeidsstasjon, som Ableton Live eller Pro Tools, det er en utrolig bredere spekter av synthesizere og VST instrumenter. Men MIDI standard bare har noen, eller flere dusin. Og noen av dem er morsomme. Jeg trodde det ville være morsomt hvis vi spilte instrumentet MIDI instrument helikopter, og deretter neste vei gjennom runden, vi gjorde en pad synth, og deretter av dette banal bly firkantbølge synth, og deretter stemme slam, som er en litt utydelig på min dårlige MIDI synthesizer, men de OK. Og så ser vi dette la og i syntaks fra Haskell, og så spiller vi alle disse deler sammen med parallell sammensetning operatør. Og vi kunne sannsynligvis vise noe av dette. Her er koden. Og du kan se i C, vil det være en Mange hals clearing og innstilling bordet koden før du kunne lage musikk som dette. Eller andre programmerings språk, vil du sannsynligvis nødt til å interagere med en slags bibliotek eller API og sette alt opp, og da vil du være nødt til å rydde opp. Men her i Haskell er, tror jeg, en gang du får taket på det, utrolig lesbar og svært uttrykksfull. Så det er gjennomføringen av Frere Jacques. Greit. Nå ønsker vi å legge til perkusjon, og dette er litt Messier. Så la oss ta en titt på lysbildene. Så den store ideen er å gjøre en haug med lister eller deler. På de roll-in maskiner, er det var typisk om kanskje åtte til 10 rytme eller perkusjon deler. Og deretter bruke en haug med teknikker. Og vi har snakket om these-- hjelp folder, filtre, lambda funksjoner, kartlagt over listene for å generere verdier i noen området 1 til r, r er 16, eller 32 trinn i sequencer. Og så hvis det er en verdi i denne listen som vi kjører gjennom sequencer, kjører gjennom det over og over, slår den på dette notatet, og at prøven blir utløst. Her er alle de forskjellige rare måter Jeg kom opp med å generere notater. Prøv den på din egen semi sum. Det vil høres kult. Tiden tillater det, vil vi gå gjennom dette. Men for akkurat nå, antar jeg vi bør demo hva vi har. La oss håpe dette går OK. Så dette er GHCI. Og vi vil laste en fil Jeg har kalt song.lhs, som er den filen jeg bare viste deg. Ok flott. Som Connor sa tidligere, det kompilert, det Typen sjekket, så jeg kan puste mye lettere. Det kommer ikke til å blåse opp på meg. Jeg hadde lyst til å vise deg noe nyttig. Du kan se at en modul lastet kalt 50. Du kan bla gjennom denne modulen. Og dette er så fint om doing-- kanskje hva du gjør i Haskell er ikke kalt programvareutvikling, men du kan gjøre mye morsomme ting på egen hånd. Og arbeidsflyten er virkelig fint som sammenlignet med en rekke andre språk, fordi du kan se i en virkelig lesbar måte hva som skjer. Så vi ser at vi har alle disse setningene, som er lister over musikk plasser, og da vi bygge disse opp til noe større, som er en musikk sang. Det er en musikalsk enhet. Og så kan vi spille alt dette med en funksjon kalt spille musikk. Du kan se at her nede. Som er bare spille. Jeg burde say-- jeg ikke snakke om dette dollartegn som er overalt. Dollartegnet er en annen infiks operatør. Men det har den laveste forrang av enhver operatør, som effektivt betyr at alt på venstre for dollartegn og høyre for dollartegn, vi kommer til å bli evaluert før det. Så det er liksom som en annen måte å legge parentes. CONNOR HARRIS: Det er i utgangspunktet funksjon sammensetning. Og det sikrer at du ikke have-- hvis du har funksjoner hver side eller infiks operatører på hver side, vil de ikke assosiere over det og gi deg uventede resultater. STEPHEN KREWSON: Så vi can-- bruker det, kan vi ringe. Først vil vi spille det uten trommer. Det er helikopteret, MIDI helikopter. [MUSIC SPILLE] Det er firkantbølge. Stemmen slam. Og du kan virkelig gå vill med dette. Jeg plukket en ganske enkel en, fordi jeg visste at jeg ikke skulle bite av mer enn jeg kunne tygge. Bare holde det ganske enkelt for å vise de viktigste ideene. Men da jeg var som vi har fikk til å legge noen trommer til dette. Nettopp fordi dette er et litt ugjennomtrengelig, og jeg brukte ikke Navn på trommer, Jeg kartlagt them-- fordi de er en del av det nummerert klasse, Jeg kartlagt dem til ints. Den ene er som en basstromme. Zero er like godt. Seven er en høy lue. Og ned her hvor funksjoner få litt mer tilfeldig, disse er som Conga trommer. Så hvis du tror om-- kanskje en morsom måte å implementere en trommemaskin er å bruke meget velordnet mønstre på din basstromme. Så for eksempel, ved filtrering over hele liste med alt som gir tilbake 1 når det er tatt modul 04. Så jeg får 1, 5, 9, 13, 17-- så dette er første kryss av alle tiltak. Og så er dette det samme ting flyttet over to trinn. Så det er offbeat. Så dette ville være noe som en høy lue. Og igjen, her nede, det er litt tilfeldig, fordi vi gjør Conga trommer. Og jeg har noen maracas ned her også. Så jeg kunne ringe spill trommemaskin, men det ville fortsette i det uendelige, og det kan begynne å ta tak opp alt minnet i systemet mitt. Så jeg vil kalle denne funksjonen spille musikk, som vi vil se, bruke avkorting parallelt sammensetning å spille vår lille Frere Jacques sang sammen med denne rare trommemaskin. Så la oss ta en titt. Og vennligst forbedre på min anordning av alle trommeldelene. Ikke min spesialitet, men jeg hadde mye moro å gjøre det. [MUSIC SPILLE] Så selvfølgelig, er dette alt litt ikke så gøy hvis vi ikke kan konvertere den til en score så kanskje det kan tolkes av et menneske utøver. Så jeg vil ikke kjøre den her. Jeg har allerede generert filene. Du kan se at det er en dot LilyPond file-- og dette vil være min naturlig overgang over til Connor-- og en prikk MIDI-fil, og en prikk PDF-fil, som er det LilyPond slutt vil generere. Men disse er disse skriptene, og jeg skal bare kjøre dem med deres hjelp alternativer. Hvis du får disse opp og kjører med Euterpea, kan du generere en MIDI-fil. Og deretter fra MIDI-fil med denne MIDI 2LY program, du kan generere en Lily Fil dam, og deretter kan generere en PDF av poengsummen. Og vi bør ta en titt på dette. Så Connor vil trolig vise deg hvordan du kan kommentere dette bedre, men dette er Frere Jacques som generert av meg i Euterpea. Det er bare i C. Jeg skulle ha funnet ut hva hacke det er faktisk i. Men det er rørledningen for hvordan du gjør det med det. La oss snakke mer om LilyPond. CONNOR HARRIS: OK La oss se. Visste du nevner Lær Du Haskell? STEPHEN KREWSON: Oh yeah. Sjekk ut Lær Du Haskell. Det er i ressursene. Det var slik jeg begynte læring, og det er flott. Ikke dum læring. CONNOR HARRIS: Så det er online. Så en fyr som heter [uhørbart] learnyouahaskell.com, ingen mellomrom. Grammatikk er syk. STEPHEN KREWSON: Det er illustrert, også. CONNOR HARRIS: Så hva er LilyPond? Det er en deklarativ programmering språk for musikk sats. Så declarative-- du kan tenke på ting som HTML, der du ikke saying-- HTML sier ikke hvordan nettlesere skal gjengi sider steg for steg. Det er bare å si dette er en tekstlig beskrivelse av hva du vil at siden skal se ut. Og så er det også et program som samler dette språket, eller det må du lese inn og deretter faktisk gjør sats for deg, og det spytter ut disse fantastiske leter PDF skårer. Du kan også få PNG format eller hva. En god måte å tenke på dette er ved analogi er at LaTeX er liksom som LillyPond, men for bare vanlig sats. Så i stedet of-- det ikke WYSIWYG, What You See Er hva du får, som, sier Finale er, eller Sibelius, eller Microsoft Word, der du kan skrive inn sanntid og utkast ting i sanntid og se endringer umiddelbart. Det er tekstbasert. Du må kompilere score ved hjelp av et eget program og komme ut PDF-filer senere. Dette er litt mindre praktisk for bruk hvis du er prøver å skrive direkte inn en score, og du er prøver å komponere på datamaskinen. Men det er mange fordeler for den. Man ser det mye bedre, fordi LillyPond kan faktisk ta deg tid til å gjøre layout beslutninger på riktig måte, i motsetning til Sibelius eller Finale, som har å gjøre kompromitterte algoritmer slik at de kan vise ting i sanntid. Så hvorfor er LilyPond-- datagrafikk er vanskelig. Hvis du gjør noe med musikk og du ønsker å skrive ut score, du ikke ønsker å skrive ut alt selv starter med hvordan å trekke staber og hvordan å trekke notatblokker. Det er veldig vanskelig. Det er blitt gjort før. Du er fine. Hvis du ønsker å bruke Finale eller Sibelius, filformatene for disse tingene er svært komplisert, og du kan ikke virkelig bruke dem programmatisk. Du kan åpne opp Sibelius med Finale og gå til Fil, Eksporter som PDF selv, men du kan egentlig ikke kalle det fra et manus. LillyPond, kan du ringe fra disse skriptene. Du kan enkelt veksle LillyPond med LaTeX. Jeg vil ikke ha så mye tid til å gå inn i disse teknologiene akkurat nå, men de finnes. Hvis du ønsker å se inn i en LillyPond bok, det er et program som følger med din LillyPond distribusjon, og det er for itera LillyPond fragmenter i LaTeX Hvis du ønsker å gjøre noe som en stor musikkvitenskap dokument med eksempler, f.eks. Og det er en god ferdighet for liv hvis du gjør noe med musikk, ikke bare CS50. Jeg har brukt LillyPond for alle av mine komposisjonsprosjekter siden jeg var i utgangspunktet en senior på high school. Så her er noen enkle eksempler. Dette er i utgangspunktet representant av vanskelighetsgraden at folk flest ville innse det de prøvde å bruke LilyPond for enkle prosjekter. Det første er i begynnelsen til en koral forspill av Bach. Denne nederste er et utdrag fra en av mine egne verk, og det er bare der for å vise deg ting som [uhørbart] å sette flere linjer i samme ansatte, hvordan lyrisk undersetting fungerer. Lyriske underlag er en ting som er veldig enkel å bruke LilyPond for kormusikk. Og så så er det litt mer kompliserte eksempler her. Alle disse er gjort i LilyPond og de er gjennomførbart. Denne første utdraget er fra [Uhørbart] av [uhørbart]. Og denne [uhørbart] fra et stykke for solo bass fløyte etter [uhørbart], som er en longtime-- som var en langvarig medlem av Musikklinja her, tror jeg. Jeg er ikke sikker på hvor han har gått til. Men han var rådgiver for Harvard Komponister Association for lang tid. Fantastisk mann. Og han skriver litt musikk som har svært komplisert notasjon som LillyPond kan likevel håndtere veldig pent. Så bare for å gi deg en følelse av hva Denne saken evner are-- så innvendige av LillyPond er meget komplisert. Og du kan bruke det for en lang tid, herunder for noen ganske komplisert ting, uten egentlig å vite mye om dem. Men den grunnleggende idé er at i laveste nivå, atomer av LillyPonds er notene. Notatene inneholder en kontekst kalt stemmer. Så stemmen sammenheng utgangspunktet tilsvarer til en eneste linje med polyfoni. Og så sammenheng kan være inneholdt hierarkisk i høyere nivå de som representerer staber på scoren eller større grupperinger som piano staber eller kor staber, og så til slutt Hele rille sammenhenger. Og du kan faktisk omfatte flere score i en bok. Og hver sammenheng har en antall vedlagte gravører. Hvis du ser gjennom Innholdet i en kontekst og skrive ut en bestemt symbol eller en viss klasse av symboler som er nødvendig. Så til alle stemme sammenheng, det er [uhørbart] notater gravør som er i utgangspunktet en funksjon eller et objekt som skriver ut hele notatet hoder på de riktige deler av en side. Så er det en kløft gravør, som skriver ut kløfter på de ansatte. Så er det en metronom mark gravør som skriver ut metronom merker i en poengsum. Og alle disse passer ganske godt inn i hierarkiet. Og det er veldig, veldig, veldig passelig, som du trenger Hvis du ønsker å få ting sånn. Så alle sammenhenger har en Mange forskjellige attributter at du kan endre for alt fra avstanden til ulike skrift utvalg til størrelser på ting. Hvis du ønsker å gjøre selv mer kompliserte ting, det er en innebygd skriptspråk. De bruker ordningen, som er dialekt av LISP. Disse sannsynligvis ikke betyr noe for deg. Men innerst inne, en ordning annen funksjonell programmeringsspråk, mer eller mindre. STEPHEN KREWSON: Den tie-in. CONNOR HARRIS: Yeah. Det er en god tie-in, antar jeg. Og det er brukt som et undervisningsspråk, faktisk, ned Mass Ave. Ved MIT. Og det er veldig nyttig for LillyPond av ulike tekniske årsaker. Og så hvis du ønsker å gjøre enkle tilpasninger avhengig conditionals, for example-- det er sikkert tilstanden til en poengsum som er oppfylt, gjøre endringer i layout eller whatnot-- deretter disse fasilitetene er der. De er komplisert. Så her er en ganske enkel kode prøven. Det er fem linjer. I utgangspunktet er jeg definere to staber. Det er i 3/4. Den første ansatte har en festet tempo mark, men det som faktisk skjer å gå på til hele score, fordi tempo merker er på lagene fortsatt. Metronomen mark gravør er festet til ballen sammenheng. Det finnes forskjellige nøkler, fordi [uhørbart] gravør er festet staber. Du kan faktisk gjøre er. Prøven jeg skrev er faktisk i C-dur, men det er bare å demonstrere at du kan ha forskjellige nøkler i forskjellige staber. Og den grunnleggende syntaks er du skriver merk navn med E, F, G, uansett. Hvis du ønsker å gjøre fortegn, du suffiks eller ES. Dette er fra Dutch musikkvitenskapelige konvensjoner. Og for å gjøre oktav sprang, må du bruke disse aksemerker, komma eller apostrof. Den relative betyr bare hva du har et notat, vil det automatisk bli plaec i oktav nærmest den forrige. Og hvis du ønsker å hoppe mer enn en fifth-- si en femte eller mer-- så må du bruke [uhørbart]. Men ellers, trenger du ikke å spesifisere oktav av hver eneste tone. Og relativ C, prime, og C, du bare oppgir midten C og basen C, spesielt første tonene. Da har du disse staber som organiserer disse to stemmer eller prøver av musikk, og du har en poengsum. Og det ser ut som dette. Hvis du ønsker å ta deg tid til kopi som prøve av LillyPond koden på den tidligere gli ned her, og du kan skrive det for LillyPond selv. Jeg vet vi har noe som ser mye som dette. Så det er en annen teknologi heter Music XML vedlikeholdt av helt forskjellige personer. XML er en tekstdata structure-- jeg skal ikke si data structure-- si metafor kartet liksom. Og det er designet for å holde hierarkiske data svært godt. HTML, for eksempel, er en type av XML. Og du kan fortelle XML fordi de hadde alle vinkelparenteser og vinkel brakett slash merker som viser datafelt. Jeg har ikke en kode eksempel fra Musikk XML. Du kan finne det selv. I utgangspunktet grunnen til at du kanskje ønsker å bruke XML som mellomtrinnet er først av alt, det er en utvekslingsformatet for i utgangspunktet every-- jeg skal ikke si hvert, men mye forskjellig poengsum forfattere. Så hvis du skriver i Music XML, ikke bare kan LillyPond lese det med hjelp av denne auxilary program som heter Musikk XML til LY, men også Finale kan lese det, Sibelius kan lese den. Avhengig av hvordan den interne objekt hierarkiet fungerer for å representere musikk, det kan være lettere å skrive ut til Musikk XML enn å LillyPond og bare stole på Music XML å LY å gjøre konverteringen. Jeg tror ikke [uhørbart] har Music XML. STEPHEN KREWSON: Det gjør ikke. Noen jobber med det, though. CONNOR HARRIS: OK. Euterpea har ikke en Musikk XML utgangsfunksjonen ennå. Hvis du vil ha et avsluttende prosjekt idé, kanskje komme i kontakt med gutta at Stephen vet, og de kunne bruke din hjelp. STEPHEN KREWSON: Jeg ville elske det. CONNOR HARRIS: Også, i utgangspunktet, hvert programmeringsspråk det er verdt sin salt allerede har en XML-bibliotek, slik at du kan internt konvertere alle musikken din til et objekt at XML biblioteket kan skrive ut som ville kreve færre endringer i den interne strukturen uansett musikk objekter du ønsker å skrive enn å skrive det direkte i LillyPond ville. Så bare skrive det ut med XML med XML bibliotekene i språket, som vil garantere at det er syntaktisk riktig og alt, og deretter konvertere den til LillyPond. Så teknologi kan det være lurt å se nærmere på hvis du gjør noe som dette. [Uhørbart], en annen auxilarry teknologi. Dette er i utgangspunktet Tech Works eller Tech Studio for LillyPond. Så det tilbyr hjelp med syntaks, med maler for ulike felles kombinasjoner av instrumenter. Den lar delt skjerm ser så du kan ha koden din i ett vindu og PDF i et annet vindu og klikk på steder i PDF for å hoppe til den aktuelle flekker i kildekoden. Dette er mer nyttig hvis du faktisk er skriving LillyPond filer selv enn hvis du genererer dem programmatisk. Men igjen, det er noe nyttig å ha. Flott. En annen resources-- Jeg vil bare gå gjennom denne meget raskt. LillyPond manuals-- LillyPond har god dokumentasjon på sin hjemmeside. De har en tutorial. De har en syntaks referanse. De har hundrevis av tekstbiter for diverse små ting yo trenger gjøre for å demonstrere ulike evner. Hvis du ønsker å bruke skriptspråk eller gjøre mer omfattende tilpasninger, så er det innvendige referere til denne nettadressen. Hvis du ønsker å bruke musikk XML, det er som URL, musicxml.com/tutorial. Og hvis du trenger å lære ordningen fordi du faktisk ønsker å bruke skript anlegg i LillyPond, så er det en [uhørbart] kalt Strukturert Tolkning av dataprogrammer, som ikke bare er den andre størst CS lærebok noensinne written-- finne meg etterpå hvis du ønsker å vite hva jeg tror den største en er-- men det er også en veldig god innføring i språket skikkelig. Du trenger ikke mer enn de første seksjoner. Og det er det. Noen spørsmål? STUDENT: Hvor kan jeg laste ned genererte Frere Jacques slik at jeg kan sette det på min iPod? STEPHEN KREWSON: Vel, du kan skrive ut til noen wav fil i Euterpea. Og du har koden. Det er på GitHub. Lag dine egne varianter av Frere Jacques av CS50 hive tankene. Det ville være flott. CONNOR HARRIS: Noen andre? STEPHEN KREWSON: Vi trenger en bedre basstromme, også. Det er virkelig ille. STUDENT: Euterpea har ikke bare sammensetningen side, men signal-- STEPHEN KREWSON: Ja. Faktisk arbeidet jeg gjorde i Euterpea når jeg tok dette-- det er en oppgradere kurs ved Yale som bruker it var på lyd syntese. Så det er en veldig fin måte å bruke pilene og noen av notasjon vi så av komponere sammen signalfunksjoner. Spesielt bassen for mest av dem er bare en enkelt sinusbølge. Men hvis du begynner å skrive dem i rare programmatiske måter, du kan bli sprø lyd effekter, som rare kaskader. Du kan lage veldig modig lyder med mye modulering. Jeg gjorde et prosjekt på granulær syntese, som er sted i mellom FM og prøvetaking. Du tar svært liten, lite utvalg, og deretter kombinere dem med en slags modulator og bygge opp en fyldigere lyd. Vi gjorde også fysisk modellering, så prøver å tenke på fysikk og psykoakustikk av noe sånt en trompet, og tenker på den måten lyden er spretter av bell fra trompeten og akustikken rommet og modellering som sammen med de grunnleggende oscillatorer. CONNOR HARRIS: Takk så mye. Takk for at du kom. Og jeg er alltid villig til å ta spørsmål ved email-- connorharris@college.harvard.edu. STEPHEN KREWSON: Yeah. stephen.krewson@yale.edu. Kjølig.