1 00:00:00,000 --> 00:00:05,180 2 00:00:05,180 --> 00:00:05,930 CONNOR HARRIS: Hei. 3 00:00:05,930 --> 00:00:06,820 Jeg er Connor Harris. 4 00:00:06,820 --> 00:00:09,729 Jeg er en CS50 CA ved Harvard. 5 00:00:09,729 --> 00:00:11,270 STEPHEN KREWSON: Jeg er Stephen Krewson. 6 00:00:11,270 --> 00:00:12,582 Jeg er en TF for CS50 ved Yale. 7 00:00:12,582 --> 00:00:15,790 CONNOR HARRIS: Og vi kommer til å snakke om noen teknologier som du kanskje 8 00:00:15,790 --> 00:00:18,880 ønsker å bruke hvis du er interessert i å gjøre et avsluttende prosjekt eller virkelig 9 00:00:18,880 --> 00:00:20,920 noe med musikk. 10 00:00:20,920 --> 00:00:24,400 Vi kommer til å fokusere på først en programmeringsspråk kalt Haskell. 11 00:00:24,400 --> 00:00:26,280 Det er en funksjonell språk, så paradigmet 12 00:00:26,280 --> 00:00:29,620 er svært forskjellig fra C eller PHP eller andre imperative språk 13 00:00:29,620 --> 00:00:33,450 at du har brukt allerede, og spesielt på et bibliotek skrevet i Haskell 14 00:00:33,450 --> 00:00:40,240 kalt Euterpea, noe som kan hjelpe folk med å skrive musikk funksjonelt, 15 00:00:40,240 --> 00:00:40,780 i utgangspunktet. 16 00:00:40,780 --> 00:00:43,400 Og Stephen vil lede deg gjennom et godt eksempel på det. 17 00:00:43,400 --> 00:00:46,423 >> Etter dette, vil jeg introdusere deg til noe som kalles LillyPond, som 18 00:00:46,423 --> 00:00:48,370 er en teknologi for sats musikk. 19 00:00:48,370 --> 00:00:50,830 Det er liksom som LaTeX for musikk hvis noen av dere 20 00:00:50,830 --> 00:00:57,530 har brukt LaTeX for matematikk klasser eller andre P sett klasser eller hva har du. 21 00:00:57,530 --> 00:01:00,440 Og så skal jeg gi deg, igjen, noen enkle eksempler på at 22 00:01:00,440 --> 00:01:03,640 og peke deg i den generelle retning av noen bedre ressurser. 23 00:01:03,640 --> 00:01:04,319 >> STEPHEN KREWSON: I Dessuten tenkte vi at det 24 00:01:04,319 --> 00:01:06,720 ville være kult å sette opp en liten bit av tips 25 00:01:06,720 --> 00:01:10,780 mot en rørledning mellom Euterpea generert MIDI-filer 26 00:01:10,780 --> 00:01:13,910 i LillyPond, så vi gir noen instruksjon på skript 27 00:01:13,910 --> 00:01:16,310 for å gjøre det som befinner utstyrt med LillyPond 28 00:01:16,310 --> 00:01:19,160 bare for å holde den åpen kildekode og få en rørledning går. 29 00:01:19,160 --> 00:01:20,910 CONNOR HARRIS: Igjen, vi bør vektlegge, 30 00:01:20,910 --> 00:01:23,100 disse to teknologiene, du trenger ikke å bruke dem sammen. 31 00:01:23,100 --> 00:01:25,370 De er ikke laget for å fungere sammen, selv om de gjør veldig pent. 32 00:01:25,370 --> 00:01:26,362 >> STEPHEN KREWSON: Høyre. 33 00:01:26,362 --> 00:01:30,116 Og helt gratis. 34 00:01:30,116 --> 00:01:32,240 CONNOR HARRIS: So bekreftelser, bare les det. 35 00:01:32,240 --> 00:01:33,406 STEPHEN KREWSON: etterretning. 36 00:01:33,406 --> 00:01:36,360 Takket være de folkene. 37 00:01:36,360 --> 00:01:39,180 Dette vil jeg dvele på bare et øyeblikk. 38 00:01:39,180 --> 00:01:41,560 Installasjonen er litt kinkig. 39 00:01:41,560 --> 00:01:45,420 Vi har en leser meg på GitHub at du kan ta en titt på. 40 00:01:45,420 --> 00:01:47,840 Bare send meg hvis du har spørsmål. 41 00:01:47,840 --> 00:01:52,829 Men vi skal kjøre dette under forutsetning at dette fungerer for alle. 42 00:01:52,829 --> 00:01:55,620 CONNOR HARRIS: Og hvis du ikke kan få LillyPond å arbeide, ingen big deal. 43 00:01:55,620 --> 00:02:00,139 Det er ingen live kompilering som vil være involvert, i alle fall på min ende. 44 00:02:00,139 --> 00:02:02,930 STEPHEN KREWSON: Haskell og LillyPond bør begge har montører. 45 00:02:02,930 --> 00:02:08,497 Euterpea lastes ned som en pakke, så videre og så videre. 46 00:02:08,497 --> 00:02:10,080 Så vi snakker om datamaskinen musikk. 47 00:02:10,080 --> 00:02:12,990 Og dette er bare en svært 50000 fot visning. 48 00:02:12,990 --> 00:02:15,700 Det er noen forskjellige aspekter av det. 49 00:02:15,700 --> 00:02:18,120 Og dette er grov og er kommer til å skjule noen detalj. 50 00:02:18,120 --> 00:02:22,090 Men vi kunne tenke på noe som algoritmisk komposisjon, 51 00:02:22,090 --> 00:02:24,920 ved hjelp av algoritmer, ved hjelp av kode, for å generere 52 00:02:24,920 --> 00:02:30,280 noen type of-- kanskje en selv lignende sekvens av notater, eller kanskje notater 53 00:02:30,280 --> 00:02:33,330 under en begrensning. 54 00:02:33,330 --> 00:02:35,350 Og så de kunne være utføres eller tolket 55 00:02:35,350 --> 00:02:38,390 med analoge instrumenter eller noe sånt. 56 00:02:38,390 --> 00:02:42,010 Men sammensetningen var gjort algoritmer. 57 00:02:42,010 --> 00:02:45,120 >> Men selvfølgelig, kanskje på området datamaskin musikk eller digital musikk 58 00:02:45,120 --> 00:02:48,870 vi er mer kjent med er digital lydsyntese eller digital sampling 59 00:02:48,870 --> 00:02:51,160 og digital innspilling. 60 00:02:51,160 --> 00:02:55,650 Mange digitale instrumenter er gjort gjennom digital sampling. 61 00:02:55,650 --> 00:03:00,110 Faktisk vil vi være å bruke en av de i form av en lyd font bibliotek senere. 62 00:03:00,110 --> 00:03:02,850 >> Men det er også noe som heter digital syntese som kom ut 63 00:03:02,850 --> 00:03:08,650 på slutten av 70-tallet og inn på 80-tallet med Yamaha og John Chowning ved Stanford 64 00:03:08,650 --> 00:03:11,990 gjør FM syntese eller Frequency Modulation syntese, 65 00:03:11,990 --> 00:03:15,100 hvor du hadde en transportør signal og et modulasjonssignal 66 00:03:15,100 --> 00:03:18,270 både i lydspekteret. 67 00:03:18,270 --> 00:03:22,570 Men det vi er fokusert på i dag er noe som kalles MIDI, 68 00:03:22,570 --> 00:03:25,040 og selvfølgelig algoritmisk komposisjon. 69 00:03:25,040 --> 00:03:30,940 >> Vi kommer ikke til å lage instrumenter, men vi i stedet kommer til å gjøre litt musikk, 70 00:03:30,940 --> 00:03:33,940 og så vil det bli tolket av noen instrumenter som 71 00:03:33,940 --> 00:03:38,300 er i overenstemmelse med General MIDI-standarden. 72 00:03:38,300 --> 00:03:40,830 Så hva er MIDI? 73 00:03:40,830 --> 00:03:45,550 Jeg kommer ikke til å komme for dypt inn i det, men MIDI er dataoverføringsprotokoll. 74 00:03:45,550 --> 00:03:49,250 Det er en slags guide over ulike selskaper og bransjer 75 00:03:49,250 --> 00:03:52,250 for organisering av lyder eller patcher. 76 00:03:52,250 --> 00:03:54,170 Så får vi se at det er en MIDI standard 77 00:03:54,170 --> 00:03:57,500 for alle de forskjellige slag lyder og MIDI-anbefalinger 78 00:03:57,500 --> 00:04:01,360 for alle de forskjellige typer av synth eller ulike typer av hele instrumentet 79 00:04:01,360 --> 00:04:03,650 grupper i et orkester, sier. 80 00:04:03,650 --> 00:04:08,916 >> Du er sikkert kjent med 0 til 127 MIDI-meldinger. 81 00:04:08,916 --> 00:04:12,920 En MIDI signal er typisk en bit som indikerer 82 00:04:12,920 --> 00:04:16,130 enten det er en data eller en status pakke, og så er det 83 00:04:16,130 --> 00:04:18,589 syv biter av et signal. 84 00:04:18,589 --> 00:04:21,430 Og disse kan styre alt fra volum 85 00:04:21,430 --> 00:04:25,330 handlingen eller press på en bestemt tast 86 00:04:25,330 --> 00:04:29,400 hvis du utfører med en MIDI controller samt, selvfølgelig, 87 00:04:29,400 --> 00:04:31,250 notater. 88 00:04:31,250 --> 00:04:33,450 Og selvfølgelig, har MIDI vært svært nyttig, 89 00:04:33,450 --> 00:04:37,550 fordi det er en måte å tråd sammen eller kjede 90 00:04:37,550 --> 00:04:41,570 en haug med MIDI maskinvareenheter. 91 00:04:41,570 --> 00:04:44,050 Jeg har sju eller åtte tilbake på huset mitt. 92 00:04:44,050 --> 00:04:46,610 Det blir veldig komplisert, men det er veldig kraftig. 93 00:04:46,610 --> 00:04:47,460 Og det er virkelig gamle. 94 00:04:47,460 --> 00:04:51,117 Det er fra tidlig på 80-tallet, og det er veldig fint og små. 95 00:04:51,117 --> 00:04:51,950 CONNOR HARRIS: Yeah. 96 00:04:51,950 --> 00:04:54,230 All den klassiske Nintendo videospill ville trolig 97 00:04:54,230 --> 00:04:56,088 har MIDI-filer for musikk, for eksempel. 98 00:04:56,088 --> 00:04:59,550 99 00:04:59,550 --> 00:05:01,740 >> STEPHEN KREWSON: Her er et eksempel på generell MIDI, 100 00:05:01,740 --> 00:05:06,520 viser MIDI som en slags av generell protokoll. 101 00:05:06,520 --> 00:05:13,280 Og jeg tror vi kan tenke på Forskjellen mellom spesifikasjonen 102 00:05:13,280 --> 00:05:17,830 at det skulle være noe sånt disse instrumentlyder og den faktiske 103 00:05:17,830 --> 00:05:21,740 realisering av disse instrumentene høres i en lyd skrift eller en bestemt MIDI 104 00:05:21,740 --> 00:05:25,740 synthesizer som forskjellen mellom kanskje en typeface-- som sier: 105 00:05:25,740 --> 00:05:30,350 Generelt er denne utformingen av denne måte å representere 106 00:05:30,350 --> 00:05:35,907 characters-- og en bestemt skrift som har en bestemt størrelse og klang, 107 00:05:35,907 --> 00:05:37,240 og det er realisering av the-- 108 00:05:37,240 --> 00:05:39,156 >> CONNOR HARRIS: Kanskje en bedre sammenligning ville 109 00:05:39,156 --> 00:05:43,430 være Unicode-standarden says-- det gir et nummer til hver karakter, og virkelig 110 00:05:43,430 --> 00:05:46,830 alle språk i verden, eller et stort sett av skript av språket 111 00:05:46,830 --> 00:05:51,310 i verden, og de er deretter gjengitt til noe grafisk 112 00:05:51,310 --> 00:05:53,710 av ulike skrift pakker. 113 00:05:53,710 --> 00:05:56,630 Og selvsagt kan du tenke på MIDI som Unicode av lyd. 114 00:05:56,630 --> 00:06:03,250 Og det er bare en liste of-- en stor bekk av hendelser og instrumenter og whatnot, 115 00:06:03,250 --> 00:06:06,090 og du må ha en egen Programmet, som en skrifttype, 116 00:06:06,090 --> 00:06:08,537 å gjengi det i noe som er hørbar. 117 00:06:08,537 --> 00:06:12,360 118 00:06:12,360 --> 00:06:13,780 >> STEPHEN KREWSON: Så hvorfor Haskell? 119 00:06:13,780 --> 00:06:19,110 Haskell er en funksjonell programmering språk, svært avansert, 120 00:06:19,110 --> 00:06:22,770 svært forskjellig fra C, svært forskjellig fra PHP. 121 00:06:22,770 --> 00:06:28,120 Og vi kommer til å se at det er en enkel funksjon sammensetning i Haskell 122 00:06:28,120 --> 00:06:37,640 som vil tillate oss å vind gjennom komponere eller skrive opp, transkribering, 123 00:06:37,640 --> 00:06:42,160 noe som Frere Jacques, denne enkle sangen som 124 00:06:42,160 --> 00:06:46,815 har en rekke deler i det at er selv lignende eller gjentatt. 125 00:06:46,815 --> 00:06:49,740 126 00:06:49,740 --> 00:06:53,250 Så dette vil være noen av motivasjonen for hvorfor 127 00:06:53,250 --> 00:06:59,400 vi bruker Haskell, der funksjonene er førsteklasses borgere. 128 00:06:59,400 --> 00:07:01,120 >> Og jeg ønsket å utvide dette litt. 129 00:07:01,120 --> 00:07:08,800 Det er litt lett å notere Frere Jacques i Haskell. 130 00:07:08,800 --> 00:07:12,100 Men hva hvis vi ønsket å legge en tromme del til det? 131 00:07:12,100 --> 00:07:17,320 Hva hvis vi ønsket å prøve å gjøre noe som en Roland 808 eller 909 trommel 132 00:07:17,320 --> 00:07:20,970 maskin der du har ca 16 forskjellige trinn? 133 00:07:20,970 --> 00:07:24,590 Vanligvis er disse tenkt som 16. notater. 134 00:07:24,590 --> 00:07:28,640 Og du kan styre den globale tempo, og du kan plukke ut 135 00:07:28,640 --> 00:07:34,620 en haug med forskjellige perkusjon deler av basstromme, en klapp, forskjellige snarer, 136 00:07:34,620 --> 00:07:37,540 åpne og lukkede høye hatter på disse slags kanaler, 137 00:07:37,540 --> 00:07:41,600 og deretter kan du EQ eller justere volumet. 138 00:07:41,600 --> 00:07:45,290 >> Og vi vil se en fin måte i Haskell representere dette trinnet 139 00:07:45,290 --> 00:07:48,810 sequencer med alle diverse kule ting i Haskell 140 00:07:48,810 --> 00:07:53,100 vi kan gjøre med å generere lister og filtrering enn lister, 141 00:07:53,100 --> 00:07:56,060 kartlegging i løpet av lister, kartlegging funksjoner enn lister. 142 00:07:56,060 --> 00:07:59,530 143 00:07:59,530 --> 00:08:00,760 Og en rask unnskyldning. 144 00:08:00,760 --> 00:08:05,300 Dette er en meget overfladisk og altfor rask skisse 145 00:08:05,300 --> 00:08:07,620 av noen av aspektene for Haskell og Euterpea, 146 00:08:07,620 --> 00:08:11,760 som er en domene-spesifikk innebygd språket skriftlig 147 00:08:11,760 --> 00:08:14,970 i Haskell for musikalske typer. 148 00:08:14,970 --> 00:08:17,350 Så må du sjekke ut koden online. 149 00:08:17,350 --> 00:08:22,404 Fyr opp GHCI, som er Glasgow Haskell Compiler Interpreter. 150 00:08:22,404 --> 00:08:24,320 Og jeg kommer til å gjøre noen av denne i en liten bit 151 00:08:24,320 --> 00:08:25,880 slik at du kan se hvordan det gjøres. 152 00:08:25,880 --> 00:08:31,021 >> Og dette gjør at du kan laste inn med the-- syntaksen er kolon og deretter 153 00:08:31,021 --> 00:08:31,520 kommandoen. 154 00:08:31,520 --> 00:08:33,510 Du kan laste inn filer. 155 00:08:33,510 --> 00:08:36,840 Du kan bruke bla på disse filene for å se alle de funksjonene som 156 00:08:36,840 --> 00:08:39,169 finnes i en bestemt modul. 157 00:08:39,169 --> 00:08:43,850 Og så så vi får se, typer og typen klasser er så viktig i Haskell, 158 00:08:43,850 --> 00:08:48,850 så du kan alltid check-- spesielt Hvis du arbeider i en ny dscl 159 00:08:48,850 --> 00:08:51,600 som dette, hva er en type musikk? 160 00:08:51,600 --> 00:08:55,114 Jeg vet om måten numerisk typer jobber i Haskell, 161 00:08:55,114 --> 00:08:56,530 men jeg vet ikke mye om musikk. 162 00:08:56,530 --> 00:09:01,280 Men du kan utforske den måten de er definert ved hjelp av denne t eller type kommando 163 00:09:01,280 --> 00:09:04,577 og deretter ringer i en bestemt funksjon eller en dataobjekt. 164 00:09:04,577 --> 00:09:05,410 CONNOR HARRIS: Yeah. 165 00:09:05,410 --> 00:09:09,820 Hvis du trodde C og klang var hardass om typer, 166 00:09:09,820 --> 00:09:11,230 du har ingen anelse om Haskell. 167 00:09:11,230 --> 00:09:14,230 Den gode ting om Haskell er at Hvis du kan få koden til å kompilere 168 00:09:14,230 --> 00:09:16,790 og hvis Haskell typen kontroller, det er nok riktig, 169 00:09:16,790 --> 00:09:18,675 fordi den type system er så strenge. 170 00:09:18,675 --> 00:09:20,090 >> STEPHEN KREWSON: Yeah. 171 00:09:20,090 --> 00:09:21,980 Så jeg vil bare gå through-- og igjen, 172 00:09:21,980 --> 00:09:27,160 dette er ikke å gjøre det justice-- noen av funksjonene i Haskell at minst 173 00:09:27,160 --> 00:09:31,780 til sin creators-- og det ble opprettet på slutten av 1980-tallet av en haug med folk, 174 00:09:31,780 --> 00:09:34,610 en komité bestående av ca 20 people-- trodde var viktig. 175 00:09:34,610 --> 00:09:36,850 Og det første de oppført i et papir som 176 00:09:36,850 --> 00:09:41,890 beskrev genesis av Haskell i løpet av de første 20 årene eller så 177 00:09:41,890 --> 00:09:43,390 var at det var lat. 178 00:09:43,390 --> 00:09:44,990 Så hva betyr dette? 179 00:09:44,990 --> 00:09:49,860 >> Vel, det betyr når vi har en slags uttrykk, må vi vurdere det. 180 00:09:49,860 --> 00:09:54,390 Og Haskell gjør dette i en samtale ved behov måte eller en ikke-streng måte. 181 00:09:54,390 --> 00:09:57,250 Det vil si, hvis vi har en haug med komponentene i vår uttrykk, 182 00:09:57,250 --> 00:10:00,660 vi prøver å utsette evalueringen av disse delkomponenter 183 00:10:00,660 --> 00:10:05,300 til absolutt siste minute-- som er før vi faktisk trenger dem. 184 00:10:05,300 --> 00:10:08,480 >> Så dette means-- som er kult, spesielt 185 00:10:08,480 --> 00:10:13,200 hvis vi tenker om abstraksjon av en musikalsk sequencer. 186 00:10:13,200 --> 00:10:16,740 Du slår den på, og du begynner kjører et skritt sequence-- 187 00:10:16,740 --> 00:10:20,010 hvis du noen gang jobbet med en trommel maskin-- og det bare går alltid. 188 00:10:20,010 --> 00:10:24,650 Så det ville være veldig fint om vi kunne etterligne det i Haskell. 189 00:10:24,650 --> 00:10:31,040 Og vi kan gjøre det med uendelig verdier, spesielt uendelig lister. 190 00:10:31,040 --> 00:10:35,860 Det er veldig enkelt å skrive en uendelig liste i Haskell. 191 00:10:35,860 --> 00:10:39,230 Du kan bare bruke syntaksen ned her, der du ser en gjennom tre, 192 00:10:39,230 --> 00:10:42,440 fjerne tre en prikk prikk, og som er en uendelig liste 193 00:10:42,440 --> 00:10:46,960 av alle naturlige tall som strekker på så langt du kan forestille deg. 194 00:10:46,960 --> 00:10:49,925 >> Jeg ønsker å innføre en Konseptet med folder med en gang. 195 00:10:49,925 --> 00:10:51,800 Og igjen, hensikten med dette seminaret er ikke 196 00:10:51,800 --> 00:10:55,770 å lære om folder i Haskell eller høyere ordens funksjoner. 197 00:10:55,770 --> 00:10:59,640 Men jeg ønsker bare å introdusere det til gi en nøyaktig følelse av hvordan rare 198 00:10:59,640 --> 00:11:03,700 Haskell er og hvor kraftig den er. 199 00:11:03,700 --> 00:11:08,000 Og i særdeleshet, kommer vi til å be-- når vi gjør våre forskjellige tromme deler, 200 00:11:08,000 --> 00:11:12,790 vi kommer til å bli manipulere lister over tall, brette dem på hverandre. 201 00:11:12,790 --> 00:11:17,290 Og for å gjøre det, vil vi være å bruke kart og folder. 202 00:11:17,290 --> 00:11:21,770 >> Det er en riktig assosiativ fold, som er denne retten 203 00:11:21,770 --> 00:11:26,990 her-- en minus mengden, 2 minus den mengde, 3 minus 0. 204 00:11:26,990 --> 00:11:29,170 Og syntaksen for en fold, gi deg en fold 205 00:11:29,170 --> 00:11:34,680 en base verdi og deretter en operation-- i dette tilfellet, addisjon eller subtraksjon. 206 00:11:34,680 --> 00:11:36,280 Jeg har vist begge tilfeller. 207 00:11:36,280 --> 00:11:41,760 Og så er det en akkumulator som akkumuleres over hele listen, 208 00:11:41,760 --> 00:11:46,330 søknad som operatør pluss eller minus, og deretter akkumuleres det. 209 00:11:46,330 --> 00:11:52,680 Så dette vil være the-- hvis det ble kalt med fold r pluss fra 0, og starter med 0, 210 00:11:52,680 --> 00:11:54,720 vi vil da summere alle tallene i denne listen. 211 00:11:54,720 --> 00:11:57,134 Og det er en liste fra 1 til 3. 212 00:11:57,134 --> 00:12:00,050 CONNOR HARRIS: Så for å sette det på en annen måte, tar fold r tre argumenter. 213 00:12:00,050 --> 00:12:02,540 Det er en funksjon som selv tar to argumenter, 214 00:12:02,540 --> 00:12:05,400 så er det en startverdi, og det er en liste over verdier. 215 00:12:05,400 --> 00:12:08,570 Og hva du gjør er at du tar starter verdi, første verdien, 216 00:12:08,570 --> 00:12:09,850 sette dem inn i funksjonen. 217 00:12:09,850 --> 00:12:11,607 Hva får du ut, ta det, fôr som 218 00:12:11,607 --> 00:12:13,940 inn i funksjonen av andre verdi, hva du får ut, 219 00:12:13,940 --> 00:12:16,690 ta det, mate det inn i Funksjonen av den tredje verdien. 220 00:12:16,690 --> 00:12:18,740 Og så hvis du går ned hele denne listen på denne måten, 221 00:12:18,740 --> 00:12:22,970 du kommer til å få slutt noen entall verdi som er 222 00:12:22,970 --> 00:12:25,720 av samme type av hva man startet ut sammen med og av samme type 223 00:12:25,720 --> 00:12:29,147 som ting i listen, og deretter det er avkastningen resultat av fold R. 224 00:12:29,147 --> 00:12:31,980 STEPHEN KREWSON: Så spesielt, disse er høyere ordens funksjoner, 225 00:12:31,980 --> 00:12:34,460 fordi de tar en annen fungere som en av argumentene. 226 00:12:34,460 --> 00:12:34,770 >> CONNOR HARRIS: Yeah. 227 00:12:34,770 --> 00:12:37,820 Hvis du har brukt visse andre languages-- Jeg vet R, [uhørbart] 228 00:12:37,820 --> 00:12:41,510 språk har dette, kalt Reduce. 229 00:12:41,510 --> 00:12:45,460 Du har kanskje lignende funksjoner i andre språk, bare kalt 230 00:12:45,460 --> 00:12:48,160 forskjellige ting. 231 00:12:48,160 --> 00:12:50,680 >> STEPHEN KREWSON: And hva er fint om fold R 232 00:12:50,680 --> 00:12:53,880 i dette tilfellet er at fold R kan arbeide med uendelige lister. 233 00:12:53,880 --> 00:12:59,490 Så i denne bunnen, dette P5 genererer notater som 234 00:12:59,490 --> 00:13:03,120 er slått på i sequencer for noen trommeldelen, den femte trommeldelen, 235 00:13:03,120 --> 00:13:05,480 og kanskje det er en conga tromme eller noe. 236 00:13:05,480 --> 00:13:09,719 Og dette er en bevisst stumpe måte å skrive dette, 237 00:13:09,719 --> 00:13:11,510 men det er gøy, fordi det viser mye 238 00:13:11,510 --> 00:13:14,460 ting om Haskell og Euterpea. 239 00:13:14,460 --> 00:13:20,650 >> Så kaste R av dette colon-- kolon er bare en operatør som skyver ting 240 00:13:20,650 --> 00:13:25,700 sammen på en list-- heter på tom Listen, som er like de tomme parentes. 241 00:13:25,700 --> 00:13:28,250 Og jeg ringer som på denne uendelig liste. 242 00:13:28,250 --> 00:13:31,570 Dette er faktisk to lister lagt sammen her nede. 243 00:13:31,570 --> 00:13:37,150 Listen en komma seks dot dot er 1, 6, 11, 16. 244 00:13:37,150 --> 00:13:39,750 Så Haskell-- i bare noen få tegn, du 245 00:13:39,750 --> 00:13:42,420 kan generere hele tallsekvens 246 00:13:42,420 --> 00:13:46,240 som er fem tall fra hverandre strekker seg videre inn i uendeligheten. 247 00:13:46,240 --> 00:13:49,860 Og jeg foran til at dette kortere lille list-- 248 00:13:49,860 --> 00:13:54,370 3, 8, 21-- bare for å vise deg hvordan du kan sette sammen lister. 249 00:13:54,370 --> 00:13:55,790 >> Og så har jeg kastet på seg selv. 250 00:13:55,790 --> 00:14:01,510 Og dette ender opp med bare å være en slags identitet operasjon, men det er uendelig. 251 00:14:01,510 --> 00:14:06,070 Og brett R kan gjøre det, fordi det dovent evaluerer, som i det ovenfor. 252 00:14:06,070 --> 00:14:10,582 Hvis vi har en 1 og 2 og 3, kan vi bare braketten av hele resten av den. 253 00:14:10,582 --> 00:14:12,290 Det vil ikke fungere for minus eller pluss, men det 254 00:14:12,290 --> 00:14:17,760 vil arbeide for tykktarms identitet operasjon på listen. 255 00:14:17,760 --> 00:14:24,620 >> Så hvordan skal vi praktisk talt bruke det hvis vi har en uendelig lang liste over ting? 256 00:14:24,620 --> 00:14:26,500 Vel, gir Haskell en masse functions-- 257 00:14:26,500 --> 00:14:29,450 og ser mer inn disse i din egen tid-- eksempel ta 258 00:14:29,450 --> 00:14:32,200 som sier, OK, vi er genererer dette uendelig liste, 259 00:14:32,200 --> 00:14:35,950 men vi er bare nødt til å ta noen rekke av det Og i dette case-- 260 00:14:35,950 --> 00:14:38,410 vi vil se dette senere i vår trommemaskin code-- 261 00:14:38,410 --> 00:14:43,740 GM er bare en slags global variabel for antall skritt 262 00:14:43,740 --> 00:14:44,610 i sequencer. 263 00:14:44,610 --> 00:14:47,630 På roll-in maskinene jeg viste deg, det er vanligvis 16, 264 00:14:47,630 --> 00:14:51,475 men jeg har implementert det med 32. 265 00:14:51,475 --> 00:14:54,470 Det spiller egentlig ingen rolle. 266 00:14:54,470 --> 00:15:00,230 >> Haskell er også ren, så det har sterk statisk typing at Connor antydet. 267 00:15:00,230 --> 00:15:03,220 Så funksjoner er matematisk i sense-- 268 00:15:03,220 --> 00:15:06,600 de er mer matematisk at de er garantert 269 00:15:06,600 --> 00:15:11,530 å ikke få tilgang til eller endre noen form for variabel eller utføre inngang eller utgang. 270 00:15:11,530 --> 00:15:14,420 Så hvis du har en funksjon, det er deterministisk. 271 00:15:14,420 --> 00:15:17,400 Det vil alltid returnere samme verdi i delstaten programmet 272 00:15:17,400 --> 00:15:19,310 eller forbli den samme. 273 00:15:19,310 --> 00:15:22,940 Det er, selvfølgelig, monadiske unntak til dette, men det er utenfor vår omfang. 274 00:15:22,940 --> 00:15:23,900 >> CONNOR HARRIS: Yeah. 275 00:15:23,900 --> 00:15:26,946 Hva dette betyr, skjønt, er det er noen viktig [uhørbart] 276 00:15:26,946 --> 00:15:27,820 Konsekvensene av dette. 277 00:15:27,820 --> 00:15:30,940 Det ene er at det er veldig lett å parallelize Haskell programmer. 278 00:15:30,940 --> 00:15:32,773 Fordi hvis du har, si, en funksjon av at 279 00:15:32,773 --> 00:15:36,064 må operere på en million verdier, hvis du vet at funksjonen vil alltid 280 00:15:36,064 --> 00:15:39,280 gi ut den samme verdi hvis du mate på et visst value-- 281 00:15:39,280 --> 00:15:43,055 hvis du er [uhørbart] f 1, f av 2, da f av tre eller av en f whatnot-- 282 00:15:43,055 --> 00:15:45,180 er ikke til å skrive ut til en fil eller gjøre noe 283 00:15:45,180 --> 00:15:46,850 som vil endre verdien av f2. 284 00:15:46,850 --> 00:15:50,220 Du kan bare dele opp denne funksjonen til en million forskjellige maskiner eller en million 285 00:15:50,220 --> 00:15:54,720 forskjellige tråder eller hva, få alle svar tilbake, 286 00:15:54,720 --> 00:15:56,900 få alle returverdier tilbake, og da det er det. 287 00:15:56,900 --> 00:15:59,780 Så veldig lett å parallelize ting. 288 00:15:59,780 --> 00:16:03,140 >> Ulempen er at inngangs og utgang spesielt 289 00:16:03,140 --> 00:16:05,720 passe inn i type system i svært kompliserte måter. 290 00:16:05,720 --> 00:16:09,010 Vi vil ikke gå inn på det akkurat nå, men jeg oppfordrer deg til å se på noen ressurser 291 00:16:09,010 --> 00:16:11,175 online hvis du ønsker å lære om det. 292 00:16:11,175 --> 00:16:13,960 293 00:16:13,960 --> 00:16:16,550 >> STEPHEN KREWSON: So skriver classes-- og dette 294 00:16:16,550 --> 00:16:21,610 var-- klasser av typer ble oppfunnet for å løse 295 00:16:21,610 --> 00:16:24,160 et problem for operatøren overbelastning. 296 00:16:24,160 --> 00:16:27,590 Så vi ønsket å ha likestilling mellom forskjellige typer ting. 297 00:16:27,590 --> 00:16:31,040 Selvfølgelig kunne vi tenke of-- likestilling mellom talltyper 298 00:16:31,040 --> 00:16:34,720 er veldig lett å tenke på, men hva om likestilling mellom lister? 299 00:16:34,720 --> 00:16:37,610 Hva om likestilling mellom tre ben datastrukturer? 300 00:16:37,610 --> 00:16:43,130 Og dette er alt mulig i Haskell grunn av type klasser. 301 00:16:43,130 --> 00:16:48,000 >> Så hvis du definerer en viss data type-- og her, disse er musikalske plasser. 302 00:16:48,000 --> 00:16:50,960 Vi endelig får til noen datamaskin musikk. 303 00:16:50,960 --> 00:16:57,420 Så vi har C, C skarp, og så videre og så videre. 304 00:16:57,420 --> 00:17:01,080 De tilhører en gjeng med forskjellige type klasser. 305 00:17:01,080 --> 00:17:03,510 EQ-- de tilhører den EQ typen klasse. 306 00:17:03,510 --> 00:17:06,780 Det betyr at de støtter likestilling operasjoner. 307 00:17:06,780 --> 00:17:12,650 Så du kan vurdere om man sekvens av musikalske primitiver 308 00:17:12,650 --> 00:17:15,400 er det samme som en annen. 309 00:17:15,400 --> 00:17:17,280 >> De tilhører den klassen ordinal. 310 00:17:17,280 --> 00:17:19,479 Det betyr at det er en bestilling til disse. 311 00:17:19,479 --> 00:17:27,670 D kommer etter C. ciss kommer etter C i tillegg. 312 00:17:27,670 --> 00:17:29,840 De tilhører klassen viser, noe som betyr at de kan 313 00:17:29,840 --> 00:17:33,000 skrives til en konsoll eller terminal. 314 00:17:33,000 --> 00:17:36,090 De tilhører klasse nummerert, som 315 00:17:36,090 --> 00:17:39,770 betyr at selv om disse er tegn, 316 00:17:39,770 --> 00:17:45,340 de har en underliggende numerisk representasjon starter på 0 317 00:17:45,340 --> 00:17:48,960 og går ut gjennom imidlertid mange ting er her, 20 eller så, 318 00:17:48,960 --> 00:17:51,770 eller 30 eller 40, kanskje. 319 00:17:51,770 --> 00:17:54,259 >> CONNOR HARRIS: Og når vi har en datatype 320 00:17:54,259 --> 00:17:57,050 at derives-- med dette søkeordet "deriving--" en viss type klasse, 321 00:17:57,050 --> 00:18:01,160 det betyr at kompilatoren vil prøve å konstruere noe automatisk. 322 00:18:01,160 --> 00:18:05,120 Så kanskje du vil definere en kvalitet annerledes. 323 00:18:05,120 --> 00:18:09,450 Det er lurt å definere ciss lik D flat, f.eks. 324 00:18:09,450 --> 00:18:11,560 Med denne konstruksjonen her, tror jeg ikke ciss 325 00:18:11,560 --> 00:18:14,940 og D flat vil være lik, fordi kompilatoren vil automatisk 326 00:18:14,940 --> 00:18:19,670 si hver annen mulig verdi er forskjellig fra alle andre. 327 00:18:19,670 --> 00:18:22,930 >> Så det er mulig å overstyre standard implementeringer 328 00:18:22,930 --> 00:18:25,730 av slike klasser. 329 00:18:25,730 --> 00:18:28,640 Igjen, se på referanse hvis Ønsker du å lære om det. 330 00:18:28,640 --> 00:18:31,767 331 00:18:31,767 --> 00:18:33,600 STEPHEN KREWSON: And her, faktisk, vil dette 332 00:18:33,600 --> 00:18:36,930 være nyttig for når vi kode senere. 333 00:18:36,930 --> 00:18:42,150 Vi ser noen av de Infix operatører for sekvensiell sammensetning, 334 00:18:42,150 --> 00:18:46,570 parallelt sammensetning, og så videre, disse positive og likhetstegn 335 00:18:46,570 --> 00:18:48,620 omgitt av kolon. 336 00:18:48,620 --> 00:18:53,330 Det betyr at vi kan spille disse forskjellige musikalske primitiver ene etter den andre. 337 00:18:53,330 --> 00:18:54,590 Det er sekvensiell komposisjon. 338 00:18:54,590 --> 00:18:57,170 >> Eller vi kan spille dem i parallelt samtidig. 339 00:18:57,170 --> 00:19:05,100 Så jeg kan ha en musikalsk verdi, og så dette er lik og kolon, 340 00:19:05,100 --> 00:19:09,669 Infix parallelt sammensetning operatør, og spille dem som en slags akkord. 341 00:19:09,669 --> 00:19:11,460 Og vi kommer til å bruke dette når vi kombinerer 342 00:19:11,460 --> 00:19:15,080 vår trommel del med vår Litt Frere Jacques sang 343 00:19:15,080 --> 00:19:19,460 å spille disse to sekvenser av musikalske verdier på samme tid. 344 00:19:19,460 --> 00:19:24,520 345 00:19:24,520 --> 00:19:29,250 >> Currying er-- Curry ble sist nevne for Haskell Curry, som 346 00:19:29,250 --> 00:19:31,850 Haskell bildet er oppkalt etter. 347 00:19:31,850 --> 00:19:34,330 Og dette gir oss en hyggelig eleganse når vi er 348 00:19:34,330 --> 00:19:36,880 skrive alle disse forskjellige funksjoner eller filtre som vi er 349 00:19:36,880 --> 00:19:39,330 kommer til å være kartlegging over våre lister. 350 00:19:39,330 --> 00:19:42,810 En funksjon av to arguments-- f av x og Y- 351 00:19:42,810 --> 00:19:46,630 kan representeres som f av x påført y. 352 00:19:46,630 --> 00:19:49,800 Så det er en funksjon av ett argument som returnerer 353 00:19:49,800 --> 00:19:51,240 en annen funksjon av en argument. 354 00:19:51,240 --> 00:19:56,962 Så dette betyr at vi kan kartlegge en funksjon f av x løpet liste over y-tallet. 355 00:19:56,962 --> 00:19:58,920 CONNOR HARRIS: Vil du gi et eksempel på dette? 356 00:19:58,920 --> 00:19:59,836 STEPHEN KREWSON: Yeah. 357 00:19:59,836 --> 00:20:05,390 Jeg har et eksempel her fra noen av de tingene vi skal skrive. 358 00:20:05,390 --> 00:20:10,500 Så gjenskape 2-- godt, replikere vil ta 359 00:20:10,500 --> 00:20:13,040 én verdi, som er hvor mange ganger for å gjenskape noe, 360 00:20:13,040 --> 00:20:16,690 og da vil det ta en value-- vanligvis en liste eller noe. 361 00:20:16,690 --> 00:20:23,450 Så her er vi kartlegging replikere to over en annen liste. 362 00:20:23,450 --> 00:20:27,440 >> Så hvis vi kartlegge replikere to, hvis vi gjenskape 2 gjelder 363 00:20:27,440 --> 00:20:31,890 til det første element i denne og list-- disse er lister over musikalsk phrases-- 364 00:20:31,890 --> 00:20:37,650 vil produsere to av "du sleeping--" så sover du, du sover. 365 00:20:37,650 --> 00:20:40,040 Så nå har vi to. 366 00:20:40,040 --> 00:20:42,570 Men replikere tar to argumenter, men fordi vi er 367 00:20:42,570 --> 00:20:47,100 currying og deretter kartlegging, vi kan representere replikere 2 368 00:20:47,100 --> 00:20:52,310 som har blitt returnert som en funksjon av én argument-- bare replikere to ganger. 369 00:20:52,310 --> 00:20:57,010 Og så skal vi anvende det til hver element i denne listen over setninger. 370 00:20:57,010 --> 00:21:01,900 >> Og concat er en Haskell operasjon for flatere en liste. 371 00:21:01,900 --> 00:21:04,400 Fordi replikere to vilje produsere en liste av lister. 372 00:21:04,400 --> 00:21:06,660 Og dette er denne mellomform her. 373 00:21:06,660 --> 00:21:10,365 Og så da kan vi concat eller flate det ut to ganger. 374 00:21:10,365 --> 00:21:12,240 CONNOR HARRIS: En enklere eksempel på currying, 375 00:21:12,240 --> 00:21:15,323 hvis du vil like-- tenke f er bare en multiplikasjon funksjon som tar to 376 00:21:15,323 --> 00:21:16,840 argumenter og returnerer deres produkt. 377 00:21:16,840 --> 00:21:19,320 Så hvis du har en f 4 5, er det 20. 378 00:21:19,320 --> 00:21:22,670 Men du kan tenke på dette som also-- du har en funksjon f 4 379 00:21:22,670 --> 00:21:25,560 som tar et argument og returnerer fire ganger denne argument-- bare 380 00:21:25,560 --> 00:21:27,870 delvis applikasjon som bare ett argument fire. 381 00:21:27,870 --> 00:21:31,182 Og hvis du mate f av 4 5, som vil gi deg 20. 382 00:21:31,182 --> 00:21:32,890 Og det er en enklere eksempel på currying. 383 00:21:32,890 --> 00:21:34,473 Det er vanligvis en av de lærebok seg. 384 00:21:34,473 --> 00:21:38,860 385 00:21:38,860 --> 00:21:42,110 >> STEPHEN KREWSON: Lambda uttrykk eller anonyme funksjoner 386 00:21:42,110 --> 00:21:47,330 er en annen Haskell kjennetegn. 387 00:21:47,330 --> 00:21:51,242 Så hvis vi trenger å piske opp en liten funksjon livet replikere, 388 00:21:51,242 --> 00:21:52,950 men sier det ikke er i standard bibliotek, 389 00:21:52,950 --> 00:21:56,150 vi kan bruke en syntaks lik det følgende. 390 00:21:56,150 --> 00:21:58,730 Og vi vil bris over denne. 391 00:21:58,730 --> 00:22:02,160 En ting du vil se mye av i trommemaskin er vi å ringe 392 00:22:02,160 --> 00:22:05,790 til noe som kalles filter, som i likhet med tidligere, 393 00:22:05,790 --> 00:22:08,185 er en kartlegging av en funksjon over en liste, er men det 394 00:22:08,185 --> 00:22:10,260 en kartlegging av en boolsk funksjon. 395 00:22:10,260 --> 00:22:13,390 >> Så vi har her et eksempel av et anonymt 396 00:22:13,390 --> 00:22:19,150 definert boolsk funksjon som bare tar et par verdier. 397 00:22:19,150 --> 00:22:22,990 Dette er ikke strengt tatt en anonym funksjon. 398 00:22:22,990 --> 00:22:25,850 Men det er definere med som syntaks for korthets skyld 399 00:22:25,850 --> 00:22:28,007 og dette tar bare x modul N- 400 00:22:28,007 --> 00:22:28,840 CONNOR HARRIS: Yeah. 401 00:22:28,840 --> 00:22:31,330 Slik at f er en funksjon av to argumenter n og p 402 00:22:31,330 --> 00:22:35,440 som returnerer en funksjon som er i seg selv en funksjon av ett argument, nemlig x. 403 00:22:35,440 --> 00:22:38,815 404 00:22:38,815 --> 00:22:40,690 STEPHEN KREWSON: Jeg nevnte Infix operatører. 405 00:22:40,690 --> 00:22:42,642 Hva er Infix operatørene? 406 00:22:42,642 --> 00:22:45,710 Vel, Infix operatører er det normal måte vi representerer operasjoner, 407 00:22:45,710 --> 00:22:49,910 si, i mathematics-- 2 pluss 2 i stedet for operatøren pluss 408 00:22:49,910 --> 00:22:51,202 og deretter to argumentene 2 og 2. 409 00:22:51,202 --> 00:22:53,701 CONNOR HARRIS: Det kalles omvendt polsk notasjon, som er 410 00:22:53,701 --> 00:22:55,330 et begrep jeg tviler på noen av dere ville vite. 411 00:22:55,330 --> 00:22:56,288 >> STEPHEN KREWSON: Høyre. 412 00:22:56,288 --> 00:22:58,290 Omvendt polish eller prefiks notasjon. 413 00:22:58,290 --> 00:23:01,412 Men Haskell besluttet å bruke Infix operatører. 414 00:23:01,412 --> 00:23:03,120 Så dette er noen av de egendefinerte de som 415 00:23:03,120 --> 00:23:07,770 er definert for Euterpea dscl i Haskell. 416 00:23:07,770 --> 00:23:10,730 Så dette var sekvensiell komposisjon. 417 00:23:10,730 --> 00:23:16,340 Dette var parallelle sammensetning, og denne ble avkorting parallelt sammensetning. 418 00:23:16,340 --> 00:23:18,710 Og vi trenger at med vår trommemaskin, 419 00:23:18,710 --> 00:23:22,640 fordi vi vil bruke den siste operatør i det lille tuppel det 420 00:23:22,640 --> 00:23:26,330 å spille trommemaskin sammen med vår Frere Jacques sang. 421 00:23:26,330 --> 00:23:28,650 Og vår trommemaskin er kommer til å være uendelig. 422 00:23:28,650 --> 00:23:30,920 Den spiller bare for alltid. 423 00:23:30,920 --> 00:23:32,692 Men Frere Jacques sangen er det ikke. 424 00:23:32,692 --> 00:23:33,510 Det er ikke så lenge. 425 00:23:33,510 --> 00:23:36,610 Det er bare noen få barer. 426 00:23:36,610 --> 00:23:43,030 Så vi trenger å stoppe trommemaskin som Når den kortere musikalsk verdien kommer 427 00:23:43,030 --> 00:23:43,700 til en slutt. 428 00:23:43,700 --> 00:23:46,980 Og at infiksert operatør er super nyttig med det. 429 00:23:46,980 --> 00:23:50,090 >> Og infiks notasjon som dette er slags hyggelig, 430 00:23:50,090 --> 00:23:57,095 fordi si du har en funksjon som sitat, som gir heltallsdivisjon 431 00:23:57,095 --> 00:24:01,010 av x ved noe else-- Beklager, det bør være a og b. 432 00:24:01,010 --> 00:24:04,740 Du kan skrive det som et sitat av b. 433 00:24:04,740 --> 00:24:09,670 Så hvis du put-- element er et annet eksempel på dette. 434 00:24:09,670 --> 00:24:14,730 x element i noen liste, hvis du setter det i Backticks, kan du bruke den. 435 00:24:14,730 --> 00:24:20,400 Selv om det ikke er et symbol som pluss eller minus eller tider, 436 00:24:20,400 --> 00:24:24,630 du kan bruke navnet på en funksjon sånn i Backticks 437 00:24:24,630 --> 00:24:27,045 som infiks operatør, noe som er ganske kult. 438 00:24:27,045 --> 00:24:29,670 CONNOR HARRIS: Igjen, dette er alle bare syntaktisk sukker, egentlig. 439 00:24:29,670 --> 00:24:32,310 Det påvirker ikke kjernen av språket. 440 00:24:32,310 --> 00:24:37,440 >> STEPHEN KREWSON: Så ser vi her for siste setning av vår Frere Jacques sang, 441 00:24:37,440 --> 00:24:45,740 Jeg spilte noen små akkorder eller tredeler bruker parallelt sammensetning 442 00:24:45,740 --> 00:24:46,240 operatør. 443 00:24:46,240 --> 00:24:50,680 444 00:24:50,680 --> 00:24:54,950 Dette er en annen måte å si noe av det vi har nettopp vært å si. 445 00:24:54,950 --> 00:24:59,986 Så du kan kartlegge funksjoner av ett argument over lister. 446 00:24:59,986 --> 00:25:02,860 CONNOR HARRIS: Igjen, referanser for Haskell-- innledende lærebøker 447 00:25:02,860 --> 00:25:04,680 vil ha alt dette i det. 448 00:25:04,680 --> 00:25:07,790 >> STEPHEN KREWSON: Så her er en ganske nøkkel linjen i sequencer 449 00:25:07,790 --> 00:25:12,820 vi tar en titt på hjelp en liste forståelse. 450 00:25:12,820 --> 00:25:17,810 Og vi ser her er det elementet i fast operatør i rygg anførselstegn. 451 00:25:17,810 --> 00:25:23,030 Så hvis x er et element i en liste over x-er, så får vi ringe opp PERC funksjoner. 452 00:25:23,030 --> 00:25:25,100 Så perc er bare en slagfunksjon. 453 00:25:25,100 --> 00:25:30,200 Det tar noen verdi p det er en del av den avgrensede sett all 454 00:25:30,200 --> 00:25:35,310 de ulike perkusjonslyder som vi så i forrige slide, 455 00:25:35,310 --> 00:25:38,840 og da det gir som Varigheten av en fjerdedel notat. 456 00:25:38,840 --> 00:25:43,190 Else det gir det en QNR, og QNR er bare en fjerdedel notat resten. 457 00:25:43,190 --> 00:25:44,970 >> Så dette er å bygge opp noe fint. 458 00:25:44,970 --> 00:25:52,110 Vi har en liste over elementer, og vi vil sløyfe over noen liste fra ett 459 00:25:52,110 --> 00:25:54,540 til maks verdien av vår sequencer. 460 00:25:54,540 --> 00:25:58,290 Og når vi er på et bestemt jeg i at listen over én til max verdi, 461 00:25:58,290 --> 00:26:02,970 hvis at jeg er medlem av denne sett laget i denne funksjonen, 462 00:26:02,970 --> 00:26:06,040 vel, så vi slår det inn i en perkusjon notat. 463 00:26:06,040 --> 00:26:10,960 Ellers, vi bare spille en pause, som Det vil si, vi bare forbli taus. 464 00:26:10,960 --> 00:26:16,050 Og vi kan se her at i denne listen forståelse syntaks, 465 00:26:16,050 --> 00:26:20,030 x er befolket av dette liste konstruert én 466 00:26:20,030 --> 00:26:22,462 til den globale størrelsen av sequencer. 467 00:26:22,462 --> 00:26:23,295 CONNOR HARRIS: Yeah. 468 00:26:23,295 --> 00:26:26,340 Den grunnleggende syntaks for liste oppfattelser er 469 00:26:26,340 --> 00:26:30,810 brakett, verdi involverer noen variabler, bar, 470 00:26:30,810 --> 00:26:34,260 mulige verdier av de variable seg, lukket brakett. 471 00:26:34,260 --> 00:26:38,545 Og hvis du har gjort satt byggmester notasjon i noen form for matematikk klasse, 472 00:26:38,545 --> 00:26:45,999 du kanskje har satt 2n slik at n er i eller n er i z. 473 00:26:45,999 --> 00:26:48,290 Lignende thing-- denne notasjonen er ment å være tankevekkende 474 00:26:48,290 --> 00:26:49,630 av det matematisk notasjon. 475 00:26:49,630 --> 00:26:51,880 STEPHEN KREWSON: Og du kan bruke flere predikater 476 00:26:51,880 --> 00:26:56,250 og flere filtre i en liste forståelse, som er ganske fin. 477 00:26:56,250 --> 00:27:01,800 Algebraisk types-- vi vil ikke nøle lenge her. 478 00:27:01,800 --> 00:27:04,840 Det er ikke en god forestilling i Haskell eller en god, tydelig forestilling 479 00:27:04,840 --> 00:27:10,720 om hvordan man skal ta, sier en standard parameter til en funksjon eller noe. 480 00:27:10,720 --> 00:27:13,370 I Python, dette er ganske enkel. 481 00:27:13,370 --> 00:27:18,460 Du kan bare si med lik på erklæringen av funksjon, 482 00:27:18,460 --> 00:27:21,420 en standardverdi i Hvis ingen er levert. 483 00:27:21,420 --> 00:27:27,010 >> I Haskell, kunne du kanskje bruker kanskje kanskje skriver, 484 00:27:27,010 --> 00:27:32,190 som tar enten ingenting eller en verdi av typen bare en. 485 00:27:32,190 --> 00:27:38,630 Så vi utnytte dette i trommemaskin å tillate oss å gi ekstra volum 486 00:27:38,630 --> 00:27:40,730 parametere til hver av trommeldeler. 487 00:27:40,730 --> 00:27:46,160 488 00:27:46,160 --> 00:27:54,680 Så det gir oss en måte å ha EQ eller et volum på en bestemt kanal. 489 00:27:54,680 --> 00:27:56,440 >> CONNOR HARRIS: I andre Haskell eksempler, 490 00:27:56,440 --> 00:28:00,450 du kan se kanskje brukt for funksjoner som kan mislykkes. 491 00:28:00,450 --> 00:28:03,470 Dette er en vanlig en. 492 00:28:03,470 --> 00:28:07,010 >> STEPHEN KREWSON: Og du kan levere en slags feilmelding som standard. 493 00:28:07,010 --> 00:28:11,020 Og det er spesielt nyttig når du gjør I / O i Haskell. 494 00:28:11,020 --> 00:28:12,044 Det kan være triks. 495 00:28:12,044 --> 00:28:13,960 CONNOR HARRIS: Eller for en lignende eksempel, tror 496 00:28:13,960 --> 00:28:17,460 av en funksjon som innebærer deling av en parameter som kan være 0. 497 00:28:17,460 --> 00:28:20,020 Og at funksjonen kunne returnere kanskje uansett. 498 00:28:20,020 --> 00:28:22,802 Så hvis det er ingen divisjon med 0, det vil returnere bare hva. 499 00:28:22,802 --> 00:28:25,010 Og hvis det er delingen av 0, vil den returnere ingenting 500 00:28:25,010 --> 00:28:26,910 som en måte å signalisere feilen. 501 00:28:26,910 --> 00:28:30,330 Fordi en konsekvens av Haskell er svært strenge typing 502 00:28:30,330 --> 00:28:34,100 er at det er ingen real-- Unntakene er vanskelig, i utgangspunktet, 503 00:28:34,100 --> 00:28:36,160 feilhåndtering er vanskelig. 504 00:28:36,160 --> 00:28:39,440 Og dette er en veldig vanlig måte å gjøre det. 505 00:28:39,440 --> 00:28:42,990 >> STEPHEN KREWSON: Så nå får vi til en annen psykologisk ting 506 00:28:42,990 --> 00:28:49,160 om Haskell, som er mønster matching og funksjonsdefinisjoner. 507 00:28:49,160 --> 00:28:53,390 Jeg viste deg i siste lysbildet erklæringen av trinn sekvens 508 00:28:53,390 --> 00:28:58,170 funksjon, som tok en kanskje verdi, da en int, deretter en liste over ints, 509 00:28:58,170 --> 00:29:03,850 deretter returnerer en sekvens av musikk verdier det kommentert 510 00:29:03,850 --> 00:29:05,375 med både stemme og volum. 511 00:29:05,375 --> 00:29:08,030 512 00:29:08,030 --> 00:29:11,820 >> Så disse tre argumentene kan være mønster avstemt på følgende måte. 513 00:29:11,820 --> 00:29:16,660 Og vi alltid ønsker å være sikker på å gjøre en base case eller avslutte saken først. 514 00:29:16,660 --> 00:29:19,690 Og disse understrek kan bare tolkes 515 00:29:19,690 --> 00:29:22,340 å bety noen verdi som er der. 516 00:29:22,340 --> 00:29:26,580 Så hvis vi får en samtale til trinn sekvens med en viss verdi, en annen verdi, 517 00:29:26,580 --> 00:29:32,210 og deretter tom liste, hva vi ønsker for å gå tilbake er bare stillhet, en ro 0. 518 00:29:32,210 --> 00:29:35,110 >> Og i stedet for at å være en tom liste eller 0, 519 00:29:35,110 --> 00:29:38,150 det er en pause 0, fordi vi er håndteringen av type musikk, 520 00:29:38,150 --> 00:29:43,230 og den tomme listen over musikken typen er bare en resten av ingen varighet. 521 00:29:43,230 --> 00:29:45,680 Det er ingen musikk. 522 00:29:45,680 --> 00:29:51,460 Og så ser vi om vi får et skritt sekvens med en v for volum argument, 523 00:29:51,460 --> 00:29:57,290 p for forholdsregel instrument argument, og deretter en liste over x-tallet. 524 00:29:57,290 --> 00:29:58,360 >> Så vi gjør noen ting. 525 00:29:58,360 --> 00:30:01,290 Spesielt gjelder vi denne listen forståelse, 526 00:30:01,290 --> 00:30:05,700 og vi utfører noen operasjoner på kanskje verdien 527 00:30:05,700 --> 00:30:10,050 å gjøre det til en numerisk verdi, slik at det kan da nummerert og brukt 528 00:30:10,050 --> 00:30:12,300 å velge instrumentet. 529 00:30:12,300 --> 00:30:16,730 Igjen er dette en lite litt bevisst inconcise 530 00:30:16,730 --> 00:30:20,580 bare for å vise alle de rare tingene du kan gjøre i Haskell som du 531 00:30:20,580 --> 00:30:23,170 ta en titt på det på din egen tid. 532 00:30:23,170 --> 00:30:23,802 >> Greit. 533 00:30:23,802 --> 00:30:26,010 Så vi endelig får til gjøre hva vi ønsket å gjøre, 534 00:30:26,010 --> 00:30:28,820 som er å gjøre noen datamaskin musikk. 535 00:30:28,820 --> 00:30:32,250 Så vi kommer til å prøve å gjøre Frere Jacques sangen. 536 00:30:32,250 --> 00:30:35,220 Så det er hvor mange setninger i Frere Jacques? 537 00:30:35,220 --> 00:30:38,790 538 00:30:38,790 --> 00:30:39,680 Fire. 539 00:30:39,680 --> 00:30:40,460 Flott. 540 00:30:40,460 --> 00:30:42,490 Og hva er hyggelig er at de er alle gjentatt 541 00:30:42,490 --> 00:30:46,990 det samme antall ganger, noe som er to. 542 00:30:46,990 --> 00:30:50,730 >> Så vi har fire setninger hver gjentatt to ganger. 543 00:30:50,730 --> 00:30:53,590 Og spesielt, er de i en runde. 544 00:30:53,590 --> 00:30:55,340 Og det er mange, mange måter å implementere 545 00:30:55,340 --> 00:30:57,520 en runde som kunne være morsomt å gjøre. 546 00:30:57,520 --> 00:31:00,260 Jeg har gjort det i et ganske enkel måte her, 547 00:31:00,260 --> 00:31:05,760 som er bare for å construct-- linjen funksjonen tar en liste over musikk verdier 548 00:31:05,760 --> 00:31:10,390 og gjør den til sekvensiell sammensetning ved å påføre som sekvensiell sammensetning 549 00:31:10,390 --> 00:31:13,000 operatør. 550 00:31:13,000 --> 00:31:19,540 >> Og da jeg utsette de ulike delene ved å gjøre begynne dem med en pause. 551 00:31:19,540 --> 00:31:22,770 Så jeg starter med en pause på to tiltak, og deretter en pause på fire tiltak 552 00:31:22,770 --> 00:31:26,160 og deretter en pause på seks tiltak, og deretter runde 553 00:31:26,160 --> 00:31:32,290 fungerer, som vi alle vet denne sangen. 554 00:31:32,290 --> 00:31:37,180 Vi ser to merknader eller modifikasjoner av musikk verdiene 555 00:31:37,180 --> 00:31:43,150 som er inneholdt i denne sekvensielle arrangement av musikkelementer. 556 00:31:43,150 --> 00:31:44,810 Vi har et tilleggsvolum. 557 00:31:44,810 --> 00:31:48,960 Dette er en funksjon for å kommentere musikk med et bestemt volum. 558 00:31:48,960 --> 00:31:51,320 Dette er et godt eksempel av en MIDI signal løping 559 00:31:51,320 --> 00:31:57,510 fra 0 til 127, de syv bitene i informasjon som kan gjennomføres. 560 00:31:57,510 --> 00:32:00,650 >> Og then-- vi så det veldig kort, men den generelle MIDI 561 00:32:00,650 --> 00:32:02,310 liste over alle de forskjellige instrumentene. 562 00:32:02,310 --> 00:32:04,450 Og det er ikke en hel masse av dem. 563 00:32:04,450 --> 00:32:11,230 Hvis du bruker en digital audio arbeidsstasjon, som Ableton Live eller Pro Tools, 564 00:32:11,230 --> 00:32:17,560 det er en utrolig bredere spekter av synthesizere og VST instrumenter. 565 00:32:17,560 --> 00:32:21,510 Men MIDI standard bare har noen, eller flere dusin. 566 00:32:21,510 --> 00:32:22,799 Og noen av dem er morsomme. 567 00:32:22,799 --> 00:32:25,840 Jeg trodde det ville være morsomt hvis vi spilte instrumentet MIDI instrument 568 00:32:25,840 --> 00:32:30,550 helikopter, og deretter neste vei gjennom runden, 569 00:32:30,550 --> 00:32:37,980 vi gjorde en pad synth, og deretter av dette banal bly firkantbølge synth, 570 00:32:37,980 --> 00:32:44,240 og deretter stemme slam, som er en litt utydelig på min dårlige MIDI 571 00:32:44,240 --> 00:32:46,410 synthesizer, men de OK. 572 00:32:46,410 --> 00:32:50,030 >> Og så ser vi dette la og i syntaks fra Haskell, 573 00:32:50,030 --> 00:32:54,030 og så spiller vi alle disse deler sammen 574 00:32:54,030 --> 00:32:56,265 med parallell sammensetning operatør. 575 00:32:56,265 --> 00:33:00,260 576 00:33:00,260 --> 00:33:02,296 Og vi kunne sannsynligvis vise noe av dette. 577 00:33:02,296 --> 00:33:07,674 578 00:33:07,674 --> 00:33:08,340 Her er koden. 579 00:33:08,340 --> 00:33:14,960 Og du kan se i C, vil det være en Mange hals clearing og innstilling 580 00:33:14,960 --> 00:33:19,760 bordet koden før du kunne lage musikk som dette. 581 00:33:19,760 --> 00:33:22,080 Eller andre programmerings språk, vil du sannsynligvis 582 00:33:22,080 --> 00:33:27,210 nødt til å interagere med en slags bibliotek eller API og sette alt opp, 583 00:33:27,210 --> 00:33:28,725 og da vil du være nødt til å rydde opp. 584 00:33:28,725 --> 00:33:33,810 Men her i Haskell er, tror jeg, en gang du får taket på det, utrolig 585 00:33:33,810 --> 00:33:35,770 lesbar og svært uttrykksfull. 586 00:33:35,770 --> 00:33:38,930 587 00:33:38,930 --> 00:33:43,240 Så det er gjennomføringen av Frere Jacques. 588 00:33:43,240 --> 00:33:43,740 Greit. 589 00:33:43,740 --> 00:33:47,557 Nå ønsker vi å legge til perkusjon, og dette er litt Messier. 590 00:33:47,557 --> 00:33:49,015 Så la oss ta en titt på lysbildene. 591 00:33:49,015 --> 00:33:56,880 592 00:33:56,880 --> 00:34:00,540 Så den store ideen er å gjøre en haug med lister eller deler. 593 00:34:00,540 --> 00:34:04,140 På de roll-in maskiner, er det var typisk om kanskje åtte 594 00:34:04,140 --> 00:34:08,670 til 10 rytme eller perkusjon deler. 595 00:34:08,670 --> 00:34:10,159 Og deretter bruke en haug med teknikker. 596 00:34:10,159 --> 00:34:14,889 Og vi har snakket om these-- hjelp folder, filtre, lambda funksjoner, 597 00:34:14,889 --> 00:34:19,429 kartlagt over listene for å generere verdier i noen området 1 til r, r er 16, 598 00:34:19,429 --> 00:34:20,699 eller 32 trinn i sequencer. 599 00:34:20,699 --> 00:34:23,810 600 00:34:23,810 --> 00:34:29,920 >> Og så hvis det er en verdi i denne listen som vi kjører gjennom sequencer, 601 00:34:29,920 --> 00:34:34,190 kjører gjennom det over og over, slår den på dette notatet, 602 00:34:34,190 --> 00:34:36,060 og at prøven blir utløst. 603 00:34:36,060 --> 00:34:42,810 604 00:34:42,810 --> 00:34:47,110 Her er alle de forskjellige rare måter Jeg kom opp med å generere notater. 605 00:34:47,110 --> 00:34:48,940 Prøv den på din egen semi sum. 606 00:34:48,940 --> 00:34:50,360 Det vil høres kult. 607 00:34:50,360 --> 00:34:53,066 608 00:34:53,066 --> 00:34:54,690 Tiden tillater det, vil vi gå gjennom dette. 609 00:34:54,690 --> 00:34:59,200 Men for akkurat nå, antar jeg vi bør demo hva vi har. 610 00:34:59,200 --> 00:35:01,380 La oss håpe dette går OK. 611 00:35:01,380 --> 00:35:02,670 >> Så dette er GHCI. 612 00:35:02,670 --> 00:35:06,580 613 00:35:06,580 --> 00:35:09,121 Og vi vil laste en fil Jeg har kalt song.lhs, 614 00:35:09,121 --> 00:35:10,620 som er den filen jeg bare viste deg. 615 00:35:10,620 --> 00:35:11,470 Ok flott. 616 00:35:11,470 --> 00:35:15,010 Som Connor sa tidligere, det kompilert, det Typen sjekket, 617 00:35:15,010 --> 00:35:18,380 så jeg kan puste mye lettere. 618 00:35:18,380 --> 00:35:20,010 Det kommer ikke til å blåse opp på meg. 619 00:35:20,010 --> 00:35:22,720 >> Jeg hadde lyst til å vise deg noe nyttig. 620 00:35:22,720 --> 00:35:25,900 Du kan se at en modul lastet kalt 50. 621 00:35:25,900 --> 00:35:28,240 Du kan bla gjennom denne modulen. 622 00:35:28,240 --> 00:35:32,092 Og dette er så fint om doing-- kanskje hva 623 00:35:32,092 --> 00:35:34,550 du gjør i Haskell er ikke kalt programvareutvikling, 624 00:35:34,550 --> 00:35:36,980 men du kan gjøre mye morsomme ting på egen hånd. 625 00:35:36,980 --> 00:35:42,410 Og arbeidsflyten er virkelig fint som sammenlignet med en rekke andre språk, 626 00:35:42,410 --> 00:35:45,872 fordi du kan se i en virkelig lesbar måte hva som skjer. 627 00:35:45,872 --> 00:35:47,830 Så vi ser at vi har alle disse setningene, som 628 00:35:47,830 --> 00:35:53,760 er lister over musikk plasser, og da vi bygge disse opp til noe større, 629 00:35:53,760 --> 00:35:55,220 som er en musikk sang. 630 00:35:55,220 --> 00:35:58,450 Det er en musikalsk enhet. 631 00:35:58,450 --> 00:36:05,545 Og så kan vi spille alt dette med en funksjon kalt spille musikk. 632 00:36:05,545 --> 00:36:09,040 Du kan se at her nede. 633 00:36:09,040 --> 00:36:11,310 Som er bare spille. 634 00:36:11,310 --> 00:36:15,040 >> Jeg burde say-- jeg ikke snakke om dette dollartegn som er overalt. 635 00:36:15,040 --> 00:36:17,980 Dollartegnet er en annen infiks operatør. 636 00:36:17,980 --> 00:36:22,500 Men det har den laveste forrang av enhver operatør, som effektivt 637 00:36:22,500 --> 00:36:24,960 betyr at alt på venstre for dollartegn 638 00:36:24,960 --> 00:36:28,460 og høyre for dollartegn, vi kommer til å bli evaluert før det. 639 00:36:28,460 --> 00:36:31,430 Så det er liksom som en annen måte å legge parentes. 640 00:36:31,430 --> 00:36:33,980 641 00:36:33,980 --> 00:36:36,220 >> CONNOR HARRIS: Det er i utgangspunktet funksjon sammensetning. 642 00:36:36,220 --> 00:36:40,026 Og det sikrer at du ikke have-- hvis du har funksjoner hver side eller infiks 643 00:36:40,026 --> 00:36:42,900 operatører på hver side, vil de ikke assosiere over det og gi deg 644 00:36:42,900 --> 00:36:46,030 uventede resultater. 645 00:36:46,030 --> 00:36:49,790 >> STEPHEN KREWSON: Så vi can-- bruker det, kan vi ringe. 646 00:36:49,790 --> 00:36:51,415 Først vil vi spille det uten trommer. 647 00:36:51,415 --> 00:37:00,330 648 00:37:00,330 --> 00:37:03,170 Det er helikopteret, MIDI helikopter. 649 00:37:03,170 --> 00:37:05,495 >> [MUSIC SPILLE] 650 00:37:05,495 --> 00:37:08,525 651 00:37:08,525 --> 00:37:09,525 Det er firkantbølge. 652 00:37:09,525 --> 00:37:24,520 653 00:37:24,520 --> 00:37:25,490 Stemmen slam. 654 00:37:25,490 --> 00:37:27,630 Og du kan virkelig gå vill med dette. 655 00:37:27,630 --> 00:37:30,872 Jeg plukket en ganske enkel en, fordi jeg visste at jeg ikke skulle bite av 656 00:37:30,872 --> 00:37:31,830 mer enn jeg kunne tygge. 657 00:37:31,830 --> 00:37:36,460 Bare holde det ganske enkelt for å vise de viktigste ideene. 658 00:37:36,460 --> 00:37:39,952 Men da jeg var som vi har fikk til å legge noen trommer til dette. 659 00:37:39,952 --> 00:37:41,910 Nettopp fordi dette er et litt ugjennomtrengelig, 660 00:37:41,910 --> 00:37:45,790 og jeg brukte ikke Navn på trommer, 661 00:37:45,790 --> 00:37:49,490 Jeg kartlagt them-- fordi de er en del av det nummerert klasse, 662 00:37:49,490 --> 00:37:51,500 Jeg kartlagt dem til ints. 663 00:37:51,500 --> 00:37:53,120 Den ene er som en basstromme. 664 00:37:53,120 --> 00:37:54,370 Zero er like godt. 665 00:37:54,370 --> 00:37:56,000 Seven er en høy lue. 666 00:37:56,000 --> 00:38:00,920 Og ned her hvor funksjoner få litt mer tilfeldig, 667 00:38:00,920 --> 00:38:02,100 disse er som Conga trommer. 668 00:38:02,100 --> 00:38:08,360 >> Så hvis du tror om-- kanskje en morsom måte å implementere en trommemaskin 669 00:38:08,360 --> 00:38:12,830 er å bruke meget velordnet mønstre på din basstromme. 670 00:38:12,830 --> 00:38:17,640 Så for eksempel, ved filtrering over hele liste med alt som gir tilbake 671 00:38:17,640 --> 00:38:20,590 1 når det er tatt modul 04. 672 00:38:20,590 --> 00:38:27,190 Så jeg får 1, 5, 9, 13, 17-- så dette er første kryss av alle tiltak. 673 00:38:27,190 --> 00:38:32,860 >> Og så er dette det samme ting flyttet over to trinn. 674 00:38:32,860 --> 00:38:33,850 Så det er offbeat. 675 00:38:33,850 --> 00:38:37,480 Så dette ville være noe som en høy lue. 676 00:38:37,480 --> 00:38:39,640 Og igjen, her nede, det er litt tilfeldig, 677 00:38:39,640 --> 00:38:41,080 fordi vi gjør Conga trommer. 678 00:38:41,080 --> 00:38:44,180 Og jeg har noen maracas ned her også. 679 00:38:44,180 --> 00:38:50,280 >> Så jeg kunne ringe spill trommemaskin, men det ville fortsette i det uendelige, 680 00:38:50,280 --> 00:38:53,700 og det kan begynne å ta tak opp alt minnet i systemet mitt. 681 00:38:53,700 --> 00:38:57,090 Så jeg vil kalle denne funksjonen spille musikk, som vi vil se, 682 00:38:57,090 --> 00:39:02,020 bruke avkorting parallelt sammensetning å spille vår lille Frere Jacques sang 683 00:39:02,020 --> 00:39:04,200 sammen med denne rare trommemaskin. 684 00:39:04,200 --> 00:39:06,190 Så la oss ta en titt. 685 00:39:06,190 --> 00:39:10,920 Og vennligst forbedre på min anordning av alle trommeldelene. 686 00:39:10,920 --> 00:39:13,375 Ikke min spesialitet, men jeg hadde mye moro å gjøre det. 687 00:39:13,375 --> 00:39:17,678 688 00:39:17,678 --> 00:39:20,654 >> [MUSIC SPILLE] 689 00:39:20,654 --> 00:39:52,260 690 00:39:52,260 --> 00:39:56,980 >> Så selvfølgelig, er dette alt litt ikke så gøy 691 00:39:56,980 --> 00:40:01,100 hvis vi ikke kan konvertere den til en score så kanskje det 692 00:40:01,100 --> 00:40:04,650 kan tolkes av et menneske utøver. 693 00:40:04,650 --> 00:40:06,535 Så jeg vil ikke kjøre den her. 694 00:40:06,535 --> 00:40:07,910 Jeg har allerede generert filene. 695 00:40:07,910 --> 00:40:10,280 Du kan se at det er en dot LilyPond file-- og dette 696 00:40:10,280 --> 00:40:14,500 vil være min naturlig overgang over til Connor-- og en prikk MIDI-fil, 697 00:40:14,500 --> 00:40:18,610 og en prikk PDF-fil, som er det LilyPond slutt vil generere. 698 00:40:18,610 --> 00:40:23,770 >> Men disse er disse skriptene, og jeg skal bare kjøre dem med deres hjelp alternativer. 699 00:40:23,770 --> 00:40:28,090 Hvis du får disse opp og kjører med Euterpea, kan du generere en MIDI-fil. 700 00:40:28,090 --> 00:40:31,160 Og deretter fra MIDI-fil med denne MIDI 2LY program, 701 00:40:31,160 --> 00:40:34,930 du kan generere en Lily Fil dam, og deretter 702 00:40:34,930 --> 00:40:37,974 kan generere en PDF av poengsummen. 703 00:40:37,974 --> 00:40:39,390 Og vi bør ta en titt på dette. 704 00:40:39,390 --> 00:40:52,599 705 00:40:52,599 --> 00:40:55,140 Så Connor vil trolig vise deg hvordan du kan kommentere dette bedre, 706 00:40:55,140 --> 00:41:02,570 men dette er Frere Jacques som generert av meg i Euterpea. 707 00:41:02,570 --> 00:41:07,300 Det er bare i C. Jeg skulle ha funnet ut hva hacke det er faktisk i. 708 00:41:07,300 --> 00:41:11,090 Men det er rørledningen for hvordan du gjør det med det. 709 00:41:11,090 --> 00:41:12,950 La oss snakke mer om LilyPond. 710 00:41:12,950 --> 00:41:15,780 >> CONNOR HARRIS: OK La oss se. 711 00:41:15,780 --> 00:41:19,480 712 00:41:19,480 --> 00:41:21,419 Visste du nevner Lær Du Haskell? 713 00:41:21,419 --> 00:41:22,460 STEPHEN KREWSON: Oh yeah. 714 00:41:22,460 --> 00:41:23,480 Sjekk ut Lær Du Haskell. 715 00:41:23,480 --> 00:41:24,410 Det er i ressursene. 716 00:41:24,410 --> 00:41:26,830 Det var slik jeg begynte læring, og det er flott. 717 00:41:26,830 --> 00:41:27,580 Ikke dum læring. 718 00:41:27,580 --> 00:41:28,829 >> CONNOR HARRIS: Så det er online. 719 00:41:28,829 --> 00:41:34,760 Så en fyr som heter [uhørbart] learnyouahaskell.com, ingen mellomrom. 720 00:41:34,760 --> 00:41:37,065 Grammatikk er syk. 721 00:41:37,065 --> 00:41:38,690 STEPHEN KREWSON: Det er illustrert, også. 722 00:41:38,690 --> 00:41:39,440 CONNOR HARRIS: Så hva er LilyPond? 723 00:41:39,440 --> 00:41:42,480 Det er en deklarativ programmering språk for musikk sats. 724 00:41:42,480 --> 00:41:45,480 Så declarative-- du kan tenke på ting som HTML, 725 00:41:45,480 --> 00:41:50,900 der du ikke saying-- HTML sier ikke hvordan nettlesere skal 726 00:41:50,900 --> 00:41:52,180 gjengi sider steg for steg. 727 00:41:52,180 --> 00:41:54,096 Det er bare å si dette er en tekstlig beskrivelse 728 00:41:54,096 --> 00:41:56,100 av hva du vil at siden skal se ut. 729 00:41:56,100 --> 00:41:59,310 >> Og så er det også et program som samler dette språket, 730 00:41:59,310 --> 00:42:02,300 eller det må du lese inn og deretter faktisk gjør sats for deg, 731 00:42:02,300 --> 00:42:05,570 og det spytter ut disse fantastiske leter PDF skårer. 732 00:42:05,570 --> 00:42:08,250 Du kan også få PNG format eller hva. 733 00:42:08,250 --> 00:42:10,300 En god måte å tenke på dette er ved analogi 734 00:42:10,300 --> 00:42:16,620 er at LaTeX er liksom som LillyPond, men for bare vanlig sats. 735 00:42:16,620 --> 00:42:20,360 Så i stedet of-- det ikke WYSIWYG, What You See 736 00:42:20,360 --> 00:42:22,960 Er hva du får, som, sier Finale er, eller Sibelius, 737 00:42:22,960 --> 00:42:27,430 eller Microsoft Word, der du kan skrive inn sanntid og utkast ting i sanntid 738 00:42:27,430 --> 00:42:31,340 og se endringer umiddelbart. 739 00:42:31,340 --> 00:42:32,140 >> Det er tekstbasert. 740 00:42:32,140 --> 00:42:35,290 Du må kompilere score ved hjelp av et eget program 741 00:42:35,290 --> 00:42:37,090 og komme ut PDF-filer senere. 742 00:42:37,090 --> 00:42:43,320 Dette er litt mindre praktisk for bruk hvis du er 743 00:42:43,320 --> 00:42:46,520 prøver å skrive direkte inn en score, og du er 744 00:42:46,520 --> 00:42:48,620 prøver å komponere på datamaskinen. 745 00:42:48,620 --> 00:42:50,830 Men det er mange fordeler for den. 746 00:42:50,830 --> 00:42:56,110 Man ser det mye bedre, fordi LillyPond kan faktisk 747 00:42:56,110 --> 00:42:58,210 ta deg tid til å gjøre layout beslutninger på riktig måte, 748 00:42:58,210 --> 00:43:02,380 i motsetning til Sibelius eller Finale, som har å gjøre kompromitterte algoritmer slik 749 00:43:02,380 --> 00:43:05,020 at de kan vise ting i sanntid. 750 00:43:05,020 --> 00:43:07,660 >> Så hvorfor er LilyPond-- datagrafikk er vanskelig. 751 00:43:07,660 --> 00:43:10,535 Hvis du gjør noe med musikk og du ønsker å skrive ut score, 752 00:43:10,535 --> 00:43:13,900 du ikke ønsker å skrive ut alt selv 753 00:43:13,900 --> 00:43:19,040 starter med hvordan å trekke staber og hvordan å trekke notatblokker. 754 00:43:19,040 --> 00:43:21,020 Det er veldig vanskelig. Det er blitt gjort før. 755 00:43:21,020 --> 00:43:22,170 Du er fine. 756 00:43:22,170 --> 00:43:26,200 >> Hvis du ønsker å bruke Finale eller Sibelius, filformatene for disse tingene 757 00:43:26,200 --> 00:43:30,180 er svært komplisert, og du kan ikke virkelig bruke dem programmatisk. 758 00:43:30,180 --> 00:43:35,020 Du kan åpne opp Sibelius med Finale og gå til Fil, Eksporter som PDF selv, 759 00:43:35,020 --> 00:43:37,600 men du kan egentlig ikke kalle det fra et manus. 760 00:43:37,600 --> 00:43:40,440 LillyPond, kan du ringe fra disse skriptene. 761 00:43:40,440 --> 00:43:44,397 Du kan enkelt veksle LillyPond med LaTeX. 762 00:43:44,397 --> 00:43:47,230 Jeg vil ikke ha så mye tid til å gå inn i disse teknologiene akkurat nå, 763 00:43:47,230 --> 00:43:48,321 men de finnes. 764 00:43:48,321 --> 00:43:50,070 Hvis du ønsker å se inn i en LillyPond bok, 765 00:43:50,070 --> 00:43:53,760 det er et program som følger med din LillyPond distribusjon, 766 00:43:53,760 --> 00:43:57,030 og det er for itera LillyPond fragmenter i LaTeX 767 00:43:57,030 --> 00:44:00,340 Hvis du ønsker å gjøre noe som en stor musikkvitenskap dokument 768 00:44:00,340 --> 00:44:02,289 med eksempler, f.eks. 769 00:44:02,289 --> 00:44:04,580 Og det er en god ferdighet for liv hvis du gjør noe 770 00:44:04,580 --> 00:44:05,770 med musikk, ikke bare CS50. 771 00:44:05,770 --> 00:44:09,320 Jeg har brukt LillyPond for alle av mine komposisjonsprosjekter 772 00:44:09,320 --> 00:44:11,880 siden jeg var i utgangspunktet en senior på high school. 773 00:44:11,880 --> 00:44:13,455 >> Så her er noen enkle eksempler. 774 00:44:13,455 --> 00:44:17,490 775 00:44:17,490 --> 00:44:21,060 Dette er i utgangspunktet representant av vanskelighetsgraden 776 00:44:21,060 --> 00:44:23,481 at folk flest ville innse det de prøvde 777 00:44:23,481 --> 00:44:24,980 å bruke LilyPond for enkle prosjekter. 778 00:44:24,980 --> 00:44:29,519 Det første er i begynnelsen til en koral forspill av Bach. 779 00:44:29,519 --> 00:44:31,810 Denne nederste er et utdrag fra en av mine egne verk, 780 00:44:31,810 --> 00:44:34,650 og det er bare der for å vise deg ting som [uhørbart] 781 00:44:34,650 --> 00:44:38,550 å sette flere linjer i samme ansatte, hvordan lyrisk undersetting fungerer. 782 00:44:38,550 --> 00:44:41,350 783 00:44:41,350 --> 00:44:46,110 Lyriske underlag er en ting som er veldig enkel å bruke LilyPond for kormusikk. 784 00:44:46,110 --> 00:44:48,814 >> Og så så er det litt mer kompliserte eksempler her. 785 00:44:48,814 --> 00:44:50,980 Alle disse er gjort i LilyPond og de er gjennomførbart. 786 00:44:50,980 --> 00:44:55,280 Denne første utdraget er fra [Uhørbart] av [uhørbart]. 787 00:44:55,280 --> 00:44:58,860 Og denne [uhørbart] fra et stykke for solo bass 788 00:44:58,860 --> 00:45:03,550 fløyte etter [uhørbart], som er en longtime-- som 789 00:45:03,550 --> 00:45:07,101 var en langvarig medlem av Musikklinja her, tror jeg. 790 00:45:07,101 --> 00:45:08,600 Jeg er ikke sikker på hvor han har gått til. 791 00:45:08,600 --> 00:45:12,410 Men han var rådgiver for Harvard Komponister Association for lang tid. 792 00:45:12,410 --> 00:45:13,530 Fantastisk mann. 793 00:45:13,530 --> 00:45:16,920 Og han skriver litt musikk som har svært komplisert notasjon som LillyPond 794 00:45:16,920 --> 00:45:20,500 kan likevel håndtere veldig pent. 795 00:45:20,500 --> 00:45:26,030 >> Så bare for å gi deg en følelse av hva Denne saken evner are-- så 796 00:45:26,030 --> 00:45:28,960 innvendige av LillyPond er meget komplisert. 797 00:45:28,960 --> 00:45:31,060 Og du kan bruke det for en lang tid, herunder 798 00:45:31,060 --> 00:45:32,520 for noen ganske komplisert ting, uten egentlig 799 00:45:32,520 --> 00:45:34,060 å vite mye om dem. 800 00:45:34,060 --> 00:45:38,720 Men den grunnleggende idé er at i laveste nivå, atomer av LillyPonds 801 00:45:38,720 --> 00:45:39,970 er notene. 802 00:45:39,970 --> 00:45:42,761 Notatene inneholder en kontekst kalt stemmer. 803 00:45:42,761 --> 00:45:44,510 Så stemmen sammenheng utgangspunktet tilsvarer 804 00:45:44,510 --> 00:45:47,410 til en eneste linje med polyfoni. 805 00:45:47,410 --> 00:45:49,410 Og så sammenheng kan være inneholdt hierarkisk 806 00:45:49,410 --> 00:45:53,590 i høyere nivå de som representerer staber på scoren 807 00:45:53,590 --> 00:45:56,750 eller større grupperinger som piano staber eller kor staber, 808 00:45:56,750 --> 00:45:58,990 og så til slutt Hele rille sammenhenger. 809 00:45:58,990 --> 00:46:02,260 Og du kan faktisk omfatte flere score i en bok. 810 00:46:02,260 --> 00:46:05,770 >> Og hver sammenheng har en antall vedlagte gravører. 811 00:46:05,770 --> 00:46:08,340 Hvis du ser gjennom Innholdet i en kontekst 812 00:46:08,340 --> 00:46:14,410 og skrive ut en bestemt symbol eller en viss klasse av symboler som er nødvendig. 813 00:46:14,410 --> 00:46:17,840 Så til alle stemme sammenheng, det er [uhørbart] notater 814 00:46:17,840 --> 00:46:24,270 gravør som er i utgangspunktet en funksjon eller et objekt som skriver ut hele notatet 815 00:46:24,270 --> 00:46:26,290 hoder på de riktige deler av en side. 816 00:46:26,290 --> 00:46:29,510 Så er det en kløft gravør, som skriver ut kløfter på de ansatte. 817 00:46:29,510 --> 00:46:31,517 Så er det en metronom mark gravør som 818 00:46:31,517 --> 00:46:33,100 skriver ut metronom merker i en poengsum. 819 00:46:33,100 --> 00:46:36,410 Og alle disse passer ganske godt inn i hierarkiet. 820 00:46:36,410 --> 00:46:39,500 Og det er veldig, veldig, veldig passelig, som du trenger 821 00:46:39,500 --> 00:46:42,880 Hvis du ønsker å få ting sånn. 822 00:46:42,880 --> 00:46:45,730 >> Så alle sammenhenger har en Mange forskjellige attributter 823 00:46:45,730 --> 00:46:52,410 at du kan endre for alt fra avstanden til ulike skrift 824 00:46:52,410 --> 00:46:54,942 utvalg til størrelser på ting. 825 00:46:54,942 --> 00:46:56,900 Hvis du ønsker å gjøre selv mer kompliserte ting, 826 00:46:56,900 --> 00:46:59,210 det er en innebygd skriptspråk. 827 00:46:59,210 --> 00:47:01,820 De bruker ordningen, som er dialekt av LISP. 828 00:47:01,820 --> 00:47:04,960 Disse sannsynligvis ikke betyr noe for deg. 829 00:47:04,960 --> 00:47:06,900 Men innerst inne, en ordning annen funksjonell 830 00:47:06,900 --> 00:47:09,500 programmeringsspråk, mer eller mindre. 831 00:47:09,500 --> 00:47:10,800 >> STEPHEN KREWSON: Den tie-in. 832 00:47:10,800 --> 00:47:12,690 >> CONNOR HARRIS: Yeah. 833 00:47:12,690 --> 00:47:15,390 Det er en god tie-in, antar jeg. 834 00:47:15,390 --> 00:47:20,150 Og det er brukt som et undervisningsspråk, faktisk, ned Mass Ave. Ved MIT. 835 00:47:20,150 --> 00:47:26,590 Og det er veldig nyttig for LillyPond av ulike tekniske årsaker. 836 00:47:26,590 --> 00:47:30,317 >> Og så hvis du ønsker å gjøre enkle tilpasninger avhengig conditionals, 837 00:47:30,317 --> 00:47:32,900 for example-- det er sikkert tilstanden til en poengsum som er oppfylt, 838 00:47:32,900 --> 00:47:36,495 gjøre endringer i layout eller whatnot-- deretter 839 00:47:36,495 --> 00:47:37,620 disse fasilitetene er der. 840 00:47:37,620 --> 00:47:38,667 De er komplisert. 841 00:47:38,667 --> 00:47:40,250 Så her er en ganske enkel kode prøven. 842 00:47:40,250 --> 00:47:43,810 Det er fem linjer. 843 00:47:43,810 --> 00:47:46,120 I utgangspunktet er jeg definere to staber. 844 00:47:46,120 --> 00:47:46,904 Det er i 3/4. 845 00:47:46,904 --> 00:47:48,695 Den første ansatte har en festet tempo mark, 846 00:47:48,695 --> 00:47:51,110 men det som faktisk skjer å gå på til hele score, 847 00:47:51,110 --> 00:47:54,960 fordi tempo merker er på lagene fortsatt. 848 00:47:54,960 --> 00:47:59,044 Metronomen mark gravør er festet til ballen sammenheng. 849 00:47:59,044 --> 00:48:01,460 Det finnes forskjellige nøkler, fordi [uhørbart] gravør 850 00:48:01,460 --> 00:48:02,710 er festet staber. 851 00:48:02,710 --> 00:48:04,441 Du kan faktisk gjøre er. 852 00:48:04,441 --> 00:48:06,190 Prøven jeg skrev er faktisk i C-dur, 853 00:48:06,190 --> 00:48:07,990 men det er bare å demonstrere at du kan ha 854 00:48:07,990 --> 00:48:09,570 forskjellige nøkler i forskjellige staber. 855 00:48:09,570 --> 00:48:15,710 Og den grunnleggende syntaks er du skriver merk navn med E, F, G, uansett. 856 00:48:15,710 --> 00:48:18,910 Hvis du ønsker å gjøre fortegn, du suffiks eller ES. 857 00:48:18,910 --> 00:48:22,640 Dette er fra Dutch musikkvitenskapelige konvensjoner. 858 00:48:22,640 --> 00:48:28,290 >> Og for å gjøre oktav sprang, må du bruke disse aksemerker, komma eller apostrof. 859 00:48:28,290 --> 00:48:30,580 Den relative betyr bare hva du har et notat, 860 00:48:30,580 --> 00:48:34,080 vil det automatisk bli plaec i oktav nærmest den forrige. 861 00:48:34,080 --> 00:48:37,624 Og hvis du ønsker å hoppe mer enn en fifth-- si en femte eller mer-- 862 00:48:37,624 --> 00:48:39,165 så må du bruke [uhørbart]. 863 00:48:39,165 --> 00:48:42,580 Men ellers, trenger du ikke å spesifisere oktav av hver eneste tone. 864 00:48:42,580 --> 00:48:46,130 >> Og relativ C, prime, og C, du bare oppgir midten C 865 00:48:46,130 --> 00:48:48,630 og basen C, spesielt første tonene. 866 00:48:48,630 --> 00:48:55,020 Da har du disse staber som organiserer disse to stemmer eller prøver av musikk, 867 00:48:55,020 --> 00:48:56,730 og du har en poengsum. 868 00:48:56,730 --> 00:48:58,440 Og det ser ut som dette. 869 00:48:58,440 --> 00:49:01,780 870 00:49:01,780 --> 00:49:05,380 >> Hvis du ønsker å ta deg tid til kopi som prøve av LillyPond 871 00:49:05,380 --> 00:49:07,530 koden på den tidligere gli ned her, og du 872 00:49:07,530 --> 00:49:09,030 kan skrive det for LillyPond selv. 873 00:49:09,030 --> 00:49:11,280 Jeg vet vi har noe som ser mye som dette. 874 00:49:11,280 --> 00:49:17,236 875 00:49:17,236 --> 00:49:19,610 Så det er en annen teknologi heter Music XML vedlikeholdt 876 00:49:19,610 --> 00:49:22,030 av helt forskjellige personer. 877 00:49:22,030 --> 00:49:28,150 XML er en tekstdata structure-- jeg skal ikke si data structure-- si 878 00:49:28,150 --> 00:49:29,580 metafor kartet liksom. 879 00:49:29,580 --> 00:49:33,800 Og det er designet for å holde hierarkiske data svært godt. 880 00:49:33,800 --> 00:49:37,050 HTML, for eksempel, er en type av XML. 881 00:49:37,050 --> 00:49:41,090 Og du kan fortelle XML fordi de hadde alle vinkelparenteser og vinkel 882 00:49:41,090 --> 00:49:44,700 brakett slash merker som viser datafelt. 883 00:49:44,700 --> 00:49:47,390 >> Jeg har ikke en kode eksempel fra Musikk XML. 884 00:49:47,390 --> 00:49:50,450 Du kan finne det selv. 885 00:49:50,450 --> 00:49:53,735 I utgangspunktet grunnen til at du kanskje ønsker å bruke XML som mellomtrinnet 886 00:49:53,735 --> 00:49:55,980 er først av alt, det er en utvekslingsformatet 887 00:49:55,980 --> 00:50:02,301 for i utgangspunktet every-- jeg skal ikke si hvert, men mye forskjellig poengsum 888 00:50:02,301 --> 00:50:02,800 forfattere. 889 00:50:02,800 --> 00:50:04,966 Så hvis du skriver i Music XML, ikke bare kan LillyPond 890 00:50:04,966 --> 00:50:08,080 lese det med hjelp av denne auxilary program som heter Musikk XML til LY, 891 00:50:08,080 --> 00:50:11,360 men også Finale kan lese det, Sibelius kan lese den. 892 00:50:11,360 --> 00:50:14,770 Avhengig av hvordan den interne objekt hierarkiet fungerer for å representere musikk, 893 00:50:14,770 --> 00:50:18,820 det kan være lettere å skrive ut til Musikk XML enn å LillyPond 894 00:50:18,820 --> 00:50:22,410 og bare stole på Music XML å LY å gjøre konverteringen. 895 00:50:22,410 --> 00:50:24,282 >> Jeg tror ikke [uhørbart] har Music XML. 896 00:50:24,282 --> 00:50:25,490 STEPHEN KREWSON: Det gjør ikke. 897 00:50:25,490 --> 00:50:26,340 Noen jobber med det, though. 898 00:50:26,340 --> 00:50:27,090 >> CONNOR HARRIS: OK. 899 00:50:27,090 --> 00:50:31,040 Euterpea har ikke en Musikk XML utgangsfunksjonen ennå. 900 00:50:31,040 --> 00:50:35,340 Hvis du vil ha et avsluttende prosjekt idé, kanskje komme i kontakt med gutta 901 00:50:35,340 --> 00:50:38,620 at Stephen vet, og de kunne bruke din hjelp. 902 00:50:38,620 --> 00:50:40,992 >> STEPHEN KREWSON: Jeg ville elske det. 903 00:50:40,992 --> 00:50:43,450 CONNOR HARRIS: Også, i utgangspunktet, hvert programmeringsspråk 904 00:50:43,450 --> 00:50:46,610 det er verdt sin salt allerede har en XML-bibliotek, 905 00:50:46,610 --> 00:50:51,030 slik at du kan internt konvertere alle musikken din til et objekt 906 00:50:51,030 --> 00:50:54,120 at XML biblioteket kan skrive ut som ville kreve færre 907 00:50:54,120 --> 00:50:57,470 endringer i den interne strukturen uansett musikk objekter du 908 00:50:57,470 --> 00:51:00,310 ønsker å skrive enn å skrive det direkte i LillyPond ville. 909 00:51:00,310 --> 00:51:04,380 Så bare skrive det ut med XML med XML bibliotekene i språket, 910 00:51:04,380 --> 00:51:07,260 som vil garantere at det er syntaktisk riktig og alt, 911 00:51:07,260 --> 00:51:08,720 og deretter konvertere den til LillyPond. 912 00:51:08,720 --> 00:51:11,060 Så teknologi kan det være lurt å se nærmere på hvis du gjør noe 913 00:51:11,060 --> 00:51:11,650 som dette. 914 00:51:11,650 --> 00:51:14,490 915 00:51:14,490 --> 00:51:16,370 >> [Uhørbart], en annen auxilarry teknologi. 916 00:51:16,370 --> 00:51:21,700 Dette er i utgangspunktet Tech Works eller Tech Studio for LillyPond. 917 00:51:21,700 --> 00:51:25,380 Så det tilbyr hjelp med syntaks, med maler 918 00:51:25,380 --> 00:51:28,770 for ulike felles kombinasjoner av instrumenter. 919 00:51:28,770 --> 00:51:32,780 Den lar delt skjerm ser så du kan ha koden din i ett vindu 920 00:51:32,780 --> 00:51:37,350 og PDF i et annet vindu og klikk på steder i PDF 921 00:51:37,350 --> 00:51:40,650 for å hoppe til den aktuelle flekker i kildekoden. 922 00:51:40,650 --> 00:51:45,330 Dette er mer nyttig hvis du faktisk er skriving LillyPond filer selv 923 00:51:45,330 --> 00:51:47,400 enn hvis du genererer dem programmatisk. 924 00:51:47,400 --> 00:51:51,230 Men igjen, det er noe nyttig å ha. 925 00:51:51,230 --> 00:51:51,970 >> Flott. 926 00:51:51,970 --> 00:51:55,860 En annen resources-- Jeg vil bare gå gjennom denne meget raskt. 927 00:51:55,860 --> 00:52:01,270 LillyPond manuals-- LillyPond har god dokumentasjon på sin hjemmeside. 928 00:52:01,270 --> 00:52:02,270 De har en tutorial. 929 00:52:02,270 --> 00:52:03,478 De har en syntaks referanse. 930 00:52:03,478 --> 00:52:07,010 De har hundrevis av tekstbiter for diverse små ting 931 00:52:07,010 --> 00:52:09,930 yo trenger gjøre for å demonstrere ulike evner. 932 00:52:09,930 --> 00:52:12,250 Hvis du ønsker å bruke skriptspråk 933 00:52:12,250 --> 00:52:14,740 eller gjøre mer omfattende tilpasninger, så er det 934 00:52:14,740 --> 00:52:16,730 innvendige referere til denne nettadressen. 935 00:52:16,730 --> 00:52:21,950 Hvis du ønsker å bruke musikk XML, det er som URL, musicxml.com/tutorial. 936 00:52:21,950 --> 00:52:27,960 >> Og hvis du trenger å lære ordningen fordi du faktisk ønsker å bruke 937 00:52:27,960 --> 00:52:30,960 skript anlegg i LillyPond, så er det en [uhørbart] kalt 938 00:52:30,960 --> 00:52:32,918 Strukturert Tolkning av dataprogrammer, 939 00:52:32,918 --> 00:52:35,820 som ikke bare er den andre størst CS lærebok noensinne written-- 940 00:52:35,820 --> 00:52:39,770 finne meg etterpå hvis du ønsker å vite hva jeg tror den største en er-- 941 00:52:39,770 --> 00:52:43,580 men det er også en veldig god innføring i språket skikkelig. 942 00:52:43,580 --> 00:52:46,630 Du trenger ikke mer enn de første seksjoner. 943 00:52:46,630 --> 00:52:47,827 >> Og det er det. 944 00:52:47,827 --> 00:52:48,410 Noen spørsmål? 945 00:52:48,410 --> 00:52:54,068 946 00:52:54,068 --> 00:52:57,972 >> STUDENT: Hvor kan jeg laste ned genererte Frere Jacques 947 00:52:57,972 --> 00:53:01,050 slik at jeg kan sette det på min iPod? 948 00:53:01,050 --> 00:53:07,574 >> STEPHEN KREWSON: Vel, du kan skrive ut til noen wav fil i Euterpea. 949 00:53:07,574 --> 00:53:08,490 Og du har koden. 950 00:53:08,490 --> 00:53:10,000 Det er på GitHub. 951 00:53:10,000 --> 00:53:15,590 Lag dine egne varianter av Frere Jacques av CS50 hive tankene. 952 00:53:15,590 --> 00:53:17,095 Det ville være flott. 953 00:53:17,095 --> 00:53:18,220 CONNOR HARRIS: Noen andre? 954 00:53:18,220 --> 00:53:20,261 STEPHEN KREWSON: Vi trenger en bedre basstromme, også. 955 00:53:20,261 --> 00:53:21,935 Det er virkelig ille. 956 00:53:21,935 --> 00:53:26,565 >> STUDENT: Euterpea har ikke bare sammensetningen side, men signal-- 957 00:53:26,565 --> 00:53:27,440 STEPHEN KREWSON: Ja. 958 00:53:27,440 --> 00:53:30,100 Faktisk arbeidet jeg gjorde i Euterpea når jeg 959 00:53:30,100 --> 00:53:33,450 tok dette-- det er en oppgradere kurs ved Yale som 960 00:53:33,450 --> 00:53:35,900 bruker it var på lyd syntese. 961 00:53:35,900 --> 00:53:39,810 Så det er en veldig fin måte å bruke pilene 962 00:53:39,810 --> 00:53:46,150 og noen av notasjon vi så av komponere sammen signalfunksjoner. 963 00:53:46,150 --> 00:53:50,610 Spesielt bassen for mest av dem er bare en enkelt sinusbølge. 964 00:53:50,610 --> 00:53:54,240 Men hvis du begynner å skrive dem i rare programmatiske måter, 965 00:53:54,240 --> 00:54:00,010 du kan bli sprø lyd effekter, som rare kaskader. 966 00:54:00,010 --> 00:54:04,640 Du kan lage veldig modig lyder med mye modulering. 967 00:54:04,640 --> 00:54:07,730 >> Jeg gjorde et prosjekt på granulær syntese, som er 968 00:54:07,730 --> 00:54:12,290 sted i mellom FM og prøvetaking. 969 00:54:12,290 --> 00:54:15,230 Du tar svært liten, lite utvalg, og deretter 970 00:54:15,230 --> 00:54:20,440 kombinere dem med en slags modulator og bygge opp en fyldigere lyd. 971 00:54:20,440 --> 00:54:24,900 Vi gjorde også fysisk modellering, så prøver å tenke på fysikk 972 00:54:24,900 --> 00:54:29,410 og psykoakustikk av noe sånt en trompet, og tenker på den måten 973 00:54:29,410 --> 00:54:32,320 lyden er spretter av bell fra trompeten 974 00:54:32,320 --> 00:54:35,200 og akustikken rommet og modellering 975 00:54:35,200 --> 00:54:40,195 som sammen med de grunnleggende oscillatorer. 976 00:54:40,195 --> 00:54:47,690 977 00:54:47,690 --> 00:54:48,940 CONNOR HARRIS: Takk så mye. 978 00:54:48,940 --> 00:54:50,140 Takk for at du kom. 979 00:54:50,140 --> 00:54:52,400 Og jeg er alltid villig til å ta spørsmål ved email-- 980 00:54:52,400 --> 00:54:55,020 connorharris@college.harvard.edu. 981 00:54:55,020 --> 00:54:57,020 >> STEPHEN KREWSON: Yeah. stephen.krewson@yale.edu. 982 00:54:57,020 --> 00:54:58,810 983 00:54:58,810 --> 00:55:00,360 Kjølig. 984 00:55:00,360 --> 00:55:01,667