Guitar amp and effects pedal built on the Waveshare ESP32-S3-Touch-AMOLED-2.06
Waveshare ESP32-S3 터치 AMOLED 보드로 만든 기타 앰프·이펙트 페달
ESP32-S3에서 Neural Amp Modeler의 A2 풀사이즈 모델을 48kHz로 실시간 처리하는 기타 페달 프로젝트입니다. 화면이 있는 보드뿐 아니라 헤드리스 보드와 브라우저에서도 같은 DSP와 UI를 구동하며, 오디오 인터페이스는 USB 호스트로 연결합니다.
- 주제
AI 요약
CoyoPedal은 Waveshare ESP32-S3-Touch-AMOLED-2.06 보드에서 동작하는 독립형 기타 앰프·이펙트 페달입니다. ESP32-S3에서 Neural Amp Modeler(NAM)의 A2 풀사이즈 캡처를 실시간 처리하고, USB Audio Class 오디오 인터페이스를 USB 호스트로 구동합니다. 화면용 UI는 TSX로 작성하지만 기기에서는 C++로 미리 컴파일합니다. JavaScript 런타임은 넣지 않습니다.
ESP32-S3에서 NAM A2 처리
오디오 처리는 48kHz로 실행하며, 23개 레이어와 8개 채널로 구성된 WaveNet 모델을 블록 부동소수점(block floating point)으로 계산합니다. 개발자가 직접 작성한 Xtensa 어셈블리 커널을 사용하고, 두 코어에 작업을 나눠 64프레임 블록 단위로 처리합니다. ESP32-S3의 부동소수점 처리 성능이 부족한 문제를 이 방식으로 다룹니다. 제작자는 193개 NAM 프로필을 시험했으며, 최악의 경우에도 null test 피크가 -60dB였다고 설명합니다.
개인 캡처 파일도 불러옵니다. 원본 .nam 파일을 microSD 카드의 nam 폴더에 복사하면 기기에서 파일을 검사하고 모델을 준비합니다. 별도 데스크톱 변환기는 필요하지 않습니다. 처음 선택할 때는 준비 과정에서 오디오가 멈추며 수십 초가 걸릴 수 있습니다. 쓰기 가능한 카드에는 검증된 .s3cache 파일을 원본 옆에 저장해 다음 로딩을 빠르게 합니다. 원본 파일은 수정하지 않습니다.
이펙트, 조작과 보드 구성
앰프 앞단에는 노이즈 게이트, 컴프레서, 코러스, 드라이브를 배치하고, 뒷단에는 디지털 딜레이와 스프링 리버브를 둡니다. 화면에서 각 블록을 눌러 켜고 끄며, 길게 눌러 값을 조절합니다. 프리셋에는 앰프 캡처와 조절값, 이펙트 설정을 저장합니다. 튜너를 열면 출력이 음소거됩니다.
기준 보드는 8MB PSRAM과 AMOLED 터치 화면, microSD 슬롯을 갖춘 Waveshare 보드입니다. 화면이 없는 ESP32-S3 DevKitC-1 N16R8이나 S3R8 모듈에서도 같은 앰프와 DSP를 실행합니다. 화면 없는 빌드에서는 BOOT 버튼으로 페달을 켜거나 우회하며, 설정은 유지보수 API와 원격 도구로 조작합니다. 제작자는 DevKit에서 오디오 처리에 코어별 블록 예산의 91%, 94%를 사용했고, 마감 시간을 놓치지 않았다고 기록했습니다. 기기에는 8MB PSRAM과 USB 호스트 포트가 필요합니다. 헤드리스 보드는 USB 인터페이스에 전원을 공급하지 않으므로 별도 전원이 필요합니다.
브라우저 빌드와 개발 방식
프로젝트 웹페이지에서는 같은 펌웨어를 WebAssembly(WASM)로 컴파일해 실행합니다. 같은 UI와 DSP, NAM 모델을 사용하며, 오디오 인터페이스를 연결해 기타 입력을 처리합니다. 웹 버전은 microSD 대신 폴더를 선택하고 파일을 읽습니다. Chrome과 Edge에서는 변경 내용을 폴더에 쓸 수 있고, Safari와 Firefox에서는 브라우저 저장소에 보관합니다. 웹 오디오 그래프는 AudioWorklet과 공유 메모리를 사용하므로 페이지에 cross-origin isolation 헤더가 필요합니다.
UI는 TSX에서 C++로 컴파일하며, 기기와 브라우저가 같은 레이아웃·렌더링 코드를 사용합니다. 빌드와 펌웨어 관리는 ESP-IDF 6.0.2 및 Gea CLI를 이용합니다. Wi-Fi, BLE, OTA 업데이트와 원격 진단 기능은 설정 파일이 있을 때만 펌웨어에 포함됩니다. 설정 파일이 없으면 무선 기능을 빼고 빌드하며, 플래시 사용량도 약 400KB 줄어듭니다. 프로젝트는 GPLv3 라이선스를 적용합니다.
Hacker News 반응
- @sublinear — GitHub에 비슷한 프로젝트가 이미 있나요? 이런 페달은 온라인에서 아주 싸게 살 수 있게 됐습니다. 브라우저의 WASM 빌드가 훨씬 흥미로울 것 같습니다.
- @lathiat — 제가 아는 다른 프로젝트는 GuitarML입니다.
- @Blackthorn — CoyoPedal은 한 달 전에 오픈소스로 공개된 프로젝트입니다. 이 하드웨어에서 NAM A2 풀사이즈를 구동한 건 상당히 인상적인 기술 성과였습니다.
- @crtified — 온라인에서 파는 아주 저렴한 페달 중 NAM A2 풀사이즈를 처리하는 제품은 제가 아는 한 없습니다. 제가 본 제품은 1달러 미만급 칩에서 돌아가며, 기껏해야 NAM A2 Lite만 처리합니다. 보통 NAM 프로필을 자체 형식으로 변환합니다. 물론 그 제품도 대단하지만, 이 프로젝트가 내세운 것과 같은 처리는 아닙니다.
- @r2ob — 드라이브 매개변수를 바꿀 수 없는 앰프 에뮬레이터는 무슨 의미인가요? NAM 열풍을 이해하지 못하겠습니다.
- @Blackthorn — 곡을 연주하는 도중 드라이브 매개변수를 얼마나 자주 조절하나요? 입력을 부스트하는 용도라면 NAM에서도 잘 됩니다. 대부분은 그런 조절이 필요하지 않습니다. 드라이브가 마음에 들지 않고 그 매개변수가 입력 부스트가 아니라면 다른 캡처를 쓰면 됩니다.
- @shermantanktop — 프로파일링 전반도 비슷합니다. 프리게인, 후단 EQ, 앰프 안쪽의 시뮬레이션 몇 가지를 조절합니다. Kemper를 써본 적은 없지만 기본 톤은 정해져 있고, 제 생각에는 나쁘지 않습니다. 끝없이 노브를 만지는 대신 프로필 라이브러리를 계속 골라야 할 것 같기는 합니다.
- @manmal — Kemper를 씁니다. 네, 기본 톤은 정해져 있습니다. “Basket case” 같은 프로필을 내려받으면 기타가 맞을 경우 그 곡과 대략 비슷하게 들립니다. 이미 톤을 많이 입힌 상태라 크게 다른 소리로 바꾸기는 어렵습니다. 굳이 그래야 할 이유도 없고요.
- @ornateelephant — 제가 잘못 이해했을 수도 있지만, 드라이브 블록을 길게 누르거나 클릭하면 드라이브, 톤, 레벨 값을 조절할 수 있습니다.
- @boguscoder — 흥미로운 작은 프로젝트지만 설명이 아주 긴데도, 실제 하드웨어에서 실행할 때 어떻게 조작하는지 여전히 파악하지 못했습니다.
- @ornateelephant — USB 오디오 인터페이스가 필요합니다. USB Audio Class 2 인터페이스가 맞는 것 같습니다. 문서에는 몇 가지 모델이 적혀 있습니다.
- @quinnjh — ESP32에서 지연 시간을 어떻게 쓸 만한 수준으로 만들었는지 궁금했습니다. 외부 ADC/DAC 카드가 필요하군요. 실제로 제작된 게 있나요? 문서만 봐서는 분명하지 않습니다.
- @dashersw — ESP32-S3는 USB 호스트로 쓰기 좋습니다. USB 대신 I2S 오디오를 쓰는 Daisy Seed 3를 ADC/DAC로 사용하는 맞춤형 버전도 만들었고, 전체 지연 시간은 약 4ms입니다. 앰프 모델을 끄면 2.6ms 정도입니다. iRig HD X 펌웨어의 아날로그 지연도 패치해 약 1.2ms로 낮췄습니다.
- @weberer — FPGA 기반 페달에서는 지연이 생긴다고 불평하는 사람이 많은데, 이 제품은 지연 시간이 어떤가요?
- @atoav — 제 생각에는 전혀 문제가 아닙니다. 디지털 페달에서 지연 문제를 겪은 적이 없습니다. 제대로 쓰면 최신 DSP에는 지연 문제가 거의 없습니다. 소리도 33cm 이동할 때마다 1ms가 걸립니다. 어쿠스틱 기타도 줄을 튕긴 뒤 귀에 소리가 닿을 때까지 시간이 걸립니다. 악기 신호가 전기 체인으로만 들리는 경우에는 정말 쓰기 어려워질 때까지 상당한 지연을 허용할 수 있습니다.
- @dashersw — 기타 인터페이스에 따라 약 4~10ms입니다. 일부 인터페이스는 오래되고 성능이 낮은 기기를 고려해 필요 이상으로 큰 버퍼를 씁니다. iRig HD X 펌웨어에 쓰이지 않는 4ms 버퍼가 있어 패치했습니다. 말한 것처럼 체감하기 어렵습니다. 특히 헤드폰으로 연주하면 스피커에서 1m 떨어져 앉은 것과 비슷합니다.
- @alkonaut — 페달을 만들면서 왜 시계 크기의 작은 AMOLED 보드를 골랐나요? 멀티 이펙터 UI라면 4~7인치 터치 화면이 더 낫지 않을까요? 7인치 터치 화면을 단 ESP32가 30달러 정도라는 뜻인가요?
- @ricardobeat — CYD 같은 큰 화면은 푸른빛이 돌고 시야각과 밝기가 나쁘며 터치 반응도 느립니다.
- @dashersw — 저는 제작자입니다. AMOLED 화면은 보기 좋고 기타에 기기를 붙일 수도 있습니다. 같은 코드를 화면 없는 보드를 포함해 어떤 ESP32-S3에도 컴파일할 수 있습니다. CoyoPedal은 Gea Stack으로 macOS와 웹을 포함한 여러 기기를 대상으로 빌드합니다. 웹 버전은 같은 DSP와 UI 코드를 WASM으로 컴파일합니다.
- @nikanj — ESP32는 A2 풀사이즈를 실행하기에 연산 성능이 부족해 보입니다. 실제로는 A2 Lite를 실행하나요? GitHub 설명에는 SlimmableContainer도 언급됩니다.
- @dashersw — 제 블로그 글 제목 그대로 A2 풀사이즈를 실행합니다. 제가 어셈블리 커널을 직접 작성했습니다. S3의 부동소수점 처리 성능이 부족해 모델을 나누고, 블록 부동소수점으로 값을 표현합니다. 시험한 193개 NAM 프로필에서 최악의 null test 피크는 -60dB였습니다. 사실상 들리지 않는 수준입니다.
- @dncornholio — AI를 쓴다면 왜 네이티브로 코딩하지 않고 TypeScript를 변환하는 GeaStack을 쓰나요?
- @dashersw — Gea Stack은 제가 작성했습니다. CoyoPedal은 Gea의 데모 앱 역할도 합니다. DSP는 대부분 어셈블리로 작성한 네이티브 코드이고, UI는 여러 기기에서 쓸 수 있습니다. 한 가지 정정하자면 Gea에는 TypeScript 런타임이 없습니다. 전부 C++로 미리 컴파일하므로 기기에서는 네이티브 코드가 실행됩니다.
원문: Hacker News / 번역·요약: Trawling