RTMIDI库的长生不老药包装纸。部分受Python-rtmidi的启发。
警告:该库被认为是实验性/阿尔帕之前的,直到解决以下一些问题。
如果您想提供帮助,请考虑检查“问题”选项卡。
该库的工作原理,但我不是C ++程序员。欢迎任何贡献,但在这些特定领域的帮助将有很长的路要走:
C ++
src/ex_rtmidi_{output,input}.cpp可以更好地利用OOP和模板来减少代码重复src/ex_rtmidi_input.cpp中的input_callback和attach_listener需要一个好外观。同样,预先一个重构是可以选择的detach_listener如果没有听众长生不老药
init方法比NIF的建议需要更长的时间。请参阅lib/ex_rtmidi/{output,input}.ex注释openVirtualPortMix.Tasks.Compile.Rtmidi移出mix.exs 。请参阅mix.exs中的评论一般的
C ++是一种OO语言,而长生不老药不是。我对是否在功能上表达更大的表达或与OO惯例一致。最后,选择了一种更具功能的方法。
为了创建一个RTMIDI实例,使用实例标识符调用init方法。在C ++中,实例作为一个值存储在标识符为密钥的地图中。未来对RTMIDI实例方法的调用需要传递标识符,以了解要定位的实例。
NIFS主要是Erlang构造,因此您会看到Elixir包装纸对Charlist进行了很多汇聚。这是因为Erlang的字符串是Elixir中的Charlist,因此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
特此免费授予获得此软件副本和相关文档文件副本(“软件”)的任何人,以无限制处理该软件,包括无限制的使用权,复制,复制,修改,合并,合并,发布,分发,分发,分发,订婚,和/或允许软件的副本,并允许对以下条件提供以下条件,以下是以下条件。
上述版权通知和此许可通知应包含在软件的所有副本或大量部分中。
该软件是“原样”提供的,没有任何形式的明示或暗示保证,包括但不限于适销性,特定目的的适用性和非侵权的保证。在任何情况下,作者或版权持有人都不应对任何索赔,损害赔偿或其他责任责任,无论是在合同,侵权的诉讼中还是其他责任,是由软件,使用或与软件中的使用或其他交易有关的。