You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JavaScript编程实现特定按键触发调制轮数值提升

MIDI脚本入门:特定音符/按钮触发调制轮提升

你作为音乐人,使用带JavaScript插件的音乐软件处理MIDI数据,想要实现按下A2或特定按钮时提升调制轮数值,下面针对你的三个疑问逐一解答:


1. 如何判断按下的是A2这类特定音符?

MIDI中每个音符对应唯一的MIDI音高编号,A2的编号是45。你可以通过event.pitch属性判断,同时要区分音符按下(NoteOn)和释放(NoteOff)事件:

function HandleMIDI(event) {
  // 只处理音符按下事件
  if (event instanceof NoteOn) {
    // 判断是否为A2(MIDI音高45)
    if (event.pitch === 45) {
      // 后续触发调制轮的逻辑写在这里
    }
    event.send(); // 正常转发原音符事件
  } else {
    event.send(); // 其他MIDI事件正常转发
  }
}

注:其他音符的MIDI编号可通过MIDI音高对照表或软件自带的MIDI监测工具查询。


2. 如何判断按下的是特定按钮?

键盘上的按钮一般分为两类,对应不同的MIDI事件:

  • CC控制按钮:对应ControlChange事件,每个按钮有专属的CC编号,按下时value通常为127,释放为0
  • 打击垫按钮:本质是NoteOn事件,对应特定的MIDI音高编号

以CC按钮为例,假设目标按钮对应CC编号10,代码如下:

function HandleMIDI(event) {
  // 处理CC按钮按下事件
  if (event instanceof ControlChange) {
    if (event.number === 10 && event.value === 127) {
      // 后续触发调制轮的逻辑写在这里
    }
    event.send();
  } 
  // 同时保留音符判断逻辑
  else if (event instanceof NoteOn) {
    if (event.pitch === 45) {
      // 触发调制轮逻辑
    }
    event.send();
  } else {
    event.send();
  }
}

如果是打击垫按钮,直接用第一个问题的音符判断方式,查询对应MIDI音高即可。


3. 如何覆盖当前调制轮的数值?

调制轮对应MIDI标准中的CC编号1,你需要创建新的ControlChange事件并发送,以此覆盖当前数值:

直接设置固定值(比如最大值127)

function HandleMIDI(event) {
  // A2按下时触发
  if (event instanceof NoteOn && event.pitch === 45) {
    // 创建调制轮CC事件
    const modWheelEvent = new ControlChange();
    modWheelEvent.number = 1; // 调制轮的CC编号
    modWheelEvent.value = 127; // 设置为最大值,范围0-127
    modWheelEvent.send(); // 发送事件覆盖当前值
    event.send(); // 转发原音符事件
  }
  // 特定CC按钮按下时触发
  else if (event instanceof ControlChange && event.number === 10 && event.value === 127) {
    const modWheelEvent = new ControlChange();
    modWheelEvent.number = 1;
    modWheelEvent.value = 127;
    modWheelEvent.send();
    event.send();
  } else {
    event.send();
  }
}

实现“逐步提升”效果

如果需要每次按下时提升一定数值(而非直接设为最大值),可以用全局变量保存当前调制轮数值:

let currentModValue = 0; // 全局变量记录当前调制轮数值

function HandleMIDI(event) {
  // 监听调制轮自身的变化,更新当前值
  if (event instanceof ControlChange && event.number === 1) {
    currentModValue = event.value;
    event.send();
  }

  // A2按下时提升20(不超过最大值127)
  if (event instanceof NoteOn && event.pitch === 45) {
    currentModValue = Math.min(currentModValue + 20, 127);
    const modWheelEvent = new ControlChange();
    modWheelEvent.number = 1;
    modWheelEvent.value = currentModValue;
    modWheelEvent.send();
    event.send();
  }

  // 其他事件正常转发
  else {
    event.send();
  }
}

内容的提问来源于stack exchange,提问作者Guilian Nkamga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:56:41