MIDI 및 DirectMusic 구성 요소

애플리케이션 프로그램은 사용자 및 커널 모드 구성 요소의 조합을 사용하여 MIDI 및 DirectMusic 스트림을 캡처하고 재생합니다.

애플리케이션은 MIDI 재생 및 캡처를 위해 다음 소프트웨어 인터페이스 중 하나를 사용할 수 있습니다.

  • Microsoft Windows 멀티미디어 midiOutXxxmidiInXxx 함수

  • DirectMusic API

midiOut Xxx 및 midiInXxx 함수의 동작은 레거시 MIDI 드라이버 및 디바이스의 기능을 기반으로 합니다. Windows 98부터 WDMAud 시스템 드라이버는 이러한 함수에 대한 호출을 WDM 오디오 드라이버에 대한 명령으로 변환합니다. 그러나 이전 소프트웨어 및 하드웨어의 동작을 에뮬레이트하여 midiOutXxxmidiInXxx 함수는 DirectMusic API를 통해 사용할 수 있는 정밀도 타이밍과 향상된 기능을 희생합니다. DirectMusic 및 Windows 멀티미디어 MIDI 함수에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

DirectMusic 및 Windows 멀티미디어 MIDI 함수는 MIDI 및 DirectMusic 스트림을 처리하는 오디오 필터 그래프를 빌드하는 SysAudio 시스템 드라이버의 클라이언트입니다. 그래프 빌드는 이러한 소프트웨어 인터페이스를 사용하는 애플리케이션에 투명합니다.

MIDI 구성 요소

다음 그림에서는 MIDI 애플리케이션이 MIDI 데이터를 재생하는 데 사용하는 사용자 모드 및 커널 모드 구성 요소를 보여 줍니다. 이 애플리케이션은 winMM 시스템 구성 요소에서 구현되는 midiOutXxx 함수를 통해 WDM 오디오 드라이버에 Winmm.dll.

MIDI 재생 사용자 모드 및 커널 모드 구성 요소를 보여 주는 다이어그램

이전 그림의 MIDI 애플리케이션은 MIDI 파일에서 타임스탬프를 적용한 MIDI 이벤트를 읽고 재생합니다. MIDI 및 DMus 미니포트 드라이버는 공급업체에서 제공하는 구성 요소일 수 있음을 나타내기 위해 어두운 상자로 표시됩니다. 적절한 경우 공급업체는 사용자 지정 미니포트 드라이버를 작성하는 대신 시스템에서 제공하는 미니포트 드라이버(FMSynth, UART 또는 DMusUART) 중 하나를 사용하도록 선택할 수 있습니다. 그림의 다른 모든 구성 요소는 시스템이 제공합니다.

일반적인 MIDI 재생 애플리케이션의 기본 루프는 timeSetEvent를 호출하여 다음 메모 표시 또는 메모 끄기 이벤트를 예약합니다. 이 호출은 해당 매개 변수 중 하나로 애플리케이션의 콜백 루틴에 대한 함수 포인터를 사용합니다. 이벤트가 발생하고 운영 체제에서 콜백 루틴을 호출하는 경우 이 루틴은 midiOutShortMsg 를 호출하여 하나 이상의 예약된 메모를 켜거나 끕니다. midiOutShortMsg 함수는 호출 중에 이 메모리를 페이징할 필요가 없도록 MIDI 메시지를 페이지로 잠긴 데이터 버퍼에 저장합니다. timeSetEventmidiOutShortMsg 호출에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

사용자 및 커널 모드 구성 요소(Wdmaud.drv 및 Wdmaud.sys)로 구성된 WDMAud는 midiOutShortMsg 호출의 원시 MIDI 메시지가 도착하는 시간을 기록합니다. WDMAud는 이러한 타임스탬프를 MIDI 메시지와 결합하여 그림의 WDMAud 아래에 표시되는 커널 모드 구성 요소 중 하나로 보내는 MIDI 스트림을 생성합니다.

