Мультимедіа для Windows
У цьому розділі ми коротко розповімо вам про те, як програми Windows можуть програвати музичні файли формату MIDI за допомогою засобів інтерфейсу MCI.
Стандарт MIDI (Musical Instrument Digital Interface – цифровий інтерфейс музичних інструментів) був розроблений давно, в 1982 році. В рамках цього стандарту визначено електричні та логічні специфікації (рівні сигналів, часові діаграми та комунікаційний протокол) для підключення таких музичних інструментів, як синтезатори та музичні клавіатури один до одного та до комп'ютера.
Для електричного підключення використовується послідовний інтерфейс типу "струмова петля" зі швидкістю передачі 31250 біт в секунду. Дані передаються байтами з одним стартовим та одним стоповим бітом. Детальна специфікація роз'єму наведена в документації на звуковий адаптер (якщо адаптер оснащений портом для підключення зовнішніх пристроїв MIDI). Зазначимо, що пристрої MIDI можуть підключатися ланцюжком, для чого на корпусі пристрою зазвичай передбачено три роз'єми. Вхідний роз'єм позначається MIDI In, вихідний - MIDI Out. Роз'єм MIDI Thru призначений для організації ланцюжка, він є вихідним та дублює сигнали з роз'єму MIDI In. Деякі пристрої, наприклад, прості музичні клавіатури, можуть мати лише один вхідний або вихідний гніздо. У звуковому адаптері Sound Galaxy NX Pro передбачено підключення вхідного та вихідного сигналу, причому обидва вони підключаються до одного гнізда.
Як правило, усі звукові адаптери обладнані музичним синтезатором. Синтезатори можуть мати базовий чи розширений рівень. Синтезатор базового рівня містить у собі голоси трьох мелодійних та трьох ударних інструментів. Рівень поліфонії такого синтезатора дорівнює 6 длямелодійних та 3 для ударних інструментів. Це означає, що синтезатор базового рівня може грати одночасно 6 нот на мелодійних інструментах та 3 ноти на ударних. Синтезатори розширеного рівня містять у собі 9 мелодійних та 8 ударних інструментів при рівні поліфонії, що дорівнює 16.
Хороші синтезатори містять у собі цифрові записи (зразки) голосів музичних інструментів, які модифікуються щоб одержати потрібної висоти тону та потрібного рівня вихідного сигналу. Простіші моделі синтезують звучання програмним способом, що, однак, віддаляє якість звучання від ідеалу.
Для керування синтезатором, підключеним через порт MIDI, використовується механізм повідомлень MIDI. Повідомлення можуть мати довжину від одного до кількох байт. Вони передають таку інформацію, як номер натиснутої або відпущеної клавіші музичної клавіатури або номер одного із 16 логічних каналів, через які здійснюється керування синтезатором.
Файли у стандарті MIDI мають розширення імені .mid та містять заголовок та повідомлення для музичного синтезатора. Також використовується стандарт RIFF. Файли, що містять MIDI-повідомлення та відповідають стандарту RIFF, зазвичай створюються з розширенням імені rmi. Якщо програма Windows програватиме такі файли за допомогою інтерфейсу MCI, йому не потрібно знати внутрішній формат файлів.
Але є одна тонкість, пов'язана з використанням логічних каналів та кодів інструментів.
У нашій книзі ми не розглядатимемо питання створення mid-файлів. По-перше, є багато готових, які можна купити у магазині. По-друге, для створення mid-файлів потрібна музична клавіатура, відповідне програмне забезпечення та, зрозуміло, деякі музичні здібності. Крім того, нам треба ще залишити місце у книзі дляоповідання про новий напрямок у мультимедіа - системі Microsoft Video for Windows.
Нині ж розглянемо особливості використання інтерфейсу MCI для програвання файлів MIDI.
Для роботи з музичним синтезатором, що входить до комплекту звукового адаптера, використовується драйвер mciseq.drv. Свою назву він отримав від слова sequencer (дослівно можна перекласти як "пристрій завдання послідовності"). Саме так у термінології мультимедіа називається пристрій, призначений для роботи з файлами у стандарті MIDI.
При роботі з mid-файлами на рівні керуючих рядків MCI ви можете користуватися практично всіма командами, розглянутими нами в розділі, присвяченому запису та відтворенню звуку за допомогою пристрою waveaudio (не підтримуються команди resume, record та save). Наприклад, наступна послідовність команд виконає програвання файлу canyon.mid, який постачається у складі дистрибутива операційної системи Windows:

