1P by GN⁺ | ★ favorite | 댓글 1개
  • 코드가 화음 선택, 음 합성, LED 반응을 함께 지휘하는 설치 예술 악보로, 식물의 줄기처럼 보이는 조형물이 소리와 빛을 반복 생성함
  • 파트 A는 A2부터 D5까지의 Major, Minor, Major 7th, Minor 7th 화음과 전위를 만들고, 한 음만 다른 화음으로 8초마다 이동함
  • 파트 B는 현재 화음에서 음 하나를 골라 무작위 파형과 길이로 재생해, 규칙적인 화음 진행 위에 예측하기 어려운 단음을 얹음
  • 새 화음이나 음이 발생할 때마다 줄기 형태의 LED가 반응하며, 각 음의 색은 5도권에서 가까운 음끼리 비슷하게 보이도록 매핑됨
  • 구현은 Raspberry Pi 3 B+의 C++ 오디오 프로그램과 Arduino Uno의 FastLED LED 제어로 나뉘며, 두 장치는 시리얼 포트로 음 정보를 주고받음

생성 규칙으로 구성된 악보

  • 파트 A는 A2부터 D5까지 가능한 Major, Minor, Major 7th, Minor 7th 화음과 모든 전위를 열거함
  • 선택된 화음은 8초간 재생되고, 이후 현재 화음과 한 음만 다른 화음 중 하나로 이동함
  • 이 과정은 8초 재생과 인접 화음 선택을 반복하며 계속 이어짐

음 생성 규칙

  • 파트 B는 현재 재생 중인 화음에서 음 하나를 선택함
  • 선택된 음은 무작위 파형으로, 무작위 길이 동안 재생됨
  • 길이가 짧으면 무작위 횟수만큼 반복되고, 이후 무작위 시간 동안 기다린 뒤 같은 과정을 반복함

조명 반응 규칙

  • 파트 C는 파트 A에서 새 화음이 트리거될 때마다 각 줄기를 뿌리에서 끝까지 밝힘
  • 조명 색상은 화음의 각 음에 대응하며, 5도권에서 인접한 음들은 비슷한 색조를 가짐
  • 파트 D는 파트 B에서 음이 재생될 때마다 줄기 중 하나의 끝을 해당 음에 대응하는 밝은 색으로 비춤

하드웨어와 소프트웨어 구현

  • 파트 A와 B는 Raspberry Pi 3 B+에서 실행되는 커스텀 C++ 프로그램이 담당함
    • 음 선택과 오디오 버퍼 합성을 모두 처리함
  • 파트 C와 D는 Arduino Uno 보드의 커스텀 프로그램으로 구현됨
    • FastLED를 사용해 WS2812B 프로토콜 LED 스트립과 인터페이스함
  • Raspberry Pi에서 Arduino로 전달되는 음 정보는 시리얼 포트 신호를 통해 오감

물리적 구조와 동작 방식

  • LED 스트립은 가정용 수족관에 쓰이는 투명 튜브 안을 통과함
  • 튜브는 두꺼운 니켈 와이어로 보강되어 조형 가능한 형태가 됨
  • 화분 아래의 나무 하우징에는 마이크로컴퓨터, 배선, 사운드 시스템 연결용 3.5mm 오디오 소켓이 들어 있음
  • 전원은 두 개의 주 전원 연결을 통해 들어옴
  • 컴퓨터들은 헤드리스로 동작하며, 전원이 들어오면 자동 시작

댓글과 토론