MIDI 애플리케이션에 대한 오디오 필터 그래프를 빌드할 때 SysAudio는 위의 그림에 표시된 SWMidi, MIDI 포트 또는 DMus 포트 드라이버에 대한 세 가지 가능한 연결 중 하나만 선택합니다. 애플리케이션이 기본 MIDI 디바이스를 선택하는 경우 SysAudio는 먼저 MIDI 또는 DMus 미니포트 드라이버에 MIDI 핀이 있는 신시사이저 디바이스를 찾습니다. 레지스트리에서 이러한 디바이스를 찾지 못하면 SysAudio는 SWMidi 시스템 드라이버 (Swmidi.sys)를 대신 사용합니다. SWMidi는 소프트웨어에서 파동 가능한 신디사이저를 구현하는 KS 필터이며 웨이브 오디오 스트림을 렌더링할 수 있는 디바이스만 필요합니다.

SWMidi는 모든 음성을 함께 혼합하여 KMixer 시스템 드라이버에 출력되는 단일 웨이브 PCM 스트림을 생성합니다. KMixer는 PCM 형식의 웨이브 스트림을 WaveCyclic 또는 WavePci 디바이스에 전달합니다. 이 디바이스의 포트 및 미니포트 드라이버는 그림의 왼쪽 아래 모서리에 나타납니다. 또는 KMixer는 출력 스트림을 USBAudio 클래스 시스템 드라이버 에 의해 제어되는 USB 오디오 디바이스에 전달할 수 있습니다(그림에 표시되지 않음).

앞의 그림에서 MIDI 포트 드라이버는 WDMAud에서 타임스탬프 MIDI 스트림을 가져와서 MIDI 미니포트 드라이버가 신시사이저 디바이스를 통해 재생하는 원시 MIDI 메시지로 변환합니다. MIDI 포트 드라이버에는 소프트웨어에서 구현되고 타이머 해상도가 1밀리초인 원시 MIDI 메시지를 예약할 수 있는 시퀀서가 포함되어 있습니다.

신시사이저 디바이스에 하드웨어 시퀀서가 포함된 경우 DMus 포트 드라이버는 MIDI 포트 드라이버보다 훨씬 더 높은 타이밍 정확도를 달성할 수 있습니다. 이 경우 DMus 미니포트 드라이버는 ISR(인터럽트 서비스 루틴) 및 기타 우선 순위가 높은 작업과의 CPU 시간 경쟁으로 인한 지터를 흡수할 수 있을 만큼 큰 하드웨어 버퍼를 지정해야 합니다. DMus 포트 드라이버가 미니포트 드라이버에 출력하는 MIDI 스트림의 타임스탬프는 100나노초 해상도의 64비트 값입니다.

DMusic 신디사이저에 하드웨어 시퀀서가 없는 경우 MIDI 포트 드라이버와 마찬가지로 타이머 해상도가 1밀리초인 DMus 포트 드라이버의 소프트웨어 시퀀서에 의존해야 합니다.

어댑터 드라이버는 각각 GUID 값이 CLSID_PortMidi 또는 CLSID_PortDMusPcNewPort를 호출하여 MIDI 또는 DMus 포트 드라이버를 만듭니다. Windows XP 이상에서는 MIDI 및 DMus 포트 드라이버가 동일한 소프트웨어 구현을 공유합니다.

