自作MIDIコントローラースクリプト置き場 > M-Audio Keystation Mini 32 MK3

M-Audio Keystation Mini 32 MK3の自作スクリプト



概要

  • 動作確認バージョン: Bitwig 5.3.5
目的
  • Velocity固定にしたい
  • Volumeノブで現在のトラックの音量を変えたい
  • ループ区間内の再生開始ヘッドを動かしたい (※Volumeノブを優先して無効化)
スクリプト
// -----------------------------------------------
// 定数
// -----------------------------------------------
var FIXED_VELOCITY = 100; // 任意の固定値(1~127)
 
// -----------------------------------------------
// 初期化.
// -----------------------------------------------
// スクリプトのバージョン指定.
loadAPI(17)
// スクリプトのエラーチェックを有効化.
host.setShouldFailOnDeprecatedUse(true)
 
// 作成者、対応するMIDIコントローラー名、バージョン、UUIDを設定.
host.defineController("M-Audio", "M-Audio Keystation Mini 32 MK3", "1.0", "d98a02f0-d302-c7f3-93c0-13299c060d05", "syun77");
// MIDIポートの入力と出力数.
host.defineMidiPorts(1, 0);
 
// -----------------------------------------------
// グローバル変数.
// -----------------------------------------------
// transport変数.
var transport;
// MIDI入力
var noteInput;
// ループ位置.
var loopStart = 0; // 開始.
var loopLength = 0; // ループの長さ.
// 現在選んでいるトラック情報.
var cursorTrack;
 
// 初期化.
function init() {
  // MIDI信号受け取りのコールバックを設定.
  var midiIn = host.getMidiInPort(0);
  midiIn.setMidiCallback(onMidi);
 
  // Transportを生成.
  transport = host.createTransport();
  transport.arrangerLoopStart().addValueObserver(function(value) {
      loopStart = value; // 開始位置のコールバック。小節単位
  });
  transport.arrangerLoopDuration().addValueObserver(function(value) {
      loopLength = value; // ループの長さのコールバック。小節単位
  });
 
  // 通常のNote処理.
  noteInput = host.getMidiInPort(0).createNoteInput("My MIDI Input");
  noteInput.setShouldConsumeEvents(false); // コールバックで受け取れるようにする.
 
  // 現在選択中のトラックを取得
  cursorTrack = host.createCursorTrack("CursorTrack", "Cursor Track", 0, 0, true);
 
  // 初期化完了メッセージ.
  //host.showPopupNotification("Init: Keystation Mini 32 MK3");
}
 
// ループ区間の再生ヘッドの移動.
// @param ratioは0.0〜1.0の想定.
function movePlayheadWithinLoop(ratio) {
	//if(transport.isArrangerLoopEnabled() == false) {
		// TODO: ループ区間が無効の場合はプロジェクト全体の長さから設定した方が良いかもしれない.
	//}
	if(ratio < 0) { ratio = 0; }
	if(ratio > 1) { ratio = 1; }
 
	var newPosition = loopStart + loopLength * ratio
  transport.setPosition(newPosition);
}
 
// 現在のトラックの音量を設定
// @param ratioは0.0〜1.0の想定.
function setCurrentTrackVolume(ratio) {
  if(ratio < 0) { ratio = 0; }
  if(ratio > 1) { ratio = 1; }
 
	cursorTrack.volume().set(ratio);
}
 
// MIDI信号の受け取り.
function onMidi(status, data1, data2) {
  // 受け取ったMIDI信号をデバッグ出力.
  println("MIDI Received - Status: " + status + ", Data1: " + data1 + ", Data2: " + data2);
  if(status == 176) {
    if(data1 == 64) { // Sustainペダル.
      // 再生.
     transport.togglePlay();
     println("transport play triggered!");
     return;
    }
    if(data1 == 7) { // チャンネルボリューム.
      var ratio = data2 / 127.0;
      // 現在のトラックの音量を動かす.
      setCurrentTrackVolume(ratio);
      // 再生ヘッドを動かしてみる.
      //movePlayheadWithinLoop(ratio);
      return;
    }
  }
 
  // 通常の処理.
  // ノートオン: 0x90~0x9F, ノートオフ: 0x80~0x8F
  var isNoteOn = (status & 0xF0) === 0x90 && data2 > 0;
  var isNoteOff = (status & 0xF0) === 0x80 || ((status & 0xF0) === 0x90 && data2 === 0);
 
  if (isNoteOn) {
      // ノートオンのvelocityを固定値に
      noteInput.sendRawMidiEvent(status, data1, FIXED_VELOCITY);
  } else if (isNoteOff) {
      // ノートオフはvelocity 0で送信(または元の値を使う)
      noteInput.sendRawMidiEvent(status, data1, 0);
  } else {
      // それ以外のMIDIメッセージはそのまま
      noteInput.sendRawMidiEvent(status, data1, data2);
  }
}
 
function exit() {
    // 終了時の処理
}
 

関連ページ

最終更新:2025年04月24日 08:10