1 00:00:00,000 --> 00:00:05,180 2 00:00:05,180 --> 00:00:05,930 CONNOR HARRIS: Hej. 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 på 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 til CS50 på Yale. 7 00:00:12,582 --> 00:00:15,790 CONNOR HARRIS: Og vi kommer til at tale om nogle teknologier, som du måske 8 00:00:15,790 --> 00:00:18,880 ønsker at bruge, hvis du er interesseret i at gøre et afgangsprojekt eller virkelig 9 00:00:18,880 --> 00:00:20,920 noget med musik. 10 00:00:20,920 --> 00:00:24,400 Vi kommer til at fokusere på først en programmeringssprog kaldet Haskell. 11 00:00:24,400 --> 00:00:26,280 Det er en funktionel sprog, så paradigmet 12 00:00:26,280 --> 00:00:29,620 er meget forskellig fra C eller PHP eller andre bydende nødvendige sprog 13 00:00:29,620 --> 00:00:33,450 at du har brugt allerede, og især på et bibliotek skrevet i Haskell 14 00:00:33,450 --> 00:00:40,240 kaldet Euterpea, som kan hjælpe folk med at skrive musik funktionelt, 15 00:00:40,240 --> 00:00:40,780 dybest set. 16 00:00:40,780 --> 00:00:43,400 Og Stephen vil gå dig gennem et fantastisk eksempel på det. 17 00:00:43,400 --> 00:00:46,423 >> Efter dette, vil jeg præsentere dig for noget, der hedder LillyPond, som 18 00:00:46,423 --> 00:00:48,370 er en teknologi til opsætning musik. 19 00:00:48,370 --> 00:00:50,830 Det er lidt ligesom LaTeX til musik, hvis nogen af ​​jer 20 00:00:50,830 --> 00:00:57,530 har brugt LaTeX til matematiske klasser eller andre P sæt klasser eller hvad har du. 21 00:00:57,530 --> 00:01:00,440 Og så jeg vil give dig, igen, nogle enkle eksempler på, at 22 00:01:00,440 --> 00:01:03,640 og pege dig i den generelle retning af nogle bedre ressourcer. 23 00:01:03,640 --> 00:01:04,319 >> STEPHEN KREWSON: I Desuden troede vi det 24 00:01:04,319 --> 00:01:06,720 ville være cool at oprette en lille smule af hints 25 00:01:06,720 --> 00:01:10,780 mod en rørledning mellem Euterpea-genereret MIDI-filer 26 00:01:10,780 --> 00:01:13,910 i LillyPond, så vi leverer nogle instruktion på scripts 27 00:01:13,910 --> 00:01:16,310 at gøre det, der er forsynet med LillyPond 28 00:01:16,310 --> 00:01:19,160 bare for at holde det open source og få en rørledning i gang. 29 00:01:19,160 --> 00:01:20,910 CONNOR HARRIS: Igen, Vi bør understrege, 30 00:01:20,910 --> 00:01:23,100 disse to teknologier, du behøver ikke at bruge dem sammen. 31 00:01:23,100 --> 00:01:25,370 De er ikke designet til at arbejde sammen, selvom de meget pænt. 32 00:01:25,370 --> 00:01:26,362 >> STEPHEN KREWSON: Right. 33 00:01:26,362 --> 00:01:30,116 Og helt gratis. 34 00:01:30,116 --> 00:01:32,240 CONNOR HARRIS: Så anerkendelser, bare læse det. 35 00:01:32,240 --> 00:01:33,406 STEPHEN KREWSON: Behørigt noteret. 36 00:01:33,406 --> 00:01:36,360 Takket være disse folk. 37 00:01:36,360 --> 00:01:39,180 Dette vil jeg drysse på bare et øjeblik. 38 00:01:39,180 --> 00:01:41,560 Installationsprocessen er en lille smule tricky. 39 00:01:41,560 --> 00:01:45,420 Vi har en læst mig på GitHub at du kan tage et kig på. 40 00:01:45,420 --> 00:01:47,840 Bare email mig, hvis du har spørgsmål. 41 00:01:47,840 --> 00:01:52,829 Men vi vil køre dette under forudsætning at dette fungerer for alle. 42 00:01:52,829 --> 00:01:55,620 CONNOR HARRIS: Og hvis du ikke kan få LillyPond til at arbejde, nogen big deal. 43 00:01:55,620 --> 00:02:00,139 Der er ingen levende kompilering som vil blive inddraget, i hvert fald på min ende. 44 00:02:00,139 --> 00:02:02,930 STEPHEN KREWSON: Haskell og LillyPond bør begge har installatører. 45 00:02:02,930 --> 00:02:08,497 Euterpea downloades som en pakke, så videre og så videre. 46 00:02:08,497 --> 00:02:10,080 Så vi taler om computer musik. 47 00:02:10,080 --> 00:02:12,990 Og dette er blot en meget 50.000-fods visning. 48 00:02:12,990 --> 00:02:15,700 Der er et par forskellige aspekter af det. 49 00:02:15,700 --> 00:02:18,120 Og dette er ru og er kommer til at skjule nogle detaljer. 50 00:02:18,120 --> 00:02:22,090 Men vi kunne tænke på noget Ligesom algoritmisk sammensætning, 51 00:02:22,090 --> 00:02:24,920 ved hjælp af algoritmer, hjælp af kode, til at generere 52 00:02:24,920 --> 00:02:30,280 nogle type of-- måske en selv-lignende sekvens af noter, eller måske noter 53 00:02:30,280 --> 00:02:33,330 under nogle begrænsninger. 54 00:02:33,330 --> 00:02:35,350 Og så dem, kunne være udført eller fortolket 55 00:02:35,350 --> 00:02:38,390 med analoge instrumenter eller sådan noget. 56 00:02:38,390 --> 00:02:42,010 Men sammensætningen var gjort algoritmisk. 57 00:02:42,010 --> 00:02:45,120 >> Men selvfølgelig, måske på området computer musik eller digital musik 58 00:02:45,120 --> 00:02:48,870 vi er mere fortrolige med, er digital lyd syntese eller digital sampling 59 00:02:48,870 --> 00:02:51,160 og digital optagelse. 60 00:02:51,160 --> 00:02:55,650 En masse af digitale instrumenter sker via digital sampling. 61 00:02:55,650 --> 00:03:00,110 Faktisk vil vi være ved hjælp af en af ​​dem i i form af en sund skrifttype bibliotek senere. 62 00:03:00,110 --> 00:03:02,850 >> Men der er også noget, der hedder digital syntese, der kom ud 63 00:03:02,850 --> 00:03:08,650 af slutningen af ​​70'erne og ind i 80'erne med Yamaha og John Chowning på Stanford 64 00:03:08,650 --> 00:03:11,990 gør FM syntese eller Frequency Modulation syntese, 65 00:03:11,990 --> 00:03:15,100 hvor du havde et luftfartsselskab signal og et modulerende signal 66 00:03:15,100 --> 00:03:18,270 både i lydspektret. 67 00:03:18,270 --> 00:03:22,570 Men hvad vi fokuserer på i dag er noget, der hedder MIDI, 68 00:03:22,570 --> 00:03:25,040 og selvfølgelig algoritmisk komposition. 69 00:03:25,040 --> 00:03:30,940 >> Vi kommer ikke til at gøre instrumenterne, men vi i stedet kommer til at gøre noget musik, 70 00:03:30,940 --> 00:03:33,940 og så vil det blive fortolket af nogle instrumenter, 71 00:03:33,940 --> 00:03:38,300 er konformt til General MIDI standard. 72 00:03:38,300 --> 00:03:40,830 Så hvad er MIDI? 73 00:03:40,830 --> 00:03:45,550 Jeg har ikke tænkt mig at komme for dybt ind i det, men MIDI er dataoverførsel protokol. 74 00:03:45,550 --> 00:03:49,250 Det er en slags en vejledning på tværs forskellige virksomheder og brancher 75 00:03:49,250 --> 00:03:52,250 til at organisere lyde eller patches. 76 00:03:52,250 --> 00:03:54,170 Så vi vil se, at der er en MIDI-standard 77 00:03:54,170 --> 00:03:57,500 for alle de forskellige percussion lyde og MIDI anbefalinger 78 00:03:57,500 --> 00:04:01,360 for alle de forskellige typer af synth eller forskellige typer af hele instrumentet 79 00:04:01,360 --> 00:04:03,650 grupper i et orkester, siger. 80 00:04:03,650 --> 00:04:08,916 >> Du er sikkert bekendt med 0 til 127 MIDI-meddelelser. 81 00:04:08,916 --> 00:04:12,920 En MIDI signal er typisk én bit angiver 82 00:04:12,920 --> 00:04:16,130 uanset om det er en data-eller en status pakke, og så er der 83 00:04:16,130 --> 00:04:18,589 syv bits af et signal. 84 00:04:18,589 --> 00:04:21,430 Og disse kan kontrollere alt fra volumen 85 00:04:21,430 --> 00:04:25,330 til handlingen eller tryk på en bestemt tast 86 00:04:25,330 --> 00:04:29,400 Hvis du udfører med en MIDI controller samt naturligvis 87 00:04:29,400 --> 00:04:31,250 noter. 88 00:04:31,250 --> 00:04:33,450 Og selvfølgelig, MIDI har været yderst nyttigt, 89 00:04:33,450 --> 00:04:37,550 fordi det er en måde at wire sammen eller serieforbundne 90 00:04:37,550 --> 00:04:41,570 en flok af MIDI hardwareenheder. 91 00:04:41,570 --> 00:04:44,050 Jeg har syv eller otte tilbage på mit hus. 92 00:04:44,050 --> 00:04:46,610 Det bliver rigtig kompliceret, men det er virkelig kraftfuld. 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 de tidlige 80'ere, og det er virkelig rart og små. 95 00:04:51,117 --> 00:04:51,950 CONNOR HARRIS: Ja. 96 00:04:51,950 --> 00:04:54,230 Alle de klassiske Nintendo videospil ville sandsynligvis 97 00:04:54,230 --> 00:04:56,088 har MIDI filer til musik, for eksempel. 98 00:04:56,088 --> 00:04:59,550 99 00:04:59,550 --> 00:05:01,740 >> STEPHEN KREWSON: Her er en eksempel på generelle MIDI, 100 00:05:01,740 --> 00:05:06,520 viser MIDI som en slags med den almene protokol. 101 00:05:06,520 --> 00:05:13,280 Og jeg tror, ​​vi kan tænke på Forskellen mellem specifikationen 102 00:05:13,280 --> 00:05:17,830 at der bør være noget lignende disse instrumentlyde og den faktiske 103 00:05:17,830 --> 00:05:21,740 realisering af disse instrumenter lyde i en lyd skrifttype eller en bestemt MIDI 104 00:05:21,740 --> 00:05:25,740 synthesizer som forskellen mellem måske en typeface-- som siger, 105 00:05:25,740 --> 00:05:30,350 Generelt er dette design af denne særlige måde at repræsentere 106 00:05:30,350 --> 00:05:35,907 characters-- og en bestemt skrifttype der har en specifik størrelse og klangfarve, 107 00:05:35,907 --> 00:05:37,240 og der er realisering af til-- 108 00:05:37,240 --> 00:05:39,156 >> CONNOR HARRIS: Måske en bedre sammenligning ville 109 00:05:39,156 --> 00:05:43,430 være Unicode standarden says-- det giver et nummer til hver karakter, og virkelig 110 00:05:43,430 --> 00:05:46,830 alle sprog i verden, eller et stort sæt af scripts i sproget 111 00:05:46,830 --> 00:05:51,310 i verden, og derefter de er gengives i noget grafisk 112 00:05:51,310 --> 00:05:53,710 af forskellige skrifttypepakker. 113 00:05:53,710 --> 00:05:56,630 Og naturligvis, kan du tænke på MIDI som Unicode af lyd. 114 00:05:56,630 --> 00:06:03,250 Og det er bare en liste of-- en stor strøm af begivenheder og instrumenter og whatnot, 115 00:06:03,250 --> 00:06:06,090 og du skal have en separat program, ligesom en skrifttype, 116 00:06:06,090 --> 00:06:08,537 at gøre dette i noget, der 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 funktionel programmering sprog, meget avanceret, 120 00:06:19,110 --> 00:06:22,770 meget forskellig fra C, meget forskellig fra PHP. 121 00:06:22,770 --> 00:06:28,120 Og vi kommer til at se, at der er en let sammensat funktion i Haskell 122 00:06:28,120 --> 00:06:37,640 der vil tillade os at brise gennem komponere eller skrive op, transskribere, 123 00:06:37,640 --> 00:06:42,160 noget som Frere Jacques, denne enkle sang, 124 00:06:42,160 --> 00:06:46,815 har en masse dele i den, er selv-lignende eller gentage. 125 00:06:46,815 --> 00:06:49,740 126 00:06:49,740 --> 00:06:53,250 Så det vil være nogle af motivationen for hvorfor 127 00:06:53,250 --> 00:06:59,400 vi bruger Haskell, hvor funktioner er første klasses borgere. 128 00:06:59,400 --> 00:07:01,120 >> Og jeg ønskede at udvide dette en smule. 129 00:07:01,120 --> 00:07:08,800 Det er en lille smule let at notate Frere Jacques i Haskell. 130 00:07:08,800 --> 00:07:12,100 Men hvad nu, hvis vi ønskede at tilføje en tromle del heraf? 131 00:07:12,100 --> 00:07:17,320 Hvad hvis vi ønskede at forsøge at gøre noget som en Roland 808 eller 909 tromle 132 00:07:17,320 --> 00:07:20,970 maskine, hvor du har omkring 16 forskellige trin? 133 00:07:20,970 --> 00:07:24,590 Normalt disse er tænkt som 16. noter. 134 00:07:24,590 --> 00:07:28,640 Og du kan styre den globale tempo, og du kan udvælge 135 00:07:28,640 --> 00:07:34,620 en masse forskellige percussion dele af stortromme, en klap, forskellige snarer, 136 00:07:34,620 --> 00:07:37,540 åbne og lukkede høje hatte på disse slags kanaler, 137 00:07:37,540 --> 00:07:41,600 og derefter kan du EQ eller justere deres volumen. 138 00:07:41,600 --> 00:07:45,290 >> Og vi vil se en pæn måde Haskell repræsentere dette trin 139 00:07:45,290 --> 00:07:48,810 sequencer med alle de forskellige seje ting i Haskell 140 00:07:48,810 --> 00:07:53,100 vi kan gøre med at generere lister og filtrering end lister, 141 00:07:53,100 --> 00:07:56,060 kortlægning i lister, kortlægning Funktioner, der går lister. 142 00:07:56,060 --> 00:07:59,530 143 00:07:59,530 --> 00:08:00,760 Og en hurtig undskyldning. 144 00:08:00,760 --> 00:08:05,300 Dette er en meget overfladisk og alt for hurtig skitse 145 00:08:05,300 --> 00:08:07,620 nogle af de aspekter, for Haskell og Euterpea, 146 00:08:07,620 --> 00:08:11,760 som er et domæne-specifik indlejret sprog 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å er du tjekke koden online. 149 00:08:17,350 --> 00:08:22,404 Fyr op GHCI, som er Glasgow Haskell Compiler tolk. 150 00:08:22,404 --> 00:08:24,320 Og jeg vil gøre nogle dette i en lille smule 151 00:08:24,320 --> 00:08:25,880 så du kan se, hvordan det gøres. 152 00:08:25,880 --> 00:08:31,021 >> Og dette giver dig mulighed for at indlæse ind med til-- syntaksen er kolon og derefter 153 00:08:31,021 --> 00:08:31,520 kommandoen. 154 00:08:31,520 --> 00:08:33,510 Du kan indlæse i filer. 155 00:08:33,510 --> 00:08:36,840 Du kan bruge gennemse på disse filer at se alle de funktioner, der 156 00:08:36,840 --> 00:08:39,169 eksisterer i et bestemt modul. 157 00:08:39,169 --> 00:08:43,850 Og derefter som vi vil se, typer og typen klasser er så vigtige i Haskell, 158 00:08:43,850 --> 00:08:48,850 så du kan altid check-- især hvis du arbejder i en ny dscl krævede 159 00:08:48,850 --> 00:08:51,600 som dette, hvad er en musik type? 160 00:08:51,600 --> 00:08:55,114 Jeg ved, om den måde, numerisk typer arbejde i Haskell, 161 00:08:55,114 --> 00:08:56,530 men jeg ved ikke meget om musik. 162 00:08:56,530 --> 00:09:01,280 Men du kan udforske den måde, de er defineres ved hjælp af denne t eller type kommando 163 00:09:01,280 --> 00:09:04,577 og derefter kalde i et bestemt funktion eller et dataobjekt. 164 00:09:04,577 --> 00:09:05,410 CONNOR HARRIS: Ja. 165 00:09:05,410 --> 00:09:09,820 Hvis du troede, C og Dunk var hardass om typer, 166 00:09:09,820 --> 00:09:11,230 du har ingen idé om Haskell. 167 00:09:11,230 --> 00:09:14,230 Det gode ved Haskell er, at hvis du kan få din kode til at kompilere 168 00:09:14,230 --> 00:09:16,790 og hvis Haskell prototype, det er nok rigtigt, 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: Ja. 171 00:09:20,090 --> 00:09:21,980 Så jeg vil bare gå through-- og igen, 172 00:09:21,980 --> 00:09:27,160 dette er ikke at gøre det justice-- et par af funktionerne i Haskell, at mindst 173 00:09:27,160 --> 00:09:31,780 til sin creators-- og det blev oprettet i slutningen af ​​1980'erne af en flok mennesker, 174 00:09:31,780 --> 00:09:34,610 et udvalg på omkring 20 people-- troede var vigtige. 175 00:09:34,610 --> 00:09:36,850 Og den første ting, de opført i et papir, 176 00:09:36,850 --> 00:09:41,890 beskrev tilblivelsen af ​​Haskell i løbet af de første 20 år eller deromkring 177 00:09:41,890 --> 00:09:43,390 var, at det var doven. 178 00:09:43,390 --> 00:09:44,990 Så hvad betyder det? 179 00:09:44,990 --> 00:09:49,860 >> Tja, betyder det, når vi har en slags udtryksform, er vi nødt til at evaluere den. 180 00:09:49,860 --> 00:09:54,390 Og Haskell gør dette i et opkald ved behov måde eller en ikke-streng måde. 181 00:09:54,390 --> 00:09:57,250 Det vil sige, hvis vi har en flok komponenter i vores ekspression, 182 00:09:57,250 --> 00:10:00,660 vi forsøger at forsinke evaluering af disse underkomponenter 183 00:10:00,660 --> 00:10:05,300 indtil absolut sidste minute-- der er indtil vi faktisk har brug for dem. 184 00:10:05,300 --> 00:10:08,480 >> Så denne means-- som er virkelig cool, især 185 00:10:08,480 --> 00:10:13,200 hvis vi tænker på indvinding af en musikalsk trin sequencer. 186 00:10:13,200 --> 00:10:16,740 Du tænder den, og du begynder kører et skridt sequence-- 187 00:10:16,740 --> 00:10:20,010 hvis du nogensinde har arbejdet med en tromle machine-- og det bare går for evigt. 188 00:10:20,010 --> 00:10:24,650 Så det ville være rigtig rart, hvis vi kunne efterligne det i Haskell. 189 00:10:24,650 --> 00:10:31,040 Og vi kan gøre det med uendelig værdier, især uendelige lister. 190 00:10:31,040 --> 00:10:35,860 Det er meget nemt at skrive et uendelige liste i Haskell. 191 00:10:35,860 --> 00:10:39,230 Du kunne bare bruge syntaksen ned her, hvor du ser 1 til 3, 192 00:10:39,230 --> 00:10:42,440 Fjern 3 1 prik prik, og der er en uendelig liste 193 00:10:42,440 --> 00:10:46,960 af alle naturlige tal, der strækker sig på så langt som du kan forestille dig. 194 00:10:46,960 --> 00:10:49,925 >> Jeg ønsker at indføre en Begrebet folder med det samme. 195 00:10:49,925 --> 00:10:51,800 Og igen, formålet med dette seminar er ikke 196 00:10:51,800 --> 00:10:55,770 at lære om folder i Haskell eller højere ordens funktioner. 197 00:10:55,770 --> 00:10:59,640 Men jeg vil bare at introducere det til give en nøjagtig fornemmelse af, hvordan underligt 198 00:10:59,640 --> 00:11:03,700 Haskell er, og hvordan magtfulde det er. 199 00:11:03,700 --> 00:11:08,000 Og i særdeleshed, vi kommer til at være-- når vi gør vores forskellige tromme dele, 200 00:11:08,000 --> 00:11:12,790 vi kommer til at være manipulere lister over numre, folde dem på hinanden. 201 00:11:12,790 --> 00:11:17,290 Og for at gøre det, vi får være at bruge kort og folder. 202 00:11:17,290 --> 00:11:21,770 >> Der er en ret associativ fold, som er denne ene ret 203 00:11:21,770 --> 00:11:26,990 her-- 1 minus den mængde, 2 minus den mængde, 3 minus 0. 204 00:11:26,990 --> 00:11:29,170 Og syntaksen for en fold, du giver en fold 205 00:11:29,170 --> 00:11:34,680 en base værdi og derefter en operation-- i dette tilfælde, addition eller subtraktion. 206 00:11:34,680 --> 00:11:36,280 Jeg har vist begge tilfælde. 207 00:11:36,280 --> 00:11:41,760 Og så er der en akkumulator, der akkumuleres over hele listen, 208 00:11:41,760 --> 00:11:46,330 at anvende denne operatør plus eller minus, og derefter akkumulere det. 209 00:11:46,330 --> 00:11:52,680 Så dette vil være til-- hvis det blev kaldt med fold r plus på 0, startende med 0, 210 00:11:52,680 --> 00:11:54,720 vi ville så opsummere alle tallene i 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å sagt på en anden måde, fold r tager tre argumenter. 213 00:12:00,050 --> 00:12:02,540 Der er en funktion, som selv tager to argumenter, 214 00:12:02,540 --> 00:12:05,400 så er der en forret værdi, og der er en liste over værdier. 215 00:12:05,400 --> 00:12:08,570 Og hvad du skal gøre er at tage forret værdi, første værdi, 216 00:12:08,570 --> 00:12:09,850 lægges i funktionen. 217 00:12:09,850 --> 00:12:11,607 Hvad får du ud, tage det, foder, 218 00:12:11,607 --> 00:12:13,940 i funktionen af anden værdi, hvad du får ud, 219 00:12:13,940 --> 00:12:16,690 tage det, fodre det ind i funktion af den tredje værdi. 220 00:12:16,690 --> 00:12:18,740 Og derefter, hvis du går ned Hele denne liste på denne måde, 221 00:12:18,740 --> 00:12:22,970 du kommer til at få i sidste ende nogle ental værdi, der er 222 00:12:22,970 --> 00:12:25,720 af samme type, hvad du startede med og af samme type 223 00:12:25,720 --> 00:12:29,147 som tingene på listen, og derefter det er afkastet resultat af fold R. 224 00:12:29,147 --> 00:12:31,980 STEPHEN KREWSON: Så i særdeleshed, disse er højere ordens funktioner, 225 00:12:31,980 --> 00:12:34,460 fordi de tager en anden funktion som et af argumenterne. 226 00:12:34,460 --> 00:12:34,770 >> CONNOR HARRIS: Ja. 227 00:12:34,770 --> 00:12:37,820 Hvis du har brugt visse andre languages-- jeg ved R, [uhørligt] 228 00:12:37,820 --> 00:12:41,510 sprog har det, der kaldes Reducer. 229 00:12:41,510 --> 00:12:45,460 Du har måske tilsvarende funktioner på andre sprog, bare kaldet 230 00:12:45,460 --> 00:12:48,160 forskellige ting. 231 00:12:48,160 --> 00:12:50,680 >> STEPHEN KREWSON: Og hvad der er rart om fold R 232 00:12:50,680 --> 00:12:53,880 i dette tilfælde er, at fold R kan arbejde med uendelige lister. 233 00:12:53,880 --> 00:12:59,490 Så på denne bund, dette P5 genererer de noter, 234 00:12:59,490 --> 00:13:03,120 tændes i trin sequencer for nogle tromledel, femte tromle del, 235 00:13:03,120 --> 00:13:05,480 og måske er det en conga drum eller noget. 236 00:13:05,480 --> 00:13:09,719 Og dette er en bevidst stump måde at skrive dette, 237 00:13:09,719 --> 00:13:11,510 men det er sjovt, fordi det viser en masse 238 00:13:11,510 --> 00:13:14,460 ting om Haskell og Euterpea. 239 00:13:14,460 --> 00:13:20,650 >> Så fold R af denne colon-- kolon er bare en operatør, der skubber ting 240 00:13:20,650 --> 00:13:25,700 sammen på en list-- opfordrede en tom liste, som er lige de tomme parenteser. 241 00:13:25,700 --> 00:13:28,250 Og jeg ringer, at på denne uendelige liste. 242 00:13:28,250 --> 00:13:31,570 Dette er faktisk to lister lægges sammen hernede. 243 00:13:31,570 --> 00:13:37,150 Listen 1 komma 6 prik prik er 1, 6, 11, 16. 244 00:13:37,150 --> 00:13:39,750 Så Haskell-- i blot nogle få tegn, du 245 00:13:39,750 --> 00:13:42,420 kan generere hele talsekvens 246 00:13:42,420 --> 00:13:46,240 der er fem tal fra hinanden strækker sig på i det uendelige. 247 00:13:46,240 --> 00:13:49,860 Og jeg tilføjes i begyndelsen til at denne kortere lille list-- 248 00:13:49,860 --> 00:13:54,370 3, 8, 21-- bare for at vise dig hvordan du kan sammenkæde lister. 249 00:13:54,370 --> 00:13:55,790 >> Og så har jeg foldet på sig selv. 250 00:13:55,790 --> 00:14:01,510 Og det ender bare at være en slags identitet operation, men det er uendeligt. 251 00:14:01,510 --> 00:14:06,070 Og fold R kan gøre det, fordi det lazily vurderer, som i ovenstående. 252 00:14:06,070 --> 00:14:10,582 Hvis vi har en 1 og en 2 og 3, kan vi lige bracket off hele resten af ​​det. 253 00:14:10,582 --> 00:14:12,290 Det vil ikke arbejde for fradrag eller tillæg, men det 254 00:14:12,290 --> 00:14:17,760 vil arbejde for dette kolon identitet operation på listen. 255 00:14:17,760 --> 00:14:24,620 >> Så hvordan kan vi praktisk brug, at hvis vi har en uendelig lang liste af ting? 256 00:14:24,620 --> 00:14:26,500 Nå, Haskell giver en masse functions-- 257 00:14:26,500 --> 00:14:29,450 og ser mere ind i disse i din egen time-- såsom tage 258 00:14:29,450 --> 00:14:32,200 som siger, OK, vi er generere denne uendelige liste, 259 00:14:32,200 --> 00:14:35,950 men vi bare kommer til at tage nogle Antallet af det Og i denne case-- 260 00:14:35,950 --> 00:14:38,410 vi vil se senere i vores trommemaskine code-- 261 00:14:38,410 --> 00:14:43,740 GM er blot nogle slags global variabel for antallet af trin 262 00:14:43,740 --> 00:14:44,610 i sequencer. 263 00:14:44,610 --> 00:14:47,630 På roll-i maskiner jeg viste dig, det er typisk 16, 264 00:14:47,630 --> 00:14:51,475 men jeg har gennemført det med 32. 265 00:14:51,475 --> 00:14:54,470 Det gør ikke rigtig noget. 266 00:14:54,470 --> 00:15:00,230 >> Haskell er også rent, så det har en stærk statisk skrive, at Connor hentydet til. 267 00:15:00,230 --> 00:15:03,220 Så funktioner er matematiske i sense-- 268 00:15:03,220 --> 00:15:06,600 de er mere matematisk at de er sikret 269 00:15:06,600 --> 00:15:11,530 at ikke få adgang til eller ændre nogen form for variabel eller udføre input eller output. 270 00:15:11,530 --> 00:15:14,420 Så hvis du har en funktion, det er deterministisk. 271 00:15:14,420 --> 00:15:17,400 Det vil altid returnere det samme værdi i tilstanden af ​​programmet 272 00:15:17,400 --> 00:15:19,310 eller forblive den samme. 273 00:15:19,310 --> 00:15:22,940 Der er naturligvis monadiske undtagelser til dette, men det er uden for vores rækkevidde. 274 00:15:22,940 --> 00:15:23,900 >> CONNOR HARRIS: Ja. 275 00:15:23,900 --> 00:15:26,946 Hvad dette betyder, er dog der er et par vigtige [uhørligt] 276 00:15:26,946 --> 00:15:27,820 konsekvenserne af dette. 277 00:15:27,820 --> 00:15:30,940 Den ene er, at det er meget nemt at parallelize Haskell-programmer. 278 00:15:30,940 --> 00:15:32,773 For hvis du har, sige, en funktion af denne 279 00:15:32,773 --> 00:15:36,064 nødt til at operere på en million værdier, hvis du ved, at funktionen vil altid 280 00:15:36,064 --> 00:15:39,280 give ud den samme værdi, hvis du foder på et bestemt value-- 281 00:15:39,280 --> 00:15:43,055 hvis du er [uhørligt] f 1, f af 2, så f på 3 eller whatnot-- f 1 282 00:15:43,055 --> 00:15:45,180 kommer ikke til at skrive ud til en fil eller gøre noget 283 00:15:45,180 --> 00:15:46,850 der vil ændre værdien af ​​f2. 284 00:15:46,850 --> 00:15:50,220 Du kan bare opdele denne funktion til en million forskellige maskiner eller en million 285 00:15:50,220 --> 00:15:54,720 forskellige tråde eller hvad, få alle svarene tilbage, 286 00:15:54,720 --> 00:15:56,900 få alle de afkast værdier tilbage, og så det er det. 287 00:15:56,900 --> 00:15:59,780 Så meget nemt at parallelize ting. 288 00:15:59,780 --> 00:16:03,140 >> Ulempen er, at input og output især 289 00:16:03,140 --> 00:16:05,720 passer ind i typesystemet meget komplicerede måder. 290 00:16:05,720 --> 00:16:09,010 Vi vil ikke gå ind i det lige nu, men jeg opfordre dig til at se på nogle ressourcer 291 00:16:09,010 --> 00:16:11,175 online, hvis du ønsker at lære om det. 292 00:16:11,175 --> 00:16:13,960 293 00:16:13,960 --> 00:16:16,550 >> STEPHEN KREWSON: Så skriv classes-- og dette 294 00:16:16,550 --> 00:16:21,610 was-- klasser af typer blev opfundet for at løse 295 00:16:21,610 --> 00:16:24,160 et problem med operatør overbelastning. 296 00:16:24,160 --> 00:16:27,590 Så vi ønskede at have lighed mellem forskellige typer af ting. 297 00:16:27,590 --> 00:16:31,040 Selvfølgelig kunne vi mener of-- ligestilling mellem numeriske typer 298 00:16:31,040 --> 00:16:34,720 er meget let at tænke over, men hvad med ligestilling mellem lister? 299 00:16:34,720 --> 00:16:37,610 Hvad med ligestilling mellem træ ben datastrukturer? 300 00:16:37,610 --> 00:16:43,130 Og det er alt muligt Haskell grund af typen klasser. 301 00:16:43,130 --> 00:16:48,000 >> Så hvis du definere en bestemt data Motortype- og her er disse musikalske pladser. 302 00:16:48,000 --> 00:16:50,960 Vi er endelig at få til nogle computer musik. 303 00:16:50,960 --> 00:16:57,420 Så vi har C, C skarpe, og så videre og så videre. 304 00:16:57,420 --> 00:17:01,080 De tilhører en flok forskellige typen klasser. 305 00:17:01,080 --> 00:17:03,510 EQ-- de hører til EQ-type klasse. 306 00:17:03,510 --> 00:17:06,780 Det betyder, at de støtter lighed operationer. 307 00:17:06,780 --> 00:17:12,650 Så du kan vurdere, om en sekvens af musikalske primitiver 308 00:17:12,650 --> 00:17:15,400 er det samme som en anden. 309 00:17:15,400 --> 00:17:17,280 >> De tilhører ordenstal klasse. 310 00:17:17,280 --> 00:17:19,479 Det betyder, at der er en bestilling til disse. 311 00:17:19,479 --> 00:17:27,670 D kommer efter C. C skarpe kommer efter C samt. 312 00:17:27,670 --> 00:17:29,840 De tilhører klassen viser, hvilket betyder, at de kan 313 00:17:29,840 --> 00:17:33,000 udskrives til en konsol eller terminal. 314 00:17:33,000 --> 00:17:36,090 De hører til klasse opregnet, som 315 00:17:36,090 --> 00:17:39,770 betyder, at selvom disse er tegn, 316 00:17:39,770 --> 00:17:45,340 de har en underliggende numerisk repræsentation starter ved 0 317 00:17:45,340 --> 00:17:48,960 og går ud gennem dog mange ting er her, 20 eller deromkring, 318 00:17:48,960 --> 00:17:51,770 eller 30 eller 40, måske. 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 der derives-- med det pågældende søgeord "deriving--" en bestemt type klasse, 321 00:17:57,050 --> 00:18:01,160 det betyder, at compileren vil forsøge at konstruere noget automatisk. 322 00:18:01,160 --> 00:18:05,120 Så måske du ønsker at definere en kvalitet forskelligt. 323 00:18:05,120 --> 00:18:09,450 Du ønsker at definere C skarpe lig med D flade, f.eks. 324 00:18:09,450 --> 00:18:11,560 Med denne konstruktion her, tror jeg ikke, C skarpe 325 00:18:11,560 --> 00:18:14,940 og D flade vil være lig, fordi compileren automatisk 326 00:18:14,940 --> 00:18:19,670 sige hver anden mulige værdi adskiller sig fra alle andre. 327 00:18:19,670 --> 00:18:22,930 >> Så det er muligt at tilsidesætte standardindstillingerne implementeringer 328 00:18:22,930 --> 00:18:25,730 af disse typer af klasser. 329 00:18:25,730 --> 00:18:28,640 Igen, se på henvisningen, hvis du ønsker at lære om det. 330 00:18:28,640 --> 00:18:31,767 331 00:18:31,767 --> 00:18:33,600 STEPHEN KREWSON: Og her, faktisk, det ll 332 00:18:33,600 --> 00:18:36,930 være nyttigt for når vi kode senere. 333 00:18:36,930 --> 00:18:42,150 Vi ser nogle af Infix operatører til sekventiel sammensætning, 334 00:18:42,150 --> 00:18:46,570 parallel sammensætning, og så frem, disse plusser og lighedstegn 335 00:18:46,570 --> 00:18:48,620 omgivet af koloner. 336 00:18:48,620 --> 00:18:53,330 Det betyder, at vi kan spille disse forskellige musikalske primitiver ene efter den anden. 337 00:18:53,330 --> 00:18:54,590 Det er sekventiel sammensætning. 338 00:18:54,590 --> 00:18:57,170 >> Eller vi kan spille dem i parallelt på samme tid. 339 00:18:57,170 --> 00:19:05,100 Så jeg kan få en musikalsk værdi, og så svarer det og koloner, 340 00:19:05,100 --> 00:19:09,669 Infix parallel sammensætning operatør, og afspille dem som en slags akkord. 341 00:19:09,669 --> 00:19:11,460 Og vi kommer til at bruge dette, når vi kombinerer 342 00:19:11,460 --> 00:19:15,080 vores tromle del med vores lille Frere Jacques sang 343 00:19:15,080 --> 00:19:19,460 at spille disse to sekvenser af musikalske værdier på samme tid. 344 00:19:19,460 --> 00:19:24,520 345 00:19:24,520 --> 00:19:29,250 >> Beredningsmetode is-- Curry var sidst navn for Haskell Curry, som 346 00:19:29,250 --> 00:19:31,850 det Haskell billedet er opkaldt efter. 347 00:19:31,850 --> 00:19:34,330 Og det giver os en dejlig elegance, når vi er 348 00:19:34,330 --> 00:19:36,880 skrive alle disse forskellige funktioner eller filtre, som vi er 349 00:19:36,880 --> 00:19:39,330 vil være kortlægning over vores lister. 350 00:19:39,330 --> 00:19:42,810 En funktion af to arguments-- f af x og y-- 351 00:19:42,810 --> 00:19:46,630 kan repræsenteres som f af x til y anvendes. 352 00:19:46,630 --> 00:19:49,800 Så det er en funktion af et argument, der returnerer 353 00:19:49,800 --> 00:19:51,240 en anden funktion af et argument. 354 00:19:51,240 --> 00:19:56,962 Så det betyder, at vi kan kortlægge en funktion f af x i listen af ​​y s. 355 00:19:56,962 --> 00:19:58,920 CONNOR HARRIS: Ønsker du at give et eksempel på dette? 356 00:19:58,920 --> 00:19:59,836 STEPHEN KREWSON: Ja. 357 00:19:59,836 --> 00:20:05,390 Jeg har et eksempel her fra nogle af de ting, vi vil skrive. 358 00:20:05,390 --> 00:20:10,500 Så kopiere 2-- godt, replikere vil tage 359 00:20:10,500 --> 00:20:13,040 én værdi, som er hvor mange gange for at replikere noget, 360 00:20:13,040 --> 00:20:16,690 og så vil det tage et value-- normalt en liste eller noget. 361 00:20:16,690 --> 00:20:23,450 Så her er vi kortlægning replikere 2 over en anden liste. 362 00:20:23,450 --> 00:20:27,440 >> Så hvis vi kort replikere 2, hvis vi replikere 2 anvendelse 363 00:20:27,440 --> 00:20:31,890 til det første element i denne list-- og disse er lister over musikalske phrases-- 364 00:20:31,890 --> 00:20:37,650 vil producere to af "du sleeping--" så er du sover, er du sover. 365 00:20:37,650 --> 00:20:40,040 Så nu har vi to. 366 00:20:40,040 --> 00:20:42,570 Men replikere tager to argumenter, men fordi vi er 367 00:20:42,570 --> 00:20:47,100 beredningsmetode og derefter kortlægning, Vi kan repræsentere replikere 2 368 00:20:47,100 --> 00:20:52,310 som er blevet sendt tilbage som en funktion af en argument-- lige replikerende to gange. 369 00:20:52,310 --> 00:20:57,010 Og så er vi anvende denne til hver element i denne liste over sætninger. 370 00:20:57,010 --> 00:21:01,900 >> Og concat er et Haskell operation for udfladning en liste. 371 00:21:01,900 --> 00:21:04,400 Fordi replikat 2 vilje producere en liste af lister. 372 00:21:04,400 --> 00:21:06,660 Og det er denne mellemform her. 373 00:21:06,660 --> 00:21:10,365 Og så kan vi concat eller flade det ud to gange. 374 00:21:10,365 --> 00:21:12,240 CONNOR HARRIS: En enklere eksempel på beredningsmetode, 375 00:21:12,240 --> 00:21:15,323 hvis du like-- forestille f er blot en multiplikation funktion, der tager 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 tænke på dette som also-- du har en funktion f 4 379 00:21:22,670 --> 00:21:25,560 der tager et argument og returnerer fire gange dette argument-- bare 380 00:21:25,560 --> 00:21:27,870 delvis anvendelse som kun et argument 4. 381 00:21:27,870 --> 00:21:31,182 Og hvis du fodrer f af 4 5, vil der giver dig 20. 382 00:21:31,182 --> 00:21:32,890 Og det er en enklere eksempel på beredningsmetode. 383 00:21:32,890 --> 00:21:34,473 Det er normalt en af ​​lærebogen dem. 384 00:21:34,473 --> 00:21:38,860 385 00:21:38,860 --> 00:21:42,110 >> STEPHEN KREWSON: Lambda udtryk eller anonyme funktioner 386 00:21:42,110 --> 00:21:47,330 er en anden Haskell adelsmærke. 387 00:21:47,330 --> 00:21:51,242 Så hvis vi har brug for at piske en lille funktion liv replikere, 388 00:21:51,242 --> 00:21:52,950 men sige, det er ikke i standard bibliotek, 389 00:21:52,950 --> 00:21:56,150 vi kan bruge en syntaks svarende til følgende. 390 00:21:56,150 --> 00:21:58,730 Og vi vil vind i løbet af dette. 391 00:21:58,730 --> 00:22:02,160 Én ting du vil se en masse i trommemaskine er vi foretage opkald 392 00:22:02,160 --> 00:22:05,790 til noget, der hedder Filter, der ligesom før, 393 00:22:05,790 --> 00:22:08,185 er en kortlægning af en funktion over en liste, men det er 394 00:22:08,185 --> 00:22:10,260 en kortlægning af en boolesk funktion. 395 00:22:10,260 --> 00:22:13,390 >> Så vi har her et eksempel af en anonymt 396 00:22:13,390 --> 00:22:19,150 defineret Boolsk funktion, bare tager et par værdier. 397 00:22:19,150 --> 00:22:22,990 Det er ikke strengt taget en anonym funktion. 398 00:22:22,990 --> 00:22:25,850 Men det er definere med at syntaksen for kortfattethed, 399 00:22:25,850 --> 00:22:28,007 og dette tager bare x modul n- 400 00:22:28,007 --> 00:22:28,840 CONNOR HARRIS: Ja. 401 00:22:28,840 --> 00:22:31,330 Så f er en funktion af to argumenter N og P 402 00:22:31,330 --> 00:22:35,440 der returnerer en funktion, der i sig selv er en funktion af et argument, nemlig x. 403 00:22:35,440 --> 00:22:38,815 404 00:22:38,815 --> 00:22:40,690 STEPHEN KREWSON: Jeg sidstnaevnte Infix operatører. 405 00:22:40,690 --> 00:22:42,642 Hvad er Infix operatører? 406 00:22:42,642 --> 00:22:45,710 Nå, Infix operatører er normal måde, vi repræsenterer operationer, 407 00:22:45,710 --> 00:22:49,910 sige, i mathematics-- 2 plus 2 i stedet for operatørens plus 408 00:22:49,910 --> 00:22:51,202 og derefter to argumenter 2 og 2. 409 00:22:51,202 --> 00:22:53,701 CONNOR HARRIS: Det hedder omvendt polsk notation, som er 410 00:22:53,701 --> 00:22:55,330 et begreb jeg tvivler nogen af ​​jer ville vide. 411 00:22:55,330 --> 00:22:56,288 >> STEPHEN KREWSON: Right. 412 00:22:56,288 --> 00:22:58,290 Omvendt polsk eller præfiks notation. 413 00:22:58,290 --> 00:23:01,412 Men Haskell besluttet at bruge Infix operatører. 414 00:23:01,412 --> 00:23:03,120 Så dette er nogle af de brugerdefinerede dem, 415 00:23:03,120 --> 00:23:07,770 er defineret for Euterpea dscl krævede i Haskell. 416 00:23:07,770 --> 00:23:10,730 Så det var sekventielle sammensætning. 417 00:23:10,730 --> 00:23:16,340 Dette var parallelt sammensætning, og dette blev trunkering parallel sammensætning. 418 00:23:16,340 --> 00:23:18,710 Og vi har brug for, at med vores trommemaskine, 419 00:23:18,710 --> 00:23:22,640 fordi vi vil bruge den sidste operatør i den lille tupel der 420 00:23:22,640 --> 00:23:26,330 at spille trommemaskine langs med vores Frere Jacques sang. 421 00:23:26,330 --> 00:23:28,650 Og vores trommemaskine er vil være uendelig. 422 00:23:28,650 --> 00:23:30,920 Det bare spiller for evigt. 423 00:23:30,920 --> 00:23:32,692 Men Frere Jacques sang er ikke. 424 00:23:32,692 --> 00:23:33,510 Det er ikke så længe. 425 00:23:33,510 --> 00:23:36,610 Det er kun et par barer. 426 00:23:36,610 --> 00:23:43,030 Så vi er nødt til at stoppe trommemaskine som snart kortere musikalske værdi kommer 427 00:23:43,030 --> 00:23:43,700 til ophør. 428 00:23:43,700 --> 00:23:46,980 Og at infixed operatør er super hjælpsom med at. 429 00:23:46,980 --> 00:23:50,090 >> Og Infix notation som dette er slags nice, 430 00:23:50,090 --> 00:23:57,095 fordi sige du har en funktion som tilbud, som giver heltalsdivision 431 00:23:57,095 --> 00:24:01,010 x af noget else-- undskyld, der skulle være a og b. 432 00:24:01,010 --> 00:24:04,740 Du kunne skrive det som et citat af b. 433 00:24:04,740 --> 00:24:09,670 Så hvis du put-- element er et andet eksempel på dette. 434 00:24:09,670 --> 00:24:14,730 x element i nogle liste, hvis du lægger det i skråstreger, kan du bruge det. 435 00:24:14,730 --> 00:24:20,400 Selvom det ikke er et symbol ligesom plus eller minus eller gange, 436 00:24:20,400 --> 00:24:24,630 kan du bruge navnet på en funktion som den i skråstreger 437 00:24:24,630 --> 00:24:27,045 som Infix operatør, som er temmelig cool. 438 00:24:27,045 --> 00:24:29,670 CONNOR HARRIS: Igen, dette er alle bare syntaktisk sukker, virkelig. 439 00:24:29,670 --> 00:24:32,310 Det påvirker ikke kernen i sproget. 440 00:24:32,310 --> 00:24:37,440 >> STEPHEN KREWSON: Så vi ser her til sidste sætning i vores Frere Jacques sang, 441 00:24:37,440 --> 00:24:45,740 Jeg spillede nogle små akkorder eller tredjedele ved hjælp af parallelle sammensætning 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 anden måde at sige noget af, hvad vi har netop siger. 445 00:24:54,950 --> 00:24:59,986 Så du kan kortlægge funktioner af et argument i listerne. 446 00:24:59,986 --> 00:25:02,860 CONNOR HARRIS: Igen, referencer for Haskell-- indledende lærebøger 447 00:25:02,860 --> 00:25:04,680 får alt dette i det. 448 00:25:04,680 --> 00:25:07,790 >> STEPHEN KREWSON: Så her er en temmelig centrale linje i trin sequencer 449 00:25:07,790 --> 00:25:12,820 Vi vil tage et kig på ved hjælp en liste forståelse. 450 00:25:12,820 --> 00:25:17,810 Og vi ser her, er, at elementet i fast operatør i ryg anførselstegn. 451 00:25:17,810 --> 00:25:23,030 Så hvis x er et element i listen over X'er, så vi ringer op PERC funktioner. 452 00:25:23,030 --> 00:25:25,100 Så perc er blot en percussion-funktion. 453 00:25:25,100 --> 00:25:30,200 Det tager en vis værdi p, der er del af den afgrænsede sæt af alle 454 00:25:30,200 --> 00:25:35,310 de forskellige percussion lyde at vi så i et tidligere dias, 455 00:25:35,310 --> 00:25:38,840 og derefter det giver, at Varigheden af ​​en kvart tone. 456 00:25:38,840 --> 00:25:43,190 Ellers giver det en QNR-, og QNR- er blot en kvart tone hvile. 457 00:25:43,190 --> 00:25:44,970 >> Så dette er at opbygge noget rart. 458 00:25:44,970 --> 00:25:52,110 Vi har en liste over elementer, og vi får loop over nogle liste fra én 459 00:25:52,110 --> 00:25:54,540 til max værdien af ​​vores trin sequencer. 460 00:25:54,540 --> 00:25:58,290 Og når vi er på et bestemt i i denne liste over den ene til den max værdi, 461 00:25:58,290 --> 00:26:02,970 hvis jeg er medlem af denne sæt skabt i denne funktion, 462 00:26:02,970 --> 00:26:06,040 ja, så vender vi det ind i en percussion note. 463 00:26:06,040 --> 00:26:10,960 Ellers, vi bare spille en hvile, som Det vil sige, vi bare tie. 464 00:26:10,960 --> 00:26:16,050 Og vi kan se her, at der i denne liste forståelse syntaks, 465 00:26:16,050 --> 00:26:20,030 X er befolket af dette liste bygget en 466 00:26:20,030 --> 00:26:22,462 til den globale størrelse sequencer. 467 00:26:22,462 --> 00:26:23,295 CONNOR HARRIS: Ja. 468 00:26:23,295 --> 00:26:26,340 Den grundlæggende syntaks for liste forståelser er 469 00:26:26,340 --> 00:26:30,810 beslag, værdi involverer nogle variabler, bar, 470 00:26:30,810 --> 00:26:34,260 mulige værdier af variablerne selv lukkede beslag. 471 00:26:34,260 --> 00:26:38,545 Og hvis du har gjort indstillet builder notation i nogen form for matematik klasse, 472 00:26:38,545 --> 00:26:45,999 du måske har indstillet 2n sådan at n er i eller n er i z. 473 00:26:45,999 --> 00:26:48,290 Lignende thing-- denne notation menes at være suggestive 474 00:26:48,290 --> 00:26:49,630 af denne matematiske notation. 475 00:26:49,630 --> 00:26:51,880 STEPHEN KREWSON: Og du kan anvende flere prædikater 476 00:26:51,880 --> 00:26:56,250 og flere filtre i en liste forståelse, som er helt rart. 477 00:26:56,250 --> 00:27:01,800 Algebraisk types-- vi vil ikke dvæle længe her. 478 00:27:01,800 --> 00:27:04,840 Der er ikke en god idé i Haskell eller en god, indlysende begreb 479 00:27:04,840 --> 00:27:10,720 af hvordan man kan tage, siger, en standard parameter til en funktion eller noget. 480 00:27:10,720 --> 00:27:13,370 I Python, det er ganske nemt. 481 00:27:13,370 --> 00:27:18,460 Du kan bare sige med lig på erklæringen af ​​funktionen, 482 00:27:18,460 --> 00:27:21,420 en standard værdi på tilfælde ingen er leveret. 483 00:27:21,420 --> 00:27:27,010 >> I Haskell, kunne du måske bruge måske den måske skrive, 484 00:27:27,010 --> 00:27:32,190 som tager enten ingenting eller en værdi af typen blot en. 485 00:27:32,190 --> 00:27:38,630 Så vi udnytte dette i trommemaskine at tillade os at give valgfri volumen 486 00:27:38,630 --> 00:27:40,730 parametre til hver af de trommefigurer. 487 00:27:40,730 --> 00:27:46,160 488 00:27:46,160 --> 00:27:54,680 Så det giver os en måde at have EQ eller et volumen 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 måske bruges til funktioner, der kan svigte. 491 00:28:00,450 --> 00:28:03,470 Dette er et almindeligt. 492 00:28:03,470 --> 00:28:07,010 >> STEPHEN KREWSON: Og du kan levere en slags fejlmeddelelse som standard. 493 00:28:07,010 --> 00:28:11,020 Og det er især praktisk, når du laver I / O i Haskell. 494 00:28:11,020 --> 00:28:12,044 Det kan være tricks. 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 for en funktion, der involverer division af en parameter, der kan være 0. 497 00:28:17,460 --> 00:28:20,020 Og denne funktion kunne returnere måske uanset hvad. 498 00:28:20,020 --> 00:28:22,802 Så hvis der er ingen division med 0, det vil vende tilbage lige uanset hvad. 499 00:28:22,802 --> 00:28:25,010 Og hvis der er division med 0, vil den vende tilbage ingenting 500 00:28:25,010 --> 00:28:26,910 som en måde til at signalere fejlen. 501 00:28:26,910 --> 00:28:30,330 Fordi en konsekvens af Haskell er meget strenge maskinskrivning 502 00:28:30,330 --> 00:28:34,100 er, at der ikke er nogen real-- undtagelser er akavet, dybest set, 503 00:28:34,100 --> 00:28:36,160 fejlhåndtering er akavet. 504 00:28:36,160 --> 00:28:39,440 Og det er en meget almindelig måde at gøre det. 505 00:28:39,440 --> 00:28:42,990 >> STEPHEN KREWSON: Så nu får vi til en anden hjernevridende ting 506 00:28:42,990 --> 00:28:49,160 om Haskell, som er mønstret matchende og funktionsdefinitioner. 507 00:28:49,160 --> 00:28:53,390 Jeg viste dig i det sidste dias i erklæring fra trin sekvens 508 00:28:53,390 --> 00:28:58,170 funktion, som tog en måske værdi, derefter en int, så en liste over ints, 509 00:28:58,170 --> 00:29:03,850 derefter returnerer en sekvens af musik værdier der kommenteret 510 00:29:03,850 --> 00:29:05,375 med både pitch og volumen. 511 00:29:05,375 --> 00:29:08,030 512 00:29:08,030 --> 00:29:11,820 >> Så disse tre argumenter kan være mønster matches på følgende måde. 513 00:29:11,820 --> 00:29:16,660 Og vi altid ønsker at være sikker på at gøre en base sag eller exit sag først. 514 00:29:16,660 --> 00:29:19,690 Og disse understregninger kan bare tolkes 515 00:29:19,690 --> 00:29:22,340 forstås enhver værdi, der er der. 516 00:29:22,340 --> 00:29:26,580 Så hvis vi får et opkald til trin sekvens med en vis værdi, en anden værdi, 517 00:29:26,580 --> 00:29:32,210 og derefter den tomme liste, hvad vi ønsker at vende tilbage er blot stilhed, en resten 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 hvile 0, fordi vi er beskæftiger sig med musikken type, 520 00:29:38,150 --> 00:29:43,230 og den tomme liste over musikken type er blot en resten af ​​nogen varighed. 521 00:29:43,230 --> 00:29:45,680 Det er ingen musik. 522 00:29:45,680 --> 00:29:51,460 Og så ser vi, hvis vi får et trin sekvens med en v for volumen argument, 523 00:29:51,460 --> 00:29:57,290 p for sikkerhedsforanstaltning instrument argument, og derefter en liste over X'er. 524 00:29:57,290 --> 00:29:58,360 >> Så vi gøre nogle ting. 525 00:29:58,360 --> 00:30:01,290 Især anvender vi denne liste forståelsen, 526 00:30:01,290 --> 00:30:05,700 og vi udføre nogle operationer på måske værdi 527 00:30:05,700 --> 00:30:10,050 at gøre det til en numerisk værdi, så det kunne derefter optælles og anvendes 528 00:30:10,050 --> 00:30:12,300 at vælge instrumentet. 529 00:30:12,300 --> 00:30:16,730 Igen, dette er en lille bit bevidst inconcise 530 00:30:16,730 --> 00:30:20,580 bare for at vise alle de underlige ting du kan gøre i Haskell, som du 531 00:30:20,580 --> 00:30:23,170 tage et kig på det på din egen tid. 532 00:30:23,170 --> 00:30:23,802 >> Okay. 533 00:30:23,802 --> 00:30:26,010 Så vi endelig komme til gøre, hvad vi satte sig for at gøre, 534 00:30:26,010 --> 00:30:28,820 som er gøre nogle computer musik. 535 00:30:28,820 --> 00:30:32,250 Så vi kommer til at forsøge at gøre Frere Jacques sang. 536 00:30:32,250 --> 00:30:35,220 Så der er hvor mange sætninger 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 Alle tiders. 540 00:30:40,460 --> 00:30:42,490 Og hvad er rart, er, at de er alle gentaget 541 00:30:42,490 --> 00:30:46,990 det samme antal gange, hvilket er to. 542 00:30:46,990 --> 00:30:50,730 >> Så vi har fire sætninger hver gentaget to gange. 543 00:30:50,730 --> 00:30:53,590 Og i særdeleshed, de er i en runde. 544 00:30:53,590 --> 00:30:55,340 Og der er mange, mange måder at gennemføre 545 00:30:55,340 --> 00:30:57,520 en runde, der kunne være sjovt at gøre. 546 00:30:57,520 --> 00:31:00,260 Jeg har gjort det i en temmelig simpel måde her, 547 00:31:00,260 --> 00:31:05,760 der blot at construct-- linjen funktion tager en liste af musik værdier 548 00:31:05,760 --> 00:31:10,390 og forvandler det til sekventiel sammensætning ved at anvende den sekventielle sammensætning 549 00:31:10,390 --> 00:31:13,000 operatør. 550 00:31:13,000 --> 00:31:19,540 >> Og så er jeg forsinke de forskellige dele ved at gøre dem begynde med en pause. 551 00:31:19,540 --> 00:31:22,770 Så jeg starter med en resten af ​​to foranstaltninger, og derefter en resten af ​​fire foranstaltninger, 552 00:31:22,770 --> 00:31:26,160 og derefter en resten af ​​seks foranstaltninger, og derefter runde 553 00:31:26,160 --> 00:31:32,290 værker, som vi alle ved denne sang. 554 00:31:32,290 --> 00:31:37,180 Vi ser to anmærkninger eller ændringer af musik værdier 555 00:31:37,180 --> 00:31:43,150 der er indeholdt i denne sekventielle arrangement af musik elementer. 556 00:31:43,150 --> 00:31:44,810 Vi har en add volumen. 557 00:31:44,810 --> 00:31:48,960 Dette er en funktion at anmærke musik med en bestemt mængde. 558 00:31:48,960 --> 00:31:51,320 Dette er et godt eksempel af et MIDI-signal kørende 559 00:31:51,320 --> 00:31:57,510 fra 0 til 127, de syv bits af oplysninger, der kan udføres. 560 00:31:57,510 --> 00:32:00,650 >> Og then-- vi så det meget kort, men den generelle MIDI 561 00:32:00,650 --> 00:32:02,310 liste over alle de forskellige instrumenter. 562 00:32:02,310 --> 00:32:04,450 Og der er ikke en hel masse af dem. 563 00:32:04,450 --> 00:32:11,230 Hvis du bruger en digital audio workstation, ligesom Ableton Live eller Pro Tools, 564 00:32:11,230 --> 00:32:17,560 Der er en utrolig bredere vifte af synthesizere og VST instrumenter. 565 00:32:17,560 --> 00:32:21,510 Men kun MIDI standarden har et par stykker, eller flere dusin. 566 00:32:21,510 --> 00:32:22,799 Og nogle af dem er sjove. 567 00:32:22,799 --> 00:32:25,840 Jeg troede det ville være sjovt, hvis vi spillede instrumentet MIDI-instrumentet 568 00:32:25,840 --> 00:32:30,550 helikopter, og derefter næste vej gennem runde, 569 00:32:30,550 --> 00:32:37,980 vi gjorde en pude synth, og så denne corny bly firkantbølge synth, 570 00:32:37,980 --> 00:32:44,240 og derefter stemme sive, som er en lidt 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 denne lad og i syntaksen fra Haskell, 573 00:32:50,030 --> 00:32:54,030 og så er vi spiller alle disse dele sammen 574 00:32:54,030 --> 00:32:56,265 med den parallelle præparat operatøren. 575 00:32:56,265 --> 00:33:00,260 576 00:33:00,260 --> 00:33:02,296 Og vi kunne sandsynligvis vise nogle af 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, ville der være en masse halsen clearing og indstilling 580 00:33:14,960 --> 00:33:19,760 tabellen koden, før du kunne lave musik som denne. 581 00:33:19,760 --> 00:33:22,080 Eller enhver anden programmering sprog, ville du sikkert 582 00:33:22,080 --> 00:33:27,210 nødt til at interagere med en slags bibliotek eller API og indstille alt op, 583 00:33:27,210 --> 00:33:28,725 og så ville du nødt til at rydde op. 584 00:33:28,725 --> 00:33:33,810 Men her i Haskell er, tror jeg, en gang du får hænge af det, utroligt 585 00:33:33,810 --> 00:33:35,770 læselig og meget udtryksfuld. 586 00:33:35,770 --> 00:33:38,930 587 00:33:38,930 --> 00:33:43,240 Så der er gennemførelsen af Frere Jacques. 588 00:33:43,240 --> 00:33:43,740 Okay. 589 00:33:43,740 --> 00:33:47,557 Nu ønsker vi at tilføje slagtøj, og det er en lille smule Messier. 590 00:33:47,557 --> 00:33:49,015 Så lad os tage et kig på dias. 591 00:33:49,015 --> 00:33:56,880 592 00:33:56,880 --> 00:34:00,540 Så den store idé er at gøre en flok af lister eller dele. 593 00:34:00,540 --> 00:34:04,140 På grundlag af disse roll-i maskiner, der var typisk om måske otte 594 00:34:04,140 --> 00:34:08,670 til 10 rytme eller percussion dele. 595 00:34:08,670 --> 00:34:10,159 Og derefter bruge en masse teknikker. 596 00:34:10,159 --> 00:34:14,889 Og vi har talt om these-- hjælp folder, filtre, lambda funktioner, 597 00:34:14,889 --> 00:34:19,429 kortlagt i løbet af lister til at generere værdier i visse intervallet fra 1 til R, R er 16, 598 00:34:19,429 --> 00:34:20,699 eller 32 trin i sequencer. 599 00:34:20,699 --> 00:34:23,810 600 00:34:23,810 --> 00:34:29,920 >> Og så hvis der er en værdi i listen da vi kører gennem sequencer, 601 00:34:29,920 --> 00:34:34,190 løber gennem det over og overstået, viser det sig på dette notat, 602 00:34:34,190 --> 00:34:36,060 og at prøve bliver udløst. 603 00:34:36,060 --> 00:34:42,810 604 00:34:42,810 --> 00:34:47,110 Her er alle de forskellige underlige måder Jeg kom op med at generere noter. 605 00:34:47,110 --> 00:34:48,940 Prøv det på din egen semi sum. 606 00:34:48,940 --> 00:34:50,360 Det vil lyde cool. 607 00:34:50,360 --> 00:34:53,066 608 00:34:53,066 --> 00:34:54,690 Tiden tillader det, vi vil gå igennem dette. 609 00:34:54,690 --> 00:34:59,200 Men for lige nu, jeg gætte vi bør demo hvad vi har. 610 00:34:59,200 --> 00:35:01,380 Lad os håbe, det 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 indlæse en fil Jeg har kaldt song.lhs, 614 00:35:09,121 --> 00:35:10,620 som er den fil jeg lige viste dig. 615 00:35:10,620 --> 00:35:11,470 OK, stor. 616 00:35:11,470 --> 00:35:15,010 Som Connor sagde tidligere, er det kompileret, skrive det kontrolleres, 617 00:35:15,010 --> 00:35:18,380 så jeg kan trække vejret en hel del lettere. 618 00:35:18,380 --> 00:35:20,010 Det kommer ikke til at sprænge på mig. 619 00:35:20,010 --> 00:35:22,720 >> Jeg ønskede at vise dig noget nyttigt. 620 00:35:22,720 --> 00:35:25,900 Du kan se, at en modul indlæst kaldt 50. 621 00:35:25,900 --> 00:35:28,240 Du kan gennemse dette modul. 622 00:35:28,240 --> 00:35:32,092 Og det er så dejligt om doing-- måske hvad 623 00:35:32,092 --> 00:35:34,550 du laver i Haskell er ikke kaldet software udvikling, 624 00:35:34,550 --> 00:35:36,980 men du kan gøre en masse sjove ting på egen hånd. 625 00:35:36,980 --> 00:35:42,410 Og arbejdsgangen er virkelig rart, som sammenlignet med en masse andre sprog, 626 00:35:42,410 --> 00:35:45,872 fordi du kan se i en virkelig læsbar måde, hvad der foregår. 627 00:35:45,872 --> 00:35:47,830 Så vi kan se, at vi har alle disse sætninger, som 628 00:35:47,830 --> 00:35:53,760 er lister af musik pladser, og så vi opbygge disse op til noget større, 629 00:35:53,760 --> 00:35:55,220 som er en musik sang. 630 00:35:55,220 --> 00:35:58,450 Det er en musikalsk enhed. 631 00:35:58,450 --> 00:36:05,545 Og så kan vi spille det hele med en funktion kaldet play musik. 632 00:36:05,545 --> 00:36:09,040 Du kan se, hernede. 633 00:36:09,040 --> 00:36:11,310 Hvilket er bare spille. 634 00:36:11,310 --> 00:36:15,040 >> Jeg skulle say-- jeg ikke tale om denne dollartegn, der er overalt. 635 00:36:15,040 --> 00:36:17,980 Dollartegn er en anden Infix operatør. 636 00:36:17,980 --> 00:36:22,500 Men det har den laveste forrang for ledere, som effektivt 637 00:36:22,500 --> 00:36:24,960 betyder, at alt på venstre for dollartegn 638 00:36:24,960 --> 00:36:28,460 og højre for dollartegn, vi kommer til at få evalueret før det. 639 00:36:28,460 --> 00:36:31,430 Så det er lidt ligesom en anden måde at tilføje parentes. 640 00:36:31,430 --> 00:36:33,980 641 00:36:33,980 --> 00:36:36,220 >> CONNOR HARRIS: Det er dybest set sammensat funktion. 642 00:36:36,220 --> 00:36:40,026 Og det sikrer, at du ikke have-- hvis du har funktioner på hver side eller Infix 643 00:36:40,026 --> 00:36:42,900 operatører på hver side, vil de ikke forbinder på tværs af det og give dig 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-- bruger det, kan vi kalde. 646 00:36:49,790 --> 00:36:51,415 Først vil vi spille det uden trommer. 647 00:36:51,415 --> 00:37:00,330 648 00:37:00,330 --> 00:37:03,170 Det er helikopteren, MIDI helikopter. 649 00:37:03,170 --> 00:37:05,495 >> [Musik spiller] 650 00:37:05,495 --> 00:37:08,525 651 00:37:08,525 --> 00:37:09,525 Der er den firkantet bølge. 652 00:37:09,525 --> 00:37:24,520 653 00:37:24,520 --> 00:37:25,490 Stemmen sive. 654 00:37:25,490 --> 00:37:27,630 Og du kan virkelig gå vild med dette. 655 00:37:27,630 --> 00:37:30,872 Jeg plukket en temmelig simpel en, fordi jeg vidste, jeg skulle ikke bide 656 00:37:30,872 --> 00:37:31,830 mere end jeg kunne tygge. 657 00:37:31,830 --> 00:37:36,460 Bare holde det ret simpelt at vise de vigtigste ideer. 658 00:37:36,460 --> 00:37:39,952 Men så var jeg ligesom, vi har fik at tilføje nogle trommer til dette. 659 00:37:39,952 --> 00:37:41,910 Bare fordi det er en lidt uigennemtrængelige, 660 00:37:41,910 --> 00:37:45,790 og jeg brugte ikke Navn på tromme dele, 661 00:37:45,790 --> 00:37:49,490 Jeg kortlagt them-- fordi de er en del af denne opregnet klasse, 662 00:37:49,490 --> 00:37:51,500 Jeg kortlagt dem til ints. 663 00:37:51,500 --> 00:37:53,120 Den ene er som en stortromme. 664 00:37:53,120 --> 00:37:54,370 Zero er så godt. 665 00:37:54,370 --> 00:37:56,000 Syv er en høj hat. 666 00:37:56,000 --> 00:38:00,920 Og ned i her, hvor den funktioner få lidt mere tilfældigt, 667 00:38:00,920 --> 00:38:02,100 disse er ligesom conga trommer. 668 00:38:02,100 --> 00:38:08,360 >> Så hvis du tror om-- måske en sjov måde at gennemføre en trommemaskine 669 00:38:08,360 --> 00:38:12,830 er at bruge meget velordnet mønstre på din stortromme. 670 00:38:12,830 --> 00:38:17,640 Så for eksempel, om filtrering over liste med alt, hvad der giver tilbage 671 00:38:17,640 --> 00:38:20,590 en 1, når det har taget modul 04. 672 00:38:20,590 --> 00:38:27,190 Så jeg får 1, 5, 9, 13, 17-- så dette er det første slag i hver foranstaltning. 673 00:38:27,190 --> 00:38:32,860 >> Og så er det samme ting flyttet over to trin. 674 00:38:32,860 --> 00:38:33,850 Så det er den skæv. 675 00:38:33,850 --> 00:38:37,480 Så det ville være noget som en høj hat. 676 00:38:37,480 --> 00:38:39,640 Og så igen, hernede, det er lidt tilfældigt, 677 00:38:39,640 --> 00:38:41,080 fordi vi laver conga trommer. 678 00:38:41,080 --> 00:38:44,180 Og jeg har nogle maracas hernede, også. 679 00:38:44,180 --> 00:38:50,280 >> Så jeg kunne kalde play trommemaskine, men det ville blive ved for evigt, 680 00:38:50,280 --> 00:38:53,700 og det kan begynde at snuppe op al den hukommelse i mit system. 681 00:38:53,700 --> 00:38:57,090 Så jeg vil kalde denne funktion afspille musik, der som vi vil se, 682 00:38:57,090 --> 00:39:02,020 bruge beskærer parallel sammensætning at spille vores lille Frere Jacques sang 683 00:39:02,020 --> 00:39:04,200 sammen med denne underlige trommemaskine. 684 00:39:04,200 --> 00:39:06,190 Så lad os tage et kig. 685 00:39:06,190 --> 00:39:10,920 Og er du forbedre på min arrangement af alle trommefigurer. 686 00:39:10,920 --> 00:39:13,375 Ikke mit speciale, men jeg havde en masse sjov gør det. 687 00:39:13,375 --> 00:39:17,678 688 00:39:17,678 --> 00:39:20,654 >> [Musik spiller] 689 00:39:20,654 --> 00:39:52,260 690 00:39:52,260 --> 00:39:56,980 >> Så selvfølgelig, det er alt lidt ikke så sjov 691 00:39:56,980 --> 00:40:01,100 hvis vi ikke kan konvertere det til en score så måske er det 692 00:40:01,100 --> 00:40:04,650 kunne fortolkes af et menneske performer. 693 00:40:04,650 --> 00:40:06,535 Så jeg vil ikke køre det her. 694 00:40:06,535 --> 00:40:07,910 Jeg har allerede genereret filerne. 695 00:40:07,910 --> 00:40:10,280 Du kan se, at der er en dot LilyPond file-- og dette 696 00:40:10,280 --> 00:40:14,500 vil være min segue over til Connor-- og en prik MIDI-fil, 697 00:40:14,500 --> 00:40:18,610 og en prik PDF-fil, hvilket er, hvad LilyPond vil i sidste ende genererer. 698 00:40:18,610 --> 00:40:23,770 >> Men disse er de scripts, og jeg vil bare køre dem med deres hjælp muligheder. 699 00:40:23,770 --> 00:40:28,090 Hvis du får disse op at køre med Euterpea, kan du generere en MIDI-fil. 700 00:40:28,090 --> 00:40:31,160 Og derefter fra MIDI-fil med MIDI 2LY program, 701 00:40:31,160 --> 00:40:34,930 du kan generere en Lily Dam-fil, og så skal du 702 00:40:34,930 --> 00:40:37,974 kan generere en PDF af partituret. 703 00:40:37,974 --> 00:40:39,390 Og vi bør tage et kig på dette. 704 00:40:39,390 --> 00:40:52,599 705 00:40:52,599 --> 00:40:55,140 Så Connor vil formentlig vise hvordan du anmærke det bedre, 706 00:40:55,140 --> 00:41:02,570 men dette er Frere Jacques som genereret af mig i Euterpea. 707 00:41:02,570 --> 00:41:07,300 Det er bare i C. Jeg burde have regnet ud af, hvad hacke det er faktisk i. 708 00:41:07,300 --> 00:41:11,090 Men det er pipelinen for hvordan du gøre det med det. 709 00:41:11,090 --> 00:41:12,950 Lad os tale mere om LilyPond. 710 00:41:12,950 --> 00:41:15,780 >> CONNOR HARRIS: OK Lad os se. 711 00:41:15,780 --> 00:41:19,480 712 00:41:19,480 --> 00:41:21,419 Vidste du nævner 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 Tjek Lær Du Haskell. 715 00:41:23,480 --> 00:41:24,410 Det er i ressourcerne. 716 00:41:24,410 --> 00:41:26,830 Det er sådan jeg startede læring, og det er fantastisk. 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 ved navn [uhørligt] learnyouahaskell.com, uden mellemrum. 720 00:41:34,760 --> 00:41:37,065 Grammatik er syg. 721 00:41:37,065 --> 00:41:38,690 STEPHEN KREWSON: Det er illustreret, også. 722 00:41:38,690 --> 00:41:39,440 CONNOR HARRIS: Så hvad er LilyPond? 723 00:41:39,440 --> 00:41:42,480 Det er en deklarativ programmering sprog til musik satsarbejde. 724 00:41:42,480 --> 00:41:45,480 Så declarative-- du kan tænke på ting som HTML, 725 00:41:45,480 --> 00:41:50,900 hvor du ikke er saying-- HTML ikke sige, hvordan webbrowsere skal 726 00:41:50,900 --> 00:41:52,180 gør sider skridt for skridt. 727 00:41:52,180 --> 00:41:54,096 Det er bare at sige dette er en beskrivelse 728 00:41:54,096 --> 00:41:56,100 af, hvad du vil have på siden for at se ud. 729 00:41:56,100 --> 00:41:59,310 >> Og så er det også et program der samler dette sprog, 730 00:41:59,310 --> 00:42:02,300 eller den læse dens i og derefter rent faktisk gør opsætning for dig, 731 00:42:02,300 --> 00:42:05,570 og det spytter disse vidunderlige søger PDF scoringer. 732 00:42:05,570 --> 00:42:08,250 Du kan også få PNG-format eller hvad. 733 00:42:08,250 --> 00:42:10,300 En god måde at tænke af denne er analogt 734 00:42:10,300 --> 00:42:16,620 er, at LaTeX er lidt ligesom LillyPond, men for blot almindelige satsarbejde. 735 00:42:16,620 --> 00:42:20,360 Så i stedet of-- det ikke er WYSIWYG, hvad du ser 736 00:42:20,360 --> 00:42:22,960 Er hvad du får, ligesom, siger Finale er, eller Sibelius, 737 00:42:22,960 --> 00:42:27,430 eller Microsoft Word, hvor du kan indtaste realtid og udkast ting i realtid 738 00:42:27,430 --> 00:42:31,340 og se ændringer går. 739 00:42:31,340 --> 00:42:32,140 >> Det er tekst baseret. 740 00:42:32,140 --> 00:42:35,290 Du er nødt til at oversætte din scores ved hjælp af en særskilt program 741 00:42:35,290 --> 00:42:37,090 og komme ud PDF'er senere. 742 00:42:37,090 --> 00:42:43,320 Dette er en smule mindre praktisk til brug, hvis du er 743 00:42:43,320 --> 00:42:46,520 forsøger at skrive direkte ind i en score, og du er 744 00:42:46,520 --> 00:42:48,620 forsøger at komponere på computeren. 745 00:42:48,620 --> 00:42:50,830 Men der er en masse fordele for det. 746 00:42:50,830 --> 00:42:56,110 One, betyder det ser meget pænere, fordi LillyPond kan faktisk 747 00:42:56,110 --> 00:42:58,210 tage sig tid til at gøre layout beslutninger korrekt, 748 00:42:58,210 --> 00:43:02,380 modsætning Sibelius eller Finale, som har at gøre kompromitterede algoritmer, så 749 00:43:02,380 --> 00:43:05,020 at de kan vise ting i realtid. 750 00:43:05,020 --> 00:43:07,660 >> Så hvorfor er LilyPond-- computergrafik er svært. 751 00:43:07,660 --> 00:43:10,535 Hvis du laver noget med musik og du ønsker at skrive ud scoringer, 752 00:43:10,535 --> 00:43:13,900 du ikke ønsker at skrive ud af alt ved dig selv 753 00:43:13,900 --> 00:43:19,040 startende med hvordan man tegner stabe og hvordan man tegner notesblokke. 754 00:43:19,040 --> 00:43:21,020 Det er meget vanskeligt. Det er blevet gjort før. 755 00:43:21,020 --> 00:43:22,170 Du er fint. 756 00:43:22,170 --> 00:43:26,200 >> Hvis du ønsker at bruge Finale eller Sibelius, filformaterne for disse ting 757 00:43:26,200 --> 00:43:30,180 er meget kompliceret, og du kan ikke virkelig bruge dem programmatisk. 758 00:43:30,180 --> 00:43:35,020 Du kan åbne op Sibelius med Finale og gå til Fil, Export som PDF selv, 759 00:43:35,020 --> 00:43:37,600 men du kan ikke rigtig kalde det fra et script. 760 00:43:37,600 --> 00:43:40,440 LillyPond, kan du ringe af disse scripts. 761 00:43:40,440 --> 00:43:44,397 Du kan nemt gentage LillyPond med LaTeX. 762 00:43:44,397 --> 00:43:47,230 Jeg vil ikke have så meget tid til at gå ind i disse teknologier lige nu, 763 00:43:47,230 --> 00:43:48,321 men de findes. 764 00:43:48,321 --> 00:43:50,070 Hvis du ønsker at se i en LillyPond bog, 765 00:43:50,070 --> 00:43:53,760 Det er et program, der kommer med din LillyPond distribution, 766 00:43:53,760 --> 00:43:57,030 og det er for iteration LillyPond fragmenter ind i LaTeX 767 00:43:57,030 --> 00:44:00,340 hvis du ønsker at gøre noget ligesom en stor musikvidenskab dokument 768 00:44:00,340 --> 00:44:02,289 med eksempler, for eksempel. 769 00:44:02,289 --> 00:44:04,580 Og det er en god færdighed for liv, hvis du laver noget 770 00:44:04,580 --> 00:44:05,770 med musik, ikke bare CS50. 771 00:44:05,770 --> 00:44:09,320 Jeg har brugt LillyPond for alle af mine sammensætning projekter 772 00:44:09,320 --> 00:44:11,880 siden jeg var dybest set en senior i high school. 773 00:44:11,880 --> 00:44:13,455 >> Så her er nogle enkle eksempler. 774 00:44:13,455 --> 00:44:17,490 775 00:44:17,490 --> 00:44:21,060 Dette er dybest set repræsenterer af sværhedsgrad 776 00:44:21,060 --> 00:44:23,481 at de fleste mennesker ville se det i øjnene de forsøgte 777 00:44:23,481 --> 00:44:24,980 at bruge LilyPond til simple projekter. 778 00:44:24,980 --> 00:44:29,519 Denne første er begyndelsen til en koral optakt af Bach. 779 00:44:29,519 --> 00:44:31,810 Denne nederste er et uddrag fra en af ​​mine egne værker, 780 00:44:31,810 --> 00:44:34,650 og det er der bare for at vise du ting som [uhørligt] 781 00:44:34,650 --> 00:44:38,550 sætte flere linjer i samme personale, hvor lyriske undersetting fungerer. 782 00:44:38,550 --> 00:44:41,350 783 00:44:41,350 --> 00:44:46,110 Lyric underlag er en ting, der er meget let at bruge LilyPond for kormusik. 784 00:44:46,110 --> 00:44:48,814 >> Og så så er der nogle flere komplicerede eksempler her. 785 00:44:48,814 --> 00:44:50,980 Alle disse er udført i LilyPond og de er gennemførlige. 786 00:44:50,980 --> 00:44:55,280 Denne første uddrag er fra [Uhørligt] af [uhørligt]. 787 00:44:55,280 --> 00:44:58,860 Og denne [uhørligt] fra et stykke for solo bas 788 00:44:58,860 --> 00:45:03,550 fløjte ved [uhørligt] der er en longtime-- der 789 00:45:03,550 --> 00:45:07,101 var en mangeårig medlem af musik afdeling her, tror jeg. 790 00:45:07,101 --> 00:45:08,600 Jeg er ikke sikker på, hvor han er gået ud for at. 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 Vidunderlig mand. 793 00:45:13,530 --> 00:45:16,920 Og han skriver noget musik, der har meget kompliceret notation som LillyPond 794 00:45:16,920 --> 00:45:20,500 kan ikke desto mindre håndtere meget pænt. 795 00:45:20,500 --> 00:45:26,030 >> Så bare for at give dig en fornemmelse af, hvad Denne ting kapacitet are-- så 796 00:45:26,030 --> 00:45:28,960 den interne af LillyPond er meget kompliceret. 797 00:45:28,960 --> 00:45:31,060 Og du kan bruge det til lang tid, herunder 798 00:45:31,060 --> 00:45:32,520 for nogle temmelig kompliceret ting, uden egentlig 799 00:45:32,520 --> 00:45:34,060 at skulle vide en masse om dem. 800 00:45:34,060 --> 00:45:38,720 Men den grundlæggende idé er, at der på laveste niveau, atomerne i LillyPonds 801 00:45:38,720 --> 00:45:39,970 er noterne. 802 00:45:39,970 --> 00:45:42,761 Noterne indeholder en sammenhæng kaldes stemmer. 803 00:45:42,761 --> 00:45:44,510 Så stemmen kontekst svarer grundlæggende 804 00:45:44,510 --> 00:45:47,410 til en enkelt linje af polyfoni. 805 00:45:47,410 --> 00:45:49,410 Og så kontekst kan være indeholdt hierarkisk 806 00:45:49,410 --> 00:45:53,590 i højere niveau dem, repræsenterer stabe på scoren 807 00:45:53,590 --> 00:45:56,750 eller større grupperinger som klaver stabe eller kor stabe, 808 00:45:56,750 --> 00:45:58,990 og så til sidst hele score sammenhænge. 809 00:45:58,990 --> 00:46:02,260 Og du kan faktisk omfatte flere scoringer i en bog. 810 00:46:02,260 --> 00:46:05,770 >> Og hver kontekst har en Antallet af vedhæftede gravører. 811 00:46:05,770 --> 00:46:08,340 Hvis du ser gennem indholdet af en forbindelse 812 00:46:08,340 --> 00:46:14,410 og udskrive et bestemt symbol eller en vis klasse af symboler som nødvendigt. 813 00:46:14,410 --> 00:46:17,840 Så at hver stemme sammenhæng der er [uhørligt] noter 814 00:46:17,840 --> 00:46:24,270 engraver der er dybest set en funktion eller et objekt, der skriver ud hele noten 815 00:46:24,270 --> 00:46:26,290 hoveder på de rigtige dele af en side. 816 00:46:26,290 --> 00:46:29,510 Så er der en kløft gravør, som skriver ud kløfter på personalet. 817 00:46:29,510 --> 00:46:31,517 Så er der en metronom mark gravør, der 818 00:46:31,517 --> 00:46:33,100 skriver ud metronome mærker i en score. 819 00:46:33,100 --> 00:46:36,410 Og alle disse passer temmelig godt ind i hierarkiet. 820 00:46:36,410 --> 00:46:39,500 Og det er meget, meget, meget tilpasses, som du har brug for 821 00:46:39,500 --> 00:46:42,880 Hvis du ønsker at få ting som. 822 00:46:42,880 --> 00:46:45,730 >> Så alle sammenhænge har en masse forskellige attributter 823 00:46:45,730 --> 00:46:52,410 som du kan ændre for alt fra afstanden til forskellige font 824 00:46:52,410 --> 00:46:54,942 valg til størrelser af tingene. 825 00:46:54,942 --> 00:46:56,900 Hvis du ønsker at gøre endnu mere komplicerede ting, 826 00:46:56,900 --> 00:46:59,210 der er en indlejret scriptsprog. 827 00:46:59,210 --> 00:47:01,820 De bruger ordningen, som er dialekt af LISP. 828 00:47:01,820 --> 00:47:04,960 Disse gør nok ikke betyde noget for dig. 829 00:47:04,960 --> 00:47:06,900 Men dybest set, en ordning en anden funktionel 830 00:47:06,900 --> 00:47:09,500 programmeringssprog, mere 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: Ja. 833 00:47:12,690 --> 00:47:15,390 Det er en god tie-in, formoder jeg. 834 00:47:15,390 --> 00:47:20,150 Og det bruges som et pædagogisk sprog, faktisk, ned Mass Ave. På MIT. 835 00:47:20,150 --> 00:47:26,590 Og det er meget praktisk for LillyPond af forskellige tekniske årsager. 836 00:47:26,590 --> 00:47:30,317 >> Og så hvis du ønsker at gøre simple tweaks afhængige betingede, 837 00:47:30,317 --> 00:47:32,900 til example-- der er bestemt tilstand en score, der er opfyldt, 838 00:47:32,900 --> 00:47:36,495 foretage ændringer i layout eller whatnot-- derefter 839 00:47:36,495 --> 00:47:37,620 disse faciliteter er der. 840 00:47:37,620 --> 00:47:38,667 De er kompliceret. 841 00:47:38,667 --> 00:47:40,250 Så her er en temmelig simpel kode prøve. 842 00:47:40,250 --> 00:47:43,810 Det er fem linjer. 843 00:47:43,810 --> 00:47:46,120 Dybest set, jeg definerer to stabe. 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 medarbejdere har en vedhæftet tempo mark, 846 00:47:48,695 --> 00:47:51,110 men der er faktisk går at gå videre til hele score, 847 00:47:51,110 --> 00:47:54,960 fordi tempo mærker er på kampen helt åben. 848 00:47:54,960 --> 00:47:59,044 Metronomen mark gravør er knyttet til score sammenhæng. 849 00:47:59,044 --> 00:48:01,460 Der er forskellige nøgler, fordi [uhørligt] gravør 850 00:48:01,460 --> 00:48:02,710 er knyttet stabe. 851 00:48:02,710 --> 00:48:04,441 Du kan faktisk gø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 at demonstrere du kan have 854 00:48:07,990 --> 00:48:09,570 forskellige nøgler i forskellige stabe. 855 00:48:09,570 --> 00:48:15,710 Og den grundlæggende syntaks er du skriver Bemærk navne med E, F, G, uanset hvad. 856 00:48:15,710 --> 00:48:18,910 Hvis du ønsker at gøre fortegn, du suffiks IS eller ES. 857 00:48:18,910 --> 00:48:22,640 Det er fra hollandsk musikvidenskabelige konventioner. 858 00:48:22,640 --> 00:48:28,290 >> Og for at gøre oktav spring, er du nødt til at bruge disse kryds mærker, komma eller apostrof. 859 00:48:28,290 --> 00:48:30,580 Den relative betyder bare uanset hvad du har en note, 860 00:48:30,580 --> 00:48:34,080 Det vil automatisk blive plaec i oktav tættest på den foregående. 861 00:48:34,080 --> 00:48:37,624 Og hvis du ønsker at hoppe mere end a fifth-- sige en femte eller more-- 862 00:48:37,624 --> 00:48:39,165 så er du nødt til at bruge [uhørligt]. 863 00:48:39,165 --> 00:48:42,580 Men ellers behøver du ikke at specificere oktav af hver eneste tone. 864 00:48:42,580 --> 00:48:46,130 >> Og relativ C, prime, og C, skal du blot angive midterste C 865 00:48:46,130 --> 00:48:48,630 og base C, især første toner. 866 00:48:48,630 --> 00:48:55,020 Så har du disse stabe, der organiserer disse to stemmer eller prøver af musik, 867 00:48:55,020 --> 00:48:56,730 og du har en score. 868 00:48:56,730 --> 00:48:58,440 Og det ser sådan ud. 869 00:48:58,440 --> 00:49:01,780 870 00:49:01,780 --> 00:49:05,380 >> Hvis du ønsker at tage sig tid til at kopiere at prøve af LillyPond 871 00:49:05,380 --> 00:49:07,530 kode på det foregående glide ned her, og du 872 00:49:07,530 --> 00:49:09,030 kan skrive det for dig selv LillyPond. 873 00:49:09,030 --> 00:49:11,280 Jeg ved, at vi har fået noget der ser meget gerne dette. 874 00:49:11,280 --> 00:49:17,236 875 00:49:17,236 --> 00:49:19,610 Så der er en anden teknologi kaldet Music XML opretholdes 876 00:49:19,610 --> 00:49:22,030 ved helt forskellige mennesker. 877 00:49:22,030 --> 00:49:28,150 XML er en tekstdata structure-- I bør ikke sige data structure-- sige 878 00:49:28,150 --> 00:49:29,580 metafor kort slags. 879 00:49:29,580 --> 00:49:33,800 Og det er designet til at holde hierarkiske data meget godt. 880 00:49:33,800 --> 00:49:37,050 HTML, for eksempel, er en form for XML. 881 00:49:37,050 --> 00:49:41,090 Og du kan fortælle XML, fordi de havde alle vinkelbeslag og vinkel 882 00:49:41,090 --> 00:49:44,700 beslag skråstreg mærker der viser datafelter. 883 00:49:44,700 --> 00:49:47,390 >> Jeg har ikke en kode eksempel fra Music XML. 884 00:49:47,390 --> 00:49:50,450 Du kan finde det selv. 885 00:49:50,450 --> 00:49:53,735 Dybest set, grunden til at du måske ønsker at bruge XML som den mellemliggende trin 886 00:49:53,735 --> 00:49:55,980 er først og fremmest, er det en udvekslingsformat 887 00:49:55,980 --> 00:50:02,301 for stort set every-- jeg ikke sige hver, men en masse forskellige score 888 00:50:02,301 --> 00:50:02,800 forfattere. 889 00:50:02,800 --> 00:50:04,966 Så hvis du skriver i Musik XML, ikke kun kan LillyPond 890 00:50:04,966 --> 00:50:08,080 læse det med hjælp af denne auxilary program kaldet Music XML til LY, 891 00:50:08,080 --> 00:50:11,360 men også Finale kan læse det, kan Sibelius læse den. 892 00:50:11,360 --> 00:50:14,770 Afhængigt af hvordan din interne objekt hierarki virker til at repræsentere musik, 893 00:50:14,770 --> 00:50:18,820 Det kan være lettere at skrive til Musik XML end at LillyPond 894 00:50:18,820 --> 00:50:22,410 og bare stole på Music XML til LY at gøre konverteringen. 895 00:50:22,410 --> 00:50:24,282 >> Jeg tror ikke, [uhørligt] har musik XML. 896 00:50:24,282 --> 00:50:25,490 STEPHEN KREWSON: Det gør ikke. 897 00:50:25,490 --> 00:50:26,340 Nogen arbejder på det, selv om. 898 00:50:26,340 --> 00:50:27,090 >> CONNOR HARRIS: OK. 899 00:50:27,090 --> 00:50:31,040 Euterpea ikke har en Musik XML output funktion endnu. 900 00:50:31,040 --> 00:50:35,340 Hvis du ønsker en afsluttende projekt idé, måske komme i kontakt med fyre 901 00:50:35,340 --> 00:50:38,620 at Stephen kender, og de kunne bruge din hjælp. 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å, dybest set, hver programmeringssprog 904 00:50:43,450 --> 00:50:46,610 det er værd salt har allerede en XML-bibliotek, 905 00:50:46,610 --> 00:50:51,030 så du kan internt konvertere alle af din musik ind i nogle objekt 906 00:50:51,030 --> 00:50:54,120 at XML biblioteket kan skrive at ville kræve færre 907 00:50:54,120 --> 00:50:57,470 ændringer i din indre struktur for uanset musik objekter dig 908 00:50:57,470 --> 00:51:00,310 ønsker at skrive end at skrive det direkte i LillyPond ville. 909 00:51:00,310 --> 00:51:04,380 Så bare printe den ud med XML med XML biblioteker i dit sprog, 910 00:51:04,380 --> 00:51:07,260 som vil garantere, at det er syntaktisk korrekt og alt, 911 00:51:07,260 --> 00:51:08,720 og derefter konvertere den til LillyPond. 912 00:51:08,720 --> 00:51:11,060 Så teknologi, du måske ønsker at se på, hvis du laver noget 913 00:51:11,060 --> 00:51:11,650 sådan her. 914 00:51:11,650 --> 00:51:14,490 915 00:51:14,490 --> 00:51:16,370 >> [Uhørligt], en anden auxilarry teknologi. 916 00:51:16,370 --> 00:51:21,700 Dette er dybest set Tech Works eller Tech Studio til LillyPond. 917 00:51:21,700 --> 00:51:25,380 Så det tilbyder hjælp med syntaks, med skabeloner 918 00:51:25,380 --> 00:51:28,770 til forskellige fælles kombinationer af instrumenter. 919 00:51:28,770 --> 00:51:32,780 Det gør det muligt split screen visning så du kan få din kode i et vindue 920 00:51:32,780 --> 00:51:37,350 og PDF i et andet vindue og klikke på steder i PDF 921 00:51:37,350 --> 00:51:40,650 at springe til den relevante spots i din kildekode. 922 00:51:40,650 --> 00:51:45,330 Dette er mere nyttigt, hvis du faktisk skriftligt LillyPond filer dig selv 923 00:51:45,330 --> 00:51:47,400 end hvis du genererer dem programmatisk. 924 00:51:47,400 --> 00:51:51,230 Men igen, det er noget nyttigt at have. 925 00:51:51,230 --> 00:51:51,970 >> Alle tiders. 926 00:51:51,970 --> 00:51:55,860 En anden resources-- jeg bare gå gennem denne meget hurtigt. 927 00:51:55,860 --> 00:52:01,270 LillyPond manuals-- LillyPond har fremragende dokumentation 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 reference. 930 00:52:03,478 --> 00:52:07,010 De har hundredvis af uddrag til diverse små ting 931 00:52:07,010 --> 00:52:09,930 yo måske har brug for at gøre for at demonstrere forskellige kapaciteter. 932 00:52:09,930 --> 00:52:12,250 Hvis du ønsker at bruge scriptsprog 933 00:52:12,250 --> 00:52:14,740 eller gøre mere omfattende tilpasninger, så er der 934 00:52:14,740 --> 00:52:16,730 interne referere på denne webadresse. 935 00:52:16,730 --> 00:52:21,950 Hvis du ønsker at bruge musik XML, der er at URL, musicxml.com/tutorial. 936 00:52:21,950 --> 00:52:27,960 >> Og så hvis du har brug for at lære ordningen fordi du rent faktisk ønsker at bruge 937 00:52:27,960 --> 00:52:30,960 de scripting faciliteter i LillyPond, så er der en [uhørligt] kaldet 938 00:52:30,960 --> 00:52:32,918 Struktureret Tolkning af computerprogrammer, 939 00:52:32,918 --> 00:52:35,820 som ikke kun er den anden største CS lærebog nogensinde written-- 940 00:52:35,820 --> 00:52:39,770 finde mig bagefter, hvis du ønsker at vide hvad jeg tror den største ene is-- 941 00:52:39,770 --> 00:52:43,580 men det er også en meget god introduktion til sproget korrekt. 942 00:52:43,580 --> 00:52:46,630 Du behøver ikke mere end De første afsnit. 943 00:52:46,630 --> 00:52:47,827 >> Og det er det. 944 00:52:47,827 --> 00:52:48,410 Nogen spørgsmål? 945 00:52:48,410 --> 00:52:54,068 946 00:52:54,068 --> 00:52:57,972 >> STUDENT: Hvor kan jeg downloade din genereret Frere Jacques 947 00:52:57,972 --> 00:53:01,050 så jeg kan sætte det på min iPod? 948 00:53:01,050 --> 00:53:07,574 >> STEPHEN KREWSON: Nå, kan du skrive ud til nogle 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 Lav dine egne variationer af Frere Jacques ved CS50 hive sind. 952 00:53:15,590 --> 00:53:17,095 Det ville være dejligt. 953 00:53:17,095 --> 00:53:18,220 CONNOR HARRIS: Nogen anden? 954 00:53:18,220 --> 00:53:20,261 STEPHEN KREWSON: Vi har brug for en bedre stortromme, også. 955 00:53:20,261 --> 00:53:21,935 Det er virkelig slemt. 956 00:53:21,935 --> 00:53:26,565 >> STUDENT: Euterpea har ikke kun sammensætningen 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 arbejdet I gjorde i Euterpea, da jeg 959 00:53:30,100 --> 00:53:33,450 tog denne-- der er en graduate kursus på Yale, der 960 00:53:33,450 --> 00:53:35,900 bruger det-- var på sund syntese. 961 00:53:35,900 --> 00:53:39,810 Så der er en virkelig pæn måde ved hjælp af pile 962 00:53:39,810 --> 00:53:46,150 og nogle af notation vi så af komponere sammen signalfunktioner. 963 00:53:46,150 --> 00:53:50,610 Især bas for de fleste af dem er blot en simpel sinusbølge. 964 00:53:50,610 --> 00:53:54,240 Men hvis du begynder at komponere dem på mærkelige programmatiske måder, 965 00:53:54,240 --> 00:54:00,010 du kan få skøre lyd effekter, ligesom mærkelige kaskader. 966 00:54:00,010 --> 00:54:04,640 Du kan oprette meget grovkornet lyde med en masse af graduering. 967 00:54:04,640 --> 00:54:07,730 >> Jeg gjorde et projekt om granuleret syntese, som er 968 00:54:07,730 --> 00:54:12,290 et sted i mellem FM og prøveudtagning. 969 00:54:12,290 --> 00:54:15,230 Du tager meget små, små prøver og derefter 970 00:54:15,230 --> 00:54:20,440 kombinere dem med en slags modulator og opbygge en rigere lyd. 971 00:54:20,440 --> 00:54:24,900 Vi gjorde også fysisk modellering, så forsøger at tænke på fysik 972 00:54:24,900 --> 00:54:29,410 og psykoakustik for noget lignende en trompet, og tænker over den måde 973 00:54:29,410 --> 00:54:32,320 lyden er hoppende off klokken af ​​trompeten 974 00:54:32,320 --> 00:54:35,200 og akustikken i værelse og modellering 975 00:54:35,200 --> 00:54:40,195 at med de grundlæggende oscillatorer. 976 00:54:40,195 --> 00:54:47,690 977 00:54:47,690 --> 00:54:48,940 CONNOR HARRIS: Tak så meget. 978 00:54:48,940 --> 00:54:50,140 Tak for at komme. 979 00:54:50,140 --> 00:54:52,400 Og jeg er altid villig til at tage spørgsmå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: Ja. stephen.krewson@yale.edu. 982 00:54:57,020 --> 00:54:58,810 983 00:54:58,810 --> 00:55:00,360 Afkøle. 984 00:55:00,360 --> 00:55:01,667