이전 그림의 맨 아래에는 Portcls.sys 포함된 시스템 제공 미니포트 드라이버 FMSynth, UART 및 DMusUART의 이름이 표시됩니다. 어댑터 드라이버는 PcNewMiniport를 호출하여 이러한 미니포트 드라이버 중 하나를 만듭니다. FMSynth 및 UART는 IMiniportMidi 인터페이스를 제공하고 DMusUART는 IMiniportDMus 인터페이스를 제공합니다. UART는 이제 사용되지 않으며(Windows 98 Gold 이후) 기존 드라이버에 대해서만 지원됩니다. 새 어댑터 드라이버는 UART 기능의 상위 집합을 구현하는 DMusUART(Windows 98 SE 이상 및 Windows 2000 이상)를 대신 사용해야 합니다. DMusUART는 DLS 다운로드나 하드웨어 시퀀싱을 지원하지 않는 DMus 미니포트 드라이버의 예입니다. FMSynth 및 DMusUART 미니포트 드라이버의 소스 코드는 WDK(Windows 드라이버 키트)의 샘플 오디오 드라이버에서 사용할 수 있습니다.

다음 그림에서는 MIDI 애플리케이션 프로그램에서 MIDI 데이터를 캡처 하는 데 사용하는 사용자 모드 및 커널 모드 구성 요소를 보여 줍니다. 이 애플리케이션은 midiInXxx 함수를 통해 WDM 오디오 드라이버에 인터페이스합니다.

MIDI 캡처 사용자 모드 및 커널 모드 구성 요소를 보여 주는 다이어그램

앞의 그림에서 MIDI 및 DMus 미니포트 드라이버는 공급업체에서 제공하는 구성 요소일 수 있음을 나타내기 위해 어두운 상자로 표시됩니다. 적절한 경우 공급업체는 대신 시스템에서 제공하는 미니포트 드라이버인 UART 또는 DMusUARTCapture 중 하나를 사용하도록 선택할 수 있습니다. 그림의 다른 모든 구성 요소는 시스템이 제공합니다.

MIDI 데이터의 원본은 일반적으로 MPU-401 디바이스입니다. 어댑터 드라이버는 PcNewMiniport를 호출하여 시스템에서 제공하는 미니포트 드라이버 중 하나인 UART 또는 DMusUARTCapture를 만들어 MPU-401 디바이스에서 MIDI 데이터를 캡처할 수 있습니다. 다시 말하지만 UART는 사용되지 않으며 새 드라이버는 DMusUARTCapture(Windows 98 SE 이상 및 Windows 2000 이상)를 대신 사용해야 합니다.

MIDI 메모 또는 메모 표시 이벤트가 발생할 때마다 MIDI 또는 DMusic 캡처 미니포트 드라이버(이전 그림의 맨 아래에 있음)는 MIDI 또는 DMus 포트 드라이버로 흐르는 MIDI 스트림에 추가하기 전에 MIDI 메시지에 타임스탬프를 추가합니다.

MIDI 또는 DMusic 캡처 포트 드라이버는 WDMAud 시스템 드라이버의 커널 모드 절반인 Wdmaud.sys 타임스탬프를 적용한 MIDI 스트림을 출력합니다. 사용자 모드 절반인 Wdmaud.drv는 Winmm.dll 구현되는 midiInXxx 함수를 통해 타임스탬프 MIDI 스트림을 애플리케이션 프로그램에 출력합니다.

그림 맨 위에 있는 MIDI 애플리케이션은 타임스탬프를 적용한 MIDI 이벤트를 MIDI 파일에 씁니다. 애플리케이션이 midiInOpen 을 호출하여 MIDI 입력 스트림을 열 때 해당 콜백 루틴에 대한 함수 포인터를 전달합니다. 메모 또는 메모 해제 이벤트가 발생하면 운영 체제는 하나 이상의 타임스탬프를 적용한 MIDI 메시지를 포함하는 데이터 블록으로 콜백 루틴을 호출합니다. 이러한 메시지의 타임스탬프는 기본적으로 MIDI 또는 DMus 미니포트 드라이버가 원래 생성한 것과 동일합니다.

DirectMusic 구성 요소

다음 그림에서는 DirectMusic 애플리케이션 프로그램에서 MIDI 데이터를 재생 하거나 캡처 하는 데 사용되는 사용자 및 커널 모드 구성 요소를 보여 줍니다.

