ÀÌ°ÍÀº 1999³â ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡ ¿Ã·È´ø °Á 4ȸºÐ ÀÔ´Ï´Ù.
#####################################################
¾Æ·¡ÀÇ ±ÛÀº Á¦°¡ Direct X 6.0 ¿¡ ÀÖ´Â DirectMusic ¿¡ ´ëÇÑ Document¸¦ ±×³É ²ô
Àû ²ôÀû °³¿ä¸¸ Ãß·Á¼ ¹ø¿ªÇغ» °Ì´Ï´Ù.
¸¸¾à MCI¸¦ »ç¿ëÇÏ¿© MIDI¸¦ ¹è°æÀ½¾ÇÀ¸·Î ¿¬ÁÖ Çϴµ¥ Áú¸®¼Ì´ø ºÐµéÀº ÇÑ ¹ø ÀÐ
¾î º¸½Ã¸é ¾à°£ µµ¿òÀÌ µÇ½Ç °ÍÀ̶ó°í º¾´Ï´Ù.
±×·³.. SMgal...
<< DirectMusic Document >>
¢º DirectMusic À̶õ ?
* DirectMusicÀº DirectXÀÇ À½¾Ç ÄÄÆ÷³ÍÆ® API ÀÌ´Ù.
* DirectSound¿Í´Â ´Þ¸® ¸Þ½ÃÁö ±â¹ÝÀÇ À½¾Ç µ¥ÀÌÅ͸¦ °¡Áö°í ÀÛ¾÷ÇÑ´Ù.
* °Ô´Ù°¡ MIDI ¿Í DLS (Downloadable sounds) Ç¥ÁØÀ» Áö¿øÇÑ´Ù.
* ¿ª½Ã ´Ù¸¥ DirectX ÀÇ ÄÄÆ÷³ÍÆ®¿Í ¸¶Âù°¡Áö·Î COM À» ±â¹ÝÀ¸·Î ÇÑ´Ù.
* DirectMusicÀÇ ¸ðµç ±â´ÉÀº À©µµ¿ì 95, À©µµ¿ì 98, À©µµ¿ì NT 5.0 ¿¡¼ ¸ðµÎ »ç
¿ë ÀÌ °¡´ÉÇÏÁö¸¸, À©µµ¿ì 95 ÀÇ DLS ¿¡ ´ëÇÑ Çϵå¿þ¾î Áö¿øÀº µÇÁö ¾Ê´Â´Ù.
¢º ¿Ö DirectMusicÀ» »ç¿ëÇϴ°¡ ?
1. DirectMusic API ´Â Ç÷§Æû¿¡ °üÇÑ ±âº»ÀûÀÎ ¿ä±¸»çÇ×À» ´ëº¯ÇÑ´Ù.
* downloadable sounds¸¦ »ç¿ëÇÒ ¶§ ¾ÖÇø®ÄÉÀ̼ÇÀº ¸ðµç ±âÁ¾¿¡¼ °°Àº Ä«¿îÆ®
¸¦ °¡Áö°í, ¿ø·¡ µðÀÚÀÎÇÏ°íÀÚ Çß´ø ¼Óµµ¿¡ µ¿±âÈ ½ÃŲ´Ù.
* MIDI °¡ »ý¼ºÇØ ³»´Â À½¾ÇÀÇ PlayBackÀº 2ms ÀÌ´Ù.
* Çϵå¿þ¾î °¡¼ÓÀÌ Áö¿øÇÏÁö ¾Ê´Â ±â±â¿¡¼´Â ÃÖ¼Ò ´É·ü·Î ¼öÇàµÈ´Ù.
* DirectMusicÀº Àú ¼öÁØÀÇ Æ¯¼ºÀ» Á¦¾îÇÔ¿¡ ÀÖ¾î¼ Á¦ÇÑÀ» µÎÁö ¾ÊÀ¸¹Ç·Î È®Àå
¼ºÀÌ ¿ëÀÌÇÏ´Ù.
2. °Ô´Ù°¡ DirectMusicÀº ½¬¿î ÇÁ·Î±×·¥ °³¹ß°ú »ç¿ëÀÚÀÇ °æÇèÀ» dzºÎÇÏ°Ô Çϱâ
À§ÇÑ Áß¿äÇÑ Æ¯Â¡µéÀ» Á¦°øÇØ ÁØ´Ù.
* DirectMusicÀº Ç¥ÁØ MIDI ÆÄÀÏ°ú interactive music segment¿Í ¼µå ÆÄƼ ±â
¼úÀ» µ¿µîÇÏ°Ô Áö¿øÇÑ´Ù.
* µ¿½Ã¿¡ ¿©·¯ °³ÀÇ À½¾ÇÀ» ¿¬ÁÖÇÏ´Â ±â´ÉÀÌ ÀÖ´Ù.
* DirectMusicÀº 16 °³ÀÇ MIDI ä³ÎÀÇ Á¦ÇÑÀ» ¶Ù¾î³Ñ¾î, ¾î¶² ¼öÀÇ À½»öÀ̶óµµ
°¡»óÀûÀ¸·Î µ¿½Ã¿¡ ¿¬ÁÖÇÒ ¼ö ÀÖ´Ù.
* DLS ÀÇ ¾Ç±â¸¦ ÀÚµ¿À¸·Î °ü¸®ÇÑ´Ù.
* DirectMusicÀÇ ¿¬ÁÖ ¿£ÁøÀº µ¿Àû »ç¿îµåÆ®·¢À» »ý¼ºÇÏ¿© »ç¿ëµÇ¾îÁú ¼ö ÀÖ°í
µ¿ÀûÀÎ »óÈ£ playbackÀÌ °¡´ÉÇÏ´Ù.
¢º DirectMusicÀÇ ±¸Á¶ (»ý·«)
* Core and Performance Layers
* Interfaces and Objects
* DirectMusic Object Types
* DirectMusic Messages
* Downloadable Sounds
* Microsoft Software Synthesizer
¢º DirectMusic Tutorials
1. MIDI ÆÄÀÏ ¿¬ÁÖ
1) COMÀÇ ÃʱâÈ
DirectMusicÀÇÈ£ÃâÀ» Çϱâ Àü¿¡ ´ÙÀ½°ú °°Àº COMÀÇ ÃʱâÈ°¡ ÇÊ¿äÇÏ´Ù.
if (FAILED(CoInitialize(NULL)))
{
// ¾ÖÇø®ÄÉÀÌ¼Ç Á¾·á
} // ±×·¸Áö ¾Ê´Ù¸é °è¼Ó
2) ÆÛÆ÷¸Õ½º »ý¼º
DirectMusic ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á᫐ °´Ã¼°¡ 'ÆÛÆ÷¸Õ½º'ÀÌ´Ù. ±×¸®°í ±×°ÍÀº ¼¼
±×¸ÕÆ®ÀÇ playbackÀ» °ü¸®ÇÑ´Ù.
ÀÌ°ÍÀº COMÀÇ CoCreateInstance ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© »ý¼ºµÈ´Ù.
´ÙÀ½Àº ¿¹Á¦ ÇÔ¼öÀÌ´Ù.
IDirectMusicPerformance* CreatePerformance(void)
{
IDirectMusicPerformance* pPerf;
if (FAILED(CoCreateInstance(
CLSID_DirectMusicPerformance,
NULL,
CLSCTX_INPROC,
IID_IDirectMusicPerformance,
(void**)&pPerf
)))
{
pPerf = NULL;
}
return pPerf;
}
±×¸®°í ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¿© Àü¿ª ÆÛÆ÷¸Õ½º Æ÷ÀÎÅ͸¦ ÃʱâȽÃÅ°´Â ÇÔ¼ö¸¦
»ç¿ëÇÒ ¼ö ÀÖ´Ù.
IDirectMusicPerformance* g_pPerf = CreatePerformance();
ÆÛÆ÷¸Õ½º°¡ »ý¼ºµÇ°í ³ª¸é, IDirectMusicPerformance::Init ¸Þ¼Òµå¸¦ È£ÃâÇÏ
¿© ÃʱâȽÃų ÇÊ¿ä°¡ ÀÖ´Ù.
ÀÌ ¸Þ¼Òµå´Â µðÆúÆ® Æ÷Æ®¸¦ °ü¸®ÇÏ´Â DirectMusic °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
»ç¿ëÀÚ´Â Á÷Á¢ ÀÌ ¸Þ¼Òµå¿¡ Á¢±Ù ÇÒ ÇÊ¿ä°¡ ¾ø±â ¶§¹®¿¡ Init ¿¡´Â NULL À»
³Ñ°ÜÁÖ¸é µÈ´Ù.
g_pPerf->Init(NULL);
ÀÌÁ¦´Â ÆÛÆ÷¸Õ½º¿¡ Æ÷Æ®¸¦ Ãß°¡ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
IDirectMusicPerformance::AddPort ¸Þ¼Òµå¿¡ NULL ÆĶó¸ÞÅ͸¦ ³Ñ°ÜÁ༠ȣÃâ
ÇÏ°Ô µÇ¸é ÀÚµ¿ÀûÀ¸·Î ÇϳªÀÇ Ã¤³Î ±×·ìÀ» °¡Áø ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ¼ÒÇÁÆ®¿þ¾î
½Åµð»çÀÌÀú¸¦ Ãß°¡ÇÑ´Ù.
±×¸®°í ÀÌ°ÍÀº 0-15±îÁöÀÇ Ã¤³ÎÀ» ÁöÁ¤ÇÑ´Ù.
´ÙÀ½ÀÇ ¿¹Á¦¿¡¼´Â ÆÛÆ÷¸Õ½º°¡ ¼º°øÀûÀ¸·Î ÃʱâȵǾúÀ» ¶§ TRUE¸¦ ³Ñ°ÜÁÖ´Â
±¸Á¶·Î µÇ¾î ÀÖ´Ù.
BOOL InitializeSynth(IDirectMusicPerformance* pPerf)
{
BOOL fReturn = FALSE;
if (SUCCEEDED( pPerf->AddPort(NULL)))
{
fReturn = TRUE;
}
return fReturn;
}
3) ·Î´õÀÇ »ý¼º
µð½ºÅ©·ÎºÎÅÍ ¾î¶°ÇÑ °´Ã¼¸¦ ·ÎµåÇϱâ À§Çؼ DirectMusicLoader °´Ã¼°¡ ¿ì
¼±ÀûÀ¸·Î »ý¼ºµÉ ÇÊ¿ä°¡ ÀÖ´Ù.
´ÙÀ½ÀÇ ÇÔ¼ö¿¡¼ º¸À̵íÀÌ, ÀÌ°ÍÀº ´Ù¸¥ COM °´Ã¼µé°ú °°´Ù.
IDirectMusicLoader* CreateLoader(void)
{
IDirectMusicLoader* pLoader;
if (FAILED(CoCreateInstance(
CLSID_DirectMusicLoader,
NULL,
CLSCTX_INPROC,
IID_IDirectMusicLoader,
(void**)&pLoader
)))
{
pLoader = NULL;
}
return pLoader;
}
±×¸®°í ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¿© Àü¿ª º¯¼ö¸¦ ÃʱâȽÃÅ°´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
IDirectMusicLoader* g_pLoader = CreateLoader();
4) MIDI ÆÄÀÏÀÇ ·Îµù
LoadSegment´Â ¸¶Áö¸· ´Ü°è¿¡¼ »ý¼ºµÇ¾îÁö¸ç ¼¼±×¸ÕÆ® °´Ã¼¸¦ ·ÎµåÇϴµ¥
»ç¿ëµÇ´Â DirectMusicLoader¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áø´Ù.
Àü¿ª ¼¼±×¸ÕÆ® Æ÷ÀÎÅ͸¦ ÃʱâÈÇϴµ¥ ±×°ÍÀÌ »ç¿ëµÇ°í, ¼¼±×¸ÕÆ®¸¦ ¿¬ÁÖÇÏ
±â À§Çؼ ³ªÁß¿¡ ÇÊ¿äÇÏ°Ô µÉ °ÍÀÌ´Ù.
if (g_pLoader)
{
IDirectMusicSegment* g_pMIDIseg = LoadSegment(g_pLoader);
}
¾à°£ÀÇ Áö¿ª º¯¼ö¸¦ ÃʱâÈÇÑ ÈÄ¿¡, ±× ÇÔ¼ö´Â ·Î´õÀÇ ÇöÀç ã±â µð·ºÅ丮¸¦
¾ÖÇø®ÄÉÀ̼ÇÀÌ ÇöÀç ÀÛ¾÷ÇÏ°í ÀÖ´Â µð·ºÅ丮·Î ¹Ù²Ù¾î ÁØ´Ù.
IDirectMusicSegment* LoadSegment(IDirectMusicLoader* pLoader)
{
DMUS_OBJECTDESC ObjDesc;
IDirectMusicObject* pObjectSeg = NULL;
IDirectMusicSegment* pSegment = NULL;
char szDir[_MAX_PATH];
WCHAR wszDir[_MAX_PATH];
if( _getcwd( szDir, _MAX_PATH ) == NULL )
{
// ¿¡·¯°¡ ¹ß»ý.. NULL À» ¸®ÅÏ ÇÑ´Ù.
return NULL;
}
MULTI_TO_WIDE(wszDir, szDir);
pLoader->SetSearchDirectory(GUID_DirectMusicAllTypes,
wszDir, FALSE );
DMUS_OBJECTDESC ±¸Á¶·Î ·ÎµåµÇ¾îÁö´Â °´Ã¼¸¦ ¹¦»çÇÏÀÚ¸é...
ObjDesc.guidClass = CLSID_DirectMusicSegment;
ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
wcscpy( ObjDesc.wszFileName, "Tune.mid" );
ObjDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_FILENAME;
ÀÌÁ¦ °´Ã¼¸¦ ·ÎµåÇÑ´Ù. IDirectMusicSegment ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ Äõ¸®¸¦ °ÅÄ¡
°í ´Ù½Ã ÇØÁ¦µÈ´Ù.
·ÎµùÇÏ´Â °´Ã¼ ¿ª½Ã ¼¼±×¸ÕÆ®¸¦ »ý¼ºÇÏ°í, Æ®·¢ÀÇ ÃʱâÈÇϸç, ±× ¿ÜÀÇ
playback¿¡ ´ëÇÑ MIDI µ¥ÀÌÅ͸¦ ÁغñÇϱâ À§ÇÑ ¸ðµç °Í¸¦ ÇؾßÇÑ´Ù´Â Á¡¿¡
ÁÖÀÇÇÏÀÚ.
pLoader->GetObject( &ObjDesc,
IID_IDirectMusicSegment, (void**) &pSegment );
return pSegment;
} // LoadSegment() ÀÇ ³¡
5) MIDI ÆÄÀÏÀÇ ¿¬ÁÖ
¸ðµç Áغñ ÀÛ¾÷Àº ÀÌÀüÀÇ °úÁ¤¿¡¼ ¸ðµÎ ³¡³Â´Ù. ±×·¡¼ À½¾ÇÀ» ¿¬ÁÖÇÏ´Â ºÎ
ºÐÀº °£´ÜÇÏ°Ô ´ÙÀ½°ú °°´Ù.
IDirectMusicSegmentState* g_pSegState;
g_pPerf->PlaySegment(g_pMIDISeg, 0, 0, &g_pSegState);
IDirectMusicPerformance::PlaySegment È£Ãâ ½ÃÀÇ ÆĶó¸ÞÅÍ´Â ´ÙÀ½°ú °°´Ù.
* ÀÌÀü °úÁ¤¿¡¼ ¸¸µé¾ú´ø ¼¼±×¸ÕÆ®
* ŸÀÌ¹Ö Ç÷¡±×ÀÇ ÁýÇÕ°ú ½ÃÀÛ ½Ã°£
* ¼¼±×¸ÕÆ® ½ºÅ×ÀÌÆ® °´Ã¼ÀÇ Æ÷ÀÎÅÍ ÁÖ¼Ò. ( ¼¼±×¸ÕÆ®¿¡ °üÇÑ Á¤º¸¸¦ °¡Á®¿À
±â À§ÇØ ¸®ÅÏµÈ Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¼¼±×¸ÕÆ® ½ºÅ×ÀÌÆ®°¡ ÇÊ¿ä
¾ø´Ù¸é NULL·ÎÇÑ´Ù. )
¸¸¾à ÇÑ ¹ø ÀÌ»óÀ¸·Î ÆÄÀÏÀ» ¿¬ÁÖÇÏ·Á¸é PlaySegment¸¦ È£ÃâÇϱâ ÀÌÀü¿¡
IDirectMusicSegment::SetRepeats ¸Þ¼Òµå¸¦ ¸ÕÀú È£ÃâÇØ¾ß ÇÑ´Ù.
¶ÇÇÑ ¿¬ÁÖ°¡ ³¡³ª±â ÀüÀ̳ª ¹Ýº¹ ¿¬ÁÖ¸¦ ¸ØÃß°Ô ÇÏ·Á¸é IDirectMusicPerform
ance::Stop ¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é µÈ´Ù.
ÀÌ ¸Þ¼Òµå¸¦ °¡Àå °£´ÜÇÑ ¹æ¹ýÀ¸·Î »ç¿ëÇϸé, ÇöÀç ¿¬ÁֵǴ ¸ðµç À½¾ÇÀ» ¹Ù
·Î ¸ØÃß°Ô ÇÑ´Ù.
g_pPerf->Stop(NULL, NULL, 0, 0)
ÇÏÁö¸¸, ´ÜÁö ÇϳªÀÇ ¼¼±×¸ÕÆ® ¶Ç´Â ±× ¼¼±×¸ÕÆ®ÀÇ ÇϳªÀÇ ÀνºÅϽº¸¦ ¸ØÃß
°Ô Çϱâ À§Çؼ´Â ÇöÀçÀÇ ¼¼±×¸ÕÆ® ¶Ç´Â ¼¼±×¸ÕÆ® ½ºÅ×ÀÌÆ®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦
³Ñ°ÜÁÖ¸é µÈ´Ù.
6) DirectMusic Á¾·á
Á¾·áÇϱâ ÀÌÀü¿¡, ÇÁ·Î±×·¥Àº ÆÛÆ÷¸Õ½º¸¦ ÁߴܽÃÄÑ¾ß ÇÏ°í »ý¼ºµÈ ¸ðµç °´Ã¼
µéÀ» ÇØÁ¦ÇÏ¿©¾ß Çϸç COM ·¹ÆÛ·±½º ÇØÁ¦¸¦ ÇؾßÇÑ´Ù.
( CoInitialize¸¦ È£ÃâÇÑ ¸¸Å ´ëÀÀÇÏ´Â CoUninitialize °¡ ÀÖ¾î¾ß ÇÑ´Ù´Â
°ÍÀ» ¸í½ÉÇÏÀÚ. )
´ÙÀ½ÀÇ ÇÔ¼ö´Â ÇÊ¿äÇÑ Á¦°Å °úÁ¤À» ¼öÇàÇÑ´Ù.
HRESULT FreeDirectMusic()
{
// ¼¼±×¸ÕÆ® ÇØÁ¦
g_pMIDISeg->Release();
// ¿¬Áֵǰí ÀÖ´Â À½¾ÇÀÌ ÀÖ´Ù¸é ¸ðµÎ ¸ØÃá´Ù.
g_pPerf->Stop( NULL, NULL, 0, 0 );
// ÆÛÆ÷¸Õ½º °´Ã¼¸¦ ´Ý°í ÇØÁ¦ÇÑ´Ù.
g_pPerf->CloseDown();
g_pPerf->Release();
// ·Î´õ °´Ã¼¸¦ ÇØÁ¦ÇÑ´Ù.
g_pLoader->Release();
// COMÀ» ÇØÁ¦ÇÑ´Ù.
CoUninitialize();
return S_OK;
}
#####################################################
------------------------------------------------------------------------
### µ¨ÆÄÀÌ·Î ÇÏ´Â Direct X - Direct Music (1/3)
1. Direct Music ÀÇ °³¿ä
~~~~~~~~~~~~~~~~~~~~~~~
2. Direct
Music ÃʱâÈ¿Í MIDI Àбâ
3. Direct Music Ãâ·Â
------------------------------------------------------------------------
ÀÛ¼ºÀÚ
: ¾È¿µ±â ( HiTEL ID : SMgal )
------------------------------------------------------------------------
(1) Direct Music À̶õ ¹«¾ùÀΰ¡ ?
¾Æ·¡ÀÇ ±ÛÀº Á¦°¡ Direct X 6.0 ¿¡ ÀÖ´Â Direct Music ¿¡ ´ëÇÑ Document¸¦
°³
¿ä¸¸ Ãß·Á¼ ¹ø¿ªÇØ º» °ÍÀÌ´Ù. ±×¸®°í ±× ¾ÈÀÇ C ¼Ò½º´Â ´Ù½Ã ÆĽºÄ®·Î ¹ø¿ª
Çß´Ù. ( Á¦ÀÏ Ã³À½ Direct Music ÀÌ
¼Ò°³µÇ¾ú´ø ´ç½Ã¿¡ ¾´ ±ÛÀ̶ó 6.0 ±âÁØÀÓ
)
<< Direct Music Document >>
¢º Direct Music À̶õ ?
- Direct Music Àº DirectX ÀÇ À½¾Ç ÄÄÆ÷³ÍÆ® API ÀÌ´Ù.
- Direct
Sound ¿Í´Â ´Þ¸® ¸Þ½ÃÁö ±â¹ÝÀÇ À½¾Ç µ¥ÀÌÅ͸¦ °¡Áö°í ÀÛ¾÷ÇÑ´Ù.
- °Ô´Ù°¡ MIDI ¿Í DLS (Downloadable
sounds) Ç¥ÁØÀ» Áö¿øÇÑ´Ù.
- ¿ª½Ã ´Ù¸¥ DirectX ÀÇ ÄÄÆ÷³ÍÆ®¿Í ¸¶Âù°¡Áö·Î COM À» ±â¹ÝÀ¸·Î ÇÑ´Ù.
-
Direct Music ÀÇ ¸ðµç ±â´ÉÀº À©µµ¿ìÁî 95, À©µµ¿ìÁî 98, À©µµ¿ìÁî NT
5.0 ¿¡¼ ¸ðµÎ »ç¿ëÀÌ °¡´ÉÇÏÁö¸¸,
À©µµ¿ìÁî 95 ÀÇ DLS ¿¡ ´ëÇÑ Çϵå¿þ¾î
Áö¿øÀº µÇÁö ¾Ê´Â´Ù.
¢º ¿Ö Direct MusicÀ» »ç¿ëÇϴ°¡ ?
1. Direct Music API ´Â Ç÷§Æû¿¡ °üÇÑ ±âº»ÀûÀÎ ¿ä±¸»çÇ×À» ´ëº¯ÇÑ´Ù.
- downloadable sounds¸¦ »ç¿ëÇÒ ¶§ ¾ÖÇø®ÄÉÀ̼ÇÀº ¸ðµç ±âÁ¾¿¡¼ °°Àº Ä«
¿îÆ®¸¦ °¡Áö°í, ¿ø·¡ µðÀÚÀÎÇÏ°íÀÚ Çß´ø ¼Óµµ¿¡ µ¿±âÈ ½ÃŲ´Ù.
- MIDI °¡ »ý¼ºÇØ ³»´Â À½¾ÇÀÇ Play Back Àº
2ms ÀÌ´Ù.
- Çϵå¿þ¾î °¡¼ÓÀÌ Áö¿øÇÏÁö ¾Ê´Â ±â±â¿¡¼´Â ÃÖ¼Ò ´É·ü·Î ¼öÇàµÈ´Ù.
- Direct Music Àº Àú ¼öÁØÀÇ
Ư¼ºÀ» Á¦¾îÇÔ¿¡ ÀÖ¾î¼ Á¦ÇÑÀ» µÎÁö ¾ÊÀ¸¹Ç
·Î È®À强ÀÌ ¿ëÀÌÇÏ´Ù.
2. °Ô´Ù°¡ Direct Music Àº ½¬¿î ÇÁ·Î±×·¥ °³¹ß°ú »ç¿ëÀÚÀÇ °æÇèÀ» dzºÎÇÏ
°Ô Çϱâ
À§ÇÑ Áß¿äÇÑ Æ¯Â¡µéÀ» Á¦°øÇØ ÁØ´Ù.
- Direct MusicÀº Ç¥ÁØ MIDI ÆÄÀÏ°ú interactive music segment ¿Í ¼µå
ÆÄ
Ƽ ±â¼úÀ» µ¿µîÇÏ°Ô Áö¿øÇÑ´Ù.
- µ¿½Ã¿¡ ¿©·¯ °³ÀÇ À½¾ÇÀ» ¿¬ÁÖÇÏ´Â ±â´ÉÀÌ ÀÖ´Ù.
- Direct Music˼
16 °³ÀÇ MIDI ä³ÎÀÇ Á¦ÇÑÀ» ¶Ù¾î³Ñ¾î, ¾î¶² ¼öÀÇ À½»öÀÌ
¶óµµ °¡»óÀûÀ¸·Î µ¿½Ã¿¡ ¿¬ÁÖÇÒ ¼ö ÀÖ´Ù.
- DLS ÀÇ
¾Ç±â¸¦ ÀÚµ¿À¸·Î °ü¸®ÇÑ´Ù.
- Direct Music ÀÇ ¿¬ÁÖ ¿£ÁøÀº µ¿Àû »ç¿îµåÆ®·¢À» »ý¼ºÇÏ¿© »ç¿ëµÇ¾îÁú ¼ö
ÀÖ°í
µ¿ÀûÀÎ »óÈ£ playback ÀÌ °¡´ÉÇÏ´Ù.
¢º DirectMusic Tutorials
1. MIDI ÆÄÀÏ ¿¬ÁÖ
1) COMÀÇ ÃʱâÈ
Direct MusicÀÇ È£ÃâÀ» Çϱâ Àü¿¡ ´ÙÀ½°ú °°Àº COMÀÇ ÃʱâÈ°¡ ÇÊ¿äÇÏ´Ù.
if CoInitialize(nil) <> S_OK then
begin
// ¾ÖÇø®ÄÉÀÌ¼Ç Á¾·á
end;
// ±×·¸Áö ¾Ê´Ù¸é °è¼Ó
2) ÆÛÆ÷¸Õ½º »ý¼º
Direct Music ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á᫐ °´Ã¼°¡ 'ÆÛÆ÷¸Õ½º'ÀÌ´Ù. ±×¸®°í ±×°Í
˼
¼¼±×¸ÕÆ®ÀÇ play backÀ» °ü¸®ÇÑ´Ù.
ÀÌ°ÍÀº COMÀÇ CoCreateInstance ÇÔ¼ö¸¦ »ç¿ëÇÏ¿©
»ý¼ºµÈ´Ù.
´ÙÀ½Àº ¿¹Á¦ ÇÔ¼öÀÌ´Ù.
function CreatePerformance :
IDirectMusicPerformance;
var
pPerf :
IDirectMusicPerformance;
begin
if
CoCreateInstance(
CLSID_DirectMusicPerformance,
nil,
CLSCTX_INPROC,
IID_IDirectMusicPerformance,
pPerf
)
<> S_OK then begin
pPerf :=
nil;
end;
CreatePerformance :=
pPerf;
end;
±×¸®°í ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¿© Àü¿ª ÆÛÆ÷¸Õ½º Æ÷ÀÎÅ͸¦ ÃʱâȽÃÅ°´Â ÇÔ
¼ö¸¦ »ç¿ëÇÒ ¼ö
ÀÖ´Ù.
var
g_pPerf :
IDirectMusicPerformance;
........
g_pPerf :=
CreatePerformance;
ÆÛÆ÷¸Õ½º°¡ »ý¼ºµÇ°í ³ª¸é, IDirectMusicPerformance.Init ¸Þ½îµå¸¦
È£
ÃâÇÏ¿© ÃʱâȽÃų ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ ¸Þ½îµå´Â µðÆúÆ® Æ÷Æ®¸¦ °ü¸®ÇÏ´Â
Direct Music °´Ã¼¸¦
»ý¼ºÇÑ´Ù. »ç¿ëÀÚ´Â Á÷Á¢ ÀÌ ¸Þ½îµå¿¡ Á¢±Ù ÇÒ ÇÊ
¿ä°¡ ¾ø±â ¶§¹®¿¡ Init ¿¡´Â nilL À» ³Ñ°ÜÁÖ¸é
µÈ´Ù.
g_pPerf.Init(nil);
ÀÌÁ¦´Â ÆÛÆ÷¸Õ½º¿¡ Æ÷Æ®¸¦ Ãß°¡ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
IDirectMusicPerformance.AddPort ¸Þ½îµå¿¡ nil ÆĶó¸ÞÅ͸¦ ³Ñ°ÜÁà¼
È£
ÃâÇÏ°Ô µÇ¸é ÀÚµ¿ÀûÀ¸·Î ÇϳªÀÇ Ã¤³Î ±×·ìÀ» °¡Áø ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ¼ÒÇÁ
Æ®¿þ¾î ½Åµð»çÀÌÀú¸¦ Ãß°¡ÇÑ´Ù. ±×¸®°í
ÀÌ°ÍÀº 0-15±îÁöÀÇ Ã¤³ÎÀ» ÁöÁ¤
ÇÑ´Ù.
´ÙÀ½ÀÇ ¿¹Á¦¿¡¼´Â ÆÛÆ÷¸Õ½º°¡ ¼º°øÀûÀ¸·Î ÃʱâȵǾúÀ» ¶§ TRUE¸¦ ³Ñ°Ü
ÁÖ´Â ±¸Á¶·Î µÇ¾î
ÀÖ´Ù.
function InitializeSynth(pPerf :
IDirectMusicPerformance)
:
Boolean;
var
fReturn :
Boolean;
begin
fReturn := FALSE;
if
pPerf->AddPort(nil) = S_OK then begin
fReturn :=
TRUE;
end;
InitializeSynth :=
fReturn;
end;
3) ·Î´õÀÇ »ý¼º
µð½ºÅ©·ÎºÎÅÍ ¾î¶°ÇÑ °´Ã¼¸¦ ·ÎµåÇϱâ À§Çؼ DirectMusicLoader
°´Ã¼°¡
¿ì¼±ÀûÀ¸·Î »ý¼ºµÉ ÇÊ¿ä°¡ ÀÖ´Ù.
´ÙÀ½ÀÇ ÇÔ¼ö¿¡¼ º¸À̵íÀÌ, ÀÌ°ÍÀº ´Ù¸¥ COM °´Ã¼µé°ú
°°´Ù.
function CreateLoader :
IDirectMusicLoader;
var
pLoader :
IDirectMusicLoader;
begin
if
CoCreateInstance(
CLSID_DirectMusicLoader,
nil,
CLSCTX_INPROC,
IID_IDirectMusicLoader,
pLoader
)
<> S_OK then begin
pLoader :=
nil;
end;
CreateLoader :=
pLoader;
end;
±×¸®°í ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¿© Àü¿ª º¯¼ö¸¦ ÃʱâȽÃÅ°´Â ÇÔ¼ö¸¦
»ç¿ëÇÑ
´Ù.
var
g_pLoader :
IDirectMusicLoader;
........
g_pLoader :=
CreateLoader;
4) MIDI ÆÄÀÏÀÇ ·Îµù
LoadSegment´Â ¸¶Áö¸· ´Ü°è¿¡¼ »ý¼ºµÇ¾îÁö¸ç ¼¼±×¸ÕÆ® °´Ã¼¸¦ ·ÎµåÇÏ´Â
µ¥ »ç¿ëµÇ´Â
DirectMusicLoader¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áø´Ù.
Àü¿ª ¼¼±×¸ÕÆ® Æ÷ÀÎÅ͸¦ ÃʱâÈÇϴµ¥ ±×°ÍÀÌ »ç¿ëµÇ°í, ¼¼±×¸ÕÆ®¸¦ ¿¬
ÁÖÇϱâ À§Çؼ ³ªÁß¿¡ ÇÊ¿äÇÏ°Ô µÉ °ÍÀÌ´Ù.
var
g_pMIDIseg :
IDirectMusicSegment;
..........
if Assigned(g_pLoader) then
begin
g_pMIDIseg := LoadSegment(g_pLoader);
end;
¾à°£ÀÇ Áö¿ª º¯¼ö¸¦ ÃʱâÈÇÑ ÈÄ¿¡, ±× ÇÔ¼ö´Â ·Î´õÀÇ ÇöÀç ã±â µð·ºÅä
¸®¸¦
¾ÖÇø®ÄÉÀ̼ÇÀÌ ÇöÀç ÀÛ¾÷ÇÏ°í ÀÖ´Â µð·ºÅ丮·Î ¹Ù²Ù¾î ÁØ´Ù.
function LoadSegment(pLoader :
IDirectMusicLoader)
:
IDirectMusicSegment;
var
ObjDesc :
TDMUS_OBJECTDESC;
pObjectSeg :
IDirectMusicObject;
pSegment :
IDirectMusicSegment;
szDir : array [0.._MAX_PATH] of
CHAR;
wszDir : array [0.._MAX_PATH] of
WCHAR;
begin
pObjectSeg := nil;
pSegment :=
nil;
if _getcwd(szDir,_MAX_PATH) = nil then
begin
(* ¿ªÀÚÁÖ. _getcwd() ´Â C ¿¡¼ path¸¦ ±¸Çϴ ǥÁØ
ÇÔ¼öÀÌ´Ù.
µ¨ÆÄÀÌ¿¡¼´Â ExtractFilePath() ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é °°Àº
°á°ú¸¦
¾ò´Â´Ù *)
// ¿¡·¯°¡ ¹ß»ý.. NULL À» ¸®ÅÏ
ÇÑ´Ù.
LoadSegment :=
nil;
Exit;
end;
MULTI_TO_WIDE(wszDir,szDir);
pLoader.SetSearchDirectory(GUID_DirectMusicAllTypes,
wszDir,FALSE
);
DMUS_OBJECTDESC ±¸Á¶·Î ·ÎµåµÇ¾îÁö´Â °´Ã¼¸¦
¹¦»çÇÏÀÚ¸é...
ObjDesc.guidClass =
CLSID_DirectMusicSegment;
ObjDesc.dwSize =
sizeof(TDMUS_OBJECTDESC);
wcscpy(ObjDesc.wszFileName,'Tune.mid');
ObjDesc.dwValidData
= DMUS_OBJ_CLASSor or DMUS_OBJ_FILENAME;
ÀÌÁ¦
°´Ã¼¸¦ ·ÎµåÇÑ´Ù. IDirectMusicSegment ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ Äõ¸®¸¦
°ÅÄ¡°í ´Ù½Ã ÇØÁ¦µÈ´Ù. ·ÎµùÇÏ´Â °´Ã¼ ¿ª½Ã
¼¼±×¸ÕÆ®¸¦ »ý¼ºÇÏ°í, Æ®·¢
ÀÇ ÃʱâÈÇϸç, ±× ¿ÜÀÇ playback¿¡ ´ëÇÑ MIDI µ¥ÀÌÅ͸¦ ÁغñÇϱâ À§ÇÑ
¸ðµç
°ÍÀ» ÇؾßÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇÏÀÚ.
pLoader.GetObject(ObjDesc,IID_IDirectMusicSegment,pSegment
);
LoadSegment := pSegment;
} // LoadSegment() ÀÇ
³¡
5) MIDI ÆÄÀÏÀÇ ¿¬ÁÖ
¸ðµç Áغñ ÀÛ¾÷Àº ÀÌÀüÀÇ °úÁ¤¿¡¼ ¸ðµÎ ³¡³Â´Ù. ±×·¡¼ À½¾ÇÀ» ¿¬ÁÖÇÏ
´Â ºÎºÐÀº
°£´ÜÇÏ°Ô ´ÙÀ½°ú °°´Ù.
var
g_pSegState :
IDirectMusicSegmentState;
begin
g_pPerf.PlaySegment(g_pMIDISeg,0,0,g_pSegState);
IDirectMusicPerformance.PlaySegment() È£Ãâ ½ÃÀÇ ÆĶó¸ÞÅÍ´Â
´ÙÀ½°ú
°°´Ù.
* ÀÌÀü °úÁ¤¿¡¼ ¸¸µé¾ú´ø ¼¼±×¸ÕÆ®
* ŸÀÌ¹Ö Ç÷¡±×ÀÇ ÁýÇÕ°ú ½ÃÀÛ ½Ã°£
* ¼¼±×¸ÕÆ® ½ºÅ×ÀÌÆ® °´Ã¼ÀÇ Æ÷ÀÎÅÍ ÁÖ¼Ò. ( ¼¼±×¸ÕÆ®¿¡ °üÇÑ Á¤º¸¸¦ °¡
Á®¿À±â À§ÇØ ¸®ÅÏµÈ Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ
¼ö ÀÖ´Ù. ¸¸¾à ¼¼±×¸ÕÆ® ½ºÅ×ÀÌ
Æ®°¡ ÇÊ¿ä ¾ø´Ù¸é nil ·ÎÇÑ´Ù. )
¸¸¾à ÇÑ ¹ø ÀÌ»óÀ¸·Î ÆÄÀÏÀ» ¿¬ÁÖÇÏ·Á¸é PlaySegment¸¦ È£ÃâÇϱâ
ÀÌÀü¿¡
IDirectMusicSegment.SetRepeats() ¸Þ½îµå¸¦ ¸ÕÀú È£ÃâÇØ¾ß ÇÑ´Ù.
¶ÇÇÑ ¿¬ÁÖ°¡ ³¡³ª±â ÀüÀ̳ª ¹Ýº¹ ¿¬ÁÖ¸¦ ¸ØÃß°Ô
ÇÏ·Á¸é
DirectMusicPerformance.Stop() ¸Þ½îµå¸¦ È£ÃâÇÏ¸é µÈ´Ù.
ÀÌ ¸Þ½îµå¸¦ °¡Àå °£´ÜÇÑ
¹æ¹ýÀ¸·Î »ç¿ëÇϸé, ÇöÀç ¿¬ÁֵǴ ¸ðµç À½¾Ç
À» ¹Ù·Î ¸ØÃß°Ô ÇÑ´Ù.
g_pPerf.Stop(nil,nil,0,0);
ÇÏÁö¸¸, ´ÜÁö ÇϳªÀÇ ¼¼±×¸ÕÆ® ¶Ç´Â ±× ¼¼±×¸ÕÆ®ÀÇ ÇϳªÀÇ ÀνºÅϽº¸¦
¸ØÃß°Ô Çϱâ
À§Çؼ´Â ÇöÀçÀÇ ¼¼±×¸ÕÆ® ¶Ç´Â ¼¼±×¸ÕÆ® ½ºÅ×ÀÌÆ®¿¡ ´ëÇÑ
Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ¸é µÈ´Ù.
6) DirectMusic Á¾·á
Á¾·áÇϱâ ÀÌÀü¿¡, ÇÁ·Î±×·¥Àº ÆÛÆ÷¸Õ½º¸¦ ÁߴܽÃÄÑ¾ß ÇÏ°í »ý¼ºµÈ ¸ðµç
°´Ã¼µéÀ» ÇØÁ¦ÇÏ¿©¾ß
Çϸç COM ·¹ÆÛ·±½º ÇØÁ¦¸¦ ÇؾßÇÑ´Ù.
( CoInitialize¸¦ È£ÃâÇÑ ¸¸Å ´ëÀÀÇÏ´Â CoUninitialize °¡ ÀÖ¾î¾ß
ÇÑ´Ù
´Â °ÍÀ» ¸í½ÉÇÏÀÚ. )
´ÙÀ½ÀÇ ÇÔ¼ö´Â ÇÊ¿äÇÑ Á¦°Å °úÁ¤À» ¼öÇàÇÑ´Ù.
funtion FreeDirectMusic :
HRESULT;
begin
// ¼¼±×¸ÕÆ®
ÇØÁ¦
g_pMIDISeg.Release;
// ¿¬Áֵǰí ÀÖ´Â À½¾ÇÀÌ ÀÖ´Ù¸é ¸ðµÎ
¸ØÃá´Ù.
g_pPerf.Stop(nil,nil,0,0);
// ÆÛÆ÷¸Õ½º °´Ã¼¸¦ ´Ý°í
ÇØÁ¦ÇÑ´Ù.
g_pPerf.CloseDown;
g_pPerf.Release;
// ·Î´õ °´Ã¼¸¦
ÇØÁ¦ÇÑ´Ù.
g_pLoader.Release;
// COMÀ»
ÇØÁ¦ÇÑ´Ù.
CoUninitialize;
FreeDirectMusic :=
S_OK;
end;
------------------------------------------------------------------------
(2) DLS ¶õ ¹«¾ùÀΰ¡ ?
¿¹Àü¿¡´Â ´ëºÎºÐÀÇ ÄÄÇ»ÅÍ À½¾ÇÀº ÀüÇô ´Ù¸¥ µÎ °¡ÁöÀÇ ¹æ¹ý ÁßÀÇ Çϳª·Î ¸¸
µé¾î Á³´Ù. ±× µÎ °¡Áö´Â
°¢°¢ ÀåÁ¡°ú ´ÜÁ¡ÀÌ ÀÖ¾ú´Âµ¥...
¿þÀ̺ê Çü½ÄÀº µðÁöÅ» »ùÇøµÀ¸·ÎºÎÅÍ Àç»ý»êµÇ¾îÁö¸ç ÀüÇüÀûÀ¸·Î *.wav ¶ó´Â
ÆÄÀÏÀ̳ª CD Æ®·¢ÀÇ À½¾Ç
°°Àº °ÍÀÌ´Ù. µðÁöÅ» »ùÇõéÀº ¾î¶°ÇÑ »ç¿îµå¶óµµ
Àç»ý»ê ÇÒ ¼ö ÀÖÀ¸¸ç, Ãâ·Â ¿ª½Ã ¸ðµç »ç¿îµå Ä«µå¿¡¼ À¯»çÇÑ ¹æ½ÄÀ¸·Î
Ãâ·Â
°¡´ÉÇÏ´Ù. ±×·¯³ª ¿þÀ̺ê Çü½ÄÀº ÀúÀå °ø°£ÀÌ ¸¹ÀÌ ÇÊ¿äÇÏ°í ¸®¼Ò½º°¡ Ä¿Áø´Ù
´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
¾Ç±â À½¾ÇÀÇ MIDI ¹æ½ÄÀº º¸Åë Çϵå¿þ¾îÀûÀ¸·Î ÇÕ¼ºµÇ¾îÁö¸ç ¸Þ¼¼Áö¿¡ ¹ÝÀÀÇÏ
´Â ¹æ½ÄÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
MIDI ÆÄÀÏÀº ¿ë·®µµ ÀÛ°í ¸®¼Ò½ºµµ ¸Å¿ì ÀÛ¾ÆÁø
´Ù. ±×·¯³ª ½Åµð»çÀÌÀú ³»ÀÇ Á¦³Ê·² MIDI ·Î´Â ¾Ç±âÀÇ ¼ö¿¡ Á¦ÇÑÀÌ ÀÖ°í,
´Ù
¸¥ ½Ã½ºÅÛÀ¸·Î °¡¸é Ãâ·Â À½ÀÌ ´Þ¶óÁ® ¹ö¸®´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù.
MIDI ÀÇ °£°á¼º°ú À¯¿¬¼ºÀ» °¡Áö¸é¼ µðÁöÅ» »ùÇøµÀÇ ÀåÁ¡À» °áÇÕÇÏ´Â ÇÑ °¡
Áö ¹æ¹ý¿¡´Â µðÁöÅ»
»ùÇøµÀ¸·Î MIDI ÀÇ ¾Ç±â¸¦ ¿þÀ̺ê·Î ÇÕ¼ºÇÏ´Â °ÍÀÌ´Ù.
ÀÌµé »ùÇõéÀº ½ÇÁ¦ ¾Ç±âÀÇ ³ìÀ½À¸·Î ¾òÀ» ¼ö°¡ Àִµ¥ ±×°ÍÀº Çϵå¿þ¾î
»ó¿¡
ÀúÀåµÈ´Ù. ÀÌ »ùÇõéÀº À½ÀÇ ÇÇÄ¡ ±æÀÌ¿Í º¼·ýÀ» °¡º¯ÀûÀ¸·Î »ý¼ºÇÏ´Â ¹æ¹ýÀ¸
·Î Á¶ÀýµÇ¾î Áø´Ù.
¿þÀ̺ê Å×À̺í ÇÕ¼º ¹æ½ÄÀº FM ( ÁÖÆļö º¯Á¶ ) ÇÕ¼ºº¸´Ùµµ ´õ »ç½ÇÀûÀÎ À½»ö
À» ¸¸µé¾î ³½´Ù. ±×·¯³ª
¿©ÀüÈ÷ ¾Ç±â Á¾·ù¿Í °³¼ö¿¡´Â Á¦ÇÑÀÌ µû¸¥´Ù. ±×·¡¼
ƯÀÌÇÑ ¾Ç±âÀÏ ¼ö·Ï Çϵå¿þ¾î¿¡ µû¶ó À½ÀÌ ´Ù¸£°Ô ³ª¿Ã ¼ö°¡ Àִµ¥, ÁÖ·Î Á¦
Á¶
ȸ»çÀÇ ¾Ç±â¿¡ µû¶ó ´Þ¶óÁø´Ù.
ÀÌ·± Á¦ÇÑÀ» ±Øº¹Çϱâ À§Çؼ DLS ( downloadable sounds ) ÀÇ Ç¥ÁØÀÌ
MIDI
Á¦Á¶¾÷ÀÚ Çùȸ¿¡¼ Á¦Á¤µÇ¾î Á³´Ù. DLS ´Â ½Ã½ºÅÛ »óÀÇ Çϵå¿þ¾îÀû ±¸¼ºº¸´Ù
´Â, ½ÇÇà ½Ã°£¿¡ Á¦°øµÇ´Â »ùÇÿ¡ ±âÃÊÇؼ
¿þÀ̺긦 ÇÕ¼ºÇÏ´Â ¹æ½ÄÀ» ÃëÇÏ°í
ÀÖ´Ù.
¾Ç±âÀÇ µ¥ÀÌÅÍ ¼¼ºÎ´Â ½Åµð»çÀÌÁî¿¡¼ ´Ù¿î·Îµù ¹Þ´Â´Ù. ±×·¡¼ ±× ¾Ç±â´Â ´Ù
¸¥ MIDI ¾Ç±â¿Í À¯»çÇÏ°Ô
¿¬ÁÖµÉ ¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé DLS µ¥ÀÌÅÍ´Â ¾ÖÇø®ÄÉÀÌ
¼ÇÀÇ ÇÑ ºÎºÐÀ¸·Î ¹èÆ÷µÉ ¼ö°¡ ÀÖ°í, °³¹ßÀÚµéÀº »ç¿îµå Æ®·¢ÀÌ ¸ðµç
½Ã½ºÅÛ
¿¡¼ µ¿ÀÏÇÑ À½À» ³¾ ¼ö ÀÖ´Ù´Â º¸ÀåÀ» ¹Þ´Â °ÍÀÌ´Ù. ±×¸®°í ´õ ÀÌ»ó ¾Ç±â ¼±
Åÿ¡ ÀÖ¾î¼ÀÇ Á¦ÇÑÀ» ¹ÞÁö ¾Ê°Ô
µÈ´Ù.
DLS ¾Ç±â´Â Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ µðÁöÅ» »ùÇ÷κÎÅÍ »ý¼ºµÇ¾î Áö´Âµ¥, ÀϹÝÀû
À¸·Î ´ÜÀÏ ÇÇÄ¡·Î ±¸¼ºµÇ¸ç
´Ù¸¥ ÇÇÄ¡¸¦ »ý¼ºÇÏ´Â ÇÕ¼º±â¿¡ ÀÇÇؼ Á¶ÀýµÇ¾î
Áø´Ù.
´ÙÁß »ùÇÃÀº Çö½ÇÀûÀÎ ³ÐÀº ¹üÀ§ÀÇ ÇÇÄ¡ÀÇ ¾Ç±â À½À» ¸¸µå´Âµ¥ ÁÖ·Î »ç¿ëµÈ´Ù.
DLS ¾Ç±â°¡ ´Ù¿î·Îµù
µÇ¾úÀ» ¶§, °¢°¢ÀÇ »ùÇÃÀº ÇÇÄ¡ÀÇ ¾î¶°ÇÑ ¹üÀ§·Î ÁöÁ¤µÇ
´Âµ¥ ÀÌ°ÍÀº ¿µ¿ª(region)À̶ó°í Çϸç Àû¾îµµ 16 °³ÀÇ ¿µ¿ªÀÌ
ÀÖ´Ù.
°Ô´Ù°¡, »ùÇõéÀº Á¶À½ÀÌ ÁÖ¾îÁú ¼ö Àִµ¥ attack ( ºü¸£°Ô ÃÖ´ë º¼·ýÀ¸·Î
À½Á¤ÀÌ ¶Ù´Â Á¤µµ )
À̳ª decay ( ºü¸£°Ô ÃÖ´ë º¼·ý¿¡¼ ¶³¾îÁö´Â Á¤µµ ) °°
Àº °ÍÀ» Á¤ÀÇ ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ´Ù¸¥ Ư¼ºµéÀº ½ÇÁ¦ ¾Ç±â¿¡ ÀÇÇؼ
¸¸µé¾î
Áö´Â °Í°ú À¯»çÇÑ ¹æ¹ýÀ¸·Î À½À» ¸¸µç´Ù.
DLS ´Â ½Åµð»çÀÌÀú¿¡¼ ´Ù¿î·ÎµùÇÑ ¾Ç±âÀÇ ÁýÇÕÀ¸·Î ÀúÀåµÈ´Ù.
DLS ¾Ç±â´Â ÆÐÄ¡ ³Ñ¹ö°¡ ÁÖ¾îÁö¸ç ´Ù¸¥ MIDI ¾Ç±â°¡ ÇÏ´Â °Íó·³ MIDI ¸Þ½ÃÁö
¿¡ ÀÀ´äÇÑ´Ù.
±×·¯³ª DLS ¾Ç±â´Â Á¦³Ê·² MIDI ¼¼Æ®¿¡ ÇÑÁ¤ Áö¾îÁ®¼´Â ¾È µÈ
´Ù. »ç½Ç, ±×°ÍÀÌ ¾Ç±â·Î¼¸¸ ´ëÇ¥µÇ¾îÁ®¼´Â ¾ÈµÇ±â ¶§¹®ÀÌ´Ù.
¿Ö³ÄÇϸé À½
¼ºÀÇ ºÎºÐÀ̳ª, ¿ÏÀüÈ÷ À½¾ÇÀ¸·Î ±¸¼ºµÈ °ÍÀ̳ª ÇÒ °Í ¾øÀÌ ¸ðµÎ DLS ¾Ç±â·Î
¹Ù²î¾îÁú ¼ö ÀÖ±â
¶§¹®ÀÌ´Ù.
DLS ¿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸¸¦ ¿øÇϰųª ¾î¶»°Ô ¾Ç±â°¡ ¸¸µé¾îÁö´Â °¡¸¦ º¸·Á¸é
Direct Music
Producer ÀÇ µµÅ¥¸àÆ®¸¦ º¸¸é µÈ´Ù.
------------------------------------------------------------------------
(3) Direct Music °ú ±âÁ¸ÀÇ ¹æ½Ä ºñ±³
DLS ¶ó°í ÇÏ´Â ¸»Àº »ý¼ÒÇÑ ¸»ÀÌÁö¸¸ ±× ¹æ½ÄÀº ÀüÇô »ý¼ÒÇÑ °ÍÀÌ ¾Æ´Ï´Ù. ¿¹
Àü¿¡ ¸ðµâ À½¾ÇÀ̶ó´Â °ÍÀ»
µé¾îº¸½Å ºÐÀº ¾Ë°ÚÁö¸¸, ½ÇÁ¦ÀÇ ¾Ç±âÀÇ »ùÇøµÀ»
½Ç ¿¬ÁÖ¿¡ ÀÌ¿ëÇÏ´Â ¹æ½ÄÀº ¿À·¡ ÀüºÎÅÍ ÀÖ¾ú´Ù. MOD, S3M, IT µîµîÀÇ
¸ðµâ
À½¾Ç ÆÄÀϵéÀÌ ±×°ÍÀε¥ À̰͵éÀº ±× ÆÄÀÏ ÀÚü¿¡ ±× »ùÇøµ µÈ ¾Ç±âÀÇ µ¥ÀÌ
Å͸¦ °¡Áö°í ÀÖ¾ú´Ù. ±×¸®°í ¶ÇÇÑ, DLS ó·³
¾Ç±â¸¦ µû·Î ¸ð¾Æ¾²´Â °³³äµµ ÀÖ
¾ú´Âµ¥, ±×°ÍÀÌ BNK È®ÀåÀÚ¸¦ °¡Áø ¹ðÅ©¶ó´Â °³³äÀ̾ú°í ROL, IMS µîÀÇ FM ¹æ
½ÄÀÇ ÆÄÀÏ
Æ÷¸Ë¿¡¼ »ç¿ëµÇ¾ú´Ù. ( ±× ´ç½ÃÀÇ ¹ðÅ©´Â ¾Ç±â À̸§À¸·Î ¾Ç±â¸¦
±¸ºÐÇ߱⠶§¹®¿¡ À̸§¸¸ ´Ù¸£´Ù¸é ¾Ç±âÀÇ °³¼ö¿¡´Â Á¦ÇÑÀÌ ¾ø¾ú´Ù.
)
À§¿¡¼ ÀåȲÇÏ°Ô ¸»ÇÑ DLS ´Â À§ÀÇ µÎ °¡Áö ¹æ½ÄÀ» ÇÕÇÑ °ÍÀÌ´Ù. FM ¹æ½ÄÀÇ
¹ðÅ©ÀÇ ÀåÁ¡ÀÎ '¾Ç±â´Â
µû·Î ¸ðÀº´Ù'´Â °Í°ú, ¸ðµâ À½¾ÇÀÇ ÀåÁ¡ÀÎ '½ÇÁ¦ »ùÇÃ
¸µ µ¥ÀÌÅÍ'¸¦ ¾´´Ù´Â µÎ °¡Áö¸¦ ÇÕÇÑ °ÍÀÌ´Ù. ±×¸®°í FM ÀÇ ´ÜÁ¡ÀÎ À½Áú
ÀúÇÏ
³ª, ¸ðµâ À½¾ÇÀÇ ´ÜÁ¡ÀÎ ¿ë·® Áõ°¡´Â ±×·± ´ë·Î ÇØ°áÀÌ µÈ °ÍÀÌ´Ù. ( MIDI ÆÄ
ÀÏÀÇ Å©±â´Â ¸ðµâ À½¾Ç¿¡ ¹èÇØ ÈξÀ ÀûÀº
¿ë·®ÀÌ´Ù. )
±×¸®°í Direct Music Àº MIDI ¸¦ Ç¥¹æÇÏ°í ÀÖÁö¸¸ ½ÇÁ¦´Â Direct Sound °¡ ¹ß
ÀüÇÑ
ÇüÅ·Πº¸¸é µÈ´Ù. Direct Music ÀÌ ´Üµ¶À¸·Î ¾²ÀÏ ¶§´Â ³»ºÎÀûÀ¸·Î
Direct Sound ¸¦ »ý¼ºÇϸç, ÀÌ¹Ì Direct
Sound ÀÌ »ý¼ºµÇ¾î ÀÖ´Ù¸é ±× °´Ã¼¸¦
Direct Music ÂÊÀ¸·Î ³Ñ°ÜÁÖ¾î¾ß ÇÑ´Ù. À½ÀÇ µ¥ÀÌÅ͸¸ MIDI ÆÄÀÏ¿¡¼ ÀÐÀ»
»Ó,
À½ÀÇ ÇÕ¼ºÀ̳ª ÇÇÄ¡ º¯Çü ( ÇÇÄ¡ ÁÖÆļö°¡ Ä¿Áö¸é ±× ¾Ç±âÀÇ À½µµ ¿Ã¶ó°£´Ù )
¿¡´Â Direct Sound ¹öÆÛ¸¦ ÀÌ¿ëÇϱâ
¶§¹®ÀÌ´Ù. »ç¿îµå Ä«µåÀÇ '¹Ìµð ¸ÅÆÛ' ³ª
'¼ÒÇÁÆ®¿þ¾î ½Åµð»çÀÌÀú' ³ª 'MPU-401 ¸ðµâ' Àº ¸ðµÎ legacy port ¶ó°í
Çؼ
À©µµ¿ìÁî 2000 ºÎÅÍ´Â ¾Æ¿¹ Áö¿øµµ ¾È ÇÒ ¿¹Á¤À̶ó°í ÇÑ´Ù. ¾Æ¸¶ À©µµ¿ìÁî
2000 ¹Ìµð¾î Ç÷¹À̾¼ÀÇ MIDI
¿¬ÁÖ´Â ¹«Á¶°Ç Direct Music À» ÅëÇؼ¸¸
°¡´ÉÇØ Áú °Í °°´Ù.
¹°·Ð ¿ä»õÀÇ °ÔÀÓ Á¦ÀÛÀº ¾Æ¿¹ CD (CDDA) ·Î °¡°í ÀÖÁö¸¸ ¾îÂ÷ÇÇ CD µµ ½Åµð
»çÀÌÀú¿¡¼ »ç¿ëÇÑ
¸ðµâÀÇ À½À» ³ìÀ½ÇÑ °Í¿¡ ºÒ°úÇϹǷÎ, ÀÚ½ÅÀÇ À½¿øÀ» ´Ù¿î
·Îµù Çؼ DLS »óÅ·Π°ÔÀÓÀ» ¹èÆ÷ÇÑ´Ù¸é CD ÀÇ Æ®·¢À¸·Î ¹èÆ÷ÇÒ ¶§¿Í
¶È°°Àº
°á°ú¸¦ ¾ò´Â´Ù. ¾Æ´Ï ½ÇÁ¦·Î´Â ¿ë·®µµ ÈξÀ ÁÙ°í CD-ROM ¿¡ ´ëÇÑ ºÎÇϵµ ÁÙ¾î
µç´Ù.
( CD ·Î ¹è°æ À½À» ¿¬ÁÖÇÏ´Â
°ÔÀÓÀÇ °¡Àå Å« ´ÜÁ¡À̶ó¸é, °ÔÀÓ µ¥ÀÌÅ͸¦ Ç×»ó
Çϵåµð½ºÅ©¿¡ º¹»ç¸¦ ÇØµÎ°í ½ÇÇàÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. CD ¿¡¼ °ÔÀÓÀ»
¹Ù·Î
½ÇÇà½ÃÅ°¸é CD À½ÀÌ ¶Ò¶Ò ²÷±â±â ¶§¹®ÀÌ´Ù. ´ç¿¬ÇÏÁö¸¸ CD-ROM ÀÇ Àбâ Çì
´õ´Â ÇϳªÀ̱⠶§¹®ÀÌ´Ù.
)
-----------------------------------------------------------------------
1999 / 11 / 10
#####################################################
------------------------------------------------------------------------
### µ¨ÆÄÀÌ·Î ÇÏ´Â Direct X - Direct Music (2/3)
1. Direct Music ÀÇ °³¿ä
2. Direct Music ÃʱâÈ¿Í MIDI
Àбâ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.
Direct Music Ãâ·Â
------------------------------------------------------------------------
ÀÛ¼ºÀÚ
: ¾È¿µ±â ( HiTEL ID : SMgal )
------------------------------------------------------------------------
(1) Direct Music ÃʱâÈ
1) COM ÀÇ ÃʱâÈ
| if CoInitialize(nil) <> S_OK then exit;
Á¦ÀÏ Ã³À½ÀÇ °úÁ¤Àº COM ÀÇ ÃʱâÈÀÌ´Ù.
2) Direct Music Performance ÀÇ »ý¼º
| if
CoCreateInstance(CLSID_DirectMusicPerformance,nil,CLSCTX_INPROC,
|
IID_IDirectMusicPerformance,MIDIPerf) <> S_OK then
exit;
Performance ´Â Direct Music ÀÇ °¡Àå ±âº»ÀûÀÎ ÀÎÅÍÆäÀ̽ºÀε¥,
CoCreateInstance() ÇÔ¼ö¸¦ ÅëÇØ ±× ÀÎÅÍÆäÀ̽º¸¦ ¾ò¾î ¿Â´Ù.
Direct Music ºÎÅÍ´Â Create °è¿ÀÇ ÃʱâÈ ÇÔ¼ö¸¦ Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î COM ÀÇ
¹æ½Ä´ë·Î
Direct Music Performance ÀÇ Å¬·¡½º ¾ÆÀ̵𸦠ÅëÇØ ÀÎÅÍÆäÀ̽º¸¦
µ¹·ÁÁÖµµ·Ï ¸¸µé¾ú´Ù. ¿©±â¼ MIDIPerf ¶ó´Â
º¯¼ö°¡ Performance °´Ã¼ÀÌ´Ù.
¿ª½Ã ½ÇÆÐÇϸé S_OK °¡ ¾Æ´Ñ °ªÀÌ µé¾î¿Â´Ù.
3) Performance ÀÇ ÃʱâÈ
| if MIDIPerf.Init(DirectMusic,DirectSound,Handle) <> S_OK then exit;
IDirectMusicPerformance ÀÇ ¸Þ½îµåÀÎ Init() ¸¦ È£ÃâÇÏ¸é µÇ´Âµ¥ ±× ÆĶó¸Þ
ÅÍ´Â
´ÙÀ½°ú °°´Ù.
ù ¹ø° ÆĶó¸ÞÅÍ´Â IDirectMusic °´Ã¼ÀÌ´Ù. ¸¸¾à nil À» ÁÖ¾ú´Ù¸é
IDirectMusic °´Ã¼´Â ¹ÛÀ¸·Î µå·¯³ªÁö ¾Ê°Ô µÈ´Ù.
µÎ ¹ø° ÆĶó¸ÞÅÍ´Â IDirectSound °´Ã¼ÀÌ´Ù. ¸¸¾à Direct Sound ¿Í °°ÀÌ »ç¿ë
ÇÏ·Á¸é
¹Ì¸® »ý¼ºµÇ¾î ÀÖ´Â Direct Sound °´Ã¼¸¦ ³Ñ°ÜÁà¾ß ÇÑ´Ù. °°ÀÌ »ç¿ëÇÏ
Áö ¾Ê´Â´Ù¸é nil ·Î ÀÎÀÚ¸¦ ÁÖ¸é µÇ´Âµ¥, ÀÌ ¶§´Â
Direct Music ÀÌ ³»ºÎÀûÀ¸
·Î Direct Sound °´Ã¼¸¦ »ý¼ºÇÏ°Ô µÈ´Ù.
¼¼ ¹ø° ÆĶó¸ÞÅÍ´Â Direct Sound ¸¦ ¸¸µé±â À§ÇÑ ÇÚµéÀÌ´Ù. ( Direct Sound
ÃʱâÈ¿¡
ÇÚµéÀÌ ÇÊ¿äÇÏ´Ù´Â °ÍÀ» ¾ÕÀÇ Direct Sound °Á¿¡¼ Çß¾ú´Ù. ) ¸¸
¾à nil ·Î ÀÎÀÚ¸¦ ÁÖ¾ú´Ù¸é ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀÌ
µé¾î°£´Ù.
4) Performance ÀÇ Æ÷Æ® Ãß°¡
| if MIDIPerf.AddPort(nil) <> S_OK then exit;
Æ÷Æ®¶õ ¹Ìµð Ãâ·Â µð¹ÙÀ̽º¸¦ ¸»ÇÑ´Ù. »ç¿îµå Ä«µå¿¡ µû¶ó ´Ù¸£¸ç
IDirectMusic °´Ã¼¿¡ ÀÖ´Â EnumPort() ¶ó´Â ¸Þ½îµå·Î »ç¿ë °¡´ÉÇÑ Æ÷Æ®¸¦ ã
À» ¼ö°¡ ÀÖ´Ù. Áö±Ýó·³ nil
·Î ÀÎÀÚ¸¦ ÁÖ¸é Direct Music ÀÇ µðÆúÆ®ÀÎ
'Microsoft Software Synthesizer' ·Î ¼±ÅÃÇÏ´Â °ÍÀÌ
µÈ´Ù.
| var
| PortCaps :
TDMus_PortCaps;
| PortCaps.dwSize := Sizeof(PortCaps);
| i
:= 0;
| while DirectMusic.EnumPort(i,PortCaps) = S_OK do begin
|
Inc(i);
| end;
ÇöÀçÀÇ »ç¿ë °¡´ÉÇÑ Æ÷Æ®¸¦ ¾Ë¾Æ¿À±â À§Çؼ´Â IDirectMusic.EnumPort À» »ç
¿ëÇÏ¸é µÈ´Ù.
Á¦ÀÏ Ã³À½ °ªÀº 0 À¸·Î ÇÏ¿© S_FALSE ¸Þ¼¼Áö°¡ ³ª¿Ã ¶§±îÁö ·ç
ÇÁ¸¦ µ¹¸®¸é¼ 1 ¾¿ Áõ°¡½ÃÄÑ ´ëÀÔÇÏ¸é ¸ðµç Æ÷Æ®¸¦ ãÀ» ¼ö ÀÖ´Ù.
PortCaps.wszDescription ¿¡´Â Æ÷Æ®ÀÇ À̸§ÀÌ µé¾î ÀÖ°í, PortCaps.guidPort
¿¡ ±× Æ÷Æ®ÀÇ GUID °¡ µé¾î ÀÖ´Ù.
µðÆúÆ®ÀÎ 'Microsoft Software Synthesizer' ÀÌ¿ÜÀÇ MIDI ÀåÄ¡·Î Ç÷¹ÀÌ Çϱâ
À§Çؼ´Â ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù.
| var
| GUID : TGUID;
|
PortParams : TDMus_PortParams;
|
FillChar(PortParams,Sizeof(PortParams),0);
| PortParams.dwSize :=
Sizeof(PortParams);
| PortParams.dwValidParams :=
DMUS_PORTPARAMS_EFFECTS;
| PortParams.dwEffectFlags :=
DMUS_EFFECT_REVERB;
| // reverb ¿¹¸¦ µç °ÍÀÌ´Ù. ½ÇÁ¦¿¡¼´Â Àڽſ¡°Ô ¸Â°Ô ÇÏ¸é µÈ´Ù.
| HR
:= DirectMusic.CreatePort(GUID,PortParams,MIDIPort,nil);
| // GUID ¿¡´Â
ÀڱⰡ ¾²°íÀÚ ÇÏ´Â Æ÷Æ®ÀÇ GUID ¸¦ ³ÖÀ¸¸é µÈ´Ù.
| // IDirectMusic ÀÇ GetDefaultPort ·Î GUID
¸¦ ¾ò´Â´Ù¸é Microsoft
| // Software Synthesizer °¡ ¼±ÅõȴÙ.
| if (HR
<> S_OK) and (HR <> S_FALSE) then exit;
| // ¼º°øÇϸé S_OK ³ª
S_FALSE °¡ µ¹¾Æ¿Â´Ù.
| // S_FALSE °¡ µ¹¾Æ ¿Ã ¶§´Â, ÇÔ¼ö°¡ ¼º°ø ÇßÁö¸¸ ¿ä±¸ Á¶°ÇÀ» ¸¸Á·½Ã
|
// Å°Áö ¸øÇÒ ¶§ÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â ±× ÀåÄ¡°¡ reverb ¸¦ Áö¿øÇÏÁö ¾Ê
| // À¸¸é S_FALSE °¡
µ¹¾Æ¿Â´Ù.
|
| DirectMusic.Activate(TRUE);
| // Æ÷Æ®¸¦ È°¼ºÈ ½ÃŲ´Ù.
|
// MIDIPort.Activate(TRUE); ¸¦ ½áµµ °°Àº °á°úÀÌ´Ù.
|
| if
MIDIPerf.AddPort(MIDIPort) <> S_OK then exit;
| // Æ÷Æ®¸¦ Ãß°¡ÇÑ´Ù. nil ÀÌ
¾Æ´Ñ °ªÀÌ ¾²¿´´Ù.
|
| MIDIPerf.AssignPChannelBlock(0,MIDIPort,1);
| //
ù ¹ø° ÆĶó¸ÞÅÍ°¡ 0 À̸é ä³Î 0-15¸¦, 1 À̸é ä³Î 16-31À», 2
| // À̸é ä³Î 32-47À».... ÀÌ·±
½ÄÀ¸·Î Áõ°¡ÇÑ´Ù.
| // ¸¶Áö¸· ÆĶó¸ÞÅÍ´Â Æ÷Æ®»óÀÇ Ã¤³Î ±×·ìÀε¥ 1 ÀÌ»óÀÇ °ªÀÌ ¿Â´Ù.
5) Notification Ãß°¡
| GUID := GUID_NOTIFICATION_SEGMENT;
|
MIDIPerf.AddNotificationType(GUID);
Performance ¿¡ Notification À» Ãß°¡ÇÑ´Ù. Direct Music ¿¡¼´Â ÀÚ½ÅÀÌ
¿øÇÏ
´Â À̺¥Æ® ¸Þ¼¼Áö¸¸ ¹ÞÀ» ¼ö ÀÖµµ·Ï À§¿Í °°ÀÌ ¹Þ°í ½ÍÀº °Í¸¸ Ãß°¡ÇÑ´Ù.
°¡´ÉÇÑ À̺¥Æ®ÀÇ ¸ñ·ÏÀº ´ÙÀ½°ú °°´Ù.
GUID_NOTIFICATION_SEGMENT - Segment ¿¡ ´ëÇÑ ¾Ë¸²
±â´É
GUID_NOTIFICATION_PERFORMANCE - Performance ¿¡ ´ëÇÑ ¾Ë¸²
±â´É
GUID_NOTIFICATION_MEASUREANDBEAT - Segment ¿¡ ´ëÇÑ ¾Ë¸²
±â´É
GUID_NOTIFICATION_CHORD - ¿¡ ´ëÇÑ ¾Ë¸²
±â´É
GUID_NOTIFICATION_COMMAND - Segment ¿¡ ´ëÇÑ ¾Ë¸² ±â´É
6) Direct Music Loader ÀÇ »ý¼º
| if
CoCreateInstance(CLSID_DirectMusicLoader,nil,CLSCTX_INPROC,
|
IID_IDirectMusicLoader,MIDILoader) <> S_OK then
exit;
| if not Assigned(MIDILoader) then exit;
À§ÀÇ Performance ÀÇ »ý¼º°ú ´ëµ¿¼ÒÀÌÇÏ´Ù. Ŭ·¡½º ID ¿Í ÀÎÅÍÆäÀ̽º ID ¸¸
¹Ù²ï
°Í»ÓÀÌ´Ù.
¿©±â±îÁö Çϸé ÀÏ´Ü Direct Music ¿¡ ´ëÇÑ ÃʱâÈ´Â ³¡³µ´Ù.
-----------------------------------------------------------------------
(2) MIDI ÆÄÀÏ Àбâ
1) Direct Music Segment »ý¼º
IDirectMusicSegment °´Ã¼´Â MIDI ÆÄÀÏÀÇ ¼¼±×¸ÕÆ®¸¦ °¡Áø´Ù.
¾Æ·¡´Â MIDI ÆÄÀÏ¿¡¼
Segment °´Ã¼¸¦ ¸¸µå´Â ÇÔ¼öÀÌ´Ù.
| function MULTI_TO_WIDE(x : PWideChar; y :
PChar) : integer;
| // ÀÌ ÇÔ¼ö´Â C ·ÎµÈ ¿¹Á¦¿¡ #define À¸·Î µÇ¾î ÀÖ´ø °ÍÀ» Ç®¾î ¾´ °ÍÀÌ´Ù.
| // y
¶ó´Â Char Çü ¹è¿À» x ¶ó´Â WideChar ÇüÀÇ ¹è¿·Î ¹Ù²Û´Ù.
| begin
| MULTI_TO_WIDE :=
|
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,y,-1,x,MAX_PATH);
|
end;
| function LoadMIDISegment(MIDIPerf :
IDirectMusicPerformance;
| MIDILoader :
IDirectMusicLoader;
| FileName : String) :
IDirectMusicSegment;
| var
| ObjDesc : TDMUS_OBJECTDESC;
|
MIDISegment : IDirectMusicSegment;
| wPath : array
[0..DMUS_MAX_FILENAME-1] of WCHAR;
| HR : HResult;
|
begin
| LoadMIDISegment := nil;
| // Segment °¡ ÁöÁ¤µÇÁö ¾ÊÀº »óÅÂ
|
|
MULTI_TO_WIDE(wPath,PChar(ExtractFilePath(FileName)));
| // FileName ÀÇ
Path ¸¸ wPath ¶ó´Â WideChar Çü ¹è¿·Î º¹»ç
|
| HR :=
MIDILoader.SetSearchDirectory(GUID_DirectMusicAllTypes,wPath,
|
FALSE);
|
if (HR <> S_OK) and (HR <> S_FALSE) then exit;
| // MIDI
ÆÄÀÏÀ» ãÀ» µð·ºÅ丮¸¦ ¼³Á¤ÇÑ´Ù.
|
|
FillChar(ObjDesc,Sizeof(TDMUS_OBJECTDESC),0);
| ObjDesc.dwSize :=
sizeof(TDMUS_OBJECTDESC);
| ObjDesc.dwValidData := DMUS_OBJ_CLASS or
DMUS_OBJ_FILENAME;
| ObjDesc.guidClass := CLSID_DirectMusicSegment;
|
// DirectMusicSegment ÀÇ Å¬·¡½º ID ¸¦ ÁöÁ¤
|
MULTI_TO_WIDE(ObjDesc.wszFileName,
|
PChar(ExtractFileName(FileName)));
|
// ÆÄÀÏÀÇ À̸§À» ÁöÁ¤
|
| Pointer(MIDISegment) := nil;
| HR :=
MIDILoader.GetObject(ObjDesc,IID_IDirectMusicSegment,
|
MIDISegment);
|
if HR <> S_OK then exit;
| // IDirectMusicSegment ÀÇ ÀÎÅÍÆäÀ̽º¸¦
¾ò´Â´Ù.
|
| if Assigned(MIDISegment) then begin
| HR :=
MIDISegment.SetParam(GUID_StandardMIDIFile,
|
$FFFFFFFF,0,0,Pointer(MIDIPerf));
|
if HR <> S_OK then exit;
| // ÀÌ Segment ´Â Ç¥ÁØ MIDI ÆÄÀÏ·Î
ÁöÁ¤
| HR := MIDISegment.SetParam(GUID_Download,
|
$FFFFFFFF,0,0,Pointer(MIDIPerf));
|
if (HR <> S_OK) and (HR <> S_FALSE) then exit;
| // ÀÌ
Segment ´Â 'DLS ¸¦ »ç¿ëÇÏ¿© ¾Ç±â¸¦ ´Ù¿î·ÎµùÇÑ´Ù'¶ó°í ÁöÁ¤
| end;
|
| LoadMIDISegment
:= MIDISegment;
| end;
À§ÀÇ ¼Ò½º´Â Direct X 6.1 ÀÌÈÄÀÇ Direct Music ¿¡¼ Á¦´ë·Î µ¿ÀÛÇÑ´Ù. ÀÌ·¸
°Ô ¸»°í,
Direct X 7.0 ÀÇ Direct Music ¹æ½ÄÀ¸·Î ÇÏ¸é ¾Æ·¡Ã³·³µµ ÇÒ ¼ö ÀÖ
´Ù.
| LoadMIDISegment := nil;
|
|
FillChar(ObjDesc,Sizeof(TDMUS_OBJECTDESC),0);
| ObjDesc.dwSize :=
sizeof(TDMUS_OBJECTDESC);
| ObjDesc.dwValidData := DMUS_OBJ_CLASS or
DMUS_OBJ_FULLPATH;
| ObjDesc.guidClass := CLSID_DirectMusicSegment;
|
MULTI_TO_WIDE(ObjDesc.wszFileName,PChar(FileName));
|
|
Pointer(MIDISegment) := nil;
| HR :=
MIDILoader.GetObject(ObjDesc,IID_IDirectMusicSegment,
|
MIDISegment);
|
if HR <> S_OK then exit;
| ........
ÀÌ ¹æ½ÄÀº, µð·ºÅ丮¸¦ ÁöÁ¤ÇØ ³õ°í ÆÄÀÏÀ» Á¤ÀÇÇÏ´ø ±× À§ÀÇ ¹æ¹ý°ú´Â ´Þ¸®
Çѹø¿¡ Full Path ·Î
MIDI ÆÄÀÏÀ» Àд´Ù. ±×¸®°í Direct X 6.1 ÀÇ Direct
Music ¿¡´Â Ä¡¸íÀûÀÎ ¹ö±×°¡ Çϳª Àִµ¥, ±×°ÍÀº
Path À̸§¿¡ °ø¹éÀÌ µé¾î°¡
¸é Path ¸¦ Á¦´ë·Î ãÁö ¸øÇÑ´Ù´Â °ÍÀÌ´Ù. ƯÈ÷ ÇÑ±Û À©µµ¿ìÁî´Â c:\windows
\¹ÙÅÁ
ȸé\test.Mid ¿Í °°ÀÌ Path ¿¡ ¸¹Àº °ø¹éÀÌ Á¸ÀçÇÑ´Ù. ±×·¡¼ ÇÊÀÚ´Â
Direct Music À» À§Çؼ¶ó¸é Direct X
7.0 ¹öÀüÀ» »ç¿ëÇÒ °ÍÀ» ±ÇÀ¯ÇÑ´Ù.
À§ÀÇ ÇÔ¼öÀÇ »ç¿ë¹ýÀ» º¸¸é ¾Æ·¡¿Í °°´Ù.
| MIDISegment := LoadMIDISegment(MIDIPerf,MIDILoader,FileName);
-----------------------------------------------------------------------
1999 / 11 / 11
#####################################################
------------------------------------------------------------------------
###
µ¨ÆÄÀÌ·Î ÇÏ´Â Direct X - Direct Music (3/3)
1. Direct Music ÀÇ °³¿ä
2. Direct Music ÃʱâÈ¿Í MIDI
Àбâ
3. Direct Music Ãâ·Â
~~~~~~~~~~~~~~~~~~~~
------------------------------------------------------------------------
ÀÛ¼ºÀÚ
: ¾È¿µ±â ( HiTEL ID : SMgal )
------------------------------------------------------------------------
(1) Direct Music ÀÇ Ãâ·Â
| if Assigned(MIDISegment) then begin
|
HR := MIDIPerf.PlaySegment(MIDISegment,0,ZERO_INT64,MIDISegStat);
|
if HR <> S_OK then Exit;
¿¬ÁÖ¿¡ ¾²ÀÌ´Â IDirectMusicPerformance.PlaySegment() ´Â 4 °³ÀÇ ÆĶó¸ÞÅÍ°¡
ÀÖ´Ù.
ù ¹ø° ÆĶó¸ÞÅÍ´Â ¿¬ÁÖÇÒ ¼¼±×¸ÕÆ®ÀÌ´Ù.
µÎ ¹ø° ÆĶó¸ÞÅÍ´Â ÀÌ ¸Þ½îµåÀÇ ÇൿÀ» Á¤ÀÇÇÏ´Â °ÍÀε¥ DMUS_SEGF_FLAGS Áß
¿¡ Çϳª°¡ µé¾î °¥
¼ö ÀÖ´Ù. ( C ¿¡¼´Â ¿°ÅÇü (enum) ÀÌÁö¸¸ µ¨ÆÄÀÌ¿¡¼´Â
»ó¼ö·Î Á¤ÀÇÇÏ°í ÀÖ´Ù. ) ÁÖ·Î primary segment ¿Í
control segment, ¶Ç´Â ¼¼
±×¸ÕÆ®ÀÇ ¹Ù¿î´õ¸® ( °æ°è ) ¿¡ ´ëÇÑ Ç÷¡±×°¡ ÀÖ´Ù. ÀÚ¼¼ÇÑ °ÍÀº SDK ÇïÇÁ¸¦
ÂüÁ¶Çϱâ
¹Ù¶õ´Ù.
¼¼ ¹ø° ÆĶó¸ÞÅÍ´Â ±× ¼¼±×¸ÕÆ®¿¡¼ ¿¬ÁÖ¸¦ ½ÃÀÛ ÇÒ °÷ÀÇ ½Ã°£ÀÌ´Ù. µÎ ¹ø°
ÆĶó¸ÞÅÍ¿¡¼
DMUS_SEGF_REFTIME °¡ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù¸é
³× ¹ø° ÆĶó¸ÞÅÍ´Â ¿¬ÁÖµÉ ¼¼±×¸ÕÆ® ÀνºÅϽº¿¡ ´ëÇÑ ¼¼±×¸ÕÆ® »óŸ¦ ³ªÅ¸
³»´Â °´Ã¼¸¦ ³Ö´Â´Ù. nil
ÀÌ ¾Æ´Ñ °ªÀÌ µé¾î°¬´Ù¸é IDirectMusicSegment
State °´Ã¼ÀÇ Æ÷ÀÎÅÍ°¡ µ¹¾Æ¿Â´Ù. ¹°·Ð ÀÌ °´Ã¼ÀÇ Release
´Â ÇÁ·Î±×·¡¸ÓÀÇ
¸òÀÌ´Ù.
ZERO_INT64 ´Â ÀÌÀü ¹öÀüÀÎ µ¨ÆÄÀÌ 3 ¿Í ȣȯÀ» À§Çؼ ¸¸µé¾î º» »ó¼öÀε¥
½ÇÁ¦
Á¤ÀÇ´Â ¾Æ·¡¿Í °°ÀÌ µÇ¾î ÀÖ´Ù. ( ÀÌ°Ç ÇÊÀÚ°¡ Direct Music Å×½ºÆ® ´ç
½Ã¿¡ Delphi 3 ¸¦ »ç¿ëÇÏ°í ÀÖ¾ú±â ¶§¹®¿¡ ¸¸µç
°ÍÀÌÁö, ±× ÀÌ»óÀÇ ¹öÀüÀ» »ç
¿ëÇÏ´Â »ç¶÷¿¡°Ô´Â ÀüÇô ÇÊ¿ä°¡ ¾ø´Ù. )
| {$IFDEF
VER100}
| type Int64 = array [0..1] of
DWORD;
| const ZERO_INT64 : Int64 = (0,0);
| {$ELSE}
| const ZERO_INT64 :
Int64 = 0;
| {$ENDIF}
ÀÌ ÄÄÆÄÀÏ·¯°¡ µ¨ÆÄÀÌ3 À̸é DWORD µÎ °³·Î ¸¸µé¾îÁö°í, ±× ÀÌ»óÀ̶ó¸é ¿ø·¡
ºÎÅÍ ÀÖ´Â 64 bit
Á¤¼öÇüÀÎ Int64 ·Î ÇüÀÌ Á¤ÀǵȴÙ. ( ¹°·Ð µ¨ÆÄÀÌ 2 ¹öÀüÀÌ
¶ó¸é ¿¡·¯¸¦ ³¾ °ÍÀÌ´Ù. )
------------------------------------------------------------------------
(2) Direct Music ÀÇ Á¾·á
| procedure CloseMIDI;
| begin
| if
Assigned(MIDISegment) then begin
| if Assigned(MIDIPerf) then
MIDIPerf.Stop(nil,nil,0,0);
| // MIDI ÀÇ ¿¬ÁÖ¸¦ ¸ØÃá´Ù.
| if
Assigned(MIDISegment) then MIDISegment.SetParam(
|
GUID_Unload,$FFFFFFFF,0,0,Pointer(MIDIPerf));
|
// Æ®·¢ÀÇ ¹êµå¿¡ ´ëÇÑ ¾Ç±â µ¥ÀÌÅ͸¦ Á¦°ÅÇÑ´Ù.
| if Assigned(MIDISegment) then
MIDISegment._Release;
| // ¼¼±×¸ÕÆ® °´Ã¼¸¦ ÇØÁ¦ÇÑ´Ù.
|
Pointer(MIDISegment) := nil;
| // ´Ù½Ã ÃʱâÈ..
| end;
|
end;
´ÜÁö Stop ¸¸ Çß´Ù¸é PlaySegment ·Î ´Ù½Ã ¿¬ÁÖ°¡ °¡´ÉÇÏ´Ù. ( Pause °è¿ÀÇ
¸Þ½îµå´Â
º¸ÀÌÁö ¾Ê´Â´Ù. )
¾Æ·¡´Â Direct Music À» ÇØÁ¦ÇÏ´Â ºÎºÐÀÌ´Ù.
| procedure
FinalizeDMusic;
| begin
|
| if Assigned(MIDIPerf) then
MIDIPerf.Stop(nil,nil,0,0);
| if Assigned(MIDISegment) then
MIDISegment.SetParam(GUID_Unload,
|
$FFFFFFFF,0,0,Pointer(MIDIPerf));
|
if Assigned(MIDIPerf) then MIDIPerf.CloseDown;
| //
MIDIPerf.Init() ¿¡ ´ëÀÀÇÏ´Â ¸Þ½îµåÀÌ´Ù.
|
| if Assigned(MIDIPort) then
MIDIPort._Release;
| if Assigned(MIDISegStat) then
MIDISegStat._Release;
| if Assigned(MIDISegment) then
MIDISegment._Release;
| if Assigned(MIDILoader) then
MIDILoader._Release;
| if Assigned(MIDIPerf) then
MIDIPerf._Release;
| if Assigned(DirectMusic) then
DirectMusic._Release;
| // ÀÚ½ÅÀÌ »ý¼ºÇÑ Direct Music ÀÇ °´Ã¼´Â ¸ðµÎ ÇØÁ¦ÇÑ´Ù.
|
// ÇÊÀÚ°¡ »ç¿ëÇÏ´Â ¼Ò½º¿¡¼ ¹Ù·Î °¡Á® ¿Ô±â ¶§¹®¿¡ ÀÌ °Á¿¡¼ ´Ù
| // ·çÁö ¾ÊÀº °´Ã¼µµ
ÀÖ´Ù.
|
| Pointer(MIDIPort) := nil;
| Pointer(MIDISegStat) :=
nil;
| Pointer(MIDISegment) := nil;
| Pointer(MIDILoader ) :=
nil;
| Pointer(MIDIPerf ) := nil;
| Pointer(DirectMusic) :=
nil;
| // ¿ª½Ã nil ·Î ÃʱâÈ
|
| CoUninitialize;
| // COM
ÇØÁ¦
|
| end;
´Ù¸¥ Direct X ÀÇ ÇØÁ¦¿Í º° ´Ù¸¦ °ÍÀÌ ¾ø´Ù.
------------------------------------------------------------------------
(3) Direct Music ÀÇ Notification
ÀÌ°ÍÀº Direct Music ÀÇ »óŸ¦ ¾Ë·ÁÁÖ´Â ºÎºÐÀÌ´Ù. ¸ÖƼ¹Ìµð¾î API ¿Í ´Â ´Þ
¸®
CallBack ¹æ½ÄÀÌ ¾Æ´Ñ Á÷Á¢ À¯Àú°¡ ºÒ·¯ ÁÖ¾î¾ß ÇÑ´Ù.
| procedure TimeProcedure;
| var
| pMsg
: PDMus_Notification_PMsg;
| begin
|
| if Assigned(MIDIPerf) then
begin
| while (MIDIPerf.GetNotificationPMsg
|
(PDMus_Notification_PMsg(pMsg)) = S_OK) do begin
|
case pMsg.dwNotificationOption of
|
DMUS_NOTIFICATION_SEGSTART :
| begin
|
// MIDI ¿¬ÁÖ¸¦ ½ÃÀÛÇÑ´Ù.
| end;
|
DMUS_NOTIFICATION_SEGEND :
| begin
|
// MIDI ¿¬ÁÖ°¡ ³¡³µ´Ù.
| end;
| end;
|
MIDIPerf.FreePMsg(PDMus_PMsg(pMsg));
| end;
| end;
|
end;
ÀÌ°Í ÀÌ¿Ü¿¡ ¸ðµç ¾Ë¸² Ç÷¡±×¸¦ ³ª¿ÇØ º¸¸é...
1) AddNotificationType ¿¡ GUID_NOTIFICATION_SEGMENT ¸¦ ³Ö¾úÀ» ¶§
DMUS_NOTIFICATION_SEGSTART
// MIDI ¿¬ÁÖ¸¦
½ÃÀÛÇÑ´Ù.
DMUS_NOTIFICATION_SEGEND
// MIDI ¿¬ÁÖ°¡
³¡³µ´Ù.
DMUS_NOTIFICATION_SEGALMOSTEND
// MIDI ¿¬ÁÖ°¡ °ÅÀÇ ³¡³µ´Ù. ¹öÆÛ ¿ë·®¸¸Å¸¸
³²¾ÒÀ» ¶§
DMUS_NOTIFICATION_SEGLOOP
// MIDI ¿¬ÁÖ°¡ ´Ù½Ã À翬ÁÖ
µÇ¾ú´Ù.
DMUS_NOTIFICATION_SEGABORT
// Stop ¸í·É¿¡ ÀÇÇØ ¸ØÃß¾î Á³´Ù.
2) AddNotificationType ¿¡ GUID_NOTIFICATION_PERFORMANCE ¸¦ ³Ö¾úÀ» ¶§
DMUS_NOTIFICATION_MUSICSTARTED
// Playback À»
½ÃÀÛÇß´Ù.
DMUS_NOTIFICATION_MUSICSTOPPED
// Playback ÀÌ
³¡³µ´Ù.
3) AddNotificationType ¿¡ GUID_NOTIFICATION_MEASUREANDBEAT ¸¦ ³Ö¾úÀ» ¶§
DMUS_NOTIFICATION_MEASUREBEAT
// Help ¿¡µµ ¿ëµµ ¾È ÀûÇô
ÀÖÀ½
4) AddNotificationType ¿¡ GUID_NOTIFICATION_CHORD ¸¦ ³Ö¾úÀ» ¶§
DMUS_NOTIFICATION_CHORD
// Help ¿¡µµ ¿ëµµ ¾È ÀûÇô
ÀÖÀ½
5) AddNotificationType ¿¡ GUID_NOTIFICATION_COMMAND ¸¦ ³Ö¾úÀ» ¶§
DMUS_NOTIFICATION_GROOVE
// Groove
change.
DMUS_NOTIFICATION_EMBELLISHMENT
// Embellishment command
(intro, fill, break, or end).
À§ÀÇ Ç÷¡±×µé Áß, ¾Æ·¡ÀÇ 4 °³´Â Help ¿¡¼ Á¶Â÷µµ Á¦´ë·Î ¼³¸íÀÌ ¾È µÇ¾îÀÖ
´Ù. ±×³É ¾Ë¾Æ¼
»ç¿ëÇϱ⠹ٶõ´Ù.
------------------------------------------------------------------------
<< ¿¡ÇÊ·Î±× >>
Áö±Ý±îÁö ¼³¸íÇÑ °ÍÀº Direct X ÀÇ Direct Music ºÎºÐÀ̾ú½À´Ï´Ù. µ¨ÆÄÀÌ·Î
°ÔÀÓ
¸¸µå½Ã·Á´Â ºÐµé²² Á¶±ÝÀ̳ª¸¶ µµ¿òÀÌ µÇ¾úÀ¸¸é ÁÁ°Ú½À´Ï´Ù.
ÇÑ°¡Áö ÁÖÀÇ ÇÏ½Ç Á¡Àº, ¹èÆ÷µÇ´Â µ¨ÆÄÀÌ Çì´õ Áß¿¡ Direct Music ¸¸Àº Á¦´ë
·Î ½ÇÇàÀÌ
¾ÈµË´Ï´Ù. ÄÁ¹öÆà ÇÑ »ç¶÷Á¶Â÷ Á¦´ë·Î ½ÇÇàÀ» ¾È ½ÃÄÑ º¸¾Ò´ø °ÍÀÎ
Áö´Â ¸ð¸£°ÚÁö¸¸ ¼±¾ð ºÎºÐ¿¡ ¾à°£ÀÇ ¿À·ù°¡ ÀÖ¾î¼ ±× ºÎºÐÀ» Á¦°¡ ´Ù½Ã
¼ö
Á¤Çß½À´Ï´Ù. ±× ¼öÁ¤º»Àº VTOOL ÀÚ·á½Ç¿¡ ¿Ã¸®°Ú½À´Ï´Ù.
À̹øÀÇ °Á ( ƯÈ÷ À̹ø 3 Æí ) ´Â ³Ê¹« ³¯¸²À¸·Î Çؼ Á˼ÛÇÕ´Ï´Ù. Direct
Music ˼
Direct Draw Á¤µµÀÇ ºÐ·®À̶ó ( ÀÎÅÍÆäÀ̽ºÀÇ Á¾·ù´Â ÈξÀ ¸¹À½ )
´õ ¸¹Àº ¼³¸íÀÌ ÇÊ¿äÇÑ´ëµµ ºÒ±¸ÇÏ°í ÀÌ Á¤µµ·Î °Á¸¦
¸¶Ä¡°Ô µÇ¾ú½À´Ï´Ù.
´Ù¸¥ Direct X ¸¦ ½áº» »ç¶÷À̶ó¸é Direct Music ¿ª½Ã ÇïÇÁ µµÅ¥¸àÆ®¸¦ º¸¸é
ÃæºÐÈ÷ ¾Ë ¼ö ÀÖ´Â
³»¿ëµé·Î µÇ¾î ÀÖ½À´Ï´Ù.
¿¹»ó¿Ü·Î ÀÏÀÌ ¸¹ÀÌ °ãÄ¡°Ô µÇ¾î¼ Á¦°¡ÇÏ´Â Direct X °Á´ ¿©±â¼ ¸¶Ä¥±î
ÇÕ´Ï´Ù. °Á ¾²´Âµ¥
¸Å´Þ¸°´Ù°í ´Ù¸¥ ÂÊ¿¡ ¼ÒȦÇß´õ´Ï ±×ÂÊ¿¡¼ ¸»½éÀÌ »ý±â
´Â±º¿ä...
Áö±Ý±îÁö µ¨ÆÄÀÌ·Î Direct Draw, ¸ÖƼ¹Ìµð¾î ŸÀ̸Ó, DIB, Direct Input,
MMX, Direct Sound, Direct Music ±îÁöÀÇ °Á¸¦ Çߴµ¥... ÀÌ ¸ðµç °ÁµéÀº
Á¦ ȨÆäÀÌÁö¿¡ ¿À½Ã¸é ¹ÙÀ̳ʸ®
ÀÚ·áµµ °°ÀÌ ±¸ÇÏ½Ç ¼ö°¡ ÀÖ½À´Ï´Ù.
( ¹°·Ð ¹ÙÀ̳ʸ® ÀÚ·á°¡ ÀÖ´Â °Í¸¸.. )
< http://smgal.com/ >
±×·³ ¸¶Áö¸·À¸·Î ÇѸ¶µð ³²±â°Ú½À´Ï´Ù.
" A mountain is a
mountain, Water is water.
"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
copyright SMgal 1999/11/13