툴/비트윅

Bitwig Studio -> Unity 미디 신호 연동하기

스튜디오 오버그래픽스 2023. 6. 21. 18:56

비트윅 미디(Note, CC) -> 비트윅 디바이스 HW Instrument -> 가상 미디 포트 -> 유니티 MidiJack

 

https://github.com/keijiro/MidiJack

 

GitHub - keijiro/MidiJack: MIDI input plugin for Unity

MIDI input plugin for Unity. Contribute to keijiro/MidiJack development by creating an account on GitHub.

github.com

유니티 미디 신호 받는 플러그인

MidiJack.unitypackage
0.27MB

 

 

설치 하고 나면 Window - MIDI Jack 창을 켜면 받는 미디 신호를 확인 가능.

 

Debug.Log(MidiJack.MidiMaster.GetKnob(1));
// CC 신호 1번 float로 받음

Debug.Log(MidiJack.MidiMaster.GetKeyDown(1));
// Note신호 1번 note가 입력됐는지 아닌지 bool로 받음

Debug.Log(MidiJack.MidiMaster.GetKey(1));
// Note신호 1번 note의 velocity값을 float로 받음

C# 스크립트

 


비트윅 설정에서 가상 미디 포트 지정

 

Poly Grid 트랙 추가

인스펙터 패널에서 모니터 모드 끄기(좌측 스피커 아이콘)

*모니터 모드가 켜져 있으면 변화가 없어도 미디신호를 계속 내보내서 송출되는 신호가 너무 많아짐

 

I/O의 'CC Out'모듈과 'Note Out'모듈로 내보낼 미디 신호를 설정할 수 있음.

'CC Out'은 CC값의 넘버와 채널을 지정할수 있음.

'Note Out'은 Note값의 넘버와 벨로시티와 채널을 지정 할수 있음.

 

Poly Grid 다음에 HW Instrument디바이스를 붙이고 가상 미디 포트를 지정하면 해당 미디 포트로 설정해둔 CC와 Note 미디 신호를 보낼수 있음

 

*HW Instrument를 붙이면 이제 소리가 출력이 안됨. 그래서 Master트랙이나 다른 트랙에서 에서 Audio Receiver로 받아서 모니터링 가능

 

만약 Poly Grid 디바이스 외에 Delay나 Reverb 디바이스를 붙인다면 HW Instrument 이전에 붙이고,

Audio Receiver에서는 추가된 디바이스를 Audio Source로 가져오면 됨.

 

Debug.Log(MidiJack.MidiMaster.GetKnob(8));

만약 ADSR의 Evelope 신호를 'CC Out'모듈 CC8로 설정해서 보내면,

유니티에서 위 코드(GetKnob(8))로 받을 수 있음.

 

*CC값은 변화할때마다 신호를 보내는데 만약 너무 큰폭의 빠른 변화가 있다면 0.1초의 짧은 찰나에도 100개거 넘는 신호를 보내게 됨.(미디 포트에 무리가 있을 수 있음)

그럴 경우너무 급격한 변화가 있어서 신호가 너무 많이 보내진다면 'S/H'모듈이나 다른 홀드 모듈과 Triggers를 써서 변화량중 일부만 특정 타이밍에 내보낼수 있게 만듬.

Shaper의 Quantizer를 쓰는 방법도 있음.(값을 계단식으로 단계를 줄여서 해상도를 낮춤)

단, 값 자체의 영역을 조절하다 보니 최솟값과 최대값에 머물러 있어도 값이 반영이 안되는 단점이 있음.

(0~100 사이의 영역을 보내지만 [5,30,55,80]이런 식으로 깎여버리면 0과 100을 표현 못함)

 

'Note Out'은 Gate에 신호를 주면 미디 키가 눌린것으로 인식하고

밑에 Pitch는 미디 넘버를 의미하며 제일 낮은 C-2(0)부터 제일 높은 G8(127)까지 표현함.

세번째 파란 아이콘은 Velocity로 0~100까지의 int값을 설정 하고 보낼수 있음.

네번째 녹색 아이콘은 채널

Debug.Log(MidiJack.MidiMaster.GetKeyDown(0));
Debug.Log(MidiJack.MidiMaster.GetKey(0));

위와 같은 코드로 해당 Debug를 볼 수 있음.

Gate신호가 있기 전에 False와 0의 결과가 나오고

Gate 신호가 들어오면 True와 1의 결과를 받음.

 

이번에는 G8(127)로 Pitch를 올리고 Velocity를 50으로 낮춤

Debug.Log(MidiJack.MidiMaster.GetKeyDown(127));
Debug.Log(MidiJack.MidiMaster.GetKey(127));

코드는 127로 넘버를 변경

이번에는 Gate신호가 들어올때 True과 되고 GetKey(127)의 값은 Velocity인 0.503937을 받음.