康納哈里斯:你好。 我康納·哈里斯。 我是一個CS50 CA在哈佛。 斯蒂芬KREWSON:我是斯蒂芬Krewson。 我是一個TF的CS50在耶魯大學。 康納哈里斯:我們要談 一些技術,你可能 想如果你有興趣使用 在做最後的項目或真 任何與音樂。 我們將重點放在第一個 編程語言叫做哈斯克爾。 這是一個功能 語言,所以範式 從C或PHP很大的不同 或其他命令式語言 你已經使用,尤其是 寫在哈斯克爾庫 所謂Euterpea,它可以幫助人們 與音樂創作功能, 基本上。 而斯蒂芬將引導您 通過一個很好的例子。 在此之後,我將向您介紹 所謂LillyPond,這 是一家以技術為排版音樂。 這有點像乳膠 對於音樂,如果你們中的任何 已經使用乳膠數學課或 另一名P集類或你有什麼。 所以,我給你,再一次, 那一些簡單的例子 並指出你在一般 一些更好的資源的方向。 斯蒂芬KREWSON:在 此外,我們認為它 會很酷成立 提示一點點 朝之間的管道 Euterpea產生的MIDI文件 在LillyPond,所以我們提供 對腳本一些指令 要做到這一點是 設有LillyPond 只是為了保持開源 並獲得了管道去。 康納哈里斯:同樣, 我們應該強調, 這兩種技術,您 不必一起使用它們。 他們並沒有設計工作 在一起,雖然他們做的非常漂亮。 斯蒂芬KREWSON:對。 並且完全免費。 康納哈里斯: 確認,剛才讀的。 斯蒂芬KREWSON:適當注意。 感謝那些人。 這是我會一直這樣只是片刻。 安裝過程 是有點棘手。 我們已經在GitHub上讀我 你可以看一看。 只是給我發電子郵件,如果您有任何問題。 但我們會假設下運行此 這是工作的每一個人。 康納哈里斯:如果你不能 得到LillyPond工作,沒什麼大不了的。 有沒有現場編輯的 將參與,至少在我的結束。 斯蒂芬KREWSON:哈斯克爾和 LillyPond應該都有安裝。 Euterpea被下載為 包,等等,等等。 因此,我們在談論電腦音樂。 而這僅僅是一個 很50,000英尺的看法。 有它的幾個不同的方面。 這是粗糙和是 要掩蓋一些細節。 但是,我們能想到的東西 像算法組成, 使用的算法, 使用代碼,以生成 一些類型of--也許自相似 筆記,或者音符序列 在某些限制。 然後將這些可能是 執行或解釋 與模擬儀器 或類似的東西。 但該組合物是 算法完成。 不過,當然,也許是面積 電腦音樂或數字音樂 我們更熟悉的是數字 聲音合成或數字採樣 數字錄音。 很多數字儀表都 通過數字採樣完成。 事實上,我們將使用這些之一 健全字庫後的形式。 但也有一些叫 說出來的數字合成 70年代末,進入“80年代用 雅馬哈和約翰Chowning在斯坦福 做FM合成或 調頻合成, 在這裡你有一個載體 信號和調製信號 無論是在音頻頻譜。 但是,我們的重點 今天是一種叫MIDI, 和當然,算法組合物。 我們不會做儀器,但 我們反而要作出一些音樂, 然後,將獲得解釋 一些文書 是一致的 通用MIDI標準。 那麼什麼是MIDI? 我不會太深入了, 但MIDI是數據傳輸協議。 這是一種引導的跨越 不同的公司和行業 組織的聲音或補丁。 所以我們會看到, 有一個MIDI標準 對於所有不同的打擊樂器 聲音和MIDI建議 對於各種不同類型的合成的或 不同類型的所有儀器 在一個樂隊團體,說。 你可能熟悉 0到127 MIDI信息。 一個MIDI信號通常 一位指示 無論是數據還是 狀態包,然後有 七比特的信號的。 並且這些可以控制 一切從量 該訴訟或壓力 在一個特定的鍵 如果你正在執行一個MIDI 當然控制器以及, 筆記。 當然,MIDI具有 是非常有用的, 因為它是一種方法,絲 一起或菊花鏈 一堆MIDI硬件設備。 我有七八回我家。 它變得非常複雜, 但它真的很強大。 而且它是真的老了。 這是從80年代初,和 這是非常好的,小的。 康納哈里斯:是的。 所有經典的任天堂 視頻遊戲大概會 對音樂的MIDI文件,例如。 斯蒂芬KREWSON:這裡有一個 例如一般的MIDI, 顯示MIDI作為一種 通用協議。 而且我認為,我們能想到的 該規範之間的差異 應該有類似 這些樂器的聲音和實際 實現這些文書的聲音 在一個健全的字體或某一特定MIDI 合成器作為是差 也許typeface--它說的, 在一般情況下,這是設計 這個特定的方式來表示 characters--和一個特定的字體 其具有具體的尺寸和音色, 並有實現the-- 康納哈里斯:也許 更好的比較會 是Unicode標準says--它給 一個數字,每一個角色,真的 世界上所有的語言,或 一個巨大的一套語言的腳本 在世界上,然後將這些都是 渲染弄成圖形 通過不同的字體包。 很顯然,你能想到的 MIDI聲音的Unicode的。 而且它只是一個of--大流列表 事件和文書,諸如此類的東西, 你必須有一個單獨的 程序,如字體, 為渲染成 東西是聽得見的。 斯蒂芬KREWSON:那麼,為什麼哈斯克爾? Haskell是一種函數式編程 語言,很先進, 從C很大的不同, 非常不同的PHP。 而且我們要看到,有一個 便於在Haskell函數組合 這將使我們能夠一帆風順, 編寫或打字,抄寫, 像雅克·弗里爾, 這個簡單的歌 有很多部分在它的 是自相似或重複。 因此,這將是一些 動機為何 我們使用哈斯克爾,其中 函數是一等公民。 我想延長 這一點點。 這是一個有點容易 notate弗里爾雅克·哈斯克爾。 但是,如果我們想要什麼 鼓的部分補充呢? 如果我們想盡量讓 像羅蘭808或909桶 機,你必須 約16個不同的步驟? 通常這些 認為是16分音符。 你可以控制全球 節奏,你可以挑選出 一堆不同的打擊樂部分 低音鼓,一拍,不同的陷阱, 開啟和關閉高帽子 這些排序渠道, 然後你就可以EQ或 調整音量。 我們會看到在一個不錯的方式 代表這一步的哈斯克爾 音序器與所有的 各種很酷的事情在Haskell 我們可以產生做 列表和過濾過的列表, 以上列出的映射,映射 在功能列表。 和快速的道歉。 這是一個非常粗略的 和過於速寫 的一些方面 哈斯克爾和Euterpea的, 這是一個特定領域的 嵌入式語言編寫 在Haskell的音樂類型。 所以,請不要在網上查詢出來的代碼。 火起來了ghci,這是格拉斯哥 Haskell編譯解釋。 我會做一些 這在一點點 所以你可以看到它是如何做。 這允許你加載與 the--語法是冒號,然後 該命令。 您可以加載文件。 您可以對這些文件使用瀏覽 看到所有的函數 存在於一個特定的模塊。 然後,我們會看到,類型和類型 類Haskell中如此重要, 所以你可以隨時check--特別是 如果你工作在一個新的DSCL 像這樣的,什麼是音樂的類型? 我知道數字的方式 類型在Haskell工作, 但我不知道很多關於音樂。 但是你可以探索他們的方式 通過使用這種T或鍵入命令定義 然後調用在一個特定的 函數或數據對象。 康納哈里斯:是的。 如果你認為C和鏘 是hardass關於類型, 你不知道有關哈斯克爾。 關於哈斯克爾的好處是, 如果你能得到你的代碼編譯 如果Haskell的類型檢查, 它可能是正確的, 因為該類型系統的要求非常嚴格。 斯蒂芬KREWSON:是的。 所以,我只想去 through--並再次, 這不是做justice--幾個 哈斯克爾的特徵是,至少 其creators--和它的創建 在20世紀80年代被一堆人遲到, 約20委員會 people--認為是非常重要的。 的第一件事情,他們 在一份文件中列出的 哈斯克爾描述的起源 在第一個20年左右 是,這是懶惰的。 所以,這是什麼意思? 嗯,這意味著,當我們有某種 表達,我們需要評估它。 和Haskell這是否在通話 由需要的方式或者非精確方式。 也就是說,如果我們有一幫 我們表達的組成部分, 我們盡量拖延評價 這些子組件 直到絕對最後minute-- 這是直到我們真正需要他們。 因此,這是指:這是 真的很酷,尤其是 如果我們思考抽象 的音樂步進音序器。 你打開它,你開始 運行的一個步驟序列 - 如果你曾經有鼓工作 機 - 和它只是永遠。 因此,這將是非常好的,如果我們 可以效仿,在哈斯克爾。 我們可以用無限做到這一點 值,特別是無限的名單。 這是很容易鍵入 無限的名單在Haskell。 你可以只使用語法下降 在這裡,你看1〜3, 除去3 1點點,和 這是一個無限列表 所有自然數的延伸 作為遠,你可以想像。 我想介紹一個 褶皺的概念的時候了。 再次,目的 這個研討會不是 了解在Haskell倍 或高階函數。 但我只想把它介紹給 給出了如何怪異的準確意義 Haskell是如何強大,它是。 特別是,我們要be-- 當我們做了不同的鼓的部分, 我們將要操縱名單 號,折疊它們在彼此上。 要做到這一點,我們將 是利用地圖和褶皺。 有一個正確的關聯 倍,這是這個正確的 這裡 - 1減去數量,2 減去量,3減去0。 和的語法一個 折,你給一個折 鹼值,然後一個operation-- 在這種情況下,加法或減法。 我已經展示了這兩種情況。 然後還有一個累加器 日積月累的完整列表, 應用該運營商正或 減去,然後累積它。 因此,這將是the--如果它被稱為 有褶皺的R加0,從0開始, 我們再總結所有 在該列表中的數字。 這就是從1到3的列表。 康納哈里斯:那麼換一種 這樣,折R的三個參數。 還有一個功能, 本身有兩個參數, 然後有一個啟動值, 和有值列表。 而你要做的就是你拿 啟動值,第一個值, 把它們變成功能。 你怎麼出去, 拿去,供稿 進入的功能 第二個值,你所得到的, 拿去,牧養進入 函數進行的第三值。 然後,如果你走 這整個名單這種方式, 你會得到最終 一些奇異值的 相同類型的你開始的 出相同類型的帶和 隨著事情的清單,然後 這是倍R的返回結果 斯蒂芬KREWSON:那麼特別, 這些都是高階函數, 因為他們正在做另一 函數的參數之一。 康納哈里斯:是的。 如果你使用某些其他 languages​​--我知道R,[聽不清] 語言有這個,所謂的降低。 你可能有類似的功能 在其他語言中,只叫 不同的東西。 斯蒂芬KREWSON:和 什麼是好的關於倍ṛ 在這種情況下是,折 R能夠以無限列表的工作。 因此,在這種底,這個P5 正在生成的音符 在步驟序器被接通 一些鼓的部分,第五鼓聲部, 也許這是一個康加 鼓什麼的。 這是一個刻意 寫這個的鈍角的方式, 但它的樂趣,因為 它說明了很多 約哈斯克爾和Euterpea的事情。 因此,本折colon--結腸R是 只是推的東西操作 一起在一個叫上一個空的列表中 - 列表中,這僅僅是一個空的方括號。 而且我打電話說 在這無限的名單。 這實際上是兩個列表 加在一起倒在這裡。 該列表1逗號6點 點是1,6,11,16。 因此,在剛剛Haskell-- 幾個大字,你 可以生成整個 數字序列 這五個號碼分開 伸展到無窮大。 我在前面加上該 這種較短的小列表中 - 3,8,21--只是告訴你 你怎麼可以連接列表。 然後我自身折疊。 而這最終只是成為一種 身份操作,但它是無窮的。 和褶皺R能夠做到這一點,因為它 懶惰地評估,如在上述。 如果我們有一個1和2和3中,我們可以 只是括號關閉它的整個休息。 這不會為工作 減去或加上,但它 會為這個冒號 名單上的身份運行。 那麼,我們如何實際使用,如果我們 對事物的無限長的名單? 那麼,哈斯克爾提供 很多fun​​ctions--的 並期待更多的進入這些在 你自己的時間 - 比如拿 它說,好吧,我們 產生這種無限的名單, 但我們只是需要一些 它並在此case--數量 我們將看到這個以後 我們的鼓機代碼 - 通用汽車只是某種全球 變量的步數 在序。 在卷式機我 向您介紹,這是典型的16, 但我已經有32來實現它。 這其實並不重要。 哈斯克爾也是純潔的,所以它具有很強的 靜態類型康納一筆帶過。 所以功能 數學在sense-- 他們更數學 他們正在保證 不要訪問或更改任何種類的 變量或執行輸入或輸出。 所以,如果你有一個函數, 它的確定性。 它總是會返回相同的 在該方案的狀態值 或保持不變。 還有,當然,一元的異常 這一點,但是這超出了我們的範圍。 康納哈里斯:是的。 這意味著,雖然是有 有幾個重要的[聽不清] 這個後果。 其中之一是,它很容易 並行Haskell程序。 因為如果你有, 說的一個函數 需要上萬元的值進行操作,如果 你知道函數總是 給出了相同的值,如果 你給在一定value-- 如果你是[聽不清]的F 1,F的 2,則f 3或whatnot--的F 1 是不會寫出來 到文件或做某事 這將改變f2的值。 您可以在此功能只是分裂到 萬種不同的機器還是一百萬 不同的線程或什麼的, 讓所有的響應返回, 讓所有的返回值 回來,然後就是這樣。 所以很容易並行化的東西。 不足之處是輸入 輸出特別是 適合類型系統 在十分複雜的方式。 我們不會去,現在,但我 建議你看看一些資源 在網上,如果你想了解這一點。 斯蒂芬KREWSON:所以 鍵入classes--這 was--類的類型 被發明來解決 運算符重載的問題。 因此,我們希望有平等 不同類型的東西之間。 當然,我們可以認為of-- 數字類型之間的平等 很容易想到,但 怎麼樣列表之間的平等? 什麼之間的平等 樹腳的數據結構? 而這一切都是可能的 哈斯克爾因為類型的類。 因此,如果你定義一個特定的數據類型 - 這裡,這些是音樂的間距。 我們終於得到 一些電腦音樂。 因此,我們有C,C銳利, 等,等等。 它們屬於一幫 不同類型的類。 EQ--他們屬於均衡器類型的類。 這意味著他們支持 平等操作。 所以,你可以評估一個人是否 音樂原語序列 是相同的不同的一個。 它們屬於的序類。 這意味著有一個排序這些。 D受到C.後升C 來自℃之後也是如此。 它們屬於類 顯示,這意味著它們可以 被打印到控制台或終端。 它們屬於 類枚舉,其中 意味著,即使 這些人物, 他們有一個基本的數字 表示從0開始 並通過但會關閉 很多東西都在這裡,20個左右, 或30或40,也許。 康納哈里斯:當 我們有一個數據類型 與該關鍵字derives-- “deriving--”某種類型的類, 這意味著,編譯器將嘗試 自動構建的東西。 因此,也許你會想 不同的定義質量。 你要定義升C 如等於降D,例如。 採用這種結構 在這裡,我不認為C調 和D平將是相等的,因為 編譯器會自動 說的每一個不同的可能值 是從每一個其它不同。 因此它可以覆蓋 默認的實現 這些類型的類。 再次,看看如果參考 要了解這一點。 斯蒂芬KREWSON:和 在這裡,其實,這會 是我們以後的代碼有幫助的。 我們看到一些綴運營商 對於順序組合, 並行組合物,和因此 第四,這些長處和等號 周圍有冒號。 這意味著我們可以玩些不同的 音樂元一個接一個。 這是順序組合。 或者,我們可以發揮他們 平行的同時。 因此,我可以有一個音樂的價值, 然後這等於和冒號, 中綴並聯組成運營商, 並發揮他們作為一種和弦。 我們要使用 這個時候我們結合 我們的鼓部分與我們 小雅克·弗里爾歌曲 發揮這兩個序列 音樂的值在同一時間。 柯里is--庫裡最後 哈斯克爾庫裡的名誰 後Haskell的圖像而得名。 這讓我們一 當我們漂亮優雅 編寫所有這些不同的 功能或過濾器,我們是 將是映射在我們的名單。 兩個函數 arguments--˚Fx和y--的 可以被表示為 ˚Fx的施加到y。 因此,它的功能 一個參數返回 一個參數另一個函數。 因此,這意味著我們可以映射 x的函數f過的y的名單。 康納哈里斯:旺旺 舉這樣的例子? 斯蒂芬KREWSON:是的。 我有一個例子,從這裡 有些事情,我們會寫。 所以複製2--好, 複製將採取 一個值,這是多少 次複製的東西, 然後它會採取value-- 通常一個列表或東西。 所以在這裡,我們映射 2複製在另一個列表。 因此,如果我們映射複製2, 如果我們重複2申請 此列表中 - 的第一元件和 這些都是音樂phrases--名單 會產生兩個“你們sleeping--” 所以你睡覺,你睡覺。 所以,現在我們有兩個。 但是,重複使用兩個 參數,但是因為我們是 鑽營,然後映射, 我們可以代表重複2 為已被返回的函數 1 argument--只是複製了兩次。 然後,我們將其應用於各 短語此列表的元素。 而CONCAT是一個Haskell 操作壓扁的列表。 因為重複2意志 產生列表的列表。 這是這中間形式在這裡。 因此我們就可以Concat的 或壓平了兩次。 康納哈里斯:一個更簡單 例如鑽營的, 如果你like--想像f是只是一個 乘法函數,它有兩個 參數和返回他們的產品。 所以,如果你有一個F 4 5,它是20。 但是你可以認為這是 also--你有一個函數f 4 這需要一個參數,並返回 四次這種argument--剛 部分應用程序, 只有一個參數4。 如果你進給量f 4 5,會給你20。 這是一個簡單的 例如鑽營的。 這是通常的教科書的一個。 斯蒂芬KREWSON拉姆達 表達式或匿名函數 是另一種哈斯克爾標誌。 所以,如果我們要掀起一個 小功能重複的生活, 但說這是不是在 標準庫, 我們可以用一個語法 類似於以下。 我們將陸風這一點。 有一件事,你會看到很多的 鼓機是我們撥打電話 到一種叫 過濾器,它像以前一樣, 是一個函數的映射 在列表中,但它的 的布爾函數映射。 所以,我們這裡有一個例子 的一個匿名 定義布爾函數 只需要一對夫婦的值。 這不是嚴格的說 匿名函數。 但它的定義與 該語法為簡潔起見, 而這只是需要X組件N-- 康納哈里斯:是的。 所以f是一個函數 兩個參數n和p 返回的函數,其本身 一個參數的函數,即x即可。 斯蒂芬KREWSON:我 上述中綴運算符。 什麼是中綴操作符? 那麼,綴運營商的 我們代表操作正常的方式, 也就是說,在mathematics-- 2加 2,而不是操作者加 然後兩個參數2和2。 康納哈里斯:這就是所謂的 逆波蘭式,這是 一個學期我懷疑你們任何人會知道。 斯蒂芬KREWSON:對。 逆波蘭或前綴符號。 但哈斯克爾決定 使用中綴運算符。 所以,這些都是一些 自定義的那些 被定義為 Euterpea DSCL在Haskell。 因此,這是順序組合。 這是並聯組成,而這 被截斷並聯組成。 而我們需要的 與我們的鼓機, 因為我們將使用最後 運營商在小元組有 沿彈鼓機 我們弗里爾雅克·歌。 而我們的鼓機 將是無限的。 它只是扮演下去。 但是弗里爾雅克·歌是沒有的。 這並不是說長。 這只是幾個酒吧。 因此,我們需要停止鼓機的 一旦較短的音樂價值在於 結束。 這infixed運營商 是與超級有用的。 像和中間符號 這是種不錯的, 因為說你有一樣的功能 報價,這給整數除法 x除以東西else-- 對不起,應該是a和b。 你可以把它寫成B的報價。 所以,如果你put--元素 這另一個例子。 X元素在某些列表中,如果你把 它在反引號,你可以使用它。 儘管它不是一個符號 像加或減或時間, 您可以使用一個名稱 像在反引號功能 作為中綴操作符,這是很酷。 康納哈里斯:這又是 一切只是語法糖,真的。 它不影響語言的核心。 斯蒂芬KREWSON:所以,我們在這裡看到的 最後一句話我們弗里爾雅克·歌, 我打出了一些小和弦或 採用並聯組成三分之二 運營商。 這句話的意思一些另一種方式 對我們剛才一直在說。 所以,你可以映射功能 一個參數超過列表。 康納哈里斯:同樣,參考 對於Haskell--入門教材 將所有的這在它。 斯蒂芬KREWSON:所以這裡有一個相當 步序的重點線 我們就來看看使用 列表解析。 而我們在這裡看到的是,元素 在固網運營商反引號。 因此,如果x是的列表的元素 X的,然後我們將調用PERC功能。 所以PERC只是一個打擊樂器功能。 這需要一些值p那 有界集中所有的組成部分 在各種打擊樂器的聲音 我們在以前的幻燈片看到, 然後它給出了 持續的四分音符。 否則給它一個QNR和QNR 僅僅是一個四分音符休息。 因此,這是建立一件好事。 我們有元素的列表,並 我們會遍歷從一個部分名單 我們的步進音序器的最大值。 而當我們在一個特定的我 一到最大值的該名單, 如果i是該一個構件 設置在此函數創建, 好,那我們把它 成敲擊音符。 否則,我們只是起到休息,這 是說,我們只是保持沉默。 而且我們可以在這裡看到,在 這個列表理解語法, x被填充這個 列表構建1 到定序的全球規模。 康納哈里斯:是的。 對於基本語法 列表內涵是 支架,價值涉及 一些變量,酒吧, 變量的可能值 自己,封閉支架。 如果你已經做了設置建設者符號 在任何種類的數學課, 你可能已經設置2n個這樣的 n為或n為Z軸。 類似件事 - 這個符號 就是要提示 那數學符號。 斯蒂芬KREWSON:你也可以 適用於多個謂詞 在一個列表和多個過濾器 理解,這是相當不錯的。 代數types--我們 不會長期逗留在這裡。 有沒有一個很好的概念, 哈斯克爾還是不錯的,明顯的概念 如何走,比方說,一個默認的 參數功能什麼的。 在Python中,這是很容易的。 你可以只說有等於上 的函數的聲明, 在一個默認值 情況下沒有提供。 在Haskell中,也許你可以 使用也許是,也許類型, 這需要無論是什麼 或類型的值只是一個。 因此,我們利用這個的鼓機 讓我們給可選音量 參數到每個鼓部件。 所以,讓我們有情商的一種方式 或在特定頻道上的體積。 康納哈里斯:在 其他哈斯克爾的例子, 您可能會看到可能用於 這可能會失敗的功能。 這是一個常見的一種。 斯蒂芬KREWSON:你可以提供 某種錯誤消息的作為默認值。 這是特別方便,當 你正在做的I / O哈斯克爾。 這可以是花樣。 康納哈里斯:或為 類似的例子,認為 涉及分割的函數的 這可能是0的參數。 這功能,可以 返回也許什麼。 所以,如果沒有被零除 它會返回剛才什麼。 並且如果存在除以 0,它會返回任何結果 作為信令錯誤的方法。 因為一個後果 Haskell的非常嚴格的打字 是,有沒有real-- 例外的是尷尬的,基本上, 錯誤處理是尷尬。 這是一個非常 這樣做的常見方式。 斯蒂芬KREWSON:所以現在我們得到 另一個令人費解的事情 有關Haskell的,這是模式 匹配和功能定義。 我在最後一張幻燈片顯示您的 聲明的步序 函數,它把一個可能值, 再一個int,那麼整數的列表, 然後返回的序列 音樂價值有註解 與兩個音調和音量。 所以,這三個參數可以是 圖案匹配以下面的方式。 我們總是想,一定要 做一個基本情況或退出的情況下先。 而這些下劃線 可以只解釋 指任何值的存在。 因此,如果我們得到一個呼叫接續步 與一些值,其他值, 然後空列表,我們想要什麼 返回只是沉默,休息0。 和而不是 作為一個空列表或0, 這是一個休息0,因為我們是 處理的音樂類型, 和著音樂的空列表 類型只是沒有時間的休息。 這是沒有音樂。 然後,我們看到,如果我們得到的一個步驟 序列一起一伏的體積參數, p表示預防儀器 參數,然後X的列表。 然後我們做一些東西。 特別是,我們應用 這個列表理解, 我們進行了一些 對可能價值操作 把它變成這樣一個數值 它可以接著列舉並用於 選擇儀器。 同樣,這是一個小 有點刻意inconcise 只是為了顯示所有的奇怪的事情 你可以在Haskell做你 看看它在你自己的時間。 好吧。 因此,我們終於等到 做我們所要做的, 這使一些電腦中的音樂。 因此,我們要嘗試 讓雅克·弗里爾歌曲。 因此,有多少 在雅克·弗里爾短語? 四。 大。 這有什麼好看的是, 他們都重複 相同數量的次數,這是兩個。 因此,我們有四句話 各重複兩次。 並且特別地,它們是在一個圓。 還有很多, 很多方法可以實現 圓,可能是有趣的事情。 我已經在做了 這裡很簡單的方法, 這是剛剛到construct--行 函數需要的音樂值的列表 並把它變成順序組合 通過應用順序組合 運營商。 然後,我耽誤了不同地區 通過他們開始休息。 於是,我開始了兩項措施休息, 然後四項措施休息, 和六然後休息 措施,然後將圓 工作,大家都知道這首歌。 我們看到兩個註解或 音樂價值觀的修改 中包含的這種順序 音樂元素排列。 我們有一個附加的體積。 這是一個功能註釋 音樂與特定體積。 這是一個很好的例子 一個MIDI信號運行 從0到127,七個位 可攜帶的信息。 而then--我們看到很 簡要地,但一般的MIDI 所有不同樂器的列表。 還有的不是一大堆人。 如果您使用的是數字音頻工作站, 像Ableton現場或Pro Tools, 有一個令人難以置信的範圍更廣 的合成器和VST樂器。 但MIDI標準只 有幾個或幾十個。 而他們中的一些有趣的。 我認為這將是有趣的,如果我們踢得 該儀器的MIDI樂器 直升機,然後 通過全面下一方式, 我們做了一個墊合成器,再 這個老生常談牽頭方波合成器, 然後語音軟泥,這是一個 在我的壞MIDI有點恍 合成器,但他們確定。 然後我們看到這讓 而在從Haskell語法, 然後我們玩 所有這些部分組合在一起 與並行複合算子。 我們大概可以顯示出一些這方面的。 下面的代碼。 你可以在C看到的,會是一個 大量的清嗓和設置 之前,你的表的代碼 可以做音樂是這樣。 還是有其他的編程 語言,你可能 必須用某種相互作用 庫或API,並設置好一切, 然後你就必須清理。 但在這裡Haskell是,我認為,一旦 你得到了它的竅門,令人難以置信 可讀性和極具表現力。 因此,有落實 對弗里爾雅克。 好吧。 現在,我們要添加的打擊樂, 這是一個有點混亂。 因此,讓我們來看看幻燈片。 因此,最大的想法就是讓 一串名單或部分。 在這些卷在機器內,有 是典型的約,也許8 10個節奏或敲擊的部分。 然後用一堆技術。 我們已經討論過these--使用 褶皺,過濾器,lambda函數, 映射在列表生成值 在一定範圍內為1〜R,R為16, 或者在序32步。 然後,如果有在該列表中的值 因為我們正在通過序運行, 通過它在運行, 過去,原來關於這一點, 而且樣品被觸發。 這裡有各種不同的怪異方式 我想出了產生音符。 嘗試在自己的半總和。 它會聽起來很酷。 如果時間允許,我們將通過這一點。 但現在,我猜想 我們要演示我們所擁有的。 讓我們希望這正好確定。 因此,這是進入了ghci。 我們會加載一個文件 我有一個稱為song.lhs, 這是我剛才給你看的文件。 太好了。 正如康納剛才所說, 編譯,這類型檢查, 所以我能呼吸輕鬆了許多。 它不會炸毀我。 我想告訴你一些有用的東西。 你可以看到, 模塊加載叫50。 您可以瀏覽該模塊。 這是太好 關於doing--也許什麼 你做的Haskell是不 所謂的軟件開發, 但你可以做很多 有趣的東西你自己。 而工作流程是非常好的為 相比很多其他語言, 因為你可以在真正看到 可讀的方式是怎麼回事。 所以我們看到,我們有 所有的這些話,在 是音樂球場名單,然後我們 建立這些成更大的東西, 這是一個音樂歌曲。 這是一個音樂單元。 然後我們可以發揮這一切 用函數調用播放音樂。 你可以看到,到這裡。 這只是玩。 我應該say--我沒有談 這個美元符號的無處不在。 美元符號是另一種綴操作符。 但它具有最低的優先級 任何操作者,從而有效的 意味著一切都在 美元符號的左 和美元符號的右邊, 我們會在它之前得到評估。 因此,這有點像另一個 加括號的方式。 康納哈里斯:它基本上是 函數組合。 它可以確保你不會,如果have-- 你有函數兩側或綴 對任何一方的運營商,他們不會 關聯越過它,並給你 意想不到的效果。 斯蒂芬KREWSON:所以我們can-- 利用這一點,我們可以調用。 首先,我們將發揮它沒有鼓。 這是直升機, 在MIDI直升機。 [音樂播放] 還有的方波。 聲音軟泥。 而你真的可以去野外與此有關。 我挑了一個非常簡單的, 因為我知道我不應該貪 超過我能咀嚼。 只要保持它很簡單 展示的主要思路。 但後​​來我想,我們已經 有一些鼓點加入到這一點。 僅僅因為這是一個 有點令人費解, 我沒有用 鼓部件的名稱, 我映射them--因為他們 該枚舉類的一部分, 我映射他們整數。 一種是像一個低音鼓。 零是也。 七是很高的帽子。 而倒在這裡,其中的 功能變得有點亂, 這些都是像康加鼓。 所以,如果你認為about--也許 有趣的方式來實現一個鼓機 使用起來非常有序 圖案上的低音鼓。 因此,例如,在過濾過 名單的一切,還給 當它採取模塊04 1。 所以我得到的1,5,9,13,17--所以這 是每一個小節的第一拍。 然後這是相同的 事移經兩個步驟。 所以這是另類。 因此,這將是 像高禮帽。 再然後,到這裡, 這是一個有點亂, 因為我們正在做的康加鼓。 而我有一些沙球到這裡了。 所以,我可以打電話打的鼓機, 但它會永遠持續下去, 它可能會開始抓起來 在我的系統的所有內存。 所以,我會打電話給這個函數 播放音樂,正如我們所看到的, 使用截斷並聯組成 發揮我們的小雅克·弗里爾歌曲 伴隨著這個奇怪的鼓機。 因此,讓我們一起來看看。 而且請不要提高自己的 所有的滾筒部件的安排。 不是我的專業,但我 有很多的樂趣。 [音樂播放] 所以,當然,這是所有 有點不一樣的樂趣 如果我們不能把它轉換 以一個分數,所以也許這 可被解釋 由人的表演者。 所以,我不會跑在這裡。 我已經生成的文件。 你可以看到,有一個 點LilyPond的file--這 將是我S​​EGUE過來 Connor--和點MIDI文件, 和點的PDF文件,它是什麼 LilyPond的將最終產生。 但這些都是這些腳本,我會 只是在他們的幫助選項來運行它們。 如果你得到這些啟動和運行 Euterpea,您可以生成一個MIDI文件。 然後從MIDI文件 與此MIDI 2LY程序, 你可以生成一個百合 池塘的文件,然後你 可以生成得分的PDF。 我們應該看看這個。 所以康納可能會顯示 你如何詮釋這更好的, 但是這是雅克·弗里爾作為 通過我Euterpea產生。 它只是在C.我應該已經找到 出了什麼破解它的實際研究。 但是,這是在管道 你怎麼做到這一點這一點。 讓我們再談談LilyPond的。 康納哈里斯:好吧,讓我們來看看。 你別說了解你的Haskell? 斯蒂芬KREWSON:哦,是的。 退房了解你哈斯克爾。 它的資源。 這就是我開始 學習,它的偉大。 不是啞巴學習。 康納哈里斯:那是在網上。 所以,一個叫帥哥[聽不清] learnyouahaskell.com,沒有空格。 語法是生病了。 斯蒂芬KREWSON:這說明,太。 康納哈里斯:那麼,什麼是LilyPond的? 這是一個聲明式編程 語言的音樂排版。 所以declarative--可以 想到的事情,如HTML, 在這裡你不是saying-- HTML 不說的網絡瀏覽器應該如何 渲染頁面一步一步來。 它只是說這 是文本描述 你想要什麼的頁面的樣子。 然後它也是一個節目 該編譯這種語言, 或者讀它的,然後實際 做排版你, 它吐出這些 精彩看PDF得分。 您還可以得到PNG格式或什麼的。 一個好方法思考 這是通過類比 是乳膠是有點像LillyPond, 但只是普通的排版。 因此,而不是of--它不是 所見即所得,你看到的 就是你一樣,說 結局是,還是西貝柳斯, 或Microsoft Word,在那裡你可以輸入 實時草案東西實時 看到瞬間變化。 它是基於文本的。 你必須編譯 用一個單獨的程序分數 後來出去的PDF文件。 這是一個有點少 使用方便,如果你 試圖直接寫 成分數和你 試圖撰寫計算機。 但也有很多 的優勢吧。 一,它看起來要好很多, 因為LillyPond實際上可以 花時間做 佈局決定正確, 不像西貝柳斯或結局,其中有 使受損的算法,這樣 它們可以顯示 事情是實時的。 那麼,為什麼是LilyPond-- 計算機圖形是困難的。 如果你正在做的音樂什麼 並希望寫出來的分數, 你不想寫 出一切自己 首先是如何繪製 員工和如何繪製記事本。 這是非常困難的。 它已經做過的事情。 你會感覺良好。 如果您想使用大結局或西貝柳斯, 文件格式為那些事 是非常複雜的,而且你不能 真正使用它們編程。 您可以打開西貝柳斯與終曲 並轉到文件,導出為PDF自己, 但你真的不能 調用從腳本。 LillyPond,你可以調用 從這些腳本。 你可以很容易重複 LillyPond乳膠。 我不會有那麼多的時間去 在這些技術現在, 但它們的存在。 如果你想看看 成LillyPond書, 它自帶的程序 您LillyPond分佈, 而且它的迭代 LillyPond碎片進入乳膠 如果你想要做的事 就像一個大音樂學文件 用實例,例如。 這是一個不錯的技能為 如果你正在做什麼生活 音樂,不只是CS50。 我用LillyPond所有 我的組成項目 因為我基本上是一個 資深的高中。 因此,這裡有一些簡單的例子。 這基本上代表 難度的 大多數人會 面對它,他們正在 使用LilyPond的簡單項目。 這第一個是初 由巴赫一個詩歌的序幕。 這下一個是摘錄 從我自己的作品之一, 它只是在那裡展示 你像[聽不清] 把多條線路在同一 工作人員,怎麼抒情undersetting工作。 歌詞底圖是一個東西,這是非常 易於使用的LilyPond的合唱。 所以,再有就是一些 在這裡複雜的例子。 所有這些都在做 LilyPond的,他們是可行的。 這第一個摘錄來自 [聽不清]為[聽不清]。 而這[聽不清]來自 一塊獨奏低音 笛[聽不清] 誰是longtime--誰 是的長期成員 音樂系在這裡,我想。 我不知道,他已經走了過到。 但他是哈佛的顧問 作曲家協會很長一段時間。 了不起的人。 他寫一些音樂,有很 複雜的符號,它LillyPond 還是能夠處理非常不錯。 所以,只是給你的感覺是什麼 這件事情的能力are--所以 LillyPond的內部 是非常複雜的。 你也可以用它來 很長一段時間,包括 對於一些相當複雜 的事情,沒有真正 不必知道了很多關於他們。 但基本思想是,在 最低水平,LillyPonds的原子 是的注意事項。 該票據包含 背景叫的聲音。 所以聲音環境 基本上對應 以複音單行。 然後使用右鍵即可 含分級 在更高層次那些 代表了比分員工 像以上的分組 鋼琴的員工或員工合唱團, 然後最終 整個得分上下文。 你實際上可以包括 多的分數在一本書。 而每一個方面都有 附加雕刻機的數量。 如果你看一下通過 上下文內容 並打印一個特定符號​​或 某些類作為必要的符號。 所以,每一個聲音的背景下, 有[聽不清]注意事項 雕刻的,基本上是一個功能或 一個對象,寫出所有的注意事項 頭在頁面的右邊部分。 然後有一個裂口雕刻,這 寫出裂的工作人員。 此外,還有一個節拍器 標誌雕刻的 寫出節拍器標記的得分。 而所有這些適合漂亮 早已進入的層次結構。 而這是非常,非常,非常 可定制的,您需要 如果你想獲得這樣的事情。 因此,所有的上下文有 許多不同的屬性 你可以修改一切 從間距各種字體 選擇事物的大小。 如果你想要做的,甚至 更複雜的東西, 有一個嵌入式腳本語言。 他們使用方案,該方案 是LISP的方言。 這些可能不 你什麼意思。 但基本上,一個方案 另一個功能 編程語言,更多或更少。 斯蒂芬KREWSON:領帶項。 康納哈里斯:是的。 這是一個很好的搭配,我想。 而且它作為教學語言, 其實,倒質量大道在麻省理工學院。 而且它是非常方便的LillyPond 各種技術原因。 所以,如果你想簡單 調整依賴於條件句, 對於example--有一定的 分條件滿足真實的, 更改這一 佈局或whatnot--然後 這些設施的存在。 他們是複雜的。 因此,這裡是一個非常簡單的代碼示例。 這是五線。 基本上,我定義兩個工作人員。 它的3/4。 第一個工作人員有一個 連接速度大關, 但是這實際上是 去到整個得分, 因為節奏標記 都在得分水平。 節拍器標記雕刻 附著到得分上下文。 有不同的鑰匙, 因為[聽不清]雕刻機 連接員工。 實際上,你可以做的是。 我寫的樣本 其實在C大調, 但它只是為 證明你可以有 不同的按鍵在不同的工作人員。 其基本語法是你寫的 注意到E,F,G,無論名稱。 如果你想要做的記號, 你後綴或ES。 這是從荷蘭的 音樂學約定。 要做到八度跳躍,你必須使用 這些刻度線,逗號或撇號。 相對只是意味著 不管你有一張紙條, 它會自動在被plaec 八度最接近前一個。 如果你想跳多 一個fifth--說第五或緩慢 - 那麼你必須使用[聽不清]。 但除此之外,你也不必 指定每一個音符的八度。 而相對的C,總理和 C,你只需指定中央C 和底座下,特別是第一個音符。 那麼你有這些員工的組織 這兩種聲音或音樂的樣品, 和你有一個分數。 這看起來是這樣的。 如果你想花時間 複製LillyPond的該樣本 在以前的代碼 滑下來這裡,和你 可以寫為LillyPond自己。 我知道我們已經得到的東西 這看起來很像這一點。 因此,有另一種技術 所謂的音樂XML維護 通過完全不同的人。 XML是一種文本數據結構 - 我 不應該說數據結構 - 說 比喻地圖之類的。 它的設計,以容納 分層數據非常好。 HTML,例如,是一個XML類型。 你可以告訴XML,因為他們 把所有的尖括號和角度 支架的斜杠標誌 這個節目的數據字段。 我沒有一個代碼 例如,從音樂的XML。 你可以找到它自己。 基本上,原因你可能想 使用XML作為中間階段 是,首先,它是 交換格式 對於基本every--我不該說 每一個,但很多不同的分數 作家。 所以,如果你在音樂寫 XML中,不僅可以LillyPond 與此輔助的的幫助讀 程序調用音樂的XML LY, 而且結局可以讀 它,西貝柳斯可以讀取它。 如何根據您的內部對象 層次工程代表音樂, 它可能會更容易寫出來 音樂XML比LillyPond 而僅僅依靠音樂XML 以LY做轉換。 我不認為[聽不清]的音樂XML。 斯蒂芬KREWSON:它沒有。 有人正在研究它,但。 康納哈里斯:好的。 Euterpea不具有 音樂XML輸出功能呢。 如果你想有一個最終的項目理念, 可能得到與人接觸 斯蒂芬知道,和 他們可能需要你的幫助。 斯蒂芬KREWSON:我喜歡這一點。 康納哈里斯:另外,基本上, 每一個編程語言 這是稱職 已經有一個XML庫, 這樣你就可以在內部轉換所有 你的音樂到某個對象的 該XML庫可以寫 指出,將需要更少的 改變你的內部結構 不管是什麼音樂的對象,你就 希望不是寫它來寫 直接在LillyPond會。 然後,只需打印出來使用XML與 在XML庫在你的語言, 這將保證,它的 語法正確的,一切, 然後將其轉換為LillyPond。 所以,技術,你可能想 看看,如果你正在做的事情 喜歡這個。 [聽不清],另一 auxilarry技術。 這基本上是技術作品 或技術工作室為LillyPond。 因此,它提供幫助 語法,使用模板 各種常見的 儀器的組合。 它允許分割畫面觀看這樣 你可以有你的代碼在一個窗口 和PDF的另一個窗口, 點擊PDF中的地方 跳轉到相關 點在源代碼中。 如果你其實這是比較有用 寫作LillyPond文件自己 比如果你正在生成 他們編程。 但同樣,它的 一些有用的東西有。 大。 另外resources--我就 經過這個速度非常快。 LillyPond manuals-- LillyPond有 出色的文件在其網站上。 他們有一個教程。 他們有一個語法參考。 他們有數百個片斷 各種小東西 喲可能需要做些什麼來證明 各種能力。 如果你想使用 腳本語言 或者更廣泛地 自定義,然後還有 內部在該URL引用。 如果你想用音樂的XML,有 該URL,musicxml.com/tutorial。 然後,如果你需要學習計劃 因為你真的想使用 腳本設施LillyPond, 然後有一個[聽不清]被稱為 結構化解讀 計算機程序, 這不僅在第二 最大的CS教科書曾經written-- 找我算賬,如果你想知道 我認為一個最偉大is-- 但它也是一個非常好的 引進適當的語言。 你不會需要超過 前幾節。 就是這樣。 任何問題? 學生:我在哪裡可以下載 您生成的弗里爾雅克· 這樣我就可以把它放在我的iPod? 斯蒂芬KREWSON:嗯,你可以寫 出在Euterpea一些wav文件。 而你的代碼。 這是在GitHub上。 使自己的變化 雅克·弗里爾通過CS50蜂群思維。 這會很棒。 康納哈里斯:還有其他人? 斯蒂芬KREWSON:我們需要 一個更好的低音鼓了。 這是非常糟糕的。 學生:Euterpea不僅 組成一面,但signal-- 斯蒂芬KREWSON:是的。 事實上,在工作中,我 在Euterpea沒有當我 把this--有一個 研究生課程在耶魯大學的 使用它 - 是在聲音合成。 所以這是一個非常 使用箭頭好方法 還有一些我們看到的記號 信號功能合成在一起。 特別是,對於低音最 他們僅僅是一個簡單的正弦波。 但是,如果你開始撰寫者 怪異編程的方式, 你可以得到瘋狂的聲音 效果,比如怪異的瀑布。 您可以創建非常堅韌不拔 聽起來有很多調製。 我做了一個項目上的粒狀 合成,這是 介於FM和取樣之間。 你需要非常小的, 少的樣品,然後 用某種組合它們 調製器和建立一個更豐富的聲音。 我們也做了物理建模,所以 試著換位思考一下物理 和類似心理聲學 小號和思考方式 聲音反彈 小號的鐘聲 和聲學 房間和建模 與該基本振盪器。 康納哈里斯:非常感謝。 感謝你的到來。 而我總是願意 通過email--的提問 connorharris@college.harvard.edu。 斯蒂芬KREWSON:是的。 stephen.krewson@yale.edu。 涼。