Table of Contents

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 시스템은 현재 다음을 전제로 설계되어 있다.

이번에 새롭게 확인한 사실은 다음과 같다.

“bar 전체”가 아니라 “bar 내부 일부(step/beat)”를 비활성 처리해도
음악적으로 의미 있는 결과를 얻을 수 있다.

이를 이용하면,


2. 핵심 아이디어 요약

기존 기법 (_H)

확장 기법 (이번 제안)

즉,

[ step 0 ... step (N-1) ]  → 재생
[ step N ... step end ]    → 비활성

이 기법은:


3. “최소 왈츠” 정의

본 설계에서 말하는 왈츠는 엄밀한 3/4 박자가 아니라,

4/4 루프 안에서
마지막 박(4th beat)을 쉼으로 처리한 “3박 느낌”

이다.

장점

한계


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

공식:

PLAY_STEPS = steps_per_bar × (beats_to_play / beats_per_bar)

여기서는:


5. 메타데이터 설계 (ADS 기준)

5.1 최소 확장 메타

ADS(또는 ARR→ADS 컴파일 단계)에 다음 필드를 추가한다.

PLAY_STEPS = <int>

특징:

5.2 기존 메타와의 관계

메타 역할
PLAY_BARS bar 단위 재생 제한 (_H)
PLAY_STEPS bar 내부 step 단위 재생 제한 (신규)

두 메타는 독립적이며 동시에 적용 가능하다.


6. ADS 재생 엔진 적용 방식

6.1 재생 루프에서의 최소 변경

기존 (개념적):

for (step = 0; step < steps_per_bar; step++) {
    play_step(step);
}

확장 후:

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 구현상의 장점


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. 확장 가능성

이 설계는 왈츠에만 국한되지 않는다.

즉,

“비활성 구간”은 변박을 흉내 내는 가장 저렴한 도구다.

10. 결론

Triplet 일반화에 이어,
이번 PLAY_STEPS 개념은 Ardule 리듬 엔진을 한 단계 더 유연하게 만든다.