# Design Note: Beat-Level Deactivation for Waltz-Style Playback (ADS Target) 작성일: 2026-01-06 범위: APS → ADS 컴파일 → Nano Ardule 재생 엔진 목표: **bar 일부 비활성(beat/step 단위 무시)** 기법을 이용해 **4/4 기반 패턴에서 최소한의 변경으로 3박(왈츠) 느낌을 구현** --- ## 1. 배경과 문제의식 Nano Ardule / APS 시스템은 현재 다음을 전제로 설계되어 있다. - 기본 박자: **4/4** - 기본 패턴 단위: **2 bar** - StepSeq 및 ADS 재생 엔진은 - bar 전체를 재생하거나 - bar 전체를 무시하는(_H: half pattern) 방식은 이미 지원 이번에 새롭게 확인한 사실은 다음과 같다. > **“bar 전체”가 아니라 “bar 내부 일부(step/beat)”를 비활성 처리해도 > 음악적으로 의미 있는 결과를 얻을 수 있다.** 이를 이용하면, - 루프 길이와 BPM은 그대로 유지하면서 - **3박(왈츠) 느낌의 드럼 패턴을 최소 구현**할 수 있다. --- ## 2. 핵심 아이디어 요약 ### 기존 기법 (_H) - `PLAY_BARS = 1` - 2-bar 패턴 중 **2번째 bar 전체를 재생에서 제외** ### 확장 기법 (이번 제안) - `PLAY_STEPS = N` - bar 내부에서 **앞의 N step만 재생**, 나머지는 무시 즉, ```text [ step 0 ... step (N-1) ] → 재생 [ step N ... step end ] → 비활성 ``` 이 기법은: - StepSeq 편집 구조를 바꾸지 않고 - ADS 및 펌웨어의 **재생 단계에서만 적용** 가능하다. --- ## 3. “최소 왈츠” 정의 본 설계에서 말하는 왈츠는 **엄밀한 3/4 박자**가 아니라, > **4/4 루프 안에서 > 마지막 박(4th beat)을 쉼으로 처리한 “3박 느낌”** 이다. ### 장점 - 루프 길이 / BPM / bar 구조 유지 - 기존 패턴과 완전한 호환 - 구현 난이도 매우 낮음 ### 한계 - 다음 마디가 당겨지지 않으므로 “진짜 3/4”와는 다름 - 그러나 드럼 패턴 용도로는 충분히 음악적 --- ## 4. Grid 해상도별 PLAY_STEPS 값 | Grid 해상도 | steps / bar | 1 beat | PLAY_STEPS (3 beats) | 비활성 영역 | |-------------|-------------|--------|----------------------|-------------| | Straight 16th | 16 | 4 step | 12 | step 12–15 | | Triplet 8T | 12 | 3 step | 9 | step 9–11 | | Triplet 16T | 24 | 6 step | 18 | step 18–23 | 공식: ```text PLAY_STEPS = steps_per_bar × (beats_to_play / beats_per_bar) ``` 여기서는: - `beats_per_bar = 4` - `beats_to_play = 3` --- ## 5. 메타데이터 설계 (ADS 기준) ### 5.1 최소 확장 메타 ADS(또는 ARR→ADS 컴파일 단계)에 다음 필드를 추가한다. ```text PLAY_STEPS = ``` 특징: - 단위: **grid step** - 의미: 해당 bar에서 재생할 최대 step index - 값이 없으면: - `PLAY_STEPS = steps_per_bar` (기존 4/4 완전 재생) ### 5.2 기존 메타와의 관계 | 메타 | 역할 | |------|------| | PLAY_BARS | bar 단위 재생 제한 (_H) | | PLAY_STEPS | bar 내부 step 단위 재생 제한 (신규) | 두 메타는 **독립적이며 동시에 적용 가능**하다. --- ## 6. ADS 재생 엔진 적용 방식 ### 6.1 재생 루프에서의 최소 변경 기존 (개념적): ```c for (step = 0; step < steps_per_bar; step++) { play_step(step); } ``` 확장 후: ```c int play_steps = meta.PLAY_STEPS > 0 ? meta.PLAY_STEPS : steps_per_bar; for (step = 0; step < steps_per_bar; step++) { if (step >= play_steps) continue; // 비활성 영역 play_step(step); } ``` ### 6.2 구현상의 장점 - 타이머 / 인터럽트 구조 변경 없음 - loop_len_ticks 변경 없음 - 단순 조건문 1개 추가 --- ## 7. StepSeq / APS와의 역할 분담 | 계층 | 역할 | |-----|------| | StepSeq | 항상 전체 grid 편집 (16/12/24 step) | | Grid Preview | 비활성 영역을 흐리게 표시 가능 | | ADS Compiler | PLAY_STEPS 계산 및 기록 | | Nano Ardule | PLAY_STEPS 기준 재생 제어 | **편집과 재생을 명확히 분리**함으로써 UX와 구조 모두 안정화된다. --- ## 8. 테스트 시나리오 1. 16-step/bar 패턴에서 `PLAY_STEPS=12` 2. ADS 컴파일 3. Nano Ardule 재생 4. 기대 결과: - 1–3박: 정상 재생 - 4박: 완전한 쉼 - 다음 bar는 정상적으로 이어짐 Triplet grid(12/24)에서도 동일 원리로 검증한다. --- ## 9. 확장 가능성 이 설계는 왈츠에만 국한되지 않는다. - 5/4 흉내: `PLAY_STEPS = 20` (16step×1.25) - 7/8 느낌: grid+PLAY_STEPS 조합 - 프로그레시브 리듬의 “불완전 마디” 표현 즉, > **“비활성 구간”은 변박을 흉내 내는 가장 저렴한 도구**다. --- ## 10. 결론 - bar 내부 일부를 비활성 처리하는 기법은 - 기존 StepSeq / ADS 구조를 거의 건드리지 않고 - 새로운 리듬 표현을 가능하게 한다. - 이번 제안은: - **진짜 변박 지원으로 가기 전** - 매우 현실적이고 음악적인 중간 단계다. **Triplet 일반화에 이어, 이번 PLAY_STEPS 개념은 Ardule 리듬 엔진을 한 단계 더 유연하게 만든다.**