跳转到内容

LNNBot/指令/musicjs

此后如竟没有炬火,我便是唯一的光。
musicjs
属性 严格选项解析
所属插件 @dgck81lnn/music
父级指令 util.script

musicjs 允许用户通过一套 JavaScript API 来合成旋律。

用法

musicjs <code:rawtext>

code 为 JavaScript 代码,提供以下函数和变量:

  • note(tone: number, beats: number, temperament = 12) 创建平均律音符
    相当于 noteHz(baseFrequency * (2 ** (tone / temperament)), beats)
    • tone 音符相对于基准音的偏移(默认情况下,单位为半音)
    • beats 音符时长(拍)
    • temperament 平均律的音阶数;决定了多少 tone 为一个八度
  • noteJust(ratio: number, beats: number) 创建纯律音符
    相当于 noteHz(baseFrequency * ratio, beats)
    • ratio 音符音高与基准音频率的比值
    • beats 音符时长(拍)
  • noteHz(frequency: number, beats: number) 创建指定频率音高的音符
    • frequency 频率(赫兹);为负数时播放噪波,绝对值为采样率
    • beats 音符时长(拍)
  • rest(beats: number) 休止
    • beats 休止时长(拍)
  • bpm: Number = 120 每分钟拍数
    为了兼容一些旧的代码,该变量的初始值是一个可以被隐式转换成数字的函数,可以通过调用修改速度;对其进行有效的赋值后,会变成普通数字。
  • baseFrequency = 440 基准音频率
  • gain = 0.5 音量
  • time = 0 当前时间(秒)

每次创建音符时其开始时间由 time 变量决定,创建音符或休止都会使其值增加。可通过手动减少此值(或用 rest() 休止负的时间)后再创建音符来使其与已创建的音符同时播放。例如,演奏《D大调卡农》靠近开头的两小节:

bpm = 60
note(9, 1); note(7, 1); note(5, 1); note(4, 1) // #F5 E5 D5 #C5
note(2, 1); note(0, 1); note(2, 1); note(4, 1) // B4 A4 B4 #C5
// 由于速度为每分钟 60 拍,演奏了 8 个一拍长的音符,此时 time 为 8.0
// 我们回到最开头,再创建大提琴的音符
time = 0 // 也可以用 rest(-8),后退 8 拍
note(-19, 1); note(-24, 1); note(-22, 1); note(-27, 1) // D3 A2 B2 #F2
note(-26, 1); note(-31, 1); note(-26, 1); note(-24, 1) // G2 D2 G2 A2

参见

  • musicjs*:在本指令的基础上提供了 aj() 等辅助函数,方便编写旋律