- Mã nguồn đóng vai trò như một bản nhạc nghệ thuật sắp đặt điều khiển đồng thời việc chọn hợp âm, tổng hợp âm thanh và phản ứng LED, trong đó cấu trúc điêu khắc trông như thân cây lặp đi lặp lại việc tạo ra âm thanh và ánh sáng
- Phần A tạo các hợp âm và thế đảo Major, Minor, Major 7th, Minor 7th từ A2 đến D5, rồi cứ mỗi 8 giây chuyển sang một hợp âm chỉ khác đúng một nốt
- Phần B chọn một nốt từ hợp âm hiện tại và phát nó với dạng sóng và độ dài ngẫu nhiên, chồng các nốt đơn khó đoán lên trên tiến trình hợp âm đều đặn
- Mỗi khi một hợp âm hay nốt mới xuất hiện, LED dạng thân cây sẽ phản ứng, và màu của từng nốt được ánh xạ để các nốt gần nhau trên vòng tròn quãng năm trông có màu tương tự nhau
- Việc triển khai được chia thành chương trình âm thanh C++ trên Raspberry Pi 3 B+ và điều khiển LED FastLED trên Arduino Uno, hai thiết bị trao đổi thông tin nốt nhạc qua cổng serial
Bản nhạc được cấu thành từ các quy tắc tạo sinh
- Phần A liệt kê các hợp âm Major, Minor, Major 7th, Minor 7th khả dụng và mọi thế đảo từ A2 đến D5
- Hợp âm được chọn sẽ phát trong 8 giây, sau đó chuyển sang một hợp âm chỉ khác hợp âm hiện tại đúng một nốt
- Quá trình này tiếp tục lặp lại với chu kỳ phát 8 giây và chọn hợp âm lân cận
Quy tắc tạo âm
- Phần B chọn một nốt từ hợp âm đang phát hiện tại
- Nốt được chọn sẽ được phát bằng dạng sóng ngẫu nhiên trong một khoảng thời gian ngẫu nhiên
- Nếu thời lượng ngắn, nó sẽ lặp lại một số lần ngẫu nhiên, sau đó chờ trong một khoảng thời gian ngẫu nhiên rồi lặp lại cùng quy trình
Quy tắc phản ứng ánh sáng
- Phần C làm sáng từng thân cây từ gốc đến ngọn mỗi khi một hợp âm mới được kích hoạt ở phần A
- Màu ánh sáng tương ứng với từng nốt trong hợp âm, và các nốt liền kề trên vòng tròn quãng năm có sắc độ tương tự nhau
- Phần D mỗi khi một nốt được phát ở phần B sẽ chiếu sáng đầu của một trong các thân cây bằng màu sáng tương ứng với nốt đó
Triển khai phần cứng và phần mềm
- Phần A và B do chương trình C++ tùy biến chạy trên Raspberry Pi 3 B+ đảm nhiệm
- Xử lý cả việc chọn nốt lẫn tổng hợp bộ đệm âm thanh
- Phần C và D được triển khai bằng chương trình tùy biến trên bo mạch Arduino Uno
- Sử dụng FastLED để giao tiếp với dải LED dùng giao thức WS2812B
- Thông tin nốt nhạc được truyền từ Raspberry Pi sang Arduino qua tín hiệu cổng serial
Cấu trúc vật lý và cách vận hành
- Dải LED đi xuyên qua các ống trong suốt dùng cho bể cá gia dụng
- Các ống được gia cường bằng dây niken dày để có thể tạo hình
- Vỏ gỗ bên dưới chậu cây chứa máy vi tính siêu nhỏ, dây dẫn và jack âm thanh 3.5mm để kết nối hệ thống âm thanh
- Nguồn điện được cấp qua hai kết nối nguồn chính
- Các máy tính hoạt động ở chế độ headless và tự động khởi động khi có điện
1 bình luận
Ý kiến trên Hacker News
Người này cũng là tác giả của endless acid banger rất hay, thứ bạn có thể nghịch hàng giờ trong trình duyệt
https://www.vitling.xyz/toys/acid-banger/
Sau khi thử cái này, tôi thậm chí đã mua một clone 303 thật để bắt đầu vọc vạch. Tôi cũng thích việc tất cả demo đều mở bằng màn hình “click to start” không có âm thanh, và các video tự phát cũng mặc định tắt tiếng như trong bài này
Trong bài này, phải di chuột lên “silent gif” thì mới thấy nút điều chỉnh âm lượng; còn với acid banger, tôi đã viết được nửa bình luận mới phát hiện ra rằng bấm vào bất kỳ đâu sẽ bỏ tắt tiếng
Thật thú vị khi thấy bản nhạc của nhạc sinh tạo được viết dưới dạng đặc tả như vậy
Nó đủ chi tiết để nếu ai đó dựa trên các chỉ dẫn ấy mà triển khai lại phiên bản của mình, về bản chất sẽ tạo ra cùng một “tác phẩm âm nhạc”, nhưng cách diễn giải chắc chắn sẽ khác. Vì bản nhạc quy định chính xác một số phần, nhưng để mở những lựa chọn khác. Vẫn còn các vấn đề như khi liệt kê hợp âm thì “mọi thế đảo” chính xác nghĩa là gì, có bao gồm cả voicing mở không, độ dài của dạng sóng tùy ý sẽ chọn trong những giá trị nào, “ngắn” là khoảng bao lâu khi quyết định lặp lại, dùng synthesizer dạng sóng nào và điều biến ra sao
Những quyết định như vậy tương tự các lựa chọn mà nhạc công nhạc cụ truyền thống đưa ra khi diễn giải và biểu diễn một bản nhạc. Ở đây, coder nhạc sinh tạo có thể theo “bản nhạc” này và tạo ra một chương trình mang cách diễn giải của riêng mình
Thử triển khai bằng Sonic Pi(https://sonic-pi.net/) là một bài tập thú vị, và tôi cảm thấy mình đã tạo được thứ khá gần với hướng mà nhà soạn nhạc dự định. Nó mang cùng bầu không khí với bản thu trong video, nhưng nếu nói vậy có hợp lý thì đó là “màn trình diễn” của tôi về tác phẩm ấy. Dù khi chạy thật thì Sonic Pi mới là thứ biểu diễn
Quá trình này cũng khiến tôi nghĩ lại về mối quan hệ giữa đặc tả và triển khai. Có thể xem các triển khai của những lập trình viên khác nhau cho một thuật toán là từng “màn trình diễn” của bản nhạc mang tên thiết kế tổng thể; còn lập trình viên xây dựng các thành phần của một kiến trúc hệ thống lớn hơn cũng giống như nhạc công đảm nhiệm phần của mình trong một ban nhạc hay dàn nhạc. Có đội được dẫn dắt bởi một người vừa là nhạc trưởng vừa là kiến trúc sư; có đội thì ngẫu hứng, tung hứng riff qua lại rồi thỉnh thoảng có người solo. Cũng có đội giống các nhạc công session, chơi không hào nhoáng nhưng chắc tay theo đặc tả của producer
Đó là một bài tập lập trình mang tính thiền rất hợp cho chiều Chủ nhật, và nó đã giúp tôi đổi góc nhìn
Khi tôi định trưng bày một tác phẩm cũ, tôi đã nhận phản hồi từ một curator nghệ thuật; tác phẩm đó chính là https://www.vitling.xyz/welcome-to-tech-talk/. Ban đầu người ấy không hiểu rõ chuyện gì đang diễn ra, nhưng sau khi tôi giải thích cách nó hoạt động và những gì xảy ra bên trong, họ nói: “Giờ thì tôi thật sự thích nó. Nhưng bạn đang giấu hết những phần thú vị với khán giả”
Trong nghệ thuật sinh tạo, “công việc” tôi làm không hẳn là âm thanh hay hình ảnh đầu ra, mà gần với một tập quy tắc hay thuật toán hơn. Vì vậy tôi luôn muốn tìm cách cho thấy chuyện gì đang xảy ra “bên trong chiếc hộp”. Mã nguồn có thể tốt, nhưng chỉ với những người đọc được nó, và các ý tưởng cốt lõi dễ bị chôn vùi trong boilerplate và những điểm kỳ quặc kỹ thuật. Vì thế tôi đi đến ý tưởng viết dưới dạng bản nhạc, cố gắng thể hiện tiền đề cơ bản của những gì đang diễn ra, nhưng chỉ đến mức không khiến người xem lạc lối trong chi tiết
https://massmoca.org/event/walldrawing305/
Vì vậy có lẽ sẽ bỏ sót nhiều voicing mở và thưa hơn
Thế đảo làm thay đổi khá nhiều sắc thái của hợp âm
Tôi muốn được gợi ý sách hoặc khóa học về lý thuyết âm nhạc giúp hiểu thuật toán này hoặc https://www.vitling.xyz/toys/acid-banger/
Có những quy tắc khá đơn giản để dự đoán thứ gì đó nghe ổn, cũng có những quy tắc phức tạp hơn, và ai cũng biết âm nhạc Baroque mang tính thuật toán, nhưng tôi vẫn hoàn toàn chưa hình dung được
Trước đây tôi từng tìm hiểu theo hướng này, nhưng không nhớ chính xác các cuốn sách tôi đọc có vấn đề gì. Có lẽ đa số quá cơ bản nên không giúp được nhiều. Từ lâu tôi đã được đào tạo solfège rất cơ bản và có thể đọc bản nhạc, nhưng khi đó tôi còn quá nhỏ để đặt ra những câu hỏi hiện tôi đang tò mò hoặc hiểu mục đích của việc luyện tập ấy
Rốt cuộc, nếu không tự viết thật nhiều nhạc thì rất khó hiểu lý thuyết âm nhạc. Nó giống như đọc sách JavaScript: nếu bạn chưa từng viết phần mềm và cũng không có kế hoạch viết, thì không có cách nào để thực sự hiểu cuốn sách đó
Nếu thử giải thích ứng dụng này hoạt động thế nào, có thể nó chọn ngẫu nhiên một tập con các nốt trong giọng thứ, tức các bậc âm giai. Âm giai ngũ cung, là tập con gồm không quá 5 nốt của một âm giai, giới hạn không gian giai điệu khả dĩ để phần lớn các cấu hình đều nghe hay. Dùng ít nốt hơn thì sẽ dễ nghe hơn theo cách dễ dự đoán hơn, nhưng có thể kém thú vị hơn. Ví dụ, các nốt tạo thành hợp âm gốc luôn nghe hay dù chơi theo thứ tự nào. Một acid line thường gợi ý một hợp âm thứ nào đó thông qua arpeggio, tức giai điệu lặp lại chỉ gồm các nốt của một hợp âm cụ thể
Ngoài ra, một tập con của một âm giai luôn có thể nằm trong âm giai khác. Nếu tạo một đoạn dùng tập con các nốt chung rồi chuyển sang âm giai mới, bạn có thể chuyển điệu từ âm giai này sang âm giai khác. Theo cách này, một bản nhạc có thể đi qua mọi âm giai khả dĩ, và trong acid techno thì gần như toàn bộ là âm giai thứ
Bạn không thể cầm một thứ được viết cho người có mức hiểu biết cao hơn mình hiện tại mà thu được nhiều điều. Phải đọc từng trang một cách chậm rãi, có chủ đích và khiêm tốn, dành thời gian để hiểu hoàn toàn từng thuật ngữ gặp phải. Trong quá trình đó bạn sẽ phải đi đường vòng hàng giờ, và trong đó lại có những thuật ngữ khác phân nhánh ra vô tận. Không thể bỏ qua những từ như quãng âm, locrian/lydian rồi kỳ vọng mình sẽ hiểu được bằng thẩm thấu
Sách bàn về cao độ là gì, vì sao não “thích” một số tổ hợp cao độ nhất định và không thích những tổ hợp khác, v.v. Bản thân các lý thuyết về thần kinh học âm nhạc trong sách cũng thú vị, và phần đầu có phần giới thiệu lý thuyết rất cơ bản
Một mẹo cho tác giả: nếu bỏ Arduino và dùng thư viện này để điều khiển trực tiếp dải WS281x trên Raspberry Pi, bạn có thể giảm đáng kể độ phức tạp phần cứng và phần mềm: https://github.com/jgarff/rpi_ws281x
Tôi đang dùng nó trên Pi 4 để điều khiển dải WS2815 dài 466 pixel gắn trên diềm mái nhà làm đồ trang trí ngày lễ
Trong dự án này có một phần lý thuyết âm nhạc thú vị ẩn bên trong. Với thuật toán được mô tả, mọi chuyển tiếp từ hợp âm này sang hợp âm khác hoặc là chuyển về cùng hợp âm, chẳng hạn từ C trưởng sang một thể đảo của nó hoặc thêm/bớt nốt thứ 7, hoặc là một trong ba phép biến đổi cơ bản P, L, R của lý thuyết Neo-Riemannian
Muốn biết chi tiết thì xem trang Wikipedia về Neo-Riemannian theory; còn cốt lõi của P, L, R là như sau. Nếu một hợp âm bất kỳ x là trưởng, thì P(x), L(x), R(x) đều thành thứ. Nếu x là thứ, thì P(x), L(x), R(x) đều thành trưởng. P, L, R đều là phép nghịch đảo của chính chúng, nên P(P(x)) = x, và L cùng R cũng vậy. Thông qua một thứ tự bất kỳ của các phép biến đổi P, L, R, bạn có thể đi từ bất kỳ hợp âm trưởng hoặc thứ nào sang bất kỳ hợp âm trưởng hoặc thứ nào khác. Ví dụ, từ C trưởng, áp dụng L rồi R sẽ thành G trưởng; áp dụng R rồi P sẽ thành A trưởng; áp dụng L rồi P sẽ thành E trưởng
Di chuyển bằng phép biến đổi Neo-Riemannian là một cách nhanh chóng đi tới những trung tâm giọng “xa” thông qua voice leading mượt, tức những nơi không có nhiều nốt âm giai chung với giọng ban đầu. Nhưng khi nghe bản này, tôi ngạc nhiên vì hòa âm cho cảm giác tương đối ổn định. Điều thú vị là do cấu trúc thuật toán, phép biến đổi P xuất hiện ít hơn nhiều so với phép biến đổi L hoặc R, hoặc so với việc ở lại cùng hợp âm. Phép biến đổi P là thành phần then chốt để nhanh chóng di chuyển sang giọng xa; theo tính toán sơ bộ của tôi, nếu giả định quá trình Markov đã đạt trạng thái dừng và bỏ qua giới hạn cao độ thấp nhất/cao nhất, thì chỉ 1/27 trong mọi lần đổi hợp âm là phép biến đổi P. Ở trạng thái dừng cũng suy ra rằng hợp âm bảy phổ biến hơn tam âm đơn giản theo tỷ lệ 16:11
Tôi tò mò về các chi tiết kỹ thuật vì muốn hiểu thêm giới hạn của Raspberry Pi
Liệu không thể xử lý toàn bộ việc này chỉ bằng một Raspberry Pi và nhiều chân GPIO gắn trên đó sao? Hiện tại có cảm giác Raspberry Pi đang chưa được tận dụng hết, và đơn giản hóa thành một bo mạch duy nhất có vẻ tốt hơn. Một hệ quả tốt nữa là chỉ cần một kết nối nguồn
Nếu việc Pi làm chỉ là “chọn nốt và tổng hợp chính buffer âm thanh”, thì chắc chắn Arduino Uno cũng làm được chứ?
Điểm hay là được viết bằng mã giả để ai cũng có thể hiểu
Tôi cũng từng làm những dự án như thế này, đặc biệt là phần tạo nhạc, nên rất thích cách trình bày này. Nếu có thêm demo video thì còn tốt hơn; nhiều dự án code chỉ được tác giả giải thích bằng một bức tường chữ dài, khiến người ta bỏ cuộc ngay từ trước khi bắt đầu.
Thật sự rất tuyệt. Giá mà có hướng dẫn chế tạo chi tiết để làm thứ như thế này
Có vẻ dùng làm intro cho set của Four Tet cũng được :)
Đẹp quá. Khiến tôi tưởng tượng đến một hành tinh ngoài hệ Mặt Trời nơi thực vật có dạng như thế này
Những thứ như vậy có thể tạo thành một khu rừng, và cũng có thể đồng bộ với nhau như metronome hay đom đóm vậy.