2010-02-19 6 views
1

Как отправить MIDI-сообщения из программы на C++ и заставить их воспроизводить звук из банка General MIDI?Воспроизведение MIDI в OS X, C++

Я осмотрелся и, кажется, не было простого ответа, и мой мозг начинает таять после прочтения длинных руководств о CoreMIDI и подобных вещах.

У меня есть простой проект C++ для игры/синтезатора, и все, что я хочу сделать, это, например, когда этот мяч попадает в пол, вызывать C4 из банка Grand Piano. Я отлично справляюсь с большинством программ, но интегральная MIDI-часть до сих пор была для меня совершенно непрозрачной.

Я хотел бы использовать CoreMIDI, потому что кажется, что это может быть проще, но что-то многоплатформенное будет бонусом.

Благодарим за помощь!

ответ

2

Другим вариантом было бы rtmidi

Он нацелен быть простым и кроссплатформенная

Я использовал подобную RTAudio для аудио в реальном времени ввода/вывода, и это было относительно легко использовать.

Вы должны иметь возможность отображать все MIDI-устройства с примером кода, затем выбрать GM-банк и отправить соответствующее MIDI-сообщение (уведомление о включении/выключении) после выбора пианино с сообщением об изменении программы. Wikipedia имеет helpful page, чтобы начать работу

+0

rtmidi выглядит идеально, но он не скомпилируется. Я получаю сообщение об ошибке vtables. Я не вырыл очень глубоко, но это похоже на флагов компилятора, так что спасибо вам в любом случае. – BonzaiRob

+0

http://www.music.mcgill.ca/~gary/rtmidi/index.html#compiling должен объяснить все, что вам нужно, я попробовал пример кода midiprobe на win32 и скомпилирован без проблем. Если вам нужна помощь от его разработчика, вы можете попробовать список рассылки набора инструментов для синтеза (https://ccrma.stanford.edu/software/stk/), который включает в себя этот класс rtmidi и множество других функций. Он также построен тем же разработчиком. –

+0

Я использовал флаги, и он скомпилировался отлично, но потом не связывался. Если я включил rtmidi.h в свой основной файл, я вернулся к ошибке vtables. Итак, я закончил # ifndef'ing более или менее целых два файла, которые теперь компилируются. Я уверен, что есть много причин, что это плохая идея. – BonzaiRob

0

Я написал учебное пособие, которое может помочь кому-то, кто сталкивается с той же проблемой, используя CoreMIDI. В нем объясняется, как читать MIDI-файл и выводить через AUGraph звуковые эффекты из файла звукового шрифта. В нем также объясняется, как использовать виртуальную конечную точку для доступа к midi-сообщениям в режиме реального времени. Here.

Чтобы сделать то, что вы хотите, чтобы вы могли изменить проект сэмплирования обеспечить следующее:

result = MusicDeviceMIDIEvent ([AUSampler], midiStatus, note, velocity, 0); 

Где AUSampler является указателем на AUSampler то есть начальная точка в AUGraph. Вместо того, чтобы читать из файла, вы можете использовать следующую команду для отправки одной ноты MIDI для воспроизведения.

 Смежные вопросы

  • Нет связанных вопросов^_^