CONNOR Harris: Hi. Ek is Connor Harris. Ek is 'n CS50 CA by Harvard. STEPHEN KREWSON: Ek is Stephen Krewson. Ek is 'n TF vir CS50 by Yale. CONNOR Harris: En ons gaan om te praat oor 'n paar tegnologie wat jy dalk wil gebruik as jy belangstel doen 'n finale projek of werklik enigiets met musiek. Ons gaan fokus op die eerste 'n programmeertaal genoem Haskell. Dit is 'n funksionele taal, sodat die paradigma is baie verskillend van C of PHP of ander noodsaaklik tale wat jy reeds gebruik het, en veral op 'n biblioteek geskryf in Haskell genoem Euterpea, wat mense kan help met die skryf van musiek funksioneel, basies. En Stephen sal loop jy deur 'n groot voorbeeld. Na hierdie, sal ek jou bekend te stel aan iets genoem LillyPond, wat is 'n tegnologie vir setwerk musiek. Dit is soort van soos LaTeX musiek indien enige van julle het LaTeX gebruik word vir wiskunde klasse of ander P stel klasse of wat jy het. En so sal ek aan julle gee, weer, 'n paar eenvoudige voorbeelde van die en wys wat jy in die algemene rigting van 'n paar beter hulpbronne. STEPHEN KREWSON: In Daarbenewens het ons gedink dit sou cool wees om die opstel wees 'n bietjie van wenke na 'n pypleiding tussen -Euterpea gegenereer MIDI-lêers in LillyPond, sodat ons 'n opdrag op die skrifte daardie wat doen voorsien LillyPond net om dit open source hou en kry 'n pypleiding gaan. CONNOR Harris: Weereens, Ons moet beklemtoon, hierdie twee tegnologie, jy nie om hulle te gebruik. Hulle is nie ontwerp om te werk saam, al is hulle baie mooi. STEPHEN KREWSON: Right. En heeltemal gratis. CONNOR Harris: So erkennings, lees net dat. STEPHEN KREWSON: Behoorlik opgemerk. Danksy dié mense. Dit sal ek vertoef op die net vir 'n oomblik. Die installasie proses is 'n bietjie bietjie lastig. Ons het 'n lees my op die GitHub dat jy 'n blik op kan plaasvind. Net my e-pos as jy enige vrae het. Maar ons sal hierdie hardloop onder die aanname dat dit werk vir almal. CONNOR Harris: En as jy nie kan nie kry LillyPond om te werk, geen groot deal. Daar is geen live samestelling wat betrokke sal wees, ten minste op my einde. STEPHEN KREWSON: Haskell en LillyPond moet albei installeerders. Euterpea afgelaai as 'n pakket, so aan en so voort. So ons praat oor die rekenaar musiek. En dit is net 'n baie 50.000-voet oog. Daar is 'n paar verskillende aspekte van dit. En dit is rof en is gaan 'n paar detail verduister. Maar ons kon dink aan iets soos algoritmiese komposisie, met behulp van algoritmes, die gebruik van kode te genereer 'n soort of-- miskien 'n self-soortgelyke volgorde van note, of dalk notas onder 'n beperking. En dan diegene wees verrig of geïnterpreteer met analoog instrumente of iets soos dit. Maar die samestelling was algoritmies gedoen. Maar natuurlik, miskien is die gebied van die rekenaar musiek of digitale musiek ons is meer vertroud met digitaal klank sintese of digitale sampling en digitale opname. Daar is baie van digitale instrumente gedoen deur middel van digitale steekproefneming. In werklikheid, sal ons met een van dié in die vorm van 'n gesonde font biblioteek later. Maar daar is ook iets genoem digitale sintese wat uitgetrek het, van die laat 70's en in die 80's met Yamaha en John Chowning by Stanford doen FM sintese of Frekwensiemodulasie sintese, waar jy 'n draer het sein en 'n modulasiesein beide in die klank spektrum. Maar wat ons gefokus op vandag is iets genoem MIDI, en natuurlik, algoritmiese komposisie. Ons gaan nie om instrumente te maak, maar ons plaas gaan 'n paar musiek te maak, en dan wat sal kry geïnterpreteer deur sommige instrumente wat is conformant die algemene MIDI standaard. So, wat is MIDI? Ek is nie van plan om te diep in dit, maar MIDI is data-oordrag protokol. Dit is 'n soort van 'n gids oor verskillende maatskappye en nywerhede vir die organisering van klanke of kolle. So ons sal sien dat daar is 'n MIDI standaard vir al die verskillende perkussie klanke en MIDI aanbevelings vir al die verskillende tipes synth of verskillende tipes al die instrument groepe in 'n orkes, sê. Is jy waarskynlik vertroud met 0 127 deur MIDI boodskappe. A MIDI sein is tipies 'n bietjie aan te dui of dit 'n data of 'n status pakkie, en dan is daar sewe stukkies van 'n sein. En dit kan beheer alles van volume om die aksie of druk op 'n spesifieke sleutel as jy die verrigting met 'n MIDI kontroleerder asook, natuurlik, notas. En natuurlik, MIDI het was uiters nuttig, want dit is 'n manier om die draad saam of daisy chain 'n klomp van MIDI hardeware toestelle. Ek het sewe of agt terug by my huis. Dit raak ingewikkeld, maar dit is werklik 'n kragtige. En dit is regtig oud. Dit is uit die vroeë 80's, en dit is regtig mooi en klein. CONNOR Harris: Ja. Al die klassieke Nintendo video speletjies sou waarskynlik het MIDI-lêers vir musiek, byvoorbeeld. STEPHEN KREWSON: Hier is 'n voorbeeld van algemene MIDI, wat as 'n soort MIDI algemene protokol. En ek dink ons ​​kan dink van die verskil tussen die spesifikasie dat daar iets soos moet wees hierdie instrument klanke en die werklike verwesenliking van die instrumente klink in 'n gesonde font of 'n bepaalde MIDI sintetiseerder as die verskil tussen miskien 'n typeface-- wat sê in die algemeen, is dit die ontwerp van hierdie spesifieke manier om verteenwoordig characters-- en 'n spesifieke lettertipe wat 'n spesifieke grootte en timbre, en daar is besef van the-- CONNOR Harris: Miskien is 'n beter vergelyking sou wees die Unicode standaard says-- dit gee 'n nommer aan elke karakter, en regtig elke taal in die wêreld, of 'n groot versameling van skrifte van taal in die wêreld, en dan diegene is gelewer in iets grafiese deur verskeie font pakkette. En natuurlik, kan jy dink MIDI as die Unicode van klank. En dit is net 'n lys of-- 'n groot stroom van gebeure en instrumente en noem maar op, en jy het om 'n aparte het program, soos 'n lettertipe, om te lewer wat in iets wat hoorbaar. STEPHEN KREWSON: So hoekom Haskell? Haskell is 'n funksionele programmering taal, baie gevorderde, baie anders C, baie anders PHP. En ons gaan om te sien dat daar 'n gemak van funksie samestelling in Haskell wat ons sal toelaat om deur wind komponeer of tik op, transkribering, iets soos Frere Jacques, hierdie eenvoudige liedjie wat het 'n baie van die dele in dit wat is self-soortgelyke of herhaal. So sal dit wees 'n paar van die motivering vir waarom ons gebruik Haskell, waarin funksies is eerste klas burgers. En ek wou uit te brei dit 'n bietjie. Dit is 'n bietjie maklik om noteer Frere Jacques in Haskell. Maar wat as ons wou voeg 'n drom deel dit? Wat as ons wou probeer om iets soos 'n Roland 808 of 909 drom masjien waar jy ongeveer 16 verskillende stappe? Gewoonlik is hierdie gedink as 16 notas. En jy kan beheer die globale tempo, en jy kan kies uit 'n klomp van verskillende perkussie dele van die bas drom, 'n klap, verskillende strikke, oop en geslote hoë hoede hierdie soort van kanale, en dan kan jy EQ of hul volume te verstel. En ons sal 'n mooi manier in te sien Haskell te verteenwoordig hierdie stap sequencer met al die verskeie koel dinge in Haskell ons kan doen met die opwekking lyste en filter oor lyste kartering oor lyste, kartering funksies oor lyste. En 'n vinnige verskoning. Dit is 'n baie oorsigtelike en té vinnige skets van sommige van die aspekte van Haskell en Euterpea, wat is 'n domein-spesifieke ingebed taal geskryf in Haskell vir musikale tipes. So moet asseblief check die kode aanlyn. Brand GHCI, wat is die Glasgow Haskell Compiler Interpreter. En Ek sal 'n paar doen van hierdie in 'n bietjie sodat jy kan sien hoe dit gedoen word. En dit kan jy in te laai met the-- die sintaksis is kolon en dan die opdrag. Jy kan laai in lêers. Jy kan blaai gebruik op die lêers om al die funksies sien dat bestaan ​​in 'n bepaalde module. En dan as ons sal sien, tipes en tipe klasse is so belangrik in Haskell, sodat jy kan altyd veral check-- As jy werk in 'n nuwe lig gebring soos hierdie, wat is 'n soort musiek? Ek weet oor die manier waarop numeriese tipes werk in Haskell, maar ek weet nie veel oor musiek. Maar jy kan die manier waarop hulle is verken gedefinieer deur die gebruik van hierdie t of tik 'n bevel en dan roep in 'n bepaalde funksie of 'n data voorwerp. CONNOR Harris: Ja. As jy gedink het C en klang was hardass oor tipes, jy het geen idee oor Haskell. Die goeie ding omtrent Haskell is dat as jy jou kode kan kry om saam te stel en as Haskell tipe tjeks, dit is waarskynlik reg, omdat die tipe stelsel is so streng. STEPHEN KREWSON: Ja. So ek wil net om te gaan through-- en weer dit is nie om dit te doen 'n paar van die justice-- die kenmerke van Haskell dat ten minste om sy creators-- en dit is geskep in die laat 1980's deur 'n klomp van die mense, 'n komitee van ongeveer 20 people-- gedink het belangrik is. En die eerste ding wat hulle in 'n vraestel gelys wat beskryf die ontstaan ​​van Haskell oor die eerste 20 jaar of so was dat dit lui. So, wat beteken dit? Wel, dit beteken as ons het 'n soort van uitdrukking, moet ons om dit te evalueer. En Haskell doen dit in 'n oproep van behoefte manier of 'n nie-streng manier. Dit is, as ons 'n klomp van die komponente van ons uitdrukking, ons probeer om die evaluering te vertraag van daardie subkomponente totdat die absolute laaste minute-- dit is totdat ons hulle werklik nodig het. So hierdie means-- wat regtig cool, veral as ons dink oor die onttrekking van 'n musikale stap sequencer. Jy draai dit op, en jy begin hardloop 'n stap sequence-- As jy al ooit saam met 'n drom machine-- en dit gaan net vir ewig. So sou dit regtig lekker wees as ons kon navolg wat in Haskell. En ons kan dit doen met 'n oneindige waardes, in die besonder oneindige lyste. Dit is baie maklik om 'n tik oneindige lys Haskell. Jy kan net gebruik die sintaksis af hier, waar jy sien 1 deur middel van 3, verwyder die 3 1 dot dot, en dit is 'n oneindige lys van al die natuurlike getalle uit te brei op so ver as jy kan dink. Ek wil 'n stel konsep van voue dadelik. En weer, die doel van hierdie seminaar is nie om te leer oor voue in Haskell of hoër funksies orde. Maar ek wil net om dit bekend te stel aan gee 'n akkurate begrip van hoe vreemd Haskell is en hoe sterk dit is. En in die besonder, ons gaan be-- wanneer ons dit doen ons verskillende drom dele, ons gaan word manipuleer lyste van getalle, vou hulle op mekaar. En om dit te doen, sal ons wees gebruik van kaarte en voue. Daar is 'n reg assosiatiewe vou, wat is hierdie een reg here-- 1 minus die hoeveelheid, 2 minus die hoeveelheid, 3 minus 0. En die sintaksis vir 'n vou, jy 'n vou gee 'n basis waarde en dan 'n operation-- in hierdie geval, optelling of aftrekking. Ek het beide gevalle getoon. En dan is daar 'n akkumulator wat ophoop oor die hele lys, die toepassing van daardie operateur plus of minus, en dan opbou nie. So hierdie the-- sal wees as dit genoem met vou r plus 0, wat begin met 0, sou ons dan al som die getalle in die lys. En dit is 'n lys 1-3. CONNOR Harris: So om dit 'n ander plaas manier, vou r neem drie argumente. Daar is 'n funksie wat self neem twee argumente, dan is daar 'n voorgereg waarde en daar is 'n lys van waardes. En wat jy doen, is jy neem voorgereg waarde eerste waarde, sit dit in die funksie. Wat kry jy uit neem, voer wat in die funksie van die tweede waarde wat jy kry, neem, te voed wat in die funksie van die derde waarde. En dan as jy gaan af hierdie hele lys op hierdie manier, jy gaan om uiteindelik sommige enkelvoud waarde wat van dieselfde tipe wat jy begin met en van dieselfde soort as dinge in die lys, en dan dit is die terugkeer gevolg van vou R. STEPHEN KREWSON: So in die besonder, dit is hoër orde funksies, omdat hulle met 'n ander funksie as een van die argumente. CONNOR Harris: Ja. As jy sekere ander gebruik het languages-- Ek weet R, [onhoorbaar] taal het dit genoem te verminder. Jy kan soortgelyke funksies in ander tale, net genoem verskillende dinge. STEPHEN KREWSON: En wat is lekker oor vou R in hierdie geval is dat vou R kan werk met 'n oneindige lyste. So in hierdie bodem, hierdie P5 genereer die notas wat is aangeskakel in die stap sequencer vir sommige drom deel, die vyfde drom deel, en miskien is dit 'n conga drom of iets. En dit is 'n doelbewus stomp manier skryf van hierdie, maar dit is pret, want dit blyk 'n baie dinge oor Haskell en Euterpea. So vou R van hierdie colon-- kolon net 'n operateur dat dinge stoot saam op 'n list-- beroep op 'n leë lys, wat net die leë hakies. En ek vra dat op hierdie oneindige lys. Dit is eintlik twee lyste bymekaar getel hier af. Die lys 1 komma 6 dot dot is 1, 6, 11, 16. So Haskell-- in net 'n paar karakters, kan jy kan die hele genereer volgorde van getalle dat vyf nommers is uitmekaar strek oor na oneindig. En ek prefix om daardie hierdie korter bietjie list-- 3, 8, 21-- net om jou te wys hoe kan jy lyste koppel. En dan het ek gevou op homself. En dit eindig net 'n soort van identiteit operasie, maar dit is oneindig. En vou R kan dit doen, want dit lui evalueer, soos in die bogenoemde. As ons 'n 1 en 'n 2 en 3, wat ons kan net hakies af die hele res van dit. Dit sal nie werk vir minus of plus, maar dit sal werk vir hierdie kolon identiteit werking op die lys. So hoe kan ons prakties gebruik dat as ons 'n oneindig lang lys van dinge? Wel, Haskell bied 'n baie functions-- en meer in hierdie kyk in jou eie time-- soos neem wat sê: OK, ons is genereer die oneindige lys maar ons gaan net 'n paar te neem aantal en dit in hierdie case-- ons sal dit sien later in ons drum machine code-- GM is net 'n soort van globale veranderlike vir die aantal stappe in die sequencer. Op die roll-in masjiene ek het jy, dis tipies 16, maar ek het dit geïmplementeer met 32. Dit maak nie regtig saak nie. Haskell is ook suiwer, so dit het 'n sterk statiese tik wat Connor verwys na. So funksies wiskundige in die sense-- hulle is meer wiskundige dat hulle gewaarborg om nie toegang tot of verander enige soort veranderlike of verrig inset of uitset. So as jy 'n funksie het, dit is deterministiese. Dit sal altyd dieselfde terugkeer waarde in die staat van die program of bly dieselfde. Daar is natuurlik uitsonderings monad ische test hierdie, maar dit is buite ons omvang. CONNOR Harris: Ja. Wat dit beteken, al is, is daar is 'n paar belangrike [onhoorbaar] gevolge van hierdie. Een daarvan is dat dit is baie maklik om te paralleliseer Haskell programme. Want as jy het, sê, 'n funksie van die om te werk op 'n miljoen waardes, as jy weet dat die funksie sal altyd gee uit dieselfde waarde indien jy voed op 'n sekere value-- as jy [onhoorbaar] f van 1, f van 2, dan is f van 3 of whatnot-- f van 1 gaan nie uit te skryf na 'n lêer of iets te doen wat sal die waarde van f2 verander. Jy kan net verdeel hierdie funksie om 'n miljoen verskillende masjiene of 'n miljoen verskillende drade of wat ook al, kry al die antwoorde terug, kry al die terugkeer waardes terug, en dan dit is dit. So baie maklik om dinge paralleliseer. Die nadeel is dat insette en uitset veral pas in die tipe stelsel in 'n baie ingewikkelde maniere. Ons sal nie in daardie reg nou gaan, maar ek u aanmoedig om te kyk na 'n paar hulpbronne aanlyn as jy wil om te leer oor dit. STEPHEN KREWSON: So tik classes-- en dit was-- klasse tipes is uitgevind om op te los 'n probleem van operateur oorlading. So ons wou gelykheid tussen verskillende tipes van die dinge. Natuurlik, kan ons dink of-- gelykheid tussen numeriese tipes is baie maklik om te dink oor, maar Wat van gelykheid tussen lyste? Wat van gelykheid tussen boom been data strukture? En dit is alles moontlik in Haskell gevolg van die tipe klasse. So as jy 'n sekere data type-- definieer en hier, dit is musikale plekke. Ons uiteindelik om om 'n paar rekenaar musiek. So ons het C, C skerp en so aan en so voort. Hulle behoort aan 'n klomp van die verskillende tipe klasse. EQ-- hulle behoort aan die tipe EQ klas. Dit beteken dat hulle ondersteun bedrywighede gelykheid. Sodat jy kan evalueer of een volgorde van musikale primitiewes is dieselfde as 'n ander een. Hulle behoort aan die ordinale klas. Dit beteken daar is 'n bestel hierdie. D kom nadat C. C skerp kom nadat C as well. Hulle behoort tot die klas wys, wat beteken dat hulle kan gedruk om 'n konsole of terminale. Hulle behoort aan die klas vervat, wat beteken dat selfs al dit is karakters, hulle het 'n onderliggende numeriese verteenwoordiging begin by 0 en gaan af deur egter baie dinge is hier, 20 of so, of 30 of 40, miskien. CONNOR Harris: En toe ons het 'n tipe data dat derives-- met die navraag "deriving--" 'n sekere tipe klas, beteken dit dat die samesteller sal probeer outomaties iets te bou. So miskien sal jy wil definieer 'n kwaliteit anders. Jy sal wil hê om C skerp definieer as gelyk aan D plat, byvoorbeeld. Met hierdie konstruksie hier, dink ek nie C skerp en D plat gelyk wees, want samesteller sal outomaties sê elke verskillende moontlike waarde is te onderskei van al die ander. Dit is so moontlik om te ignoreer die standaard implementering van hierdie tipe klasse. Weereens, kyk na die verwysing indien jy wil om te leer oor dit. STEPHEN KREWSON: En hier, eintlik, sal hierdie wees nuttig vir wanneer ons later kodeer. Ons sien 'n paar van die infix operateurs vir sekwensiële samestelling, parallel samestelling, en so weer, hierdie plus punte en gelyke tekens omring deur dubbelpunte. Dit beteken dat ons hierdie verskillende speel musikale primitiewes die een na die ander. Dit is sekwensiële samestelling. Of ons kan hulle speel in parallel op dieselfde tyd. So kan ek 'n musikale waarde, en dan is dit gelyk en dubbelpunte, infix parallel samestelling operateur, en hulle speel as 'n soort van koord. En ons gaan om te gebruik wanneer ons saam ons drom deel met ons bietjie Frere Jacques lied om hierdie twee rye speel musikale waardes op dieselfde tyd. Currying is-- Curry was verlede Naam van Haskell Curry, wat beeld Haskell vernoem is. En dit laat ons 'n nice elegansie wanneer ons skryf al hierdie verskillende funksies of filters dat ons gaan kartering wees oor ons lyste. 'N funksie van twee arguments-- f van x en y-- kan word as f van x toegepas y. So dit is 'n funksie van een argument dat terug 'n ander funksie van een argument. So dit beteken dat ons kan karteer n funksie f van x oor lys van y se. CONNOR Harris: wil gee 'n voorbeeld van hierdie? STEPHEN KREWSON: Ja. Ek het 'n voorbeeld hier uit sommige van die dinge wat ons sal skryf. So herhaal 2-- goed, herhaal sal neem een waarde wat hoeveel keer om iets te herhaal, en dan sal dit 'n value-- neem gewoonlik 'n lys of iets. So hier, ons is kartering herhaal 2 oor 'n ander lys. So as ons karteer herhaal 2, as ons herhaal 2 van toepassing om die eerste element van hierdie list-- en dit is lyste van musikale phrases-- sal produseer twee van "jy sleeping--" so jy slaap, slaap jy. So nou het ons twee. Maar herhaal neem twee argumente, maar omdat ons currying en dan kartering, Ons kan herhaal 2 verteenwoordig as mense wat teruggekeer as 'n funksie van een argument-- net twee keer replicerende. En dan is ons die toepassing van daardie aan elke element van hierdie lys van frases. En concat is 'n Haskell operasie vir plat te slaan 'n lys. Omdat herhaal 2 wil produseer 'n lys van lyste. En dit is hier intermediêre vorm. En so kan ons dan concat of plat dat uit twee keer. CONNOR Harris: 'N eenvoudiger voorbeeld van currying, as jy wil like-- dink f is net 'n vermenigvuldiging funksie wat twee neem argumente en keer terug van hul produk. So as jy 'n f 4 5, dit is 20. Maar jy kan dink van hierdie as also-- jy het 'n funksie f 4 wat neem 'n argument en opbrengste vier keer die argument-- net gedeeltelike aansoek wat net een argument 4. En as jy voed f van 4 5, wat sal jy 20 gee. En dit is 'n eenvoudiger voorbeeld van currying. Dit is gewoonlik een van die handboek kinders. STEPHEN KREWSON: Lambda uitdrukkings of anonieme funksies is 'n ander kenmerk Haskell. So as ons nodig het om 'n sweep bietjie funksie lewe herhaal, maar sê dit is nie in die standaard biblioteek, kan ons 'n sintaksis gebruik soortgelyk aan die volgende. En ons sal wind oor hierdie. Een ding wat jy sal sien 'n baie in die drom masjien ons die maak van oproepe om iets genoem filter, wat net soos voorheen, is 'n afbeelding van 'n funksie oor 'n lys, maar dit is 'n afbeelding van 'n Boole-funksie. Dus het ons hier 'n voorbeeld van 'n 'n anoniem gedefinieer Boole funksie wat neem net 'n paar waardes. Dit is nie streng gesproke 'n anonieme funksie. Maar dit is te definieer met dat sintaksis vir bondigheid, en dit neem net x module n-- CONNOR Harris: Ja. So f is 'n funksie van twee argumente N en P dat 'n funksie wat op sigself terug 'n funksie van een argument, naamlik x. STEPHEN KREWSON: Ek Bogenoemde infix operateurs. Wat is infix operateurs? Wel, infix operateurs is die normale manier waarop ons bedrywighede verteenwoordig, sê in mathematics-- 2 plus 2 in plaas van die operateur plus en dan twee argumente 2 en 2. CONNOR Harris: Dit is genoem reverse polish notasie, wat 'n term wat ek twyfel enige van julle sal weet. STEPHEN KREWSON: Right. Reverse polish of voorvoegsel notasie. Maar Haskell besluit om gebruik infix operateurs. So dit is 'n paar van die persoonlike diegene wat gedefinieer vir die Euterpea lig gebring in Haskell. So was hierdie sekwensiële samestelling. Dit was parallel samestelling, en dit is truncating parallel samestelling. En ons sal nodig het dat met ons drom masjien, want ons sal gebruik om die laaste operateur in daardie klein tuple daar om die drom masjien speel saam met ons Frere Jacques liedjie. En ons drom masjien is gaan oneindig wees. Dit speel net vir ewig. Maar die Frere Jacques lied is nie. Dit is nie so lank. Dit is net 'n paar bars. Sodat ons na die drom masjien te stop as nodig Sodra die korter musikale waarde kom tot 'n einde. En dat infixed operateur is super nuttig met dit. En infix notasie soos dit is soort van mooi, omdat jy sê 'n funksie soos het quote, wat die afdeling heelgetal gee van x deur iets else-- jammer, wat moet a en b. Jy kan dit skryf as 'n kwotasie van b. So as jy put-- element is nog 'n voorbeeld van hierdie. x element in sommige lys, as jy dit in Backticks, kan jy dit gebruik. Selfs al is dit nie 'n simbool soos plus of minus of tye, kan jy die naam van 'n gebruik funksie soos wat in Backticks as infix operateur, wat is pretty cool. CONNOR Harris: Weereens, dit is almal net sintaktiese suiker, regtig. Dit affekteer nie die kern van taal. STEPHEN KREWSON: So sien ons hier vir die laaste frase van ons Frere Jacques lied, Ek het 'n paar klein akkoorde of derdes met behulp van die parallelle samestelling operateur. Dit is 'n ander manier om te sê sommige van wat ons het net gesê. So kan jy die kaart funksies een argument oor lyste. CONNOR Harris: Weereens, verwysings vir Haskell-- inleidende handboeke sal al hierdie te hê in dit. STEPHEN KREWSON: So hier is 'n mooi sleutel lyn van die stap sequencer ons sal 'n blik op die gebruik van te neem 'n lys begrip. En ons sien hier is dat element in vaste operateur in die rug aanhalingstekens. So as x is 'n element van die lys van x, dan sal ons 'n beroep op slagw funksies. So slagw is net 'n perkussie-funksie. Dit neem 'n bietjie waarde p dis deel van die versameling van alle begrensde die verskillende perkussie klanke wat ons gesien het in 'n vorige skyfie, en dan gee dit dat duur van 'n kwart noot. Anders dit gee dit 'n QNR en QNR is net 'n kwart nota rus. So, dit is die opbou van iets mooi. Ons het 'n lys van die elemente en ons sal loop oor 'n paar van die een lys tot die maksimum waarde van ons stap sequencer. En wanneer ons op 'n bepaalde i in dat die lys van die een na die maksimum waarde, as dit i is 'n lid van hierdie stel geskep in hierdie funksie, Wel, dan draai ons dit in 'n perkussie noot. Andersins, het ons net 'n rus, speel wat is om te sê, het ons net stil bly. En ons kan hier sien dat in hierdie lys begrip sintaksis, x word bevolk deur hierdie lys gebou een om die globale omvang van die sequencer. CONNOR Harris: Ja. Die basiese sintaks vir lys begripstoetse is bracket, waarde wat sommige veranderlikes, bar, moontlike waardes van die veranderlikes hulself, gesluit bracket. En as jy versamelingskeurdernotasie gedoen het in enige soort van wiskunde klas, jy dalk 2n sulke gestel N is in of n is in z. Soortgelyke thing-- hierdie notasie bedoel suggestief te wees van daardie wiskundige simbole. STEPHEN KREWSON: en jy kan verskeie predicaten toepassing en verskeie filters in 'n lys begrip, wat baie mooi. Algebraïese types-- ons sal nie lank hier vertoef. Daar is nie 'n goeie idee in Haskell of 'n goeie, duidelike idee hoe om te neem, sê, 'n standaard parameter om 'n funksie of iets. In Python, dit is baie maklik. Jy kan net sê met gelykes op die verklaring van die funksie, 'n standaard waarde in geval geen voorsien. In Haskell, kon jy dalk gebruik miskien die miskien tik, wat neem óf niks of 'n waarde van net 'n soort. Sodat ons ontgin dit in die drom masjien sodat ons opsionele volume te gee parameters aan elk van die drom dele. So dit gee ons 'n manier om EQ of 'n volume op 'n spesifieke kanaal. CONNOR Harris: In ander Haskell voorbeelde, jy kan sien dalk gebruik word vir funksies wat kan misluk. Dit is 'n algemene een. STEPHEN KREWSON: En jy kan lewer 'n soort van fout boodskap as 'n standaard. En dit is veral handig wanneer jy doen die I / O in Haskell. Dit kan wees truuks. CONNOR Harris: Of vir 'n soortgelyke voorbeeld, dink van 'n funksie wat verdeeldheid behels van 'n parameter wat dalk 0. En daardie funksie kan terugkeer miskien ook al. So as daar geen verdeeldheid met 0, dit sal net alles terug te keer. En as daar is deling deur 0, sal dit niks terug as 'n manier van sein die fout. Want 'n mens as gevolg van Haskell se baie streng tik is dat daar is geen real-- uitsonderings is ongemaklik, basies, fout hantering is ongemaklik. En dit is 'n baie algemene manier om dit te doen. STEPHEN KREWSON: So nou kry ons na 'n ander gedagte-buiging ding oor Haskell, wat is patroon ooreenstem en funksie definisies. Ek het julle in die laaste skyfie die verklaring van die stap volgorde funksie, wat 'n waarde het dalk, dan 'n int, dan 'n lys van SY, dan terug 'n reeks van musiek waardes daar geannoteerde met beide toonhoogte en volume. So die drie argumente kan wees patroon ooreenstem in die volgende manier. En ons wil altyd om seker te wees om doen 'n basis geval of uitgang geval eerste. En dit onderstreping kan net geïnterpreteer om enige waarde wat is daar beteken. So as ons 'n oproep om te stap volgorde met 'n paar waarde, sommige ander waarde, en dan die leë lys wat ons wil om terug te keer is net stilte, rus 0. En in plaas van dat om 'n leë lys of 0, dit is 'n rus 0, want ons is die hantering van die tipe musiek, en die leë lys van die musiek tipe is net 'n res van geen duur. Dit is geen musiek. En dan sien ons as ons 'n stap volgorde met 'n V vir volume argument, p vir voorsorgmaatreël instrument argument, en dan 'n lys van x se. Dan 'n paar dinge wat ons doen. In die besonder, ons pas hierdie lys begrip, en ons voer 'n paar bedrywighede op die miskien waarde om dit te omskep in 'n numeriese waarde sodat dit kan dan vervat en gebruik om die instrument te kies. Weereens, dit is 'n bietjie bietjie doelbewus inconcise net om al die vreemde dinge wys wat jy kan doen in Haskell soos jy 'n blik op dit op jou eie tyd. Alles reg. So ons is uiteindelik om na doen wat ons het om te doen, wat is maak 'n paar rekenaar musiek. So ons gaan om te probeer om maak die Frere Jacques liedjie. So is daar hoeveel frases in Frere Jacques? Vier. Groot. En wat is lekker is dat hulle is almal herhaal dieselfde bedrag van die tye, wat twee. So het ons vier frases elke herhaal twee keer. En in die besonder, hulle is in 'n ronde. En daar is baie, baie maniere om te implementeer 'n ronde wat pret om te doen kan wees. Ek het dit gedoen in 'n mooi eenvoudige manier hier wat net die lyn construct-- funksie neem 'n lys van waardes musiek en draai dit in opeenvolgende samestelling deur die toepassing van daardie sekwensiële samestelling operateur. En dan vertraag Ek die verskillende dele deur hulle begin met 'n res. So ek begin met 'n res van twee mate, en dan 'n res van vier maatreëls, en dan 'n res van ses maatreëls, en dan die ronde werk, soos ons almal weet hierdie liedjie. Ons sien twee notas of wysigings van die musiek waardes wat vervat is in hierdie opeenvolgende reëling van die musiek elemente. Ons het 'n add volume. Dit is 'n funksie om te annoteer musiek met 'n bepaalde volume. Dit is 'n goeie voorbeeld van 'n MIDI sein hardloop 0-127, die sewe stukkies inligting wat uitgevoer kan word. En then-- ons het dit baie kortliks, maar die algemene MIDI n lys van al die verskillende instrumente. En daar is nie 'n hele klomp van hulle. As jy 'n digitale klank werkstasie gebruik, soos Ableton Live of Pro Tools, daar is 'n ongelooflike groter verskeidenheid van synthesizers en VST instrumente. Maar die MIDI standaard net het 'n paar, of 'n paar dosyn. En sommige van hulle is snaaks. Ek het gedink dit sou pret wees as ons gespeel die instrument die MIDI instrument helikopter, en dan die volgende pad deur die ronde, ons het 'n pad synth, en dan van hierdie corny lood vierkante golf synth, en dan stem modder, wat is 'n bietjie onduidelik op my slegte MIDI sintetiseerder, maar hulle OK. En dan sien ons hierdie laat en in sintaksis van Haskell, En dan is ons speel al hierdie dele saam met die parallel samestelling operateur. En ons kan waarskynlik toon 'n paar van hierdie. Hier is die kode. En jy kan sien in C, sou daar 'n baie van die keel skoonmaak en omgewing die tafel kode voordat jy kon musiek te maak soos hierdie. Of enige ander ontwikkeling taal, sou jy waarskynlik het om met 'n soort van biblioteek of API en alles op, en dan sal jy het om skoon te maak. Maar hier in Haskell is, dink ek, sodra jy kry die hang van dit, ongelooflik leesbare en baie ekspressiewe. Daar is so die implementering van Frere Jacques. Alles reg. Nou wil ons perkussie voeg, en dit is 'n bietjie morsig. So laat ons neem 'n blik op die skyfies. So die groot idee is om 'n klomp van die lyste of dele. Op dié roll-in masjiene, is daar was tipies oor miskien agt 10 ritme of perkussie dele. En gebruik dan 'n klomp van tegnieke. En ons het gepraat oor die gebruik van these-- voue, filters, lambda funksies, gekarteer oor lyste waardes genereer in sommige reeks 1 tot r, r is 16, of 32 stappe in die sequencer. En dan as daar is 'n waarde in die lys as ons loop deur die sequencer, loop deur dit oor en oor, dit blyk op daardie noot, en daardie monster kry veroorsaak. Hier is al die verskillende maniere weird Ek het met notas te genereer. Probeer dit op jou eie semi som. Dit sal cool klink. Toelaat tyd, sal ons gaan deur middel van hierdie. Maar vir nou, dink ek Ons moet demo wat ons het. Kom ons hoop dit gaan OK. So dit is GHCI. En ons sal 'n lêer te laai Ek het genoem song.lhs, wat is die lêer ek jou net gewys. OK, groot. As Connor vroeër gesê het, dit saamgestel, tik dit nagegaan word, so ek kan 'n baie makliker asem te haal. Dit gaan nie om op te blaas op my. Ek wou hê jy iets nuttig om te wys. Jy kan sien dat 'n module gelaai genoem 50. Jy kan blaai daardie module. En dit is so lekker oor doing-- miskien wat jy doen in Haskell is nie genoem sagteware-ontwikkeling, maar jy kan 'n baie te doen pret dinge op jou eie. En die workflow is regtig mooi as in vergelyking met 'n baie ander tale, omdat jy kan sien in 'n baie leesbare manier wat aangaan. So sien ons dat ons al hierdie frases, wat lyste van musiek plekke, en dan sal ons bou hierdie up in iets groter, wat is 'n musiek song. Dit is 'n musikale eenheid. En dan kan ons dit alles speel met 'n funksie genoem speel musiek. Jy kan hier sien dat down. Wat net speel. Ek moet say-- ek nie praat oor hierdie dollar teken dat is oral. Dollar-teken is 'n ander infix operateur. Maar dit het die laagste voorrang enige operateur, wat effektief beteken dat alles op die linkerkant van die dollar teken en die reg van die dollar teken ons gaan om ontslae te evalueer voordat dit. So dit is soort van soos 'n ander manier van die toevoeging van hakies. CONNOR Harris: Dit is basies funksie komposisie. En dit verseker dat jy nie have-- as jy het funksies weerskante of infix operateurs aan weerskante, sal hulle nie assosieer daaroor en gee jou onverwagte resultate. STEPHEN KREWSON: So ons can-- die gebruik van daardie, ons kan noem. Eerstens, sal ons dit speel sonder die tromme. Dit is die helikopter, die MIDI helikopter. [Speel van musiek] Daar is die vierkante golf. Die stem modder. En jy kan regtig gaan wild met hierdie. Ek pluk 'n mooi eenvoudige een, want ek het geweet ek moet nie byt af meer as wat ek kan kou. Hou dit net eenvoudig om die hoofgedagtes te wys. Maar dan was ek wil, ons het het 'n paar dromme te voeg tot hierdie. Net omdat dit is 'n bietjie ondeurdringbare, en ek het nie die gebruik van die Naam van die drom dele, Ek gekarteer them-- want hulle is deel van daardie versyferde klas, Ek gekarteer hulle SY. Een daarvan is soos 'n bas drom. Zero is so goed. Sewe is 'n hoë hoed. En af in die hier waar funksies kry 'n bietjie meer random, dit is soos 'n conga tromme. So as jy dink miskien 'n about-- prettige manier om 'n drom masjien te implementeer is baie ordelike gebruik patrone op jou bas drom. So byvoorbeeld, op te filter oor die lys met alles wat terug gee 'n 1 wanneer dit geneem module 04. So ek kry 1, 5, 9, 13, so dit 17-- is die eerste pols van elke maat. En dan is dit dieselfde ding verskuif oor twee stappe. So wat is die offbeat. So sal dit wees iets soos 'n hoë hoed. En hier dan weer, af, dit is 'n bietjie random, want ons doen conga tromme. En ek het 'n paar maracas af ook hier. So ek kon speel drom masjien te roep, maar dit sou vir ewig gaan en dit kan begin gryp up al die geheue in my stelsel. So ek sal hierdie funksie noem speel musiek, wat as ons sal sien, gebruik die truncating parallel samestelling om ons klein Frere Jacques liedjie te speel saam met die vreemde drom masjien. So laat ons neem 'n blik. En moet asseblief verbeter op my plasing van al die drom dele. Nie my spesialiteit nie, maar ek het 'n baie pret om dit te doen. [Speel van musiek] So natuurlik, dit is alles 'n bietjie nie as pret As ons nie kan dit omskep om 'n telling so miskien is dit vertolk kan word deur 'n menslike performer. So sal Ek dit nie hier te hardloop. Ek het reeds gegenereer die lêers. Jy kan sien dat daar 'n dot LilyPond file-- en dit sal my segue oor wees om Connor-- en 'n dot MIDI-lêer, en 'n dot PDF-lêer, en dit is wat LilyPond sal uiteindelik genereer. Maar dit is die skrifte, en ek sal hulle net loop met hulle hulp opsies. As jy dit op en hardloop met Euterpea, kan jy 'n MIDI-lêer te genereer. En dan van die MIDI-lêer met hierdie MIDI 2LY program, jy kan 'n Lily genereer Dam lêer, en dan moet jy kan 'n PDF van die telling op te wek. En ons moet 'n blik op te neem. So Connor sal waarskynlik wys hoe om dit beter te annoteer, maar dit is Frere Jacques as deur my gegenereer in Euterpea. Dit is net in C. Ek moet uitgepluis uit te vind wat die hack dit is eintlik in. Maar dit is die pyplyn vir hoe jy dit met dit te doen. Kom ons praat meer oor LilyPond. CONNOR Harris: OK Kom ons kyk. Het jy noem jy leer Haskell? STEPHEN KREWSON: O ja. Check jy leer Haskell. Dit is in die hulpbronne. Dit is hoe ek begin leer, en dit is 'n groot. Nie dom leer. CONNOR Harris: So is dit aanlyn. So 'n man met die naam [onhoorbaar] learnyouahaskell.com, geen spasies. Grammatika is siek. STEPHEN KREWSON: Dis geïllustreerde ook. CONNOR Harris: So, wat is LilyPond? Dit is 'n verklarende programmeertaal taal vir musiek setwerk. So declarative-- jy kan dink dinge soos HTML, waar jy nie sê om HTML nie sê hoe webblaaiers moet lewer bladsye stap vir stap. Dit is hierdie net sê is 'n tekstuele beskrywing van wat jy wil hê dat die bladsy te lyk. En dan is dit ook 'n program wat stel hierdie taal, of dit sy in lees en dan eintlik doen die setwerk vir jou, en dit spoeg hierdie wonderlike soek PDF tellings. Jy kan ook PNG formaat of wat ook al. 'N goeie manier om te dink hiervan is deur analogie is dat LaTeX is soort van soos LillyPond, maar net gewone setwerk. So in plaas of-- dit is nie WYSIWYG, wat jy sien Is wat jy kry, soos, sê Finale is, of Sibelius, of Microsoft Word, waar jy kan tik in reële tyd en die ontwerp dinge in reële tyd en kyk veranderinge onmiddellik. Dit is die teks gebaseer is. Jy moet jou opstel tellings met behulp van 'n aparte program en uit PDFs later. Dit is 'n bietjie minder gerieflik vir gebruik as jy probeer om direk te skryf in 'n telling en jy probeer om te komponeer op die rekenaar. Maar daar is 'n baie voordele vir dit. Een, lyk dit 'n baie mooier, omdat LillyPond kan eintlik die tyd neem om te doen uitleg besluite behoorlik, teenstelling Sibelius of Finale, wat het om gedrang algoritmes te maak sodat dat hulle kan vertoon dinge in real time. So hoekom is LilyPond-- rekenaargrafika is hard. As jy iets met musiek doen en jy wil tellings uit te skryf, jy wil nie om te skryf alles deur jouself begin met hoe om te trek personeel en hoe om te trek notaboeke. Dit is baie moeilik. Dit is al voorheen gedoen. Jy is fine. As jy wil Finale of Sibelius gebruik, die lêer formate vir die dinge is baie ingewikkeld, en jy kan nie hulle regtig programmaties gebruik. Jy kan oopmaak Sibelius met Finale en gaan na File, Uitvoer as PDF jouself, Maar jy kan nie regtig noem dat vanuit 'n script. LillyPond, kan jy bel van dié skrifte. Jy kan maklik Itereer LillyPond met LaTeX. Ek sal nie veel tyd om te gaan in hierdie tegnologie op die oomblik, maar hulle bestaan ​​nie. As jy wil om te kyk in 'n LillyPond boek, dit is 'n program wat kom met jou LillyPond verspreiding, en dit is vir iterating LillyPond fragmente in LaTeX as jy wil om iets te doen soos 'n groot musiekwetenskap dokument met voorbeelde, byvoorbeeld. En dit is 'n goeie vaardigheid lewe as jy iets doen met musiek, en nie net CS50. Ek het gebruik LillyPond vir alle van my samestelling projekte want ek was basies 'n senior in die hoërskool. So hier is 'n paar eenvoudige voorbeelde. Dit is basies verteenwoordigend van die vlak van die probleme dat die meeste mense sou face it hulle probeer om LilyPond gebruik vir eenvoudige projekte. Die eerste een is die begin om 'n koraal voorspel deur Bach. Dit onderste een is 'n uittreksel van een van my eie werke, en dit is net daar om te wys jy dinge soos [onhoorbaar] om verskeie reëls in dieselfde personeel, hoe liriek undersetting werk. Liriek ondergrond is 'n ding wat baie maklik om te gebruik vir LilyPond koormusiek. En so dan is daar 'n paar meer ingewikkelde voorbeelde hier. Al hierdie is gedoen in LilyPond en hulle is haalbaar. Die eerste uittreksel is uit Deur [onhoorbaar] [onhoorbaar]. En dit [onhoorbaar] uit 'n stuk vir solo bass fluit deur [onhoorbaar], wat 'n longtime-- wat was 'n jarelange lid van die Departement Musiek hier, dink ek. Ek is nie seker waar hy afgegaan om. Maar hy die raadgewer van die Harvard was Komponiste Vereniging vir 'n lang tyd. Wonderlike man. En hy skryf 'n paar musiek wat baie het ingewikkelde notasie wat LillyPond kan tog hanteer baie mooi. So net om jou 'n gevoel van gee wat se vermoëns hierdie ding are-- so die internals van LillyPond is baie ingewikkeld. En jy kan dit gebruik vir 'n lang tyd, insluitend vir 'n paar mooi ingewikkeld dinge, sonder om werklik met 'n baie van hulle weet. Maar die basiese idee is dat die laagste vlak, die atome van LillyPonds is die notas. Die notas bevat 'n konteks genoem stemme. So die stem konteks ooreenstem basies om 'n enkele lyn van polifonie. En dan konteks kan hiërargies vervat in 'n hoër vlak diegene wat verteenwoordig personeel op die telling of groter groeperings soos klavier personeel of koor personeel, en dan uiteindelik hele telling kontekste. En jy kan eintlik behels verskeie tellings in 'n boek. En elke konteks het 'n aantal aangeheg graveerders. As jy kyk deur die inhoud van 'n konteks en druk 'n sekere simbool of 'n sekere klas van simbole as wat nodig is. So om elke stem konteks, daar is [onhoorbaar] notas graveur wat is basies 'n funksie of 'n voorwerp wat skryf al die note koppe op die regte dele van 'n bladsy. Dan is daar 'n gesplete graveur, wat skryf uit splinters op die personeel. Dan is daar 'n metronoom merk dat graveur skryf uit metronoom punte in 'n telling. En al hierdie pas mooi ver in die hiërargie. En dit is baie, baie, baie aanpas, wat jy nodig het as jy wil om dinge soos dat. So al die kontekste het 'n baie verskillende eienskappe wat jy kan verander vir alles uit die spasiëring verskeie font keuring tot groottes van die dinge. As jy wil, selfs doen meer ingewikkeld dinge, daar is 'n ingeboude skrip taal. Hulle gebruik skema, wat is dialek van LISP. Hierdie waarskynlik nie vir jou iets beteken. Maar basies, 'n skema 'n ander funksionele programmeertaal, min of meer. STEPHEN KREWSON: Die tie-in. CONNOR Harris: Ja. Dit is 'n goeie tie-in, dink ek. En dit is wat gebruik word as 'n onderrigtaal, eintlik, af Mass Ave. By MIT. En dit is baie handig vir LillyPond vir verskeie tegniese redes. En so as jy wil eenvoudige maak tweaks afhanklik conditionals, vir example-- daar is sekere toestand van 'n telling wat is ontmoet, maak veranderings aan die uitleg of whatnot-- dan daardie fasiliteite is daar. Hulle is ingewikkeld. So hier is 'n redelik eenvoudige kode monster. Dit is vyf lyne. Basies, ek definieer twee stokke. Dit is in 3/4. Die eerste personeel het 'n aangeheg tempo merk, maar dit is eintlik gaan om voort te gaan om die hele telling, omdat tempo punte op die telling vlak. Die metronoom merk graveur verbonde aan konteks aan te teken. Daar is verskillende sleutels, omdat die [onhoorbaar] graveur is die personeel verbonde. Jy kan eintlik doen is. Die monster wat ek geskryf het, is eintlik in C majeur, maar dit is net om demonstreer wat jy kan hê verskillende sleutels in verskillende personeel. En die basiese sintaks is wat jy skryf daarop name met E, F, G, wat ook al. As jy wil toevallige doen, jy agtervoegsel IS of ES. Dit is uit die Nederlandse musikologiese konvensies. En oktaaf ​​spronge doen, moet jy om te gebruik hierdie merk punte, kommas of afkappingsteken. Die relatiewe beteken net alles wat jy het 'n noot, dit sal outomaties plaec in die oktaaf ​​naaste aan die vorige een. En as jy wil meer as spring 'n fifth-- sê 'n vyfde of more-- dan moet jy die [onhoorbaar] gebruik. Maar andersins, het jy nie hoef te spesifiseer die oktaaf ​​van elke enkele noot. En relatiewe C, eerste, en C, jy moet net spesifiseer middel C en base C, veral eerste note. Dan het jy hierdie personeel wat te organiseer hierdie twee stemme of monsters van musiek, en jy het 'n telling. En wat lyk soos hierdie. As jy wil om die tyd te neem kopieer daardie monster van LillyPond kode op die vorige gly hier af, en jy kan dit skryf vir jouself LillyPond. Ek weet ons het iets gekry wat lyk 'n baie soos hierdie. So is daar 'n ander tegnologie genoem Musiek XML gehandhaaf deur heeltemal verskillende mense. XML is 'n tekstuele data structure-- ek moet nie sê data structure-- sê metafoor kaart soort van. En dit is ontwerp om te hou hiërargiese data baie goed. HTML, byvoorbeeld, is 'n tipe van XML. En jy kan XML vertel omdat hulle het al die hoek en die hoek tussen hakies bracket slash punte wat wys data velde. Ek het nie 'n kode het voorbeeld uit Musiek XML. Jy kan dit vind jouself. Basies, die rede waarom jy dalk wil XML gebruik as die intermediêre fase is die eerste van alles, dit is 'n wisselaar formaat vir basies every-- Ek moet sê nie elke, maar 'n baie verskillende telling skrywers. So as jy skryf in Musiek XML, nie net kan LillyPond lees dit met die hulp van hierdie auxilary program genaamd Musiek XML te LY, maar ook Finale kan lees dit kan Sibelius dit te lees. Afhangende van hoe jou interne voorwerp hiërargie werk vir wat musiek, dit dalk makliker wees om uit te skryf om Music XML as om LillyPond en net staatmaak op Musiek XML om LY om die omskakeling te doen. Ek dink nie [onhoorbaar] het Musiek XML. STEPHEN KREWSON: Dit maak nie. Iemand is besig met dit, al is. CONNOR Harris: OK. Euterpea nie 'n het Musiek XML nog uitset funksie. As jy wil 'n finale projek idee, Miskien kry in voeling met ouens dat Stephen weet, en hulle kon jou hulp gebruik. STEPHEN KREWSON: Ek sou graag dat. CONNOR Harris: Ook, basies, elke programmeertale dit is wat sy sout werd het reeds 'n XML biblioteek, sodat jy kan intern sit al van jou musiek in 'n paar voorwerp dat die XML-biblioteek kan skryf dat minder sou vereis veranderings aan jou interne struktuur vir watter musiek jy voorwerpe wil skryf as om dit te skryf direk in LillyPond sou. Dan net druk dit uit met XML met die XML biblioteke in jou taal, wat sal verseker dat dit sintakties korrekte en alles, en sit dit dan LillyPond. So tegnologie wat jy dalk wil kyk na as jy iets doen soos hierdie. [Onhoorbaar], 'n ander auxilarry tegnologie. Dit is basies Tech Werke of Tech Studio vir LillyPond. So dit bied hulp met sintaksis, met templates vir verskeie algemene kombinasies van instrumente. Dit laat gesplete skerm lees so kan jy jou kode het in 'n venster en in 'n ander PDF venster en Klik op plekke in die PDF om te spring na die betrokke kolle in jou bronkode. Dit is meer nuttig as jy eintlik is skriftelik LillyPond lêers jouself as wanneer jy genereer hulle programmaties. Maar weereens, dit is iets nuttig om te hê. Groot. Nog resources-- ek sal net gaan deur hierdie baie vinnig. LillyPond manuals-- LillyPond het uitstekende dokumentasie op sy webwerf. Hulle het 'n handleiding. Hulle het 'n sintaksis verwysing. Hulle het honderde brokkies vir verskeie klein dingetjies yo dalk nodig doen om te demonstreer verskeie vermoëns. As jy wil gebruik die script taal of maak meer uitgebreide veranderinge, dan is daar internals verwys op daardie URL. As jy wil Musiek XML gebruik, is daar ' dat URL, musicxml.com/tutorial. En dan as jy nodig het om te leer skema omdat jy eintlik wil gebruik die script fasiliteite in LillyPond, dan is daar 'n [onhoorbaar] genoem Gestruktureerde Interpretasie van rekenaarprogramme, wat nie net die tweede grootste CS handboek ooit written-- vind my daarna as jy wil weet wat ek dink die grootste een is-- maar dit is ook 'n baie goeie inleiding tot die taal behoorlike. Jy sal nie meer as nodig die eerste paar afdelings. En dit is dit. Enige vrae? STUDENT: Waar kan ek aflaai jou gegenereer Frere Jacques so ek kan dit op my iPod? STEPHEN KREWSON: Wel, kan jy skryf uit 'n paar wav lêer in Euterpea. En jy het die kode. Dit is op GitHub. Maak jou eie variasies van Frere Jacques deur CS50 korf gedagte. Dit sou wonderlik wees. CONNOR Harris: Iemand anders? STEPHEN KREWSON: Ons moet 'n beter bass drum, ook. Dit is regtig 'n slegte. STUDENT: Euterpea het nie net die samestelling kant nie, maar signal-- STEPHEN KREWSON: Ja. In werklikheid, die werk wat ek het in Euterpea toe ek het this-- daar is 'n gradueer kursus by Yale dat gebruik it-- was op gesonde sintese. So is daar 'n baie mooi manier met behulp van pyle en 'n paar van die notasie wat ons gesien het van saam komponeer sein funksies. In die besonder, die bas vir die meeste van hulle is net 'n eenvoudige sinusgolf. Maar as jy begin komponeer diegene in vreemde programmatiese maniere, kan jy gek klank te kry effekte, soos vreemde cascades. Jy kan baie gritty skep klink met 'n baie modulasie. Ek het 'n projek oor korrel sintese, wat iewers tussen FM en monsterneming. Jy neem baie klein, bietjie monsters, en dan kombineer hulle met 'n soort van modulator en die opbou van 'n ryker klank. Ons het ook 'n fisiese modellering, so probeer om te dink oor die fisika en psycho van iets soos 'n basuin, en dink oor die manier waarop die klank weerkaats die klok van die basuin en die akoestiek van die kamer en modellering dat met die basiese ossillators. CONNOR Harris: Baie dankie. Dankie vir die kom. En ek is altyd bereid om te vrae te neem deur email-- connorharris@college.harvard.edu. STEPHEN KREWSON: Ja. stephen.krewson@yale.edu. Koel.