MIDI 및 DirectMusic 필터

MIDI 및 DirectMusic 필터는 MIDI 음악 데이터를 합성, 출력 또는 캡처하는 디바이스를 나타냅니다. 애플리케이션은 일반적으로 DirectMusic API 또는 Microsoft Windows 멀티미디어 midiOut Xxx 및 midiInXxx 함수를 통해 이러한 디바이스의 기능에 액세스합니다. 이러한 인터페이스에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

MIDI 또는 DirectMusic 신시사이저 필터는 타임스탬프 MIDI 이벤트로 구성된 MIDI 스트림을 입력으로 받습니다. 필터는 다음 중 하나를 출력합니다.

  • 웨이브 형식 디지털 오디오 스트림

  • 스피커 세트를 구동할 수 있는 아날로그 오디오 신호

MIDI 또는 DirectMusic 출력 필터는 타임스탬프를 적용한 MIDI 이벤트로 구성된 MIDI 스트림을 입력으로 받습니다. 필터는 원시 MIDI 메시지를 외부 MIDI 사운드 모듈에 출력합니다.

MIDI 또는 DirectMusic 캡처 필터는 MIDI 키보드 또는 기타 외부 MIDI 디바이스에서 일련의 원시 MIDI 메시지를 입력할 때 사용합니다. 필터는 타임스탬프를 적용한 MIDI 이벤트로 구성된 MIDI 스트림을 출력합니다.

단일 MIDI 또는 DirectMusic 필터는 필터가 나타내는 디바이스의 기능에 따라 합성, 출력 및 캡처라는 세 가지 함수의 조합을 수행할 수 있습니다. 예를 들어 순수 MPU-401 디바이스는 출력 및 캡처를 수행하지만 합성은 수행하지 않습니다.

MIDI 필터

MIDI 필터는 포트/미니포트 드라이버 쌍으로 구현됩니다. MIDI 필터 팩터리는 다음과 같이 MIDI 필터를 만듭니다.

  • MIDI 미니포트 드라이버 개체를 인스턴스화합니다.

  • GUID 값이 CLSID_PortMidiPcNewPort를 호출하여 MIDI 포트 드라이버 개체를 인스턴스화합니다.

  • 포트 드라이버의 IPort::Init 메서드를 호출하여 미니포트 드라이버를 포트 드라이버에 바인딩합니다.

하위 서비스 만들기의 코드 예제에서는 이 프로세스를 보여 줍니다. 포트 및 미니포트 드라이버는 IPortMidi 및IMiniportMidi 인터페이스를 통해 서로 통신합니다.

MIDI 출력 및 신시사이저 디바이스를 지원하기 위해 MIDI 포트 드라이버에는 타이머 해상도가 1밀리초인 미니포트 드라이버에 원시 MIDI 메시지를 출력하는 소프트웨어 시퀀서가 포함되어 있습니다.

DirectMusic 필터

DirectMusic 필터는 MIDI 필터 기능의 상위 집합을 제공합니다. 상위 집합에는 다음과 같은 추가 기능이 포함됩니다.

  • MIDI 계측을 설명하는 파형 및 관절 데이터를 포함하는 DLS(다운로드 가능한 사운드) 리소스입니다. KSPROPERTY_SYNTH_DLS_DOWNLOAD set-property 요청은 DLS 리소스를 필터에 다운로드합니다.

  • 선택 가능한 계측의 수를 확장하기 위한 채널 그룹입니다. MIDI 스트림에서 타임스탬프를 각 MIDI 메시지를 패키지하는 데 사용되는 DMUS_KERNEL_EVENT 구조체는 해당 메시지에 사용할 채널 그룹을 지정합니다.

  • 하드웨어 MIDI 시퀀싱을 지원하는 100나노초 해상도의 64비트 타임스탬프를 제공합니다. DMUS_KERNEL_EVENT 구조체는 MIDI 메시지에 대한 고해상도 타임스탬프를 지정합니다.

