· 16 min read
Solo Band Studio — VR에서 혼자 밴드를 하다
Meta Quest에서 피아노, 드럼, 베이스를 연주하고 루프 스테이션으로 혼자 합주를 완성하는 VR 음악 창작 도구. 대학 수업 프로젝트로 AI와 함께 한 달 만에 만들었다.

혼자지만, 밴드입니다
피아노를 치고 녹음 버튼을 누른다. 드럼 스틱을 잡고 위에 비트를 얹는다. 베이스 라인을 추가한다. 재생하면 셋이 함께 연주하는 것처럼 들린다. 물론 세 명 다 나다.
Solo Band Studio는 VR에서 혼자서 밴드 합주를 만드는 음악 창작 도구다.
왜 만들게 되었나
숭실대학교 확장현실디자인 수업의 기말 프로젝트였다. 조건은 하나 — Meta Quest + Unity로 만들 것. 주제는 자유.
평소 음악과 화성학, 악기 연주에 관심이 많았다. 피아노를 치다가 “드럼도 같이 치면 좋겠는데”라고 생각한 적이 한두 번이 아니다. 혼자서 합주를 해보고 싶다는 생각. 루프 스테이션이라는 장비가 바로 그걸 가능하게 하는 도구인데, VR이라면 악기까지 가상으로 들고 올 수 있지 않을까?
그래서 만들었다.
무엇을 만들었나
악기 3종
88건 피아노. 실제 피아노 건반 배열을 VR 공간에 재현했다. 손가락으로 건반을 누르면 소리가 난다. 옥타브별로 녹음된 멀티샘플을 사용해서, 피치 시프팅만으로는 얻기 어려운 자연스러운 음색을 낸다.
드럼킷. 킥, 스네어, 하이햇, 탐탐, 크래시, 라이드 — 9종 패드. VR 컨트롤러를 드럼스틱처럼 휘두르면 물리 충돌로 소리가 난다. 세게 치면 크게, 살짝 치면 작게.
베이스. 피아노와 같은 키보드 인터페이스지만 베이스 음역의 샘플을 사용한다.
루프 스테이션
이 프로젝트의 핵심. 8트랙 루프 녹음/재생 시스템이다.
- BPM과 박자를 설정한다
- 트랙 하나를 선택하고 녹음을 시작한다
- 피아노로 멜로디를 연주한다 — 한 루프가 끝나면 자동으로 반복
- 다음 트랙에서 드럼을 녹음한다
- 또 다음 트랙에 베이스를 넣는다
- 재생하면 세 트랙이 동시에 울린다
퀀타이즈 기능이 있어서, 타이밍이 살짝 어긋나도 가장 가까운 박자에 자동으로 맞춰준다. 메트로놈도 지원한다.
피아노 롤 에디터
DAW(디지털 오디오 워크스테이션)에서 볼 수 있는 비주얼 노트 에디터를 VR 안에 구현했다. 녹음한 노트를 시각적으로 확인하고, 드래그앤드롭으로 수정할 수 있다. 타임라인에서 재생 위치를 직접 조작하는 것도 가능하다.
MIDI 지원
표준 MIDI 파일(.mid) 파서와 라이터를 직접 구현했다. 바흐, 베토벤, 쇼팽, 드뷔시 등 클래식 10곡이 내장되어 있어서 로드해서 들어볼 수 있고, 자기가 연주한 것을 MIDI로 내보내는 것도 된다.
코드 퀴즈
화성 진행(I-IV-V-I 같은)을 제시하고, 사용자가 피아노로 직접 연주하면 정답을 판정하는 학습 도구도 넣었다.
AI와 함께 개발한 프로젝트
이 프로젝트는 처음부터 AI(Claude Code)로 전면 개발할 계획이었다. 내가 한 건 설계와 의사결정이고, 로직 작성은 대부분 AI가 했다. 코드를 직접 손으로 작성한 적이 거의 없다.
이 전략이 먹힌 이유 중 하나는 UI Toolkit 선택에 있다. 수업에서는 Unity 2022를 사용했지만, 나는 Unity 6.2로 버전을 올렸다. UI Toolkit의 World Space 렌더링이 6.2부터 지원되기 때문이다. 그 전 버전에서는 UI Toolkit을 VR 3D 공간에 배치할 수 없었다.
UI Toolkit은 웹의 HTML/CSS와 비슷한 구조(UXML/USS)로 UI를 정의한다. AI 입장에서 이건 아주 친숙한 영역이다. 루프 스테이션 패널, 피아노 롤 에디터, 퀵 메뉴, 코드 퀴즈 — 꽤 복잡한 UI들이 많은 프로젝트였는데, AI가 UXML 레이아웃과 USS 스타일링, 그리고 C# 컨트롤러 코드를 놀라울 정도로 잘 작성해줬다.
MIDI 파서, 오디오 시스템, VR 인터랙션 같은 것들도 마찬가지다. 내가 “MIDI 표준 파일을 파싱해서 NoteEvent 리스트로 변환해줘”라고 설계를 잡아주면, 구현은 AI가 해냈다. 물론 오디오 쪽은 여러 번 방향을 틀어야 했지만, 그것도 “이 방식은 안 되니까 OnAudioFilterRead로 가자”라는 판단만 내가 하면 됐다.
결과적으로 한 달 만에 80개 파일, 19,000줄의 프로젝트를 완성할 수 있었다.
기술적으로 재미있었던 것들
전체 오디오 파이프라인은 이렇게 생겼다.
오디오 시스템을 두 번 갈아엎다
음악 앱에서 가장 중요한 건 타이밍이다. 유저가 건반을 누른 순간과 소리가 나는 순간 사이에 지연이 있으면 연주가 불가능하다. 루프 재생 시 트랙 간 타이밍이 어긋나면 합주가 아니라 소음이 된다.
처음에는 Unity의 AudioSource 기반으로 시작했다. 그런데 두 가지 문제가 있었다. 먼저 타이밍 — AudioSource.Play()는 프레임 단위로 동작하기 때문에 프레임레이트에 따라 재생 시점이 흔들린다. 게임 사운드 이펙트에는 충분하지만 음악에는 부족했다. 그리고 DSP 제어 — sustain(음 유지), 피치 조정 같은 소리 변형이 원하는 대로 되지 않았다. AudioSource의 추상화 레벨이 너무 높았다.
이것저것 알아보다가 결국 가장 low-level 방식으로 선회했다. OnAudioFilterRead() — Unity의 오디오 콜백에서 직접 샘플 데이터를 조작하는 방식이다. 하드웨어 오디오 클럭(AudioSettings.dspTime)을 기준으로 모든 스케줄링을 처리하고, 각 보이스의 피치 시프팅, 페이드아웃 엔벨로프까지 퍼-샘플 단위로 직접 계산한다.
커밋 히스토리를 보면 12/8에 “Refactor Whole audio system”이 있고, 12/12에 “New audio mixing system(OnAudioFilterRead based)“가 있다. 한 달 프로젝트에서 핵심 시스템을 두 번 갈아엎은 셈이다. 결과적으로 sample-accurate 타이밍을 달성했고, 프레임이 떨어져도 오디오는 정확하게 재생된다.
64성 폴리포니와 보이스 풀
피아노 양손으로 코드를 누르고 서스테인을 걸면 동시에 울리는 음이 수십 개가 된다. 각 음마다 새 오디오 소스를 만들면 GC 압력이 생기고, VR에서 GC는 프레임 드롭 — 멀미로 이어진다.
64개의 Voice 객체를 게임 시작 시 미리 할당해두고 풀로 관리했다. 새 음이 필요하면 풀에서 꺼내고, 끝나면 반환한다. 오디오 스레드에서 메모리 할당이 발생하지 않는다.
메인 스레드와 오디오 스레드
VR 입력과 UI는 메인 스레드에서 처리되고, 실제 오디오 믹싱은 오디오 스레드에서 일어난다. 두 스레드 사이의 통신에 lock을 걸면 오디오가 끊길 수 있다.
ConcurrentQueue로 해결했다. 메인 스레드에서 “이 시각에 이 음을 재생해줘”라는 요청을 큐에 넣으면, 오디오 스레드가 다음 콜백에서 꺼내서 처리한다. lock 없이 스레드 안전.
UI Toolkit의 World Space — 가능성과 한계
Unity 6.2에서 처음 지원된 UI Toolkit World Space는 VR UI 개발에 큰 가능성을 보여줬다. HTML/CSS 같은 선언적 구조로 복잡한 UI를 만들 수 있고, AI 코딩과의 궁합도 좋다.
다만 아직 초기 기능이라 문제도 있었다. 중첩 패널의 스크롤링이라든가, 패널 크기가 클 때 발생하는 이슈들. 생각보다 시간을 잡아먹은 부분이다. 그래도 기존의 Unity UI(uGUI)로 피아노 롤 에디터 수준의 UI를 만들었다면 훨씬 더 고생했을 것 같다.
멀티샘플링
피아노의 C1 샘플 하나를 피치 시프팅해서 C5를 재생하면 부자연스럽다. 실제 피아노는 음역대마다 음색이 다르기 때문이다. 옥타브별로 녹음된 샘플을 사용하고, 요청된 음에 가장 가까운 샘플을 찾아 6반음 이내에서만 피치를 보정한다. pitch = 2^(반음차/12).
개발 타임라인
138커밋, 약 1개월. git 히스토리를 따라가면 프로젝트가 어떻게 자라났는지 보인다.
Week 1 (11/17~11/24) — 기초 세팅. 메트로놈 시스템부터 만들었다. 음악 앱에서 타이밍이 핵심이라는 걸 알았기 때문에 가장 먼저.
Week 2 (11/25~12/01) — 루프 스테이션의 핵심 구현. 모델을 임포트하고, 루프 녹음/재생 시스템을 만들고, UI를 붙였다. 이 주가 프로젝트의 뼈대를 잡은 시기.
Week 3 (12/03~12/08) — 폭풍 개발. 피아노를 VirtualPianoEngine 아키텍처로 리팩터링하고, 드럼과 베이스를 추가했다. Unity 6.2로 업그레이드. UI Toolkit으로 루프 스테이션 UI를 다시 만들고, 피아노 롤 에디터를 구현. MIDI 파서를 작성하고 클래식 곡들을 임포트했다. 이 주에만 60개 이상 커밋.
특히 12/7~8 이틀이 가장 밀도 높았다 — 멀티샘플 피아노 사운드 시스템 교체, MIDI 마이그레이션, 검은건반 인터랙션 수정, 메트로놈 타이밍 문제 해결, 오디오 시스템 전면 리팩터링까지 몰아쳤다.
Week 4 (12/09~12/12) — 마무리와 품질. QuickMenu 시스템, 텔레포트, 낮/밤 사이클, 코드 퀴즈 통합. 그리고 가장 중요한 전환점 — OnAudioFilterRead 기반 새 오디오 믹싱 시스템을 구현하고 레거시 GlobalAudioSystem을 제거했다. 카운트인, 퀀타이즈, 피아노 롤 개선.
12/14~16 — 정리와 공개. 데드 코드 제거, 에셋 정리, 라이선스/크레딧 작성, 폴더 구조 재정리, 문서화. GitHub에 오픈소스로 공개.
프로젝트 규모
| 지표 | 수치 |
|---|---|
| 개발 기간 | 2025-11-17 ~ 12-16 (약 1개월) |
| 커밋 | 138개 |
| C# 코드 | 80파일, ~19,100줄 |
| 동시 발음 | 64성 |
| 루프 트랙 | 8트랙 |
| 피아노 건반 | 88건 (A0~C8) |
| 드럼 패드 | 9종 |
| 내장 곡 | 10곡 (퍼블릭 도메인 클래식) |
| 오디오 샘플 | ~69MB |
VR 악기 연주에 대한 생각
VR에서 악기를 “연주”하는 건 솔직히 한계가 있다. 물리적 건반의 촉감이 없기 때문에 실제 연주 감각과는 거리가 있고, 최소한 미디 컨트롤러 정도는 있어야 제대로 된 연주가 가능하겠다 싶었다.
하지만 음악적 아이디어를 위한 환경으로서는 가능성이 크다. 가상 공간에서 작곡하고, 편곡하고, 합주를 미리 들어보는 용도. 그리고 교육용으로는 확실히 좋았다. 피아노나 드럼 같은 장비가 없는 사람도 VR에서 직접 건반을 보고 눌러볼 수 있다. 영상으로만 레슨을 보는 것과 가상이라도 직접 피아노 앞에 앉아서 눌러보는 것은 확연히 다르다.
나중에 발전시킨다면 이런 방향이 재밌겠다고 생각했다:
- 미디 컨트롤러 연동 — 실제 미디 키보드를 VR에서 인식해서, 가상 세계에 키보드를 실제 위치에 맞춰 렌더링하거나 AR로 현실에 오버레이
- 멀티플레이어 — 여러 사람이 온라인으로 접속해서 아바타로 합주. 밴드 연습실을 가상으로
수업 발표에서는 완성도와 확장 가능성 측면에서 많은 칭찬을 받았다. 성적은 A+.
소스 코드
GitHub에 오픈소스로 공개했다.

