Connor HARRIS: Hi.
Tôi Connor Harris.
Tôi là một CA CS50 tại Harvard.
STEPHEN KREWSON: Tôi là Stephen Krewson.
Tôi là một TF cho CS50 tại Yale.
Connor HARRIS: Và chúng ta sẽ nói chuyện về một số công nghệ mà có lẽ bạn
muốn sử dụng nếu bạn đang quan tâm trong làm một dự án cuối cùng hoặc thực sự
bất cứ điều gì với âm nhạc.
Chúng ta sẽ được tập trung vào một đầu ngôn ngữ lập trình gọi là Haskell.
Đó là một chức năng ngôn ngữ, do đó, các mô hình
là rất khác nhau từ C hoặc PHP hoặc ngôn ngữ bắt buộc khác
mà bạn đã sử dụng rồi, và đặc biệt trên một thư viện viết bằng Haskell
gọi Euterpea, mà có thể giúp đỡ mọi người với viết nhạc về mặt chức năng,
về cơ bản.
Và Stephen sẽ hướng dẫn bạn thông qua một ví dụ tuyệt vời về điều đó.
>> Sau này, tôi sẽ giới thiệu cho bạn một cái gì đó gọi là LillyPond, mà
là một công nghệ cho âm nhạc sắp chữ.
Đó là loại giống như LaTeX cho âm nhạc nếu bất kỳ của bạn
đã sử dụng LaTeX cho các lớp học toán hay lớp P thiết lập khác hoặc những gì có bạn.
Và vì vậy tôi sẽ cung cấp cho bạn, một lần nữa, một số ví dụ đơn giản về điều đó
và chỉ cho bạn trong cuộc tổng đạo của một số nguồn lực tốt hơn.
>> STEPHEN KREWSON: Trong Ngoài ra, chúng tôi nghĩ rằng nó
sẽ được mát mẻ để thiết lập một chút gợi ý
hướng tới một đường ống dẫn giữa File MIDI Euterpea tạo
trong LillyPond, vì vậy chúng tôi cung cấp một số chỉ dẫn về các kịch bản
để làm điều đó mà cung cấp với LillyPond
chỉ để giữ cho nó mã nguồn mở và có được một đường ống dẫn đi.
Connor HARRIS: Một lần nữa, chúng ta cần nhấn mạnh,
hai công nghệ này, bạn không cần phải sử dụng chúng với nhau.
Họ đang không được thiết kế để làm việc với nhau, mặc dù họ làm rất độc đáo.
>> STEPHEN KREWSON: Đúng vậy.
Và hoàn toàn miễn phí.
Connor HARRIS: Vì vậy, Lời cảm ơn, chỉ đọc mà.
STEPHEN KREWSON: Hợp lệ ghi nhận.
Nhờ những folks.
Điều này tôi sẽ nán lại trên chỉ trong một khoảnh khắc.
Quá trình cài đặt là một chút khéo léo.
Chúng tôi có một tôi đọc trên GitHub mà bạn có thể có một cái nhìn tại.
Chỉ cần gửi email cho tôi nếu bạn có bất kỳ câu hỏi.
Nhưng chúng ta sẽ chạy theo giả định rằng điều này đang làm việc cho tất cả mọi người.
Connor HARRIS: Và nếu bạn không thể được LillyPond để làm việc, không có việc lớn.
Có không có biên dịch trực tiếp mà sẽ tham gia, ít nhất là về kết thúc của tôi.
STEPHEN KREWSON: Haskell và LillyPond nên cả hai đều có các trình cài đặt.
Euterpea được tải về như một gói, vv và vv.
Vì vậy, chúng ta đang nói về máy tính âm nhạc.
Và đây chỉ là một là rất view 50.000-foot.
Có một vài khía cạnh khác nhau của nó.
Và điều này là khó khăn và là sẽ che khuất một số chi tiết.
Nhưng chúng ta có thể nghĩ về cái gì giống các thành thuật toán,
bằng cách sử dụng các thuật toán, sử dụng mã, để tạo ra
một số loại of-- lẽ tự tương tự chuỗi các ghi chú, hoặc có thể ghi chú
theo một số hạn chế.
Và sau đó những người có thể là thực hiện hoặc giải thích
với các dụng cụ tương tự hoặc bất cứ điều gì như thế.
Nhưng các thành phần là thực hiện thuật toán.
>> Nhưng tất nhiên, có thể tích máy tính âm nhạc hay âm nhạc kỹ thuật số
chúng ta đã quen thuộc hơn với là kỹ thuật số tổng hợp âm thanh hoặc thuật số lấy mẫu
và ghi âm kỹ thuật số.
Rất nhiều các công cụ kỹ thuật số thực hiện thông qua kỹ thuật số lấy mẫu.
Trong thực tế, chúng tôi sẽ sử dụng một trong những người trong các hình thức của một thư viện font chữ tiếng sau đó.
>> Nhưng cũng có cái gì đó gọi tổng hợp kỹ thuật số mà ra
của những năm 70 và vào 'cuối thập niên 80 với Yamaha và John Chowning tại Stanford
làm tổng hợp FM hay Tổng hợp điều chế tần số,
nơi bạn có một tàu sân bay tín hiệu và tín hiệu điều chỉnh
cả trong phổ âm thanh.
Nhưng những gì chúng tôi đang tập trung vào hôm nay là một cái gì đó gọi là MIDI,
và tất nhiên, thành phần thuật toán.
>> Chúng tôi sẽ không làm cho các công cụ, nhưng chúng tôi thay vì sẽ làm cho một số nhạc,
và sau đó sẽ được giải thích bởi một số dụng cụ đó
là tuân thủ QTI đến chung MIDI tiêu chuẩn.
Vì vậy, MIDI là gì?
Tôi sẽ không để có được quá sâu vào nó, nhưng MIDI là giao thức truyền dữ liệu.
Đó là một loại của một hướng dẫn trên các công ty khác nhau và các ngành công nghiệp
tổ chức âm thanh hoặc các bản vá lỗi.
Vì vậy, chúng ta sẽ thấy rằng có một tiêu chuẩn MIDI
cho tất cả các bộ gõ khác nhau âm thanh và MIDI khuyến nghị
cho tất cả các loại khác nhau của synth hay các loại khác nhau của tất cả các nhạc cụ
nhóm trong một dàn nhạc, nói.
>> Bạn có thể quen với 0 đến 127 thông điệp MIDI.
Một tín hiệu MIDI thường một bit chỉ
cho dù đó là một dữ liệu hoặc một gói tin trạng thái, và sau đó có
bảy bit của tín hiệu.
Và chúng có thể kiểm soát tất cả mọi thứ từ khối lượng
để hành động hay áp lực trên một phím đặc biệt
nếu bạn đang thực hiện với một MIDI điều khiển cũng như, tất nhiên,
ghi chú.
Và tất nhiên, MIDI có cực kỳ hữu ích,
bởi vì đó là một cách để dây với nhau hoặc chuỗi daisy
một loạt các thiết bị phần cứng MIDI.
Tôi có bảy hay tám quay lại ngôi nhà của tôi.
Nó được thực sự phức tạp, nhưng nó thật sự mạnh mẽ.
Và nó thực sự cũ.
Đó là từ đầu những năm 80, và nó thực sự tốt đẹp và nhỏ.
Connor HARRIS: Yeah.
Tất cả các Nintendo cổ điển trò chơi video có lẽ sẽ
có các tập tin MIDI cho âm nhạc, cho ví dụ.
>> STEPHEN KREWSON: Dưới đây là một ví dụ về MIDI chung,
thấy MIDI như một loại các giao thức chung.
Và tôi nghĩ rằng chúng ta có thể nghĩ về sự khác biệt giữa các đặc điểm kỹ thuật
rằng cần phải có một cái gì đó như các dụng cụ âm thanh và thực tế
thực hiện những dụng cụ âm thanh trong một phông chữ có âm thanh hoặc một MIDI đặc biệt
tổng hợp như là sự khác biệt giữa có thể là một typeface-- mà nói,
nói chung, đây là thiết kế của cách đặc biệt này để đại diện
characters-- và một phông chữ đặc biệt có kích thước và âm sắc cụ thể,
và có thực hiện the--
>> Connor HARRIS: Có lẽ một so sánh tốt hơn sẽ
được các tiêu chuẩn Unicode says-- nó mang lại cho một số cho mỗi nhân vật, và thực sự
mọi ngôn ngữ trên thế giới, hoặc một tập hợp lớn các kịch bản của ngôn ngữ
trên thế giới, và sau đó là những rendered vào cái gì đồ họa
bởi các gói font chữ khác nhau.
Và rõ ràng, bạn có thể nghĩ MIDI là Unicode của âm thanh.
Và nó chỉ là một danh sách of-- một dòng suối lớn các sự kiện và các công cụ và có điều gì,
và bạn cần phải có một riêng biệt chương trình, như một kiểu chữ,
để vẽ lại rằng vào cái gì đó là âm thanh.
>> STEPHEN KREWSON: Vậy tại sao Haskell?
Haskell là một lập trình chức năng ngôn ngữ, rất tiên tiến,
rất khác nhau từ C, rất khác nhau từ PHP.
Và chúng ta sẽ thấy rằng có một dễ thành phần chức năng trong Haskell
mà sẽ cho phép chúng tôi để khoe qua soạn hoặc gõ lên, sao chép,
một cái gì đó giống như Frere Jacques, bài hát đơn giản này mà
có rất nhiều bộ phận trong nó là tự tương tự hoặc lặp đi lặp lại.
Vì vậy, đây sẽ là một số động lực cho lý do tại sao
chúng ta đang sử dụng Haskell, trong đó chức năng là công dân hạng nhất.
>> Và tôi muốn mở rộng này một chút.
Đó là một chút dễ ghi nốt Frere Jacques trong Haskell.
Nhưng nếu chúng ta muốn thêm một phần trống để nó?
Nếu chúng ta muốn cố gắng làm cho một cái gì đó giống như một Roland 808 hoặc 909 trống
máy mà bạn có khoảng 16 bước khác nhau?
Thông thường đây là những nghĩ như ghi chú 16.
Và bạn có thể kiểm soát toàn cầu tiến độ, và bạn có thể chọn ra
một bó của các bộ phận khác nhau bộ gõ trống bass, một tiếng vỗ tay, những cái bẫy khác nhau,
mở và đóng mũ cao các loại của các kênh,
và sau đó bạn có thể EQ hay điều chỉnh âm lượng của họ.
>> Và chúng ta sẽ thấy một cách tốt đẹp trong Haskell đại diện cho bước này
sequencer với tất cả các những thứ mát khác nhau trong Haskell
chúng ta có thể làm với tạo danh sách và lọc qua danh sách,
lập bản đồ trên danh sách, bản đồ chức năng trên danh sách.
Và một lời xin lỗi nhanh chóng.
Điều này là rất sơ sài và phác thảo quá nhanh
của một số các khía cạnh của Haskell và Euterpea,
mà là một tên miền cụ thể ngôn ngữ nhúng văn bản
trong Haskell với nhiều loại âm nhạc.
Vì vậy, xin vui lòng kiểm tra mã trực tuyến.
Cháy lên GHCI, đó là Glasgow Haskell Compiler Interpreter.
Và tôi sẽ được làm một số về điều này trong một chút
vì vậy bạn có thể thấy nó được thực hiện.
>> Và điều này cho phép bạn tải ở với the-- cú pháp là ruột kết và sau đó
lệnh.
Bạn có thể tải ở file.
Bạn có thể sử dụng trình duyệt trên tập tin để xem tất cả các chức năng mà
tồn tại trong một module cụ thể.
Và sau đó là chúng ta sẽ thấy, chủng loại và kiểu lớp học là rất quan trọng trong Haskell,
vì vậy bạn luôn luôn có thể check-- đặc biệt nếu bạn đang làm việc trong một dscl mới
như thế này, một loại âm nhạc là gì?
Tôi biết về cách số loại làm việc trong Haskell,
nhưng tôi không biết nhiều về âm nhạc.
Nhưng bạn có thể khám phá những cách chúng được xác định bằng cách sử dụng t hoặc loại lệnh
và sau đó gọi điện thoại trong một cụ thể chức năng hoặc một đối tượng dữ liệu.
Connor HARRIS: Yeah.
Nếu bạn nghĩ rằng C và Clang là hardass về chủng loại,
bạn không có ý tưởng về Haskell.
Những điều tốt về Haskell là nếu bạn có thể nhận được mã của bạn để biên dịch
và nếu Haskell loại séc, đó là lẽ phải,
bởi vì các loại hệ thống rất nghiêm ngặt.
>> STEPHEN KREWSON: Yeah.
Vì vậy, tôi chỉ muốn đi through-- và một lần nữa,
đây không phải là làm việc đó justice-- một vài trong số các tính năng của Haskell rằng, ít nhất
để creators-- của nó và nó đã được tạo ra vào cuối những năm 1980 bởi một nhóm người,
một ủy ban của khoảng 20 people-- nghĩ là quan trọng.
Và điều đầu tiên họ được liệt kê trong một bài báo rằng
mô tả nguồn gốc của Haskell trong vòng 20 năm đầu tiên hoặc
là nó đã được lười biếng.
Vì vậy, điều này có nghĩa là gì?
>> Vâng, nó có nghĩa là khi chúng ta có một số loại biểu hiện, chúng ta cần phải đánh giá nó.
Và Haskell thực hiện điều này trong một cuộc gọi bởi nhu cầu bằng cách này hay một cách không nghiêm ngặt.
Đó là, nếu chúng ta có một loạt các các thành phần của biểu hiện của chúng tôi,
chúng tôi cố gắng trì hoãn việc đánh giá của những thành phần phụ
cho đến khi cuối cùng minute-- tuyệt đối đó là cho đến khi chúng tôi thực sự cần chúng.
>> Vì vậy means-- này đó là thực sự mát mẻ, đặc biệt
nếu chúng ta nghĩ về sự trừu tượng một bước sequencer âm nhạc.
Bạn bật nó lên, và bạn bắt đầu chạy một sequence-- bước
nếu bạn đã từng làm việc với một cái trống machine-- và nó chỉ đi mãi mãi.
Vì vậy, nó sẽ được thực sự tốt đẹp nếu chúng tôi có thể thi đua mà trong Haskell.
Và chúng ta có thể làm điều đó với vô hạn giá trị, trong danh sách vô hạn cụ thể.
Nó rất dễ dàng để loại một danh sách vô hạn trong Haskell.
Bạn chỉ có thể sử dụng cú pháp xuống ở đây, nơi bạn nhìn thấy 1 thông qua 3,
loại bỏ 3 1 dot dot, và đó là một danh sách vô hạn
của tất cả các số tự nhiên mở rộng trên như xa như bạn có thể tưởng tượng.
>> Tôi muốn giới thiệu một khái niệm về nếp ngay.
Và một lần nữa, mục đích của hội thảo này không phải là
để tìm hiểu về nếp gấp trong Haskell hoặc chức năng bậc cao.
Nhưng tôi chỉ muốn giới thiệu nó đến đưa ra một ý nghĩa chính xác về cách lạ
Haskell là và uy lực của nó.
Và đặc biệt, chúng ta sẽ be-- khi chúng ta làm phần trống khác nhau của chúng tôi,
chúng ta sẽ được thao tác danh mục số, gấp chúng vào nhau.
Và để làm được điều đó, chúng ta sẽ được sử dụng bản đồ và nếp gấp.
>> Có một liên kết ngay gấp, đó là một trong những quyền này
here-- 1 trừ đi số lượng, 2 trừ đi số lượng, trừ đi 3 0.
Và cú pháp cho một lần, bạn cho một lần
một giá trị cơ bản và sau đó một operation-- trong trường hợp này, cộng thêm hoặc trừ.
Tôi đã hiển thị cả hai trường hợp.
Và sau đó là một ắc rằng tích lũy giá trị toàn bộ danh sách,
áp dụng mà nhà điều hành cộng hoặc trừ đi, và sau đó tích lũy nó.
Vì vậy, đây sẽ là the-- nếu nó được gọi là với lần r cộng với 0, bắt đầu bằng 0,
sau đó chúng tôi sẽ tổng hợp tất cả các số trong danh sách đó.
Và đó là một danh sách 1-3.
Connor HARRIS: Vì vậy, để đặt nó một cách, lần r mất ba đối số.
Có một chức năng mà tự nhận hai đối số,
sau đó có một giá trị khởi đầu, và có một danh sách các giá trị.
Và những gì bạn làm bạn mất là giá trị khởi đầu, giá trị đầu tiên,
đặt chúng vào các chức năng.
Những gì bạn nhận ra, mất rằng, thức ăn mà
vào các chức năng của Giá trị thứ hai, những gì bạn nhận ra,
mất rằng, thức ăn đó vào các chức năng của các giá trị thứ ba.
Và sau đó nếu bạn đi xuống toàn bộ danh sách này theo cách này,
bạn sẽ nhận được cuối cùng một số giá trị đặc biệt đó là
cùng loại của những gì bạn bắt đầu với và cùng loại
như là những thứ trong danh sách, và sau đó đó là sự trở lại kết quả của lần R.
STEPHEN KREWSON: Vì vậy, đặc biệt, đây là những chức năng bậc cao,
bởi vì họ đang dùng khác chức năng như là một trong các đối số.
>> Connor HARRIS: Yeah.
Nếu bạn đã sử dụng một số khác languages-- tôi biết R, [nghe được]
ngôn ngữ có này, được gọi là Giảm.
Bạn có thể có chức năng tương tự trong các ngôn ngữ khác, chỉ cần gọi
những thứ khác.
>> STEPHEN KREWSON: Và những gì tốt đẹp về gấp R
trong trường hợp này là nếp R có thể làm việc với các danh sách vô hạn.
Vì vậy, ở phía dưới này, P5 này đang tạo ra các ghi chú mà
được bật lên trong sequencer bước cho một số phần trống, phần trống thứ năm,
và có lẽ đó là một conga trống hoặc một cái gì đó.
Và đây là một cố tình cách chậm hiểu của văn bản này,
nhưng nó là thú vị, bởi vì nó thể hiện rất nhiều
điều về Haskell và Euterpea.
>> Vì vậy, gấp R của ruột già colon-- này là chỉ là một nhà điều hành mà đẩy những thứ
cùng nhau trên một list-- gọi về một sản phẩm nào danh sách, mà chỉ là những dấu ngoặc rỗng.
Và tôi gọi đó vào danh sách vô hạn này.
Đây thực sự là hai danh sách thêm vào với nhau xuống đây.
Danh sách 1 dấu phẩy 6 dot dot là 1, 6, 11, 16.
Vì vậy, chỉ trong Haskell-- một vài ký tự, bạn
có thể tạo ra toàn bộ dãy số
đó là năm con số ngoài trải dài trên thành vô cùng.
Và tôi thêm vào trước đó list-- này ngắn hơn chút
3, 8, 21-- chỉ để cho bạn làm thế nào bạn có thể nối danh sách.
>> Và sau đó tôi đã gấp lại trên chính nó.
Và điều này kết thúc chỉ là một loại hoạt động nhận dạng, nhưng nó là vô hạn.
Và gấp R có thể làm điều đó, bởi vì nó uể oải đánh giá, như ở trên.
Nếu chúng ta có một 1 và 2 và 3, chúng ta có thể chỉ khung off toàn bộ phần còn lại của nó.
Điều đó sẽ không làm việc cho trừ hoặc cộng, nhưng nó
sẽ làm việc cho đại tràng này hoạt động nhận dạng trên danh sách.
>> Vì vậy, làm thế nào để chúng ta sử dụng thực tế rằng nếu chúng tôi có một danh sách dài vô tận của sự vật?
Vâng, Haskell cung cấp rất nhiều functions--
và xem xét thêm vào những trong time-- riêng của bạn như mất
mà nói, OK, chúng tôi tạo ra danh sách vô hạn này,
nhưng chúng tôi chỉ cần đi để có một số số của nó Và trong case-- này
chúng ta sẽ thấy sau này trong trống máy code-- của chúng tôi
GM chỉ là một số loại toàn cầu biến về số lượng các bước
trong sequencer.
Trên máy cuộn trong tôi cho các bạn, đó là thường là 16,
nhưng tôi đã thực hiện nó với 32.
Nó không thực sự quan trọng.
>> Haskell cũng là tinh khiết, vì vậy nó có mạnh mẽ gõ tĩnh mà Connor ám chỉ.
Vì vậy, chức năng này toán học trong sense--
họ đang tính toán học rằng họ sẽ được bảo đảm
để không truy cập hoặc thay đổi bất kỳ loại biến hoặc thực hiện đầu vào hoặc đầu ra.
Vì vậy, nếu bạn có một chức năng, nó xác định.
Nó sẽ luôn luôn trở về cùng giá trị trong trạng thái của chương trình
hay vẫn như cũ.
Có, tất nhiên, ngoại lệ monadic điều này, nhưng đó là vượt ra ngoài phạm vi của chúng tôi.
>> Connor HARRIS: Yeah.
Điều này có nghĩa là, mặc dù, là có là một vài quan trọng [Không nghe thấy]
hậu quả của việc này.
Một là nó rất dễ dàng để parallelize chương trình Haskell.
Bởi vì nếu bạn có, nói, một chức năng mà
cần để vận hành trên một triệu giá trị, nếu Bạn có biết rằng các chức năng sẽ luôn luôn
đưa ra các giá trị như nhau nếu bạn ăn tại một value-- nhất định
nếu bạn là [Không nghe thấy] f 1, f của 2, sau đó f 3 hoặc whatnot-- f của 1
không phải là đi để viết ra vào một tập tin hoặc làm điều gì đó
đó sẽ làm thay đổi giá trị của f2.
Bạn chỉ có thể chia nhỏ chức năng này để một triệu máy khác nhau hoặc một triệu
chủ đề hay bất cứ điều gì, nhận được tất cả các câu trả lời trở lại,
nhận được tất cả các giá trị trả lại trở lại, và sau đó đó là nó.
Vì vậy, rất dễ dàng để parallelize thứ.
>> Nhược điểm là đầu vào và đặc biệt là đầu ra
phù hợp với các hệ thống loại theo những cách rất phức tạp.
Chúng tôi sẽ không đi vào ngay bây giờ, nhưng tôi khuyến khích bạn xem xét một số tài nguyên
trực tuyến nếu bạn muốn tìm hiểu về điều đó.
>> STEPHEN KREWSON: Vì vậy, gõ classes-- và điều này
lớp was-- các loại đã được phát minh để giải quyết
một vấn đề của hành quá tải.
Vì vậy, chúng tôi muốn có sự bình đẳng giữa các loại khác nhau của sự vật.
Tất nhiên, chúng ta có thể nghĩ rằng of-- bình đẳng giữa các loại số
là rất dễ dàng để nghĩ về, nhưng những gì về sự bình đẳng giữa các danh sách?
Những gì về sự bình đẳng giữa cây dữ liệu cấu trúc chân?
Và đây là tất cả có thể có trong Haskell vì các lớp học kiểu.
>> Vì vậy, nếu bạn định nghĩa một type-- dữ liệu nhất định và ở đây, đây là những nốt nhạc.
Chúng tôi cuối cùng đã nhận với một số máy tính âm nhạc.
Vì vậy, chúng ta có C, C nhọn, và vv và vv.
Họ thuộc về một loạt các các lớp học kiểu khác nhau.
EQ-- họ thuộc về lớp loại EQ.
Điều đó có nghĩa là chúng hỗ trợ hoạt động bình đẳng.
Vì vậy, bạn có thể đánh giá liệu một trình tự của các nguyên âm nhạc
là giống như một khác nhau.
>> Họ thuộc lớp thứ.
Điều đó có nghĩa là có một thứ tự để các.
D đến sau C. C nhọn đến sau khi C là tốt.
Họ thuộc về lớp hiển thị, có nghĩa là họ có thể
được in vào một giao diện điều khiển hoặc thiết bị đầu cuối.
Họ thuộc về lớp liệt kê, trong đó
nghĩa là mặc dù đây là những nhân vật,
họ có một số cơ bản đại diện bắt đầu từ 0
và đi tắt qua tuy nhiên nhiều điều đang ở đây, 20 hay như vậy,
hoặc 30 hoặc 40, có lẽ.
>> Connor HARRIS: Và khi chúng ta có một kiểu dữ liệu
rằng derives-- với từ khóa đó "deriving--" một lớp học loại nhất định,
nó có nghĩa là trình biên dịch sẽ cố gắng để xây dựng một cái gì đó tự động.
Vì vậy, có thể bạn sẽ muốn xác định một chất lượng khác nhau.
Bạn sẽ muốn xác định C nhọn như bằng phẳng D, ví dụ.
Với xây dựng này ở đây, tôi không nghĩ rằng C nhọn
và D căn hộ sẽ được bình đẳng, vì trình biên dịch sẽ tự động
nói mỗi giá trị khác nhau có thể là riêng biệt từ mỗi khác.
>> Vì vậy, nó có thể ghi đè lên các cài đặt mặc định
các loại của các lớp học.
Một lần nữa, nhìn vào các tài liệu tham khảo nếu bạn muốn tìm hiểu về điều đó.
STEPHEN KREWSON: Và ở đây, thực sự, điều này sẽ thấy
rất hữu ích cho khi chúng ta viết mã sau.
Chúng tôi nhìn thấy một số các nhà khai thác infix cho các thành phần tuần tự,
thành phần song song, và như vậy ra, những ưu điểm và dấu bằng
bao quanh bởi dấu chấm.
Điều đó có nghĩa là chúng ta có thể chơi những khác nhau nguyên thủy âm nhạc sau khi một khác.
Đó là thành phần tuần tự.
>> Hoặc chúng ta có thể chơi chúng trong song song cùng một lúc.
Vì vậy, tôi có thể có một giá trị âm nhạc, và sau đó điều này bằng và dấu hai chấm,
Infix điều hành thành phần song song, và chơi chúng như một loại hợp âm.
Và chúng ta sẽ sử dụng này khi chúng tôi kết hợp
phần trống của chúng tôi với chúng tôi ít bài hát Frere Jacques
để chơi hai chuỗi các của giá trị âm nhạc cùng một lúc.
>> Tách lạng Curry is-- lần cuối tên của Haskell Curry, người
hình ảnh Haskell được đặt tên.
Và điều này cho phép chúng ta một đẹp sang trọng khi chúng tôi
viết tất cả những khác nhau chức năng hoặc các bộ lọc mà chúng tôi
sẽ lập bản đồ trên danh sách của chúng tôi.
Một chức năng của hai arguments-- f của x và y--
có thể được biểu diễn như f của x áp dụng cho y.
Vì vậy, nó là một chức năng của một đối số trả về
một chức năng của một đối số.
Vì vậy, điều này có nghĩa chúng ta có thể ánh xạ hàm f của x trên danh sách của y.
Connor HARRIS: Muốn đưa ra một ví dụ về điều này?
STEPHEN KREWSON: Yeah.
Tôi có một ví dụ ngay tại đây từ một số trong những điều chúng tôi sẽ viết.
Vì vậy, nhân rộng 2-- tốt, tái tạo sẽ mất
một giá trị, mà là bao nhiêu lần để tái tạo một cái gì đó,
và sau đó nó sẽ mất một value-- thường là một danh sách hoặc một cái gì đó.
Vì vậy, ở đây, chúng tôi lập bản đồ nhân rộng 2 qua một danh sách khác.
>> Vì vậy, nếu chúng ta tái tạo bản đồ 2, nếu chúng ta tái tạo 2 áp dụng
tới phần tử đầu tiên của list-- này và đây là danh sách các phrases-- âm nhạc
sẽ sản xuất hai của "bạn sleeping--" như vậy là bạn đang ngủ, bạn đang ngủ.
Vì vậy, bây giờ chúng tôi có hai.
Nhưng phải mất hai lần lặp lại đối số, nhưng vì chúng tôi
tách lạng bộ và sau đó lập bản đồ, chúng ta có thể đại diện cho replicate 2
như đã được trả về như là một chức năng của một argument-- chỉ sao chép hai lần.
Và sau đó chúng tôi đang áp dụng đó để mỗi phần tử của danh sách này các cụm từ.
>> Và concat là một Haskell hoạt động cho san phẳng một danh sách.
Bởi vì lặp lại 2 ý sản xuất một danh sách liệt kê.
Và đây là hình thức trung gian này ở đây.
Và như vậy thì chúng ta có thể concat hoặc làm phẳng mà ra hai lần.
Connor HARRIS: Một đơn giản ví dụ về currying,
nếu bạn muốn like-- tưởng tượng f chỉ là một chức năng nhân mà phải mất hai
đối số và trả về sản phẩm của họ.
Vì vậy, nếu bạn có một f 4 5, đó là 20.
Nhưng bạn có thể nghĩ về điều này như also-- bạn có một hàm f 4
rằng có một đối số và trả về bốn lần này argument-- chỉ
ứng dụng một phần mà chỉ một đối số 4.
Và nếu bạn ăn f của 4 5, mà sẽ cung cấp cho bạn 20.
Và đó là một đơn giản ví dụ về currying.
Nó thường là một trong những cuốn sách giáo khoa.
>> STEPHEN KREWSON: Lambda biểu thức hoặc các chức năng ẩn danh
cũng là một dấu hiệu Haskell.
Vì vậy, nếu chúng ta cần phải whip lên một ít chức năng cuộc sống lặp lại,
nhưng nói nó không có trong thư viện chuẩn,
chúng ta có thể sử dụng một cú pháp tương tự như sau.
Và chúng tôi sẽ khoe trên này.
Một điều bạn sẽ nhìn thấy rất nhiều trong trống máy là chúng ta đang thực hiện cuộc gọi
một cái gì đó gọi là lọc, mà như trước,
là một ánh xạ của một hàm trên một danh sách, nhưng nó
một bản đồ của một hàm Boolean.
>> Vì vậy, chúng tôi có ở đây một ví dụ của một một cách ẩn danh
xác định chức năng Boolean chỉ mất một vài giá trị.
Đây không phải là nói đúng một chức năng vô danh.
Nhưng đó là xác định với là cú pháp cho ngắn gọn,
và điều này chỉ mất x Module n--
Connor HARRIS: Yeah.
Vì vậy, f là một hàm số hai đối số n và p
mà trả về một chức năng mà bản thân nó một chức năng của một đối số, cụ thể là x.
STEPHEN KREWSON: Tôi khai thác trung tố nêu trên.
Khai thác trung tố là gì?
Vâng, các nhà khai thác trung tố là cách bình thường chúng tôi đại diện cho các hoạt động,
nói, trong mathematics-- 2 cộng 2 thay vì các nhà điều hành cộng
và sau đó hai đối số 2 và 2.
Connor HARRIS: Nó được gọi đảo ngược ký hiệu đánh bóng, đó là
một thuật ngữ mà tôi nghi ngờ bất kỳ của bạn sẽ biết.
>> STEPHEN KREWSON: Đúng vậy.
Đảo ngược ký hiệu đánh bóng hoặc tiền tố.
Nhưng Haskell quyết định sử dụng các toán trung tố.
Vì vậy, đây là một số những tùy chỉnh mà
được xác định cho Euterpea dscl trong Haskell.
Vì vậy, đây là thành phần tuần tự.
Đây là thành phần song song, và điều này đã được cắt bỏ thành phần song song.
Và chúng tôi sẽ cần phải có với trống máy của chúng tôi,
bởi vì chúng ta sẽ sử dụng cuối cùng nhà điều hành trong đó có ít tuple
để chơi trống máy cùng với bài hát Frere Jacques của chúng tôi.
Và trống máy của chúng tôi là sẽ là vô hạn.
Nó chỉ chạy mãi mãi.
Nhưng bài hát Frere Jacques không.
Nó không phải là dài.
Đó chỉ là một vài quán bar.
Vì vậy, chúng ta cần phải ngăn chặn các máy trống như Ngay sau khi các giá trị âm nhạc ngắn hơn đi kèm
để kết thúc.
Và đó là điều hành infixed là siêu hữu ích với điều đó.
>> Và ghi vào ký hiệu như đây là loại tốt đẹp,
vì nói rằng bạn có một chức năng như quote, mà cho phép chia số nguyên
của x bởi một cái gì đó else-- xin lỗi, mà nên là a và b.
Bạn có thể viết nó như là một báo b.
Vì vậy, nếu bạn put-- phần tử là một ví dụ về điều này.
x phần tử trong một số danh sách, nếu bạn đặt nó trong Backticks, bạn có thể sử dụng nó.
Mặc dù nó không phải là một biểu tượng như cộng hoặc trừ hoặc lần,
bạn có thể sử dụng tên của một chức năng như thế trong Backticks
như điều hành ghi vào, mà là khá mát mẻ.
Connor HARRIS: Một lần nữa, đây là tất cả các đường chỉ là cú pháp, thực sự.
Nó không ảnh hưởng đến cốt lõi của ngôn ngữ.
>> STEPHEN KREWSON: Vì vậy, chúng ta thấy ở đây cho Câu cuối cùng của bài hát Frere Jacques của chúng tôi,
Tôi đã chơi một số hợp âm ít hoặc phần ba bằng cách sử dụng các thành phần song song
nhà điều hành.
Đây là một cách khác để nói rằng một số về những gì chúng tôi đã chỉ được nói.
Vì vậy, bạn có thể bản đồ chức năng của một đối số trên danh sách.
Connor HARRIS: Một lần nữa, tài liệu tham khảo sách giáo khoa giới thiệu Haskell--
sẽ có tất cả những điều này trong nó.
>> STEPHEN KREWSON: Vì vậy, đây là một khá dòng chính của sequencer bước
chúng ta sẽ xem xét đến việc sử dụng một hiểu danh sách.
Và chúng ta thấy ở đây là yếu tố mà trong điều hành cố định trong dấu ngoặc kép lại.
Vì vậy, nếu x là một phần tử của danh sách x, sau đó chúng ta sẽ gọi lên chức năng perc.
Vì vậy, perc chỉ là một chức năng bộ gõ.
Nó có một số p giá trị đó là một phần của bộ chặn tất cả
những âm thanh bộ gõ khác nhau mà chúng ta đã thấy trong một slide trước đó,
và sau đó nó sẽ cho rằng Thời gian của một lưu ý quý.
Khác nó mang lại cho nó một QNR, và QNR chỉ là một phần còn lại nốt đen.
>> Vì vậy, đây là xây dựng một cái gì đó tốt đẹp.
Chúng tôi có một danh sách các yếu tố, và chúng tôi sẽ vòng qua một số danh sách từ một
với giá trị tối đa của bước sequencer của chúng tôi.
Và khi chúng tôi đang ở một i đặc biệt trong rằng danh sách của một trong những giá trị tối đa,
nếu tôi là một thành viên này thiết lập được tạo ra trong chức năng này,
tốt, sau đó chúng ta biến nó vào một ghi chú bộ gõ.
Nếu không, chúng tôi chỉ đóng một phần còn lại, trong đó là để nói, chúng tôi chỉ giữ im lặng.
Và chúng ta có thể thấy ở đây rằng trong này cú pháp hiểu danh sách,
x là dân cư của thành viên này danh sách xây dựng một
với kích thước toàn cầu của sequencer.
Connor HARRIS: Yeah.
Cú pháp cơ bản cho danh sách comprehensions là
khung, giá trị liên quan đến một số biến, quán bar,
các giá trị có thể có của các biến bản thân, đóng khung.
Và nếu bạn đã thực hiện thiết lập ký hiệu builder trong bất kỳ loại của lớp toán,
bạn có thể đã thiết lập 2n như vậy n mà là trong hay n là z.
Tương tự thing-- ký hiệu này có nghĩa là để được gợi ý
trong đó ký hiệu toán học.
STEPHEN KREWSON: Và bạn có thể áp dụng nhiều vị
và nhiều bộ lọc trong danh sách hiểu, đó là khá tốt đẹp.
Đại số types-- chúng tôi sẽ không nán lại lâu ở đây.
Không có một khái niệm tốt trong Haskell hoặc một tốt, ý niệm rõ ràng
làm thế nào để mất, nói rằng, một mặc định tham số để một hàm hoặc một cái gì đó.
Trong Python, điều này là khá dễ dàng.
Bạn chỉ có thể nói với bằng về các khai báo của hàm,
một giá trị mặc định trong trường hợp không được cung cấp.
>> Trong Haskell, bạn có thể có thể sử dụng có lẽ có thể gõ,
trong đó có một trong hai không có gì hoặc một giá trị của loại chỉ là một.
Vì vậy, chúng ta khai thác này trong máy trống để cho phép chúng tôi cung cấp cho khối lượng tùy chọn
thông số cho mỗi phần trống.
Vì vậy, mà cho chúng ta một cách có EQ hoặc một khối lượng trên một kênh riêng.
>> Connor HARRIS: Trong ví dụ khác Haskell,
bạn có thể thấy có thể sử dụng cho chức năng mà có thể thất bại.
Đây là một trong những phổ biến.
>> STEPHEN KREWSON: Và bạn có thể cung cấp một số kiểu thông báo lỗi như một mặc định.
Và đó là đặc biệt tiện dụng khi bạn đang làm các I / O trong Haskell.
Đó có thể là thủ đoạn.
Connor HARRIS: Hoặc cho một ví dụ tương tự, nghĩ
của một chức năng có liên quan đến sự phân chia của một tham số đó có thể là 0.
Và chức năng mà có thể trở lại có lẽ bất cứ điều gì.
Vì vậy, nếu không có sự phân chia bằng 0, nó sẽ trở lại chỉ bất cứ điều gì.
Và nếu có sự phân chia bởi 0, nó sẽ trở lại không có gì
như một cách để báo hiệu các lỗi.
Bởi vì một hệ quả của Đánh máy rất nghiêm ngặt của Haskell
là không có real-- trường hợp ngoại lệ là vụng, về cơ bản,
xử lý lỗi là khó xử.
Và đây là một trong rất Cách phổ biến để làm việc đó.
>> STEPHEN KREWSON: Vì vậy, bây giờ chúng ta có được để một điều tâm uốn
về Haskell, đó là mô hình phù hợp và chức năng định nghĩa.
Tôi đã cho các bạn trong slide cuối cùng khai của dãy bước
chức năng, mà mất một lẽ giá trị, sau đó một int, sau đó là một danh sách các kiểu int,
sau đó trả về một chuỗi các giá trị âm nhạc có chú thích
với cả sân và khối lượng.
>> Vì vậy, những ba đối số có thể mô hình phù hợp trong các cách sau đây.
Và chúng tôi luôn luôn muốn chắc chắn để làm một trường hợp cơ sở hoặc trường hợp xuất cảnh trước.
Và những dấu gạch dưới chỉ có thể được giải thích
có nghĩa là bất kỳ giá trị đó là có.
Vì vậy, nếu chúng ta có được một cuộc gọi đến bước thứ tự với một số giá trị, một số giá trị khác,
và sau đó danh sách trống rỗng, những gì chúng ta muốn để trở lại chỉ là sự im lặng, một phần còn lại 0.
>> Và thay vì điều đó là một danh sách rỗng hoặc 0,
đó là một phần còn lại 0, bởi vì chúng tôi đối phó với các loại hình âm nhạc,
và danh mục sản phẩm nào của âm nhạc loại chỉ là một phần còn lại của không thời gian.
Đó là không có âm nhạc.
Và sau đó chúng ta thấy nếu chúng ta có được một bước liên tục với một v cho lập luận của khối lượng,
p cho cụ đề phòng đối số, và sau đó là một danh sách của x.
>> Sau đó, chúng tôi làm một số công cụ.
Đặc biệt, chúng tôi áp dụng này hiểu danh sách,
và chúng tôi thực hiện một số hoạt động trên có lẽ giá trị
để biến nó thành một giá trị số để sau đó nó có thể được liệt kê và sử dụng
để chọn các nhạc cụ.
Một lần nữa, đây là một chút bit cố tình inconcise
chỉ để hiển thị tất cả những điều kỳ lạ bạn có thể làm trong Haskell như bạn
hãy xem nó vào thời gian của riêng bạn.
>> Được rồi.
Vì vậy, chúng tôi cuối cùng đã nhận được tới làm những gì chúng tôi đặt ra để làm,
mà là làm cho một số máy tính âm nhạc.
Vì vậy, chúng ta sẽ cố gắng để làm cho bài hát Frere Jacques.
Vì vậy, có bao nhiêu cụm từ trong Frere Jacques?
Bốn.
Thật tuyệt.
Và những gì tốt đẹp là tất cả họ đang lặp đi lặp lại
cùng một lượng thời gian, mà là hai.
>> Vì vậy, chúng tôi có bốn cụm từ từng lặp đi lặp lại hai lần.
Và đặc biệt, họ đang ở trong một vòng.
Và có rất nhiều, nhiều cách để thực hiện
một vòng mà có thể là thú vị để làm.
Tôi đã thực hiện nó trong một khá cách đơn giản ở đây,
mà chỉ là để construct-- dòng hàm lấy một danh sách các giá trị âm nhạc
và biến nó thành thành phần tuần tự bằng cách áp dụng tuần tự mà thành phần
nhà điều hành.
>> Và sau đó tôi trì hoãn các bộ phận khác nhau bằng cách làm cho họ bắt đầu với một phần còn lại.
Vì vậy, tôi bắt đầu với một phần còn lại của hai biện pháp, và sau đó là một phần còn lại của bốn biện pháp,
và sau đó là một phần còn lại của sáu biện pháp, và sau đó vòng
hoạt động, như chúng ta đều biết bài hát này.
Chúng tôi thấy hai chú thích hoặc sửa đổi các giá trị âm nhạc
được chứa trong tuần tự này sắp xếp các yếu tố âm nhạc.
Chúng tôi có một khối lượng add.
Đây là một chức năng được chú giải âm nhạc với một khối lượng cụ thể.
Đây là một ví dụ tốt của một tín hiệu MIDI chạy
0-127, bảy bit thông tin có thể được thực hiện.
>> Và then-- chúng tôi thấy nó rất một thời gian ngắn, nhưng MIDI chung
danh sách tất cả các nhạc cụ khác nhau.
Và không có một toàn bộ rất nhiều trong số họ.
Nếu bạn sử dụng một máy trạm âm thanh kỹ thuật số, như Ableton Live hoặc Pro Tools,
có một phạm vi rộng lớn hơn vô cùng của tổng hợp và dụng cụ VST.
Nhưng tiêu chuẩn MIDI chỉ có một số ít, hoặc vài chục.
Và một số trong số đó là buồn cười.
Tôi nghĩ rằng nó sẽ được vui vẻ nếu chúng tôi chơi các dụng cụ nhạc cụ MIDI
máy bay trực thăng, và sau đó Cách tiếp theo thông qua các vòng,
chúng tôi đã làm một synth pad, và sau đó các chì xưa synth sóng vuông này,
và sau đó nói lên lông, mà là một chút không rõ ràng về MIDI xấu của tôi
tổng hợp, nhưng họ OK.
>> Và sau đó chúng ta thấy let này và trong cú pháp từ Haskell,
và sau đó chúng tôi đang chơi tất cả các bộ phận với nhau
với các nhà điều hành thành phần song song.
Và có lẽ chúng ta có thể thấy một số điều này.
Đây là các mã.
Và bạn có thể thấy trong C, có muốn được một rất nhiều hắng giọng và thiết lập
mã bảng trước khi bạn có thể làm cho âm nhạc như thế này.
Hoặc bất kỳ chương trình khác ngôn ngữ, bạn có lẽ muốn
phải tương tác với một số loại thư viện hoặc API và đặt mọi thứ lên,
và sau đó bạn có để làm sạch.
Nhưng ở đây trong Haskell là, tôi nghĩ rằng, một khi bạn nhận được hang của nó, vô cùng
có thể đọc được và rất biểu cảm.
Vì vậy, có thực hiện của Frere Jacques.
Được rồi.
Bây giờ chúng ta muốn thêm bộ gõ, và đây là một chút hỗn độn chút.
Vì vậy, chúng ta hãy nhìn vào các slide.
Vì vậy, ý tưởng lớn là làm cho một loạt các danh sách hoặc các bộ phận.
Trên những máy xe lăn, có là điển hình về lẽ tám
đến 10 nhịp điệu hay gõ phần.
Và sau đó sử dụng một loạt các kỹ thuật.
Và chúng tôi đã nói chuyện về these-- sử dụng nếp gấp, các bộ lọc, các hàm lambda,
ánh xạ qua danh sách để tạo ra giá trị trong một số phạm vi từ 1 đến r, r là 16,
hoặc 32 bước trong sequencer.
>> Và sau đó nếu có một giá trị trong danh sách đó như chúng ta đang chạy qua sequencer,
chạy qua nó hơn và hơn, nó quay về lưu ý rằng,
và mẫu được kích hoạt.
Dưới đây là tất cả những cách kỳ lạ khác nhau Tôi đến với để tạo ra các ghi chú.
Thử nó trên tổng bán của riêng bạn.
Nó sẽ âm thanh mát mẻ.
Thời gian cho phép, chúng tôi sẽ đi qua này.
Nhưng đối với ngay bây giờ, tôi đoán chúng ta nên giới thiệu những gì chúng ta có.
Chúng ta hãy hy vọng điều này đi OK.
>> Vì vậy, đây là GHCI.
Và chúng ta sẽ tải một tập tin Tôi có gọi song.lhs,
đó là file tôi chỉ cho các bạn.
Tuyệt.
Như Connor cho biết trước đó, nó biên dịch, nó đánh tiếp kiểm tra,
vì vậy tôi có thể thở dễ dàng hơn nhiều.
Nó sẽ không để thổi lên trên tôi.
>> Tôi muốn cho bạn thấy một cái gì đó hữu ích.
Bạn có thể thấy rằng một mô-đun nạp được gọi là 50.
Bạn có thể duyệt các mô-đun đó.
Và điều này là rất tốt đẹp về doing-- có lẽ những gì
bạn đang làm trong Haskell không phải là gọi là phát triển phần mềm,
nhưng bạn có thể làm được rất nhiều công cụ thú vị trên của riêng bạn.
Và các quy trình làm việc thực sự tốt đẹp như so với rất nhiều ngôn ngữ khác,
bởi vì bạn có thể thấy trong một thực sự cách đọc được những gì đang xảy ra.
Vì vậy, chúng ta thấy rằng chúng ta có tất cả những cụm từ, mà
là danh sách các nốt nhạc, và sau đó chúng tôi xây dựng những thành một cái gì đó lớn hơn,
đó là một bài hát nhạc.
Đó là một đơn vị âm nhạc.
Và sau đó chúng tôi có thể chơi tất cả điều này với một chức năng gọi là chơi nhạc.
Bạn có thể thấy rằng ở đây.
Đó là chỉ cần chơi.
>> Tôi nên say-- Tôi đã không nói chuyện về dấu hiệu này đồng đô la đó là ở khắp mọi nơi.
Ký hiệu đô la là một nhà điều hành ghi.
Nhưng nó có ưu tiên thấp nhất của bất kỳ nhà điều hành, mà hiệu quả
có nghĩa là tất cả mọi thứ trên bên trái của dấu $
và bên phải của ký hiệu đô la, chúng ta sẽ nhận được đánh giá trước khi nó.
Vì vậy, nó là loại giống như một cách thêm dấu ngoặc đơn.
>> Connor HARRIS: Đó là cơ bản hàm hợp.
Và nó đảm bảo rằng bạn không have-- nếu bạn có chức năng hai bên hoặc ghi vào
khai thác ở hai bên, họ sẽ không liên kết qua nó và cung cấp cho bạn
kết quả bất ngờ.
>> STEPHEN KREWSON: Vì vậy, chúng tôi can-- sử dụng đó, chúng ta có thể gọi.
Đầu tiên, chúng tôi sẽ chơi nó mà không có trống.
Đó là máy bay trực thăng, máy bay trực thăng MIDI.
>> [MUSIC CHƠI]
Có những sóng vuông.
Bùn thoại.
Và bạn có thể thực sự đi hoang dã với điều này.
Tôi chọn một trong khá đơn giản, vì tôi biết tôi không nên cắn
nhiều hơn tôi có thể nhai.
Chỉ cần giữ cho nó khá đơn giản để hiển thị các ý chính.
Nhưng sau đó tôi đã như thế, chúng tôi đã có thêm một số trống này.
Chỉ vì đây là một chút bất khả xâm phạm,
và tôi đã không sử dụng tên của các phần trống,
Tôi vẽ bản đồ them-- vì họ một phần của lớp liệt kê,
Tôi đồ hóa chúng để ints.
Một là giống như một trống bass.
Zero là là tốt.
Bảy là một chiếc mũ cao.
Và xuống ở đây, nơi các chức năng có được một ít ngẫu nhiên hơn,
đây là như conga.
>> Vì vậy, nếu bạn nghĩ rằng có thể một about-- cách thú vị để thực hiện một máy trống
là sử dụng rất có trật tự hoa văn trên trống bass của bạn.
Vì vậy, ví dụ, trên lọc qua danh sách với tất cả mọi thứ mà cho phép trở lại
1 khi nó được thực hiện mô-đun 04.
Vì vậy, tôi nhận được 1, 5, 9, 13, 17-- vì vậy đây là nhịp đập đầu tiên của tất cả các biện pháp.
>> Và sau đó là cùng điều chuyển qua hai bước.
Vì vậy, đó là khác thường.
Vì vậy, đây sẽ là một cái gì đó giống như một chiếc mũ cao.
Và sau đó một lần nữa, xuống đây, đó là một chút ngẫu nhiên,
bởi vì chúng ta đang làm conga.
Và tôi có một số maracas xuống đây, quá.
>> Vì vậy, tôi có thể gọi trống máy chơi, nhưng nó sẽ đi mãi mãi,
và nó có thể bắt đầu lấy lên tất cả các bộ nhớ trong hệ thống của tôi.
Vì vậy, tôi sẽ gọi chức năng này chơi nhạc, mà như chúng ta sẽ thấy,
sử dụng các thành phần song song cắt xén để chơi ít bài hát Frere Jacques của chúng tôi
cùng với các máy trống kỳ lạ này.
Vì vậy, chúng ta hãy có một cái nhìn.
Và xin đừng cải thiện trên của tôi sắp xếp tất cả các phần trống.
Không chuyên môn của tôi, nhưng tôi đã có rất nhiều niềm vui làm việc đó.
>> [MUSIC CHƠI]
>> Vì vậy, tất nhiên, điều này là tất cả một chút không phải là niềm vui
nếu chúng ta không thể chuyển đổi nó để một số điểm như vậy có lẽ nó
có thể được giải thích của một nghệ nhân.
Vì vậy, tôi sẽ không chạy nó ở đây.
Tôi đã tạo ra các tập tin.
Bạn có thể thấy rằng có một dot LilyPond file-- và điều này
sẽ segue tôi qua Connor-- và một tập tin MIDI dot,
và một tập tin PDF dot, đó là những gì LilyPond cuối cùng sẽ tạo ra.
>> Nhưng đây là những kịch bản, và tôi sẽ chỉ cần chạy chúng với các tùy chọn giúp đỡ của họ.
Nếu bạn nhận được những lên và chạy với Euterpea, bạn có thể tạo một tập tin MIDI.
Và sau đó từ các tập tin MIDI với chương trình MIDI 2LY này,
bạn có thể tạo ra một Lily Tập tin Pond, và sau đó bạn
có thể tạo ra một file PDF của điểm số.
Và chúng ta nên có một cái nhìn lúc này.
Vì vậy, Connor có lẽ sẽ hiển thị bạn làm thế nào để chú thích này tốt hơn,
nhưng điều này là Frere Jacques như được tạo ra bởi tôi trong Euterpea.
Nó chỉ là trong C. Tôi nên đã tìm ra những hack nó thực sự trong.
Nhưng đó là những đường ống dẫn cho làm thế nào bạn làm điều đó với điều đó.
Hãy nói thêm về LilyPond.
>> Connor HARRIS: OK Hãy xem.
Bạn có đề cập đến Tìm hiểu Bạn Haskell?
STEPHEN KREWSON: Oh yeah.
Kiểm tra Tìm hiểu Bạn Haskell.
Đó là trong các nguồn tài nguyên.
Đó là cách tôi bắt đầu học tập, và nó rất lớn.
Học tập không câm.
>> Connor HARRIS: Vì vậy, nó trực tuyến.
Vì vậy, một người tên là [Không nghe thấy] learnyouahaskell.com, không có khoảng trống.
Grammar là bị bệnh.
STEPHEN KREWSON: Đó là minh họa, quá.
Connor HARRIS: Vậy LilyPond là gì?
Đó là một lập trình khai báo ngôn ngữ cho sắp chữ âm nhạc.
Vì vậy, bạn có thể declarative-- nghĩ về những điều như HTML,
nơi bạn không saying-- HTML không nói như thế nào các trình duyệt web nên
render các trang từng bước.
Nó chỉ nói điều này là một đoạn mô tả
về những gì bạn muốn các trang trông giống như.
>> Và sau đó nó cũng là một chương trình mà biên dịch ngôn ngữ này,
hoặc nó đọc trong của nó và sau đó thực sự hiện sắp chữ cho bạn,
và nó phun ra những tuyệt vời điểm PDF tìm kiếm.
Bạn cũng có thể nhận được định dạng PNG hoặc bất cứ điều gì.
Một cách tốt để suy nghĩ của điều này là bằng cách tương tự
là LaTeX là loại giống như LillyPond, nhưng chỉ sắp chữ thường.
Vì vậy, thay vì of-- nó không WYSIWYG, những gì bạn thấy
Là cái bạn có, như, nói Finale là, hoặc Sibelius,
hoặc Microsoft Word, nơi bạn có thể gõ vào thời gian thực và dự thảo điều trong thời gian thực
và nhìn thấy sự thay đổi ngay lập tức.
>> Nó được dựa trên văn bản.
Bạn cần phải biên dịch của bạn điểm số bằng cách sử dụng một chương trình riêng biệt
và nhận ra các file PDF sau đó.
Đây là một chút ít thuận tiện cho việc sử dụng nếu bạn đang
cố gắng để viết trực tiếp vào điểm a và bạn
cố gắng để sáng tác trên máy tính.
Nhưng có rất nhiều lợi thế cho nó.
Một, nó trông đẹp hơn rất nhiều, vì LillyPond có thể thực sự
dành thời gian để làm quyết định bố trí đúng cách,
không giống như Sibelius hoặc Finale, trong đó có để thực hiện các thuật toán bị xâm phạm như vậy
rằng họ có thể hiển thị điều trong thời gian thực.
>> Vì vậy, tại sao là LilyPond-- đồ họa máy tính là khó khăn.
Nếu bạn đang làm bất cứ điều gì với âm nhạc và bạn muốn viết ra điểm số,
bạn không muốn viết ra tất cả mọi thứ một mình
bắt đầu với cách vẽ đội ngũ nhân viên và làm thế nào để vẽ các tập sách.
Nó rất khó. Nó được thực hiện trước.
Bạn đang sử dụng tốt.
>> Nếu bạn muốn sử dụng Finale hoặc Sibelius, các định dạng tập tin cho những điều đó
rất phức tạp, và bạn không thể thực sự sử dụng chúng theo chương trình.
Bạn có thể mở lên Sibelius với Finale và hãy vào File, Export as PDF mình,
nhưng bạn có thể không thực sự gọi đó là từ một kịch bản.
LillyPond, bạn có thể gọi từ những kịch bản.
Bạn có thể dễ dàng lặp LillyPond với LaTeX.
Tôi sẽ không có nhiều thời gian để đi vào các công nghệ này ngay bây giờ,
nhưng chúng tồn tại.
Nếu bạn muốn tìm thành một cuốn sách LillyPond,
đó là một chương trình mà đến với phân phối LillyPond của bạn,
và nó cho iterating Mảnh LillyPond vào LaTeX
nếu bạn muốn làm điều gì đó như một tài liệu âm nhạc học lớn
với các ví dụ, ví dụ.
Và đó là một kỹ năng tốt cho cuộc sống nếu bạn đang làm bất cứ điều gì
với âm nhạc, không chỉ CS50.
Tôi đã sử dụng LillyPond cho tất cả các dự án thành phần của tôi
kể từ khi tôi được cơ bản một cấp cao ở trường trung học.
>> Vì vậy, đây là một số ví dụ đơn giản.
Điều này về cơ bản là đại diện về mức độ khó khăn
mà hầu hết mọi người sẽ đối mặt với nó họ đã cố gắng
sử dụng LilyPond cho các dự án đơn giản.
Người đầu tiên này là sự khởi đầu đến một khúc dạo đầu hợp xướng của Bach.
Một dưới đây là một đoạn trích từ một trong những tác phẩm của riêng tôi,
và nó chỉ có thể hiện bạn những thứ như [không nghe]
việc đưa nhiều dòng trong cùng một nhân viên, làm thế nào lyric undersetting hoạt động.
Underlays Lyric là một điều đó là rất dễ sử dụng LilyPond cho âm nhạc hợp xướng.
>> Và như vậy thì có một số chi tiết ví dụ phức tạp ở đây.
Tất cả những được thực hiện trong LilyPond và họ có tính khả thi.
Trích đoạn đầu tiên này là từ [Không nghe thấy] by [không nghe được].
Và điều này [Không nghe thấy] từ một mảnh cho bass solo của
sáo bởi [Không nghe thấy], là người một longtime-- người
là một thành viên lâu năm của bộ phận âm nhạc ở đây, tôi nghĩ.
Tôi không chắc chắn nơi anh ta đi tắt để.
Nhưng ông là cố vấn của Harvard Hiệp hội các nhà soạn nhạc trong một thời gian dài.
Người đàn ông tuyệt vời.
Và ông viết một số bài nhạc đó có rất ký hiệu phức tạp mà LillyPond
dù sao cũng có thể xử lý rất độc đáo.
>> Như vậy chỉ cần cung cấp cho bạn một cảm giác gì khả năng của điều này are-- vậy
bên trong của LillyPond rất phức tạp.
Và bạn có thể sử dụng nó cho một thời gian dài, kể cả
đối với một số khá phức tạp điều, mà không thực sự
phải biết rất nhiều về họ.
Nhưng ý tưởng cơ bản là trên mức thấp nhất, các nguyên tử của LillyPonds
là những ghi chú.
Các ghi chú có chứa một bối cảnh được gọi là tiếng nói.
Vì vậy, bối cảnh giọng nói về cơ bản tương ứng
với một đường dây duy nhất của âm sắc.
Và sau đó bối cảnh có thể chứa hệ thống dọc
ở những cấp độ cao hơn mà đại diện cho cán bộ về điểm số
hoặc các nhóm lớn hơn như đội ngũ nhân viên piano hoặc nhân viên ca đoàn,
và sau đó cuối cùng toàn bộ bối cảnh điểm.
Và bạn thực sự có thể bao gồm nhiều điểm số trong một cuốn sách.
>> Và mỗi bối cảnh có một số chạm khắc đính kèm.
Nếu bạn xem xét thông qua các nội dung của một bối cảnh
và in một biểu tượng nào đó hoặc một lớp nhất định của các biểu tượng khi cần thiết.
Vì vậy, để mọi bối cảnh giọng nói, có [Không nghe thấy] ghi chú
khắc mà về cơ bản là một chức năng hay một đối tượng mà viết ra tất cả các lưu ý
đứng đầu trên phần bên phải của trang.
Sau đó có một khắc khe, mà viết ra Khe trên các nhân viên.
Sau đó có một nhịp dấu khắc đó
viết ra dấu nhịp trong một số điểm.
Và tất cả những phù hợp với khá cũng vào hệ thống phân cấp.
Và nó rất, rất, rất tùy biến, mà bạn cần
nếu bạn muốn có được những điều như thế.
>> Vì vậy, tất cả các bối cảnh có một rất nhiều thuộc tính khác nhau
mà bạn có thể sửa đổi cho tất cả mọi thứ từ khoảng cách để phông chữ khác nhau
lựa chọn về kích thước của sự vật.
Nếu bạn muốn làm thậm chí những điều phức tạp hơn,
có một ngôn ngữ kịch bản nhúng.
Họ sử dụng chương trình, trong đó là phương ngữ của LISP.
Đây có lẽ không nghĩa gì với bạn.
Nhưng về cơ bản, đề án một chức năng
ngôn ngữ lập trình, nhiều hơn hoặc ít hơn.
>> STEPHEN KREWSON: The tie-in.
>> Connor HARRIS: Yeah.
Đó là một tie-in tốt, tôi giả sử.
Và nó được sử dụng như một ngôn ngữ giảng dạy, thực sự, giảm Lễ Ave. Tại MIT.
Và nó rất tiện dụng cho LillyPond vì lý do kỹ thuật khác nhau.
>> Và vì vậy nếu bạn muốn làm cho đơn giản chỉnh phụ thuộc vào điều kiện,
cho example-- có nhất định điều kiện của một số điểm mà bạn đã từng gặp,
làm thay đổi đến bố trí hoặc whatnot-- sau đó
các cơ sở đang có.
Chúng phức tạp.
Vì vậy, đây là một mẫu mã đẹp, đơn giản.
Đó là năm dòng.
Về cơ bản, tôi xác định hai cán bộ.
Đó là trong 3/4.
Các nhân viên đầu tiên có một gắn dấu tiến độ,
nhưng đó là thực tế đi để đi vào toàn bộ điểm số,
vì vết tiến độ là về tỉ số.
Việc khắc dấu nhịp được gắn với điểm số ngữ cảnh.
Có các phím khác nhau, vì [Không nghe thấy] khắc
được gắn các nhân viên.
Bạn thực sự có thể làm được.
Các mẫu tôi đã viết là thực sự trong C lớn,
nhưng nó chỉ là để chứng minh bạn có thể có
các phím khác nhau trong đội ngũ nhân viên khác nhau.
Và cú pháp cơ bản là bạn viết lưu ý tên với E, F, G, bất cứ điều gì.
Nếu bạn muốn làm accidentals, bạn hậu tố IS hay ES.
Đây là từ Hà Lan ước Âm nhạc học.
>> Và để làm nhảy quãng tám, bạn phải sử dụng những dấu kiềm, dấu phẩy hoặc dấu nháy đơn.
Sự tương đối chỉ có nghĩa là bất cứ điều gì bạn có một lưu ý,
nó sẽ tự động được plaec trong octave gần gũi nhất với trước đó.
Và nếu bạn muốn nhảy hơn một fifth-- nói một thứ năm hoặc more--
sau đó bạn phải sử dụng [không nghe được].
Nhưng nếu không, bạn không cần phải xác định các quãng tám của mỗi nốt nhạc.
>> Và tương đối C, nguyên tố, và C, bạn chỉ cần xác định giữa C
và cơ sở C, ghi chú đặc biệt đầu tiên.
Sau đó, bạn có những nhân viên mà tổ chức hai tiếng nói này hoặc mẫu của âm nhạc,
và bạn có một điểm số.
Và đó trông như thế này.
>> Nếu bạn muốn dành thời gian để sao chép rằng mẫu LillyPond
mã trên trước trượt xuống đây, và bạn
có thể viết nó cho LillyPond mình.
Tôi biết chúng tôi đã có một cái gì đó trông rất nhiều như thế này.
Vì vậy, có một công nghệ khác Âm nhạc được gọi là XML duy trì
bởi những người hoàn toàn khác nhau.
XML là một dữ liệu văn bản structure-- tôi không nên nói dữ liệu structure-- nói
ẩn dụ bản đồ loại.
Và nó được thiết kế để giữ phân cấp dữ liệu rất tốt.
HTML, ví dụ, là một loại XML.
Và bạn có thể nói với XML vì họ đã có tất cả các dấu ngoặc nhọn và góc
dấu gạch chéo khung rằng chương các trường dữ liệu.
>> Tôi không có một mã số Ví dụ từ Music XML.
Bạn có thể tìm cho mình.
Về cơ bản, lý do bạn có thể muốn để sử dụng XML như các giai đoạn trung gian
là, trước hết, đó là một định dạng trao đổi
về cơ bản cho every-- tôi không nên nói mỗi, nhưng rất nhiều điểm khác nhau
nhà văn.
Vì vậy, nếu bạn viết trong Âm nhạc XML, không chỉ có thể LillyPond
đọc nó với sự giúp đỡ của auxilary này chương trình được gọi là nhạc XML để LY,
nhưng cũng có thể đọc Finale nó, Sibelius có thể đọc nó.
Tùy thuộc vào cách đối tượng nội bộ của bạn hệ thống phân cấp các công trình cho đại diện cho âm nhạc,
nó có thể được dễ dàng hơn để viết ra nhạc XML hơn để LillyPond
và chỉ dựa trên Music XML LY để làm việc chuyển đổi.
>> Tôi không nghĩ rằng [Không nghe thấy] có nhạc XML.
STEPHEN KREWSON: Nó không.
Ai đó đang làm việc trên nó, mặc dù.
>> Connor HARRIS: OK.
Euterpea không có một Chức năng đầu ra âm nhạc XML nào.
Nếu bạn muốn có một ý tưởng dự án cuối cùng, có thể liên lạc với kẻ
rằng Stephen biết, và họ có thể sử dụng sự giúp đỡ của bạn.
>> STEPHEN KREWSON: Tôi rất thích điều đó.
Connor HARRIS: Ngoài ra, về cơ bản, mỗi ngôn ngữ lập trình
đó là giá trị muối của nó đã có một thư viện XML,
do đó, bạn có thể chuyển đổi tất cả trong nội bộ âm nhạc của bạn vào một số đối tượng
rằng các thư viện XML có thể viết ra rằng sẽ yêu cầu ít hơn
thay đổi cấu trúc nội bộ của bạn đối với bất cứ đối tượng âm nhạc bạn
muốn viết vì viết nó trực tiếp trong LillyPond sẽ.
Sau đó, chỉ cần in ra với XML với các thư viện XML trong ngôn ngữ của bạn,
đó sẽ đảm bảo rằng nó đúng cú pháp và tất cả mọi thứ,
và sau đó chuyển đổi nó để LillyPond.
Vì vậy, công nghệ bạn có thể muốn xem xét nếu bạn đang làm gì đó
Như thế này.
>> [Không nghe thấy], khác công nghệ auxilarry.
Điều này về cơ bản là Tech trình hoặc Tech Studio cho LillyPond.
Vì vậy, nó cung cấp sự giúp đỡ với cú pháp, với các mẫu
cho khác nhau phổ biến kết hợp của các công cụ.
Nó cho phép chia màn hình để xem bạn có thể có mã của bạn trong một cửa sổ
và PDF trong cửa sổ khác và click vào nơi trong PDF
để nhảy tới liên quan điểm trong mã nguồn của bạn.
Điều này là hữu ích hơn nếu bạn thực sự văn bản LillyPond tập tin chính mình
hơn nếu bạn đang tạo ra họ lập trình.
Nhưng một lần nữa, đó là một cái gì đó hữu ích để có.
>> Thật tuyệt.
Resources-- khác tôi sẽ chỉ đi qua này rất nhanh chóng.
LillyPond manuals-- LillyPond có tài liệu tuyệt vời trên trang web của mình.
Họ có một hướng dẫn.
Họ có một tham chiếu cú ​​pháp.
Họ có hàng trăm đoạn cho những thứ nhỏ khác nhau
yo có thể cần phải làm gì để chứng minh khả năng khác nhau.
Nếu bạn muốn sử dụng các ngôn ngữ kịch bản
hoặc thực hiện rộng rãi hơn các tùy chỉnh, sau đó có
internals tham khảo tại URL đó.
Nếu bạn muốn sử dụng nhạc XML, có URL đó, musicxml.com/tutorial.
>> Và sau đó nếu bạn cần phải học chương trình bởi vì bạn thực sự muốn sử dụng
các cơ sở kịch bản trong LillyPond, sau đó có một [không nghe được] gọi
Giải thích cấu trúc chương trình máy tính,
đó không chỉ là thứ hai sách giáo khoa CS vĩ đại nhất written--
tìm thấy tôi sau đó nếu bạn muốn biết những gì tôi nghĩ là vĩ đại nhất một is--
nhưng nó cũng là một rất tốt giới thiệu về ngôn ngữ thích hợp.
Bạn sẽ không cần nhiều hơn vài phần đầu tiên.
>> Và đó là nó.
Bất kỳ câu hỏi?
>> HỌC SINH: tôi có thể tải về ở đâu bạn tạo ra Frere Jacques
vì vậy tôi có thể đặt nó trên iPod của tôi?
>> STEPHEN KREWSON: Vâng, bạn có thể viết ra một số file wav trong Euterpea.
Và bạn có mật mã.
Đó là trên GitHub.
Làm cho các biến của riêng bạn Frere Jacques bởi CS50 tâm hive.
Nó sẽ rất tuyệt.
Connor HARRIS: Bất cứ ai khác?
STEPHEN KREWSON: Chúng ta cần một cái trống bass tốt hơn, quá.
Nó thực sự xấu.
>> HỌC SINH: Euterpea đã không chỉ phía thành phần, nhưng signal--
STEPHEN KREWSON: Yes.
Trong thực tế, công việc tôi đã làm trong khi tôi Euterpea
mất this-- có một tốt nghiệp khóa học tại Yale đó
sử dụng it-- là sự tổng hợp âm thanh.
Vì vậy, có một thực sự cách tốt đẹp sử dụng mũi tên
và một số các ký hiệu mà chúng ta thấy trong sáng tác cùng các chức năng tín hiệu.
Đặc biệt, bass cho hầu hết của họ chỉ là một sóng sin đơn giản.
Nhưng nếu bạn bắt đầu sáng tác những trong cách chương trình lạ,
bạn có thể nhận được âm thanh điên hiệu ứng, như thác lạ.
Bạn có thể tạo ra rất gritty âm thanh với rất nhiều điều chế.
>> Tôi đã làm một dự án về hạt tổng hợp, đó là
một nơi nào đó ở giữa FM và lấy mẫu.
Bạn mất rất nhỏ, mẫu nhỏ, và sau đó
kết hợp chúng với một số loại modulator và xây dựng lên một âm thanh phong phú hơn.
Chúng tôi cũng đã làm mô hình vật lý, do đó, cố gắng suy nghĩ về vật lý
và psychoacoustics của một cái gì đó như một trumpet, và suy nghĩ về cách thức
âm thanh được bật khỏi chuông kèn
và các âm thanh của phòng và mô hình hóa
rằng với các dao động cơ bản.
Connor HARRIS: Cảm ơn rất nhiều.
Cám ơn vì đã tới.
Và tôi luôn sẵn sàng lời các câu hỏi bằng cách email--
connorharris@college.harvard.edu.
>> STEPHEN KREWSON: Yeah. stephen.krewson@yale.edu.
Mát.