1 00:00:00,000 --> 00:00:05,180 2 00:00:05,180 --> 00:00:05,930 Connor HARRIS: Hi. 3 00:00:05,930 --> 00:00:06,820 Aku Connor Harris. 4 00:00:06,820 --> 00:00:09,729 Aku CA CS50 di Harvard. 5 00:00:09,729 --> 00:00:11,270 STEPHEN KREWSON: Aku Stephen Krewson. 6 00:00:11,270 --> 00:00:12,582 Aku TF untuk CS50 di Yale. 7 00:00:12,582 --> 00:00:15,790 Connor HARRIS: Dan kita akan berbicara tentang beberapa teknologi yang Anda mungkin 8 00:00:15,790 --> 00:00:18,880 ingin menggunakan jika Anda tertarik dalam melakukan tugas akhir atau benar-benar 9 00:00:18,880 --> 00:00:20,920 apa-apa dengan musik. 10 00:00:20,920 --> 00:00:24,400 Kami akan fokus pada pertama bahasa pemrograman disebut Haskell. 11 00:00:24,400 --> 00:00:26,280 Ini adalah fungsional bahasa, sehingga paradigma 12 00:00:26,280 --> 00:00:29,620 sangat berbeda dari C atau PHP atau bahasa imperatif lain 13 00:00:29,620 --> 00:00:33,450 bahwa Anda telah menggunakan sudah, dan terutama pada perpustakaan ditulis dalam Haskell 14 00:00:33,450 --> 00:00:40,240 disebut Euterpea, yang dapat membantu orang dengan menulis musik fungsional, 15 00:00:40,240 --> 00:00:40,780 dasarnya. 16 00:00:40,780 --> 00:00:43,400 Dan Stephen akan memandu Anda melalui contoh yang bagus dari itu. 17 00:00:43,400 --> 00:00:46,423 >> Setelah ini, saya akan memperkenalkan Anda dengan sesuatu yang disebut LillyPond, yang 18 00:00:46,423 --> 00:00:48,370 adalah teknologi untuk musik typesetting. 19 00:00:48,370 --> 00:00:50,830 Ini semacam seperti LaTeX untuk musik jika ada dari Anda 20 00:00:50,830 --> 00:00:57,530 telah menggunakan LaTeX untuk kelas matematika atau Kelas P set lain atau apa pun. 21 00:00:57,530 --> 00:01:00,440 Dan jadi saya akan memberikan Anda, sekali lagi, beberapa contoh sederhana yang 22 00:01:00,440 --> 00:01:03,640 dan mengarahkan Anda ke umum arah beberapa sumber yang lebih baik. 23 00:01:03,640 --> 00:01:04,319 >> STEPHEN KREWSON: Dalam Selain itu, kami pikir itu 24 00:01:04,319 --> 00:01:06,720 akan keren untuk mengatur sedikit petunjuk 25 00:01:06,720 --> 00:01:10,780 menuju pipa antara File MIDI Euterpea dihasilkan 26 00:01:10,780 --> 00:01:13,910 di LillyPond, jadi kami memberikan beberapa instruksi pada skrip 27 00:01:13,910 --> 00:01:16,310 untuk melakukan itu yang disediakan dengan LillyPond 28 00:01:16,310 --> 00:01:19,160 hanya untuk tetap open source dan mendapatkan pipa pergi. 29 00:01:19,160 --> 00:01:20,910 Connor HARRIS: Sekali lagi, kita harus menekankan, 30 00:01:20,910 --> 00:01:23,100 dua teknologi ini, Anda tidak harus menggunakan mereka bersama-sama. 31 00:01:23,100 --> 00:01:25,370 Mereka tidak dirancang untuk bekerja bersama-sama, meskipun mereka sangat baik. 32 00:01:25,370 --> 00:01:26,362 >> STEPHEN KREWSON: Benar. 33 00:01:26,362 --> 00:01:30,116 Dan benar-benar gratis. 34 00:01:30,116 --> 00:01:32,240 Connor HARRIS: Jadi pengakuan, hanya membaca itu. 35 00:01:32,240 --> 00:01:33,406 STEPHEN KREWSON: Sepatutnya mencatat. 36 00:01:33,406 --> 00:01:36,360 Terima kasih kepada orang-orang. 37 00:01:36,360 --> 00:01:39,180 Ini saya akan berlama-lama di hanya sejenak. 38 00:01:39,180 --> 00:01:41,560 Proses instalasi adalah sedikit rumit. 39 00:01:41,560 --> 00:01:45,420 Kami telah baca saya di GitHub Anda dapat melihat di. 40 00:01:45,420 --> 00:01:47,840 Hanya email saya jika Anda memiliki pertanyaan. 41 00:01:47,840 --> 00:01:52,829 Tapi kita akan menjalankan ini dengan asumsi bahwa ini bekerja untuk semua orang. 42 00:01:52,829 --> 00:01:55,620 Connor HARRIS: Dan jika Anda tidak bisa mendapatkan LillyPond bekerja, bukan masalah besar. 43 00:01:55,620 --> 00:02:00,139 Tidak ada kompilasi hidup yang akan terlibat, setidaknya pada akhir saya. 44 00:02:00,139 --> 00:02:02,930 STEPHEN KREWSON: Haskell dan LillyPond harus keduanya memiliki installer. 45 00:02:02,930 --> 00:02:08,497 Euterpea download sebagai paket, seterusnya dan sebagainya. 46 00:02:08,497 --> 00:02:10,080 Jadi kita berbicara tentang musik komputer. 47 00:02:10,080 --> 00:02:12,990 Dan ini hanya sangat pandangan 50.000 kaki. 48 00:02:12,990 --> 00:02:15,700 Ada aspek yang berbeda dari itu. 49 00:02:15,700 --> 00:02:18,120 Dan ini adalah kasar dan akan mengaburkan beberapa detail. 50 00:02:18,120 --> 00:02:22,090 Tapi kita bisa memikirkan sesuatu seperti komposisi algoritmik, 51 00:02:22,090 --> 00:02:24,920 menggunakan algoritma, menggunakan kode, untuk menghasilkan 52 00:02:24,920 --> 00:02:30,280 beberapa jenis of-- mungkin serupa diri urutan catatan, atau mungkin catatan 53 00:02:30,280 --> 00:02:33,330 di bawah beberapa kendala. 54 00:02:33,330 --> 00:02:35,350 Dan kemudian mereka bisa dilakukan atau ditafsirkan 55 00:02:35,350 --> 00:02:38,390 dengan instrumen analog atau sesuatu seperti itu. 56 00:02:38,390 --> 00:02:42,010 Tapi komposisi itu dilakukan algorithmically. 57 00:02:42,010 --> 00:02:45,120 >> Tapi tentu saja, mungkin daerah musik komputer atau musik digital 58 00:02:45,120 --> 00:02:48,870 kita lebih akrab dengan digital sintesis suara atau sampel digital 59 00:02:48,870 --> 00:02:51,160 dan perekaman digital. 60 00:02:51,160 --> 00:02:55,650 Banyak instrumen digital dilakukan melalui pengambilan sampel digital. 61 00:02:55,650 --> 00:03:00,110 Bahkan, kita akan menggunakan salah satu dari mereka di bentuk font library suara nanti. 62 00:03:00,110 --> 00:03:02,850 >> Tapi ada juga sesuatu yang disebut sintesis digital yang keluar 63 00:03:02,850 --> 00:03:08,650 dari akhir 70-an dan ke era 80-an dengan Yamaha dan John Chowning di Stanford 64 00:03:08,650 --> 00:03:11,990 melakukan sintesis FM atau Frekuensi Modulation sintesis, 65 00:03:11,990 --> 00:03:15,100 di mana Anda memiliki pembawa sinyal dan sinyal modulasi 66 00:03:15,100 --> 00:03:18,270 baik dalam spektrum audio. 67 00:03:18,270 --> 00:03:22,570 Tapi apa yang kita fokus pada hari ini adalah sesuatu yang disebut MIDI, 68 00:03:22,570 --> 00:03:25,040 dan tentu saja, komposisi algoritmik. 69 00:03:25,040 --> 00:03:30,940 >> Kami tidak akan membuat instrumen, tetapi kita bukannya akan membuat beberapa musik, 70 00:03:30,940 --> 00:03:33,940 dan kemudian yang akan mendapatkan ditafsirkan oleh beberapa instrumen yang 71 00:03:33,940 --> 00:03:38,300 adalah konforman ke umum MIDI standar. 72 00:03:38,300 --> 00:03:40,830 Jadi apa MIDI? 73 00:03:40,830 --> 00:03:45,550 Saya tidak akan masuk terlalu dalam ke dalamnya, tapi MIDI adalah protokol transfer data. 74 00:03:45,550 --> 00:03:49,250 Ini semacam panduan di perusahaan yang berbeda dan industri 75 00:03:49,250 --> 00:03:52,250 untuk mengatur suara atau patch. 76 00:03:52,250 --> 00:03:54,170 Jadi kita akan melihat bahwa ada standar MIDI 77 00:03:54,170 --> 00:03:57,500 untuk semua perkusi yang berbeda suara dan rekomendasi MIDI 78 00:03:57,500 --> 00:04:01,360 untuk semua jenis synth atau jenis semua instrumen 79 00:04:01,360 --> 00:04:03,650 kelompok dalam sebuah orkestra, mengatakan. 80 00:04:03,650 --> 00:04:08,916 >> Anda mungkin akrab dengan 0 melalui 127 pesan MIDI. 81 00:04:08,916 --> 00:04:12,920 Sebuah sinyal MIDI biasanya satu bit yang menunjukkan 82 00:04:12,920 --> 00:04:16,130 apakah itu data atau paket status, dan kemudian ada 83 00:04:16,130 --> 00:04:18,589 tujuh bit sinyal. 84 00:04:18,589 --> 00:04:21,430 Dan ini dapat mengontrol segala sesuatu dari Volume 85 00:04:21,430 --> 00:04:25,330 dengan tindakan atau tekanan pada kunci tertentu 86 00:04:25,330 --> 00:04:29,400 jika Anda tampil dengan MIDI sebuah kontroler serta, tentu saja, 87 00:04:29,400 --> 00:04:31,250 catatan. 88 00:04:31,250 --> 00:04:33,450 Dan tentu saja, MIDI memiliki telah sangat berguna, 89 00:04:33,450 --> 00:04:37,550 karena itu adalah cara untuk kawat bersama-sama atau rantai daisy 90 00:04:37,550 --> 00:04:41,570 sekelompok perangkat keras MIDI. 91 00:04:41,570 --> 00:04:44,050 Saya memiliki tujuh atau delapan kembali di rumah saya. 92 00:04:44,050 --> 00:04:46,610 Itu akan benar-benar rumit, tapi itu benar-benar kuat. 93 00:04:46,610 --> 00:04:47,460 Dan itu benar-benar tua. 94 00:04:47,460 --> 00:04:51,117 Ini dari awal '80 -an, dan itu benar-benar bagus dan kecil. 95 00:04:51,117 --> 00:04:51,950 Connor HARRIS: Ya. 96 00:04:51,950 --> 00:04:54,230 Semua Nintendo klasik video game mungkin akan 97 00:04:54,230 --> 00:04:56,088 memiliki file MIDI untuk musik, misalnya. 98 00:04:56,088 --> 00:04:59,550 99 00:04:59,550 --> 00:05:01,740 >> STEPHEN KREWSON: Berikut ini adalah contoh MIDI umum, 100 00:05:01,740 --> 00:05:06,520 menunjukkan MIDI sebagai sejenis protokol umum. 101 00:05:06,520 --> 00:05:13,280 Dan saya pikir kita bisa memikirkan perbedaan antara spesifikasi 102 00:05:13,280 --> 00:05:17,830 bahwa harus ada sesuatu seperti Instrumen ini terdengar dan aktual 103 00:05:17,830 --> 00:05:21,740 realisasi instrumen tersebut terdengar di font suara atau MIDI tertentu 104 00:05:21,740 --> 00:05:25,740 synthesizer sebagai perbedaan antara mungkin typeface-- yang mengatakan, 105 00:05:25,740 --> 00:05:30,350 secara umum, ini adalah desain cara tertentu untuk mewakili 106 00:05:30,350 --> 00:05:35,907 characters-- dan font tertentu yang memiliki ukuran dan timbre tertentu, 107 00:05:35,907 --> 00:05:37,240 dan ada realisasi the-- 108 00:05:37,240 --> 00:05:39,156 >> Connor HARRIS: Mungkin lebih baik dibandingkan akan 109 00:05:39,156 --> 00:05:43,430 menjadi standar Unicode says-- memberikan nomor untuk setiap karakter, dan benar-benar 110 00:05:43,430 --> 00:05:46,830 setiap bahasa di dunia, atau satu set besar script bahasa 111 00:05:46,830 --> 00:05:51,310 di dunia, dan kemudian mereka adalah diberikan ke grafis sesuatu 112 00:05:51,310 --> 00:05:53,710 oleh berbagai paket font. 113 00:05:53,710 --> 00:05:56,630 Dan jelas, Anda bisa memikirkan MIDI sebagai Unicode suara. 114 00:05:56,630 --> 00:06:03,250 Dan itu hanya daftar of-- aliran besar peristiwa dan instrumen dan yang lainnya, 115 00:06:03,250 --> 00:06:06,090 dan Anda harus memiliki terpisah Program, seperti jenis huruf a, 116 00:06:06,090 --> 00:06:08,537 untuk membuat itu menjadi sesuatu yang terdengar. 117 00:06:08,537 --> 00:06:12,360 118 00:06:12,360 --> 00:06:13,780 >> STEPHEN KREWSON: Jadi mengapa Haskell? 119 00:06:13,780 --> 00:06:19,110 Haskell adalah pemrograman fungsional bahasa, sangat maju, 120 00:06:19,110 --> 00:06:22,770 sangat berbeda dari C, sangat berbeda dari PHP. 121 00:06:22,770 --> 00:06:28,120 Dan kita akan melihat bahwa ada sebuah kemudahan komposisi fungsi dalam Haskell 122 00:06:28,120 --> 00:06:37,640 yang akan memungkinkan kita untuk angin melalui menyusun atau mengetik, menyalin, 123 00:06:37,640 --> 00:06:42,160 sesuatu seperti Frere Jacques, Lagu sederhana ini yang 124 00:06:42,160 --> 00:06:46,815 memiliki banyak bagian di dalamnya yang yang serupa diri atau mengulangi. 125 00:06:46,815 --> 00:06:49,740 126 00:06:49,740 --> 00:06:53,250 Jadi ini akan menjadi beberapa motivasi mengapa 127 00:06:53,250 --> 00:06:59,400 kita sedang menggunakan Haskell, di mana fungsi adalah warga negara kelas satu. 128 00:06:59,400 --> 00:07:01,120 >> Dan saya ingin memperpanjang ini sedikit. 129 00:07:01,120 --> 00:07:08,800 Ini sedikit mudah untuk notate Frere Jacques di Haskell. 130 00:07:08,800 --> 00:07:12,100 Tapi bagaimana jika kita ingin menambahkan bagian drum itu? 131 00:07:12,100 --> 00:07:17,320 Bagaimana jika kita ingin mencoba untuk membuat sesuatu seperti Roland 808 atau 909 Drum 132 00:07:17,320 --> 00:07:20,970 mesin di mana Anda memiliki sekitar 16 langkah yang berbeda? 133 00:07:20,970 --> 00:07:24,590 Biasanya ini adalah memikirkan catatan sebagai 16. 134 00:07:24,590 --> 00:07:28,640 Dan Anda dapat mengontrol global tempo, dan Anda dapat memilih 135 00:07:28,640 --> 00:07:34,620 sekelompok bagian perkusi yang berbeda drum bass, bertepuk tangan, jerat yang berbeda, 136 00:07:34,620 --> 00:07:37,540 terbuka dan tertutup topi tinggi pada semacam ini saluran, 137 00:07:37,540 --> 00:07:41,600 dan kemudian Anda dapat EQ atau mengatur volume mereka. 138 00:07:41,600 --> 00:07:45,290 >> Dan kita akan melihat cara yang baik di Haskell mewakili langkah ini 139 00:07:45,290 --> 00:07:48,810 sequencer dengan semua berbagai hal keren di Haskell 140 00:07:48,810 --> 00:07:53,100 yang bisa kita lakukan dengan menghasilkan daftar dan penyaringan lebih daftar, 141 00:07:53,100 --> 00:07:56,060 pemetaan lebih daftar, pemetaan fungsi lebih daftar. 142 00:07:56,060 --> 00:07:59,530 143 00:07:59,530 --> 00:08:00,760 Dan permintaan maaf yang cepat. 144 00:08:00,760 --> 00:08:05,300 Ini adalah sangat sepintas dan sketsa terlalu cepat 145 00:08:05,300 --> 00:08:07,620 dari beberapa aspek dari Haskell dan Euterpea, 146 00:08:07,620 --> 00:08:11,760 yang merupakan spesifik domain bahasa tertanam ditulis 147 00:08:11,760 --> 00:08:14,970 di Haskell untuk jenis musik. 148 00:08:14,970 --> 00:08:17,350 Jadi jangan lihat kode online. 149 00:08:17,350 --> 00:08:22,404 Jalankan ghci, yang merupakan Glasgow Haskell Compiler Interpreter. 150 00:08:22,404 --> 00:08:24,320 Dan saya akan melakukan beberapa ini dalam sedikit 151 00:08:24,320 --> 00:08:25,880 sehingga Anda dapat melihat bagaimana hal itu dilakukan. 152 00:08:25,880 --> 00:08:31,021 >> Dan ini memungkinkan Anda untuk memuat dengan the-- sintaks usus besar dan kemudian 153 00:08:31,021 --> 00:08:31,520 perintah. 154 00:08:31,520 --> 00:08:33,510 Anda dapat memuat dalam file. 155 00:08:33,510 --> 00:08:36,840 Anda dapat menggunakan browse pada file-file untuk melihat semua fungsi yang 156 00:08:36,840 --> 00:08:39,169 ada di modul tertentu. 157 00:08:39,169 --> 00:08:43,850 Dan kemudian seperti yang kita akan lihat, jenis dan tipe Kelas sangat penting dalam Haskell, 158 00:08:43,850 --> 00:08:48,850 sehingga Anda selalu dapat check-- terutama jika Anda bekerja di sebuah DSCL baru 159 00:08:48,850 --> 00:08:51,600 seperti ini, apa jenis musik? 160 00:08:51,600 --> 00:08:55,114 Aku tahu tentang cara numerik jenis bekerja di Haskell, 161 00:08:55,114 --> 00:08:56,530 tapi saya tidak tahu banyak tentang musik. 162 00:08:56,530 --> 00:09:01,280 Tapi Anda bisa menjelajahi cara mereka didefinisikan dengan menggunakan t atau jenis perintah 163 00:09:01,280 --> 00:09:04,577 dan kemudian memanggil tertentu fungsi atau objek data. 164 00:09:04,577 --> 00:09:05,410 Connor HARRIS: Ya. 165 00:09:05,410 --> 00:09:09,820 Jika Anda berpikir C dan dentang adalah hardass tentang jenis, 166 00:09:09,820 --> 00:09:11,230 Anda tidak tahu tentang Haskell. 167 00:09:11,230 --> 00:09:14,230 Hal yang baik tentang Haskell adalah bahwa jika Anda bisa mendapatkan kode Anda untuk mengkompilasi 168 00:09:14,230 --> 00:09:16,790 dan jika jenis Haskell cek, itu mungkin benar, 169 00:09:16,790 --> 00:09:18,675 karena sistem jenis begitu ketat. 170 00:09:18,675 --> 00:09:20,090 >> STEPHEN KREWSON: Ya. 171 00:09:20,090 --> 00:09:21,980 Jadi saya hanya ingin pergi through-- dan lagi, 172 00:09:21,980 --> 00:09:27,160 ini tidak melakukannya justice-- beberapa fitur Haskell itu, setidaknya 173 00:09:27,160 --> 00:09:31,780 untuk creators-- dan itu diciptakan di akhir 1980-an oleh sekelompok orang, 174 00:09:31,780 --> 00:09:34,610 komite sekitar 20 people-- pikir penting. 175 00:09:34,610 --> 00:09:36,850 Dan hal pertama yang mereka tercantum dalam kertas yang 176 00:09:36,850 --> 00:09:41,890 dijelaskan asal-usul Haskell selama 20 tahun pertama atau lebih 177 00:09:41,890 --> 00:09:43,390 adalah bahwa hal itu malas. 178 00:09:43,390 --> 00:09:44,990 Jadi apa artinya ini? 179 00:09:44,990 --> 00:09:49,860 >> Nah, itu berarti ketika kita memiliki semacam ekspresi, kita perlu mengevaluasinya. 180 00:09:49,860 --> 00:09:54,390 Dan Haskell melakukan hal ini dalam panggilan oleh kebutuhan cara atau cara non-ketat. 181 00:09:54,390 --> 00:09:57,250 Artinya, jika kita memiliki sekelompok komponen ekspresi kami, 182 00:09:57,250 --> 00:10:00,660 kami mencoba untuk menunda evaluasi dari mereka subkomponen 183 00:10:00,660 --> 00:10:05,300 sampai minute-- terakhir mutlak yaitu sampai kita benar-benar membutuhkannya. 184 00:10:05,300 --> 00:10:08,480 >> Jadi means-- ini yang benar-benar keren, terutama 185 00:10:08,480 --> 00:10:13,200 jika kita berpikir tentang abstraksi dari langkah sequencer musik. 186 00:10:13,200 --> 00:10:16,740 Anda menyalakannya, dan Anda mulai menjalankan langkah sequence-- 187 00:10:16,740 --> 00:10:20,010 jika Anda pernah bekerja dengan drum machine-- dan itu hanya pergi selamanya. 188 00:10:20,010 --> 00:10:24,650 Sehingga akan sangat baik jika kita bisa meniru bahwa dalam Haskell. 189 00:10:24,650 --> 00:10:31,040 Dan kita bisa melakukannya dengan tak terbatas nilai-nilai, dalam daftar tak terbatas tertentu. 190 00:10:31,040 --> 00:10:35,860 Ini sangat mudah untuk mengetik daftar terbatas di Haskell. 191 00:10:35,860 --> 00:10:39,230 Anda hanya bisa menggunakan sintaks turun di sini, di mana Anda melihat 1 sampai 3, 192 00:10:39,230 --> 00:10:42,440 menghapus 3 1 dot dot, dan yang merupakan daftar tak terbatas 193 00:10:42,440 --> 00:10:46,960 dari semua bilangan memperluas pada sejauh yang Anda bisa bayangkan. 194 00:10:46,960 --> 00:10:49,925 >> Saya ingin memperkenalkan Konsep lipatan segera. 195 00:10:49,925 --> 00:10:51,800 Dan lagi, tujuan dari seminar ini adalah tidak 196 00:10:51,800 --> 00:10:55,770 untuk belajar tentang lipatan di Haskell atau fungsi tatanan yang lebih tinggi. 197 00:10:55,770 --> 00:10:59,640 Tapi saya hanya ingin memperkenalkan kepada memberikan rasa yang akurat tentang bagaimana aneh 198 00:10:59,640 --> 00:11:03,700 Haskell dan bagaimana kuat itu. 199 00:11:03,700 --> 00:11:08,000 Dan khususnya, kita akan be-- ketika kita melakukan bagian drum yang kami berbeda, 200 00:11:08,000 --> 00:11:12,790 kita akan memanipulasi daftar nomor, lipat mereka ke satu sama lain. 201 00:11:12,790 --> 00:11:17,290 Dan untuk melakukan itu, kami akan akan menggunakan peta dan lipatan. 202 00:11:17,290 --> 00:11:21,770 >> Ada asosiatif yang tepat lipat, yang merupakan salah satu hak ini 203 00:11:21,770 --> 00:11:26,990 sini-1 dikurangi kuantitas, 2 minus kuantitas, 3 dikurangi 0. 204 00:11:26,990 --> 00:11:29,170 Dan sintaks untuk kali lipat, Anda memberikan lipatan 205 00:11:29,170 --> 00:11:34,680 nilai dasar dan kemudian operation-- dalam hal ini, penambahan atau pengurangan. 206 00:11:34,680 --> 00:11:36,280 Saya telah menunjukkan kedua kasus. 207 00:11:36,280 --> 00:11:41,760 Dan kemudian ada akumulator yang terakumulasi selama seluruh daftar, 208 00:11:41,760 --> 00:11:46,330 menerapkan bahwa operator plus atau dikurangi, dan kemudian mengumpulkan itu. 209 00:11:46,330 --> 00:11:52,680 Jadi ini akan menjadi the-- jika itu disebut dengan lipatan r ditambah 0, dimulai dengan 0, 210 00:11:52,680 --> 00:11:54,720 kita kemudian akan meringkas semua nomor dalam daftar itu. 211 00:11:54,720 --> 00:11:57,134 Dan itu adalah daftar dari 1 sampai 3. 212 00:11:57,134 --> 00:12:00,050 Connor HARRIS: Jadi untuk memasukkannya lain cara, lipat r mengambil tiga argumen. 213 00:12:00,050 --> 00:12:02,540 Ada fungsi yang itu sendiri membutuhkan dua argumen, 214 00:12:02,540 --> 00:12:05,400 kemudian ada nilai pemula, dan ada daftar nilai. 215 00:12:05,400 --> 00:12:08,570 Dan apa yang Anda lakukan adalah Anda mengambil Nilai pemula, nilai pertama, 216 00:12:08,570 --> 00:12:09,850 menempatkan mereka ke dalam fungsi. 217 00:12:09,850 --> 00:12:11,607 Apa yang Anda keluar, mengambil, pakan yang 218 00:12:11,607 --> 00:12:13,940 ke dalam fungsi Nilai kedua, apa yang Anda dapatkan, 219 00:12:13,940 --> 00:12:16,690 mengambil, memberi makan yang menjadi fungsi dari nilai ketiga. 220 00:12:16,690 --> 00:12:18,740 Dan kemudian jika Anda pergi ke Seluruh daftar ini dengan cara ini, 221 00:12:18,740 --> 00:12:22,970 Anda akan mendapatkan akhirnya beberapa nilai singular yang 222 00:12:22,970 --> 00:12:25,720 dari jenis yang sama dari apa yang Anda mulai dengan dan dari jenis yang sama 223 00:12:25,720 --> 00:12:29,147 sebagai hal-hal dalam daftar, dan kemudian itulah hasil kembalinya kali lipat R. 224 00:12:29,147 --> 00:12:31,980 STEPHEN KREWSON: Jadi pada khususnya, ini adalah fungsi yang lebih tinggi, 225 00:12:31,980 --> 00:12:34,460 karena mereka mengambil lain berfungsi sebagai salah satu argumen. 226 00:12:34,460 --> 00:12:34,770 >> Connor HARRIS: Ya. 227 00:12:34,770 --> 00:12:37,820 Jika Anda telah menggunakan tertentu lainnya languages-- Aku tahu R, [tidak terdengar] 228 00:12:37,820 --> 00:12:41,510 bahasa memiliki ini, disebut Mengurangi. 229 00:12:41,510 --> 00:12:45,460 Anda mungkin memiliki fungsi yang sama dalam bahasa lain, hanya disebut 230 00:12:45,460 --> 00:12:48,160 hal yang berbeda. 231 00:12:48,160 --> 00:12:50,680 >> STEPHEN KREWSON: Dan apa yang baik tentang kali lipat R 232 00:12:50,680 --> 00:12:53,880 dalam hal ini adalah bahwa kali lipat R dapat bekerja dengan daftar yang tak terbatas. 233 00:12:53,880 --> 00:12:59,490 Jadi di bawah ini, P5 ini menghasilkan catatan yang 234 00:12:59,490 --> 00:13:03,120 diaktifkan pada langkah sequencer untuk beberapa bagian gendang, bagian drum yang kelima, 235 00:13:03,120 --> 00:13:05,480 dan mungkin itu conga sebuah menghidupkan atau sesuatu. 236 00:13:05,480 --> 00:13:09,719 Dan ini adalah sengaja cara tumpul penulisan ini, 237 00:13:09,719 --> 00:13:11,510 tapi itu menyenangkan, karena hal ini menunjukkan banyak 238 00:13:11,510 --> 00:13:14,460 hal tentang Haskell dan Euterpea. 239 00:13:14,460 --> 00:13:20,650 >> Jadi lipat R usus colon-- ini hanya operator yang mendorong hal-hal 240 00:13:20,650 --> 00:13:25,700 bersama-sama pada list-- menyerukan kosong daftar, yang hanya kurung kosong. 241 00:13:25,700 --> 00:13:28,250 Dan aku menelepon bahwa daftar terbatas ini. 242 00:13:28,250 --> 00:13:31,570 Ini sebenarnya dua daftar ditambahkan bersama-sama di sini. 243 00:13:31,570 --> 00:13:37,150 Daftar 1 koma 6 dot dot adalah 1, 6, 11, 16. 244 00:13:37,150 --> 00:13:39,750 Jadi Haskell-- hanya beberapa karakter, Anda 245 00:13:39,750 --> 00:13:42,420 dapat menghasilkan seluruh yang urutan angka 246 00:13:42,420 --> 00:13:46,240 yang lima nomor terpisah peregangan pada ke infinity. 247 00:13:46,240 --> 00:13:49,860 Dan saya tambahkan dengan yang list-- sedikit lebih pendek ini 248 00:13:49,860 --> 00:13:54,370 3, 8, 21-- hanya untuk menunjukkan Anda bagaimana Anda dapat menggabungkan daftar. 249 00:13:54,370 --> 00:13:55,790 >> Dan kemudian aku sudah dilipat pada dirinya sendiri. 250 00:13:55,790 --> 00:14:01,510 Dan ini akhirnya hanya menjadi semacam operasi identitas, tapi itu tak terbatas. 251 00:14:01,510 --> 00:14:06,070 Dan lipat R bisa melakukan itu, karena malas mengevaluasi, seperti di atas. 252 00:14:06,070 --> 00:14:10,582 Jika kita memiliki 1 dan 2 dan 3, kita bisa hanya braket dari seluruh sisanya. 253 00:14:10,582 --> 00:14:12,290 Itu tidak akan bekerja untuk dikurangi atau ditambah, tetapi 254 00:14:12,290 --> 00:14:17,760 akan bekerja untuk usus ini operasi identitas pada daftar. 255 00:14:17,760 --> 00:14:24,620 >> Jadi bagaimana kita praktis menggunakan bahwa jika kita memiliki daftar panjang tak terhingga hal? 256 00:14:24,620 --> 00:14:26,500 Nah, Haskell menyediakan banyak functions-- 257 00:14:26,500 --> 00:14:29,450 dan terlihat lebih ke dalam di time-- Anda sendiri seperti mengambil 258 00:14:29,450 --> 00:14:32,200 yang mengatakan, OK, kami menghasilkan daftar yang tak terbatas ini, 259 00:14:32,200 --> 00:14:35,950 tapi kami hanya akan mengambil beberapa jumlah itu Dan di case-- ini 260 00:14:35,950 --> 00:14:38,410 kita akan melihat ini nanti di drum mesin kami code-- 261 00:14:38,410 --> 00:14:43,740 GM hanya semacam global variabel untuk jumlah langkah 262 00:14:43,740 --> 00:14:44,610 di sequencer. 263 00:14:44,610 --> 00:14:47,630 Pada mesin roll-in saya menunjukkan Anda, itu biasanya 16, 264 00:14:47,630 --> 00:14:51,475 tapi saya telah menerapkan dengan 32. 265 00:14:51,475 --> 00:14:54,470 Itu tidak terlalu penting. 266 00:14:54,470 --> 00:15:00,230 >> Haskell juga murni, sehingga memiliki kuat mengetik statis yang Connor disinggung. 267 00:15:00,230 --> 00:15:03,220 Jadi fungsi yang matematika di sense-- 268 00:15:03,220 --> 00:15:06,600 mereka lebih matematika bahwa mereka dijamin 269 00:15:06,600 --> 00:15:11,530 untuk tidak mengakses atau mengubah apapun variabel atau melakukan input atau output. 270 00:15:11,530 --> 00:15:14,420 Jadi jika Anda memiliki fungsi, itu deterministik. 271 00:15:14,420 --> 00:15:17,400 Ini akan selalu kembali sama nilai di negara bagian program 272 00:15:17,400 --> 00:15:19,310 atau tetap sama. 273 00:15:19,310 --> 00:15:22,940 Ada, tentu saja, pengecualian monadik untuk ini, tapi itu di luar lingkup kita. 274 00:15:22,940 --> 00:15:23,900 >> Connor HARRIS: Ya. 275 00:15:23,900 --> 00:15:26,946 Apa artinya ini, meskipun, adalah ada adalah beberapa penting [tidak terdengar] 276 00:15:26,946 --> 00:15:27,820 Konsekuensi dari ini. 277 00:15:27,820 --> 00:15:30,940 Salah satunya adalah bahwa hal itu sangat mudah untuk memparalelkan program Haskell. 278 00:15:30,940 --> 00:15:32,773 Karena jika Anda memiliki, mengatakan, fungsi yang 279 00:15:32,773 --> 00:15:36,064 harus beroperasi pada nilai-nilai juta, jika Anda tahu bahwa fungsi akan selalu 280 00:15:36,064 --> 00:15:39,280 memberikan nilai yang sama jika Anda makan di sebuah value-- tertentu 281 00:15:39,280 --> 00:15:43,055 jika Anda [tidak terdengar] f dari 1, f dari 2, maka f dari 3 atau whatnot-- f dari 1 282 00:15:43,055 --> 00:15:45,180 tidak akan menulis ke file atau melakukan sesuatu 283 00:15:45,180 --> 00:15:46,850 yang akan mengubah nilai f2. 284 00:15:46,850 --> 00:15:50,220 Anda hanya bisa berpisah fungsi ini untuk juta mesin yang berbeda atau satu juta 285 00:15:50,220 --> 00:15:54,720 benang yang berbeda atau apa pun, mendapatkan semua tanggapan kembali, 286 00:15:54,720 --> 00:15:56,900 mendapatkan semua kembali nilai-nilai kembali, dan kemudian itu saja. 287 00:15:56,900 --> 00:15:59,780 Jadi sangat mudah untuk memparalelkan hal. 288 00:15:59,780 --> 00:16:03,140 >> Downside adalah masukan yang dan output terutama 289 00:16:03,140 --> 00:16:05,720 masuk ke sistem jenis dengan cara yang sangat rumit. 290 00:16:05,720 --> 00:16:09,010 Kami tidak akan masuk ke itu sekarang, tapi aku mendorong Anda untuk melihat beberapa sumber 291 00:16:09,010 --> 00:16:11,175 online jika Anda ingin belajar tentang itu. 292 00:16:11,175 --> 00:16:13,960 293 00:16:13,960 --> 00:16:16,550 >> STEPHEN KREWSON: Jadi ketik classes-- dan ini 294 00:16:16,550 --> 00:16:21,610 kelas was-- jenis diciptakan untuk memecahkan 295 00:16:21,610 --> 00:16:24,160 masalah operator overloading. 296 00:16:24,160 --> 00:16:27,590 Jadi kita ingin memiliki kesetaraan antara berbagai jenis hal. 297 00:16:27,590 --> 00:16:31,040 Tentu saja, kita bisa berpikir of-- kesetaraan antara jenis numerik 298 00:16:31,040 --> 00:16:34,720 sangat mudah untuk berpikir tentang, tapi apa tentang kesetaraan antara daftar? 299 00:16:34,720 --> 00:16:37,610 Bagaimana kesetaraan antara pohon struktur data kaki? 300 00:16:37,610 --> 00:16:43,130 Dan ini semua mungkin dalam Haskell karena tipe kelas. 301 00:16:43,130 --> 00:16:48,000 >> Jadi jika Anda menentukan type-- data tertentu dan di sini, ini adalah pitches musik. 302 00:16:48,000 --> 00:16:50,960 Kami akhirnya mendapatkan untuk beberapa musik komputer. 303 00:16:50,960 --> 00:16:57,420 Jadi kita memiliki C, C tajam, dan sebagainya dan sebagainya. 304 00:16:57,420 --> 00:17:01,080 Mereka milik sekelompok jenis kelas yang berbeda. 305 00:17:01,080 --> 00:17:03,510 EQ-- mereka milik kelas jenis EQ. 306 00:17:03,510 --> 00:17:06,780 Itu berarti mereka mendukung operasi kesetaraan. 307 00:17:06,780 --> 00:17:12,650 Sehingga Anda dapat mengevaluasi apakah satu urutan primitif musik 308 00:17:12,650 --> 00:17:15,400 adalah sama dengan yang berbeda. 309 00:17:15,400 --> 00:17:17,280 >> Mereka milik kelas ordinal. 310 00:17:17,280 --> 00:17:19,479 Itu berarti ada sebuah pemesanan untuk ini. 311 00:17:19,479 --> 00:17:27,670 D datang setelah C. C tajam datang setelah C juga. 312 00:17:27,670 --> 00:17:29,840 Mereka milik kelas menunjukkan, yang berarti mereka dapat 313 00:17:29,840 --> 00:17:33,000 dicetak ke konsol atau terminal. 314 00:17:33,000 --> 00:17:36,090 Mereka milik kelas disebutkan, yang 315 00:17:36,090 --> 00:17:39,770 berarti bahwa meskipun ini karakter, 316 00:17:39,770 --> 00:17:45,340 mereka memiliki angka yang mendasari representasi mulai dari 0 317 00:17:45,340 --> 00:17:48,960 dan pergi melalui namun banyak hal di sini, 20 atau lebih, 318 00:17:48,960 --> 00:17:51,770 atau 30 atau 40, mungkin. 319 00:17:51,770 --> 00:17:54,259 >> Connor HARRIS: Dan ketika kami memiliki tipe data 320 00:17:54,259 --> 00:17:57,050 yang derives-- dengan kata kunci tersebut "deriving--" kelas jenis tertentu, 321 00:17:57,050 --> 00:18:01,160 itu berarti bahwa kompiler akan mencoba untuk membangun sesuatu yang otomatis. 322 00:18:01,160 --> 00:18:05,120 Jadi mungkin Anda akan ingin menentukan kualitas berbeda. 323 00:18:05,120 --> 00:18:09,450 Anda akan ingin mendefinisikan C tajam sebagai sama dengan D datar, misalnya. 324 00:18:09,450 --> 00:18:11,560 Dengan konstruksi ini di sini, saya tidak berpikir C tajam 325 00:18:11,560 --> 00:18:14,940 dan D datar akan sama, karena compiler secara otomatis akan 326 00:18:14,940 --> 00:18:19,670 mengatakan setiap nilai yang berbeda mungkin berbeda dari setiap lainnya. 327 00:18:19,670 --> 00:18:22,930 >> Sehingga memungkinkan untuk menimpa implementasi standar 328 00:18:22,930 --> 00:18:25,730 dari jenis kelas. 329 00:18:25,730 --> 00:18:28,640 Sekali lagi, melihat referensi jika Anda ingin belajar tentang itu. 330 00:18:28,640 --> 00:18:31,767 331 00:18:31,767 --> 00:18:33,600 STEPHEN KREWSON: Dan di sini, benar-benar, ini akan 332 00:18:33,600 --> 00:18:36,930 membantu ketika kita kode kemudian. 333 00:18:36,930 --> 00:18:42,150 Kami melihat beberapa operator infiks untuk komposisi berurutan, 334 00:18:42,150 --> 00:18:46,570 komposisi paralel, dan begitu sebagainya, plus ini dan tanda-tanda yang sama 335 00:18:46,570 --> 00:18:48,620 dikelilingi oleh titik dua. 336 00:18:48,620 --> 00:18:53,330 Itu berarti kita bisa bermain yang berbeda primitif musik satu demi satu. 337 00:18:53,330 --> 00:18:54,590 Itu komposisi berurutan. 338 00:18:54,590 --> 00:18:57,170 >> Atau kita dapat memainkannya di paralel pada saat yang sama. 339 00:18:57,170 --> 00:19:05,100 Jadi saya bisa memiliki nilai musik, dan kemudian ini sama dan titik dua, 340 00:19:05,100 --> 00:19:09,669 infiks Operator komposisi paralel, dan bermain mereka sebagai semacam chord. 341 00:19:09,669 --> 00:19:11,460 Dan kita akan menggunakan ketika ini kita menggabungkan 342 00:19:11,460 --> 00:19:15,080 bagian gendang kami dengan kami sedikit lagu Frere Jacques 343 00:19:15,080 --> 00:19:19,460 memainkan dua urutan nilai-nilai musik pada saat yang sama. 344 00:19:19,460 --> 00:19:24,520 345 00:19:24,520 --> 00:19:29,250 >> Currying Curry is-- terakhir nama dari Haskell Curry, yang 346 00:19:29,250 --> 00:19:31,850 gambar Haskell dinamai. 347 00:19:31,850 --> 00:19:34,330 Dan ini memungkinkan kita bagus elegan ketika kita 348 00:19:34,330 --> 00:19:36,880 menulis semua ini berbeda fungsi atau filter yang kami 349 00:19:36,880 --> 00:19:39,330 akan menjadi pemetaan lebih daftar kami. 350 00:19:39,330 --> 00:19:42,810 Sebuah fungsi dari dua arguments-- f dari x dan y-- 351 00:19:42,810 --> 00:19:46,630 dapat direpresentasikan sebagai f dari x diterapkan y. 352 00:19:46,630 --> 00:19:49,800 Jadi itu adalah fungsi dari satu argumen yang mengembalikan 353 00:19:49,800 --> 00:19:51,240 fungsi lain dari satu argumen. 354 00:19:51,240 --> 00:19:56,962 Jadi ini berarti kita dapat memetakan Fungsi f dari x lebih dari y yang daftar. 355 00:19:56,962 --> 00:19:58,920 Connor HARRIS: Ingin memberikan contoh dari ini? 356 00:19:58,920 --> 00:19:59,836 STEPHEN KREWSON: Ya. 357 00:19:59,836 --> 00:20:05,390 Saya punya contoh di sini dari beberapa hal yang kita akan menulis. 358 00:20:05,390 --> 00:20:10,500 Jadi meniru 2-- baik, mereplikasi akan mengambil 359 00:20:10,500 --> 00:20:13,040 satu nilai, yang adalah berapa banyak kali untuk meniru sesuatu, 360 00:20:13,040 --> 00:20:16,690 dan kemudian akan mengambil sebuah value-- biasanya daftar atau sesuatu. 361 00:20:16,690 --> 00:20:23,450 Jadi di sini, kami pemetaan mereplikasi 2 lebih daftar lain. 362 00:20:23,450 --> 00:20:27,440 >> Jadi jika kita memetakan mereplikasi 2, jika kita meniru 2 berlaku 363 00:20:27,440 --> 00:20:31,890 ke elemen pertama dari list-- ini dan ini adalah daftar phrases-- musik 364 00:20:31,890 --> 00:20:37,650 akan menghasilkan dua dari "Anda sleeping--" sehingga kau tidur, kau tidur. 365 00:20:37,650 --> 00:20:40,040 Jadi sekarang kita memiliki dua. 366 00:20:40,040 --> 00:20:42,570 Tapi mereplikasi mengambil dua argumen, tapi karena kita 367 00:20:42,570 --> 00:20:47,100 currying dan kemudian pemetaan, kita dapat mewakili mereplikasi 2 368 00:20:47,100 --> 00:20:52,310 sebagai telah dikembalikan sebagai fungsi satu argument-- hanya mereplikasi dua kali. 369 00:20:52,310 --> 00:20:57,010 Dan kemudian kita menerapkan bahwa untuk setiap unsur ini daftar frase. 370 00:20:57,010 --> 00:21:01,900 >> Dan concat adalah Haskell operasi untuk meratakan daftar. 371 00:21:01,900 --> 00:21:04,400 Karena mereplikasi 2 kehendak menghasilkan daftar daftar. 372 00:21:04,400 --> 00:21:06,660 Dan ini adalah bentuk peralihan ini di sini. 373 00:21:06,660 --> 00:21:10,365 Dan kemudian kita dapat concat atau meratakan yang keluar dua kali. 374 00:21:10,365 --> 00:21:12,240 Connor HARRIS: Sebuah sederhana contoh currying, 375 00:21:12,240 --> 00:21:15,323 jika Anda akan like-- bayangkan f hanya fungsi perkalian yang mengambil dua 376 00:21:15,323 --> 00:21:16,840 argumen dan mengembalikan produk mereka. 377 00:21:16,840 --> 00:21:19,320 Jadi jika Anda memiliki f 4 5, itu 20. 378 00:21:19,320 --> 00:21:22,670 Tapi Anda bisa berpikir ini sebagai also-- Anda memiliki fungsi f 4 379 00:21:22,670 --> 00:21:25,560 yang mengambil argumen dan pengembalian empat kali ini argument-- hanya 380 00:21:25,560 --> 00:21:27,870 aplikasi parsial yang hanya satu argumen 4. 381 00:21:27,870 --> 00:21:31,182 Dan jika Anda makan f dari 4 5, yang akan memberikan 20. 382 00:21:31,182 --> 00:21:32,890 Dan itu sederhana contoh currying. 383 00:21:32,890 --> 00:21:34,473 Ini biasanya salah satu yang buku teks. 384 00:21:34,473 --> 00:21:38,860 385 00:21:38,860 --> 00:21:42,110 >> STEPHEN KREWSON: Lambda ekspresi atau fungsi anonim 386 00:21:42,110 --> 00:21:47,330 adalah ciri Haskell lain. 387 00:21:47,330 --> 00:21:51,242 Jadi jika kita perlu menyiapkan sedikit fungsi mereplikasi hidup, 388 00:21:51,242 --> 00:21:52,950 tapi mengatakan itu tidak di perpustakaan standar, 389 00:21:52,950 --> 00:21:56,150 kita dapat menggunakan sintaks mirip dengan berikut ini. 390 00:21:56,150 --> 00:21:58,730 Dan kami akan angin lebih ini. 391 00:21:58,730 --> 00:22:02,160 Satu hal yang Anda akan melihat banyak dari dalam drum mesin adalah kita membuat panggilan 392 00:22:02,160 --> 00:22:05,790 untuk sesuatu yang disebut menyaring, yang seperti sebelumnya, 393 00:22:05,790 --> 00:22:08,185 adalah pemetaan fungsi lebih daftar, tapi itu 394 00:22:08,185 --> 00:22:10,260 pemetaan fungsi Boolean. 395 00:22:10,260 --> 00:22:13,390 >> Jadi kita miliki di sini contoh dari sebuah anonim 396 00:22:13,390 --> 00:22:19,150 didefinisikan fungsi Boolean yang hanya berlangsung beberapa nilai. 397 00:22:19,150 --> 00:22:22,990 Hal ini tidak benar-benar berbicara fungsi anonim. 398 00:22:22,990 --> 00:22:25,850 Tapi itu menentukan dengan bahwa sintaks untuk singkatnya, 399 00:22:25,850 --> 00:22:28,007 dan ini hanya membutuhkan x modul n-- 400 00:22:28,007 --> 00:22:28,840 Connor HARRIS: Ya. 401 00:22:28,840 --> 00:22:31,330 Jadi f adalah fungsi dari dua argumen n dan p 402 00:22:31,330 --> 00:22:35,440 yang mengembalikan fungsi yang sendiri fungsi dari satu argumen, yaitu x. 403 00:22:35,440 --> 00:22:38,815 404 00:22:38,815 --> 00:22:40,690 STEPHEN KREWSON: Saya operator infiks disebutkan. 405 00:22:40,690 --> 00:22:42,642 Apa operator infiks? 406 00:22:42,642 --> 00:22:45,710 Nah, operator infiks adalah cara biasa kami mewakili operasi, 407 00:22:45,710 --> 00:22:49,910 mengatakan, di mathematics-- 2 ditambah 2 bukannya operator ditambah 408 00:22:49,910 --> 00:22:51,202 dan kemudian dua argumen 2 dan 2. 409 00:22:51,202 --> 00:22:53,701 Connor HARRIS: Ini disebut membalikkan notasi polish, yang 410 00:22:53,701 --> 00:22:55,330 istilah saya ragu salah satu dari Anda akan tahu. 411 00:22:55,330 --> 00:22:56,288 >> STEPHEN KREWSON: Benar. 412 00:22:56,288 --> 00:22:58,290 Membalikkan polish atau awalan notasi. 413 00:22:58,290 --> 00:23:01,412 Tapi Haskell memutuskan untuk menggunakan operator infiks. 414 00:23:01,412 --> 00:23:03,120 Jadi ini adalah beberapa yang kustom yang 415 00:23:03,120 --> 00:23:07,770 didefinisikan untuk Euterpea DSCL di Haskell. 416 00:23:07,770 --> 00:23:10,730 Jadi ini adalah komposisi berurutan. 417 00:23:10,730 --> 00:23:16,340 Ini adalah komposisi paralel, dan ini itu truncating komposisi paralel. 418 00:23:16,340 --> 00:23:18,710 Dan kita akan membutuhkan dengan mesin drum kami, 419 00:23:18,710 --> 00:23:22,640 karena kita akan menggunakan yang terakhir Operator dalam tuple kecil ada 420 00:23:22,640 --> 00:23:26,330 untuk memainkan drum mesin bersama dengan lagu Frere Jacques kami. 421 00:23:26,330 --> 00:23:28,650 Dan mesin drum kami adalah akan menjadi tak terbatas. 422 00:23:28,650 --> 00:23:30,920 Itu hanya memainkan selamanya. 423 00:23:30,920 --> 00:23:32,692 Tapi lagu Frere Jacques tidak. 424 00:23:32,692 --> 00:23:33,510 Itu tidak lama. 425 00:23:33,510 --> 00:23:36,610 Ini hanya beberapa bar. 426 00:23:36,610 --> 00:23:43,030 Jadi kita perlu menghentikan mesin drum sebagai Begitu nilai musik yang lebih pendek datang 427 00:23:43,030 --> 00:23:43,700 berakhir. 428 00:23:43,700 --> 00:23:46,980 Dan bahwa operator infixed super membantu dengan itu. 429 00:23:46,980 --> 00:23:50,090 >> Dan notasi infiks seperti ini adalah jenis yang baik, 430 00:23:50,090 --> 00:23:57,095 karena mengatakan Anda memiliki fungsi seperti kutipan, yang memberikan pembagian integer 431 00:23:57,095 --> 00:24:01,010 x oleh sesuatu else-- maaf, yang harus a dan b. 432 00:24:01,010 --> 00:24:04,740 Anda bisa menulis itu sebagai kutipan dari b. 433 00:24:04,740 --> 00:24:09,670 Jadi, jika Anda adalah elemen put-- contoh lain dari ini. 434 00:24:09,670 --> 00:24:14,730 x elemen dalam beberapa daftar, jika Anda menempatkan dalam Backticks, Anda dapat menggunakannya. 435 00:24:14,730 --> 00:24:20,400 Meskipun itu bukan simbol seperti plus atau minus atau kali, 436 00:24:20,400 --> 00:24:24,630 Anda dapat menggunakan nama Fungsi seperti itu di Backticks 437 00:24:24,630 --> 00:24:27,045 sebagai operator infiks, yang cukup keren. 438 00:24:27,045 --> 00:24:29,670 Connor HARRIS: Sekali lagi, ini adalah semua gula hanya sintaksis, benar-benar. 439 00:24:29,670 --> 00:24:32,310 Ini tidak mempengaruhi inti dari bahasa. 440 00:24:32,310 --> 00:24:37,440 >> STEPHEN KREWSON: Jadi kita lihat di sini untuk frase terakhir dari lagu Frere Jacques kami, 441 00:24:37,440 --> 00:24:45,740 Saya memainkan beberapa akord sedikit atau pertiga menggunakan komposisi paralel 442 00:24:45,740 --> 00:24:46,240 operator. 443 00:24:46,240 --> 00:24:50,680 444 00:24:50,680 --> 00:24:54,950 Ini adalah cara lain untuk mengatakan beberapa dari apa yang kita baru saja mengatakan. 445 00:24:54,950 --> 00:24:59,986 Sehingga Anda dapat memetakan fungsi dari satu argumen atas daftar. 446 00:24:59,986 --> 00:25:02,860 Connor HARRIS: Sekali lagi, referensi untuk buku teks pengantar Haskell-- 447 00:25:02,860 --> 00:25:04,680 akan memiliki semua ini di dalamnya. 448 00:25:04,680 --> 00:25:07,790 >> STEPHEN KREWSON: Jadi di sini adalah cukup baris kunci dari langkah sequencer 449 00:25:07,790 --> 00:25:12,820 kita akan melihat pada menggunakan daftar pemahaman. 450 00:25:12,820 --> 00:25:17,810 Dan kita lihat di sini adalah elemen yang di Operator tetap di belakang tanda kutip. 451 00:25:17,810 --> 00:25:23,030 Jadi jika x adalah elemen dari daftar x, maka kita akan memanggil fungsi PERC. 452 00:25:23,030 --> 00:25:25,100 Jadi PERC hanya fungsi perkusi. 453 00:25:25,100 --> 00:25:30,200 Dibutuhkan beberapa nilai p yang bagian dari himpunan dibatasi dari semua 454 00:25:30,200 --> 00:25:35,310 suara perkusi yang berbeda yang kita lihat di slide sebelumnya, 455 00:25:35,310 --> 00:25:38,840 dan kemudian memberikan yang durasi catatan kuartal. 456 00:25:38,840 --> 00:25:43,190 Lain itu memberikan QNR, dan QNR hanya sisa kuartal catatan. 457 00:25:43,190 --> 00:25:44,970 >> Jadi ini adalah membangun sesuatu yang baik. 458 00:25:44,970 --> 00:25:52,110 Kami memiliki daftar elemen, dan kita akan loop atas beberapa daftar dari satu 459 00:25:52,110 --> 00:25:54,540 dengan nilai maks langkah sequencer kami. 460 00:25:54,540 --> 00:25:58,290 Dan ketika kita berada di suatu i tertentu di bahwa daftar salah satu dengan nilai max, 461 00:25:58,290 --> 00:26:02,970 jika saya yang merupakan anggota dari ini set dibuat dalam fungsi ini, 462 00:26:02,970 --> 00:26:06,040 baik, maka kita hidupkan dalam catatan perkusi. 463 00:26:06,040 --> 00:26:10,960 Jika tidak, kita hanya memainkan istirahat, yang Artinya, kita hanya berdiam diri. 464 00:26:10,960 --> 00:26:16,050 Dan kita bisa lihat di sini bahwa dalam ini sintaks pemahaman daftar, 465 00:26:16,050 --> 00:26:20,030 x dihuni oleh ini daftar dibangun satu 466 00:26:20,030 --> 00:26:22,462 dengan ukuran global sequencer. 467 00:26:22,462 --> 00:26:23,295 Connor HARRIS: Ya. 468 00:26:23,295 --> 00:26:26,340 Sintaks dasar daftar comprehensions adalah 469 00:26:26,340 --> 00:26:30,810 braket, nilai yang melibatkan beberapa variabel, bar, 470 00:26:30,810 --> 00:26:34,260 mungkin nilai-nilai variabel sendiri, braket ditutup. 471 00:26:34,260 --> 00:26:38,545 Dan jika Anda sudah melakukan set notasi builder dalam segala macam kelas matematika, 472 00:26:38,545 --> 00:26:45,999 Anda mungkin telah menetapkan 2n seperti bahwa n adalah di atau n dalam z. 473 00:26:45,999 --> 00:26:48,290 Mirip thing-- notasi ini dimaksudkan untuk menjadi sugestif 474 00:26:48,290 --> 00:26:49,630 itu notasi matematika. 475 00:26:49,630 --> 00:26:51,880 STEPHEN KREWSON: Dan Anda bisa menerapkan beberapa predikat 476 00:26:51,880 --> 00:26:56,250 dan beberapa filter dalam daftar pemahaman, yang cukup bagus. 477 00:26:56,250 --> 00:27:01,800 Aljabar kita types-- tidak akan berlama-lama lama di sini. 478 00:27:01,800 --> 00:27:04,840 Tidak ada gagasan yang baik di Haskell atau baik, gagasan yang jelas 479 00:27:04,840 --> 00:27:10,720 bagaimana untuk mengambil, katakanlah, default parameter ke fungsi atau sesuatu. 480 00:27:10,720 --> 00:27:13,370 Dalam Python, ini cukup mudah. 481 00:27:13,370 --> 00:27:18,460 Anda bisa saja mengatakan dengan sama pada deklarasi fungsi, 482 00:27:18,460 --> 00:27:21,420 nilai default di Kasus tidak diberikan. 483 00:27:21,420 --> 00:27:27,010 >> Dalam Haskell, Anda bisa mungkin menggunakan mungkin mungkin mengetik, 484 00:27:27,010 --> 00:27:32,190 yang mengambil baik apa-apa atau nilai tipe hanya. 485 00:27:32,190 --> 00:27:38,630 Jadi kita mengeksploitasi ini di mesin drum untuk memungkinkan kita untuk memberikan volume yang opsional 486 00:27:38,630 --> 00:27:40,730 parameter untuk masing-masing bagian gendang. 487 00:27:40,730 --> 00:27:46,160 488 00:27:46,160 --> 00:27:54,680 Sehingga memberi kita cara memiliki EQ atau volume pada saluran tertentu. 489 00:27:54,680 --> 00:27:56,440 >> Connor HARRIS: Dalam contoh Haskell lainnya, 490 00:27:56,440 --> 00:28:00,450 Anda mungkin lihat mungkin digunakan untuk fungsi yang mungkin gagal. 491 00:28:00,450 --> 00:28:03,470 Ini adalah salah satu yang umum. 492 00:28:03,470 --> 00:28:07,010 >> STEPHEN KREWSON: Dan Anda dapat menyediakan semacam pesan kesalahan sebagai default. 493 00:28:07,010 --> 00:28:11,020 Dan itu sangat berguna ketika Anda melakukan I / O di Haskell. 494 00:28:11,020 --> 00:28:12,044 Itu bisa trik. 495 00:28:12,044 --> 00:28:13,960 Connor HARRIS: Atau untuk contoh yang serupa, berpikir 496 00:28:13,960 --> 00:28:17,460 dari fungsi yang melibatkan divisi dari parameter yang mungkin 0. 497 00:28:17,460 --> 00:28:20,020 Dan fungsi yang bisa kembali mungkin apapun. 498 00:28:20,020 --> 00:28:22,802 Jadi jika tidak ada pembagian dengan 0, itu akan kembali hanya apa pun. 499 00:28:22,802 --> 00:28:25,010 Dan jika ada pembagian dengan 0, itu akan kembali apa-apa 500 00:28:25,010 --> 00:28:26,910 sebagai cara sinyal kesalahan. 501 00:28:26,910 --> 00:28:30,330 Karena salah satu konsekuensi dari Mengetik sangat ketat Haskell 502 00:28:30,330 --> 00:28:34,100 adalah bahwa tidak ada real-- pengecualian canggung, pada dasarnya, 503 00:28:34,100 --> 00:28:36,160 penanganan kesalahan canggung. 504 00:28:36,160 --> 00:28:39,440 Dan ini adalah salah satu yang sangat cara yang umum untuk melakukannya. 505 00:28:39,440 --> 00:28:42,990 >> STEPHEN KREWSON: Jadi sekarang kita mendapatkan untuk hal pikiran-lipatan lain 506 00:28:42,990 --> 00:28:49,160 tentang Haskell, yang merupakan pola pencocokan dan fungsi definisi. 507 00:28:49,160 --> 00:28:53,390 Saya menunjukkan Anda dalam slide terakhir yang deklarasi urutan langkah 508 00:28:53,390 --> 00:28:58,170 fungsi, yang mengambil mungkin nilai, maka int, maka daftar int, 509 00:28:58,170 --> 00:29:03,850 kemudian kembali urutan nilai-nilai musik ada dijelaskan 510 00:29:03,850 --> 00:29:05,375 dengan kedua pitch dan volume. 511 00:29:05,375 --> 00:29:08,030 512 00:29:08,030 --> 00:29:11,820 >> Jadi tiga argumen dapat pola cocok dengan cara berikut. 513 00:29:11,820 --> 00:29:16,660 Dan kami selalu ingin pastikan untuk melakukan kasus dasar atau kasus pertama keluar. 514 00:29:16,660 --> 00:29:19,690 Dan garis bawah ini bisa saja ditafsirkan 515 00:29:19,690 --> 00:29:22,340 berarti setiap nilai yang ada. 516 00:29:22,340 --> 00:29:26,580 Jadi jika kita mendapatkan panggilan ke langkah urutan dengan beberapa nilai, beberapa nilai lain, 517 00:29:26,580 --> 00:29:32,210 dan kemudian daftar kosong, apa yang kita inginkan untuk kembali hanya diam, istirahat 0. 518 00:29:32,210 --> 00:29:35,110 >> Dan bukannya yang menjadi daftar kosong atau 0, 519 00:29:35,110 --> 00:29:38,150 itu adalah sisa 0, karena kita berurusan dengan jenis musik, 520 00:29:38,150 --> 00:29:43,230 dan daftar kosong musik Jenis ini hanya sisa ada durasi. 521 00:29:43,230 --> 00:29:45,680 Ini tidak ada musik. 522 00:29:45,680 --> 00:29:51,460 Dan kemudian kita melihat apakah kita mendapatkan langkah urutan dengan v untuk argumen volume, 523 00:29:51,460 --> 00:29:57,290 p untuk instrumen pencegahan argumen, dan kemudian daftar x. 524 00:29:57,290 --> 00:29:58,360 >> Kemudian kami melakukan beberapa hal. 525 00:29:58,360 --> 00:30:01,290 Secara khusus, kami menerapkan daftar pemahaman ini, 526 00:30:01,290 --> 00:30:05,700 dan kami melakukan beberapa operasi pada nilai mungkin 527 00:30:05,700 --> 00:30:10,050 untuk mengubahnya menjadi nilai numerik sehingga itu bisa kemudian dicacah dan digunakan 528 00:30:10,050 --> 00:30:12,300 untuk memilih instrumen. 529 00:30:12,300 --> 00:30:16,730 Sekali lagi, ini sedikit bit sengaja inconcise 530 00:30:16,730 --> 00:30:20,580 hanya untuk menunjukkan semua hal-hal aneh Anda dapat melakukan di Haskell Anda 531 00:30:20,580 --> 00:30:23,170 lihatlah pada waktu Anda sendiri. 532 00:30:23,170 --> 00:30:23,802 >> Baiklah. 533 00:30:23,802 --> 00:30:26,010 Jadi kita akhirnya mendapatkan untuk melakukan apa yang kita ditetapkan untuk dilakukan, 534 00:30:26,010 --> 00:30:28,820 yang membuat beberapa musik komputer. 535 00:30:28,820 --> 00:30:32,250 Jadi kita akan mencoba untuk membuat lagu Frere Jacques. 536 00:30:32,250 --> 00:30:35,220 Jadi ada berapa banyak frasa dalam Frere Jacques? 537 00:30:35,220 --> 00:30:38,790 538 00:30:38,790 --> 00:30:39,680 Empat. 539 00:30:39,680 --> 00:30:40,460 Besar. 540 00:30:40,460 --> 00:30:42,490 Dan apa yang baik adalah bahwa mereka semua diulang 541 00:30:42,490 --> 00:30:46,990 jumlah yang sama kali, yaitu dua. 542 00:30:46,990 --> 00:30:50,730 >> Jadi kita memiliki empat frase masing-masing diulang dua kali. 543 00:30:50,730 --> 00:30:53,590 Dan khususnya, mereka berada di ronde. 544 00:30:53,590 --> 00:30:55,340 Dan ada banyak, banyak cara untuk menerapkan 545 00:30:55,340 --> 00:30:57,520 putaran yang bisa menyenangkan untuk dilakukan. 546 00:30:57,520 --> 00:31:00,260 Saya sudah melakukannya di cukup cara sederhana di sini, 547 00:31:00,260 --> 00:31:05,760 yang hanya untuk construct-- garis fungsi mengambil daftar nilai musik 548 00:31:05,760 --> 00:31:10,390 dan mengubahnya menjadi komposisi berurutan dengan menerapkan komposisi berurutan 549 00:31:10,390 --> 00:31:13,000 operator. 550 00:31:13,000 --> 00:31:19,540 >> Dan kemudian saya menunda bagian yang berbeda dengan membuat mereka mulai dengan istirahat. 551 00:31:19,540 --> 00:31:22,770 Jadi saya mulai dengan sisa dua ukuran, dan kemudian sisa empat langkah, 552 00:31:22,770 --> 00:31:26,160 dan kemudian sisa enam langkah-langkah, dan kemudian putaran 553 00:31:26,160 --> 00:31:32,290 bekerja, seperti yang kita semua tahu lagu ini. 554 00:31:32,290 --> 00:31:37,180 Kami melihat dua penjelasan atau modifikasi dari nilai-nilai musik 555 00:31:37,180 --> 00:31:43,150 yang terkandung dalam sekuensial ini susunan elemen musik. 556 00:31:43,150 --> 00:31:44,810 Kami memiliki volume add. 557 00:31:44,810 --> 00:31:48,960 Ini adalah fungsi untuk membubuhi keterangan musik dengan volume tertentu. 558 00:31:48,960 --> 00:31:51,320 Ini adalah contoh yang baik dari sinyal berjalan MIDI 559 00:31:51,320 --> 00:31:57,510 0-127, tujuh bit informasi yang dapat dilakukan. 560 00:31:57,510 --> 00:32:00,650 >> Dan then-- kita melihat hal itu sangat sebentar, tapi MIDI umum 561 00:32:00,650 --> 00:32:02,310 daftar semua instrumen yang berbeda. 562 00:32:02,310 --> 00:32:04,450 Dan ada tidak banyak dari mereka. 563 00:32:04,450 --> 00:32:11,230 Jika Anda menggunakan workstation audio digital, seperti Ableton Live atau Pro Tools, 564 00:32:11,230 --> 00:32:17,560 ada berbagai sangat luas synthesizer dan instrumen VST. 565 00:32:17,560 --> 00:32:21,510 Tapi standar MIDI hanya memiliki beberapa lusin, atau beberapa. 566 00:32:21,510 --> 00:32:22,799 Dan beberapa dari mereka yang lucu. 567 00:32:22,799 --> 00:32:25,840 Saya pikir akan menyenangkan jika kami bermain instrumen instrumen MIDI 568 00:32:25,840 --> 00:32:30,550 helikopter, dan kemudian Cara berikutnya melalui putaran, 569 00:32:30,550 --> 00:32:37,980 kami melakukan synth pad, dan kemudian dari ini memimpin klise gelombang persegi synth, 570 00:32:37,980 --> 00:32:44,240 dan kemudian suara cairan, yang merupakan sedikit tidak jelas pada MIDI buruk saya 571 00:32:44,240 --> 00:32:46,410 synthesizer, tapi mereka OK. 572 00:32:46,410 --> 00:32:50,030 >> Dan kemudian kita melihat let ini dan di sintaks dari Haskell, 573 00:32:50,030 --> 00:32:54,030 dan kemudian kami bermain semua bagian bersama-sama 574 00:32:54,030 --> 00:32:56,265 dengan operator komposisi paralel. 575 00:32:56,265 --> 00:33:00,260 576 00:33:00,260 --> 00:33:02,296 Dan kita mungkin bisa menunjukkan beberapa hal ini. 577 00:33:02,296 --> 00:33:07,674 578 00:33:07,674 --> 00:33:08,340 Berikut kode. 579 00:33:08,340 --> 00:33:14,960 Dan Anda bisa lihat di C, akan ada sebuah banyak kliring tenggorokan dan pengaturan 580 00:33:14,960 --> 00:33:19,760 kode tabel sebelum Anda bisa membuat musik seperti ini. 581 00:33:19,760 --> 00:33:22,080 Atau pemrograman lain bahasa, Anda mungkin akan 582 00:33:22,080 --> 00:33:27,210 harus berinteraksi dengan beberapa jenis perpustakaan atau API dan mengatur semuanya, 583 00:33:27,210 --> 00:33:28,725 dan kemudian Anda harus membersihkan. 584 00:33:28,725 --> 00:33:33,810 Tapi di sini di Haskell adalah, saya pikir, sekali Anda mendapatkan menguasainya, sangat 585 00:33:33,810 --> 00:33:35,770 dibaca dan sangat ekspresif. 586 00:33:35,770 --> 00:33:38,930 587 00:33:38,930 --> 00:33:43,240 Jadi ada pelaksanaan dari Frere Jacques. 588 00:33:43,240 --> 00:33:43,740 Baiklah. 589 00:33:43,740 --> 00:33:47,557 Sekarang kita ingin menambahkan perkusi, dan ini adalah sedikit berantakan sedikit. 590 00:33:47,557 --> 00:33:49,015 Jadi mari kita lihat pada slide. 591 00:33:49,015 --> 00:33:56,880 592 00:33:56,880 --> 00:34:00,540 Jadi ide besar adalah untuk membuat sekelompok daftar atau bagian. 593 00:34:00,540 --> 00:34:04,140 Pada orang-orang roll-dalam mesin, ada yang biasanya sekitar mungkin delapan 594 00:34:04,140 --> 00:34:08,670 10 ritme atau perkusi bagian. 595 00:34:08,670 --> 00:34:10,159 Dan kemudian menggunakan sekelompok teknik. 596 00:34:10,159 --> 00:34:14,889 Dan kami telah berbicara tentang these-- menggunakan lipatan, filter, fungsi lambda, 597 00:34:14,889 --> 00:34:19,429 dipetakan lebih daftar untuk menghasilkan nilai-nilai di beberapa kisaran 1 sampai r, r adalah 16, 598 00:34:19,429 --> 00:34:20,699 atau 32 langkah di sequencer. 599 00:34:20,699 --> 00:34:23,810 600 00:34:23,810 --> 00:34:29,920 >> Dan kemudian jika ada nilai dalam daftar yang seperti yang kita berjalan melalui sequencer, 601 00:34:29,920 --> 00:34:34,190 berjalan melalui itu berulang- lebih, ternyata pada catatan itu, 602 00:34:34,190 --> 00:34:36,060 dan sampel yang akan memicu. 603 00:34:36,060 --> 00:34:42,810 604 00:34:42,810 --> 00:34:47,110 Berikut adalah semua cara yang aneh yang berbeda Saya datang dengan untuk menghasilkan catatan. 605 00:34:47,110 --> 00:34:48,940 Cobalah setengah jumlah Anda sendiri. 606 00:34:48,940 --> 00:34:50,360 Ini akan terdengar keren. 607 00:34:50,360 --> 00:34:53,066 608 00:34:53,066 --> 00:34:54,690 Waktu memungkinkan, kita akan pergi melalui ini. 609 00:34:54,690 --> 00:34:59,200 Tapi untuk sekarang, saya kira kita harus demo apa yang kita miliki. 610 00:34:59,200 --> 00:35:01,380 Mari kita berharap ini berjalan OK. 611 00:35:01,380 --> 00:35:02,670 >> Jadi ini adalah ghci. 612 00:35:02,670 --> 00:35:06,580 613 00:35:06,580 --> 00:35:09,121 Dan kita akan memuat file Saya memiliki disebut song.lhs, 614 00:35:09,121 --> 00:35:10,620 yang merupakan file saya hanya menunjukkan Anda. 615 00:35:10,620 --> 00:35:11,470 OK bagus. 616 00:35:11,470 --> 00:35:15,010 Seperti kata Connor sebelumnya, disusun, itu ketik diperiksa, 617 00:35:15,010 --> 00:35:18,380 jadi saya bisa bernapas lebih mudah. 618 00:35:18,380 --> 00:35:20,010 Ini tidak akan meledakkan pada saya. 619 00:35:20,010 --> 00:35:22,720 >> Aku ingin menunjukkan sesuatu yang bermanfaat. 620 00:35:22,720 --> 00:35:25,900 Anda dapat melihat bahwa modul dimuat disebut 50. 621 00:35:25,900 --> 00:35:28,240 Anda dapat menelusuri modul itu. 622 00:35:28,240 --> 00:35:32,092 Dan ini sangat bagus tentang doing-- mungkin apa 623 00:35:32,092 --> 00:35:34,550 Anda lakukan di Haskell tidak disebut pengembangan perangkat lunak, 624 00:35:34,550 --> 00:35:36,980 tetapi Anda dapat melakukan banyak hal-hal menyenangkan pada Anda sendiri. 625 00:35:36,980 --> 00:35:42,410 Dan alur kerja benar-benar baik sebagai dibandingkan dengan banyak bahasa lain, 626 00:35:42,410 --> 00:35:45,872 karena Anda dapat melihat di benar-benar Cara mudah dibaca apa yang terjadi. 627 00:35:45,872 --> 00:35:47,830 Jadi kita melihat bahwa kita memiliki semua frase ini, yang 628 00:35:47,830 --> 00:35:53,760 adalah daftar pitches musik, dan kemudian kita membangun ini menjadi sesuatu yang lebih besar, 629 00:35:53,760 --> 00:35:55,220 yang merupakan lagu musik. 630 00:35:55,220 --> 00:35:58,450 Ini adalah unit musik. 631 00:35:58,450 --> 00:36:05,545 Dan kemudian kita bisa bermain ini semua dengan fungsi yang disebut bermain musik. 632 00:36:05,545 --> 00:36:09,040 Anda dapat melihat bahwa di sini. 633 00:36:09,040 --> 00:36:11,310 Yang hanya bermain. 634 00:36:11,310 --> 00:36:15,040 >> Saya harus say-- saya tidak berbicara tentang tanda dolar ini itu di mana-mana. 635 00:36:15,040 --> 00:36:17,980 Dolar tanda adalah operator infiks lain. 636 00:36:17,980 --> 00:36:22,500 Tetapi memiliki prioritas terendah dari operator manapun, yang secara efektif 637 00:36:22,500 --> 00:36:24,960 berarti bahwa segala sesuatu di di sebelah kiri tanda dolar 638 00:36:24,960 --> 00:36:28,460 dan hak tanda dolar, kita akan mendapatkan dievaluasi sebelum. 639 00:36:28,460 --> 00:36:31,430 Jadi itu semacam lain cara menambahkan kurung. 640 00:36:31,430 --> 00:36:33,980 641 00:36:33,980 --> 00:36:36,220 >> Connor HARRIS: Pada dasarnya Komposisi fungsi. 642 00:36:36,220 --> 00:36:40,026 Dan memastikan bahwa Anda tidak have-- jika Anda memiliki fungsi kedua sisi atau infiks 643 00:36:40,026 --> 00:36:42,900 operator di kedua sisi, mereka tidak akan mengasosiasikan di atasnya dan memberikan 644 00:36:42,900 --> 00:36:46,030 hasil yang tidak diharapkan. 645 00:36:46,030 --> 00:36:49,790 >> STEPHEN KREWSON: Jadi kita can-- menggunakan itu, kami dapat memanggil. 646 00:36:49,790 --> 00:36:51,415 Pertama, kami akan bermain tanpa drum. 647 00:36:51,415 --> 00:37:00,330 648 00:37:00,330 --> 00:37:03,170 Itu helikopter, helikopter MIDI. 649 00:37:03,170 --> 00:37:05,495 >> [MUSIC PLAYING] 650 00:37:05,495 --> 00:37:08,525 651 00:37:08,525 --> 00:37:09,525 Ada gelombang persegi. 652 00:37:09,525 --> 00:37:24,520 653 00:37:24,520 --> 00:37:25,490 The cairan suara. 654 00:37:25,490 --> 00:37:27,630 Dan Anda benar-benar bisa pergi liar dengan ini. 655 00:37:27,630 --> 00:37:30,872 Aku mengambil salah satu yang cukup sederhana, karena aku tahu aku seharusnya tidak menggigit 656 00:37:30,872 --> 00:37:31,830 lebih dari saya bisa mengunyah. 657 00:37:31,830 --> 00:37:36,460 Hanya tetap cukup sederhana untuk menunjukkan ide-ide utama. 658 00:37:36,460 --> 00:37:39,952 Tapi kemudian aku seperti, kami telah harus menambahkan beberapa drum ini. 659 00:37:39,952 --> 00:37:41,910 Hanya karena ini adalah sedikit ditembus, 660 00:37:41,910 --> 00:37:45,790 dan saya tidak menggunakan nama dari bagian-bagian drum yang, 661 00:37:45,790 --> 00:37:49,490 Aku dipetakan them-- karena mereka bagian dari kelas enumerasi, 662 00:37:49,490 --> 00:37:51,500 Aku dipetakan mereka untuk int. 663 00:37:51,500 --> 00:37:53,120 Salah satunya adalah seperti drum bass. 664 00:37:53,120 --> 00:37:54,370 Nol adalah juga. 665 00:37:54,370 --> 00:37:56,000 Tujuh adalah topi tinggi. 666 00:37:56,000 --> 00:38:00,920 Dan turun di sini di mana fungsi mendapatkan sedikit lebih acak, 667 00:38:00,920 --> 00:38:02,100 ini adalah seperti drum conga. 668 00:38:02,100 --> 00:38:08,360 >> Jadi jika Anda berpikir about-- mungkin cara yang menyenangkan untuk mengimplementasikan mesin drum 669 00:38:08,360 --> 00:38:12,830 adalah dengan menggunakan sangat tertib pola pada drum bass Anda. 670 00:38:12,830 --> 00:38:17,640 Jadi misalnya, pada penyaringan atas daftar dengan segala sesuatu yang memberikan kembali 671 00:38:17,640 --> 00:38:20,590 1 ketika itu diambil modul 04. 672 00:38:20,590 --> 00:38:27,190 Jadi saya mendapatkan 1, 5, 9, 13, 17-- jadi ini adalah beat pertama setiap ukuran. 673 00:38:27,190 --> 00:38:32,860 >> Dan maka ini adalah sama Hal bergeser lebih dari dua langkah. 674 00:38:32,860 --> 00:38:33,850 Jadi itulah offbeat. 675 00:38:33,850 --> 00:38:37,480 Jadi ini akan menjadi sesuatu seperti topi tinggi. 676 00:38:37,480 --> 00:38:39,640 Dan sekali lagi, di sini, itu sedikit acak, 677 00:38:39,640 --> 00:38:41,080 karena kita sedang melakukan drum conga. 678 00:38:41,080 --> 00:38:44,180 Dan saya memiliki beberapa marakas di sini, juga. 679 00:38:44,180 --> 00:38:50,280 >> Jadi saya bisa menelepon bermain drum mesin, tapi itu akan berlangsung selamanya, 680 00:38:50,280 --> 00:38:53,700 dan mungkin mulai menyambar up semua memori di sistem saya. 681 00:38:53,700 --> 00:38:57,090 Jadi saya akan memanggil fungsi ini memainkan musik, yang seperti kita lihat, 682 00:38:57,090 --> 00:39:02,020 menggunakan komposisi paralel truncating memainkan sedikit lagu Frere Jacques kami 683 00:39:02,020 --> 00:39:04,200 bersama dengan mesin drum aneh ini. 684 00:39:04,200 --> 00:39:06,190 Jadi mari kita lihat. 685 00:39:06,190 --> 00:39:10,920 Dan jangan memperbaiki saya susunan semua bagian drum yang. 686 00:39:10,920 --> 00:39:13,375 Bukan spesialisasi saya, tapi saya memiliki banyak bersenang-senang melakukannya. 687 00:39:13,375 --> 00:39:17,678 688 00:39:17,678 --> 00:39:20,654 >> [MUSIC PLAYING] 689 00:39:20,654 --> 00:39:52,260 690 00:39:52,260 --> 00:39:56,980 >> Jadi tentu saja, ini semua sedikit tidak menyenangkan 691 00:39:56,980 --> 00:40:01,100 jika kita tidak bisa mengubahnya untuk skor jadi mungkin itu 692 00:40:01,100 --> 00:40:04,650 bisa ditafsirkan oleh pemain manusia. 693 00:40:04,650 --> 00:40:06,535 Jadi saya tidak akan berjalan di sini. 694 00:40:06,535 --> 00:40:07,910 Aku sudah dihasilkan file. 695 00:40:07,910 --> 00:40:10,280 Anda dapat melihat bahwa ada dot LilyPond file-- dan ini 696 00:40:10,280 --> 00:40:14,500 akan Shalawat saya ke Connor-- dan file dot MIDI, 697 00:40:14,500 --> 00:40:18,610 dan file PDF dot, yang adalah apa yang LilyPond akhirnya akan menghasilkan. 698 00:40:18,610 --> 00:40:23,770 >> Tapi ini adalah mereka skrip, dan aku akan hanya menjalankan mereka dengan pilihan bantuan mereka. 699 00:40:23,770 --> 00:40:28,090 Jika Anda mendapatkan ini dan berjalan dengan Euterpea, Anda dapat menghasilkan file MIDI. 700 00:40:28,090 --> 00:40:31,160 Dan kemudian dari file MIDI program MIDI 2LY ini, 701 00:40:31,160 --> 00:40:34,930 Anda dapat menghasilkan Lily File kolam, dan kemudian Anda 702 00:40:34,930 --> 00:40:37,974 dapat menghasilkan PDF dari skor. 703 00:40:37,974 --> 00:40:39,390 Dan kita harus melihat ini. 704 00:40:39,390 --> 00:40:52,599 705 00:40:52,599 --> 00:40:55,140 Jadi Connor mungkin akan menunjukkan Anda bagaimana untuk membubuhi keterangan ini lebih baik, 706 00:40:55,140 --> 00:41:02,570 tapi ini Frere Jacques sebagai dihasilkan oleh saya di Euterpea. 707 00:41:02,570 --> 00:41:07,300 Hanya saja di C. Seharusnya aku pikir apa yang hack itu sebenarnya di. 708 00:41:07,300 --> 00:41:11,090 Tapi itu adalah pipa untuk bagaimana Anda melakukannya dengan itu. 709 00:41:11,090 --> 00:41:12,950 Mari kita bicara tentang LilyPond. 710 00:41:12,950 --> 00:41:15,780 >> Connor HARRIS: OK Mari kita lihat. 711 00:41:15,780 --> 00:41:19,480 712 00:41:19,480 --> 00:41:21,419 Apakah Anda menyebutkan Pelajari Anda Haskell? 713 00:41:21,419 --> 00:41:22,460 STEPHEN KREWSON: Oh yeah. 714 00:41:22,460 --> 00:41:23,480 Periksa Belajar Anda Haskell. 715 00:41:23,480 --> 00:41:24,410 Ada dalam sumber daya. 716 00:41:24,410 --> 00:41:26,830 Itulah bagaimana saya mulai belajar, dan itu bagus. 717 00:41:26,830 --> 00:41:27,580 Pembelajaran tidak bodoh. 718 00:41:27,580 --> 00:41:28,829 >> Connor HARRIS: Jadi itu secara online. 719 00:41:28,829 --> 00:41:34,760 Jadi seorang pria bernama [tidak terdengar] learnyouahaskell.com, tanpa spasi. 720 00:41:34,760 --> 00:41:37,065 Grammar sakit. 721 00:41:37,065 --> 00:41:38,690 STEPHEN KREWSON: Ini ilustrasi, juga. 722 00:41:38,690 --> 00:41:39,440 Connor HARRIS: Jadi apa LilyPond? 723 00:41:39,440 --> 00:41:42,480 Ini adalah pemrograman deklaratif bahasa untuk typesetting musik. 724 00:41:42,480 --> 00:41:45,480 Jadi Anda bisa declarative-- memikirkan hal-hal seperti HTML, 725 00:41:45,480 --> 00:41:50,900 di mana Anda tidak saying-- HTML tidak mengatakan bagaimana web browser harus 726 00:41:50,900 --> 00:41:52,180 membuat halaman langkah demi langkah. 727 00:41:52,180 --> 00:41:54,096 Ini hanya mengatakan ini adalah deskripsi tekstual 728 00:41:54,096 --> 00:41:56,100 dari apa yang Anda ingin halaman untuk terlihat seperti. 729 00:41:56,100 --> 00:41:59,310 >> Dan kemudian itu juga program yang mengkompilasi bahasa ini, 730 00:41:59,310 --> 00:42:02,300 atau membaca di dan kemudian benar-benar melakukan typesetting untuk Anda, 731 00:42:02,300 --> 00:42:05,570 dan meludah keluar ini indah mencari nilai PDF. 732 00:42:05,570 --> 00:42:08,250 Anda juga bisa mendapatkan format PNG atau apa pun. 733 00:42:08,250 --> 00:42:10,300 Cara yang baik untuk berpikir ini adalah dengan analogi 734 00:42:10,300 --> 00:42:16,620 adalah bahwa LaTeX adalah semacam LillyPond, tapi untuk hanya typesetting biasa. 735 00:42:16,620 --> 00:42:20,360 Jadi, bukannya of-- itu tidak WYSIWYG, Apa yang Anda Lihat 736 00:42:20,360 --> 00:42:22,960 Apakah Apa yang Anda Dapatkan, seperti, mengatakan Finale adalah, atau Sibelius, 737 00:42:22,960 --> 00:42:27,430 atau Microsoft Word, di mana Anda dapat mengetikkan real time dan rancangan hal secara real time 738 00:42:27,430 --> 00:42:31,340 dan melihat perubahan instan. 739 00:42:31,340 --> 00:42:32,140 >> Hal ini berbasis teks. 740 00:42:32,140 --> 00:42:35,290 Anda harus mengkompilasi Anda skor menggunakan program terpisah 741 00:42:35,290 --> 00:42:37,090 dan keluar PDF kemudian. 742 00:42:37,090 --> 00:42:43,320 Ini adalah sedikit kurang nyaman untuk digunakan jika Anda 743 00:42:43,320 --> 00:42:46,520 mencoba untuk menulis secara langsung menjadi skor dan Anda 744 00:42:46,520 --> 00:42:48,620 mencoba untuk menulis di komputer. 745 00:42:48,620 --> 00:42:50,830 Tapi ada banyak keuntungan untuk itu. 746 00:42:50,830 --> 00:42:56,110 Satu, memang terlihat jauh lebih baik, karena LillyPond benar-benar dapat 747 00:42:56,110 --> 00:42:58,210 meluangkan waktu untuk melakukan keputusan tata letak benar, 748 00:42:58,210 --> 00:43:02,380 tidak seperti Sibelius atau Finale, yang memiliki untuk membuat algoritma berkompromi sehingga 749 00:43:02,380 --> 00:43:05,020 bahwa mereka dapat menampilkan hal secara real time. 750 00:43:05,020 --> 00:43:07,660 >> Jadi mengapa LilyPond-- komputer grafis sulit. 751 00:43:07,660 --> 00:43:10,535 Jika Anda melakukan sesuatu dengan musik dan Anda ingin menulis skor, 752 00:43:10,535 --> 00:43:13,900 Anda tidak ingin menulis segala sesuatu sendiri 753 00:43:13,900 --> 00:43:19,040 dimulai dengan cara menggambar staf dan cara menggambar notes. 754 00:43:19,040 --> 00:43:21,020 Itu sangat sulit. Ini pernah dilakukan sebelumnya. 755 00:43:21,020 --> 00:43:22,170 Kamu baik-baik saja. 756 00:43:22,170 --> 00:43:26,200 >> Jika Anda ingin menggunakan Finale atau Sibelius, format file untuk hal-hal 757 00:43:26,200 --> 00:43:30,180 sangat rumit, dan Anda tidak bisa benar-benar menggunakannya pemrograman. 758 00:43:30,180 --> 00:43:35,020 Anda dapat membuka Sibelius dengan Finale dan pergi ke File, Ekspor sebagai PDF sendiri, 759 00:43:35,020 --> 00:43:37,600 tetapi Anda tidak bisa benar-benar menyebut bahwa dari naskah. 760 00:43:37,600 --> 00:43:40,440 LillyPond, Anda dapat menghubungi dari script tersebut. 761 00:43:40,440 --> 00:43:44,397 Anda bisa dengan mudah beralih LillyPond dengan LaTeX. 762 00:43:44,397 --> 00:43:47,230 Aku tidak akan punya banyak waktu untuk pergi dalam teknologi ini sekarang, 763 00:43:47,230 --> 00:43:48,321 tapi mereka ada. 764 00:43:48,321 --> 00:43:50,070 Jika Anda ingin melihat menjadi sebuah buku LillyPond, 765 00:43:50,070 --> 00:43:53,760 itu program yang datang dengan distribusi LillyPond Anda, 766 00:43:53,760 --> 00:43:57,030 dan itu untuk iterasi Fragmen LillyPond ke LaTeX 767 00:43:57,030 --> 00:44:00,340 jika Anda ingin melakukan sesuatu seperti dokumen musikologi besar 768 00:44:00,340 --> 00:44:02,289 dengan contoh-contoh, misalnya. 769 00:44:02,289 --> 00:44:04,580 Dan itu adalah keterampilan yang baik untuk hidup jika Anda melakukan apa-apa 770 00:44:04,580 --> 00:44:05,770 dengan musik, bukan hanya CS50. 771 00:44:05,770 --> 00:44:09,320 Saya telah menggunakan LillyPond untuk semua proyek komposisi saya 772 00:44:09,320 --> 00:44:11,880 karena saya pada dasarnya senior di sekolah tinggi. 773 00:44:11,880 --> 00:44:13,455 >> Jadi di sini adalah beberapa contoh sederhana. 774 00:44:13,455 --> 00:44:17,490 775 00:44:17,490 --> 00:44:21,060 Ini pada dasarnya perwakilan dari tingkat kesulitan 776 00:44:21,060 --> 00:44:23,481 bahwa kebanyakan orang akan hadapi itu mereka mencoba 777 00:44:23,481 --> 00:44:24,980 menggunakan LilyPond untuk proyek-proyek sederhana. 778 00:44:24,980 --> 00:44:29,519 Pertama ini awal untuk sebuah awal untuk paduan suara oleh Bach. 779 00:44:29,519 --> 00:44:31,810 Satu bawah ini adalah kutipan dari salah satu karya saya sendiri, 780 00:44:31,810 --> 00:44:34,650 dan itu hanya ada untuk menunjukkan Anda hal-hal seperti [tidak terdengar] 781 00:44:34,650 --> 00:44:38,550 menempatkan beberapa baris dalam yang sama Staf, bagaimana lirik undersetting bekerja. 782 00:44:38,550 --> 00:44:41,350 783 00:44:41,350 --> 00:44:46,110 Underlays lirik adalah hal yang sangat mudah digunakan LilyPond untuk musik paduan suara. 784 00:44:46,110 --> 00:44:48,814 >> Dan kemudian ada lagi contoh yang rumit di sini. 785 00:44:48,814 --> 00:44:50,980 Semua ini dilakukan dalam LilyPond dan mereka layak. 786 00:44:50,980 --> 00:44:55,280 Kutipan pertama ini adalah dari [Tak terdengar] berdasarkan [tak terdengar]. 787 00:44:55,280 --> 00:44:58,860 Dan ini [tidak terdengar] dari sepotong untuk solo bass 788 00:44:58,860 --> 00:45:03,550 seruling berdasarkan [tak terdengar], yang longtime-- seorang yang 789 00:45:03,550 --> 00:45:07,101 adalah anggota lama dari departemen musik di sini, saya pikir. 790 00:45:07,101 --> 00:45:08,600 Saya tidak yakin di mana dia lari ke. 791 00:45:08,600 --> 00:45:12,410 Tapi dia adalah penasihat dari Harvard Asosiasi komposer untuk waktu yang lama. 792 00:45:12,410 --> 00:45:13,530 Pria yang luar biasa. 793 00:45:13,530 --> 00:45:16,920 Dan ia menulis beberapa musik yang memiliki sangat notasi rumit yang LillyPond 794 00:45:16,920 --> 00:45:20,500 tetap bisa menangani dengan sangat baik. 795 00:45:20,500 --> 00:45:26,030 >> Jadi hanya untuk memberikan rasa apa kemampuan hal ini are-- sehingga 796 00:45:26,030 --> 00:45:28,960 internal LillyPond sangat rumit. 797 00:45:28,960 --> 00:45:31,060 Dan Anda dapat menggunakannya untuk waktu yang lama, termasuk 798 00:45:31,060 --> 00:45:32,520 untuk beberapa cukup rumit hal, tanpa benar-benar 799 00:45:32,520 --> 00:45:34,060 harus tahu banyak tentang mereka. 800 00:45:34,060 --> 00:45:38,720 Tetapi ide dasarnya adalah bahwa pada tingkat terendah, atom LillyPonds 801 00:45:38,720 --> 00:45:39,970 adalah catatan. 802 00:45:39,970 --> 00:45:42,761 Catatan mengandung konteks disebut suara. 803 00:45:42,761 --> 00:45:44,510 Jadi konteks suara pada dasarnya sesuai 804 00:45:44,510 --> 00:45:47,410 untuk satu baris polifoni. 805 00:45:47,410 --> 00:45:49,410 Dan kemudian konteks dapat terkandung hirarki 806 00:45:49,410 --> 00:45:53,590 di tingkat yang lebih tinggi yang mewakili staf pada skor 807 00:45:53,590 --> 00:45:56,750 atau kelompok yang lebih besar seperti staf piano atau staf paduan suara, 808 00:45:56,750 --> 00:45:58,990 dan kemudian akhirnya Seluruh konteks skor. 809 00:45:58,990 --> 00:46:02,260 Dan Anda benar-benar dapat mencakup beberapa nilai dalam sebuah buku. 810 00:46:02,260 --> 00:46:05,770 >> Dan setiap konteks memiliki jumlah engravers terpasang. 811 00:46:05,770 --> 00:46:08,340 Jika Anda melihat melalui isi konteks 812 00:46:08,340 --> 00:46:14,410 dan mencetak simbol tertentu atau kelas tertentu simbol yang diperlukan. 813 00:46:14,410 --> 00:46:17,840 Jadi untuk setiap konteks suara, ada [tidak terdengar] catatan 814 00:46:17,840 --> 00:46:24,270 pengukir yang pada dasarnya adalah fungsi atau sebuah benda yang menulis semua catatan 815 00:46:24,270 --> 00:46:26,290 kepala di bagian kanan halaman. 816 00:46:26,290 --> 00:46:29,510 Lalu ada pengukir sumbing, yang menulis keluar celah pada staf. 817 00:46:29,510 --> 00:46:31,517 Lalu ada metronom mark pengukir yang 818 00:46:31,517 --> 00:46:33,100 menulis keluar tanda metronom dalam skor. 819 00:46:33,100 --> 00:46:36,410 Dan semua ini cocok cantik baik ke hirarki. 820 00:46:36,410 --> 00:46:39,500 Dan itu sangat, sangat, sangat disesuaikan, yang Anda butuhkan 821 00:46:39,500 --> 00:46:42,880 jika Anda ingin mendapatkan hal-hal seperti itu. 822 00:46:42,880 --> 00:46:45,730 >> Jadi semua konteks memiliki banyak atribut yang berbeda 823 00:46:45,730 --> 00:46:52,410 Anda dapat memodifikasi untuk semuanya dari jarak ke berbagai font yang 824 00:46:52,410 --> 00:46:54,942 seleksi untuk ukuran hal. 825 00:46:54,942 --> 00:46:56,900 Jika Anda ingin melakukan bahkan hal yang lebih rumit, 826 00:46:56,900 --> 00:46:59,210 ada bahasa scripting tertanam. 827 00:46:59,210 --> 00:47:01,820 Mereka menggunakan skema, yang adalah dialek LISP. 828 00:47:01,820 --> 00:47:04,960 Ini mungkin tidak berarti apa-apa untuk Anda. 829 00:47:04,960 --> 00:47:06,900 Tapi pada dasarnya, skema fungsional lain 830 00:47:06,900 --> 00:47:09,500 bahasa pemrograman, lebih atau kurang. 831 00:47:09,500 --> 00:47:10,800 >> STEPHEN KREWSON: The tie-in. 832 00:47:10,800 --> 00:47:12,690 >> Connor HARRIS: Ya. 833 00:47:12,690 --> 00:47:15,390 Ini adalah baik tie-in, saya kira. 834 00:47:15,390 --> 00:47:20,150 Dan digunakan sebagai bahasa pengajaran, sebenarnya, turun Mass Ave. Di MIT. 835 00:47:20,150 --> 00:47:26,590 Dan itu sangat berguna untuk LillyPond karena berbagai alasan teknis. 836 00:47:26,590 --> 00:47:30,317 >> Dan jadi jika Anda ingin membuat sederhana tweak tergantung pada conditional, 837 00:47:30,317 --> 00:47:32,900 untuk example-- ada tertentu kondisi skor yang bertemu, 838 00:47:32,900 --> 00:47:36,495 membuat perubahan ke tata letak atau whatnot-- kemudian 839 00:47:36,495 --> 00:47:37,620 fasilitas tersebut yang ada. 840 00:47:37,620 --> 00:47:38,667 Mereka rumit. 841 00:47:38,667 --> 00:47:40,250 Jadi, inilah contoh kode cukup sederhana. 842 00:47:40,250 --> 00:47:43,810 Ini lima baris. 843 00:47:43,810 --> 00:47:46,120 Pada dasarnya, saya mendefinisikan dua staf. 844 00:47:46,120 --> 00:47:46,904 Ini di 3/4. 845 00:47:46,904 --> 00:47:48,695 Staf pertama memiliki melekat tempo mark, 846 00:47:48,695 --> 00:47:51,110 tapi itu benar-benar akan untuk pergi ke seluruh skor, 847 00:47:51,110 --> 00:47:54,960 karena tanda tempo berada di tingkat skor. 848 00:47:54,960 --> 00:47:59,044 Metronom tanda pengukir terpasang untuk mencetak konteks. 849 00:47:59,044 --> 00:48:01,460 Ada kunci yang berbeda, karena [tidak terdengar] pengukir 850 00:48:01,460 --> 00:48:02,710 terpasang staf. 851 00:48:02,710 --> 00:48:04,441 Anda benar-benar dapat lakukan adalah. 852 00:48:04,441 --> 00:48:06,190 Sampel saya menulis adalah benar-benar di C mayor, 853 00:48:06,190 --> 00:48:07,990 tapi itu hanya untuk menunjukkan Anda dapat memiliki 854 00:48:07,990 --> 00:48:09,570 kunci yang berbeda di staf yang berbeda. 855 00:48:09,570 --> 00:48:15,710 Dan sintaks dasar adalah Anda menulis dicatat nama dengan E, F, G, apa pun. 856 00:48:15,710 --> 00:48:18,910 Jika Anda ingin melakukan aksidensi, Anda akhiran IS atau ES. 857 00:48:18,910 --> 00:48:22,640 Ini adalah dari Belanda konvensi musicological. 858 00:48:22,640 --> 00:48:28,290 >> Dan untuk melakukan lompatan oktaf, Anda harus menggunakan ini centang tanda, koma atau tanda kutip. 859 00:48:28,290 --> 00:48:30,580 Relatif hanya berarti apa pun yang Anda memiliki catatan, 860 00:48:30,580 --> 00:48:34,080 secara otomatis akan plaec di oktaf paling dekat dengan yang sebelumnya. 861 00:48:34,080 --> 00:48:37,624 Dan jika Anda ingin melompat lebih dari sebuah fifth-- mengatakan kelima atau more-- 862 00:48:37,624 --> 00:48:39,165 maka Anda harus menggunakan [tidak terdengar]. 863 00:48:39,165 --> 00:48:42,580 Tapi sebaliknya, Anda tidak perlu menentukan oktaf dari setiap catatan tunggal. 864 00:48:42,580 --> 00:48:46,130 >> Dan relatif C, prima, dan C, Anda hanya menentukan tengah C 865 00:48:46,130 --> 00:48:48,630 dan basis C, catatan terutama pertama. 866 00:48:48,630 --> 00:48:55,020 Maka Anda memiliki staf yang mengatur ini dua suara atau sampel musik, 867 00:48:55,020 --> 00:48:56,730 dan Anda memiliki skor. 868 00:48:56,730 --> 00:48:58,440 Dan yang terlihat seperti ini. 869 00:48:58,440 --> 00:49:01,780 870 00:49:01,780 --> 00:49:05,380 >> Jika Anda ingin meluangkan waktu untuk copy bahwa sampel dari LillyPond 871 00:49:05,380 --> 00:49:07,530 kode pada sebelumnya geser ke bawah sini, dan Anda 872 00:49:07,530 --> 00:49:09,030 dapat menulis untuk LillyPond sendiri. 873 00:49:09,030 --> 00:49:11,280 Aku tahu kita punya sesuatu yang terlihat banyak seperti ini. 874 00:49:11,280 --> 00:49:17,236 875 00:49:17,236 --> 00:49:19,610 Jadi ada teknologi lain disebut Musik XML dipertahankan 876 00:49:19,610 --> 00:49:22,030 oleh orang-orang yang sama sekali berbeda. 877 00:49:22,030 --> 00:49:28,150 XML adalah data tekstual structure-- Saya tidak harus mengatakan data yang structure-- mengatakan 878 00:49:28,150 --> 00:49:29,580 peta metafora semacam. 879 00:49:29,580 --> 00:49:33,800 Dan itu dirancang untuk menahan data hirarkis sangat baik. 880 00:49:33,800 --> 00:49:37,050 HTML, misalnya, adalah jenis XML. 881 00:49:37,050 --> 00:49:41,090 Dan Anda dapat memberitahu XML karena mereka memiliki semua kurung sudut dan sudut 882 00:49:41,090 --> 00:49:44,700 tanda garis miring braket bahwa bidang data menunjukkan. 883 00:49:44,700 --> 00:49:47,390 >> Saya tidak memiliki kode Misalnya dari Music XML. 884 00:49:47,390 --> 00:49:50,450 Anda dapat menemukan sendiri. 885 00:49:50,450 --> 00:49:53,735 Pada dasarnya, alasan Anda mungkin ingin menggunakan XML sebagai tahap peralihan 886 00:49:53,735 --> 00:49:55,980 adalah, pertama-tama, itu format interchange 887 00:49:55,980 --> 00:50:02,301 untuk dasarnya every-- saya tidak harus mengatakan setiap, tapi banyak nilai yang berbeda 888 00:50:02,301 --> 00:50:02,800 penulis. 889 00:50:02,800 --> 00:50:04,966 Jadi jika Anda menulis di Musik XML, tidak hanya dapat LillyPond 890 00:50:04,966 --> 00:50:08,080 membacanya dengan bantuan auxilary ini program yang disebut Musik XML untuk LY, 891 00:50:08,080 --> 00:50:11,360 tetapi juga Finale dapat membaca itu, Sibelius dapat membacanya. 892 00:50:11,360 --> 00:50:14,770 Tergantung pada bagaimana objek internal Anda hirarki bekerja untuk mewakili musik, 893 00:50:14,770 --> 00:50:18,820 mungkin lebih mudah untuk menulis Musik XML daripada LillyPond 894 00:50:18,820 --> 00:50:22,410 dan hanya mengandalkan Musik XML untuk LY untuk melakukan konversi. 895 00:50:22,410 --> 00:50:24,282 >> Saya tidak berpikir [tidak terdengar] memiliki Music XML. 896 00:50:24,282 --> 00:50:25,490 STEPHEN KREWSON: Ini tidak. 897 00:50:25,490 --> 00:50:26,340 Seseorang bekerja di atasnya, meskipun. 898 00:50:26,340 --> 00:50:27,090 >> Connor HARRIS: OK. 899 00:50:27,090 --> 00:50:31,040 Euterpea tidak memiliki Musik XML belum fungsi output. 900 00:50:31,040 --> 00:50:35,340 Jika Anda ingin ide proyek akhir, mungkin berhubungan dengan orang-orang 901 00:50:35,340 --> 00:50:38,620 Stephen tahu, dan mereka bisa menggunakan bantuan Anda. 902 00:50:38,620 --> 00:50:40,992 >> STEPHEN KREWSON: Saya akan senang itu. 903 00:50:40,992 --> 00:50:43,450 Connor HARRIS: Juga, pada dasarnya, setiap bahasa pemrograman 904 00:50:43,450 --> 00:50:46,610 yang layak dan garam sudah memiliki perpustakaan XML, 905 00:50:46,610 --> 00:50:51,030 sehingga Anda dapat mengkonversi semua internal musik Anda ke dalam beberapa objek 906 00:50:51,030 --> 00:50:54,120 bahwa perpustakaan XML dapat menulis bahwa akan membutuhkan lebih sedikit 907 00:50:54,120 --> 00:50:57,470 perubahan struktur internal Anda untuk apa pun musik objek Anda 908 00:50:57,470 --> 00:51:00,310 ingin menulis daripada menulis itu langsung di LillyPond akan. 909 00:51:00,310 --> 00:51:04,380 Kemudian hanya mencetaknya dengan XML dengan perpustakaan XML dalam bahasa Anda, 910 00:51:04,380 --> 00:51:07,260 yang akan menjamin bahwa itu sintaksis benar dan semuanya, 911 00:51:07,260 --> 00:51:08,720 dan kemudian mengubahnya menjadi LillyPond. 912 00:51:08,720 --> 00:51:11,060 Jadi teknologi Anda mungkin ingin melihat ke dalam jika Anda melakukan sesuatu 913 00:51:11,060 --> 00:51:11,650 seperti ini. 914 00:51:11,650 --> 00:51:14,490 915 00:51:14,490 --> 00:51:16,370 >> [Tidak terdengar], lain teknologi auxilarry. 916 00:51:16,370 --> 00:51:21,700 Ini pada dasarnya adalah Tek Pekerjaan atau Tek Studio untuk LillyPond. 917 00:51:21,700 --> 00:51:25,380 Jadi ia menawarkan bantuan dengan sintaks, dengan template 918 00:51:25,380 --> 00:51:28,770 untuk berbagai umum kombinasi instrumen. 919 00:51:28,770 --> 00:51:32,780 Hal ini memungkinkan layar split melihat begitu Anda dapat memiliki kode Anda dalam satu jendela 920 00:51:32,780 --> 00:51:37,350 dan PDF di jendela lain dan klik tempat di PDF 921 00:51:37,350 --> 00:51:40,650 untuk melompat ke relevan bintik-bintik dalam kode sumber Anda. 922 00:51:40,650 --> 00:51:45,330 Ini lebih berguna jika Anda benar-benar menulis LillyPond file sendiri 923 00:51:45,330 --> 00:51:47,400 daripada jika Anda menghasilkan mereka pemrograman. 924 00:51:47,400 --> 00:51:51,230 Tapi sekali lagi, itu sesuatu yang berguna untuk memiliki. 925 00:51:51,230 --> 00:51:51,970 >> Besar. 926 00:51:51,970 --> 00:51:55,860 Resources-- lain saya hanya akan melalui ini dengan sangat cepat. 927 00:51:55,860 --> 00:52:01,270 LillyPond manuals-- LillyPond memiliki dokumentasi yang sangat baik di situsnya. 928 00:52:01,270 --> 00:52:02,270 Mereka memiliki tutorial. 929 00:52:02,270 --> 00:52:03,478 Mereka memiliki referensi sintaks. 930 00:52:03,478 --> 00:52:07,010 Mereka memiliki ratusan potongan untuk berbagai hal-hal kecil 931 00:52:07,010 --> 00:52:09,930 yo mungkin perlu lakukan untuk menunjukkan berbagai kemampuan. 932 00:52:09,930 --> 00:52:12,250 Jika Anda ingin menggunakan bahasa scripting 933 00:52:12,250 --> 00:52:14,740 atau membuat lebih luas kustomisasi, maka ada 934 00:52:14,740 --> 00:52:16,730 internal referensi di URL itu. 935 00:52:16,730 --> 00:52:21,950 Jika Anda ingin menggunakan Music XML, ada URL, musicxml.com/tutorial. 936 00:52:21,950 --> 00:52:27,960 >> Dan kemudian jika Anda perlu belajar skema karena Anda benar-benar ingin menggunakan 937 00:52:27,960 --> 00:52:30,960 fasilitas scripting di LillyPond, maka ada [tidak terdengar] disebut 938 00:52:30,960 --> 00:52:32,918 Interpretasi terstruktur Program Komputer, 939 00:52:32,918 --> 00:52:35,820 yang tidak hanya kedua terbesar CS buku yang pernah written-- 940 00:52:35,820 --> 00:52:39,770 menemukan saya setelah itu jika Anda ingin tahu apa yang saya pikir terbesar yang is-- 941 00:52:39,770 --> 00:52:43,580 tetapi juga sangat baik pengantar bahasa yang tepat. 942 00:52:43,580 --> 00:52:46,630 Anda tidak perlu lebih dari beberapa bagian pertama. 943 00:52:46,630 --> 00:52:47,827 >> Dan hanya itu. 944 00:52:47,827 --> 00:52:48,410 Ada pertanyaan? 945 00:52:48,410 --> 00:52:54,068 946 00:52:54,068 --> 00:52:57,972 >> SISWA: Dimana saya bisa download Anda dihasilkan Frere Jacques 947 00:52:57,972 --> 00:53:01,050 jadi saya bisa menempatkannya pada iPod saya? 948 00:53:01,050 --> 00:53:07,574 >> STEPHEN KREWSON: Nah, Anda dapat menulis ke beberapa file wav di Euterpea. 949 00:53:07,574 --> 00:53:08,490 Dan Anda memiliki kode. 950 00:53:08,490 --> 00:53:10,000 Itu di GitHub. 951 00:53:10,000 --> 00:53:15,590 Membuat variasi Anda sendiri Frere Jacques oleh CS50 pikiran sarang. 952 00:53:15,590 --> 00:53:17,095 Ini akan menjadi besar. 953 00:53:17,095 --> 00:53:18,220 Connor HARRIS: Orang lain? 954 00:53:18,220 --> 00:53:20,261 STEPHEN KREWSON: Kita perlu drum bass yang lebih baik, juga. 955 00:53:20,261 --> 00:53:21,935 Ini benar-benar buruk. 956 00:53:21,935 --> 00:53:26,565 >> STUDENT: Euterpea tidak hanya sisi komposisi, tetapi signal-- 957 00:53:26,565 --> 00:53:27,440 STEPHEN KREWSON: Ya. 958 00:53:27,440 --> 00:53:30,100 Bahkan, pekerjaan yang saya lakukan di Euterpea ketika saya 959 00:53:30,100 --> 00:53:33,450 mengambil this-- ada lulus kursus di Yale yang 960 00:53:33,450 --> 00:53:35,900 menggunakan itu-- pada sintesis suara. 961 00:53:35,900 --> 00:53:39,810 Jadi ada benar-benar cara yang baik menggunakan panah 962 00:53:39,810 --> 00:53:46,150 dan beberapa notasi yang kita lihat dari menyusun bersama-sama fungsi sinyal. 963 00:53:46,150 --> 00:53:50,610 Secara khusus, bass untuk sebagian dari mereka hanya gelombang sinus sederhana. 964 00:53:50,610 --> 00:53:54,240 Tapi jika Anda mulai membuat mereka cara program aneh, 965 00:53:54,240 --> 00:54:00,010 Anda bisa mendapatkan suara gila efek, seperti air terjun aneh. 966 00:54:00,010 --> 00:54:04,640 Anda dapat membuat sangat berpasir suara dengan banyak modulasi. 967 00:54:04,640 --> 00:54:07,730 >> Saya melakukan sebuah proyek di granular sintesis, yang 968 00:54:07,730 --> 00:54:12,290 suatu tempat di antara FM dan sampling. 969 00:54:12,290 --> 00:54:15,230 Anda mengambil sangat kecil, sampel sedikit, dan kemudian 970 00:54:15,230 --> 00:54:20,440 menggabungkan mereka dengan semacam modulator dan membangun suara yang lebih kaya. 971 00:54:20,440 --> 00:54:24,900 Kami juga melakukan pemodelan fisik, sehingga mencoba untuk berpikir tentang fisika 972 00:54:24,900 --> 00:54:29,410 dan psychoacoustics dari sesuatu seperti terompet, dan berpikir tentang cara 973 00:54:29,410 --> 00:54:32,320 suara yang memantul dari bel sangkakala 974 00:54:32,320 --> 00:54:35,200 dan akustik ruang dan pemodelan 975 00:54:35,200 --> 00:54:40,195 bahwa dengan osilator dasar. 976 00:54:40,195 --> 00:54:47,690 977 00:54:47,690 --> 00:54:48,940 Connor HARRIS: Terima kasih banyak. 978 00:54:48,940 --> 00:54:50,140 Terimakasih telah datang. 979 00:54:50,140 --> 00:54:52,400 Dan aku selalu bersedia untuk mengambil pertanyaan oleh 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: Ya. stephen.krewson@yale.edu. 982 00:54:57,020 --> 00:54:58,810 983 00:54:58,810 --> 00:55:00,360 Keren. 984 00:55:00,360 --> 00:55:01,667