RtmidiライブラリのElixirラッパー。 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コメントを参照してくださいopenVirtualPortのサポートはありませんMix.Tasks.Compile.Rtmidi mix.exsから移動します。 mix.exsのコメントを参照してください一般的な
C ++はOO言語であり、Elixirはそうではありません。私は、より機能的に物事を表現するか、OO条約に沿ってより多くのことを表現するかについて引き裂かれました。最終的に、より機能的なアプローチが選択されました。
rtmidiインスタンスを作成するには、インスタンス識別子でinitメソッドが呼び出されます。 C ++では、インスタンスは識別子がキーであるマップ内の値として保存されます。 rtmidiインスタンスメソッドへの将来の呼び出しでは、どのインスタンスがターゲットになるかを知るために識別子を渡す必要があります。
NIFは主にErlang構成物であるため、ElixirラッパーがCharlistとの間で多くの収束を行うことがわかります。これは、Erlangの文字列がElixirのCharlistsであるため、NIF StringメソッドはString.t()の代わりに実際にCharlistsを取得して返すためです。
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
このソフトウェアと関連するドキュメントファイル(「ソフトウェア」)のコピーを入手して、制限なしにソフトウェアを扱うために、このソフトウェアを制限する権利を含め、ソフトウェアのコピーをコピー、変更、公開、配布、販売する、ソフトウェアのコピーを許可する人を許可する人を許可することを含めて、許可が無料で許可されます。
上記の著作権通知とこの許可通知は、ソフトウェアのすべてのコピーまたはかなりの部分に含まれるものとします。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的なものを保証することなく、「現状のまま」提供されます。いかなる場合でも、著者または著作権所有者は、契約、不法行為、またはその他の訴訟、ソフトウェアまたはソフトウェアの使用またはその他の取引に関連する、またはその他の契約、またはその他の請求、またはその他の責任について責任を負いません。