채널 그룹을 사용하면 동시에 재생할 수 있는 노트 수가 더 이상 원래 MIDI 사양의 16개 채널로 제한되지 않습니다. 이는 신시사이저에서 사용할 수 있는 음성 수에 의해서만 제한됩니다.

DirectMusic 필터는 포트/미니포트 드라이버 쌍으로 구현됩니다. DirectMusic 필터 팩터리는 다음과 같이 DirectMusic 필터를 만듭니다.

  • DMus(DirectMusic) 미니포트 드라이버 개체를 인스턴스화합니다.

  • GUID 값이 CLSID_PortDMusPcNewPort를 호출하여 DMus 포트 드라이버 개체를 인스턴스화합니다.

  • 포트 드라이버의 IPort::Init 메서드를 호출하여 미니포트 드라이버를 포트 드라이버에 바인딩합니다.

하위 서비스 만들기의 코드 예제에서는 이 프로세스를 보여 줍니다. 포트 및 미니포트 드라이버는 IPortDMusIMiniportDMus 인터페이스를 통해 서로 통신합니다.

DirectMusic 신시사이저 디바이스를 지원하기 위해 DMus 포트 드라이버에는 시간 스탬프 MIDI 이벤트를 재생하도록 예약된 시점 전에 하드웨어 시퀀서의 버퍼에 출력할 수 있는 저해상도(1밀리초) 소프트웨어 시퀀서가 포함되어 있습니다. DirectMusic 출력 디바이스를 지원하기 위해 포트 드라이버의 소프트웨어 시퀀서가 재생될 때 원시 MIDI 메시지를 출력하도록 구성할 수도 있습니다.

MIDI 및 DirectMusic 디바이스 열거

Windows 멀티미디어 midiInXxx 또는 midiOutXxx 함수를 통해 MIDI 입력 또는 출력 디바이스를 열거하는 경우 애플리케이션은 미니포트 드라이버가 MIDI 핀을 노출하는 WDM 디바이스만 볼 수 있습니다. 원시 MIDI 스트림을 관리하지만 DLS 및 채널 그룹과 같은 고급 기능에 대한 지원이 부족한 핀입니다. 그러나 DirectMusic을 통해 디바이스를 열거하는 경우 애플리케이션은 MIDI 핀과 DirectMusic 핀이 모두 있는 WDM 디바이스를 볼 수 있습니다. DirectMusic 핀은 타임스탬프를 적용한 MIDI 스트림을 관리하고 DLS 및 채널 그룹을 지원합니다.

사용자 지정 미니포트 드라이버를 구현할 때 하드웨어 공급업체는 일반적으로 MIDI 미니포트 드라이버 또는 DMus 미니포트 드라이버를 작성하지만 둘 다 작성하지는 않습니다. MIDI 미니포트 드라이버는 MIDI 핀만 노출할 수 있습니다. 그러나 DMus 미니포트 드라이버는 MIDI 및 DirectMusic 핀을 모두 노출할 수 있으므로 별도의 MIDI 미니포트 드라이버를 작성할 필요가 없습니다. DirectMusic 필터의 MIDI 핀 예제는 WDK(Windows 드라이버 키트)의 Dmusuart 샘플 오디오 드라이버를 참조하세요.

MIDI 또는 DirectMusic 핀에 대한 데이터 범위를 지정할 때 MIDI 또는 DMus 미니포트 드라이버는 MIDI 핀 또는 DirectMusic 핀의 KSDATARANGE_SUBTYPE_DIRECTMUSIC KSDATAFORMAT_TYPE_MUSIC 형식의 주요 형식과 KSDATARANGE_SUBTYPE_MIDI 형식의 하위 폼을 지정합니다. MIDI 및 DirectMusic 핀에 대한 데이터 범위 설명자의 예는 각각 MIDI 스트림 데이터 범위DirectMusic Stream 데이터 범위에 표시됩니다.

