KeyStation Mini 32 MK3のMIDI制御スクリプト

M-AUDIOのKeyStation MINI 32 MK3のMIDI制御スクリプトを作成したので添付しておきます。

  • VOLUME: 再生位置の変更
  • SUST(サスティン)): 再生・停止
  • PB(ピッチベンド): 選択しているチャンネルの上下移動
  • MOD(モジュレーション): Pattern/Loopモードの切り替え

なお、ピッチベンドとモジュレーションの速度は最大(127)にしています。変更方法はM-AUDIO KeyStation 32 MINI MK3 - ユーザーマニュアルを参考にしました。
+ モジュレーションのベンド速度を127にする
  1. 「EDIT」ボタンを押します。「EDIT」ボタンが 100% の明るさで点灯します
  2. 「MODRATE」キー(F、左から 4 番目の白鍵)を押します
  3. E (右から 10 番目の白鍵)を押して「1」を入力します
  4. F (右から 9 番目の白鍵)を押して「2」を入力します
  5. D (右から 4 番目の白鍵)を押して「7」を入力します
  6. 「ENTER」キー(G、右の最後の白鍵)を押します
+ ピッチベンド速度を127にする
  1. 「EDIT」ボタンを押してエディット・モードをオンにします。「EDIT」ボタンが 100% の明るさで点灯します。
  2. 「PB RATE」キー(E、左から 3 番目の白鍵)を押します。
  3. E (右から 10 番目の白鍵)を押して「1」を入力します。
  4. F (右から 9 番目の白鍵)を押して「2」を入力します。
  5. D (右から 4 番目の白鍵)を押して「7」を入力します。
  6. 「ENTER」キー(G、右の最後の白鍵)を押すと、「EDIT」ボタンが 50% の明るさになり、プログラミ ングが完了したことを示します。


M-AUDIOの "KeyStation Mini 32 MK3" は値段もサイズもお手頃 (32鍵盤、6000円、重さ0.5kg) なので、モバイル作曲時のMIDIキーボードとしておすすめです。


#name=M-AUDIO KeyStation Mini 32 MK3
# ↑使用しているデバイスの名前.
import transport # FLのTransport(Play, Stop, Pause & Record)を操作する.
import channels # FLのチャンネルラック操作.
import patterns # FLのパターン操作.
import plugins # FLのプラグイン操作.
import ui # FLのUI操作.
 
# 定義が見つからないのでここで定義してみる...
SONGLENGTH_MS = 0 # SONGモードの長さをMSで取得.
 
# MIDI信号/CCの番号.
KS32_VOLUME = 7 # ボリューム
KS32_MOD = 1 # モジュレーション番号.
KS32_SUSTAIN = 64 # サスティン.
 
VAL_MIN = 0 # 値の最小.
VAL_MAX = 127 # 値は0〜127まで.
 
## MIDI入力時に呼び出されるコールバック関数.
def OnNoteOn(event):
  # FLが受け取ったMIDI信号を出力.
  print("note on channel:%d number:%d"%(event.status, event.data1))
 
## CCメッセージ受け取り.
def OnControlChange(event):
  # FLが受け取ったCCを出力.
  print("CC channel:%d number:%d"%(event.status, event.data1))
  print("- data2:%d"%event.data2)
 
  # 選択しているチャンネル番号を取得する.
  channel_idx = channels.channelNumber()
 
  if event.data1 == KS32_VOLUME:
    # ノブの位置で再生位置を移動してみる.
    if transport.getLoopMode() == 0:
      # パターンモード.
      idx = patterns.patternNumber() # 現在選択しているパターン.
      total = patterns.getPatternLength(idx) # パターンの長さ.
      pos = int(total * event.data2 / VAL_MAX)
      print("pos:", pos , " total:", total)
      transport.setSongPos(1.0 * pos / total)
    else:
      # ソングモード.
      total = transport.getSongLength(SONGLENGTH_MS) # 曲の長さ.
      pos = total * event.data2 / VAL_MAX
      print("pos:", pos , " total:", total)
      transport.setSongPos(pos, SONGLENGTH_MS)
    event.handled = True # FLに処理させる.
 
  elif event.data1 == KS32_MOD:
    # ループモード切り替え.
    if event.data2 == 127: # 入力時のみ.
      transport.setLoopMode()
      event.handled = True # FLに処理させる
  elif event.data1 == KS32_SUSTAIN:
    # 再生・停止
    if transport.isPlaying(): # 再生中
      transport.stop() # 停止.
    else: # 停止している.
      transport.start() # 再生.
    event.handled = True # FLに処理させる
 
## プログラムチェンジメッセージのコールバック関数.
def OnProgramChange(event):
  # FLが受け取ったMIDI信号を出力.
  print("program change channel:%d number:%d"%(event.status, event.data1))
 
## システムエクスクルーシブのコールバック関数.
def OnSysEx(event):
    # FLが受け取ったMIDI信号を出力.
    print("sys ex channel:%d number:%d"%(event.status, event.data1))
 
## ピッチベンドのコールバック関数.
def OnPitchBend(event):
  # イベントを処理する場合はこれをTrueにする.
  event.handled = False
 
  # FLが受け取ったMIDI信号を出力.
  print("pitch bend channel:%d number:%d"%(event.status, event.data1))
  print("- data2:%d"%event.data2)
 
  if event.data2 == 127:
    # ピッチを上げる.
    # 選択しているチャンネル番号を返す.
    idx = channels.selectedChannel()
    channels.selectOneChannel(idx+1) # 1つ上を選択する.
    print("selectOneChannel(%d)"%idx)
    event.handled = True # FLに処理させる.
  elif event.data2 == 0:
    # ピッチを下げる.
    print("setFocused(widChannelRack)")
    # 選択しているチャンネル番号を返す.
    idx = channels.selectedChannel()
    channels.selectOneChannel(idx-1) # 1つ下を選択する.
    print("selectOneChannel(%d)"%idx)
    event.handled = True # FLに処理させる.
 
 
最終更新:2024年01月03日 18:40