音乐符号怎么画(乐理知识符号大全)
音乐符号怎么画(乐理知识符号大全)
我们使用简单的开发工具 aardio ,体积只有几 MB,下载打开就可以编程了,不需要任何复杂的配置。
入门示例
使用 aardio 新建一个源码文件:
输入以下代码,点击
「运行」
按钮合成并播放乐曲:
importsys.midiOut; //打开播放设备 varmidiOut=sys.midiOut(); //播放简谱 midiOut.play(" 两只老虎, 1__,2__,3__,1__, 两只老虎, 1__,2__,3__,1__, 跑得快, 3__,4__,5__,__, 跑得快, 3__,4__,5__,__, 一只没有耳朵, 5_,6_,5_,4_,3__,1__, 一只没有尾巴, 5_,6_,5_,4_,3__,1__, 真奇怪, 2__,'5__,1__,__ ");
编程记谱规则
上面的编程记谱法基于简谱记号设计。
所有音符或演奏指令以逗号或换行分开,忽略空格、制表符。
0 表示休止符。
中音使用简谱记号:
"1,2,3,4,5,6,7"
高音在后面加单引号( 可加多个,每个单引号增高八度 ):
"1',2',3',4',5',6',7'"
低音在音符前面加单引号( 可加多个,每个单引号降低八度 ):
"'1,'2,'3,'4,'5,'6,'7"
数字音符前面加 # 高表示升高半个音,示例:
"#1,__,#'5___,#6'___"
前面加负号表示消音(停止演奏指定音符),示例:
"-5,-'5"
用下划线表示一个延时单位(默认为 250 毫秒 ),前面的音符(或下划线)与后面的下划线可以连起来写,例如:
"5___,5___"
可以用双下划线 ? 表示半个下划线表示的延时,例如"5,?,5?",多个 ? 不允许连着写。
记谱时可以直接调用 midiOut 的成员函数,函数名后必须有括号 () 且必须有参数,例如:
"pitchBend(0.6),1__,2__,3__"
pitchBend 函数用于弯音,参数为表示百分比的小数,0 ~ 0.5 为向下弯音,0.5 ~ 1 为向上弯音。更多可用函数请参考库函数文档。
其他数值表示延时,其他字符串表示字幕。
下面是一个小例子:
importsys.midiOut; varmidiOut=sys.midiOut(); //播放简谱 midiOut.play(" 1,150, pitchBend(0.6),弯音, 500,延时500毫秒, -1,停(音符前加负号表示消音) 1000 ");
转换简谱为程序代码
我们学习一下怎么翻译简谱,先找个简谱:
4/4 表示以四分音符为一拍,每小节有 4 拍。那么我们用 2 个下划线表示一拍(也就是 500 毫秒 ),那么 上面的
我们翻译为代码:
1__,2__,3__,1__,
再看下面的简谱:
这上面的短横线为增时线,表示增加一拍(这里是 500 毫秒,代码里就是增加 2 个下划线 ),所以上面的简谱翻译为代码就是:
3__,4__,5__,__,
然后我们再看简谱:
音符下面的横线是减时线,也就是由一拍减为半拍(这里是 250 毫秒,代码里用一个下划线表示),所以上面的简谱翻译为代码就是:
5_,6_,5_,4_,3__,1__,
最后生成完整源代码如下:
importsys.midiOut; //打开播放设备 varmidiOut=sys.midiOut(); //播放简谱 midiOut.play(" 1__,2__,3__,1__, 1__,2__,3__,1__, 3__,4__,5__,__, 3__,4__,5__,__, 5_,6_,5_,4_,3__,1__, 5_,6_,5_,4_,3__,1__, 2__,'5__,1__,__ ");
要特别注意上面有一个低音 '5,音符前面加个单引号表示低音。
自定义音高、拍子快慢
midiOut.play 函数可选用第 2 个参数指定音符 1 对应的 SPN 音名( 可用音名在 sys.midiOut.notes 名字空间定义 ),默认值为 "C4"。可选用第 3 个参数指定单个下划线对应的延时单位(默认为 250 毫秒 )
我们将上面示例的音符 1 改为 "E4" (其他数字音符会自动调整音高),一个延时单位改为 125 毫秒(加快一倍),代码如下:
importsys.midiOut; //打开播放设备 varmidiOut=sys.midiOut(); //播放简谱 midiOut.play(" 两只老虎, 1__,2__,3__,1__, 两只老虎, 1__,2__,3__,1__, 跑得快, 3__,4__,5__,__, 跑得快, 3__,4__,5__,__, 一只没有耳朵, 5_,6_,5_,4_,3__,1__, 一只没有尾巴, 5_,6_,5_,4_,3__,1__, 真奇怪, 2__,'5__,1__,__ ","E4",125);
请运行一下,听一听有什么区别。
绘制桌面歌词
下面我们再小小改进一下,播放音乐时在桌面上显示漂亮的歌词。
源码如下:
//创建桌面歌词窗口 importwin.util.lyric; varlyric=win.util.lyric(); lyric.show(); //打开播放设备 importsys.midiOut; varmidiOut=sys.midiOut(); //定义显示歌词的函数 midiOut.log=function(str){ lyric.text=str; } //播放简谱 midiOut.play(" 两只老虎, 1__,2__,3__,1__, 两只老虎, 1__,2__,3__,1__, 跑得快, 3__,4__,5__,__, 跑得快, 3__,4__,5__,__, 一只没有耳朵, 5_,6_,5_,4_,3__,1__, 一只没有尾巴, 5_,6_,5_,4_,3__,1__, 真奇怪, 2__,'5__,1__,__ ");
按「运行」按钮,显示效果如下:
多线程
下面创建独立线程合成并播放音乐,源码:
//合成并输出音乐 importwin.util.lyric; varlyric=win.util.lyric(); lyric.show(); //创建独立线程 thread.invoke(function(lyric){ importsys.midiOut; varmidiOut=sys.midiOut(); //指定字幕回显函数 midiOut.log=function(v)lyric.text=v; midiOut.play(" 两只老虎, 1__,2__,3__,1__, 两只老虎, 1__,2__,3__,1__, 跑得快, 3__,4__,5__,__, 跑得快, 3__,4__,5__,__, 一只没有耳朵, 5_,6_,5_,4_,3__,1__, 一只没有尾巴, 5_,6_,5_,4_,3__,1__, 真奇怪, 2__,'5__,1__,__ "); lyric.close(); },lyric); win.loopMessage();
使用 SPN 音名记谱
编程记谱时可使用 sys.midiOut.notes 名字空间指定的
所有音名,这些音名使用科学音高记号(Scientific pitch notation)。
音名与音符的对应关系如下:
音名
唱名
简谱
C4
do
1
D4
re
2
E4
mi
3
F4
fa
4
G4
sol
5
A4
la
6
B4
ti (si,xi)
7
当然音名与唱名的对应关系可以变更,这里先不用管这些。音名后面的数值越大表示越高的音,例如 C4( 中央C ,简谱中的 1 ) 高八度就是 C5( 高音 do,简谱 1 上面加一点),低八度的音就是 C3 ( 低音 do,简谱 1 下面加一点)。
注意:
SPN 音名中的 -1 省略
SPN 音名中的升号 ?(Sharp) 用小写 s 替代
例如:C-1? 略写为 Cs 。
示例:
importsys.midiOut; varmidiOut=sys.midiOut(); midiOut.play(" C4,_,_,D4,_,_,E4,_,_,C4,_,_, C4,_,_,D4,_,_,E4,_,_,C4,_,_, E4,_,_,F4,_,_,G4,_,_,_,_, E4,_,_,F4,_,_,G4,_,_,_,_, G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_, G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_, D4,_,_,G3,_,_,C4, 1000 ");
也可以这样写:
importsys.midiOut; //打开音名空间 namespacesys.midiOut.notes{ //记谱(这里下划线与音符不能连起来,也不能使用数字音符) drm={ "两只老虎", C4,_,_,D4,_,_,E4,_,_,C4,_,_, "两只老虎", C4,_,_,D4,_,_,E4,_,_,C4,_,_, "跑得快", E4,_,_,F4,_,_,G4,_,_,_,_, "跑得快", E4,_,_,F4,_,_,G4,_,_,_,_, "一只没有耳朵", G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_, "一只没有尾巴", G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_, "真奇怪", D4,_,_,G3,_,_,C4, //用下面的方式调用函数,小于等于127的延时必须调用delay函数 {"delay",1000} } } varmidiOut=sys.midiOut(); midiOut.play(sys.midiOut.notes.drm);
切换乐器
我们还可以选择不同的乐器,代码示例:
importsys.midiOut; varmidiOut=sys.midiOut(); //选择八音盒,参数为乐器编号 midiOut.changeInstrument(10);
在谱子中也可以切换乐器,例如:
importsys.midiOut; varmidiOut=sys.midiOut(); midiOut.play(" changeInstrument(10), 1___, 2___, 3___, ");
可用的乐器编号为 0~127 范围的数值,全部编号如下:
//钢琴 0大钢琴(声学钢琴) 1明亮的钢琴 2电钢琴 3酒吧钢琴 4柔和的电钢琴 5加合唱效果的电钢琴 6羽管键琴(拨弦古钢琴) 7科拉维科特琴(击弦古钢琴) //色彩打击乐器 8钢片琴 9钟琴 10八音盒 11颤音琴 12马林巴 13木琴 14管钟 15大扬琴 //风琴 16击杆风琴 17打击式风琴 18摇滚风琴 19教堂风琴 20簧管风琴 21手风琴 22口琴 23探戈手风琴 //吉他 24尼龙弦吉他 25钢弦吉他 26爵士电吉他 27清音电吉他 28闷音电吉他 29加驱动效果的电吉他 30加失真效果的电吉他 31吉他和音 //贝司 32大贝司(声学贝司) 33电贝司(指弹) 34电贝司(拨片) 35无品贝司 36掌击1 37掌击2 38电子合成1 39电子合成2 //弦乐 40小提琴 41中提琴 42大提琴 43低音大提琴 44弦乐群颤音音色 45弦乐群拨弦音色 46竖琴 47定音鼓 //合奏/合唱 48弦乐合奏音色1 49弦乐合奏音色2 50合成弦乐合奏音色1 51合成弦乐合奏音色2 52人声合唱“啊” 53人声“嘟” 54合成人声 55管弦乐敲击齐奏 //铜管 56小号 57长号 58大号 59加弱音器小号 60法国号(圆号) 61铜管组(铜管乐器合奏音色) 62合成铜管音色1 63合成铜管音色2 //簧管 64高音萨克斯风 65次中音萨克斯风 66中音萨克斯风 67低音萨克斯风 68双簧管 69英国管 70巴松(大管) 71单簧管(黑管) //笛 72短笛 73长笛 74竖笛 75排箫 76BottleBlow 77日本尺八 78口哨声 79奥卡雷那 //合成主音 80合成主音1(方波) 81合成主音2(锯齿波) 82合成主音3 83合成主音4 84合成主音5 85合成主音6(人声) 86合成主音7(平行五度) 87+合成主音8(贝司加主音) //合成音色 88合成音色1(新世纪) 89合成音色2(温暖) 90合成音色3 91合成音色4(合唱) 92合成音色5 93合成音色6(金属声) 94合成音色7(光环) 95合成音色8 //合成效果 96雨声 97音轨 98水晶 99大气 100明亮 101鬼怪 102回声 103科幻 //民间乐器 104西塔尔(印度) 105班卓琴(美洲) 106三昧线(日本) 107十三弦筝(日本) 108卡林巴 109风笛 110民族提琴 111山奈 //打击乐器 112叮当铃 113Agogo钟 114钢鼓 115木鱼 116太鼓 117通通鼓 118合成鼓 119铜钹 //声音效果 120吉他换把杂音 121呼吸声 122海浪声 123鸟鸣 124电话铃 125直升机 126鼓掌声 127Q声
下一篇:没有了