Воспроизведение MIDI из памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем Mad Butcher, 29 ноя 2005.

  1. Mad Butcher

    Mad Butcher New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    27
    Захотелось воспроизвести миди из памяти, а не из файла на диске.

    Полазил по папке MASM32\EXAMPLES, но в примерах которые там нашёл

    сделано также коряво как и у меня:

    временный файл=>воспроизводим=>удалям файл ...



    Нашёл процедурку на С++, но дело в том что я ВООБЩЕ не понимаю С,

    и соответственно не могу даже скомпилировать ASM-листинг...
    Код (Text):
    1.  
    2. {
    3. /* variable for IOProc */
    4. PMMIOPROC pIOProc;
    5. HMODULE hModMidiio;
    6.  
    7. /* variables for memory file */
    8. MMIOINFO mmioInfo;
    9. CHAR UserBuffer[SIZE_OF_BUFFER];
    10. HMMIO hmmio;
    11.  
    12. /* variables for MCI commands */
    13. MCI_OPEN_PARMS mop;
    14. MCI_PLAY_PARMS mpp;
    15.  
    16. /* Open memory file. Provide midi-filled data buffer to MMIO, so
    17. * data buffer becomes file image in memory. Also specify that
    18. * the data will need to be translated.
    19. */
    20.  
    21. mmioInfo.pchBuffer = UserBuffer; /* Filled with untranslated
    22. midi data */
    23. mmioInfo.cchBuffer = SIZE_OF_BUFFER; /* User-defined */
    24. mmioInfo.ulTranslate = MMIO_TRANSLATEDATA | MMIO_TRANSLATEHEADER;
    25. /* Need to translate data */
    26. mmioInfo.fccIOProc = mmioFOURCC( 'M', 'I', 'D', 'I');/* Data
    27. format */
    28. mmioMemInfo.fccChildIOProc = FOURCC_MEM; /* Storage type */
    29. hmmio = mmioOpen ( NULL, mmioInfo, MMIO_READWRITE );
    30.  
    31. /* open midi device */
    32.  
    33. mop.pszElementName = (PSZ) hmmiomem;
    34.  
    35. mciSendCommand(
    36. 0, /* We don't know the device yet. */
    37. MCI_OPEN, /* MCI message */
    38. MCI_WAIT | MCI_OPEN_MMIO |
    39. MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE
    40. (DWORD) mop, /* Parameters for the message */
    41. 0 ); /* Parameter for notify message */
    42.  
    43. /* play midi memory file for 1 second */
    44.  
    45. mpp.ulFrom=0;
    46. mpp.ulTo=3000; /* default is MMTIME units (1/3000 second) */
    47. mciSendCommand(
    48. mop.usDeviceID, /* Device to play the data */
    49. MCI_PLAY, /* MCI message */
    50. MCI_WAIT |
    51. MCI_FROM | MCI_TO, /* Flags for the MCI message */
    52. (ULONG) &mpp, /* Parameters for the message */
    53. 0 ); /* No parm necessary */
    54.  
    55. /* close device */
    56.  
    57. mciSendCommand(
    58. mop.usDeviceID, /* Device to play this */
    59. MCI_CLOSE, /* MCI message */
    60. MCI_WAIT, /* Flags for the MCI message */
    61. (ULONG) NULL, /* Parameters for the message */
    62. (ULONG) NULL ); /* Parameter for notify message */
    63. }
    64.  


    Начал "переводить", но застрял на 3 строчке:

    mmioInfo.ulTranslate = MMIO_TRANSLATEDATA | MMIO_TRANSLATEHEADER

    в файле windows.inc в структуре MMIOINFO поля ulTranslate нет.

    Также не понял, что это за константа такая MCI_OPEN_MMIO ???

    Вообщем полная попа...



    Может кто-нибудь переведёт этот кусочек на MASM, здесь вроде не много...



    Или киньте примерчик воспроизведения миди из памяти на ASM'e.
     
  2. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    В инклюдах VC++ .NET тоже нет ulTranslate и MCI_OPEN_MMIO, так что непонятно, что это вообще за функция и для какой ОСи она написана.



    Я тоже делал через временный файл; согласен, что это коряво и тормозно. Если у кого-то есть работающий пример воспроизведения из памяти, покажите, пожалуйста.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я видел такой пример на форуме sources.ru

    и даже где-то сохранил его на диск, но искать лениво
     
  4. Mad Butcher

    Mad Butcher New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    27
    Спасибо за ответы.



    To Asterix:

    был я на sources.ru, ничего не нашел....

    Если не очень трудно пошурши хардом и кинь сюда примерчик.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Исходник от CBP(я естественно не тестил работоспособность):


    Код (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2.  
    3. #include <dmusici.h>
    4.  
    5. #define IDR_RCDATA_MID  12345
    6.  
    7. #pragma comment(lib, "dxguid")
    8. #pragma comment(lib, "ole32")
    9. #pragma comment(lib, "user32")
    10.  
    11. IDirectMusicLoader* g_pLoader = NULL;
    12. IDirectMusicPerformance* g_pPerformance = NULL;
    13. IDirectMusicSegment* g_pSegment = NULL;
    14.  
    15. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    16. {
    17. CoInitialize(NULL);
    18.  
    19. CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader, (void**)&g_pLoader);
    20. CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance, (void**)&g_pPerformance);
    21.  
    22. g_pPerformance->Init(NULL, NULL, NULL);
    23. g_pPerformance->AddPort(NULL);
    24.  
    25. HMODULE hModule = GetModuleHandle(NULL);
    26. HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(IDR_RCDATA_MID), RT_RCDATA);
    27. HGLOBAL hData = LoadResource(hModule, hResource);
    28.  
    29. DMUS_OBJECTDESC desc = {sizeof(DMUS_OBJECTDESC)};
    30. desc.pbMemData = (BYTE*)LockResource(hData);
    31. desc.llMemLength = SizeofResource(hModule, hResource);
    32. desc.guidClass = CLSID_DirectMusicSegment;
    33. desc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_MEMORY;
    34.  
    35. g_pLoader->GetObject(&desc, IID_IDirectMusicSegment, (void**)&g_pSegment);
    36. g_pSegment->SetParam(GUID_Enable_Auto_Download, -1, 0, 0,(void *)g_pPerformance);
    37.  
    38. g_pPerformance->PlaySegment(g_pSegment, 0, 0, NULL);
    39. MessageBox(NULL, "Click OK to Stop.", "Playing MIDI...", MB_OK);
    40. g_pPerformance->Stop(g_pSegment, NULL, 0, 0);
    41.  
    42. g_pPerformance->CloseDown();
    43. g_pLoader->Release();
    44. g_pPerformance->Release();
    45. g_pSegment->Release();
    46.  
    47. CoUninitialize();
    48. return 0;
    49. }






    .rc
    Код (Text):
    1. 12345   RCDATA  "GIMN2.MID"
     
  6. Mad Butcher

    Mad Butcher New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    27
    Во-первых: Спасибо Asterix !!! Извини что благодарю поздно, но ведь лучше поздно, чем никогда :)



    Во-вторых: в архиве лежит пример воспроизведения MIDI-файла из памяти на MASM'e, может кому-нибудь пригодится.



    [​IMG] _178252655__MIDImemoryPlay.rar