· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Проигрывание midi с помощью WinApi

Посл.отвђт Сообщенiе


Дата: Сен 14, 2003 16:39:57

Ну, собственно, сабж.

Интересует самый простой подход без использования сторонних библиотек. В MSDN все как-то сложно написано. Плюс там не поймешь, где речь идет о проигрывании миди, а где о миди-интерфейсе и всем что с ним связано:(


Дата: Сен 14, 2003 16:49:37 · Поправил: Aquila

Из Platform SDK (проигрывание midi через MCI):
DWORD playMIDIFile(HWND hWndNotify, LPSTR lpszMIDIFileName)
{
    UINT wDeviceID;
    DWORD dwReturn;
    MCI_OPEN_PARMS mciOpenParms;
    MCI_PLAY_PARMS mciPlayParms;
    MCI_STATUS_PARMS mciStatusParms;
    MCI_SEQ_SET_PARMS mciSeqSetParms;

    // Open the device by specifying the device and filename.
    // MCI will attempt to choose the MIDI mapper as the output port.
    mciOpenParms.lpstrDeviceType = "sequencer";
    mciOpenParms.lpstrElementName = lpszMIDIFileName;
    if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
        MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
        (DWORD)(LPVOID) &mciOpenParms))
    {
        // Failed to open device. Don't close it; just return error.
        return (dwReturn);
    }

    // The device opened successfully; get the device ID.
    wDeviceID = mciOpenParms.wDeviceID;

    // Check if the output port is the MIDI mapper.
    mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
    if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, 
        MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
    {
        mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
        return (dwReturn);
    }

    // The output port is not the MIDI mapper. 
    // Ask if the user wants to continue.
    if (LOWORD(mciStatusParms.dwReturn) != MIDI_MAPPER)
    {
        if (MessageBox(hMainWnd,
            "The MIDI mapper is not available. Continue?",
            "", MB_YESNO) == IDNO)
        {
            // User does not want to continue. Not an error;
            // just close the device and return.
            mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
            return (0L);
        }
    }

    // Begin playback. The window procedure function for the parent 
    // window will be notified with an MM_MCINOTIFY message when 
    // playback is complete. At this time, the window procedure closes 
    // the device.
    mciPlayParms.dwCallback = (DWORD) hWndNotify;
    if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, 
        (DWORD)(LPVOID) &mciPlayParms))
    {
        mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
        return (dwReturn);
    }

    return (0L);
}


Дата: Сен 14, 2003 18:16:35

Спасибо большое!
Будем пробовать:)


Дата: Сен 14, 2003 20:54:18

Aquila

Боже, что я вижу, а как же дZен, на asm нужно на asm ;-)


Дата: Сен 14, 2003 21:25:25

Итак. Попробовал. Работает. На асм, кстати:)
Еще раз спасибо.
Но возник другой вопрос: а как можно проигрывать миди из памяти, а не из физического файла на диске? Т.е. меня интересует проигрывание миди из ресурса, например, хотя это и не важно откуда, главное, чтобы момжно было использовать буфер в памяти, а не имя файла (путь к файлу). MCI, насколько я смог разобраться за эти 3 часа, не позволяет ничего подобного, поэтому единственным выходом из ситуации я вижу создание файла на диске по данным ресурса, а потом его проигрывание...
Нет ли более простого (и не такого кривого) способа?


Дата: Сен 14, 2003 21:34:46

Asterix
Боже, что я вижу, а как же дZен, на asm нужно на asm ;-)
Надо написать в Микрософт, чтобы приводили примеры на более дзенском языке, чем C ;).


Дата: Сен 14, 2003 21:39:30

Создание файла на диске из ресурсов - это как раз самый простой
способ, но согласен, не изящный. Из памяти проигрывать файлы можно
только с помощью fmod.dll и др. подобными. Но в принципе все эти
библиотеки используют WINMM.DLL.


Дата: Сен 15, 2003 00:46:09


Дата: Сен 15, 2003 00:58:05

Спасибо The Svin, интересный примерчик.


Дата: Сен 15, 2003 18:40:13

Да-да. То самое решение:)
Спасибо.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050