Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прочитать состояние клавиш миди синтезатора  (Прочитано 12624 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimitri
Гость
« : 19-04-2009 11:10 » 

Программирую в C++Builder 6 поэтому вопрос задал сначала там а потом почитал этот форум и понял что здесь задать этот вопрос будет правильнее.
 :dontknow:Программирую относительно недавно, и столкнулся с такой проблемой, нужно читать, запоминать и тут же воспроизводить нажатые на синтезаторе клавиши подключенный через USB порт. Пробовал через подключение драйвера к своей программе но не имея описание тамошних функций не получилось. Пробовал изучить mmsystem.h и подключить посредством
Цитировать
Код:
m_hFile = midiInOpen(&device, 1,  0, 0, CALLBACK_NULL);
но быстро понял, что это ерунда последнее, что я пробовал это
Цитировать
Цитата
Htp = CreateFile ("\\\\.\\Global\\Device\\USBPDO-10", GENERIC_READ, 0, NULL,
              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
но тоже не чего не получилось. Прошу помощи, в какую сторону мне копать, а ещё лучше пример считывания состояния клавиш с музыкального синтезатора или хоть какое-нибудь вразумительное описание А черт его знает...

   

Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-04-2009 09:54 » 

Dimitri, нужно драйвер девайса установить. И посмотри MIDI API: http://msdn.microsoft.com/en-us/library/ms712058.aspx

Смотри, какие ошибки возвращает midiInOpen.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimitri
Гость
« Ответ #2 : 20-04-2009 11:01 » 

midiInOpen ошибок не возвращает не каких просто m_hFile = 0;
Вообще по простоте душевной я думал что посмотрю в диспетчере задач код экземпляра устройства с помощью QueryDosDevice определю имя и CreateFile получу указатель на устройство а  потом с помощью  функций mmsystem.h прочитаю и воспроизведу звуки.
QueryDosDevice заработало а получить указатель на устройство INVALID_HANDLE_VALUE. Что я только с именем не делал и палочек (\) дорисовывал и место по разному прописывал  и руками и автоматом пытался  имя подсунуть всё равно INVALID_HANDLE_VALUE. А midiInOpen открывает на звуковой карте устройство (или я чего-то не правильно понял)  а не внешнее подключает (вот если бы клавиши были подключены к миди порту ). 

Записан
Dimitri
Гость
« Ответ #3 : 20-04-2009 13:08 » 

Забыл написать драва на синтезатор стоят и все программы его правильно видят и работают с ним. Я даже пробовал подключить дэдэельку но зная только имена функций без их аргументов не чего не получилось.MSDN юзаю там все и смотрю.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 20-04-2009 20:45 » 

Цитата
MMRESULT midiInOpen(
  LPHMIDIIN lphMidiIn,         
  UINT_PTR  uDeviceID,         
  DWORD_PTR dwCallback,         
  DWORD_PTR dwCallbackInstance,
  DWORD     dwFlags             
);

Значит уже что-то возвращает...

Цитата
Value    Description
MMSYSERR_ALLOCATED    The specified resource is already allocated.
MMSYSERR_BADDEVICEID    The specified device identifier is out of range.
MMSYSERR_INVALFLAG    The flags specified by dwFlags are invalid.
MMSYSERR_INVALPARAM    The specified pointer or structure is invalid.
MMSYSERR_NOMEM    The system is unable to allocate or lock memory.

Читаем там же...

Что бы я проверил первым делом? Если вообще девайсы такого типа в системе!

Querying MIDI Devices
Цитата
Before playing or recording MIDI data, you must determine the capabilities of the MIDI hardware present in the system. MIDI capability can vary from one multimedia computer to the next; applications should not make assumptions about the hardware present in a given system.

midiInGetNumDevs
Цитата
Returns the number of MIDI input devices present in the system. A return value of zero means that there are no devices (not that there is no error).

Читаем далее...

Цитата
Like other audio devices, MIDI devices are identified by a device identifier, which is determined implicitly from the number of devices present in a given system. Device identifiers range from zero to the number of devices present, minus one. For example, if there are two MIDI output devices in a system, valid device identifiers are 0 and 1.

Ну и далее уже знакомый midiInOpen.

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimitri
Гость
« Ответ #5 : 21-04-2009 11:22 » 

Цитата
For example, if there are two MIDI output devices in a system, valid device identifiers are 0 and 1.
midiInGetNumDevs я уже давно посмотрел что у меня в системе есть два устройства с миди выходом (0 и 1) и что мне с этим делать?
 Допустим я хочу тупо соединить миди выход синтезатора с миди входом звуковой карты функцией
Код:
MMRESULT midiConnect(
  HMIDI hMidi,     
  HMIDIOUT hmo,     
  LPVOID pReserved 
);
если я напишу:
Код:
hMidi = 0;
hmo   = 1;
Я думаю программа меня обматерит и работать откажется и правильно сделает.
Записан
Dimitri
Гость
« Ответ #6 : 21-04-2009 13:50 » 

 :-/Облазил весь Интернет в поисках хоть каково ни будь примера пусть даже и подключенного не к USB а к миди порту. Я зол! Оказывается есть много разных библиотек для этих целей. Сейчас наскакиваю сколь найду и попробую может чего там надыбаю.
   Если у кого есть дайте одним глазком взглянуть как это делается. Не может быть...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 21-04-2009 15:45 » 

Код: (C++)
MMRESULT result;
LPHMIDIIN hMidiIn;

result = midiInOpen(&hMidiIn, 0, 0, 0, CALLBACK_NULL)
result = midiInOpen(&hMidiIn, 1, 0, 0, CALLBACK_NULL)

Чему равен result в обоих случаях?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimitri
Гость
« Ответ #8 : 22-04-2009 13:47 » 

Код:
uDeviceID 0 = result 0;
uDeviceID 1 = result 2;
Что-то я совсем запутался вот нашел прочитал и заблудился.
Цитата
Номера MIDI–устройств
Подсистема нумерует установленные устройства, начиная с нуля. При установке нового устройства или удалении существующего нумерация изменяется, поэтому даже во время работы программы в системе могут появиться или исчезнуть MIDI–устройства.
Вместо номера устройства может использоваться ключ (handle) ранее открытого устройства; система автоматически определяет, какое именно значение передано интерфейсной функции.
Идентификаторы (ключи) открытых устройств
При открывании объекта - устройства или потока - подсистема возвращает его идентификатор, или ключ (handle), по которому затем происходит вся остальная работа с объектом. Формально идентификаторы устройств ввода и вывода имеют различные типы - HMIDIIN и HMIDIOUT, однако оба они эквивалентны (если не определена макропеременная STRICT) типу HMIDI, который может использоваться для создания универсальных функций, не зависящих от типа устройства. Ключ потока вывода имеет тип HMIDISTRM, и в некоторых функциях может использоваться вместо ключа устройства вывода; в таких случаях требуется явное приведение к типу HMIDIOUT.
Так я магу result использовать как ключ или мене всё же  надо искать как мне кажется настоящий handle

Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 22-04-2009 14:06 » 

Handle - это hMidiIn. В случае успеха открытия туда запишется нужное значение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimitri
Гость
« Ответ #10 : 22-04-2009 14:16 » 

Всё теперь всё стало на свои места. Зациклился на этом MMRESULT а то что другие значения меняются даже не смотрел. Большое спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines