Эликсирская обертка для библиотеки RTMIDI. Частично вдохновляется Python-Rtmidi.
Предупреждение: эта библиотека считается экспериментальной/до-альфа, пока некоторые из приведенных ниже вопросов не будут решены.
Подумайте о проверке вкладки «Проблемы», если вы хотите помочь.
Эта библиотека работает как есть, но я не программист C ++. Любые вклад приветствуются, но помощь в этих конкретных областях будет иметь большое значение:
C ++
src/ex_rtmidi_{output,input}.cpp может лучше использовать ООП и шаблон для уменьшения дупликации кодаinput_callback и attach_listener в src/ex_rtmidi_input.cpp нуждается в хорошем взгляде. Опять же, рефактор заранее предпочтительнееdetach_listenerЭликсир
init для входов/выходов занимает больше времени, чем рекомендован для NIF. См. lib/ex_rtmidi/{output,input}.ex КомментарииopenVirtualPortMix.Tasks.Compile.Rtmidi Out mix.exs . См. Комментарий в mix.exsОбщий
C ++ - это язык OO, Эликсир не является. Я был разорван тем, выражать ли вещи более функционально или больше в соответствии с соглашениями о ОО. В конце концов был выбран более функциональный подход.
Чтобы создать экземпляр RTMIDI, метод init вызывается с идентификатором экземпляра. В C ++ экземпляр хранится как значение на карте, где идентификатор является ключом. Будущие призывы к методам экземпляра rtmidi требуют, чтобы идентификатор был передан, чтобы узнать, какой экземпляр целится.
NIFS - это в первую очередь конструкция Erlang, поэтому вы увидите, что обертка Elixir много общается с Charlists и от Charlists. Это связано с тем, что строки в Эрланге являются Чарлистами в Эликсире, поэтому методы строк NIF фактически принимают и возвращают Charlists вместо String.t() .
Слушатели на входных портах, передаваемые в C ++ в виде PID. После получения сообщения NIF анализирует и передает сообщение асинхронно указанному PID.
До тех пор, пока некоторые из более нажатых проблем C ++ не будут решены, я не хочу продвигать эту библиотеку для общественного использования. До тех пор вам придется получить его от GitHub:
def deps do
[
{ :ex_rtmidi , git: "https://github.com/kieraneglin/ex_rtmidi" }
]
end В настоящее время эта библиотека использует более косточек подхода к обработке сообщений, чем вы можете ожидать. Вы можете получить ценность от небольшой обертки вокруг отправки и разбора сообщений, адаптированных к вашим варианту использования.
Я обрисовал некоторые основные варианты использования, но вы должны увидеть lib/ex_rtmidi/{output,input}.ex для более глубокой документации.
alias ExRtmidi.Output
{ :ok , instance } = Output . init ( :my_instance_name ) # Instance name can be whatever you want - it's unrelated to available MIDI devices
Output . get_port_count ( instance )
# iex> {:ok, 2}
Output . get_ports ( instance )
# iex> {:ok, ["IAC Midi", "Dummy MIDI"]}
Output . open_port ( instance , 0 ) # Or `Output.open_port(instance, "IAC Midi")`
# iex> :ok
Output . send_message ( instance , [ 0x90 , 60 , 100 ] )
# iex> :ok
Output . close_port ( instance )
# iex> :okСуществует обертка для MIDI -сообщений, которая улучшает опыт создания сообщений. Это в основном для вывода и не было перенесено для деконструкции входящих сообщений (см. Раздел «Потребность в помощи»).
Полный список сообщений см. lib/ex_rtmidi/message/spec.ex .
alias ExRtmidi.Output
alias ExRtmidi.Message
# Assume `init` has been run and a port has been opened as in the instance above
message = Message . compose ( :note_on , channel: 0 , note: 60 , velocity: 100 )
Output . send_message ( instance , message ) # In midi_input_server.ex
defmodule MidiInputServer do
use GenServer
def init ( state \ [ ] ) do
{ :ok , state }
end
def handle_info ( { :midi_input , midi_message } , state ) do
IO . inspect ( midi_message )
{ :noreply , state }
end
end
# In another file
alias ExRtmidi.Input
# Much of setup including init, listing ports, and opening a port is the same as in the Output example above.
# Setup will be omitted for brevity. Assume we have an instance at our disposal.
{ :ok , midi_listener_pid } = GenServer . start_link ( MidiInputServer , [ ] )
# You should attach the listener before opening the port to ensure no messages get missed
Input . attach_listener ( instance , midi_listener_pid )
# iex> :ok
Input . open_port ( instance )
# iex> :ok
# Messages will be handled from this point on
# When you're done, be sure to detatch the listener before closing the port
Input . detatch_listener ( instance )
# iex> :ok
Input . close_port ( instance )
# iex> :ok Авторские права 2021
Настоящим дается разрешение, бесплатно, любому лицу, получающему копию этого программного обеспечения и связанные с ними файлы документации («Программное обеспечение»), чтобы иметь дело в программном обеспечении без ограничений, включая, без ограничения, права на использование, копирование, изменение, объединение, публикацию, распределение, сублиценность и/или продавать копии программного обеспечения и разрешения лиц, на которые программное обеспечение подходит для того, чтобы поступить так, чтобы поступить на следующие условия: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: на следующие условия: к следующим условиям: на следующие условия: на следующие условия.
Вышеуказанное уведомление об авторском праве и это уведомление о разрешении должно быть включено во все копии или существенные части программного обеспечения.
Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, гарантии товарной пригодности, пригодности для определенной цели и несоответствия. Ни в коем случае авторы или владельцы авторских прав не будут нести ответственность за любые претензии, убытки или другую ответственность, будь то в действии контракта, деликт или иным образом, возникающие из или в связи с программным обеспечением или использованием или другими сделками в программном обеспечении.