MIDI 필터의 MIDI 핀 instance IMiniportMidiStream 인터페이스를 노출합니다. DirectMusic 필터의 MIDI 또는 DirectMusic 핀 instance IMXF 인터페이스를 노출합니다.

Windows Me/98에서 DirectMusic은 경우에 따라 동일한 MPU-401 디바이스를 두 번 열거합니다. 그 이유는 일부 하드웨어 공급업체가 MPU-401 디바이스를 레거시, WDM MIDI 이전 디바이스 및 WDM 디바이스로 노출하기 때문입니다. 레거시 디바이스의 경우 DirectMusic은 DMusic.dll Ihvaudio.dll 직접 경로를 나타내는 MPU-401 디바이스를 열거합니다. WDM 디바이스의 경우 DirectMusic은 다음 구성 요소 시퀀스로 구성된 회로 경로를 통해 동일한 MPU-401 디바이스를 열거합니다.

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. 공급업체의 미니포트 드라이버

Windows 멀티미디어 제어판(Mmsys.cpl)에 표시되는 MIDI 신시사이저의 이름은 WDM 디바이스와 동일합니다.

시스템 제공 포트 및 미니포트 드라이버

여러 시스템 제공 MIDI 및 DMus 미니포트 드라이버는 PortCls 시스템 드라이버에 기본 제공됩니다.

  • FMSynth 미니포트 드라이버는 OPL3 스타일 FM 합성을 구현하는 MIDI 디바이스에 대한 인터페이스를 제공합니다.

  • UART 미니포트 드라이버는 MPU-401 하드웨어 인터페이스가 있는 MIDI 디바이스를 지원하지만 이 드라이버는 이제 사용되지 않으며(Windows 98 Gold 이후) 기존 어댑터 드라이버에 대해서만 지원됩니다. 새 어댑터 드라이버 코드는 대신 UART를 대체하고 해당 기능의 상위 집합을 구현하는 DMusUART 미니포트 드라이버(Windows 98 SE 및 Windows Me 및 Windows 2000 이상)를 사용해야 합니다.

어댑터 드라이버는 PcNewMiniport 함수를 호출하여 시스템 제공 미니포트 드라이버에 액세스할 수 있습니다. FMSynth 및 DMusUART 미니포트 드라이버도 WDK(Windows 드라이버 키트)의 샘플 오디오 드라이버로 포함되어 있습니다. 하드웨어 공급업체는 이러한 샘플에서 소스 코드를 수정하여 드라이버를 확장하여 디바이스의 독점 기능을 관리할 수 있습니다.

DMusUART는 MIDI 및 DirectMusic 핀을 모두 노출하지만 DLS 다운로드 또는 하드웨어 시퀀싱을 지원하지 않는 DMus 미니포트 드라이버의 예입니다. 미니포트 드라이버의 DirectMusic 렌더링 핀에는 여러 KSPROPSETID_Synth 속성을 지원하는 신디사이저 노드( KSNODETYPE_SYNTHESIZER )가 있습니다. 미니포트 드라이버는 KSCATEGORY_RENDER 및 KSCATEGORY_CAPTURE 범주에 포함되지만 KSCATEGORY_SYNTHESIZER 포함되지 않습니다(내부 신시사이저가 포함되어 있지 않기 때문). 자세한 내용은 WDK의 DMusUART 샘플 오디오 드라이버를 참조하세요.

Windows XP 이상에서는 MIDI 및 DMus 포트 드라이버가 동일한 내부 소프트웨어 구현을 사용합니다. 즉,pcNewPort를 호출할 때 CLSID_PortMidi 및 CLSID_PortDMus GUID가 동일합니다. 이전 버전의 Windows용으로 작성된 애플리케이션은 MIDI 및 DMus 포트 드라이버의 통합으로 인해 동작이 변경되지 않아야 합니다.