Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」 その2 ゲームの画面の枠を作る
の続きです
ジョグの入力イベントを作る
- PortMidi.openでDDJ-FLX4を開く
- PortMidi.listenでDDJ-FLX4の信号受付する
- PortMidi.closeでDDJ-FLX4を閉じる
- midi_inでDDJ-FLX4の信号を受信する
defmodule DdjBlock do
@moduledoc """
Documentation for `DdjBlock`.
"""
alias Rayex.Structs.Rectangle
use Rayex
def main() do
+ {_, input} = PortMidi.open(:input, "DDJ-FLX4 MIDI 1")
+ PortMidi.listen(input, self())
+ midi_in(input)
+ PortMidi.close(:input, input)
init_window(800, 800, "DdjBlock")
main_loop(true)
end
defp main_loop(true) do
begin_drawing()
draw()
end_drawing()
Process.sleep(100)
main_loop(!window_should_close())
end
defp main_loop(_), do: nil
defp draw() do
rectangle = %Rectangle{x: 100.0, y: 100.0, width: 100.0, height: 50.0}
draw_rectangle_lines_ex(rectangle, 1, %{r: 0, g: 255, b: 0, a: 255})
end
+ def midi_in(_input) do
+ receive do
+ v ->
+ IO.inspect(v)
+ end
end
end
$ mix ddj
起動ができないから別の方法を考える
理由はわからないがmix tasksと相性悪いかも…
と言うことで
起動スクリプトを作成
ddj.sh
#!/bin/sh
mix run --eval "DdjBlock.main"
実行権限を与える
$ chmod +x ddj.sh
実行
$ ./ddj.sh
ジョグを回したら
{#PID<0.227.0>, [{{144, 54, 127}, 3179}]}
が受信し
その後に画面が開いた
midi_inを連続で受信可能にする
midi_in(input)関数を下記に書き換える
lib/ddj_block.ex
# 省略
def midi_in(input) do
receive do
v ->
IO.inspect(v)
midi_in(input)
end
# 省略
実行すると画面は表示しないがコンソールを観察すると
ジョグを右周りに回すと
{#PID<0.241.0>, [{{176, 33, 65}, 384476}]}
ジョグを左周りに回すと
{#PID<0.241.0>, [{{176, 33, 63}, 526377}]}
この結果からソース改良
lib/ddj_block.ex
# 省略
def midi_in(input) do
receive do
{^input, [{{176, 33, 65}, _}]} ->
IO.inspect("右")
midi_in(input)
{^input, [{{176, 33, 63}, _}]} ->
IO.inspect("左")
midi_in(input)
_ ->
midi_in(input)
end
end
# 省略
問題点画面が表示できない
この問題は次回考える
早速壁にぶち当たる、このままだと企画倒れする