CONNOR HARRIS: Hej.
Jeg er Connor Harris.
Jeg er en CS50 CA på Harvard.
STEPHEN KREWSON: Jeg er Stephen Krewson.
Jeg er en TF til CS50 på Yale.
CONNOR HARRIS: Og vi kommer til at tale om nogle teknologier, som du måske
ønsker at bruge, hvis du er interesseret i at gøre et afgangsprojekt eller virkelig
noget med musik.
Vi kommer til at fokusere på først en programmeringssprog kaldet Haskell.
Det er en funktionel sprog, så paradigmet
er meget forskellig fra C eller PHP eller andre bydende nødvendige sprog
at du har brugt allerede, og især på et bibliotek skrevet i Haskell
kaldet Euterpea, som kan hjælpe folk med at skrive musik funktionelt,
dybest set.
Og Stephen vil gå dig gennem et fantastisk eksempel på det.
>> Efter dette, vil jeg præsentere dig for noget, der hedder LillyPond, som
er en teknologi til opsætning musik.
Det er lidt ligesom LaTeX til musik, hvis nogen af ​​jer
har brugt LaTeX til matematiske klasser eller andre P sæt klasser eller hvad har du.
Og så jeg vil give dig, igen, nogle enkle eksempler på, at
og pege dig i den generelle retning af nogle bedre ressourcer.
>> STEPHEN KREWSON: I Desuden troede vi det
ville være cool at oprette en lille smule af hints
mod en rørledning mellem Euterpea-genereret MIDI-filer
i LillyPond, så vi leverer nogle instruktion på scripts
at gøre det, der er forsynet med LillyPond
bare for at holde det open source og få en rørledning i gang.
CONNOR HARRIS: Igen, Vi bør understrege,
disse to teknologier, du behøver ikke at bruge dem sammen.
De er ikke designet til at arbejde sammen, selvom de meget pænt.
>> STEPHEN KREWSON: Right.
Og helt gratis.
CONNOR HARRIS: Så anerkendelser, bare læse det.
STEPHEN KREWSON: Behørigt noteret.
Takket være disse folk.
Dette vil jeg drysse på bare et øjeblik.
Installationsprocessen er en lille smule tricky.
Vi har en læst mig på GitHub at du kan tage et kig på.
Bare email mig, hvis du har spørgsmål.
Men vi vil køre dette under forudsætning at dette fungerer for alle.
CONNOR HARRIS: Og hvis du ikke kan få LillyPond til at arbejde, nogen big deal.
Der er ingen levende kompilering som vil blive inddraget, i hvert fald på min ende.
STEPHEN KREWSON: Haskell og LillyPond bør begge har installatører.
Euterpea downloades som en pakke, så videre og så videre.
Så vi taler om computer musik.
Og dette er blot en meget 50.000-fods visning.
Der er et par forskellige aspekter af det.
Og dette er ru og er kommer til at skjule nogle detaljer.
Men vi kunne tænke på noget Ligesom algoritmisk sammensætning,
ved hjælp af algoritmer, hjælp af kode, til at generere
nogle type of-- måske en selv-lignende sekvens af noter, eller måske noter
under nogle begrænsninger.
Og så dem, kunne være udført eller fortolket
med analoge instrumenter eller sådan noget.
Men sammensætningen var gjort algoritmisk.
>> Men selvfølgelig, måske på området computer musik eller digital musik
vi er mere fortrolige med, er digital lyd syntese eller digital sampling
og digital optagelse.
En masse af digitale instrumenter sker via digital sampling.
Faktisk vil vi være ved hjælp af en af ​​dem i i form af en sund skrifttype bibliotek senere.
>> Men der er også noget, der hedder digital syntese, der kom ud
af slutningen af ​​70'erne og ind i 80'erne med Yamaha og John Chowning på Stanford
gør FM syntese eller Frequency Modulation syntese,
hvor du havde et luftfartsselskab signal og et modulerende signal
både i lydspektret.
Men hvad vi fokuserer på i dag er noget, der hedder MIDI,
og selvfølgelig algoritmisk komposition.
>> Vi kommer ikke til at gøre instrumenterne, men vi i stedet kommer til at gøre noget musik,
og så vil det blive fortolket af nogle instrumenter,
er konformt til General MIDI standard.
Så hvad er MIDI?
Jeg har ikke tænkt mig at komme for dybt ind i det, men MIDI er dataoverførsel protokol.
Det er en slags en vejledning på tværs forskellige virksomheder og brancher
til at organisere lyde eller patches.
Så vi vil se, at der er en MIDI-standard
for alle de forskellige percussion lyde og MIDI anbefalinger
for alle de forskellige typer af synth eller forskellige typer af hele instrumentet
grupper i et orkester, siger.
>> Du er sikkert bekendt med 0 til 127 MIDI-meddelelser.
En MIDI signal er typisk én bit angiver
uanset om det er en data-eller en status pakke, og så er der
syv bits af et signal.
Og disse kan kontrollere alt fra volumen
til handlingen eller tryk på en bestemt tast
Hvis du udfører med en MIDI controller samt naturligvis
noter.
Og selvfølgelig, MIDI har været yderst nyttigt,
fordi det er en måde at wire sammen eller serieforbundne
en flok af MIDI hardwareenheder.
Jeg har syv eller otte tilbage på mit hus.
Det bliver rigtig kompliceret, men det er virkelig kraftfuld.
Og det er virkelig gamle.
Det er fra de tidlige 80'ere, og det er virkelig rart og små.
CONNOR HARRIS: Ja.
Alle de klassiske Nintendo videospil ville sandsynligvis
har MIDI filer til musik, for eksempel.
>> STEPHEN KREWSON: Her er en eksempel på generelle MIDI,
viser MIDI som en slags med den almene protokol.
Og jeg tror, ​​vi kan tænke på Forskellen mellem specifikationen
at der bør være noget lignende disse instrumentlyde og den faktiske
realisering af disse instrumenter lyde i en lyd skrifttype eller en bestemt MIDI
synthesizer som forskellen mellem måske en typeface-- som siger,
Generelt er dette design af denne særlige måde at repræsentere
characters-- og en bestemt skrifttype der har en specifik størrelse og klangfarve,
og der er realisering af til--
>> CONNOR HARRIS: Måske en bedre sammenligning ville
være Unicode standarden says-- det giver et nummer til hver karakter, og virkelig
alle sprog i verden, eller et stort sæt af scripts i sproget
i verden, og derefter de er gengives i noget grafisk
af forskellige skrifttypepakker.
Og naturligvis, kan du tænke på MIDI som Unicode af lyd.
Og det er bare en liste of-- en stor strøm af begivenheder og instrumenter og whatnot,
og du skal have en separat program, ligesom en skrifttype,
at gøre dette i noget, der er hørbar.
>> STEPHEN KREWSON: Så hvorfor Haskell?
Haskell er en funktionel programmering sprog, meget avanceret,
meget forskellig fra C, meget forskellig fra PHP.
Og vi kommer til at se, at der er en let sammensat funktion i Haskell
der vil tillade os at brise gennem komponere eller skrive op, transskribere,
noget som Frere Jacques, denne enkle sang,
har en masse dele i den, er selv-lignende eller gentage.
Så det vil være nogle af motivationen for hvorfor
vi bruger Haskell, hvor funktioner er første klasses borgere.
>> Og jeg ønskede at udvide dette en smule.
Det er en lille smule let at notate Frere Jacques i Haskell.
Men hvad nu, hvis vi ønskede at tilføje en tromle del heraf?
Hvad hvis vi ønskede at forsøge at gøre noget som en Roland 808 eller 909 tromle
maskine, hvor du har omkring 16 forskellige trin?
Normalt disse er tænkt som 16. noter.
Og du kan styre den globale tempo, og du kan udvælge
en masse forskellige percussion dele af stortromme, en klap, forskellige snarer,
åbne og lukkede høje hatte på disse slags kanaler,
og derefter kan du EQ eller justere deres volumen.
>> Og vi vil se en pæn måde Haskell repræsentere dette trin
sequencer med alle de forskellige seje ting i Haskell
vi kan gøre med at generere lister og filtrering end lister,
kortlægning i lister, kortlægning Funktioner, der går lister.
Og en hurtig undskyldning.
Dette er en meget overfladisk og alt for hurtig skitse
nogle af de aspekter, for Haskell og Euterpea,
som er et domæne-specifik indlejret sprog skriftlig
i Haskell for musikalske typer.
Så er du tjekke koden online.
Fyr op GHCI, som er Glasgow Haskell Compiler tolk.
Og jeg vil gøre nogle dette i en lille smule
så du kan se, hvordan det gøres.
>> Og dette giver dig mulighed for at indlæse ind med til-- syntaksen er kolon og derefter
kommandoen.
Du kan indlæse i filer.
Du kan bruge gennemse på disse filer at se alle de funktioner, der
eksisterer i et bestemt modul.
Og derefter som vi vil se, typer og typen klasser er så vigtige i Haskell,
så du kan altid check-- især hvis du arbejder i en ny dscl krævede
som dette, hvad er en musik type?
Jeg ved, om den måde, numerisk typer arbejde i Haskell,
men jeg ved ikke meget om musik.
Men du kan udforske den måde, de er defineres ved hjælp af denne t eller type kommando
og derefter kalde i et bestemt funktion eller et dataobjekt.
CONNOR HARRIS: Ja.
Hvis du troede, C og Dunk var hardass om typer,
du har ingen idé om Haskell.
Det gode ved Haskell er, at hvis du kan få din kode til at kompilere
og hvis Haskell prototype, det er nok rigtigt,
fordi den type system er så strenge.
>> STEPHEN KREWSON: Ja.
Så jeg vil bare gå through-- og igen,
dette er ikke at gøre det justice-- et par af funktionerne i Haskell, at mindst
til sin creators-- og det blev oprettet i slutningen af ​​1980'erne af en flok mennesker,
et udvalg på omkring 20 people-- troede var vigtige.
Og den første ting, de opført i et papir,
beskrev tilblivelsen af ​​Haskell i løbet af de første 20 år eller deromkring
var, at det var doven.
Så hvad betyder det?
>> Tja, betyder det, når vi har en slags udtryksform, er vi nødt til at evaluere den.
Og Haskell gør dette i et opkald ved behov måde eller en ikke-streng måde.
Det vil sige, hvis vi har en flok komponenter i vores ekspression,
vi forsøger at forsinke evaluering af disse underkomponenter
indtil absolut sidste minute-- der er indtil vi faktisk har brug for dem.
>> Så denne means-- som er virkelig cool, især
hvis vi tænker på indvinding af en musikalsk trin sequencer.
Du tænder den, og du begynder kører et skridt sequence--
hvis du nogensinde har arbejdet med en tromle machine-- og det bare går for evigt.
Så det ville være rigtig rart, hvis vi kunne efterligne det i Haskell.
Og vi kan gøre det med uendelig værdier, især uendelige lister.
Det er meget nemt at skrive et uendelige liste i Haskell.
Du kunne bare bruge syntaksen ned her, hvor du ser 1 til 3,
Fjern 3 1 prik prik, og der er en uendelig liste
af alle naturlige tal, der strækker sig på så langt som du kan forestille dig.
>> Jeg ønsker at indføre en Begrebet folder med det samme.
Og igen, formålet med dette seminar er ikke
at lære om folder i Haskell eller højere ordens funktioner.
Men jeg vil bare at introducere det til give en nøjagtig fornemmelse af, hvordan underligt
Haskell er, og hvordan magtfulde det er.
Og i særdeleshed, vi kommer til at være-- når vi gør vores forskellige tromme dele,
vi kommer til at være manipulere lister over numre, folde dem på hinanden.
Og for at gøre det, vi får være at bruge kort og folder.
>> Der er en ret associativ fold, som er denne ene ret
her-- 1 minus den mængde, 2 minus den mængde, 3 minus 0.
Og syntaksen for en fold, du giver en fold
en base værdi og derefter en operation-- i dette tilfælde, addition eller subtraktion.
Jeg har vist begge tilfælde.
Og så er der en akkumulator, der akkumuleres over hele listen,
at anvende denne operatør plus eller minus, og derefter akkumulere det.
Så dette vil være til-- hvis det blev kaldt med fold r plus på 0, startende med 0,
vi ville så opsummere alle tallene i listen.
Og det er en liste fra 1 til 3.
CONNOR HARRIS: Så sagt på en anden måde, fold r tager tre argumenter.
Der er en funktion, som selv tager to argumenter,
så er der en forret værdi, og der er en liste over værdier.
Og hvad du skal gøre er at tage forret værdi, første værdi,
lægges i funktionen.
Hvad får du ud, tage det, foder,
i funktionen af anden værdi, hvad du får ud,
tage det, fodre det ind i funktion af den tredje værdi.
Og derefter, hvis du går ned Hele denne liste på denne måde,
du kommer til at få i sidste ende nogle ental værdi, der er
af samme type, hvad du startede med og af samme type
som tingene på listen, og derefter det er afkastet resultat af fold R.
STEPHEN KREWSON: Så i særdeleshed, disse er højere ordens funktioner,
fordi de tager en anden funktion som et af argumenterne.
>> CONNOR HARRIS: Ja.
Hvis du har brugt visse andre languages-- jeg ved R, [uhørligt]
sprog har det, der kaldes Reducer.
Du har måske tilsvarende funktioner på andre sprog, bare kaldet
forskellige ting.
>> STEPHEN KREWSON: Og hvad der er rart om fold R
i dette tilfælde er, at fold R kan arbejde med uendelige lister.
Så på denne bund, dette P5 genererer de noter,
tændes i trin sequencer for nogle tromledel, femte tromle del,
og måske er det en conga drum eller noget.
Og dette er en bevidst stump måde at skrive dette,
men det er sjovt, fordi det viser en masse
ting om Haskell og Euterpea.
>> Så fold R af denne colon-- kolon er bare en operatør, der skubber ting
sammen på en list-- opfordrede en tom liste, som er lige de tomme parenteser.
Og jeg ringer, at på denne uendelige liste.
Dette er faktisk to lister lægges sammen hernede.
Listen 1 komma 6 prik prik er 1, 6, 11, 16.
Så Haskell-- i blot nogle få tegn, du
kan generere hele talsekvens
der er fem tal fra hinanden strækker sig på i det uendelige.
Og jeg tilføjes i begyndelsen til at denne kortere lille list--
3, 8, 21-- bare for at vise dig hvordan du kan sammenkæde lister.
>> Og så har jeg foldet på sig selv.
Og det ender bare at være en slags identitet operation, men det er uendeligt.
Og fold R kan gøre det, fordi det lazily vurderer, som i ovenstående.
Hvis vi har en 1 og en 2 og 3, kan vi lige bracket off hele resten af ​​det.
Det vil ikke arbejde for fradrag eller tillæg, men det
vil arbejde for dette kolon identitet operation på listen.
>> Så hvordan kan vi praktisk brug, at hvis vi har en uendelig lang liste af ting?
Nå, Haskell giver en masse functions--
og ser mere ind i disse i din egen time-- såsom tage
som siger, OK, vi er generere denne uendelige liste,
men vi bare kommer til at tage nogle Antallet af det Og i denne case--
vi vil se senere i vores trommemaskine code--
GM er blot nogle slags global variabel for antallet af trin
i sequencer.
På roll-i maskiner jeg viste dig, det er typisk 16,
men jeg har gennemført det med 32.
Det gør ikke rigtig noget.
>> Haskell er også rent, så det har en stærk statisk skrive, at Connor hentydet til.
Så funktioner er matematiske i sense--
de er mere matematisk at de er sikret
at ikke få adgang til eller ændre nogen form for variabel eller udføre input eller output.
Så hvis du har en funktion, det er deterministisk.
Det vil altid returnere det samme værdi i tilstanden af ​​programmet
eller forblive den samme.
Der er naturligvis monadiske undtagelser til dette, men det er uden for vores rækkevidde.
>> CONNOR HARRIS: Ja.
Hvad dette betyder, er dog der er et par vigtige [uhørligt]
konsekvenserne af dette.
Den ene er, at det er meget nemt at parallelize Haskell-programmer.
For hvis du har, sige, en funktion af denne
nødt til at operere på en million værdier, hvis du ved, at funktionen vil altid
give ud den samme værdi, hvis du foder på et bestemt value--
hvis du er [uhørligt] f 1, f af 2, så f på 3 eller whatnot-- f 1
kommer ikke til at skrive ud til en fil eller gøre noget
der vil ændre værdien af ​​f2.
Du kan bare opdele denne funktion til en million forskellige maskiner eller en million
forskellige tråde eller hvad, få alle svarene tilbage,
få alle de afkast værdier tilbage, og så det er det.
Så meget nemt at parallelize ting.
>> Ulempen er, at input og output især
passer ind i typesystemet meget komplicerede måder.
Vi vil ikke gå ind i det lige nu, men jeg opfordre dig til at se på nogle ressourcer
online, hvis du ønsker at lære om det.
>> STEPHEN KREWSON: Så skriv classes-- og dette
was-- klasser af typer blev opfundet for at løse
et problem med operatør overbelastning.
Så vi ønskede at have lighed mellem forskellige typer af ting.
Selvfølgelig kunne vi mener of-- ligestilling mellem numeriske typer
er meget let at tænke over, men hvad med ligestilling mellem lister?
Hvad med ligestilling mellem træ ben datastrukturer?
Og det er alt muligt Haskell grund af typen klasser.
>> Så hvis du definere en bestemt data Motortype- og her er disse musikalske pladser.
Vi er endelig at få til nogle computer musik.
Så vi har C, C skarpe, og så videre og så videre.
De tilhører en flok forskellige typen klasser.
EQ-- de hører til EQ-type klasse.
Det betyder, at de støtter lighed operationer.
Så du kan vurdere, om en sekvens af musikalske primitiver
er det samme som en anden.
>> De tilhører ordenstal klasse.
Det betyder, at der er en bestilling til disse.
D kommer efter C. C skarpe kommer efter C samt.
De tilhører klassen viser, hvilket betyder, at de kan
udskrives til en konsol eller terminal.
De hører til klasse opregnet, som
betyder, at selvom disse er tegn,
de har en underliggende numerisk repræsentation starter ved 0
og går ud gennem dog mange ting er her, 20 eller deromkring,
eller 30 eller 40, måske.
>> CONNOR HARRIS: Og når vi har en datatype
der derives-- med det pågældende søgeord "deriving--" en bestemt type klasse,
det betyder, at compileren vil forsøge at konstruere noget automatisk.
Så måske du ønsker at definere en kvalitet forskelligt.
Du ønsker at definere C skarpe lig med D flade, f.eks.
Med denne konstruktion her, tror jeg ikke, C skarpe
og D flade vil være lig, fordi compileren automatisk
sige hver anden mulige værdi adskiller sig fra alle andre.
>> Så det er muligt at tilsidesætte standardindstillingerne implementeringer
af disse typer af klasser.
Igen, se på henvisningen, hvis du ønsker at lære om det.
STEPHEN KREWSON: Og her, faktisk, det ll
være nyttigt for når vi kode senere.
Vi ser nogle af Infix operatører til sekventiel sammensætning,
parallel sammensætning, og så frem, disse plusser og lighedstegn
omgivet af koloner.
Det betyder, at vi kan spille disse forskellige musikalske primitiver ene efter den anden.
Det er sekventiel sammensætning.
>> Eller vi kan spille dem i parallelt på samme tid.
Så jeg kan få en musikalsk værdi, og så svarer det og koloner,
Infix parallel sammensætning operatør, og afspille dem som en slags akkord.
Og vi kommer til at bruge dette, når vi kombinerer
vores tromle del med vores lille Frere Jacques sang
at spille disse to sekvenser af musikalske værdier på samme tid.
>> Beredningsmetode is-- Curry var sidst navn for Haskell Curry, som
det Haskell billedet er opkaldt efter.
Og det giver os en dejlig elegance, når vi er
skrive alle disse forskellige funktioner eller filtre, som vi er
vil være kortlægning over vores lister.
En funktion af to arguments-- f af x og y--
kan repræsenteres som f af x til y anvendes.
Så det er en funktion af et argument, der returnerer
en anden funktion af et argument.
Så det betyder, at vi kan kortlægge en funktion f af x i listen af ​​y s.
CONNOR HARRIS: Ønsker du at give et eksempel på dette?
STEPHEN KREWSON: Ja.
Jeg har et eksempel her fra nogle af de ting, vi vil skrive.
Så kopiere 2-- godt, replikere vil tage
én værdi, som er hvor mange gange for at replikere noget,
og så vil det tage et value-- normalt en liste eller noget.
Så her er vi kortlægning replikere 2 over en anden liste.
>> Så hvis vi kort replikere 2, hvis vi replikere 2 anvendelse
til det første element i denne list-- og disse er lister over musikalske phrases--
vil producere to af "du sleeping--" så er du sover, er du sover.
Så nu har vi to.
Men replikere tager to argumenter, men fordi vi er
beredningsmetode og derefter kortlægning, Vi kan repræsentere replikere 2
som er blevet sendt tilbage som en funktion af en argument-- lige replikerende to gange.
Og så er vi anvende denne til hver element i denne liste over sætninger.
>> Og concat er et Haskell operation for udfladning en liste.
Fordi replikat 2 vilje producere en liste af lister.
Og det er denne mellemform her.
Og så kan vi concat eller flade det ud to gange.
CONNOR HARRIS: En enklere eksempel på beredningsmetode,
hvis du like-- forestille f er blot en multiplikation funktion, der tager to
argumenter og returnerer deres produkt.
Så hvis du har en f 4 5, er det 20.
Men du kan tænke på dette som also-- du har en funktion f 4
der tager et argument og returnerer fire gange dette argument-- bare
delvis anvendelse som kun et argument 4.
Og hvis du fodrer f af 4 5, vil der giver dig 20.
Og det er en enklere eksempel på beredningsmetode.
Det er normalt en af ​​lærebogen dem.
>> STEPHEN KREWSON: Lambda udtryk eller anonyme funktioner
er en anden Haskell adelsmærke.
Så hvis vi har brug for at piske en lille funktion liv replikere,
men sige, det er ikke i standard bibliotek,
vi kan bruge en syntaks svarende til følgende.
Og vi vil vind i løbet af dette.
Én ting du vil se en masse i trommemaskine er vi foretage opkald
til noget, der hedder Filter, der ligesom før,
er en kortlægning af en funktion over en liste, men det er
en kortlægning af en boolesk funktion.
>> Så vi har her et eksempel af en anonymt
defineret Boolsk funktion, bare tager et par værdier.
Det er ikke strengt taget en anonym funktion.
Men det er definere med at syntaksen for kortfattethed,
og dette tager bare x modul n-
CONNOR HARRIS: Ja.
Så f er en funktion af to argumenter N og P
der returnerer en funktion, der i sig selv er en funktion af et argument, nemlig x.
STEPHEN KREWSON: Jeg sidstnaevnte Infix operatører.
Hvad er Infix operatører?
Nå, Infix operatører er normal måde, vi repræsenterer operationer,
sige, i mathematics-- 2 plus 2 i stedet for operatørens plus
og derefter to argumenter 2 og 2.
CONNOR HARRIS: Det hedder omvendt polsk notation, som er
et begreb jeg tvivler nogen af ​​jer ville vide.
>> STEPHEN KREWSON: Right.
Omvendt polsk eller præfiks notation.
Men Haskell besluttet at bruge Infix operatører.
Så dette er nogle af de brugerdefinerede dem,
er defineret for Euterpea dscl krævede i Haskell.
Så det var sekventielle sammensætning.
Dette var parallelt sammensætning, og dette blev trunkering parallel sammensætning.
Og vi har brug for, at med vores trommemaskine,
fordi vi vil bruge den sidste operatør i den lille tupel der
at spille trommemaskine langs med vores Frere Jacques sang.
Og vores trommemaskine er vil være uendelig.
Det bare spiller for evigt.
Men Frere Jacques sang er ikke.
Det er ikke så længe.
Det er kun et par barer.
Så vi er nødt til at stoppe trommemaskine som snart kortere musikalske værdi kommer
til ophør.
Og at infixed operatør er super hjælpsom med at.
>> Og Infix notation som dette er slags nice,
fordi sige du har en funktion som tilbud, som giver heltalsdivision
x af noget else-- undskyld, der skulle være a og b.
Du kunne skrive det som et citat af b.
Så hvis du put-- element er et andet eksempel på dette.
x element i nogle liste, hvis du lægger det i skråstreger, kan du bruge det.
Selvom det ikke er et symbol ligesom plus eller minus eller gange,
kan du bruge navnet på en funktion som den i skråstreger
som Infix operatør, som er temmelig cool.
CONNOR HARRIS: Igen, dette er alle bare syntaktisk sukker, virkelig.
Det påvirker ikke kernen i sproget.
>> STEPHEN KREWSON: Så vi ser her til sidste sætning i vores Frere Jacques sang,
Jeg spillede nogle små akkorder eller tredjedele ved hjælp af parallelle sammensætning
operatør.
Dette er en anden måde at sige noget af, hvad vi har netop siger.
Så du kan kortlægge funktioner af et argument i listerne.
CONNOR HARRIS: Igen, referencer for Haskell-- indledende lærebøger
får alt dette i det.
>> STEPHEN KREWSON: Så her er en temmelig centrale linje i trin sequencer
Vi vil tage et kig på ved hjælp en liste forståelse.
Og vi ser her, er, at elementet i fast operatør i ryg anførselstegn.
Så hvis x er et element i listen over X'er, så vi ringer op PERC funktioner.
Så perc er blot en percussion-funktion.
Det tager en vis værdi p, der er del af den afgrænsede sæt af alle
de forskellige percussion lyde at vi så i et tidligere dias,
og derefter det giver, at Varigheden af ​​en kvart tone.
Ellers giver det en QNR-, og QNR- er blot en kvart tone hvile.
>> Så dette er at opbygge noget rart.
Vi har en liste over elementer, og vi får loop over nogle liste fra én
til max værdien af ​​vores trin sequencer.
Og når vi er på et bestemt i i denne liste over den ene til den max værdi,
hvis jeg er medlem af denne sæt skabt i denne funktion,
ja, så vender vi det ind i en percussion note.
Ellers, vi bare spille en hvile, som Det vil sige, vi bare tie.
Og vi kan se her, at der i denne liste forståelse syntaks,
X er befolket af dette liste bygget en
til den globale størrelse sequencer.
CONNOR HARRIS: Ja.
Den grundlæggende syntaks for liste forståelser er
beslag, værdi involverer nogle variabler, bar,
mulige værdier af variablerne selv lukkede beslag.
Og hvis du har gjort indstillet builder notation i nogen form for matematik klasse,
du måske har indstillet 2n sådan at n er i eller n er i z.
Lignende thing-- denne notation menes at være suggestive
af denne matematiske notation.
STEPHEN KREWSON: Og du kan anvende flere prædikater
og flere filtre i en liste forståelse, som er helt rart.
Algebraisk types-- vi vil ikke dvæle længe her.
Der er ikke en god idé i Haskell eller en god, indlysende begreb
af hvordan man kan tage, siger, en standard parameter til en funktion eller noget.
I Python, det er ganske nemt.
Du kan bare sige med lig på erklæringen af ​​funktionen,
en standard værdi på tilfælde ingen er leveret.
>> I Haskell, kunne du måske bruge måske den måske skrive,
som tager enten ingenting eller en værdi af typen blot en.
Så vi udnytte dette i trommemaskine at tillade os at give valgfri volumen
parametre til hver af de trommefigurer.
Så det giver os en måde at have EQ eller et volumen på en bestemt kanal.
>> CONNOR HARRIS: I andre Haskell eksempler,
du kan se måske bruges til funktioner, der kan svigte.
Dette er et almindeligt.
>> STEPHEN KREWSON: Og du kan levere en slags fejlmeddelelse som standard.
Og det er især praktisk, når du laver I / O i Haskell.
Det kan være tricks.
CONNOR HARRIS: Eller for en lignende eksempel, tror
for en funktion, der involverer division af en parameter, der kan være 0.
Og denne funktion kunne returnere måske uanset hvad.
Så hvis der er ingen division med 0, det vil vende tilbage lige uanset hvad.
Og hvis der er division med 0, vil den vende tilbage ingenting
som en måde til at signalere fejlen.
Fordi en konsekvens af Haskell er meget strenge maskinskrivning
er, at der ikke er nogen real-- undtagelser er akavet, dybest set,
fejlhåndtering er akavet.
Og det er en meget almindelig måde at gøre det.
>> STEPHEN KREWSON: Så nu får vi til en anden hjernevridende ting
om Haskell, som er mønstret matchende og funktionsdefinitioner.
Jeg viste dig i det sidste dias i erklæring fra trin sekvens
funktion, som tog en måske værdi, derefter en int, så en liste over ints,
derefter returnerer en sekvens af musik værdier der kommenteret
med både pitch og volumen.
>> Så disse tre argumenter kan være mønster matches på følgende måde.
Og vi altid ønsker at være sikker på at gøre en base sag eller exit sag først.
Og disse understregninger kan bare tolkes
forstås enhver værdi, der er der.
Så hvis vi får et opkald til trin sekvens med en vis værdi, en anden værdi,
og derefter den tomme liste, hvad vi ønsker at vende tilbage er blot stilhed, en resten 0.
>> Og i stedet for at være en tom liste eller 0,
det er en hvile 0, fordi vi er beskæftiger sig med musikken type,
og den tomme liste over musikken type er blot en resten af ​​nogen varighed.
Det er ingen musik.
Og så ser vi, hvis vi får et trin sekvens med en v for volumen argument,
p for sikkerhedsforanstaltning instrument argument, og derefter en liste over X'er.
>> Så vi gøre nogle ting.
Især anvender vi denne liste forståelsen,
og vi udføre nogle operationer på måske værdi
at gøre det til en numerisk værdi, så det kunne derefter optælles og anvendes
at vælge instrumentet.
Igen, dette er en lille bit bevidst inconcise
bare for at vise alle de underlige ting du kan gøre i Haskell, som du
tage et kig på det på din egen tid.
>> Okay.
Så vi endelig komme til gøre, hvad vi satte sig for at gøre,
som er gøre nogle computer musik.
Så vi kommer til at forsøge at gøre Frere Jacques sang.
Så der er hvor mange sætninger i Frere Jacques?
Fire.
Alle tiders.
Og hvad er rart, er, at de er alle gentaget
det samme antal gange, hvilket er to.
>> Så vi har fire sætninger hver gentaget to gange.
Og i særdeleshed, de er i en runde.
Og der er mange, mange måder at gennemføre
en runde, der kunne være sjovt at gøre.
Jeg har gjort det i en temmelig simpel måde her,
der blot at construct-- linjen funktion tager en liste af musik værdier
og forvandler det til sekventiel sammensætning ved at anvende den sekventielle sammensætning
operatør.
>> Og så er jeg forsinke de forskellige dele ved at gøre dem begynde med en pause.
Så jeg starter med en resten af ​​to foranstaltninger, og derefter en resten af ​​fire foranstaltninger,
og derefter en resten af ​​seks foranstaltninger, og derefter runde
værker, som vi alle ved denne sang.
Vi ser to anmærkninger eller ændringer af musik værdier
der er indeholdt i denne sekventielle arrangement af musik elementer.
Vi har en add volumen.
Dette er en funktion at anmærke musik med en bestemt mængde.
Dette er et godt eksempel af et MIDI-signal kørende
fra 0 til 127, de syv bits af oplysninger, der kan udføres.
>> Og then-- vi så det meget kort, men den generelle MIDI
liste over alle de forskellige instrumenter.
Og der er ikke en hel masse af dem.
Hvis du bruger en digital audio workstation, ligesom Ableton Live eller Pro Tools,
Der er en utrolig bredere vifte af synthesizere og VST instrumenter.
Men kun MIDI standarden har et par stykker, eller flere dusin.
Og nogle af dem er sjove.
Jeg troede det ville være sjovt, hvis vi spillede instrumentet MIDI-instrumentet
helikopter, og derefter næste vej gennem runde,
vi gjorde en pude synth, og så denne corny bly firkantbølge synth,
og derefter stemme sive, som er en lidt utydelig på min dårlige MIDI
synthesizer, men de OK.
>> Og så ser vi denne lad og i syntaksen fra Haskell,
og så er vi spiller alle disse dele sammen
med den parallelle præparat operatøren.
Og vi kunne sandsynligvis vise nogle af dette.
Her er koden.
Og du kan se i C, ville der være en masse halsen clearing og indstilling
tabellen koden, før du kunne lave musik som denne.
Eller enhver anden programmering sprog, ville du sikkert
nødt til at interagere med en slags bibliotek eller API og indstille alt op,
og så ville du nødt til at rydde op.
Men her i Haskell er, tror jeg, en gang du får hænge af det, utroligt
læselig og meget udtryksfuld.
Så der er gennemførelsen af Frere Jacques.
Okay.
Nu ønsker vi at tilføje slagtøj, og det er en lille smule Messier.
Så lad os tage et kig på dias.
Så den store idé er at gøre en flok af lister eller dele.
På grundlag af disse roll-i maskiner, der var typisk om måske otte
til 10 rytme eller percussion dele.
Og derefter bruge en masse teknikker.
Og vi har talt om these-- hjælp folder, filtre, lambda funktioner,
kortlagt i løbet af lister til at generere værdier i visse intervallet fra 1 til R, R er 16,
eller 32 trin i sequencer.
>> Og så hvis der er en værdi i listen da vi kører gennem sequencer,
løber gennem det over og overstået, viser det sig på dette notat,
og at prøve bliver udløst.
Her er alle de forskellige underlige måder Jeg kom op med at generere noter.
Prøv det på din egen semi sum.
Det vil lyde cool.
Tiden tillader det, vi vil gå igennem dette.
Men for lige nu, jeg gætte vi bør demo hvad vi har.
Lad os håbe, det går OK.
>> Så dette er GHCI.
Og vi vil indlæse en fil Jeg har kaldt song.lhs,
som er den fil jeg lige viste dig.
OK, stor.
Som Connor sagde tidligere, er det kompileret, skrive det kontrolleres,
så jeg kan trække vejret en hel del lettere.
Det kommer ikke til at sprænge på mig.
>> Jeg ønskede at vise dig noget nyttigt.
Du kan se, at en modul indlæst kaldt 50.
Du kan gennemse dette modul.
Og det er så dejligt om doing-- måske hvad
du laver i Haskell er ikke kaldet software udvikling,
men du kan gøre en masse sjove ting på egen hånd.
Og arbejdsgangen er virkelig rart, som sammenlignet med en masse andre sprog,
fordi du kan se i en virkelig læsbar måde, hvad der foregår.
Så vi kan se, at vi har alle disse sætninger, som
er lister af musik pladser, og så vi opbygge disse op til noget større,
som er en musik sang.
Det er en musikalsk enhed.
Og så kan vi spille det hele med en funktion kaldet play musik.
Du kan se, hernede.
Hvilket er bare spille.
>> Jeg skulle say-- jeg ikke tale om denne dollartegn, der er overalt.
Dollartegn er en anden Infix operatør.
Men det har den laveste forrang for ledere, som effektivt
betyder, at alt på venstre for dollartegn
og højre for dollartegn, vi kommer til at få evalueret før det.
Så det er lidt ligesom en anden måde at tilføje parentes.
>> CONNOR HARRIS: Det er dybest set sammensat funktion.
Og det sikrer, at du ikke have-- hvis du har funktioner på hver side eller Infix
operatører på hver side, vil de ikke forbinder på tværs af det og give dig
uventede resultater.
>> STEPHEN KREWSON: Så vi can-- bruger det, kan vi kalde.
Først vil vi spille det uden trommer.
Det er helikopteren, MIDI helikopter.
>> [Musik spiller]
Der er den firkantet bølge.
Stemmen sive.
Og du kan virkelig gå vild med dette.
Jeg plukket en temmelig simpel en, fordi jeg vidste, jeg skulle ikke bide
mere end jeg kunne tygge.
Bare holde det ret simpelt at vise de vigtigste ideer.
Men så var jeg ligesom, vi har fik at tilføje nogle trommer til dette.
Bare fordi det er en lidt uigennemtrængelige,
og jeg brugte ikke Navn på tromme dele,
Jeg kortlagt them-- fordi de er en del af denne opregnet klasse,
Jeg kortlagt dem til ints.
Den ene er som en stortromme.
Zero er så godt.
Syv er en høj hat.
Og ned i her, hvor den funktioner få lidt mere tilfældigt,
disse er ligesom conga trommer.
>> Så hvis du tror om-- måske en sjov måde at gennemføre en trommemaskine
er at bruge meget velordnet mønstre på din stortromme.
Så for eksempel, om filtrering over liste med alt, hvad der giver tilbage
en 1, når det har taget modul 04.
Så jeg får 1, 5, 9, 13, 17-- så dette er det første slag i hver foranstaltning.
>> Og så er det samme ting flyttet over to trin.
Så det er den skæv.
Så det ville være noget som en høj hat.
Og så igen, hernede, det er lidt tilfældigt,
fordi vi laver conga trommer.
Og jeg har nogle maracas hernede, også.
>> Så jeg kunne kalde play trommemaskine, men det ville blive ved for evigt,
og det kan begynde at snuppe op al den hukommelse i mit system.
Så jeg vil kalde denne funktion afspille musik, der som vi vil se,
bruge beskærer parallel sammensætning at spille vores lille Frere Jacques sang
sammen med denne underlige trommemaskine.
Så lad os tage et kig.
Og er du forbedre på min arrangement af alle trommefigurer.
Ikke mit speciale, men jeg havde en masse sjov gør det.
>> [Musik spiller]
>> Så selvfølgelig, det er alt lidt ikke så sjov
hvis vi ikke kan konvertere det til en score så måske er det
kunne fortolkes af et menneske performer.
Så jeg vil ikke køre det her.
Jeg har allerede genereret filerne.
Du kan se, at der er en dot LilyPond file-- og dette
vil være min segue over til Connor-- og en prik MIDI-fil,
og en prik PDF-fil, hvilket er, hvad LilyPond vil i sidste ende genererer.
>> Men disse er de scripts, og jeg vil bare køre dem med deres hjælp muligheder.
Hvis du får disse op at køre med Euterpea, kan du generere en MIDI-fil.
Og derefter fra MIDI-fil med MIDI 2LY program,
du kan generere en Lily Dam-fil, og så skal du
kan generere en PDF af partituret.
Og vi bør tage et kig på dette.
Så Connor vil formentlig vise hvordan du anmærke det bedre,
men dette er Frere Jacques som genereret af mig i Euterpea.
Det er bare i C. Jeg burde have regnet ud af, hvad hacke det er faktisk i.
Men det er pipelinen for hvordan du gøre det med det.
Lad os tale mere om LilyPond.
>> CONNOR HARRIS: OK Lad os se.
Vidste du nævner Lær du Haskell?
STEPHEN KREWSON: Oh yeah.
Tjek Lær Du Haskell.
Det er i ressourcerne.
Det er sådan jeg startede læring, og det er fantastisk.
Ikke dum læring.
>> CONNOR HARRIS: Så det er online.
Så en fyr ved navn [uhørligt] learnyouahaskell.com, uden mellemrum.
Grammatik er syg.
STEPHEN KREWSON: Det er illustreret, også.
CONNOR HARRIS: Så hvad er LilyPond?
Det er en deklarativ programmering sprog til musik satsarbejde.
Så declarative-- du kan tænke på ting som HTML,
hvor du ikke er saying-- HTML ikke sige, hvordan webbrowsere skal
gør sider skridt for skridt.
Det er bare at sige dette er en beskrivelse
af, hvad du vil have på siden for at se ud.
>> Og så er det også et program der samler dette sprog,
eller den læse dens i og derefter rent faktisk gør opsætning for dig,
og det spytter disse vidunderlige søger PDF scoringer.
Du kan også få PNG-format eller hvad.
En god måde at tænke af denne er analogt
er, at LaTeX er lidt ligesom LillyPond, men for blot almindelige satsarbejde.
Så i stedet of-- det ikke er WYSIWYG, hvad du ser
Er hvad du får, ligesom, siger Finale er, eller Sibelius,
eller Microsoft Word, hvor du kan indtaste realtid og udkast ting i realtid
og se ændringer går.
>> Det er tekst baseret.
Du er nødt til at oversætte din scores ved hjælp af en særskilt program
og komme ud PDF'er senere.
Dette er en smule mindre praktisk til brug, hvis du er
forsøger at skrive direkte ind i en score, og du er
forsøger at komponere på computeren.
Men der er en masse fordele for det.
One, betyder det ser meget pænere, fordi LillyPond kan faktisk
tage sig tid til at gøre layout beslutninger korrekt,
modsætning Sibelius eller Finale, som har at gøre kompromitterede algoritmer, så
at de kan vise ting i realtid.
>> Så hvorfor er LilyPond-- computergrafik er svært.
Hvis du laver noget med musik og du ønsker at skrive ud scoringer,
du ikke ønsker at skrive ud af alt ved dig selv
startende med hvordan man tegner stabe og hvordan man tegner notesblokke.
Det er meget vanskeligt. Det er blevet gjort før.
Du er fint.
>> Hvis du ønsker at bruge Finale eller Sibelius, filformaterne for disse ting
er meget kompliceret, og du kan ikke virkelig bruge dem programmatisk.
Du kan åbne op Sibelius med Finale og gå til Fil, Export som PDF selv,
men du kan ikke rigtig kalde det fra et script.
LillyPond, kan du ringe af disse scripts.
Du kan nemt gentage LillyPond med LaTeX.
Jeg vil ikke have så meget tid til at gå ind i disse teknologier lige nu,
men de findes.
Hvis du ønsker at se i en LillyPond bog,
Det er et program, der kommer med din LillyPond distribution,
og det er for iteration LillyPond fragmenter ind i LaTeX
hvis du ønsker at gøre noget ligesom en stor musikvidenskab dokument
med eksempler, for eksempel.
Og det er en god færdighed for liv, hvis du laver noget
med musik, ikke bare CS50.
Jeg har brugt LillyPond for alle af mine sammensætning projekter
siden jeg var dybest set en senior i high school.
>> Så her er nogle enkle eksempler.
Dette er dybest set repræsenterer af sværhedsgrad
at de fleste mennesker ville se det i øjnene de forsøgte
at bruge LilyPond til simple projekter.
Denne første er begyndelsen til en koral optakt af Bach.
Denne nederste er et uddrag fra en af ​​mine egne værker,
og det er der bare for at vise du ting som [uhørligt]
sætte flere linjer i samme personale, hvor lyriske undersetting fungerer.
Lyric underlag er en ting, der er meget let at bruge LilyPond for kormusik.
>> Og så så er der nogle flere komplicerede eksempler her.
Alle disse er udført i LilyPond og de er gennemførlige.
Denne første uddrag er fra [Uhørligt] af [uhørligt].
Og denne [uhørligt] fra et stykke for solo bas
fløjte ved [uhørligt] der er en longtime-- der
var en mangeårig medlem af musik afdeling her, tror jeg.
Jeg er ikke sikker på, hvor han er gået ud for at.
Men han var rådgiver for Harvard Komponister Association for lang tid.
Vidunderlig mand.
Og han skriver noget musik, der har meget kompliceret notation som LillyPond
kan ikke desto mindre håndtere meget pænt.
>> Så bare for at give dig en fornemmelse af, hvad Denne ting kapacitet are-- så
den interne af LillyPond er meget kompliceret.
Og du kan bruge det til lang tid, herunder
for nogle temmelig kompliceret ting, uden egentlig
at skulle vide en masse om dem.
Men den grundlæggende idé er, at der på laveste niveau, atomerne i LillyPonds
er noterne.
Noterne indeholder en sammenhæng kaldes stemmer.
Så stemmen kontekst svarer grundlæggende
til en enkelt linje af polyfoni.
Og så kontekst kan være indeholdt hierarkisk
i højere niveau dem, repræsenterer stabe på scoren
eller større grupperinger som klaver stabe eller kor stabe,
og så til sidst hele score sammenhænge.
Og du kan faktisk omfatte flere scoringer i en bog.
>> Og hver kontekst har en Antallet af vedhæftede gravører.
Hvis du ser gennem indholdet af en forbindelse
og udskrive et bestemt symbol eller en vis klasse af symboler som nødvendigt.
Så at hver stemme sammenhæng der er [uhørligt] noter
engraver der er dybest set en funktion eller et objekt, der skriver ud hele noten
hoveder på de rigtige dele af en side.
Så er der en kløft gravør, som skriver ud kløfter på personalet.
Så er der en metronom mark gravør, der
skriver ud metronome mærker i en score.
Og alle disse passer temmelig godt ind i hierarkiet.
Og det er meget, meget, meget tilpasses, som du har brug for
Hvis du ønsker at få ting som.
>> Så alle sammenhænge har en masse forskellige attributter
som du kan ændre for alt fra afstanden til forskellige font
valg til størrelser af tingene.
Hvis du ønsker at gøre endnu mere komplicerede ting,
der er en indlejret scriptsprog.
De bruger ordningen, som er dialekt af LISP.
Disse gør nok ikke betyde noget for dig.
Men dybest set, en ordning en anden funktionel
programmeringssprog, mere eller mindre.
>> STEPHEN KREWSON: Den tie-in.
>> CONNOR HARRIS: Ja.
Det er en god tie-in, formoder jeg.
Og det bruges som et pædagogisk sprog, faktisk, ned Mass Ave. På MIT.
Og det er meget praktisk for LillyPond af forskellige tekniske årsager.
>> Og så hvis du ønsker at gøre simple tweaks afhængige betingede,
til example-- der er bestemt tilstand en score, der er opfyldt,
foretage ændringer i layout eller whatnot-- derefter
disse faciliteter er der.
De er kompliceret.
Så her er en temmelig simpel kode prøve.
Det er fem linjer.
Dybest set, jeg definerer to stabe.
Det er i 3/4.
Den første medarbejdere har en vedhæftet tempo mark,
men der er faktisk går at gå videre til hele score,
fordi tempo mærker er på kampen helt åben.
Metronomen mark gravør er knyttet til score sammenhæng.
Der er forskellige nøgler, fordi [uhørligt] gravør
er knyttet stabe.
Du kan faktisk gøre, er.
Prøven jeg skrev er faktisk i C-dur,
men det er bare at demonstrere du kan have
forskellige nøgler i forskellige stabe.
Og den grundlæggende syntaks er du skriver Bemærk navne med E, F, G, uanset hvad.
Hvis du ønsker at gøre fortegn, du suffiks IS eller ES.
Det er fra hollandsk musikvidenskabelige konventioner.
>> Og for at gøre oktav spring, er du nødt til at bruge disse kryds mærker, komma eller apostrof.
Den relative betyder bare uanset hvad du har en note,
Det vil automatisk blive plaec i oktav tættest på den foregående.
Og hvis du ønsker at hoppe mere end a fifth-- sige en femte eller more--
så er du nødt til at bruge [uhørligt].
Men ellers behøver du ikke at specificere oktav af hver eneste tone.
>> Og relativ C, prime, og C, skal du blot angive midterste C
og base C, især første toner.
Så har du disse stabe, der organiserer disse to stemmer eller prøver af musik,
og du har en score.
Og det ser sådan ud.
>> Hvis du ønsker at tage sig tid til at kopiere at prøve af LillyPond
kode på det foregående glide ned her, og du
kan skrive det for dig selv LillyPond.
Jeg ved, at vi har fået noget der ser meget gerne dette.
Så der er en anden teknologi kaldet Music XML opretholdes
ved helt forskellige mennesker.
XML er en tekstdata structure-- I bør ikke sige data structure-- sige
metafor kort slags.
Og det er designet til at holde hierarkiske data meget godt.
HTML, for eksempel, er en form for XML.
Og du kan fortælle XML, fordi de havde alle vinkelbeslag og vinkel
beslag skråstreg mærker der viser datafelter.
>> Jeg har ikke en kode eksempel fra Music XML.
Du kan finde det selv.
Dybest set, grunden til at du måske ønsker at bruge XML som den mellemliggende trin
er først og fremmest, er det en udvekslingsformat
for stort set every-- jeg ikke sige hver, men en masse forskellige score
forfattere.
Så hvis du skriver i Musik XML, ikke kun kan LillyPond
læse det med hjælp af denne auxilary program kaldet Music XML til LY,
men også Finale kan læse det, kan Sibelius læse den.
Afhængigt af hvordan din interne objekt hierarki virker til at repræsentere musik,
Det kan være lettere at skrive til Musik XML end at LillyPond
og bare stole på Music XML til LY at gøre konverteringen.
>> Jeg tror ikke, [uhørligt] har musik XML.
STEPHEN KREWSON: Det gør ikke.
Nogen arbejder på det, selv om.
>> CONNOR HARRIS: OK.
Euterpea ikke har en Musik XML output funktion endnu.
Hvis du ønsker en afsluttende projekt idé, måske komme i kontakt med fyre
at Stephen kender, og de kunne bruge din hjælp.
>> STEPHEN KREWSON: Jeg ville elske det.
CONNOR HARRIS: Også, dybest set, hver programmeringssprog
det er værd salt har allerede en XML-bibliotek,
så du kan internt konvertere alle af din musik ind i nogle objekt
at XML biblioteket kan skrive at ville kræve færre
ændringer i din indre struktur for uanset musik objekter dig
ønsker at skrive end at skrive det direkte i LillyPond ville.
Så bare printe den ud med XML med XML biblioteker i dit sprog,
som vil garantere, at det er syntaktisk korrekt og alt,
og derefter konvertere den til LillyPond.
Så teknologi, du måske ønsker at se på, hvis du laver noget
sådan her.
>> [Uhørligt], en anden auxilarry teknologi.
Dette er dybest set Tech Works eller Tech Studio til LillyPond.
Så det tilbyder hjælp med syntaks, med skabeloner
til forskellige fælles kombinationer af instrumenter.
Det gør det muligt split screen visning så du kan få din kode i et vindue
og PDF i et andet vindue og klikke på steder i PDF
at springe til den relevante spots i din kildekode.
Dette er mere nyttigt, hvis du faktisk skriftligt LillyPond filer dig selv
end hvis du genererer dem programmatisk.
Men igen, det er noget nyttigt at have.
>> Alle tiders.
En anden resources-- jeg bare gå gennem denne meget hurtigt.
LillyPond manuals-- LillyPond har fremragende dokumentation på sin hjemmeside.
De har en tutorial.
De har en syntaks reference.
De har hundredvis af uddrag til diverse små ting
yo måske har brug for at gøre for at demonstrere forskellige kapaciteter.
Hvis du ønsker at bruge scriptsprog
eller gøre mere omfattende tilpasninger, så er der
interne referere på denne webadresse.
Hvis du ønsker at bruge musik XML, der er at URL, musicxml.com/tutorial.
>> Og så hvis du har brug for at lære ordningen fordi du rent faktisk ønsker at bruge
de scripting faciliteter i LillyPond, så er der en [uhørligt] kaldet
Struktureret Tolkning af computerprogrammer,
som ikke kun er den anden største CS lærebog nogensinde written--
finde mig bagefter, hvis du ønsker at vide hvad jeg tror den største ene is--
men det er også en meget god introduktion til sproget korrekt.
Du behøver ikke mere end De første afsnit.
>> Og det er det.
Nogen spørgsmål?
>> STUDENT: Hvor kan jeg downloade din genereret Frere Jacques
så jeg kan sætte det på min iPod?
>> STEPHEN KREWSON: Nå, kan du skrive ud til nogle wav-fil i Euterpea.
Og du har koden.
Det er på GitHub.
Lav dine egne variationer af Frere Jacques ved CS50 hive sind.
Det ville være dejligt.
CONNOR HARRIS: Nogen anden?
STEPHEN KREWSON: Vi har brug for en bedre stortromme, også.
Det er virkelig slemt.
>> STUDENT: Euterpea har ikke kun sammensætningen side, men signal--
STEPHEN KREWSON: Ja.
Faktisk arbejdet I gjorde i Euterpea, da jeg
tog denne-- der er en graduate kursus på Yale, der
bruger det-- var på sund syntese.
Så der er en virkelig pæn måde ved hjælp af pile
og nogle af notation vi så af komponere sammen signalfunktioner.
Især bas for de fleste af dem er blot en simpel sinusbølge.
Men hvis du begynder at komponere dem på mærkelige programmatiske måder,
du kan få skøre lyd effekter, ligesom mærkelige kaskader.
Du kan oprette meget grovkornet lyde med en masse af graduering.
>> Jeg gjorde et projekt om granuleret syntese, som er
et sted i mellem FM og prøveudtagning.
Du tager meget små, små prøver og derefter
kombinere dem med en slags modulator og opbygge en rigere lyd.
Vi gjorde også fysisk modellering, så forsøger at tænke på fysik
og psykoakustik for noget lignende en trompet, og tænker over den måde
lyden er hoppende off klokken af ​​trompeten
og akustikken i værelse og modellering
at med de grundlæggende oscillatorer.
CONNOR HARRIS: Tak så meget.
Tak for at komme.
Og jeg er altid villig til at tage spørgsmål ved email--
connorharris@college.harvard.edu.
>> STEPHEN KREWSON: Ja. stephen.krewson@yale.edu.
Afkøle.