ÀÌ°ÍÀº 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Àº ½¬¿î  ÇÁ·Î±×·¥ °³¹ß°ú »ç¿ëÀÚÀÇ °æÇèÀ»  Ç³ºÎÇÏ°Ô Çϱâ
À§ÇÑ Áß¿äÇÑ Æ¯Â¡µéÀ» Á¦°øÇØ ÁØ´Ù.

  * 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 Àº ½¬¿î  ÇÁ·Î±×·¥  °³¹ß°ú »ç¿ëÀÚÀÇ °æÇèÀ»  Ç³ºÎÇÏ
   °Ô Çϱâ À§ÇÑ Áß¿äÇÑ Æ¯Â¡µéÀ» Á¦°øÇØ ÁØ´Ù.

  - 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