DirectMusic 재생 및 캡처 사용자 모드 및 커널 모드 구성 요소를 보여 주는 다이어그램

재생 구성 요소는 이전 그림의 왼쪽 절반에 표시되고 캡처 구성 요소는 오른쪽에 표시됩니다. DMus 미니포트 드라이버는 공급업체에서 제공하는 구성 요소일 수 있음을 나타내기 위해 어두운 상자로 표시됩니다. 적절한 경우 공급업체는 시스템 제공 미니포트 드라이버 중 하나인 DMusUART 또는 DMusUARTCapture를 대신 사용할 수 있습니다. 그림의 다른 구성 요소는 시스템 제공입니다.

그림의 왼쪽 위 모서리에서 DirectMusic 애플리케이션은 파일에서 사용자 모드 DirectMusic 시스템 구성 요소 (DMusic.dll)로 타임스탬프를 적용한 MIDI 스트림을 전달합니다. 그러면 스트림이 DMus 포트 드라이버로 전달됩니다. 이 드라이버를 사용할 수 있는 경우 DirectMusic 신디사이저 또는 MPU-401 디바이스의 미니포트 드라이버에 바인딩할 수 있습니다. 또는 포트 드라이버는 소프트웨어에서 DLS 지원 파동 가능 신디사이저를 구현하는 시스템 제공 DMus 미니포트 드라이버인 DMusic 시스템 드라이버 (Dmusic.sys)에 바인딩할 수 있으며 웨이브 오디오 스트림을 렌더링할 수 있는 디바이스만 필요합니다.

SWMidi와 마찬가지로 DMusic 드라이버 Dmusic.sys 모든 음성을 함께 혼합하여 KMixer에 출력되는 단일 PCM 형식 웨이브 스트림을 생성합니다. KMixer는 그림의 왼쪽 아래 모서리에 포트 및 미니포트 드라이버가 표시되는 웨이브 디바이스 또는 그림에 표시되지 않는 USBAudio 시스템 드라이버로 제어되는 USB 오디오 디바이스에 웨이브 스트림을 전달할 수 있습니다.

DirectMusic 캡처 구성 요소는 이전 그림의 오른쪽 절반에 표시됩니다. 그림의 오른쪽 아래 모서리에 있는 DMusic 캡처 미니포트 드라이버는 캡처 하드웨어를 제어하고 기록되는 각 MIDI 메시지를 타임스탬프를 지정합니다. DMus 포트 드라이버는 타임스탬프를 적용한 MIDI 스트림을 DMusic.dll 사용자 모드 DirectMusic 구성 요소로 전달합니다. 애플리케이션은 DirectMusic API를 통해 이 스트림에 액세스하고 타임스탬프를 적용한 MIDI 데이터를 파일에 씁니다.

어댑터 드라이버는 시스템 제공 DMusUARTCapture 미니포트 드라이버를 사용하여 MPU-401 캡처 디바이스를 제어할 수 있습니다. 어댑터 드라이버는 GUID 값이 CLSID_DMusUARTCapturePcNewMiniport를 호출하여 이 미니포트 드라이버를 만듭니다. 결과 미니포트 드라이버 개체는 IMiniportDMus 인터페이스를 지원합니다 . DMusUARTCapture 미니포트 드라이버의 소스 코드는 WDK(Windows 드라이버 키트)의 샘플 오디오 드라이버에서 사용할 수 있습니다.

DirectMusic 애플리케이션은 선택한 경우 SWMidi(Swmidi.sys)와 같은 midiOutXxx 디바이스를 통해 실행할 수도 있습니다. 간단히 하기 위해 이 경로는 이전 그림에서 생략됩니다. DMusic 드라이버(Dmusic.sys)는 올바르게 작동하려면 초기 DLS 다운로드가 필요합니다. SWMidi를 사용하면 이 요구 사항이 방지됩니다.