7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 14

Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」 その3 ジョグの入力イベントを作る

Last updated at Posted at 2024-12-13

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

下記のエラーになりました
image.png

起動ができないから別の方法を考える

理由はわからないが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}]}が受信し
その後に画面が開いた
image.png

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
# 省略

実行しジョグを回すと下記になる
image.png

問題点画面が表示できない

この問題は次回考える

早速壁にぶち当たる、このままだと企画倒れする

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?