通过此函数成功打开 MIDI 设备的线程会被指定为设备的执有线程,执行线程退出时将负责自动释放设备。
执有线程是主线程时则允许其他线程的 sys.midiOut.play 共用此设备,否则将独占设备直到执有线程退出。
在执有线程内调用 sys.midiOut.play 是容错的,不必添加多余的 try 或 call 保护。
此函数在打开设备失败时(例如没有声卡,或设备被其他线程占用)忽略不执行任何操作,不会抛出异常。
使用说明
打开 MIDI 设备的规则
关于
sys.midiOut.play(...)sys.midiOut.play(...) 会自动打开默认 MIDI 输出设备,
如果主线程或当前线程之前已通过此方式打开默设备,则直接重用而非重复打开设备。sys.midiOut() 且不指定任何参数时会可以返回默认设备对象的副本(此副本的 close 方法将被置为空函数)。
其他非执有线程调用 sys.midiOut() 或 sys.midiOut(-1) 都会失败(同一进程内不能重复打开同一 MIDI 输出设备)。
» sys.midiOut 使用指南 - 使用编程记谱法合成音乐
打开 MIDI 输出设备。
所有参数都可以省略,一般不需要了解,用法细节请查看源码。
可选用 @deviceId 指定设备 ID
设备 ID 从 0 开始且小于 sys.midiOut.numDevice 函数返回值,
省略则为默认值 -1,也就是 _MIDI_MAPPER
如果未指定任何参数并且当前线程之前通过 sys.midiOut.play 自动打开了默认设备,
参数指定其他 sys.midiOut 对象,
返回复制的副本对象。
副本对象可指定不同的 channel 属性,
并可调用 changeInstrument 函数切换不同的乐器
MIDI 音乐输出设备
打开 MIDI 音乐输出设备。
成功返回设备对象,失败返回 null,错误信息。
返回的设备对象可传到其他线程,或复制多个副本对象,
副本对象可指定不同的 channel 属性,
并可调用 changeInstrument 函数切换不同的乐器,
可实现多线程多乐器多通道合奏
在同一进程中如果未关闭设备则不能重复打开,
不同进程可以打开同一设备
for deviceId,capabilities in sys.midiOut.eachDevice(){
/*循环遍历所有 MIDI 输出设备,
deviceId 为设备 ID,capabilities 为 MIDIOUTCAPS 结构体*/
}
定义了全部音符的命名空间,
键为 SPN 音名,值为音高(pitch)。
音名中的 -1 省略,升号 ♯(Sharp) 必须用小写 s 替代。
例如:C-1♯ 略写为 Cs
可用 namespace sys.midiOut.notes { } 语句打开此命名空间使用音名
此命名空间还包含所有音名的小写音名,
小写音名为对应音高取负并减 1。
正值作为音符参数传给 note 函数演奏该音符,
负值作为音符参数传给 note 函数停止演奏对应音符
此命名空间的下划线 _ 的值为 250,
传入 note,xcal 等函数可延时 250 毫秒
解析字符串格式乐谱并返回 play 函数支持的音符数组,
所有音符或指令使用逗号、竖线、换行之一分开,忽略空格与制表符。
不符合格式要求的项一律作为字幕传给 log 函数输出
解析字符串格式乐谱并返回 play 函数支持的音符数组。
参数 @notes 指定一个字符串,
在字符串中所有音符或指令使用逗号、竖线、半角空格、制表符、换行之一分开,忽略多余空白字符。
除了支持 sys.midiOut.notes 定义的全部音名,
也可以使用简谱记号 1,2,3,4,5,6,7 表示音符,
数字音符后加 N(小于 5 )个单引号表示提高 N 个八度音,
数字音符前加 N(小于 5 )个单引号表示降低 N 个八度音。
数字音符(包括单引号)前再加 # 号表示升高半个音,0 为休止符。
下划线则表示一个延时单位,其他数值也表示延时(毫秒),
前面的音符(或下划线)与后面的下划线可以连起来写。
双下划线 ‗ 表示 _ 的延时取半,多个 ‗ 不能连着写。
支持函数语法,例如 "1,delay(120)"
如果 @notes 为字符串,可选用 @baseNote 参数指定音符1表示的基准音,默认为"C4",
可选用 @tempoMs 参数指定下划线表示的延时单位,默认 250 毫秒
解析所有音符与指令并使用默认 MIDI 输出设备输出 MIDI 音乐。
在导入 win.ui 的线程会调用 sys.midiOut 对象的 playAsync 方法创建独立线程异步播放音乐,
未导入 win.ui 的线程则会调用 playSync 方法同步播放。
如果要实现更精细地控制,请改用 sys.midiOut 打开设备而非直接使用此函数。
此函数会自动打开默认 MIDI 输出设备,并在线程退出时自动释放打开的设备。
如果主线程或当前线程之前已通过此方式打开默认设备,则直接重用该设备;
通过此函数成功打开默认 MIDI 输出设备的线程会被设为设备的执有线程。
执有线程是主线程时则允许其他线程共用设备,否则将独占设备直到线程退出或释放设备。
此函数失败时会静默忽略,不会抛出异常。
使用默认设备解析并播放所有音符(非阻塞异步播放)。
如果参数 @note 是一个数组,则循环调用 sys.midiOut 对象的 xcall 方法解析并播放音符。
如果参数 @notes 是一个字符串,
则首先调用 sys.midiOut.parseNotes 解析为音符数组,
字符串内所有音符或指令使用逗号、竖线、半角空格、制表符、换行之一分开,忽略多余的空白字符。
除了支持 sys.midiOut.notes 定义的全部音名,
也可以使用简谱记号 1,2,3,4,5,6,7 表示音符。
数字音符后加 N(小于 5 )个单引号表示提高 N 个八度音,
数字音符前加 N(小于 5 )个单引号表示降低 N 个八度音。
数字音符(包括单引号)前再加 # 号表示升高半个音,0 为休止符。
下划线则表示一个延时单位,其他数值也表示延时(毫秒),
前面的数字音符(或下划线)与后面的下划线可以连起来写。
双下划线 ‗ 表示 _ 的延时取半,多个 ‗ 不能连着写。
支持函数语法,例如 "1,delay(120)"
如果 @notes 为字符串,可选用 @baseNote 参数指定音符1表示的基准音,默认为"C4",
可选用 @tempoMs 参数指定下划线表示的延时单位,默认 250 毫秒
单个按键的触后效果,
指击键后通过改变对键盘的压力来改变音色符。
@pitch 用字符串指定数字音符或 SPN 音名,也可用 0~127 范围的值直接指定音高。
@pressure 指定压力,可指定 0~127 范围的值。
@channel 可用 0~16 范围的值指定通道,省略则默认为当前通道。
注意指定 @channel 并不会修改当前通道
play、playSync、playAsync 是否根据音符后的首个延时自动发送 Note Off,默认为 true。
默认将音符(或连续音符组成的和弦)后面的首个延时视为音符时值,并在延时结束时释放该组音符。
直接调用 noteOn 不受此属性影响。需要自行使用负数音符或 noteOff 精确控制音符释放时,可设为 false
发送 CC(Continuous controller) 消息
@number 指定编号,@value 指定值,
可选用 @channel 指定通道,省略则默认为当前通道。
注意指定 @channel 并不会修改当前通道
切换乐器,
@instrument 指定乐器编号,可选编号为 0~127 范围的值。
乐器编号就搜索 MIDI 资料。
@channel 可用 0~16 范围的值指定通道,省略则默认为当前通道。
注意指定 @channel 并不会修改当前通道
默认通道,可指定 0~16 范围的值。
如果将 sys.midiOut 传入不同的线程,
或以 sys.midiOut 为构造参数复制对象,
则可指定不同的 channel 属性,切换不同的乐器,
实现多通道合奏
所有按键的触后通道压力。
@pressure 指定压力,可指定 0~127 范围的值。
可选用 @channel 指定通道,省略则默认为当前通道
关闭所有线程的同一设备对象,
不应关闭在其他线程已关闭的对象。
对象回收时不会自动调用此函数。
在同一进程中如果未关闭设备则不能重复打开,
不同进程可以打开同一设备
延迟参数 @1 指定的毫秒数
获取音量,0xFFFF 为最大值,0 为静音
用于输出字幕,默认是一个空函数。
可指定为其他可输出内容的函数。
此函数仅接受一个要输出的字符串参数
发送消息,
@msg 指定消息 ID,其他参数为数值
演奏或停止演奏
演奏或停止演奏
@pitch 如果指定 0~127 范围的值指定音高,则演奏指定音符。
如果指定 -1~-128之间的值,则取正数并减一,然后停止演奏音高的音符。
@velocity 指定按键速度(音量强度),可指定 0~127 范围的值。
@channel 可用 0~16 范围的值指定通道,省略则默认为 0
停止演奏音符
停止演奏音符
@pitch 可用 0~127 范围的值指定音高。
@channel 可用 0~16 范围的值指定通道,省略则默认为当前通道
演奏音符
演奏音符。
@pitch 可用 0~127 范围的值指定音高,相邻为半音,隔一为全音。
@velocity 指定按键速度(音量强度),可指定 0~127 范围的值。
@channel 可用 0~16 范围的值指定通道,省略则默认为当前通道
调整弯音轮
@value 用一个小数指定音高弯曲比例。
0 ~ 0.5 表示向下弯曲,0.5 ~ 1 表示向上弯曲
调整弯音轮
@value 用 14 位整数指定 0~16383 范围的音高弯曲值。
0表示向下弯曲2个半音,16383表示向上弯曲2个半音
解析并播放所有音符与指令。
在导入 win.ui 库的界面线程中此方法会立即返回并使用延时器异步启动播放,播放时仍然可以处理窗口消息(可能阻塞播放过程)。在未导入 win.ui 库的工作线程中此函数直接调用 playSync 函数。
解析并播放所有音符。
如果参数 @note 是一个数组,则循环调用 xcall 函数解析并播放音符。
如果参数 @notes 是一个字符串,
则首先调用 sys.midiOut.parseNotes 解析为音符数组,
字符串内所有音符或指令使用逗号、竖线、半角空格、制表符、换行之一分开,忽略多余的空白字符。
除了支持 sys.midiOut.notes 定义的全部音名,
也可以使用简谱记号 1,2,3,4,5,6,7 表示音符。
数字音符后加 N(小于 5 )个单引号表示提高 N 个八度音,
数字音符前加 N(小于 5 )个单引号表示降低 N 个八度音。
数字音符(包括单引号)前再加 # 号表示升高半个音,0 为休止符。
下划线则表示一个延时单位,其他数值也表示延时(毫秒),
前面的数字音符(或下划线)与后面的下划线可以连起来写。
双下划线 ‗ 表示 _ 的延时取半,多个 ‗ 不能连着写。
支持函数语法,例如 "1,delay(120)"
如果 @notes 为字符串,可选用 @baseNote 参数指定音符1表示的基准音,默认为"C4",
可选用 @tempoMs 参数指定下划线表示的延时单位,默认 250 毫秒
在界面线程中可选用 @startDelay 参数指定异步启动播放的延迟毫秒数
解析并播放所有音符与指令。
此方法会创建独立线程异步播放音乐,不会被界面线程的耗时代码阻塞播放过程。
如果在较空闲的界面线程中播放短促的音乐,使用 playAsync 方法通常是不必要的。
解析并播放所有音符。
如果参数 @note 是一个数组,则循环调用 xcall 函数解析并播放音符。
如果参数 @notes 是一个字符串,
则首先调用 sys.midiOut.parseNotes 解析为音符数组,
字符串内所有音符或指令使用逗号、竖线、半角空格、制表符、换行之一分开,忽略多余的空白字符。
除了支持 sys.midiOut.notes 定义的全部音名,
也可以使用简谱记号 1,2,3,4,5,6,7 表示音符。
数字音符后加 N(小于 5 )个单引号表示提高 N 个八度音,
数字音符前加 N(小于 5 )个单引号表示降低 N 个八度音。
数字音符(包括单引号)前再加 # 号表示升高半个音,0 为休止符。
下划线则表示一个延时单位,其他数值也表示延时(毫秒),
前面的数字音符(或下划线)与后面的下划线可以连起来写。
双下划线 ‗ 表示 _ 的延时取半,多个 ‗ 不能连着写。
支持函数语法,例如 "1,delay(120)"
如果 @notes 为字符串,可选用 @baseNote 参数指定音符1表示的基准音,默认为"C4",
可选用 @tempoMs 参数指定下划线表示的延时单位,默认 250 毫秒
解析并播放所有音符与指令。
此方法在播放完成后才会返回,播放时仍然可以处理窗口消息(可能阻塞播放过程)。
在界面线程中通常应当使用导步启动播放的 play 方法。
解析并播放所有音符。
如果参数 @note 是一个数组,则循环调用 xcall 函数解析并播放音符。
如果参数 @notes 是一个字符串,
则首先调用 sys.midiOut.parseNotes 解析为音符数组,
字符串内所有音符或指令使用逗号、竖线、半角空格、制表符、换行之一分开,忽略多余的空白字符。
除了支持 sys.midiOut.notes 定义的全部音名,
也可以使用简谱记号 1,2,3,4,5,6,7 表示音符。
数字音符后加 N(小于 5 )个单引号表示提高 N 个八度音,
数字音符前加 N(小于 5 )个单引号表示降低 N 个八度音。
数字音符(包括单引号)前再加 # 号表示升高半个音,0 为休止符。
下划线则表示一个延时单位,其他数值也表示延时(毫秒),
前面的数字音符(或下划线)与后面的下划线可以连起来写。
双下划线 ‗ 表示 _ 的延时取半,多个 ‗ 不能连着写。
支持函数语法,例如 "1,delay(120)"
如果 @notes 为字符串,可选用 @baseNote 参数指定音符1表示的基准音,默认为"C4",
可选用 @tempoMs 参数指定下划线表示的延时单位,默认 250 毫秒
关闭所有音符
使用参数 @1 设置 xcall,play 函数默认按键速度(音量),
参数可指定 0~127 范围的值
指定音量,0xFFFF 为最大值,0 为静音
发送短消息
发送短消息。
@status 指定数值,0xC0 为切换乐器,0x90 为发送音符。
@data1,@data2 可选指定数值
xcall,play 函数默认按键速度(音量),
参数可指定 0~127 范围的值
如果参数指定一个数组,
则数组的第 1 个元素指定要调用的成员函数名,
其他元素为调用参数
例如: {"pitchBend",0.3}
如果参数指定一个大于 127 的数值,则延时指定的时间,
如果为 0~127 间的数值则按下指定音符。
如果为 -1 到 -128 的数值则消音指定的音符。
按下音符与消音可以使用 sys.midiOut.notes 命名空间的音名表示。
如果为字符串则调用 log 函数输出。
指定上述参数函数返回 true,指定其他数值返回 null,
参数为其他数据类型会报错。
播放失败或 thread.delay 检测到消息泵终止返回 false 。
sysMidiOutObject.onNote = function(pitch,velocity,channel){
/*演奏指定音符时回调此函数,
回调参数为 noteOn 函数的调用参数。
这里最好不要阻塞线程,可用 thread.command 异步调用界面线程函数*/
}