DirectMusic DirectMusic 의 고도의 주제 하위 레벨 DLS   [목차열람] [주소복사] [슬롯비우기]
하위 레벨 DLS
 
Microsoft DirectX 9.0

하위 레벨 DLS

DLS 콜렉션을 편집하는 애플리케이션을 생성 하는 경우, 또는 실행시에 웨이브 폼 샘플로부터 음색을 생성 하는 경우는, DirectMusic 음색 개체에 캡슐화하는 일 없이, 음색 데이터를 신디사이저에 다운로드할 수 있어야 한다.

DLS 데이터를 조작하려면 , DLS 의 사양 및 파일 구조에 대한 지식이 필요하다. 이러한 정보의 더 자세한 정보는, MIDI Manufactures Association 에 문의하는 것.

미가공의 음색 데이터를 다운로드하려면 , 최초로, 다음 샘플 코드와 같이 IDirectMusicPortDownload8 인터페이스의 포인터를 얻어온다. 여기에서는, pIPort 가 IDirectMusicPort8 인터페이스에의 유효한 포인터인 것을 상정하고 있다.

IDirectMusicPortDownload **ppIDownloadPort;
 
HRESULT hr = pIPort->QueryInterface(IID_IDirectMusicPortDownload8,
    (void **) ppIDownloadPort);

HRESULT 가 S_OK 가 아닌 경우, 그 포트는 DLS 의 다운로드를 지원 하고 있지 않다.

다음에, 준비 및 다운로드해야 하는 버퍼를 식별한다. 신디사이저에 음색을 송신하려면 , 다음의 버퍼를 생성 한다.

각 버퍼에는, 고유의 식별자를 붙이지 않으면 안 된다. 이러한 식별자를 사용해, 버퍼간의 링크, 특히 리전과 웨이브 폼의 사이의 링크를 해결한다. 다운로드할 필요가 있는 버퍼수를 집계해,IDirectMusicPortDownload8::GetDLId 를 호출해, 식별자의 범위를 할당한다. 예를 들어, 1 개의 음색을 3 개의 웨이브 폼과 함께 다운로드하는 경우는, 전부 4 개의 버퍼를 다운로드해야 하기 때문에, 4 개의 식별자를 요구한다.

버퍼 마다 필요한 사이즈를 계산해, 다음에 IIDirectMusicPortDownload8::AllocateBuffer 를 호출해 그 사이즈를 할당한다. 이 메서드는, 버퍼를 나타내는 IDirectMusicDownload8 인터페이스를 돌려준다. 메모리에 액세스 하려면 ,IDirectMusicDownload8::GetBuffer 를 호출한다.

  GetBuffer 메서드는 2 개 있다.

다음에, 데이터를 버퍼에 기입한다. 각 버퍼는,DMUS_DOWNLOADINFO 구조체로 시작된다. 이 구조체에서는, 다운로드의 사이즈와 기능이 정의되고 있다. 이 구조체는, 다음의 방법으로 준비해야 한다.

DMUS_DOWNLOADINFO 구조체의 뒤에는, 항상 DMUS_OFFSETTABLE 구조체가 있다. 이 오프셋(offset) 테이블을 사용해, 데이터내의 모든 링크를 관리한다. 데이터내의 구조체가 다른 구조체를 참조하는 경우는 항상, 포인터는 아니고 정수의 인덱스 번호를 사용한다. 데이터내에 있는 참조 가능한 모든 구조체에는, 일의의 인덱스 번호를 할당할 수 있다. DMUS_OFFSETTABLE 는, 이 정수 인덱스 번호를 데이터에의 바이트 오프셋(offset)로 변환한다.

DMUS_OFFSETTABLE 의 뒤에는, 음색 데이터 또는 WAV 데이터가 있다. 음색을 다운로드하는 경우는, 데이터는 DMUS_INSTRUMENT 구조체로 시작된다. 그 이외의 경우는,DMUS_WAVE 구조체로 시작된다.

DMUS_INSTRUMENT 구조체의 뒤에 계속되는 음색 데이터는, 다음의 구조체로 구성된다.

DMUS_WAVE 구조체로 나타나는 WAV 데이터는,DMUS_WAVEDATA 구조체로 구성된다.

버퍼 모든 것을 준비할 수 있었다면,IDirectMusicPortDownload8::Download 를 사용해 다운로드한다. 최초로 웨이브 폼 버퍼를 다운로드한다. 그 결과, 웨이브 폼 버퍼가 적절한 장소에 배치되어 음색을 다운로드할 경우에 참조할 수 있다.

버퍼를 다운로드 하면, 신디사이저는 음색을 연주할 수 있는 상태가 된다. 버퍼를 다운로드한 후, 그 버퍼로 사용되고 있는 메모리에는 액세스 할 수 없게 된다.

그 후, 음색의 연주가 종료하면 버퍼의 언로드와 릴리즈를 실시한다. 최초로 음색 버퍼를 언로드해, 다음에 모든 웨이브 폼 버퍼를 언로드한다. 언로드하려면 ,IDirectMusicDownload8 포인터를 IDirectMusicPortDownload8::Unload 에 건네준다. 다음에,IDirectMusicDownload8::Release 를 호출해, 각 버퍼를 릴리즈 한다.

이미 다운로드되고 있는 음색을 갱신하는 경우, 다운로드 끝난 버퍼의 덧쓰기는 할 수 없다. 대신에, 웨이브 폼은 아니고 음색을 옮겨놓는다. 음색을 옮겨놓으려면 ,IDirectMusicPortDownload8::AllocateBuffer 를 호출해, 적절한 버퍼 사이즈를 지정해 새로운 IDirectMusicDownload8 인터페이스를 할당한다. IDirectMusicPortDownload8::GetDLId 를 호출해, 버퍼의 새로운 식별자를 생성할 필요가 있다. 새로운 아티큘레이션 정보를 버퍼에 쓰기, 버퍼를 다운로드한다. 다음에,IDirectMusicPortDownload8::Unload 를 호출해, 이전에 다운로드되고 있던 버퍼를 언로드한다.

웨이브 폼 버퍼를 갱신하는 경우는, 이제 1 개 스텝이 증가한다. 새로운 웨이브 폼 버퍼와 그 버퍼를 참조하는 갱신된 음색 버퍼의 2 개를 생성 한다. 새로운 웨이브 폼을 다운로드해, 다음에 새로운 음색을 다운로드한다. 게다가 낡은 음색과 낡은 웨이브 폼을 언로드한다.

더 자세한 정보는, 다음 주제를 참조할것.

↑TOP