重采样器(Resampler)
重采样器介绍
作用
- 对音源采样进行变调,拉伸。
命令行
resampler.exe <input wavfile> <output file> <pitch_percent> <velocity> [<flags> [<offset> <length_require> [<fixed length> [<end_blank> [<volume> [<modulation> [<pich bend>...]]]]]]]
参数
必选参数
- 第一个参数:音源文件路径(如
a.wav
) - 第二个参数:输出缓存文件路径(如
temp.wav
) - 第三个参数:音阶(如
C#4
) - 第四个参数:辅音速度(0~200的实数)
可选参数
- 第五个参数:Flags(如
"GB60"
,如果指定了后面的参数,那么此参数不能被忽略) - 第六个参数:偏移(原音设定左侧蓝色区域宽度)
- 第七个参数:实际长度(拼接之前的单音符长度)
- 第八个参数:固定长度(原音设定粉红色区域宽度)
- 第九个参数:空白(原音设定右侧蓝色区域宽度)
- 第十个参数:音量(0~100的实数)
- 第十一个参数:移调(-200~200的实数)
- 第十二个参数:音高曲线字符串
补充说明
-
关于Flags
- 如果调用重采样器只是为了初始化频率表,那么可以将Flags参数指定为“G”,后面所有参数不指定。
-
关于实际长度
- 详见 咬合校正
-
关于音高曲线字符串
- 实际上它占两个命令行参数的位置 (即重采样器会接收到13个命令行参数)
- 第一个参数:曲速加感叹号前缀 (如!120)
- 第二个参数:用基于 Base64 的 64 进制双字节序列组成的字符串,用来描述音高曲线
-
合法的启动参数示例
- 例1:
resampler.exe infile.wav outfile.wav 120 100 GB60
- 例2:
resampler.exe "D:\UTAU\voice\MyVoice\a.wav" "D:\ProjectCache\1_a_120.wav" C4 100 "B0Y0H50" 5 600 37 0 100 0 !120 AA#5#
- 例1:
对于制作重采样器的建议
- 应当兼容通用Flags,如G用来初始化频率表,T用来导出文本频率表,u用来直接输出采样等。
- 应当兼容输入输出文件的路径既可以是相对路径也可以是绝对路径。
- 第三条:对于非法的输入文件,可以输出一段空白的符合长度要求的声音。
- 在控制台输出信息以便用户查找问题。
音高曲线字符串
Base 64 编码表
索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 |
---|---|---|---|---|---|---|---|
0 | A | 17 | R | 34 | i | 51 | z |
1 | B | 18 | S | 35 | j | 52 | 0 |
2 | C | 19 | T | 36 | k | 53 | 1 |
3 | D | 20 | U | 37 | l | 54 | 2 |
4 | E | 21 | V | 38 | m | 55 | 3 |
5 | F | 22 | W | 39 | n | 56 | 4 |
6 | G | 23 | X | 40 | o | 57 | 5 |
7 | H | 24 | Y | 41 | p | 58 | 6 |
8 | I | 25 | Z | 42 | q | 59 | 7 |
9 | J | 26 | a | 43 | r | 60 | 8 |
10 | K | 27 | b | 44 | s | 61 | 9 |
11 | L | 28 | c | 45 | t | 62 | + |
12 | M | 29 | d | 46 | u | 63 | / |
13 | N | 30 | e | 47 | v | ||
14 | O | 31 | f | 48 | w | ||
15 | P | 32 | g | 49 | x | ||
16 | Q | 33 | h | 50 | y |
编码规则
- 按指定的曲速决定控制点(音高采样点)的数量,每拍有96个控制点(5ticks采样一次)
- !120:0.5秒,96个采样点
- !180:0.333秒,96个采样点
- 音高曲线的起点:先行声音(校正后)+ STP(校正后)
- 采样点是整 -2048~2047 的 12bit 整数,每个半音相当于 100
- 通过 Base64 将采样点的值转换成每单元 2个字符 的字符串
38
->Am
(38 = 0 * 64 + 38 * 1)176
->Cw
(176 = 2 * 64 + 48 * 1)
- 负数先取反(即加4096)再参与编码
-2
->/+
(-2 + 4096 = 63 * 64 + 62)
- 同一个数字连续出现会按如下格式压缩长度
AA#5#
表示AA AA AA AA AA AA
,它的意思是[0,0,0,0,0,0]
示例
- 源 - 1
-175 -257 -341 -417 -480 -522 -540 -537 -532 -527 -522 -517 -512 -508 -503 -498 -494 -489 -485 -480 -476 -472 -468 -464 -460 -456 -453 -449 -446 -443 -440 -437 -434 -432 -429 -427 -425 -423 -421 -420 -418 -417 -416 -415 -415 -414 -414 -414 -408 -391 -365 -332 -295 -257 -221 -190 -167 -153 -150 -149 -146 -141 -135 -127 -117 -106 -94 -80 -66 -50 -34 -18 -1 16 33 50 67 83 98 113 126 138 149 159 167 173 178 181 183 183 185 188 192 198 204 212 221 231 242 254 266 279 293 307 321 336 351 365 379 393 407 420 432 444 454 464 473 480 487 492 496 498 499 499 498 497 494 491 487 482 476 470 463 455 447 438 428 418 408 397 386 375 363 351 339 327 315 303 291 279 268 256 245 235 225 215 206 197 189 182 175 169 164 160 156 153 151 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 145 133 113 88 57 25 -7 -38 -64 -84 -96 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -99 -99 -99 -99 -99 -99 -98 -98 -98 -98 -97 -97 -97 -96 -96 -96 -95 -95 -95 -94 -94 -93 -93 -92 -92 -92 -91 -91 -90 -90 -89 -89 -88 -87 -87 -86 -86 -85 -85 -84 -83 -83 -82 -82 -81 -80 -80 -79 -78 -78 -77 -76 -76 -75 -74 -73 -73 -72 -71 -70 -70 -69 -68 -67 -67 -66 -65 -64 -64 -63 -62 -61 -60 -60 -59 -58 -57 -56 -56 -55 -54 -53 -52 -52 -51 -50 -49 -48 -48 -47 -46 -45 -44 -43 -43 -42 -41 -40 -39 -39 -38 -37 -36 -36 -35 -34 -33 -33 -32 -31 -30 -30 -29 -28 -27 -27 -26 -25 -25 -24 -23 -22 -22 -21 -20 -20 -19 -19 -18 -17 -17 -16 -16 -15 -14 -14 -13 -13 -12 -12 -11 -11 -10 -10 -9 -9 -8 -8 -8 -7 -7 -6 -6 -6 -5 -5 -5 -4 -4 -4 -3 -3 -3 -3 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
- Base64 - 1
9R7/6r5f4g323k3n3s3x32374A4E4J4O4S4X4b4g4k4o4s4w4044474/5C5F5I5L5O5Q5T5V5X5Z5b5c5e5f5g5h5h5i#2#5o556T607Z7/8j9C9Z9n9q9r9u9z95+B+L+W+i+w++/O/e/u//AQAhAyBDBTBiBxB+CKCVCfCnCtCyC1C3C3C5C8DADGDMDUDdDnDyD+EKEXElEzFBFQFfFtF7GJGXGkGwG8HGHQHZHgHnHsHwHyHzHzHyHxHuHrHnHiHcHWHPHHG/G2GsGiGYGNGCF3FrFfFTFHE7EvEjEXEMEAD1DrDhDXDODFC9C2CvCpCkCgCcCZCXCW#107#CRCFBxBYA5AZ/5/a/A+s+g+c#54#+d#5#+e#3#+f#2#+g#2#+h#2#+i+i+j+j+k#2#+l+l+m+m+n+n+o+p+p+q+q+r+r+s+t+t+u+u+v+w+w+x+y+y+z+0+0+1+2+3+3+4+5+6+6+7+8+9+9+++//A/A/B/C/D/E/E/F/G/H/I/I/J/K/L/M/M/N/O/P/Q/Q/R/S/T/U/V/V/W/X/Y/Z/Z/a/b/c/c/d/e/f/f/g/h/i/i/j/k/l/l/m/n/n/o/p/q/q/r/s/s/t/t/u/v/v/w/w/x/y/y/z/z/0/0/1/1/2/2/3/3/4#2#/5/5/6#2#/7#2#/8#2#/9#3#/+#4#//#12#
简易转换(C++)
static const char Base64EncodeMap[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
string encode_single_num(int n) {
char x, y;
string result;
//若为负则以12位二进制取反
if (n < 0) {
n += 4096;
}
//转化为64进制,十位为x,个位为y,并映射为Base64字符
x = Base64EncodeMap[int(n / 64)];
y = Base64EncodeMap[n % 64];
result = x + y;
return result;
}