KeyFC欢迎致辞,点击播放
资源、介绍、历史、Q群等新人必读
KeyFC 社区总索引
如果你找到这个笔记本,请把它邮寄给我们的回忆
KeyFC 漂流瓶传递活动 Since 2011
 

midi軟件一問

[ 9079 查看 / 12 回复 ]

回复:midi軟件一問

那麼, 如果已下載多於一種soundfont的話, timidity是不是可以支援最多16種樂器的聲音呢?? 它的timidity.cfg是怎樣寫的呢??
(看不懂程式碼...)

愛上了timidity... 謝謝貓的介紹~~
最后编辑koniygn 最后编辑于 2008-12-21 09:13:46
TOP

回复: midi軟件一問

Timidity++拥有符合MIDI标准的16个合成轨道,它们可以载入任何乐器
也就是说Timidity++可以把同一个乐器载入不同的16个轨道,也可以从同一个或者多个不同的音色库中载入最多16种相同或不同的乐器。
遵循GM以及派生标准,Timidity的第10音轨通常是打击乐器轨,这里不定义乐器,而是打击乐器鼓组

CFG文件的写法实际上也不是很难,但是需要MIDI的基础知识作为铺垫。
要学会配置想要看懂下面猫关于一些基本知识的介绍:

关于音轨(Track):
纯粹的MIDI标准中,拥有16条固定的音轨,不管你是否使用他们,16条音轨既不能增加也不能减少
每条音轨可以被理解为一名多才多艺的乐手,这名乐手精通各种你所拥有的乐器,而且所有乐器都被这名乐手当作钢琴来演奏,也就是说即便是小号或者长笛这类单音乐器,这名乐手也能同时演奏出所有可能的复音组合。
但是这个乐手同一时间只能演奏一种乐器,那么你拥有的16名乐手只能同时演奏16种乐器,就像猫之前说过的那样。
当然,需要补充说明的是:
16条音轨代表你有16名多才多艺的乐手,而不是说你只有16件乐器。MIDI制作中允许你让一名乐手演奏的途中更换不同的乐器,例如乐手正在演奏钢琴,这时你可以根据你的需要,快速把这名乐手调到提琴手的位置那里演奏小提琴,之后又快速调到其他地方演奏其他不同的乐器。
这是一种MIDI制作上的技巧
现今的很多音乐工作站都已经不再限制音轨的数量,然而很不幸的是,MIDI文件以及Timidity++本身都是遵循MIDI标准的产物,因此使用Timidity+midi文件这样的工作模式我们只有16条音轨(16名乐手)。

关于乐器架(Program):
MIDI标准中每个音轨都可以演奏若干种乐器,这些乐器被编号放到乐器架上,需要音轨使用哪种乐器演奏的时候,就告诉音轨乐器在乐器架上的编号,音轨就会自己去寻找这件乐器并将自己乐谱中的音符用这件乐器演奏出来。参考上面关于音轨的介绍,猫想这个问题应该不难理解。
MIDI标准中乐器架上可以放置的乐器最多可以有128件,编号从0~127

关于音色库(Bank):
由于一个乐器架上只能放置127件乐器,这个数字相对于乐器海洋来说,实在是太渺小了,于是MIDI标准中有音色库的概念,不同的音色库代表着不同的乐器架,例如我们需要做摇滚和爵士两种音乐,这时我们在乐器架上摆上了键盘、过载吉他、噪音吉他、掌击贝斯和架子鼓,这时我们已经有一个简单的乐器架了;然而这些乐器用于演奏爵士绝对不是一个好主意,于是我们又架设了一个乐器架,把相同编号的乐器替换为钢琴、爵士吉他,清音吉他,低音提琴和刷子演奏的爵士鼓,这样我们就可以利用切换音色库的方式用相同的乐器架编号来使用不同的乐器;这样的方法更大幅扩展了支持乐器的数量,每个音色库当中我们都可以排满128种乐器,而且互相不会干扰。
音色库在MIDI标准中被作为控制器(Control)来实现,因此音色库的编号分配范围有2个字节(只用每个字节的前7位),既0~16383(128*128),由此MIDI中可以预置的乐器数量最大可以达到16384*128=2097152种乐器。
为了和“音色样本库”(它的名字通常也叫做音色库)区分开来,我们也称音色库为音色组或者直接按照英文称为Bank。