Драйвер mciseq.drv не підтримує наступні параметри команди set: audio all off, audio all on, audio left on, audio left off, audio right on, audio right off. Додатково можна використовувати параметр time format song pointer, що встановлює формат часу в одиницях "одна шістнадцята ноти", параметр tempo, що дозволяє задати темп виконання мелодії, та деякі інші. Повний список ви зможете знайти в документації, яка постачається разом із Microsoft SDK для Windows 3.1.
Використання інтерфейсу керуючих повідомлень для відтворення mid-файлів аналогічно використанню цього інтерфейсу для відтворення wav-файлів. Перерахуємо коротко допустимі коди керуючих повідомлень і потрібні параметри, специфічні для драйвера mciseq.drv.
Пристрій sequencer відкриваєтьсякомандою MCI_OPEN за допомогою структури MCI_OPEN_PARMS, визначеної у файлі mmsystem.h.
Поле lpstrDeviceType у цій структурі має містити вказівник на рядок імені пристрою або константний ідентифікатор пристрою. Для пристрою sequencer можна вказати ім'я "sequencer" або константу MCI_DEVTYPE_SEQUENCER .
Через параметр lpstrElementName передається вказівник на шлях до mid-файлу, що програється.
Ця команда закриває пристрій. Її необхідно видавати після завершення роботи з пристроєм.
Команда MCI_PLAY призначена для відтворення. Для mid-файлів вона використовується так само, як і для wav-файлів.
Команда MCI_PAUSE призупиняє виконання операції відтворення.
Ця команда не підтримується драйвером mciseq.drv. Використовуйте замість неї команду MCI_PLAY без вказівки позиції (для запуску відтворення з поточної позиції).
Команда MCI_STOP зупиняє виконання операції відтворення.
Команда MCI_SEEK дозволяє виконувати позиціонування в межах mid-файлу.
За допомогою команди MCI_BREAK вказується віртуальний код кнопки, за допомогою якої можна перервати виконання операції.
За допомогою команди MCI_GETDEVCAPS можна визначити можливості пристрою.
За допомогою цієї команди можна отримати інформацію про пристрій як текстовий рядок, таку як опис апаратури, ім'я файлу, пов'язаного з пристроєм.
За допомогою цієї команди можна отримати системну інформацію про пристрій як текстовий рядок.
Команда MCI_STATUS використовується для визначення поточного стану пристрою.
Команда MCI_SET призначена для встановлення режиму роботи пристрою.
Команда MCI_COPY призначена для копіювання даних у універсальний буферClipboard обміну. Для неї використовується блок параметрів у форматі структури MCI_GENERIC_PARMS, прапори MCI_NOTIFY та MCI_WAIT.
Команда MCI_PASTE вставляє дані із Clipboard у поточний буфер пристрою. Для неї, як і команди MCI_COPY, використовується блок параметрів у форматі структури MCI_GENERIC_PARMS, прапори MCI_NOTIFY і MCI_WAIT.
Команда MCI_CUT видаляє дані з поточного буфера пристрою та копіює їх у універсальний буфер обміну Clipboard. Для неї використовується блок параметрів у форматі структури MCI_GENERIC_PARMS, прапори MCI_NOTIFY та MCI_WAIT.
Команда MCI_DELETE видаляє дані з поточного буфера пристрою без копіювання в Clipboard.
Команда MCI_LOAD призначена для завантаження файлу.
Додаток MIDIPL (рис. 4.2) демонструє способи використання деяких функцій MCI для відтворення файлів MIDI.

Мал. 4.2. Додаток MIDIPL
За своєю структурою він нагадує програму MCIWAWER, яка може програвати та записувати wav-файли. Тому ми розглянемо лише відмінності, специфічні до роботи з пристроєм sequencer.
Основний файл вихідних текстів програми MIDIPL наведено у лістингу 4.1.
Лістинг 4.1. Файл midipl/midipl.cpp
Звернемо вашу увагу на те, як програма MIDIPL виконує продовження відтворення після тимчасового зупинення. Оскільки драйвер mciseq.drv не підтримує команду MCI_RESUME, для продовження відтворення використовується команда MCI_PLAY без вказівки початкової позиції. Ця команда видається функцією mcimidiPlayCurrent, що викликається для продовження відтворення з поточного місця.
Визначення констант для програми MIDIPL знаходяться у файлі midipl.hpp (листинг 4.2).
Лістинг 4.2. Файл midipl/midipl.hpp
Файл midiio.cpp містить визначенняфункцій, призначених до роботи з інтерфейсом MCI (листинг 4.3).
Лістинг 4.3. Файл midipl/midiio.cpp
Функція mcimidiOpen призначена для відкриття пристрою Sequencer. Під час підготовки блоку параметрів у полі lpstrDeviceType структури mciOpen вказано ім'я пристрою:
Функція mcimidiPlayCurrent призначена для відтворення з поточної позиції. На відміну від функції mcimidiPlay, у ній не виконується позиціонування на початок.
Файл midiio.hpp (листинг 4.4) містить визначення констант та прототипи функцій для файлу midiio.cpp.
Лістинг 4.4. Файл midipl/midiio.hpp
Файл визначення ресурсів midipl.rc наведено у лістингу 4.5.
Лістинг 4.5. Файл midipl/midipl.rc
Файл визначення модуля для програми MIDIPL наведено у лістингу 4.6.