Hacker News 의견들
  • 이 사람은 브라우저에서 몇 시간씩 가지고 놀 수 있는 멋진 endless acid banger의 제작자이기도 함
    https://www.vitling.xyz/toys/acid-banger/
    이걸 해보고 나서 실제 303 클론까지 사서 이것저것 만져보기 시작했음. 또 모든 데모가 무음의 “click to start” 화면으로 열리고, 자동 재생 영상도 이 글처럼 기본적으로 음소거되어 있는 점이 좋음

    • 두 페이지 모두 내 환경에서는 “click to start” 메시지가 안 보였지만, 표시되는 편이 맞을 듯함
      이 글에서는 “silent gif” 위에 마우스를 올려야 볼륨 컨트롤이 보였고, acid banger에서는 어디든 클릭하면 음소거가 풀린다는 걸 알아내기 전까지 댓글을 절반이나 쓰고 있었음
    • 정말 멋진 작은 장난감임. 덧붙여, 신시사이저 경험이 전혀 없어도 303을 익혀서 쓰기 어려운지 궁금함
    • 키 변경 버튼이 마음에 듦. 진짜 훌륭한 DJ 도구가 되려면 앞으로만 가는 게 아니라 임의의 이전 패턴으로 돌아갈 수 있어야 할 것 같은데, 내가 못 찾은 버튼이나 옵션이 있는 건가?
  • 생성 음악의 악보를 저런 명세 형태로 써놓은 걸 보는 게 흥미로움
    충분히 자세해서 그 지시를 바탕으로 자기 버전을 다시 구현하면 본질적으로 같은 “음악 작품”이 나오겠지만, 해석은 분명 달라질 것임. 악보가 어떤 부분은 정확히 정해두지만 다른 선택은 열어두기 때문임. 화음을 열거할 때 “모든 전위”가 정확히 뭘 뜻하는지, 개방형 보이싱까지 포함하는지, 임의 파형의 길이는 어떤 값들에서 고를지, 반복을 결정할 때 “짧다”는 어느 정도인지, 어떤 파형 신시사이저를 쓰고 어떻게 변조할지 같은 문제가 남음
    이런 결정은 전통 악기 연주자가 악보를 해석해 연주할 때 내리는 선택과 비슷함. 여기서는 생성 음악 코더가 이 “악보”를 따라가며 자기 해석을 담은 프로그램을 만들 수 있음
    Sonic Pi(https://sonic-pi.net/)로 구현해보는 건 재미있는 연습이었고, 작곡가가 의도한 방향에 가까운 것을 만들 수 있었다고 느낌. 영상의 녹음과 같은 분위기를 품고 있지만, 말이 된다면 그 작품에 대한 내 “연주”인 셈임. 실제 실행 시 연주하는 건 Sonic Pi이긴 하지만
    이 과정에서 명세와 구현의 관계도 다시 생각하게 됨. 알고리즘에 대한 서로 다른 프로그래머의 구현을 전체 설계라는 악보의 개별 “연주”로 볼 수 있고, 더 큰 시스템 아키텍처의 요소를 만드는 개발자는 밴드나 오케스트라 속에서 자기 파트를 맡는 연주자처럼 보이기도 함. 어떤 팀은 지휘자 겸 아키텍트가 이끌고, 어떤 팀은 서로 리프를 주고받으며 즉흥 연주하다가 가끔 솔로를 맡는 식일 수 있음. 또 어떤 팀은 프로듀서의 명세에 맞춰 화려하진 않지만 탄탄하게 연주하는 세션 연주자 같음
    일요일 오후에 하기에 좋은 명상적인 코딩 연습이었고, 관점을 바꿔줬음

    • 악보로 하려던 걸 정말 잘 짚은 것 같고, 의도가 전달돼서 기쁨
      예전 작업을 전시하려고 했을 때 한 아트 큐레이터에게 피드백을 받았는데, 그 작품이 바로 https://www.vitling.xyz/welcome-to-tech-talk/였음. 처음에는 무슨 일이 벌어지는지 잘 이해하지 못했지만, 작동 방식과 내부에서 일어나는 일을 설명하고 나니 “이제는 정말 좋다. 그런데 관객에게 흥미로운 부분을 전부 숨기고 있다”고 했음
      생성 예술에서 내가 하는 “작업”은 결과로 나오는 오디오나 시각물이 아니라 규칙 집합이나 알고리즘에 가까움. 그래서 “상자 안”에서 무슨 일이 벌어지는지 보여줄 방법을 늘 찾고 싶었음. 소스 코드는 좋을 수 있지만 읽을 수 있는 사람에게만 그렇고, 핵심 아이디어가 보일러플레이트와 기술적 기묘함 속에 묻히기 쉽다. 그래서 악보 형태로 쓰자는 생각에 이르렀고, 무슨 일이 벌어지는지의 기본 전제를 보여주되 세부에 빠져 길을 잃지 않을 정도로만 담으려 했음
    • 내가 좋아하는 절차적 시각 예술가 중 한 명도 명세에 비슷한 모호함을 두고, 작품을 다시 만들 때마다 좋은 변주가 생기게 함: https://www.sfmoma.org/artist/sol_lewitt/
      https://massmoca.org/event/walldrawing305/
    • “모든 전위”는 보통 화음을 근음 위치로 놓고, 옥타브를 제외한 순환 순열 같은 전위를 취한다는 뜻으로 이해함
      그래서 더 개방적이고 성긴 보이싱은 많이 빠질 것 같음
    • 기본 C 메이저 화음은 c4 f4 g4이고, 전위는 아래 음을 위로 올려 f4 g4 c5나 g4 c5 f5처럼 만드는 것임
      전위는 화음의 맛을 꽤 크게 바꿔줌
    • 들어보면 개방 화음은 없는 것 같고, 음들이 빈칸 없이 바로 이어지는 화음만 쓰인 듯함
  • 이 알고리즘이나 https://www.vitling.xyz/toys/acid-banger/를 이해하는 데 도움이 될 음악 이론 책이나 강좌를 추천받고 싶음
    뭔가 괜찮게 들리게 예측하는 꽤 단순한 규칙들도 있고, 더 복잡한 규칙들도 있으며, 바로크 음악이 알고리즘적이라는 건 유명하지만 아직 전혀 감이 안 잡힘
    예전에 이런 방향으로 찾아본 적이 있는데, 내가 본 책들이 정확히 뭐가 문제였는지는 잘 기억나지 않음. 아마 대부분 너무 기초적이라 도움이 안 됐던 것 같음. 오래전에 아주 기본적인 솔페주 훈련을 받긴 했고 악보는 읽을 수 있지만, 당시에는 지금 궁금한 질문을 던지거나 그 훈련의 목적을 이해하기엔 너무 어렸음

    • 제대로 이해하려면 여러 각도에서 공부해야 함. Hooktheory.com, 책, 많은 YouTube 영상으로 1~10년에 걸쳐 도달할 수 있음
      결국 직접 많은 음악을 써보지 않으면 음악 이론을 이해하기 어렵다. JavaScript 책을 읽는 것과 비슷해서, 소프트웨어를 한 번도 써본 적 없고 앞으로도 쓸 계획이 없다면 그 책을 실제로 이해할 방법이 없음
      이 애플리케이션이 어떻게 동작할지 설명해보면, 단조에서 음들의 부분집합, 즉 음계도를 아마 무작위로 고르는 식일 수 있음. 음계에서 5개 이하 음의 부분집합인 펜타토닉 음계는 가능한 멜로디 공간을 제한해서 대부분의 구성이 좋게 들리게 함. 더 적은 음을 쓰면 더 예측 가능하게 듣기 좋지만 덜 흥미로울 수 있음. 예를 들어 근음 화음을 이루는 음들은 어떤 순서로 연주해도 항상 좋게 들림. acid 라인은 보통 특정 화음의 음만으로 이뤄진 반복 멜로디인 아르페지오를 통해 어떤 단조 화음을 암시함
      또한 한 음계의 부분집합은 항상 다른 음계에도 들어갈 수 있음. 공유된 음의 부분집합을 쓰는 구간을 만든 뒤 새 음계로 바꾸면 한 음계에서 다른 음계로 전조할 수 있음. 이런 방식으로 한 곡이 가능한 모든 음계를 지나갈 수 있고, acid techno에서는 거의 전부 단조 음계임
    • Yale의 온라인 강좌 Listening to Music이 음악 이론을 꽤 다룸. 꽤 재미있게 들었음: https://online.yale.edu/courses/listening-music
    • 입문하기가 아주 어려움. 수학과 가장 비슷하다고 봄
      지금 자기 수준보다 높은 이해를 가진 사람을 위해 쓰인 것을 집어 들고 많은 걸 얻을 수는 없음. 페이지마다 천천히, 의도적으로, 겸손하게 읽으면서 마주치는 각 용어를 완전히 이해하는 데 시간을 들여야 함. 그 과정에서 몇 시간씩 우회하게 되고, 그 안에서 또 다른 용어들이 가지처럼 끝없이 뻗어나감. 음정, locrian/lydian 같은 말을 건너뛰고 삼투압처럼 이해되길 기대할 수는 없음
    • 전형적인 이론 입문서는 아니지만 Daniel J. Levitin의 대중 심리학 책 This Is Your Brain On Music에는 묻는 것과 비슷한 내용이 들어 있음
      음높이가 무엇인지, 왜 뇌가 특정 음높이 조합은 “좋아하고” 다른 조합은 싫어하는지 등을 다룸. 음악 신경학에 관한 여러 이론 자체로도 흥미로운 책이고, 앞부분에 아주 기본적인 이론 소개도 있음
    • 악기를 연주하지 않는다면, 시각장애인에게 Tetris를 설명하려는 것과 비슷할 듯함
  • 작성자에게 팁을 주자면, Arduino를 빼고 Raspberry Pi에서 WS281x 스트립을 직접 제어할 수 있는 이 라이브러리를 쓰면 하드웨어와 소프트웨어 복잡도를 크게 줄일 수 있음: https://github.com/jgarff/rpi_ws281x
    나는 Pi 4에서 이걸 써서 집 처마 장식에 붙인 466픽셀짜리 WS2815 스트립을 명절 장식용으로 제어하고 있음

  • 이 프로젝트 안에는 재미있는 음악 이론이 숨어 있음. 설명된 알고리즘으로 한 화음에서 다른 화음으로 넘어가는 모든 전이는 같은 화음으로의 전이, 예를 들어 C 메이저에서 그 전위로 가거나 7음을 추가·제거하는 경우이거나, Neo-Riemannian 이론의 세 가지 기본 변환인 P, L, R 중 하나임
    자세한 내용은 Neo-Riemannian theory 위키백과 페이지를 보면 되고, P, L, R에 대한 핵심은 이렇다. 임의의 화음 x가 메이저이면 P(x), L(x), R(x)는 모두 마이너가 됨. x가 마이너이면 P(x), L(x), R(x)는 모두 메이저가 됨. P, L, R은 모두 자기 자신의 역변환이라 P(P(x)) = x이고 L과 R도 마찬가지임. P, L, R 변환의 어떤 순서를 통해 임의의 메이저나 마이너 화음에서 다른 임의의 메이저나 마이너 화음으로 갈 수 있음. 예를 들어 C 메이저에서 L 다음 R을 적용하면 G 메이저가 되고, R 다음 P를 적용하면 A 메이저가 되며, L 다음 P를 적용하면 E 메이저가 됨
    Neo-Riemannian 변환으로 이동하는 것은 부드러운 성부 진행을 통해 “먼” 조성 중심, 즉 시작 조성과 공통 음계음이 많지 않은 곳으로 빠르게 가는 방법임. 그런데 이 곡을 들을 때 화성이 상대적으로 안정적으로 느껴져서 놀랐음. 흥미로운 점은 알고리즘 구성상 P 변환이 L이나 R 변환, 또는 같은 화음에 머무는 경우보다 훨씬 덜 나온다는 것임. P 변환은 먼 조성으로 빠르게 이동하는 데 핵심 재료인데, 내 대략적인 계산으로는 Markov 과정이 정상 상태에 도달했다고 가정하고 최저·최고 음높이 제한을 무시하면 모든 화음 변화의 1/27만 P 변환임. 정상 상태에서는 7화음이 단순 3화음보다 16:11 비율로 더 흔하다는 점도 나옴

  • Raspberry Pi의 한계를 더 알고 싶어서 기술 세부사항이 궁금함
    이 모든 걸 Raspberry Pi 하나와 거기에 달린 많은 GPIO 핀만으로 처리할 수는 없었을까? 지금은 Raspberry Pi가 덜 활용되는 느낌이고, 단일 보드로 단순화하는 편이 나아 보임. 전원 연결도 하나만 필요해지는 좋은 결과가 생김

    • 나도 같은 생각을 했지만, Raspberry Pi 대신 Arduino 쪽을 떠올렸음
      Pi가 하는 일은 “음 선택과 오디오 버퍼 자체의 합성”뿐이라면 Arduino Uno도 분명 할 수 있지 않을까?
    • 가능할 것 같지만, LED 코드가 Arduino용으로 설계되어 있으니 코드 재사용이나 프로토타이핑 관점에서는 처음 만들 때 두 장치를 쓰는 편이 더 단순했을 듯함
  • 모두가 이해할 수 있게 의사코드로 써놓은 점이 좋음
    나도 이런 프로젝트, 특히 음악 생성 부분을 해본 적이 있어서 이런 제시 방식이 정말 마음에 듦. 영상 데모까지 있으면 더 좋고, 많은 코드 프로젝트는 작성자가 긴 텍스트 벽으로만 설명해서 시작도 하기 전에 죽어버림

  • 정말 멋짐. 이런 걸 만드는 자세한 제작 지침이 있으면 좋겠음

    • 이제 온라인 버전을 만들어야 할 것 같음. Web Audio와 CSS transform이면 충분히 해낼 수 있을 듯함
  • Four Tet 세트의 인트로로 써도 될 것 같음 :)

  • 아름다움. 식물이 이런 식인 외계 행성을 상상하게 됨
    이런 것들이 숲을 이루고, 메트로놈이나 반딧불이가 동기화되는 것처럼 서로 맞춰질 수도 있을 듯함

    • 만들고 체험해볼 수 있다면 재미있는 예술 설치물이 되겠음 :)