关于Timidity++的音色库配置文件的写法:
1.基本语法
注释:
使用“#”号开头的整行数据为注释,注释的信息不会Timidity读取,只是供编写者留下必要的解释和标注。
定义目录:
在行首以"dir"标签开头的内容描述一个关于目录的定义,如果在配置文件中引用了没有说明全路径的其它文件,Timidity会从定义的目录中去寻找文件。Timidity++使用“${basedir}”变量来描述Timidity++的程序目录
例如以下定义:
dir ${basedir}/sf2
soundfont samp.sf2
这时Timidity执行配置文件时就会自己到timidity的程序目录下寻找名为“sf2”的子目录,并在子目录下寻根找名为“samp.sf2”的音色库文件并加载之,关于soundfont标签,可参看下面的描述。
可以定义多个目录,程序将会按顺序再定义的各个目录下寻找指定的文件。
引用其他配置文件:
在行首以“source”标签开头的内容描述引用另外一个音色配置文件。
例如下面的定义:
dir ${basedir}/config
source samp.cfg
这时程序会到timidity的程序目录下的config子目录寻找samp.cfg文件,并执行其中的配置信息。
直接引用音色库:
在行首以“soundfont”标签开头的内容描述加载一个SF2音色库文件,播放MIDI时将直接调用音色库中自身的定义来合成MIDI的数据为音乐。用法参看前面的例子。
可以一次加载多个音色库,乐器架上的音色序列将会被后加载的音色库逐一覆盖。
如果音色库自身的定义的音色序列和逐一覆盖的规则不能满足你的需求,那么就需要看猫在下面的章节中所讲述的音色库具体配置方法了。

2.音色库编辑语法
例如我们存在这样一些音色库
音色库A里面这样定义乐器架
0.小提琴
1.大提琴
2.钢琴
4.长笛
5.双簧管
音色库B里面这样定义乐器架
0.钢片琴
1.管风琴
2.长笛
3.钢琴
这是我们期望这样来组合一个符合我们需求的乐器架:
0. B-3的钢琴
1. B-1的管风琴
2. B-0的钢片琴
3. A-0的小提琴
4. A-1的大提琴
5. B-2的长笛
6. A-5的双簧管
这时我们已经完全无法通过音色库的自身排列来满足我们的需求了,这就需要我们自己来编辑合成取样的序列。下面猫介绍编辑的语法:

bank <编号>
定义下面各行中描述的乐器架信息属于哪个midi标准的音色库,直到出现下一个bank标签或者配置文件结束。<编号>的范围为0~127。
乐器架的定义格式如下:
<乐器架编号> %font "<sf2文件路径名>" <sf2的bank号> <sf2的program号> [<音符编号> amp=<输出的音量级别> pan=<输出的立体声平衡> [note=0] ...]
其中的可选参数:
amp是输出音量等级的百分比,低于100则减少该乐器的输出音量等级,反之则增大,这个值应当为整数
pan是输出音量的立体声平衡,取值在+100~-100之间,0为不修正,负数时值越高越偏左声道,正数时值越高越偏右声道
note是一个可选的标记,如果设置其为0那么timidity将自动缩放波形演奏任何可能的音符,如果不设置note标记则按照音色库定义的音域来响应音符,超音域的音符将不被响应。

drumset <编号>
定义下面各行中描述的乐器架信息为鼓组信息,鼓组这个概念很特殊,在很多sf2音色库中他被定义为编号128的乐器,而实际在timidity中通常是没有128这个乐器可选的,而是用第10音轨来描述打击乐鼓组。
鼓组的定义语法和乐器架的一致,但是鼓组更多是精确到各个音符的映射。

