노브 API
OBS는 읽기 전용입니다. 네이티브 Tauri 메인·오버레이 창은 revision coordinator를 거쳐 노브 레이아웃을 쓸 수 있습니다.
노브 요소를 관리합니다. HID 기기 축(예: 리듬게임 컨트롤러의 노브)에 바인딩되어 물리 노브와 함께 회전하는 시각화 요소입니다. HID 기기의 버튼은 키보드 키와 완전히 동일하게 매핑·시각화되고, 축은 전용 노브 요소로 시각화됩니다.
HID 입력 인식은 현재 Windows에서만 지원됩니다.
식별자
DmNote는 HID 입력에 고정 문자열 식별자를 부여합니다:
| 종류 | 형식 | 예시 |
|---|---|---|
| 버튼 | HIDB:vid:pid:usagePage:usage | HIDB:1ccf:101c:9:3 |
| 축 | HIDA:vid:pid:usagePage:usage | HIDA:1ccf:101c:1:48 |
버튼 식별자는 키 라벨로 사용되며(일반 키보드 키처럼 매핑 가능,
dmn.keys.onRawInput에서 device: 'gamepad'로 전달) 축 식별자는 노브
요소의 axisId에 저장됩니다.
타입
// KeyPosition의 스타일 필드를 상속 (위치, 크기, 색상, 이미지 등)
// 요소 안정 id(UUID)도 포함: 재정렬·모드 전환에도 같은 노브를 가리키며,
// 전체 프리셋 로드 시에는 새 ID가 발급됩니다 (탭 프리셋은 담긴 컬렉션만)
type KnobItemPosition = KeyPosition & {
axisId: string; // 바인딩된 HID 축("HIDA:..."), 미바인딩이면 빈 문자열
sensitivity: number; // 회전 배율 (기본 1)
reverse: boolean; // 회전 방향 반전
};
// 축 델타는 내부적으로 축 해상도로 정규화되므로 sensitivity는 기기와
// 무관한 순수 배율입니다: 1 = 물리 1회전 ≈ 화면 1회전,
// 2 = 두 배 회전, 0.5 = 절반.
// 탭/모드 id(예: "4key")별 맵
type KnobItemPositions = Record<string, KnobItemPosition[]>;자주 사용하는 상속 스타일 필드:
backgroundColor/activeBackgroundColor: 대기 / 회전 중 배경색borderColor/activeBorderColor: 대기 / 회전 중 테두리 색상borderWidth: 0보다 클 때만 단색 테두리 두께로 사용; 미지정 시 1px 폴백은 그라데이션 테두리에만 적용되고 0이면 두 형식 모두 비활성backgroundGradient/activeBackgroundGradient: 배경 그라데이션(GradientSpec, 지정 시 단색보다 우선)borderGradient/activeBorderGradient: 테두리 그라데이션(GradientSpec)shadow/activeShadow: 대기 / 회전 중 그림자(ElementShadowSpec, color 알파값으로 농도 조절)borderRadius: 모서리 반경(px), 미지정 시 원형inactiveImage/activeImage: 대기 / 회전 중 커스텀 이미지idleTransparent/activeTransparent: 배경 투명 토글
ElementShadowSpec은 enabled, color, offsetX, offsetY, blur로
구성됩니다. 오프셋은 -100100px, 흐림은 0100px 범위입니다.
물리 노브가 회전하는 동안 요소는 키의 눌림처럼 입력(active)
색상/이미지로 전환되며, 누적 회전수 × 360° × sensitivity만큼 회전합니다.
위치 관리
dmn.knobItems.getPositions(): Promise<KnobItemPositions>
전체 탭의 노브 요소 레이아웃을 반환합니다.
const positions = await dmn.knobItems.getPositions();
console.log(positions['4key']); // "4key" 탭의 노브 요소들dmn.knobItems.updatePositions(positions): Promise<KnobItemPositions>
노브 요소 레이아웃을 교체하고 저장합니다.
const positions = await dmn.knobItems.getPositions();
positions['4key'][0].sensitivity = 2; // 노브 1회전당 화면 2회전
await dmn.knobItems.updatePositions(positions);dmn.knobItems.onPositionsChanged(callback): Unsubscribe
노브 레이아웃 변경(knobPositions:changed)을 구독합니다.
이 이벤트는 기존 플러그인 호환을 위해 계속 제공되지만, 신규 에디터 상태 동기화
용도로는 deprecated입니다. canonical 원자적 변경 흐름은
dmn.editor.onCommitted()로
구독하세요.
const unsub = dmn.knobItems.onPositionsChanged((positions) => {
console.log('노브 레이아웃 변경', positions);
});