피치 벤드 (MIDI) 값을 "정상"피치 값으로 변환


11

here rt_lpc (실시간 LPC) 구현을 사용하여 오프라인 LPC 분석 및 합성을 시도하고 있습니다 . 프로그램 내에서 오프라인 LPC 분석 및 합성 프로그램에 사용할 수있는 일부 기능이 있습니다. rt_lpc 코드는 주로 작곡가 등에 사용됩니다. 즉, MIDI 또는 글로 탈 펄스 입력을 사용합니다. 프로그램에 피치 값 (자동 상관에서 얻은)을 값으로 변환하는 코드가 있습니다 bend. 관계는 다음과 같습니다.

    pitch = (int)( Stk::sampleRate() / midi2pitch[ananya.data[1]] ) /
                            pow( 1.0653f, bend/64.0f*11.0f );
                    power *= ananya.data[2] / 64.0f;
bend = ge.data[1] / 128.0f + ge.data[2] - 64;

몇 가지 사항 :
a. 즉석에서 채워지는 것처럼 보이는 ananya유형의 객체입니다 MidiMsg.
비. ge또한 MidiMsg즉시 채워지는 것처럼 보이는 유형의 객체이기도합니다 .
씨. 이 두 객체는 ​​프로그램이 실시간으로 실행될 때 생성됩니다 (내는 main.cpp에서 선택적 부분을 실행하는 오프라인 버전입니다.

내 질문 :
1. 피치 벤드 란 무엇입니까?
2. 피치 값을 벤드 값으로 어떻게 변환합니까? 매핑 관계는 무엇입니까?

솔루션을 검색했지만 명확한 답변을 찾지 못했습니다.

답변:


12

MIDI의 핵심은 음악을 개별 음표 이벤트로 표현한 것입니다. 키보드 악기에서 연주되는 음악을 표현하는 데 적합합니다. 다음을 사용하여 템퍼링 된 음계의 음표에 해당하는 주파수를 MIDI 음표 번호로 변환 할 수 있습니다.

69+12×로그2에프아르 자형이자형이자형와이440

MIDI 수신기가 A4 = 440Hz에 대해 보정되었다는 가정하에.

이 표현은 피아노 음악에는 문제가 없지만 문제는 템퍼링 된 음계 (비 서구 음악, 비 음악 사운드)에 매핑되지 않은 피치를 표현하는 방법 및 음이 지속되는 동안 피치 변화를 표현하는 방법 (리산도, 비브라토).

이것은 "피치 벤드 메시지"를 사용하여 MIDI에서 수행됩니다. "피치 벤드 메시지"는 신디사이저가 현재 연주되는 음의 피치를 작은 간격으로 이동하도록 지시합니다. 대부분의 신디사이저는 기본적으로 피치 벤드 메시지 범위 (0 .. 16383) 동안 +/- 2 반음에 대해 보정됩니다. 8192는 피치 벤딩이 없음에 해당합니다. 방출 된 피치는 정확히 음표의 피치입니다. 피치 벤드 값과 주파수 편이 비율 사이의 매핑은 다음과 같습니다.

에프이자형미디엄나는이자형_영형이자형에프영형이자형_미디엄이자형에스에스이자형=2나는h이자형81924096×12

따라서 다음 공식에서 신디사이저가 연주하는 음표의 주파수를 얻을 수 있습니다.

440×2영형이자형6912.0+나는h이자형81924096×12

여기서 note 는 마지막으로 수신 한 Note On 메시지 의 7 비트 MIDI 노트 번호입니다 . 및 피치 벤드는 마지막 수신 된 14 비트 값이다 피치 벤드 메시지. 신디사이저는 피치 벤드 레지스터가 8192로 설정되어 시작되며이 값은 "Reset all controllers"메시지를 수신하는 동안 재설정됩니다.

다음 예제를 보자. MIDI 메시지로 500Hz, 510Hz, 500Hz의 주파수 궤적을 사용하여 플루트 트릴을 표현하려고합니다.

기본 메모 번호는 다음과 같습니다.

아르 자형영형(69+12×로그2(500/440))=71

따라서 note #가 71 인 "note on"메시지를 보냅니다. 이는 피치가 다음과 같습니다.

440×2(7169)/12=493.88

강화 스케일에서 가장 가까운 피치입니다. 피치를 다음과 같이 높이려면 피치 벤드 메시지를 보내야합니다.

500493.88=1.0124

그리고 당신의 500Hz를 얻으십시오. 해당 피치 벤드 값은 다음과 같습니다.

아르 자형영형(8192+4096×12×영형21.0124)=9065

510Hz를 얻으려면 피치 벤드 값은 다음과 같습니다.

아르 자형영형(8192+4096×12×영형2510493.88)=10469

따라서 500, 510, 500 Hz의 MIDI 메시지 시퀀스는 다음과 같습니다.

  • 비고 71
  • 피치 벤드 9065
  • ...
  • 피치 벤드 10469
  • ...
  • 피치 벤드 9065

MIDI 음표 번호를 피치의 "적분"부분으로 생각할 수 있습니다. 피치는 피치의 중복 "분수"부분으로서 구부러진 다.


또한 코드에 대한 이해에서 ge는 피치 벤드 메시지입니다. ge.data [2]의 MSB 및 ge.data [1]의 LSB. ananya는 메시지의 메모이고, ananya.data [1]은 메모 번호이고 ananya.data [2]는 속도입니다. 코드 작성자 사이에 숨겨진 로맨스를 암시하는 펑키 변수 이름 지정 외에도 잠재적 인 WTF를 볼 수 있습니다. 1.0653f 및 11.0f 상수에는 비린내가 있습니다. 읽을 수있는 선택은 1.05946f 및 12.0f입니다. 또는 1.06504f 및 11.0f. 저자들은 또 다른 잠재적 WTF 인 +/- 1 옥타브의 피치 벤드 범위를 가정 한 것으로 보인다.
pichenettes

"숨겨진 로맨스"부분의 ROTFL! 나는 이것을 올바르게 이해했다고 생각하지 않으므로 나와 함께하십시오. 피치 값은 함수에서 얻 autocorrelate습니다. 출력 된 MIDI 노트 인 것처럼 보입니다. midi2pitch수식 에서 배열을 확인 하시겠습니까? 내가 옳다면, 그것은 여전히 bend구부러진 값을 계산할 피치 의 값이나 실제 값을 가지고 있지 않으며 , MIDI 파일이 없다면 그것을 얻을 수있는 방법이 없다는 것을 의미합니다. 변수가 너무 많고 방정식이 너무 적은 간단한 경우입니다. velocity이 경우 굽힘, 실제 피치 값 및 어떻게 추정 합니까?
Sriram

무엇을하려고합니까? 피치 / 전력 쌍을 MIDI 메시지로 변환 하시겠습니까? 아니면 MIDI 데이터를 실제 피치로 변환합니까? 위에 주어진 코드는 한 쌍의 수신 MIDI 음표 + 피치 벤드 메시지 (ananya msg, ge msg)를 마침표 (피치 변수) 및 전력 (파워 변수)으로 변환합니다. 나는 이것이 LPC 자극을 미디 키보드로 제어되는 합성 보코더 또는 자동 튜닝 효과로 대체하는 데 사용된다고 생각합니다.
pichenettes

rt_lpc.cpp를 훑어 보면 0xe0 (PITCH BEND) 유형의 수신 MIDI 메시지가 피치 벤드 값을 업데이트하고 있음을 확인합니다. 그리고 0x90 (NOTE ON) 유형의 수신 MIDI 메시지는 "ananya"메시지로 복사됩니다. 여기에서 수정 된 피치를 사용한 재 합성은이 값을 사용하여 수행됩니다. 거기서 무엇을하고 싶은지 잘 모르겠습니다.
pichenettes

1
예, 여기서 MIDI 입력은 창의적인 신호 변환과 완전히 다릅니다. 이는 정상적인 LPC 분석 / 합성 사슬의 일부가 아닙니다. 대신 분석 모듈에서 생성 된 것이 아니라 키보드에서 일부 파라미터 (피치 및 전력)를 읽을 수 있습니다. 어쩌면 오디오 파일의 일부 예와 함께 새로운 질문을 게시하고 피치 궤적을 Hz 단위로 추출하여 더 강력한 피치 추정 기술을 사용할 수 있습니다. Aubio 라이브러리에는 몇 가지 변형 된 피치 트래커가 있습니다.
pichenettes

6

MIDI는 (주로) 신디사이저가 다른 신디사이저 또는 컴퓨터에 의해 제어되거나 제어되도록하는 프로토콜입니다.

"키 C1 업" "키 D4 다운" "키 속도,"사운드 변경 "등과 같은 메시지를 교환 할 수있는 직렬 프로토콜입니다. 많은 컨트롤러에는 조이스틱 또는 변조 휠인"피치 휠 "이 있습니다. 연주자는 현재 연주되는 음의 음정을 대화식으로 변경하여 수동으로 비브라토를 만들거나 한 음에서 다음 음으로 계속 "슬라이드"할 수 있습니다. 피치 벤딩 및 이름.

MIDI 피치 벤드 메시지는 특정 시점에서 얼마나 많은 피치 시프트가 발생해야하는지 알려주는 방법입니다. 피치 벤드 메시지를 수신하는 신시사이저 (소프트웨어 또는 하드웨어)는 주어진 양만큼 연주되는 모든 현재 음의 피치를 변경해야합니다.

컨트롤러 메시지에는 -8192에서 8191 사이의 인수가 있으며 표준 MIDI 파일에서 -200 cent에서 200 cent까지의 범위를 포함해야합니다. 여기서 1 cent는 반음의 1/100, 즉 2 ^ ( 1/1200) = 1.000577789506555. 예 : 공칭 주파수의 93 %에 도달하도록 피치 시프트를 아래로 만들려면 컨트롤러 값은 다음과 같습니다.

c = round(log2(.93)*12*8192/2);

또는이 경우 -5146입니다. 0.93은 원하는 비율, 12 옥타브 당 반음 수, 2 최대 피치 벤드 범위 (이 경우 200 센트 또는 2 반음), log2 ()는 2를 기준으로하는 로그입니다.

그러나 대부분의 신디사이저에서 범위를 구성 할 수 있으며 모든 신디사이저가 동일하게 작동한다고 가정하는 것은 좋지 않습니다.

다음은 도움이 될 수있는 전환 차트입니다. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.