3.配置示例
上面我们已经讲怎么样编辑和定义音色了,那么我们就上一章提出的那个举例来制作音色库的配置示例:
假设音色库A的文件名为a.sf2,一色库B的文件名为b.sf2
那么配置文件应当写成这样
bank 0
0 %font "b.sf2" 0 3 amp=110 pan=0
1 %font "b.sf2" 0 1 amp=100 pan=0
2 %font "b.sf2" 0 0 amp=100 pan=0
3 %font "a.sf2" 0 0 amp=100 pan=0
4 %font "a.sf2" 0 1 amp=100 pan=0
5 %font "b.sf2" 0 2 amp=100 pan=0
6 %font "a.sf2" 0 5 amp=100 pan=0

基于以上的配置假设我们还有一套鼓音色C,其中的定义如下:
音色库0的乐器架编号128的音符:
1.大鼓
2.低音大鼓
3.高音圆鼓
4.低音圆鼓
5.鼓边
6.击镲(闭合)
7.击镲(开放)
8.锣
音色库1乐器架编号1的音符:
1.高音桶鼓
2.中高音桶鼓
3.中低音桶鼓
4.低音桶鼓
5.踩镲
我们需要的鼓组为:
1.大鼓(0.128.1)
2.低音大鼓(0.128.2)
3.高音圆鼓(0.128.3)
4.低音圆鼓(0.128.4)
5.鼓边(0.128.5)
6.高音桶鼓(1.1.1)
7.中高音桶鼓(1.1.2)
8.中低音桶鼓(1.1.3)
9.低音桶鼓(1.1.4)
10.击镲(闭合)(0.128.6)
11.击镲(开放)(0.128.7)
12.踩镲(1.1.5)
13.锣(0.128.8)
这时当C的文件名为c.sf2时,侧有如下的配置:
drumset 0
0 %font "c.sf2" 0 128 1 amp=100 pan=0
1 %font "c.sf2" 0 128 2 amp=100 pan=0
2 %font "c.sf2" 0 128 3 amp=100 pan=0
3 %font "c.sf2" 0 128 4 amp=100 pan=0
4 %font "c.sf2" 0 128 5 amp=100 pan=0
5 %font "c.sf2" 1 1 1 amp=100 pan=0
6 %font "c.sf2" 1 1 2 amp=100 pan=0
7 %font "c.sf2" 1 1 3 amp=100 pan=0
8 %font "c.sf2" 1 1 4 amp=100 pan=0
9 %font "c.sf2" 0 128 6 amp=100 pan=0
10 %font "c.sf2" 0 128 7 amp=100 pan=0
11 %font "c.sf2" 1 1 5 amp=100 pan=0
12 %font"c.sf2" 0 128 8 amp=100 pan=0

好的,配置完成了我们把把配置文件保存。
恩,加载这个配置文件到timidity上运行,啊 >< 啥声音都没有,为什么?
呵呵,猫写的这个配置还差了一些必要的东西,看上面的音色库定义中文件都只有文件名没有访问路径的描述,这样的话除非把音色库放在timidity的程序目录下,否则音色库无法被正常加载的。
那么我们来做一些修改吧:
我们首先把a.sf2、b.sf2、c.f2三个sf2音色库文件放到一个文件目录下,例如D:\soundfont\
然后把上面的配置信息保存到Timidity的程序目录下的config子目录,命名配置文件为mytt.cfg
嗯,现在我们再建立一个新的配置文件,填入如下内容:
dir ${basedir}\config #这是mytt.cfg配置文件所在的目录
dir D:\soundfont #这是sf2音色库文件的目录
source mytt.cfg #好的现在只需要引用前面的配置文件就能正常工作了

Timidity的配置文件某些细节其实蛮复杂的,许多涉及XG、GS、GM音色之间的映射和处理的语句猫都不懂,又缺少相关的文档,能够教给楼主的也只有这些了,希望能对阁下有所帮助
最后编辑亡灵之猫 最后编辑于 2008-12-22 13:04:25


传播音乐梦想的种子,让音乐的美在人们心中破土成长
拥有梦,拥有未来!
TOP

回复:midi軟件一問

多謝貓主的專業回答...
暫時還沒試得到多種樂器的配搭, 不過...
萬分感謝 + 佩服...
TOP