PioneerDjのDDJ-FLX4でLチカを実装します
前提
でportmidiが設定済みとします
DDJ-FLX4のPad LEDの仕様
まず、DDJ-FLX4のPadを光らせるMIDIの通信仕様を理解する必要があります
MIDIは3バイトで1つの命令になります
16進数で表現します
Padの場合
デッキ番号
, Pad番号
, LEDのON/OFF
の3バイトになります
デッキ番号
デッキは2つあります
- デッキ1(左)
97
- デッキ2(右)
99
Pad番号
上段左から
- Pad1
00
- Pad2
01
- Pad3
02
- Pad4
03
下段段左から
- Pad5
04
- Pad6
05
- Pad7
06
- Pad8
07
LEDのON/OFF
- ON
7F
- OFF
00
例
デッキ1(左)
上段左の1つめのPadをLEDをON
97
, 00
, 7F
デッキ2(左)
上段左の1つめのPadをLEDをOFF
97
, 00
, 00
ElixirでPadのLチカをする
プログラムの仕様
- Pad1〜Pad8までLEDをON/OFF
- デッキ1,デッキ2は交互に光らせる
例
- デッキ1のPad1→デッキ2のPad1
- デッキ1のPad2→デッキ2のPad2
︙ - デッキ1のPad8→デッキ2のPad8
lib/pad.ex
defmodule Pad do
@moduledoc """
Documentation for `pad`.
"""
@led_on "7F"
@led_of "00"
@pad1 "00"
@pad2 "01"
@pad3 "02"
@pad4 "03"
@pad5 "04"
@pad6 "05"
@pad7 "06"
@pad8 "07"
@deck1 "97"
@deck2 "99"
@pad_list [@pad1, @pad2, @pad3, @pad4, @pad5, @pad6, @pad7, @pad8]
def start() do
{_, output} = PortMidi.open(:output, "DDJ-FLX4 MIDI 1")
Enum.each(0..7, fn pad -> pad_led(output, pad) end)
PortMidi.close(:output, output)
end
def pad_led(output, pad) do
pad_hex = Enum.at(@pad_list, pad)
pad_led(output, @deck1, pad_hex)
pad_led(output, @deck2, pad_hex)
end
def pad_led(output, deck, pad) do
[deck, pad, @led_on]
|> send_midi(output)
Process.sleep(500)
[deck, pad, @led_of]
|> send_midi(output)
Process.sleep(100)
end
def send_midi(v, output) do
Enum.map(v, fn x -> hex_to_dec(x) end)
|> List.to_tuple()
|> then(&PortMidi.write(output, &1))
end
def hex_to_dec(hex), do: String.to_integer(hex, 16)
end
実行
$ mix run --eval "Pad.start()"