오디오 반응형 LED 스트립은 악마적으로 어렵다

Audio Reactive LED Strips Are Diabolically Hard

요약

2016년부터 시작한 음악에 반응하는 LED 스트립 프로젝트가 10년간 진화해온 과정을 기술한 글이다. 단순한 볼륨 감지에서 시작하여 FFT와 멜 스케일 기반의 고급 신호 처리로 발전했으며, 제한된 LED 픽셀로 인한 '픽셀 빈곤'이 핵심 도전 과제임을 강조한다.

핵심 포인트

  • 볼륨 기반 반응은 구현이 간단하지만 빠르게 지루해지며, 음악의 풍부한 주파수 정보를 활용하지 못한다.
  • LED 스트립은 화면 기반 시각화기와 달리 픽셀이 극도로 제한되어 있어, 표시되는 모든 기능이 인지적으로 의미 있어야 한다는 '픽셀 빈곤' 문제가 핵심이다.
  • 인간의 음악 인식 방식을 이해하고 지각 모델을 구축해야만 만족스러운 시각화가 가능하다.

왜 중요한가

신호 처리와 하드웨어 제약 조건 사이의 균형을 이루는 방법을 배울 수 있으며, 제한된 리소스 환경에서 사용자 경험을 최적화하는 설계 철학을 제시한다.

📄 전문 번역

LED 스트립을 음악에 반응하게 만들기 - 10년 간의 여정

2016년, 나는 LED 스트립 하나를 구매했다. 음악에 실시간으로 반응하는 시각화를 만들어보겠다는 생각이었다. 몇 주면 충분할 거라고 생각했는데, 결국 깊은 토끼굴에 빠져버렸다. 10년이 지난 지금, 이 프로젝트는 GitHub에서 2.8k개의 스타를 받았고, Hackaday에 소개되었으며, 가장 인기 있는 LED 스트립 비주얼라이저 중 하나가 되었다. 누군가는 클럽에 설치했고, Amazon Alexa와 연동했으며, 처음 접하는 전자공학 프로젝트로 사용하기도 했다.

그런데도 나는 여전히 만족하지 못하고 있다.

처음엔 간단했다 - 음량 감지

처음에는 개별 LED를 제어할 수 없는 일반 LED 스트립으로 시작했다. 대신 빨강, 초록, 파랑 채널의 밝기만 독립적으로 조절할 수 있었다. 가장 직관적인 방법을 시도해봤다. 오디오 신호를 읽고 음량을 측정한 뒤, 크면 클수록 LED를 더 밝게 만드는 것이다. 모두 시간 영역의 간단한 신호 처리였다.

10~50ms 정도의 짧은 오디오 청크를 읽고, 저주파 필터를 적용한 뒤, 강도를 밝기로 변환하면 된다. 각 색상 채널에 다른 응답 속도를 할당했다. 어떤 색은 빠르게, 어떤 색은 느리게, 또 다른 색은 중간 정도로 반응하도록 말이다. 오후 정도면 이 정도는 만들 수 있고, RGB LED가 있는 스트립이나 램프에서는 꽤 그럴듯해 보인다.

하지만 금방 지루해진다. 주파수 정보가 모두 사라져서, 결국 음악의 종류를 이해하지 못하고 얼마나 큰지만 감지할 뿐이다. 게다가 비트가 명확한 전자음악에서는 잘 작동하지만, 음량이 가장 흥미로운 특징이 아닌 다른 장르의 음악에서는 형편없다.

거의 바로 적응형 게인 컨트롤을 구현해야 했다. 고정된 음량 임계값을 설정하면 시끄러운 방에서는 LED가 계속 켜져 있고, 조용한 공간에서는 거의 깜빡일 뿐이기 때문이다. 나는 지수 평활이라는 간단하면서도 효과적인 필터를 사용했는데, 이 방식을 코드 전반에서 계속 활용했다.

해상도의 한계

아무튼 시간 영역 시각화는 문제가 있었다. 3개 색상 채널로 표현할 수 있는 정보가 너무 적었다. 결국 각각의 LED를 개별 제어할 수 있는 WS2812 주소 지정 가능 LED로 전환했다. 훨씬 많은 표현 방식을 사용할 수 있게 된 것이다.

순진한 FFT 접근법

다음 단계는 당연히 주파수 영역 분석이었다. 오디오를 청크 단위로 수집하고, 푸리에 변환(오디오를 개별 주파수로 분해하는 수학 도구)을 계산해서 주파수 빈(bin)을 얻은 뒤, 각각을 LED로 매핑하는 것이다. 1미터 스트립에 144개의 픽셀이 있으니까, 144개의 빈, 하나의 LED당 하나의 빈이라고 생각했다. 그리고 스펙트럼을 렌더링했다.

어느 정도는 작동했다. 음량 방식보다 훨씬 더 많은 오디오 정보가 캡처되는 것을 즉시 감지할 수 있었다. 그런데 결과는 정말 실망스러웠다. 거의 모든 에너지가 소수의 LED에 집중되어 있고, 스트립의 대부분은 어두웠다.

주파수 범위를 자르면서 더 많은 스트립을 사용하려고 시도했다. 조금은 나아졌지만, 여전히 많은 LED가 제대로 활용되지 않는 느낌이 들었다. 나는 오랫동안 이 문제로 고민했다.

대부분의 사람들이 음악 반응형 LED 스트립을 만들 때 이 정도 수준에서 멈춘다. 수백만 개의 픽셀이 있는 화면에서는 충분히 작동하고, 충분한 여유 공간으로 전체 스펙트로그램을 상세하게 표시할 수 있다. 그런데 144개의 LED에서는 한계가 극심하다.

픽셀 빈곤의 문제

이것이 내가 배운 가장 중요한 교훈이자, LED 스트립 시각화가 어려운 이유다. '픽셀 빈곤'이라고 부르든, '기능 부족'이라고 부르든, 결국 같은 문제다.

LED 스트립이 화면 기반 시각화보다 단순하다고 생각할 수도 있지만, 실제로는 정반대다. 화면 기반 시각화는 수백만 개의 픽셀로 작업할 수 있지만, LED 스트립은 많아야 수백 개다. 오디오 기능을 엄청 많이 계산해서 화면에 모두 표시할 수 있고, 대부분이 흥미롭지 않더라도 상관없다. 일부 기능이 인간이 흥미롭다고 인식하는 것과 맞아떨어지면 시각화는 작동한다.

그런데 LED 스트립은 그렇지 않다. 1미터 스트립은 144개의 LED를 가지고 있다. 그게 전부다. 숨을 곳이 없다. 거의 모든 픽셀이 인간이 음악적으로 의미 있다고 인식하는 무언가를 해야 한다. 오류의 여지가 거의 없다는 뜻이다.

이것이 LED 스트립 시각화를 화면 기반보다 훨씬 어렵게 만드는 이유다. 단순히 신호 처리 데이터를 표시할 수는 없었다. 인간이 실제로 음악을 어떻게 인식하는지 이해하고, 그것을 시각화 파이프라인에 녹여내야 했다.

멜 스케일의 발견

나는 음성 인식 논문을 읽기 시작했다...