RTMIDI 라이브러리의 엘릭시르 래퍼. Python-Rtmidi에서 부분적으로 영감을 얻었습니다.
경고 :이 라이브러리는 아래의 일부 문제가 해결 될 때까지 실험/사전 알파로 간주됩니다.
도움을 원한다면 "문제"탭을 확인하는 것을 고려하십시오.
이 라이브러리는 AS-IS에서 작동하지만 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 댓글을 참조하십시오openVirtualPort 에 대한 지원은 없습니다Mix.Tasks.Compile.Rtmidi mix.exs 에서 옮깁니다. mix.exs 의 의견을 참조하십시오일반적인
C ++는 OO 언어이고 Elixir는 그렇지 않습니다. 나는 OO 컨벤션에 따라 더 기능적으로 또는 더 많은 것을 표현할 것인지에 대해 찢어졌습니다. 결국보다 기능적인 접근법이 선택되었습니다.
RTMIDI 인스턴스를 만들려면 인스턴스 식별자와 함께 init 메소드가 호출됩니다. C ++에서 인스턴스는 식별자가 키인 맵에서 값으로 저장됩니다. RTMIDI 인스턴스 메소드에 대한 향후 통화를 위해서는 대상이 어떤 인스턴스를 알기 위해 식별자를 전달해야합니다.
NIF는 주로 Erlang 구조물이므로 Elixir 래퍼가 Charlist와 많은 대화를 나눌 수 있습니다. Erlang의 줄은 Elixir의 Charlist이기 때문에 NIF 문자열 방법은 실제로 String.t() 대신 Charlist를 가져 와서 반환합니다.
입력 포트의 리스너는 PID로 C ++로 전달되었습니다. 메시지를 받으면 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
이에 따라이 소프트웨어 및 관련 문서 파일 ( "소프트웨어")의 사본을 얻는 사람에게는 허가가 부여됩니다. 소프트웨어의 사용, 복사, 수정, 합병, 배포, 배포, 숭고 및/또는 소프트웨어의 사본을 판매 할 권한을 포함하여 제한없이 소프트웨어를 처리 할 수 있도록 소프트웨어를 제공 할 권한이 없습니다.
위의 저작권 통지 및이 권한 통지는 소프트웨어의 모든 사본 또는 실질적인 부분에 포함되어야합니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증없이 "그대로"제공됩니다. 어떠한 경우에도 저자 또는 저작권 보유자는 계약, 불법 행위 또는 기타, 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래에서 발생하는 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않습니다.