《MainStage 使用手册》
- 欢迎使用
- 版权
在 MainStage 中使用 JavaScript Event 对象
调用 HandleMIDI 函数时,一个 Event 对象代表一个 MIDI 事件,并且执行你可以在脚本中调用的多个方法。
虽然 Event 对象并未直接实例化,但是它是以下事件特定的方法、属性和类型的原型。
【提示】可使用 JavaScript 的“new”关键字生成任意类型 Event 对象新实例。
事件方法
Event.send():发送事件。
Event.sendAtBeat(number beat):在指定值(可以是一个整数或浮点数)过去之后发送事件。
Event.sendAtBeat(number beat):在主机时间线中的特定节拍(浮点数)时发送事件。
Event.sendAfterBeats(number beat):同上,但会使用该节拍值作为当前位置处节拍中的延迟。
Event.trace():将事件打印到插件控制台。请参阅使用 Trace 对象。
Event.toString():返回表示事件的字符串。
事件属性
Event.toarticulationID(integer number):设定运音法 ID (0-254)。
Event.channel(number):设定 MIDI 通道 1 至 16。
Event.beatPos:获取事件的准确节拍位置。
事件类型
Event 对象是以下事件类型的原型。所有事件类型都继承上述方法和通道属性。
事件类型及其属性按照以下方式传给 HandleMIDI:
NoteOn.pitch(integer number):音高从 1 到 127。
NoteOn.velocity(integer number):力度从 0 到 127。力度值 0 解释为音符关事件,而不是音符开。
NoteOff.pitch(integer number):音高从 1 到 127。
NoteOff.velocity(integer number):力度从 0 到 127。
PolyPressure.pitch(integer number):音高从 1 到 127。
PolyPressure.value(integer number):定义压力值从 0 到 127。
ControlChange.number(integer number):控制器编号从 0 到 127。
ControlChange.value(integer number):控制器值从 0 到 127。
ProgramChange.number(integer number):音色变化编号从 0 到 127。
ChannelPressure.value(integer number):触后响应值从 0 到 127。
PitchBend.value(integer number):14 位弯音值从 -8192 到 8191。中心值为 0。
TargetEvent.target(string):创建可由用户定义的 MIDI CC 信息或控制插件参数。
TargetEvent.value(float):设定目标值。
载入相应的 Tutorial 设置以在脚本编辑器中查看脚本。这有助于你理解语法结构以及代码和注释的布局。请参阅使用脚本编辑器。
Tutorial 脚本 7:事件创建
在 MainStage中,此示例使用调制控制更改信息替换接收的每个 MIDI 事件。
“/*”之后的文本显示解释 JavaScript 代码的注释。
【提示】可使用 JavaScript 的“new”关键字生成任意类型 Event 对象新实例。
function HandleMIDI() {
var cc = new ControlChange; /* make a new control change message */
cc.number = 1; /* set it to controller 1 (modulation) */
cc.value = 100; /* set the value */
cc.send(); /* send the event */
cc.trace(); /* print the event to the console */
}
Tutorial 脚本 8:事件修改
在 MainStage中,此示例使用 C3 音符开/关替换接收的每个 MIDI 事件。该示例还使用 NeedsTimingInfo 变量。请参阅使用 JavaScript TimingInfo 对象。
“/*”之后的文本显示解释 JavaScript 代码的注释。
【提示】可使用 JavaScript 的“new”关键字生成任意类型 Event 对象新实例。
var NeedsTimingInfo = true; /* needed for .sendAfterBeats() to work */
function HandleMIDI() {
var on = new NoteOn; /* make a new note on */
on.pitch = 60; /* set its pitch to C3 */
on.send(); /* send the note */
var off = new NoteOff(on); /* make a note off using the note on to initialize its pitch value (to C3) */
off.sendAfterBeats(1); /* send a note off one beat later */
}
Tutorial 脚本 15:控制插件
在 MainStage中,你可以创建可由用户定义的 MIDI CC 信息或控制插件参数。TargetEvent 会从用户可选择目的位置 MIDI CC 的菜单读取将要修改的参数。或者,你可以使用“学习插件参数”功能来分配在相同通道条中插入到 Scripter 之后(下方)的任意插件参数。选定的目的位置将与插件设置一同存储。
“/*”之后的文本显示解释 JavaScript 代码的注释。
【提示】可使用 JavaScript 的“new”关键字生成任意类型 Event 对象新实例。
TargetEvent properties:
TargetEvent.target(string) /* Name of target menu entry */
TargetEvent.value(float) /* Value of set Target from 0.0 to 1.0 */
下方所示代码通过调制轮来控制任意插件参数。若要测试 Tutorial 脚本 15 的函数,请将任意插件或软件乐器插入到相同通道并运行脚本。在菜单中选取“学习插件参数”,然后点按任意插件参数以通过调制轮控制。
若要创建一个调制轮目标的菜单,请给菜单条目命名并将其设为“目标”类型。
var PluginParameters = [
/* parameter 0 */
{
name:"Modwheel Target",
type:"target"
}];
在 Tutorial 脚本 15 中,每次脚本编辑器接收到 MIDI 事件都会调用 HandleMIDI。下方所示代码将调制轮重新映射到菜单中所选的目标。
function HandleMIDI(incomingEvent)
{
/* remap modulation to target selected in menu and
check for incoming CC event with number 1 (Modwheel) */
if ((incomingEvent instanceof ControlChange) && (incomingEvent.number == 1))
{
var newEvent = new TargetEvent(); /* create new Target event */
newEvent.target = "Modwheel Target"; /* name the menu entry to be used by this event */
newEvent.value = incomingEvent.value / 127; /* rescale from 0..127 to 0.0...1.0 */
newEvent.send(); /* send the event */
} else
{
/* send all other events */
incomingEvent.send();
};
};