Connor HARRIS: Hi. Aku Connor Harris. Aku CA CS50 di Harvard. STEPHEN KREWSON: Aku Stephen Krewson. Aku TF untuk CS50 di Yale. Connor HARRIS: Dan kita akan berbicara tentang beberapa teknologi yang Anda mungkin ingin menggunakan jika Anda tertarik dalam melakukan tugas akhir atau benar-benar apa-apa dengan musik. Kami akan fokus pada pertama bahasa pemrograman disebut Haskell. Ini adalah fungsional bahasa, sehingga paradigma sangat berbeda dari C atau PHP atau bahasa imperatif lain bahwa Anda telah menggunakan sudah, dan terutama pada perpustakaan ditulis dalam Haskell disebut Euterpea, yang dapat membantu orang dengan menulis musik fungsional, dasarnya. Dan Stephen akan memandu Anda melalui contoh yang bagus dari itu. Setelah ini, saya akan memperkenalkan Anda dengan sesuatu yang disebut LillyPond, yang adalah teknologi untuk musik typesetting. Ini semacam seperti LaTeX untuk musik jika ada dari Anda telah menggunakan LaTeX untuk kelas matematika atau Kelas P set lain atau apa pun. Dan jadi saya akan memberikan Anda, sekali lagi, beberapa contoh sederhana yang dan mengarahkan Anda ke umum arah beberapa sumber yang lebih baik. STEPHEN KREWSON: Dalam Selain itu, kami pikir itu akan keren untuk mengatur sedikit petunjuk menuju pipa antara File MIDI Euterpea dihasilkan di LillyPond, jadi kami memberikan beberapa instruksi pada skrip untuk melakukan itu yang disediakan dengan LillyPond hanya untuk tetap open source dan mendapatkan pipa pergi. Connor HARRIS: Sekali lagi, kita harus menekankan, dua teknologi ini, Anda tidak harus menggunakan mereka bersama-sama. Mereka tidak dirancang untuk bekerja bersama-sama, meskipun mereka sangat baik. STEPHEN KREWSON: Benar. Dan benar-benar gratis. Connor HARRIS: Jadi pengakuan, hanya membaca itu. STEPHEN KREWSON: Sepatutnya mencatat. Terima kasih kepada orang-orang. Ini saya akan berlama-lama di hanya sejenak. Proses instalasi adalah sedikit rumit. Kami telah baca saya di GitHub Anda dapat melihat di. Hanya email saya jika Anda memiliki pertanyaan. Tapi kita akan menjalankan ini dengan asumsi bahwa ini bekerja untuk semua orang. Connor HARRIS: Dan jika Anda tidak bisa mendapatkan LillyPond bekerja, bukan masalah besar. Tidak ada kompilasi hidup yang akan terlibat, setidaknya pada akhir saya. STEPHEN KREWSON: Haskell dan LillyPond harus keduanya memiliki installer. Euterpea download sebagai paket, seterusnya dan sebagainya. Jadi kita berbicara tentang musik komputer. Dan ini hanya sangat pandangan 50.000 kaki. Ada aspek yang berbeda dari itu. Dan ini adalah kasar dan akan mengaburkan beberapa detail. Tapi kita bisa memikirkan sesuatu seperti komposisi algoritmik, menggunakan algoritma, menggunakan kode, untuk menghasilkan beberapa jenis of-- mungkin serupa diri urutan catatan, atau mungkin catatan di bawah beberapa kendala. Dan kemudian mereka bisa dilakukan atau ditafsirkan dengan instrumen analog atau sesuatu seperti itu. Tapi komposisi itu dilakukan algorithmically. Tapi tentu saja, mungkin daerah musik komputer atau musik digital kita lebih akrab dengan digital sintesis suara atau sampel digital dan perekaman digital. Banyak instrumen digital dilakukan melalui pengambilan sampel digital. Bahkan, kita akan menggunakan salah satu dari mereka di bentuk font library suara nanti. Tapi ada juga sesuatu yang disebut sintesis digital yang keluar dari akhir 70-an dan ke era 80-an dengan Yamaha dan John Chowning di Stanford melakukan sintesis FM atau Frekuensi Modulation sintesis, di mana Anda memiliki pembawa sinyal dan sinyal modulasi baik dalam spektrum audio. Tapi apa yang kita fokus pada hari ini adalah sesuatu yang disebut MIDI, dan tentu saja, komposisi algoritmik. Kami tidak akan membuat instrumen, tetapi kita bukannya akan membuat beberapa musik, dan kemudian yang akan mendapatkan ditafsirkan oleh beberapa instrumen yang adalah konforman ke umum MIDI standar. Jadi apa MIDI? Saya tidak akan masuk terlalu dalam ke dalamnya, tapi MIDI adalah protokol transfer data. Ini semacam panduan di perusahaan yang berbeda dan industri untuk mengatur suara atau patch. Jadi kita akan melihat bahwa ada standar MIDI untuk semua perkusi yang berbeda suara dan rekomendasi MIDI untuk semua jenis synth atau jenis semua instrumen kelompok dalam sebuah orkestra, mengatakan. Anda mungkin akrab dengan 0 melalui 127 pesan MIDI. Sebuah sinyal MIDI biasanya satu bit yang menunjukkan apakah itu data atau paket status, dan kemudian ada tujuh bit sinyal. Dan ini dapat mengontrol segala sesuatu dari Volume dengan tindakan atau tekanan pada kunci tertentu jika Anda tampil dengan MIDI sebuah kontroler serta, tentu saja, catatan. Dan tentu saja, MIDI memiliki telah sangat berguna, karena itu adalah cara untuk kawat bersama-sama atau rantai daisy sekelompok perangkat keras MIDI. Saya memiliki tujuh atau delapan kembali di rumah saya. Itu akan benar-benar rumit, tapi itu benar-benar kuat. Dan itu benar-benar tua. Ini dari awal '80 -an, dan itu benar-benar bagus dan kecil. Connor HARRIS: Ya. Semua Nintendo klasik video game mungkin akan memiliki file MIDI untuk musik, misalnya. STEPHEN KREWSON: Berikut ini adalah contoh MIDI umum, menunjukkan MIDI sebagai sejenis protokol umum. Dan saya pikir kita bisa memikirkan perbedaan antara spesifikasi bahwa harus ada sesuatu seperti Instrumen ini terdengar dan aktual realisasi instrumen tersebut terdengar di font suara atau MIDI tertentu synthesizer sebagai perbedaan antara mungkin typeface-- yang mengatakan, secara umum, ini adalah desain cara tertentu untuk mewakili characters-- dan font tertentu yang memiliki ukuran dan timbre tertentu, dan ada realisasi the-- Connor HARRIS: Mungkin lebih baik dibandingkan akan menjadi standar Unicode says-- memberikan nomor untuk setiap karakter, dan benar-benar setiap bahasa di dunia, atau satu set besar script bahasa di dunia, dan kemudian mereka adalah diberikan ke grafis sesuatu oleh berbagai paket font. Dan jelas, Anda bisa memikirkan MIDI sebagai Unicode suara. Dan itu hanya daftar of-- aliran besar peristiwa dan instrumen dan yang lainnya, dan Anda harus memiliki terpisah Program, seperti jenis huruf a, untuk membuat itu menjadi sesuatu yang terdengar. STEPHEN KREWSON: Jadi mengapa Haskell? Haskell adalah pemrograman fungsional bahasa, sangat maju, sangat berbeda dari C, sangat berbeda dari PHP. Dan kita akan melihat bahwa ada sebuah kemudahan komposisi fungsi dalam Haskell yang akan memungkinkan kita untuk angin melalui menyusun atau mengetik, menyalin, sesuatu seperti Frere Jacques, Lagu sederhana ini yang memiliki banyak bagian di dalamnya yang yang serupa diri atau mengulangi. Jadi ini akan menjadi beberapa motivasi mengapa kita sedang menggunakan Haskell, di mana fungsi adalah warga negara kelas satu. Dan saya ingin memperpanjang ini sedikit. Ini sedikit mudah untuk notate Frere Jacques di Haskell. Tapi bagaimana jika kita ingin menambahkan bagian drum itu? Bagaimana jika kita ingin mencoba untuk membuat sesuatu seperti Roland 808 atau 909 Drum mesin di mana Anda memiliki sekitar 16 langkah yang berbeda? Biasanya ini adalah memikirkan catatan sebagai 16. Dan Anda dapat mengontrol global tempo, dan Anda dapat memilih sekelompok bagian perkusi yang berbeda drum bass, bertepuk tangan, jerat yang berbeda, terbuka dan tertutup topi tinggi pada semacam ini saluran, dan kemudian Anda dapat EQ atau mengatur volume mereka. Dan kita akan melihat cara yang baik di Haskell mewakili langkah ini sequencer dengan semua berbagai hal keren di Haskell yang bisa kita lakukan dengan menghasilkan daftar dan penyaringan lebih daftar, pemetaan lebih daftar, pemetaan fungsi lebih daftar. Dan permintaan maaf yang cepat. Ini adalah sangat sepintas dan sketsa terlalu cepat dari beberapa aspek dari Haskell dan Euterpea, yang merupakan spesifik domain bahasa tertanam ditulis di Haskell untuk jenis musik. Jadi jangan lihat kode online. Jalankan ghci, yang merupakan Glasgow Haskell Compiler Interpreter. Dan saya akan melakukan beberapa ini dalam sedikit sehingga Anda dapat melihat bagaimana hal itu dilakukan. Dan ini memungkinkan Anda untuk memuat dengan the-- sintaks usus besar dan kemudian perintah. Anda dapat memuat dalam file. Anda dapat menggunakan browse pada file-file untuk melihat semua fungsi yang ada di modul tertentu. Dan kemudian seperti yang kita akan lihat, jenis dan tipe Kelas sangat penting dalam Haskell, sehingga Anda selalu dapat check-- terutama jika Anda bekerja di sebuah DSCL baru seperti ini, apa jenis musik? Aku tahu tentang cara numerik jenis bekerja di Haskell, tapi saya tidak tahu banyak tentang musik. Tapi Anda bisa menjelajahi cara mereka didefinisikan dengan menggunakan t atau jenis perintah dan kemudian memanggil tertentu fungsi atau objek data. Connor HARRIS: Ya. Jika Anda berpikir C dan dentang adalah hardass tentang jenis, Anda tidak tahu tentang Haskell. Hal yang baik tentang Haskell adalah bahwa jika Anda bisa mendapatkan kode Anda untuk mengkompilasi dan jika jenis Haskell cek, itu mungkin benar, karena sistem jenis begitu ketat. STEPHEN KREWSON: Ya. Jadi saya hanya ingin pergi through-- dan lagi, ini tidak melakukannya justice-- beberapa fitur Haskell itu, setidaknya untuk creators-- dan itu diciptakan di akhir 1980-an oleh sekelompok orang, komite sekitar 20 people-- pikir penting. Dan hal pertama yang mereka tercantum dalam kertas yang dijelaskan asal-usul Haskell selama 20 tahun pertama atau lebih adalah bahwa hal itu malas. Jadi apa artinya ini? Nah, itu berarti ketika kita memiliki semacam ekspresi, kita perlu mengevaluasinya. Dan Haskell melakukan hal ini dalam panggilan oleh kebutuhan cara atau cara non-ketat. Artinya, jika kita memiliki sekelompok komponen ekspresi kami, kami mencoba untuk menunda evaluasi dari mereka subkomponen sampai minute-- terakhir mutlak yaitu sampai kita benar-benar membutuhkannya. Jadi means-- ini yang benar-benar keren, terutama jika kita berpikir tentang abstraksi dari langkah sequencer musik. Anda menyalakannya, dan Anda mulai menjalankan langkah sequence-- jika Anda pernah bekerja dengan drum machine-- dan itu hanya pergi selamanya. Sehingga akan sangat baik jika kita bisa meniru bahwa dalam Haskell. Dan kita bisa melakukannya dengan tak terbatas nilai-nilai, dalam daftar tak terbatas tertentu. Ini sangat mudah untuk mengetik daftar terbatas di Haskell. Anda hanya bisa menggunakan sintaks turun di sini, di mana Anda melihat 1 sampai 3, menghapus 3 1 dot dot, dan yang merupakan daftar tak terbatas dari semua bilangan memperluas pada sejauh yang Anda bisa bayangkan. Saya ingin memperkenalkan Konsep lipatan segera. Dan lagi, tujuan dari seminar ini adalah tidak untuk belajar tentang lipatan di Haskell atau fungsi tatanan yang lebih tinggi. Tapi saya hanya ingin memperkenalkan kepada memberikan rasa yang akurat tentang bagaimana aneh Haskell dan bagaimana kuat itu. Dan khususnya, kita akan be-- ketika kita melakukan bagian drum yang kami berbeda, kita akan memanipulasi daftar nomor, lipat mereka ke satu sama lain. Dan untuk melakukan itu, kami akan akan menggunakan peta dan lipatan. Ada asosiatif yang tepat lipat, yang merupakan salah satu hak ini sini-1 dikurangi kuantitas, 2 minus kuantitas, 3 dikurangi 0. Dan sintaks untuk kali lipat, Anda memberikan lipatan nilai dasar dan kemudian operation-- dalam hal ini, penambahan atau pengurangan. Saya telah menunjukkan kedua kasus. Dan kemudian ada akumulator yang terakumulasi selama seluruh daftar, menerapkan bahwa operator plus atau dikurangi, dan kemudian mengumpulkan itu. Jadi ini akan menjadi the-- jika itu disebut dengan lipatan r ditambah 0, dimulai dengan 0, kita kemudian akan meringkas semua nomor dalam daftar itu. Dan itu adalah daftar dari 1 sampai 3. Connor HARRIS: Jadi untuk memasukkannya lain cara, lipat r mengambil tiga argumen. Ada fungsi yang itu sendiri membutuhkan dua argumen, kemudian ada nilai pemula, dan ada daftar nilai. Dan apa yang Anda lakukan adalah Anda mengambil Nilai pemula, nilai pertama, menempatkan mereka ke dalam fungsi. Apa yang Anda keluar, mengambil, pakan yang ke dalam fungsi Nilai kedua, apa yang Anda dapatkan, mengambil, memberi makan yang menjadi fungsi dari nilai ketiga. Dan kemudian jika Anda pergi ke Seluruh daftar ini dengan cara ini, Anda akan mendapatkan akhirnya beberapa nilai singular yang dari jenis yang sama dari apa yang Anda mulai dengan dan dari jenis yang sama sebagai hal-hal dalam daftar, dan kemudian itulah hasil kembalinya kali lipat R. STEPHEN KREWSON: Jadi pada khususnya, ini adalah fungsi yang lebih tinggi, karena mereka mengambil lain berfungsi sebagai salah satu argumen. Connor HARRIS: Ya. Jika Anda telah menggunakan tertentu lainnya languages-- Aku tahu R, [tidak terdengar] bahasa memiliki ini, disebut Mengurangi. Anda mungkin memiliki fungsi yang sama dalam bahasa lain, hanya disebut hal yang berbeda. STEPHEN KREWSON: Dan apa yang baik tentang kali lipat R dalam hal ini adalah bahwa kali lipat R dapat bekerja dengan daftar yang tak terbatas. Jadi di bawah ini, P5 ini menghasilkan catatan yang diaktifkan pada langkah sequencer untuk beberapa bagian gendang, bagian drum yang kelima, dan mungkin itu conga sebuah menghidupkan atau sesuatu. Dan ini adalah sengaja cara tumpul penulisan ini, tapi itu menyenangkan, karena hal ini menunjukkan banyak hal tentang Haskell dan Euterpea. Jadi lipat R usus colon-- ini hanya operator yang mendorong hal-hal bersama-sama pada list-- menyerukan kosong daftar, yang hanya kurung kosong. Dan aku menelepon bahwa daftar terbatas ini. Ini sebenarnya dua daftar ditambahkan bersama-sama di sini. Daftar 1 koma 6 dot dot adalah 1, 6, 11, 16. Jadi Haskell-- hanya beberapa karakter, Anda dapat menghasilkan seluruh yang urutan angka yang lima nomor terpisah peregangan pada ke infinity. Dan saya tambahkan dengan yang list-- sedikit lebih pendek ini 3, 8, 21-- hanya untuk menunjukkan Anda bagaimana Anda dapat menggabungkan daftar. Dan kemudian aku sudah dilipat pada dirinya sendiri. Dan ini akhirnya hanya menjadi semacam operasi identitas, tapi itu tak terbatas. Dan lipat R bisa melakukan itu, karena malas mengevaluasi, seperti di atas. Jika kita memiliki 1 dan 2 dan 3, kita bisa hanya braket dari seluruh sisanya. Itu tidak akan bekerja untuk dikurangi atau ditambah, tetapi akan bekerja untuk usus ini operasi identitas pada daftar. Jadi bagaimana kita praktis menggunakan bahwa jika kita memiliki daftar panjang tak terhingga hal? Nah, Haskell menyediakan banyak functions-- dan terlihat lebih ke dalam di time-- Anda sendiri seperti mengambil yang mengatakan, OK, kami menghasilkan daftar yang tak terbatas ini, tapi kami hanya akan mengambil beberapa jumlah itu Dan di case-- ini kita akan melihat ini nanti di drum mesin kami code-- GM hanya semacam global variabel untuk jumlah langkah di sequencer. Pada mesin roll-in saya menunjukkan Anda, itu biasanya 16, tapi saya telah menerapkan dengan 32. Itu tidak terlalu penting. Haskell juga murni, sehingga memiliki kuat mengetik statis yang Connor disinggung. Jadi fungsi yang matematika di sense-- mereka lebih matematika bahwa mereka dijamin untuk tidak mengakses atau mengubah apapun variabel atau melakukan input atau output. Jadi jika Anda memiliki fungsi, itu deterministik. Ini akan selalu kembali sama nilai di negara bagian program atau tetap sama. Ada, tentu saja, pengecualian monadik untuk ini, tapi itu di luar lingkup kita. Connor HARRIS: Ya. Apa artinya ini, meskipun, adalah ada adalah beberapa penting [tidak terdengar] Konsekuensi dari ini. Salah satunya adalah bahwa hal itu sangat mudah untuk memparalelkan program Haskell. Karena jika Anda memiliki, mengatakan, fungsi yang harus beroperasi pada nilai-nilai juta, jika Anda tahu bahwa fungsi akan selalu memberikan nilai yang sama jika Anda makan di sebuah value-- tertentu jika Anda [tidak terdengar] f dari 1, f dari 2, maka f dari 3 atau whatnot-- f dari 1 tidak akan menulis ke file atau melakukan sesuatu yang akan mengubah nilai f2. Anda hanya bisa berpisah fungsi ini untuk juta mesin yang berbeda atau satu juta benang yang berbeda atau apa pun, mendapatkan semua tanggapan kembali, mendapatkan semua kembali nilai-nilai kembali, dan kemudian itu saja. Jadi sangat mudah untuk memparalelkan hal. Downside adalah masukan yang dan output terutama masuk ke sistem jenis dengan cara yang sangat rumit. Kami tidak akan masuk ke itu sekarang, tapi aku mendorong Anda untuk melihat beberapa sumber online jika Anda ingin belajar tentang itu. STEPHEN KREWSON: Jadi ketik classes-- dan ini kelas was-- jenis diciptakan untuk memecahkan masalah operator overloading. Jadi kita ingin memiliki kesetaraan antara berbagai jenis hal. Tentu saja, kita bisa berpikir of-- kesetaraan antara jenis numerik sangat mudah untuk berpikir tentang, tapi apa tentang kesetaraan antara daftar? Bagaimana kesetaraan antara pohon struktur data kaki? Dan ini semua mungkin dalam Haskell karena tipe kelas. Jadi jika Anda menentukan type-- data tertentu dan di sini, ini adalah pitches musik. Kami akhirnya mendapatkan untuk beberapa musik komputer. Jadi kita memiliki C, C tajam, dan sebagainya dan sebagainya. Mereka milik sekelompok jenis kelas yang berbeda. EQ-- mereka milik kelas jenis EQ. Itu berarti mereka mendukung operasi kesetaraan. Sehingga Anda dapat mengevaluasi apakah satu urutan primitif musik adalah sama dengan yang berbeda. Mereka milik kelas ordinal. Itu berarti ada sebuah pemesanan untuk ini. D datang setelah C. C tajam datang setelah C juga. Mereka milik kelas menunjukkan, yang berarti mereka dapat dicetak ke konsol atau terminal. Mereka milik kelas disebutkan, yang berarti bahwa meskipun ini karakter, mereka memiliki angka yang mendasari representasi mulai dari 0 dan pergi melalui namun banyak hal di sini, 20 atau lebih, atau 30 atau 40, mungkin. Connor HARRIS: Dan ketika kami memiliki tipe data yang derives-- dengan kata kunci tersebut "deriving--" kelas jenis tertentu, itu berarti bahwa kompiler akan mencoba untuk membangun sesuatu yang otomatis. Jadi mungkin Anda akan ingin menentukan kualitas berbeda. Anda akan ingin mendefinisikan C tajam sebagai sama dengan D datar, misalnya. Dengan konstruksi ini di sini, saya tidak berpikir C tajam dan D datar akan sama, karena compiler secara otomatis akan mengatakan setiap nilai yang berbeda mungkin berbeda dari setiap lainnya. Sehingga memungkinkan untuk menimpa implementasi standar dari jenis kelas. Sekali lagi, melihat referensi jika Anda ingin belajar tentang itu. STEPHEN KREWSON: Dan di sini, benar-benar, ini akan membantu ketika kita kode kemudian. Kami melihat beberapa operator infiks untuk komposisi berurutan, komposisi paralel, dan begitu sebagainya, plus ini dan tanda-tanda yang sama dikelilingi oleh titik dua. Itu berarti kita bisa bermain yang berbeda primitif musik satu demi satu. Itu komposisi berurutan. Atau kita dapat memainkannya di paralel pada saat yang sama. Jadi saya bisa memiliki nilai musik, dan kemudian ini sama dan titik dua, infiks Operator komposisi paralel, dan bermain mereka sebagai semacam chord. Dan kita akan menggunakan ketika ini kita menggabungkan bagian gendang kami dengan kami sedikit lagu Frere Jacques memainkan dua urutan nilai-nilai musik pada saat yang sama. Currying Curry is-- terakhir nama dari Haskell Curry, yang gambar Haskell dinamai. Dan ini memungkinkan kita bagus elegan ketika kita menulis semua ini berbeda fungsi atau filter yang kami akan menjadi pemetaan lebih daftar kami. Sebuah fungsi dari dua arguments-- f dari x dan y-- dapat direpresentasikan sebagai f dari x diterapkan y. Jadi itu adalah fungsi dari satu argumen yang mengembalikan fungsi lain dari satu argumen. Jadi ini berarti kita dapat memetakan Fungsi f dari x lebih dari y yang daftar. Connor HARRIS: Ingin memberikan contoh dari ini? STEPHEN KREWSON: Ya. Saya punya contoh di sini dari beberapa hal yang kita akan menulis. Jadi meniru 2-- baik, mereplikasi akan mengambil satu nilai, yang adalah berapa banyak kali untuk meniru sesuatu, dan kemudian akan mengambil sebuah value-- biasanya daftar atau sesuatu. Jadi di sini, kami pemetaan mereplikasi 2 lebih daftar lain. Jadi jika kita memetakan mereplikasi 2, jika kita meniru 2 berlaku ke elemen pertama dari list-- ini dan ini adalah daftar phrases-- musik akan menghasilkan dua dari "Anda sleeping--" sehingga kau tidur, kau tidur. Jadi sekarang kita memiliki dua. Tapi mereplikasi mengambil dua argumen, tapi karena kita currying dan kemudian pemetaan, kita dapat mewakili mereplikasi 2 sebagai telah dikembalikan sebagai fungsi satu argument-- hanya mereplikasi dua kali. Dan kemudian kita menerapkan bahwa untuk setiap unsur ini daftar frase. Dan concat adalah Haskell operasi untuk meratakan daftar. Karena mereplikasi 2 kehendak menghasilkan daftar daftar. Dan ini adalah bentuk peralihan ini di sini. Dan kemudian kita dapat concat atau meratakan yang keluar dua kali. Connor HARRIS: Sebuah sederhana contoh currying, jika Anda akan like-- bayangkan f hanya fungsi perkalian yang mengambil dua argumen dan mengembalikan produk mereka. Jadi jika Anda memiliki f 4 5, itu 20. Tapi Anda bisa berpikir ini sebagai also-- Anda memiliki fungsi f 4 yang mengambil argumen dan pengembalian empat kali ini argument-- hanya aplikasi parsial yang hanya satu argumen 4. Dan jika Anda makan f dari 4 5, yang akan memberikan 20. Dan itu sederhana contoh currying. Ini biasanya salah satu yang buku teks. STEPHEN KREWSON: Lambda ekspresi atau fungsi anonim adalah ciri Haskell lain. Jadi jika kita perlu menyiapkan sedikit fungsi mereplikasi hidup, tapi mengatakan itu tidak di perpustakaan standar, kita dapat menggunakan sintaks mirip dengan berikut ini. Dan kami akan angin lebih ini. Satu hal yang Anda akan melihat banyak dari dalam drum mesin adalah kita membuat panggilan untuk sesuatu yang disebut menyaring, yang seperti sebelumnya, adalah pemetaan fungsi lebih daftar, tapi itu pemetaan fungsi Boolean. Jadi kita miliki di sini contoh dari sebuah anonim didefinisikan fungsi Boolean yang hanya berlangsung beberapa nilai. Hal ini tidak benar-benar berbicara fungsi anonim. Tapi itu menentukan dengan bahwa sintaks untuk singkatnya, dan ini hanya membutuhkan x modul n-- Connor HARRIS: Ya. Jadi f adalah fungsi dari dua argumen n dan p yang mengembalikan fungsi yang sendiri fungsi dari satu argumen, yaitu x. STEPHEN KREWSON: Saya operator infiks disebutkan. Apa operator infiks? Nah, operator infiks adalah cara biasa kami mewakili operasi, mengatakan, di mathematics-- 2 ditambah 2 bukannya operator ditambah dan kemudian dua argumen 2 dan 2. Connor HARRIS: Ini disebut membalikkan notasi polish, yang istilah saya ragu salah satu dari Anda akan tahu. STEPHEN KREWSON: Benar. Membalikkan polish atau awalan notasi. Tapi Haskell memutuskan untuk menggunakan operator infiks. Jadi ini adalah beberapa yang kustom yang didefinisikan untuk Euterpea DSCL di Haskell. Jadi ini adalah komposisi berurutan. Ini adalah komposisi paralel, dan ini itu truncating komposisi paralel. Dan kita akan membutuhkan dengan mesin drum kami, karena kita akan menggunakan yang terakhir Operator dalam tuple kecil ada untuk memainkan drum mesin bersama dengan lagu Frere Jacques kami. Dan mesin drum kami adalah akan menjadi tak terbatas. Itu hanya memainkan selamanya. Tapi lagu Frere Jacques tidak. Itu tidak lama. Ini hanya beberapa bar. Jadi kita perlu menghentikan mesin drum sebagai Begitu nilai musik yang lebih pendek datang berakhir. Dan bahwa operator infixed super membantu dengan itu. Dan notasi infiks seperti ini adalah jenis yang baik, karena mengatakan Anda memiliki fungsi seperti kutipan, yang memberikan pembagian integer x oleh sesuatu else-- maaf, yang harus a dan b. Anda bisa menulis itu sebagai kutipan dari b. Jadi, jika Anda adalah elemen put-- contoh lain dari ini. x elemen dalam beberapa daftar, jika Anda menempatkan dalam Backticks, Anda dapat menggunakannya. Meskipun itu bukan simbol seperti plus atau minus atau kali, Anda dapat menggunakan nama Fungsi seperti itu di Backticks sebagai operator infiks, yang cukup keren. Connor HARRIS: Sekali lagi, ini adalah semua gula hanya sintaksis, benar-benar. Ini tidak mempengaruhi inti dari bahasa. STEPHEN KREWSON: Jadi kita lihat di sini untuk frase terakhir dari lagu Frere Jacques kami, Saya memainkan beberapa akord sedikit atau pertiga menggunakan komposisi paralel operator. Ini adalah cara lain untuk mengatakan beberapa dari apa yang kita baru saja mengatakan. Sehingga Anda dapat memetakan fungsi dari satu argumen atas daftar. Connor HARRIS: Sekali lagi, referensi untuk buku teks pengantar Haskell-- akan memiliki semua ini di dalamnya. STEPHEN KREWSON: Jadi di sini adalah cukup baris kunci dari langkah sequencer kita akan melihat pada menggunakan daftar pemahaman. Dan kita lihat di sini adalah elemen yang di Operator tetap di belakang tanda kutip. Jadi jika x adalah elemen dari daftar x, maka kita akan memanggil fungsi PERC. Jadi PERC hanya fungsi perkusi. Dibutuhkan beberapa nilai p yang bagian dari himpunan dibatasi dari semua suara perkusi yang berbeda yang kita lihat di slide sebelumnya, dan kemudian memberikan yang durasi catatan kuartal. Lain itu memberikan QNR, dan QNR hanya sisa kuartal catatan. Jadi ini adalah membangun sesuatu yang baik. Kami memiliki daftar elemen, dan kita akan loop atas beberapa daftar dari satu dengan nilai maks langkah sequencer kami. Dan ketika kita berada di suatu i tertentu di bahwa daftar salah satu dengan nilai max, jika saya yang merupakan anggota dari ini set dibuat dalam fungsi ini, baik, maka kita hidupkan dalam catatan perkusi. Jika tidak, kita hanya memainkan istirahat, yang Artinya, kita hanya berdiam diri. Dan kita bisa lihat di sini bahwa dalam ini sintaks pemahaman daftar, x dihuni oleh ini daftar dibangun satu dengan ukuran global sequencer. Connor HARRIS: Ya. Sintaks dasar daftar comprehensions adalah braket, nilai yang melibatkan beberapa variabel, bar, mungkin nilai-nilai variabel sendiri, braket ditutup. Dan jika Anda sudah melakukan set notasi builder dalam segala macam kelas matematika, Anda mungkin telah menetapkan 2n seperti bahwa n adalah di atau n dalam z. Mirip thing-- notasi ini dimaksudkan untuk menjadi sugestif itu notasi matematika. STEPHEN KREWSON: Dan Anda bisa menerapkan beberapa predikat dan beberapa filter dalam daftar pemahaman, yang cukup bagus. Aljabar kita types-- tidak akan berlama-lama lama di sini. Tidak ada gagasan yang baik di Haskell atau baik, gagasan yang jelas bagaimana untuk mengambil, katakanlah, default parameter ke fungsi atau sesuatu. Dalam Python, ini cukup mudah. Anda bisa saja mengatakan dengan sama pada deklarasi fungsi, nilai default di Kasus tidak diberikan. Dalam Haskell, Anda bisa mungkin menggunakan mungkin mungkin mengetik, yang mengambil baik apa-apa atau nilai tipe hanya. Jadi kita mengeksploitasi ini di mesin drum untuk memungkinkan kita untuk memberikan volume yang opsional parameter untuk masing-masing bagian gendang. Sehingga memberi kita cara memiliki EQ atau volume pada saluran tertentu. Connor HARRIS: Dalam contoh Haskell lainnya, Anda mungkin lihat mungkin digunakan untuk fungsi yang mungkin gagal. Ini adalah salah satu yang umum. STEPHEN KREWSON: Dan Anda dapat menyediakan semacam pesan kesalahan sebagai default. Dan itu sangat berguna ketika Anda melakukan I / O di Haskell. Itu bisa trik. Connor HARRIS: Atau untuk contoh yang serupa, berpikir dari fungsi yang melibatkan divisi dari parameter yang mungkin 0. Dan fungsi yang bisa kembali mungkin apapun. Jadi jika tidak ada pembagian dengan 0, itu akan kembali hanya apa pun. Dan jika ada pembagian dengan 0, itu akan kembali apa-apa sebagai cara sinyal kesalahan. Karena salah satu konsekuensi dari Mengetik sangat ketat Haskell adalah bahwa tidak ada real-- pengecualian canggung, pada dasarnya, penanganan kesalahan canggung. Dan ini adalah salah satu yang sangat cara yang umum untuk melakukannya. STEPHEN KREWSON: Jadi sekarang kita mendapatkan untuk hal pikiran-lipatan lain tentang Haskell, yang merupakan pola pencocokan dan fungsi definisi. Saya menunjukkan Anda dalam slide terakhir yang deklarasi urutan langkah fungsi, yang mengambil mungkin nilai, maka int, maka daftar int, kemudian kembali urutan nilai-nilai musik ada dijelaskan dengan kedua pitch dan volume. Jadi tiga argumen dapat pola cocok dengan cara berikut. Dan kami selalu ingin pastikan untuk melakukan kasus dasar atau kasus pertama keluar. Dan garis bawah ini bisa saja ditafsirkan berarti setiap nilai yang ada. Jadi jika kita mendapatkan panggilan ke langkah urutan dengan beberapa nilai, beberapa nilai lain, dan kemudian daftar kosong, apa yang kita inginkan untuk kembali hanya diam, istirahat 0. Dan bukannya yang menjadi daftar kosong atau 0, itu adalah sisa 0, karena kita berurusan dengan jenis musik, dan daftar kosong musik Jenis ini hanya sisa ada durasi. Ini tidak ada musik. Dan kemudian kita melihat apakah kita mendapatkan langkah urutan dengan v untuk argumen volume, p untuk instrumen pencegahan argumen, dan kemudian daftar x. Kemudian kami melakukan beberapa hal. Secara khusus, kami menerapkan daftar pemahaman ini, dan kami melakukan beberapa operasi pada nilai mungkin untuk mengubahnya menjadi nilai numerik sehingga itu bisa kemudian dicacah dan digunakan untuk memilih instrumen. Sekali lagi, ini sedikit bit sengaja inconcise hanya untuk menunjukkan semua hal-hal aneh Anda dapat melakukan di Haskell Anda lihatlah pada waktu Anda sendiri. Baiklah. Jadi kita akhirnya mendapatkan untuk melakukan apa yang kita ditetapkan untuk dilakukan, yang membuat beberapa musik komputer. Jadi kita akan mencoba untuk membuat lagu Frere Jacques. Jadi ada berapa banyak frasa dalam Frere Jacques? Empat. Besar. Dan apa yang baik adalah bahwa mereka semua diulang jumlah yang sama kali, yaitu dua. Jadi kita memiliki empat frase masing-masing diulang dua kali. Dan khususnya, mereka berada di ronde. Dan ada banyak, banyak cara untuk menerapkan putaran yang bisa menyenangkan untuk dilakukan. Saya sudah melakukannya di cukup cara sederhana di sini, yang hanya untuk construct-- garis fungsi mengambil daftar nilai musik dan mengubahnya menjadi komposisi berurutan dengan menerapkan komposisi berurutan operator. Dan kemudian saya menunda bagian yang berbeda dengan membuat mereka mulai dengan istirahat. Jadi saya mulai dengan sisa dua ukuran, dan kemudian sisa empat langkah, dan kemudian sisa enam langkah-langkah, dan kemudian putaran bekerja, seperti yang kita semua tahu lagu ini. Kami melihat dua penjelasan atau modifikasi dari nilai-nilai musik yang terkandung dalam sekuensial ini susunan elemen musik. Kami memiliki volume add. Ini adalah fungsi untuk membubuhi keterangan musik dengan volume tertentu. Ini adalah contoh yang baik dari sinyal berjalan MIDI 0-127, tujuh bit informasi yang dapat dilakukan. Dan then-- kita melihat hal itu sangat sebentar, tapi MIDI umum daftar semua instrumen yang berbeda. Dan ada tidak banyak dari mereka. Jika Anda menggunakan workstation audio digital, seperti Ableton Live atau Pro Tools, ada berbagai sangat luas synthesizer dan instrumen VST. Tapi standar MIDI hanya memiliki beberapa lusin, atau beberapa. Dan beberapa dari mereka yang lucu. Saya pikir akan menyenangkan jika kami bermain instrumen instrumen MIDI helikopter, dan kemudian Cara berikutnya melalui putaran, kami melakukan synth pad, dan kemudian dari ini memimpin klise gelombang persegi synth, dan kemudian suara cairan, yang merupakan sedikit tidak jelas pada MIDI buruk saya synthesizer, tapi mereka OK. Dan kemudian kita melihat let ini dan di sintaks dari Haskell, dan kemudian kami bermain semua bagian bersama-sama dengan operator komposisi paralel. Dan kita mungkin bisa menunjukkan beberapa hal ini. Berikut kode. Dan Anda bisa lihat di C, akan ada sebuah banyak kliring tenggorokan dan pengaturan kode tabel sebelum Anda bisa membuat musik seperti ini. Atau pemrograman lain bahasa, Anda mungkin akan harus berinteraksi dengan beberapa jenis perpustakaan atau API dan mengatur semuanya, dan kemudian Anda harus membersihkan. Tapi di sini di Haskell adalah, saya pikir, sekali Anda mendapatkan menguasainya, sangat dibaca dan sangat ekspresif. Jadi ada pelaksanaan dari Frere Jacques. Baiklah. Sekarang kita ingin menambahkan perkusi, dan ini adalah sedikit berantakan sedikit. Jadi mari kita lihat pada slide. Jadi ide besar adalah untuk membuat sekelompok daftar atau bagian. Pada orang-orang roll-dalam mesin, ada yang biasanya sekitar mungkin delapan 10 ritme atau perkusi bagian. Dan kemudian menggunakan sekelompok teknik. Dan kami telah berbicara tentang these-- menggunakan lipatan, filter, fungsi lambda, dipetakan lebih daftar untuk menghasilkan nilai-nilai di beberapa kisaran 1 sampai r, r adalah 16, atau 32 langkah di sequencer. Dan kemudian jika ada nilai dalam daftar yang seperti yang kita berjalan melalui sequencer, berjalan melalui itu berulang- lebih, ternyata pada catatan itu, dan sampel yang akan memicu. Berikut adalah semua cara yang aneh yang berbeda Saya datang dengan untuk menghasilkan catatan. Cobalah setengah jumlah Anda sendiri. Ini akan terdengar keren. Waktu memungkinkan, kita akan pergi melalui ini. Tapi untuk sekarang, saya kira kita harus demo apa yang kita miliki. Mari kita berharap ini berjalan OK. Jadi ini adalah ghci. Dan kita akan memuat file Saya memiliki disebut song.lhs, yang merupakan file saya hanya menunjukkan Anda. OK bagus. Seperti kata Connor sebelumnya, disusun, itu ketik diperiksa, jadi saya bisa bernapas lebih mudah. Ini tidak akan meledakkan pada saya. Aku ingin menunjukkan sesuatu yang bermanfaat. Anda dapat melihat bahwa modul dimuat disebut 50. Anda dapat menelusuri modul itu. Dan ini sangat bagus tentang doing-- mungkin apa Anda lakukan di Haskell tidak disebut pengembangan perangkat lunak, tetapi Anda dapat melakukan banyak hal-hal menyenangkan pada Anda sendiri. Dan alur kerja benar-benar baik sebagai dibandingkan dengan banyak bahasa lain, karena Anda dapat melihat di benar-benar Cara mudah dibaca apa yang terjadi. Jadi kita melihat bahwa kita memiliki semua frase ini, yang adalah daftar pitches musik, dan kemudian kita membangun ini menjadi sesuatu yang lebih besar, yang merupakan lagu musik. Ini adalah unit musik. Dan kemudian kita bisa bermain ini semua dengan fungsi yang disebut bermain musik. Anda dapat melihat bahwa di sini. Yang hanya bermain. Saya harus say-- saya tidak berbicara tentang tanda dolar ini itu di mana-mana. Dolar tanda adalah operator infiks lain. Tetapi memiliki prioritas terendah dari operator manapun, yang secara efektif berarti bahwa segala sesuatu di di sebelah kiri tanda dolar dan hak tanda dolar, kita akan mendapatkan dievaluasi sebelum. Jadi itu semacam lain cara menambahkan kurung. Connor HARRIS: Pada dasarnya Komposisi fungsi. Dan memastikan bahwa Anda tidak have-- jika Anda memiliki fungsi kedua sisi atau infiks operator di kedua sisi, mereka tidak akan mengasosiasikan di atasnya dan memberikan hasil yang tidak diharapkan. STEPHEN KREWSON: Jadi kita can-- menggunakan itu, kami dapat memanggil. Pertama, kami akan bermain tanpa drum. Itu helikopter, helikopter MIDI. [MUSIC PLAYING] Ada gelombang persegi. The cairan suara. Dan Anda benar-benar bisa pergi liar dengan ini. Aku mengambil salah satu yang cukup sederhana, karena aku tahu aku seharusnya tidak menggigit lebih dari saya bisa mengunyah. Hanya tetap cukup sederhana untuk menunjukkan ide-ide utama. Tapi kemudian aku seperti, kami telah harus menambahkan beberapa drum ini. Hanya karena ini adalah sedikit ditembus, dan saya tidak menggunakan nama dari bagian-bagian drum yang, Aku dipetakan them-- karena mereka bagian dari kelas enumerasi, Aku dipetakan mereka untuk int. Salah satunya adalah seperti drum bass. Nol adalah juga. Tujuh adalah topi tinggi. Dan turun di sini di mana fungsi mendapatkan sedikit lebih acak, ini adalah seperti drum conga. Jadi jika Anda berpikir about-- mungkin cara yang menyenangkan untuk mengimplementasikan mesin drum adalah dengan menggunakan sangat tertib pola pada drum bass Anda. Jadi misalnya, pada penyaringan atas daftar dengan segala sesuatu yang memberikan kembali 1 ketika itu diambil modul 04. Jadi saya mendapatkan 1, 5, 9, 13, 17-- jadi ini adalah beat pertama setiap ukuran. Dan maka ini adalah sama Hal bergeser lebih dari dua langkah. Jadi itulah offbeat. Jadi ini akan menjadi sesuatu seperti topi tinggi. Dan sekali lagi, di sini, itu sedikit acak, karena kita sedang melakukan drum conga. Dan saya memiliki beberapa marakas di sini, juga. Jadi saya bisa menelepon bermain drum mesin, tapi itu akan berlangsung selamanya, dan mungkin mulai menyambar up semua memori di sistem saya. Jadi saya akan memanggil fungsi ini memainkan musik, yang seperti kita lihat, menggunakan komposisi paralel truncating memainkan sedikit lagu Frere Jacques kami bersama dengan mesin drum aneh ini. Jadi mari kita lihat. Dan jangan memperbaiki saya susunan semua bagian drum yang. Bukan spesialisasi saya, tapi saya memiliki banyak bersenang-senang melakukannya. [MUSIC PLAYING] Jadi tentu saja, ini semua sedikit tidak menyenangkan jika kita tidak bisa mengubahnya untuk skor jadi mungkin itu bisa ditafsirkan oleh pemain manusia. Jadi saya tidak akan berjalan di sini. Aku sudah dihasilkan file. Anda dapat melihat bahwa ada dot LilyPond file-- dan ini akan Shalawat saya ke Connor-- dan file dot MIDI, dan file PDF dot, yang adalah apa yang LilyPond akhirnya akan menghasilkan. Tapi ini adalah mereka skrip, dan aku akan hanya menjalankan mereka dengan pilihan bantuan mereka. Jika Anda mendapatkan ini dan berjalan dengan Euterpea, Anda dapat menghasilkan file MIDI. Dan kemudian dari file MIDI program MIDI 2LY ini, Anda dapat menghasilkan Lily File kolam, dan kemudian Anda dapat menghasilkan PDF dari skor. Dan kita harus melihat ini. Jadi Connor mungkin akan menunjukkan Anda bagaimana untuk membubuhi keterangan ini lebih baik, tapi ini Frere Jacques sebagai dihasilkan oleh saya di Euterpea. Hanya saja di C. Seharusnya aku pikir apa yang hack itu sebenarnya di. Tapi itu adalah pipa untuk bagaimana Anda melakukannya dengan itu. Mari kita bicara tentang LilyPond. Connor HARRIS: OK Mari kita lihat. Apakah Anda menyebutkan Pelajari Anda Haskell? STEPHEN KREWSON: Oh yeah. Periksa Belajar Anda Haskell. Ada dalam sumber daya. Itulah bagaimana saya mulai belajar, dan itu bagus. Pembelajaran tidak bodoh. Connor HARRIS: Jadi itu secara online. Jadi seorang pria bernama [tidak terdengar] learnyouahaskell.com, tanpa spasi. Grammar sakit. STEPHEN KREWSON: Ini ilustrasi, juga. Connor HARRIS: Jadi apa LilyPond? Ini adalah pemrograman deklaratif bahasa untuk typesetting musik. Jadi Anda bisa declarative-- memikirkan hal-hal seperti HTML, di mana Anda tidak saying-- HTML tidak mengatakan bagaimana web browser harus membuat halaman langkah demi langkah. Ini hanya mengatakan ini adalah deskripsi tekstual dari apa yang Anda ingin halaman untuk terlihat seperti. Dan kemudian itu juga program yang mengkompilasi bahasa ini, atau membaca di dan kemudian benar-benar melakukan typesetting untuk Anda, dan meludah keluar ini indah mencari nilai PDF. Anda juga bisa mendapatkan format PNG atau apa pun. Cara yang baik untuk berpikir ini adalah dengan analogi adalah bahwa LaTeX adalah semacam LillyPond, tapi untuk hanya typesetting biasa. Jadi, bukannya of-- itu tidak WYSIWYG, Apa yang Anda Lihat Apakah Apa yang Anda Dapatkan, seperti, mengatakan Finale adalah, atau Sibelius, atau Microsoft Word, di mana Anda dapat mengetikkan real time dan rancangan hal secara real time dan melihat perubahan instan. Hal ini berbasis teks. Anda harus mengkompilasi Anda skor menggunakan program terpisah dan keluar PDF kemudian. Ini adalah sedikit kurang nyaman untuk digunakan jika Anda mencoba untuk menulis secara langsung menjadi skor dan Anda mencoba untuk menulis di komputer. Tapi ada banyak keuntungan untuk itu. Satu, memang terlihat jauh lebih baik, karena LillyPond benar-benar dapat meluangkan waktu untuk melakukan keputusan tata letak benar, tidak seperti Sibelius atau Finale, yang memiliki untuk membuat algoritma berkompromi sehingga bahwa mereka dapat menampilkan hal secara real time. Jadi mengapa LilyPond-- komputer grafis sulit. Jika Anda melakukan sesuatu dengan musik dan Anda ingin menulis skor, Anda tidak ingin menulis segala sesuatu sendiri dimulai dengan cara menggambar staf dan cara menggambar notes. Itu sangat sulit. Ini pernah dilakukan sebelumnya. Kamu baik-baik saja. Jika Anda ingin menggunakan Finale atau Sibelius, format file untuk hal-hal sangat rumit, dan Anda tidak bisa benar-benar menggunakannya pemrograman. Anda dapat membuka Sibelius dengan Finale dan pergi ke File, Ekspor sebagai PDF sendiri, tetapi Anda tidak bisa benar-benar menyebut bahwa dari naskah. LillyPond, Anda dapat menghubungi dari script tersebut. Anda bisa dengan mudah beralih LillyPond dengan LaTeX. Aku tidak akan punya banyak waktu untuk pergi dalam teknologi ini sekarang, tapi mereka ada. Jika Anda ingin melihat menjadi sebuah buku LillyPond, itu program yang datang dengan distribusi LillyPond Anda, dan itu untuk iterasi Fragmen LillyPond ke LaTeX jika Anda ingin melakukan sesuatu seperti dokumen musikologi besar dengan contoh-contoh, misalnya. Dan itu adalah keterampilan yang baik untuk hidup jika Anda melakukan apa-apa dengan musik, bukan hanya CS50. Saya telah menggunakan LillyPond untuk semua proyek komposisi saya karena saya pada dasarnya senior di sekolah tinggi. Jadi di sini adalah beberapa contoh sederhana. Ini pada dasarnya perwakilan dari tingkat kesulitan bahwa kebanyakan orang akan hadapi itu mereka mencoba menggunakan LilyPond untuk proyek-proyek sederhana. Pertama ini awal untuk sebuah awal untuk paduan suara oleh Bach. Satu bawah ini adalah kutipan dari salah satu karya saya sendiri, dan itu hanya ada untuk menunjukkan Anda hal-hal seperti [tidak terdengar] menempatkan beberapa baris dalam yang sama Staf, bagaimana lirik undersetting bekerja. Underlays lirik adalah hal yang sangat mudah digunakan LilyPond untuk musik paduan suara. Dan kemudian ada lagi contoh yang rumit di sini. Semua ini dilakukan dalam LilyPond dan mereka layak. Kutipan pertama ini adalah dari [Tak terdengar] berdasarkan [tak terdengar]. Dan ini [tidak terdengar] dari sepotong untuk solo bass seruling berdasarkan [tak terdengar], yang longtime-- seorang yang adalah anggota lama dari departemen musik di sini, saya pikir. Saya tidak yakin di mana dia lari ke. Tapi dia adalah penasihat dari Harvard Asosiasi komposer untuk waktu yang lama. Pria yang luar biasa. Dan ia menulis beberapa musik yang memiliki sangat notasi rumit yang LillyPond tetap bisa menangani dengan sangat baik. Jadi hanya untuk memberikan rasa apa kemampuan hal ini are-- sehingga internal LillyPond sangat rumit. Dan Anda dapat menggunakannya untuk waktu yang lama, termasuk untuk beberapa cukup rumit hal, tanpa benar-benar harus tahu banyak tentang mereka. Tetapi ide dasarnya adalah bahwa pada tingkat terendah, atom LillyPonds adalah catatan. Catatan mengandung konteks disebut suara. Jadi konteks suara pada dasarnya sesuai untuk satu baris polifoni. Dan kemudian konteks dapat terkandung hirarki di tingkat yang lebih tinggi yang mewakili staf pada skor atau kelompok yang lebih besar seperti staf piano atau staf paduan suara, dan kemudian akhirnya Seluruh konteks skor. Dan Anda benar-benar dapat mencakup beberapa nilai dalam sebuah buku. Dan setiap konteks memiliki jumlah engravers terpasang. Jika Anda melihat melalui isi konteks dan mencetak simbol tertentu atau kelas tertentu simbol yang diperlukan. Jadi untuk setiap konteks suara, ada [tidak terdengar] catatan pengukir yang pada dasarnya adalah fungsi atau sebuah benda yang menulis semua catatan kepala di bagian kanan halaman. Lalu ada pengukir sumbing, yang menulis keluar celah pada staf. Lalu ada metronom mark pengukir yang menulis keluar tanda metronom dalam skor. Dan semua ini cocok cantik baik ke hirarki. Dan itu sangat, sangat, sangat disesuaikan, yang Anda butuhkan jika Anda ingin mendapatkan hal-hal seperti itu. Jadi semua konteks memiliki banyak atribut yang berbeda Anda dapat memodifikasi untuk semuanya dari jarak ke berbagai font yang seleksi untuk ukuran hal. Jika Anda ingin melakukan bahkan hal yang lebih rumit, ada bahasa scripting tertanam. Mereka menggunakan skema, yang adalah dialek LISP. Ini mungkin tidak berarti apa-apa untuk Anda. Tapi pada dasarnya, skema fungsional lain bahasa pemrograman, lebih atau kurang. STEPHEN KREWSON: The tie-in. Connor HARRIS: Ya. Ini adalah baik tie-in, saya kira. Dan digunakan sebagai bahasa pengajaran, sebenarnya, turun Mass Ave. Di MIT. Dan itu sangat berguna untuk LillyPond karena berbagai alasan teknis. Dan jadi jika Anda ingin membuat sederhana tweak tergantung pada conditional, untuk example-- ada tertentu kondisi skor yang bertemu, membuat perubahan ke tata letak atau whatnot-- kemudian fasilitas tersebut yang ada. Mereka rumit. Jadi, inilah contoh kode cukup sederhana. Ini lima baris. Pada dasarnya, saya mendefinisikan dua staf. Ini di 3/4. Staf pertama memiliki melekat tempo mark, tapi itu benar-benar akan untuk pergi ke seluruh skor, karena tanda tempo berada di tingkat skor. Metronom tanda pengukir terpasang untuk mencetak konteks. Ada kunci yang berbeda, karena [tidak terdengar] pengukir terpasang staf. Anda benar-benar dapat lakukan adalah. Sampel saya menulis adalah benar-benar di C mayor, tapi itu hanya untuk menunjukkan Anda dapat memiliki kunci yang berbeda di staf yang berbeda. Dan sintaks dasar adalah Anda menulis dicatat nama dengan E, F, G, apa pun. Jika Anda ingin melakukan aksidensi, Anda akhiran IS atau ES. Ini adalah dari Belanda konvensi musicological. Dan untuk melakukan lompatan oktaf, Anda harus menggunakan ini centang tanda, koma atau tanda kutip. Relatif hanya berarti apa pun yang Anda memiliki catatan, secara otomatis akan plaec di oktaf paling dekat dengan yang sebelumnya. Dan jika Anda ingin melompat lebih dari sebuah fifth-- mengatakan kelima atau more-- maka Anda harus menggunakan [tidak terdengar]. Tapi sebaliknya, Anda tidak perlu menentukan oktaf dari setiap catatan tunggal. Dan relatif C, prima, dan C, Anda hanya menentukan tengah C dan basis C, catatan terutama pertama. Maka Anda memiliki staf yang mengatur ini dua suara atau sampel musik, dan Anda memiliki skor. Dan yang terlihat seperti ini. Jika Anda ingin meluangkan waktu untuk copy bahwa sampel dari LillyPond kode pada sebelumnya geser ke bawah sini, dan Anda dapat menulis untuk LillyPond sendiri. Aku tahu kita punya sesuatu yang terlihat banyak seperti ini. Jadi ada teknologi lain disebut Musik XML dipertahankan oleh orang-orang yang sama sekali berbeda. XML adalah data tekstual structure-- Saya tidak harus mengatakan data yang structure-- mengatakan peta metafora semacam. Dan itu dirancang untuk menahan data hirarkis sangat baik. HTML, misalnya, adalah jenis XML. Dan Anda dapat memberitahu XML karena mereka memiliki semua kurung sudut dan sudut tanda garis miring braket bahwa bidang data menunjukkan. Saya tidak memiliki kode Misalnya dari Music XML. Anda dapat menemukan sendiri. Pada dasarnya, alasan Anda mungkin ingin menggunakan XML sebagai tahap peralihan adalah, pertama-tama, itu format interchange untuk dasarnya every-- saya tidak harus mengatakan setiap, tapi banyak nilai yang berbeda penulis. Jadi jika Anda menulis di Musik XML, tidak hanya dapat LillyPond membacanya dengan bantuan auxilary ini program yang disebut Musik XML untuk LY, tetapi juga Finale dapat membaca itu, Sibelius dapat membacanya. Tergantung pada bagaimana objek internal Anda hirarki bekerja untuk mewakili musik, mungkin lebih mudah untuk menulis Musik XML daripada LillyPond dan hanya mengandalkan Musik XML untuk LY untuk melakukan konversi. Saya tidak berpikir [tidak terdengar] memiliki Music XML. STEPHEN KREWSON: Ini tidak. Seseorang bekerja di atasnya, meskipun. Connor HARRIS: OK. Euterpea tidak memiliki Musik XML belum fungsi output. Jika Anda ingin ide proyek akhir, mungkin berhubungan dengan orang-orang Stephen tahu, dan mereka bisa menggunakan bantuan Anda. STEPHEN KREWSON: Saya akan senang itu. Connor HARRIS: Juga, pada dasarnya, setiap bahasa pemrograman yang layak dan garam sudah memiliki perpustakaan XML, sehingga Anda dapat mengkonversi semua internal musik Anda ke dalam beberapa objek bahwa perpustakaan XML dapat menulis bahwa akan membutuhkan lebih sedikit perubahan struktur internal Anda untuk apa pun musik objek Anda ingin menulis daripada menulis itu langsung di LillyPond akan. Kemudian hanya mencetaknya dengan XML dengan perpustakaan XML dalam bahasa Anda, yang akan menjamin bahwa itu sintaksis benar dan semuanya, dan kemudian mengubahnya menjadi LillyPond. Jadi teknologi Anda mungkin ingin melihat ke dalam jika Anda melakukan sesuatu seperti ini. [Tidak terdengar], lain teknologi auxilarry. Ini pada dasarnya adalah Tek Pekerjaan atau Tek Studio untuk LillyPond. Jadi ia menawarkan bantuan dengan sintaks, dengan template untuk berbagai umum kombinasi instrumen. Hal ini memungkinkan layar split melihat begitu Anda dapat memiliki kode Anda dalam satu jendela dan PDF di jendela lain dan klik tempat di PDF untuk melompat ke relevan bintik-bintik dalam kode sumber Anda. Ini lebih berguna jika Anda benar-benar menulis LillyPond file sendiri daripada jika Anda menghasilkan mereka pemrograman. Tapi sekali lagi, itu sesuatu yang berguna untuk memiliki. Besar. Resources-- lain saya hanya akan melalui ini dengan sangat cepat. LillyPond manuals-- LillyPond memiliki dokumentasi yang sangat baik di situsnya. Mereka memiliki tutorial. Mereka memiliki referensi sintaks. Mereka memiliki ratusan potongan untuk berbagai hal-hal kecil yo mungkin perlu lakukan untuk menunjukkan berbagai kemampuan. Jika Anda ingin menggunakan bahasa scripting atau membuat lebih luas kustomisasi, maka ada internal referensi di URL itu. Jika Anda ingin menggunakan Music XML, ada URL, musicxml.com/tutorial. Dan kemudian jika Anda perlu belajar skema karena Anda benar-benar ingin menggunakan fasilitas scripting di LillyPond, maka ada [tidak terdengar] disebut Interpretasi terstruktur Program Komputer, yang tidak hanya kedua terbesar CS buku yang pernah written-- menemukan saya setelah itu jika Anda ingin tahu apa yang saya pikir terbesar yang is-- tetapi juga sangat baik pengantar bahasa yang tepat. Anda tidak perlu lebih dari beberapa bagian pertama. Dan hanya itu. Ada pertanyaan? SISWA: Dimana saya bisa download Anda dihasilkan Frere Jacques jadi saya bisa menempatkannya pada iPod saya? STEPHEN KREWSON: Nah, Anda dapat menulis ke beberapa file wav di Euterpea. Dan Anda memiliki kode. Itu di GitHub. Membuat variasi Anda sendiri Frere Jacques oleh CS50 pikiran sarang. Ini akan menjadi besar. Connor HARRIS: Orang lain? STEPHEN KREWSON: Kita perlu drum bass yang lebih baik, juga. Ini benar-benar buruk. STUDENT: Euterpea tidak hanya sisi komposisi, tetapi signal-- STEPHEN KREWSON: Ya. Bahkan, pekerjaan yang saya lakukan di Euterpea ketika saya mengambil this-- ada lulus kursus di Yale yang menggunakan itu-- pada sintesis suara. Jadi ada benar-benar cara yang baik menggunakan panah dan beberapa notasi yang kita lihat dari menyusun bersama-sama fungsi sinyal. Secara khusus, bass untuk sebagian dari mereka hanya gelombang sinus sederhana. Tapi jika Anda mulai membuat mereka cara program aneh, Anda bisa mendapatkan suara gila efek, seperti air terjun aneh. Anda dapat membuat sangat berpasir suara dengan banyak modulasi. Saya melakukan sebuah proyek di granular sintesis, yang suatu tempat di antara FM dan sampling. Anda mengambil sangat kecil, sampel sedikit, dan kemudian menggabungkan mereka dengan semacam modulator dan membangun suara yang lebih kaya. Kami juga melakukan pemodelan fisik, sehingga mencoba untuk berpikir tentang fisika dan psychoacoustics dari sesuatu seperti terompet, dan berpikir tentang cara suara yang memantul dari bel sangkakala dan akustik ruang dan pemodelan bahwa dengan osilator dasar. Connor HARRIS: Terima kasih banyak. Terimakasih telah datang. Dan aku selalu bersedia untuk mengambil pertanyaan oleh email-- connorharris@college.harvard.edu. STEPHEN KREWSON: Ya. stephen.krewson@yale.edu. Keren.