User Tools

Site Tools


nano_ardule_midi_controller:waltz_via_beat_deactivation

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만 재생, 나머지는 무시

즉,

[ 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

공식:

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 컴파일 단계)에 다음 필드를 추가한다.

PLAY_STEPS = <int>

특징:

  • 단위: 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 재생 루프에서의 최소 변경

기존 (개념적):

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

  • 타이머 / 인터럽트 구조 변경 없음
  • 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 리듬 엔진을 한 단계 더 유연하게 만든다.

nano_ardule_midi_controller/waltz_via_beat_deactivation.txt · Last modified: by hyjeong