OSC
OSC 화면은 Open Sound Control(OSC 1.0)을 UDP로 직접 주고받는 곳입니다. 세 부분으로 이루어집니다.
- 송신: 메시지 하나, 타입이 있는 인수, Enter를 누르면 전송됩니다.
- 모니터: 포트에서 수신하며 도착하는 모든 패킷을 디코딩합니다.
- 신호 발생기: 파형을 따르는 값을 초당 여러 번 보내고, 그것을 그립니다.
Signal Lab은 OSC를 직접 인코딩하고 디코딩합니다. 보내는 내용은 인스펙터가 보여 주는 것과 바이트 단위로 같습니다.
메시지 보내기
- OSC를 엽니다.
- 대상 호스트:포트에 장치의 IP 주소나 호스트 이름과 포트를 입력합니다. 예:
127.0.0.1:9000또는stage-mixer.local:9000. - OSC 주소에 장치가 수신하는 주소를 입력합니다. 예:
/mixer/fader/1. - 인수 아래에서 각 인수의 타입과 값을 설정합니다. + 인수를 눌러 하나 더 추가하고, ✕는 하나를 제거합니다.
- 보내기를 누르거나, 송신 영역의 아무 필드에서 Enter를 누릅니다.
버튼 아래 줄에는 나간 내용이 표시됩니다. 주소, 바이트 단위 크기, 대상입니다. 같은 메시지를 다시 보내면 횟수가 올라가므로(×2, ×3…) 반복 전송이 실제로 동작했는지 확인할 수 있습니다. 실패는 그 대신 그 자리와 콘솔에 표시됩니다.
대상, 주소, 인수는 화면을 전환해도, 앱을 다시 시작해도 유지됩니다.
필드
| 필드 | 내용 | 기본값 |
|---|---|---|
| 대상 호스트:포트 | 수신자의 IP:port 또는 host:port. IPv6 주소는 대괄호에 넣습니다: [::1]:9000. 호스트 이름은 보낼 때마다 조회되며, IPv4 주소가 있으면 그것을 사용하므로(localhost가 127.0.0.1에서 수신하는 수신자에 도달합니다) 없으면 IPv6 주소를 사용합니다. 포트가 없는 대상은 거부됩니다. | 127.0.0.1:9000 |
| OSC 주소 | /로 시작하고 /로 부분을 나눈 OSC 주소. 앞의 /가 없으면 아무것도 보내기 전에 거부됩니다. | /hello/avatar/1 |
| 인수 | 주소 뒤에 순서대로 오는 타입 있는 값. 메시지에 하나도 없을 수 있습니다. | float 하나, 1.0 |
인수 타입
각 인수의 타입은 메시지의 일부이므로(타입 태그), float을 기대하는 장치는 같은 값의 int를 무시할 수 있습니다.
| 목록의 타입 | OSC 태그 | 값 | 입력 방법 |
|---|---|---|---|
int | i | 32비트 부호 있는 정수 | 정수 |
float | f | 32비트 부동 소수점 | 숫자, 0.75 |
str | s | 텍스트 | 임의의 텍스트, UTF-8로 전송 |
bool | T / F | 참 또는 거짓 | 목록에서 true 또는 false; 바이트를 담지 않고 태그만 전합니다 |
long | h | 64비트 부호 있는 정수 | 정수 |
double | d | 64비트 부동 소수점 | 숫자 |
nil | N | 없음 | 값 없음 |
blob | b | 바이트 | 여기서는 입력하지 않습니다: blob이 있는 신호를 열면 hex로, 읽기 전용으로 나타납니다 |
숫자가 아닌 값이 든 숫자 필드는 0을 보냅니다.
TIP
OSC true는 텍스트 "true"가 아니라 태그 T입니다. bool을 기다리는 장치는 문자열을 조용히 무시합니다.
번들
송신 영역은 단일 메시지를 보내며 번들은 보내지 않습니다. 번들(#bundle)이 도착하면 모니터, 실험의 대기, 에뮬레이터가 그것을 풀어냅니다. 안의 각 메시지는 따로 처리되고, 시간 태그는 무시됩니다.
포트 관찰하기
장치나 쇼 컨트롤러가 보내는 것을 보려면:
- 바인드 주소에 수신할 주소와 포트를 입력합니다.
0.0.0.0:9000(기본값)은 모든 네트워크 카드에서 수신하고,127.0.0.1:9000은 이 컴퓨터에서만 수신합니다. - 수신 대기을 누릅니다. 모니터가 실행되는 동안 필드는 잠깁니다.
- 송신 영역을 이 컴퓨터의 IP 주소와 그 포트로 향하게 합니다.
모든 패킷이 한 행이 되며, 최신이 위에 옵니다:
| 열 | 내용 |
|---|---|
| 시간 | 도착한 시각, 밀리초까지 |
| 보낸 곳 | 보낸 쪽의 IP:port |
| 주소 | OSC 주소, 또는 패킷이 유효한 OSC가 아닐 때 (디코딩 오류) |
| 인수 | 인수 값; blob은 blob[n], nil은 nil로 표시됩니다. 디코딩할 수 없었던 패킷이면 그 이유. |
번들은 메시지마다 한 행을 줍니다. 목록은 최근 300행을 유지하고, 지우기가 비웁니다. 중지을 누르면 포트가 닫힙니다. 모니터는 콘솔 표시줄의 작업이기도 하므로 거기서도 중지할 수 있습니다.
모니터는 최대 64 KiB의 패킷을 읽습니다. i f s S b h d T F N I 태그를 디코딩하며(S는 텍스트로, I는 nil로 읽습니다). 다른 태그가 있거나 잘린 패킷은 버리지 않고 디코딩 오류로 표시합니다.
메시지를 대기로 바꾸기
각 행에는 ⇠ 버튼(이 메시지 대기)이 있습니다. 열려 있는 실험에 OSC 대기 단계를 추가하며, 이 주소에 대해 모니터의 바인드 주소에서 수신하고, 각 텍스트·정수·참/거짓 인수에 "같음" 규칙을 둡니다(float, blob, nil에는 없음) — 규칙은 최대 16개입니다. 시간 제한은 2000 ms입니다. 편집기는 새 단계가 선택된 채로 열립니다.
WARNING
그 실험을 실행하기 전에 모니터를 중지하십시오. 실행도 같은 포트를 열며, 두 수신자가 같은 포트를 공유할 수 없습니다.
파형 보내기
신호 발생기는 한 주소로 메시지를 잇달아 보내며, 하나의 인수 값이 파형을 따릅니다 — 페이더, 조명 레벨, 위치. 장치가 움직이는 값을 어떻게 따르는지 보거나, 수신자에 꾸준한 스트림을 가할 때 사용합니다.
- 대상 호스트:포트과 주소를 설정합니다. 둘 다 발생기 시작을 누를 때 송신 영역과 같은 방식으로 검사됩니다.
- 파형, 주파수(Hz), 속도(pps)를 고릅니다.
- 최소과 최대, 값의 범위를 설정합니다.
- 발생기 시작을 누릅니다. 발생기 중지을 누르거나 콘솔 표시줄에서 작업을 중지할 때까지 실행됩니다.
| 필드 | 내용 | 기본값 |
|---|---|---|
| 대상 호스트:포트 | 수신자의 IP:port 또는 host:port; 이름은 생성기가 시작될 때 한 번 조회됩니다 | 127.0.0.1:9000 |
| 주소 | 모든 메시지를 보낼 주소; /로 시작합니다 | /hello/lfo |
| 파형 | 시간에 따른 값의 모양(아래) | 사인 |
| 주파수(Hz) | 초당 파형 주기 | 1 |
| 속도(pps) | 초당 메시지 수, 0.1~5000; 범위를 벗어난 값은 그 범위로 고정됩니다 | 60 |
| 최소, 최대 | 가장 낮은 값과 가장 높은 값. Max가 Min보다 낮으면 값이 움직이지 않습니다. | 0, 1 |
| int로 보내기 | 가장 가까운 정수로 반올림하고 float 대신 int를 보냅니다 | 꺼짐 |
| 파형 | 각 주기에서 값이 하는 일 |
|---|---|
| 사인 | Min과 Max 사이를 부드럽게 오가며, 가운데에서 시작해 올라갑니다 |
| 삼각 | Min에서 Max로 올라갔다가 다시 Min으로 내려가며, Min에서 시작합니다 |
| 톱니 | 내려가는 톱니: Max에서 시작해 Min으로 내려간 뒤 Max로 다시 뜁니다 |
| 램프 | 올라가는 톱니: Min에서 시작해 Max로 올라간 뒤 Min으로 다시 뜁니다 |
| 사각 | 전반부는 Max, 후반부는 Min |
| 랜덤 | 메시지마다 Min과 Max 사이의 새 임의 값; 주파수는 쓰이지 않습니다 |
| 상수 | 매번 Max; 주파수는 쓰이지 않습니다 |
스코프
필드 옆에서 스코프는 보내는 대로 값을 그립니다. 최근 300개 점을 화면에 맞게 조정해 표시합니다. 그 아래에는 파형, 주파수, 속도, 마지막으로 보낸 값이 있습니다. 스코프는 생성기가 얼마나 빠르게 보내든 약 초당 30회 갱신되므로, 높은 속도에서는 메시지 하나하나가 아니라 표본을 보여 줍니다.
전송이 실패하면 생성기가 멈추고 콘솔이 이유를 알려 줍니다.
인스펙터에서
캡처가 켜져 있으면(인스펙터의 캡처 켜기), OSC 트래픽이 osc 프로토콜로 나타납니다:
| 출처 | 내용 | 비고 |
|---|---|---|
osc-send | 송신 영역, 라이브러리 신호, OSC 메시지 단계 또는 signallab send osc가 보내는 모든 메시지 | 회신을 기다리는 단계는 experiment로 나타납니다 |
osc-monitor | 모니터가 받는 모든 패킷 | 번들은 첫 메시지와 +n more in bundle로 요약됩니다; 잘못된 패킷은 decode error: … 판정을 받습니다 |
osc-gen | 생성기의 메시지 | 100 ms마다 최대 하나가 sampled 판정으로 캡처됩니다; 건너뛴 메시지 뒤의 다음 것은 그리지 않은 수를 sampled · +5 not shown으로 덧붙입니다 |
각 프레임은 만들어질 때 사용한 바이트를 보관합니다. 인스펙터를 참고하십시오.
저장하고 재사용하기
- 신호로 저장. 버튼 아래의 저장…는 메시지(대상, 주소, 인수)를 선택한 폴더의 신호 라이브러리에 보관합니다. 이후 송신 영역은 그 신호와 연결됩니다: 저장 (또는 송신 영역의 Ctrl+S)는 신호를 갱신하고, 다른 이름으로 저장…는 사본을 만들며, 옆의 칩은 신호에서 엽니다. 나중에 신호나 아무 화면에서 Ctrl+K로 보내십시오. 신호를 참고하십시오.
- 실험에 추가. 실험에 추가는 같은 대상, 주소, 인수를 가진 OSC 메시지 단계를 열려 있는 실험에 추가하고(End 바로 앞, 또는 선택한 단계 뒤) 엽니다. 실험이 실행되는 동안에는 아무것도 추가할 수 없으며, 콘솔이 그렇게 알려 줍니다.
실험에서
| 단계 | 하는 일 |
|---|---|
| OSC 메시지 | 메시지 하나를 보냅니다. 대상, 주소, 텍스트 인수는 {{templates}}를 받습니다. 회신 대기를 켜면 자체 포트에서 보내고 같은 단계에서 그곳에서 답을 기다립니다. 자세히 |
| OSC 대기 | 주소가 패턴과 일치하고 인수가 규칙을 통과하는 메시지를 기다립니다. 자세히 |
| 에뮬레이터 | 실행 내내 규칙에 따라 응답하는 OSC 장치. 에뮬레이터를 참고하십시오. |
OSC 메시지 단계는 화면과 같이 IP:port 또는 host:port를 받으며, 주소는 /로 시작해야 합니다. 호스트 이름은 단계가 보낼 때마다 조회됩니다.
주소 패턴
OSC 대기, OSC 메시지의 회신, OSC 에뮬레이터의 규칙은 OSC 1.0 패턴으로 주소를 일치시킵니다:
| 패턴 | 일치 |
|---|---|
* | 임의의 문자열, 없음도 포함 |
? | 정확히 한 글자 |
[0-9], [a-c] | 집합이나 범위에서 한 글자 |
[!0-9] | 집합에 없는 한 글자 |
{ping,pong} | 단어 중 하나 |
와일드카드는 슬래시 사이의 한 부분 안에 머뭅니다: /cue/*는 /cue/7과 일치하지만 /cue/7/go와는 일치하지 않으며, 패턴은 부분 수가 같은 주소에만 일치합니다. 대소문자를 구분합니다. 패턴은 /로 시작하고, 빈 부분(//)이 없고, 공백과 #, ASCII 밖의 문자가 없으며, 최대 512자입니다.
인수 규칙은 0–63번 인수를 값과 비교합니다(같음, 작음, 포함, 정규식 일치 등). 대기는 최대 16개를 둡니다. 번들이 도착하면 안의 어떤 메시지든 일치할 때 대기가 그것을 받습니다. 일치한 메시지가 이후 단계에 무엇을 주는지는 데이터와 템플릿을 참고하십시오.
명령줄에서
signallab send osc는 송신 영역처럼 메시지 하나를 보냅니다:
signallab send osc 127.0.0.1:9000 /cue/go f:0.75 s:main✔ sent /cue/go (24 bytes) → 127.0.0.1:9000각 인수는 tag:value입니다: i:3, f:0.5, d:1.5, h:64, s:text, b:de ad be ef(hex 바이트), 또는 단독으로 T, F, N. 태그가 없으면 정수는 i, 소수점이 있는 숫자는 f, 그 밖의 것은 s입니다; 텍스트 7을 보내려면 s:7로 씁니다. 대상은 IP:port 또는 host:port입니다. 메시지가 나가면 0으로, 전송에 실패하면(해석되지 않는 호스트 이름 포함) 1로, 인수나 주소나 대상이 잘못되면 2로 종료합니다. signallab fire는 저장한 신호를 보냅니다. 명령줄을 참고하십시오.
TIP
Windows의 Git Bash에서는 /로 시작하는 인수가 signallab이 보기 전에 파일 경로로 바뀝니다. 명령 앞에 MSYS_NO_PATHCONV=1을 두고 실행하거나, PowerShell이나 cmd를 사용하십시오.
문제
| 보이는 것 | 흔한 원인 |
|---|---|
보낼 때 … is not a valid address | 대상에 포트가 없거나, IP:port도 host:port도 아닙니다. |
보낼 때 Cannot resolve … | 이 컴퓨터에서 호스트 이름이 해석되지 않습니다. 확인하거나 IP 주소를 사용하십시오. |
OSC addresses start with / (…) | 주소에 앞의 /가 없습니다. |
| 메시지는 전송되지만 장치가 아무것도 하지 않음 | 포트나 주소가 틀렸거나, 장치가 기대하는 것과 다른 타입입니다(float 대신 int, bool 대신 텍스트 "true"). 인스펙터에서 보거나, 대상을 이 컴퓨터의 모니터로 향해 나가는 내용을 확인하십시오. |
수신 대기에서 … is already in use by another program | 다른 프로그램, 또는 실행 중인 실험이나 에뮬레이터나 두 번째 모니터가 포트를 쓰고 있습니다. |
… is not an address of this computer | 바인드 주소 IP가 다른 컴퓨터의 것입니다. 0.0.0.0이나 이 컴퓨터의 주소 중 하나를 사용하십시오. |
| 다른 컴퓨터의 패킷이 도착하지 않음 | Windows에서는 방화벽이 막을 수 있습니다: 앱이 요청하면 Signal Lab을 허용하십시오. 로컬 트래픽(127.0.0.1)은 영향을 받지 않습니다. 문제 해결을 참고하십시오. |
| (디코딩 오류) 행 | 보낸 쪽이 그 포트에서 OSC 1.0을 말하지 않거나, Signal Lab이 디코딩하지 않는 타입 태그를 씁니다. |
서버에서는 이 화면이 서버의 네트워크에서 동작합니다: 127.0.0.1은 서버 자신이고, 모니터는 서버의 포트에서 수신합니다. 서버를 참고하십시오.
모든 오류 메시지는 오류 메시지에 정리되어 있습니다.