【WIP】Synthesizer V 插件开发入门(1)

【WIP】Synthesizer V 插件开发入门(1)

图源:紺屋鴉江 - 《銀河》,Pid:94649749

写在前面

本文并非“零基础入门”型的文章。阅读此文章前,建议你已经:

  • 使用过 Synthesizer V Studio(即 SVR2,以下用此简称代替),了解过 VOCALOID,知道“插件”的作用是什么;
  • 已购买 Synthesizer V Studio Pro 版本,以便于插件的开发与调试;
  • 有一定的编程经验,使用过 Lua 语言;

Synthesizer V Studio Pro的正版授权可从 平行四界官方淘宝店 Dreamtonics官方淘宝店 获取。关于 Lua 编程的资料数不胜数,可从 菜鸟教程 等网站获取。

另外,阅读时,可以配合下面两个文档:

正文部分存在问答部分,可能与后文的知识关联。你可以按顺序阅读,也可以在阅读完其他内容后再阅读问答部分。

以下是文章正文。

脚本存放位置

SVR2 的软件数据默认保存在“我的文档”下,而脚本放置在其中的“scripts”子目录中。

以 Windows 系统为例,如果你没有移动过“我的文档”位置,那么路径应该是:

1
C:\Users\<你的用户名>\Documents\Dreamtonics\Synthesizer V Studio\scripts

你可以在其中创建子目录分类存放不同种类的脚本。SVR2 安装时附带的插件默认放置在“Utilities”子目录下。

image-20220125230306915

插件的基本结构

SVR2 Pro 支持两种插件格式:JavaScript 插件,使用嵌入式的 Duktape 解释器;以及 Lua 插件,使用嵌入式的 Lua 5.4解释器。这里选择 Lua 作为编程示例语言,以便有 VOCALIOID 插件开发经验的人快速转向 SVR2 的插件开发。

SVR2 插件在结构上主要有以下几个部分:

  • 插件信息函数:getClientInfo()
  • 本地化函数:getTranslations()
  • 入口点函数:main()

下面分别进行说明。同时注意,SVR2 软件在启动时会将所有的插件代码载入内存(但不会执行除 getClientInfo()getTranslations() 外的其他部分),因而对插件代码做出的改动需关闭 SVR2 再启动 SVR2 才可生效。

插件信息

插件信息由函数 getClientInfo() 控制。作用与 VOCALOID 的 JobPlugins 中 mainfest() 函数的作用类似,保存插件的名称、维护者、兼容性等信息。

其结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--[[
@function getClientInfo 插件信息函数
@param nil 无参数
@return table 返回列表
@field name string 插件名字
@field author string 插件作者
@field versionNumber num 插件版本
@field minEditorVersion num 最低版本要求
--]]
function getClientInfo()
return {
name = '插件名字',
author = '作者信息',
versionNumber = 1,
minEditorVersion = 65540
}
end

其中:

阅读更多

【WIP】压制技术 B:从不熟悉的编码开始

文章摘录和润色于本人的笔记,难免有错漏之处。若您发现了其中的一处或几处,请在评论处指正,我将不胜感激。

什么是压制?

压制的对象

可以是一切种类的音频、视频、图像,比如说:

  • 蓝光光盘(BD)中的视频或音频(m2ts 等格式比较多见)
  • DVD 光盘中的视频或音频(dat 等格式比较多见)
  • CD 光碟中的视频或音频
  • 通过 Web 下载的各流媒体网站的视频或音频
  • 各种剪辑软件、合成软件、特效软件、DAW 等渲染的视频或音频
  • 图片(或者动态图片)转换为视频,例如“一图流 MV”等

注意:要区分压制(Rip)和混流(Mix)。

压制是进行编码,或在编码间转换的过程。

混流是将特定编码的视频轨/音频轨放入容器,或在容器间转换的过程。

注意:要区分编码(Encoding)和容器(Container)。

举例说明如下:

  • H.264 是一种视频编码,aac 是一种音频编码。
  • mp4 是一种视频容器,wav 是一种音频容器。
  • avi 既是一种视频编码也是一种视频容器。
  • mp3 既是一种音频编码也是一种音频容器。

压制的目标

对视频、音频等的压制,不全面地、概括地来说,有以下几点主要目标:

  • 使音频/视频的编码符合要求。例如符合视频网站点播视频的要求、直播网站直播串流的要求、流水线中剪辑代理的要求等。
  • 使音频/视频的数据总量(可以理解为音频/视频的体积)或音频/视频在单位时间内的数据量(可以理解为音频/视频的码率)符合要求。例如符合蓝光光盘的码率要求、窄带(依照2010年新的标准为4Mbps以下)情况下视频点播的要求等。
  • 尽可能地保留音频/视频中的有效信息。可以理解为视频画面中物体的轮廓、音频的频段细节等。
  • 去除或降低音频/视频中的干扰信息。可以理解为视频画面中的噪点、音频中的杂音等。
阅读更多
【WIP】算法与数据结构回顾 - 广义表

【WIP】算法与数据结构回顾 - 广义表

图源:@Rella 《glow》 91882132

简述

广义表是线性表的一种推广。线性表要求表中元素拥有统一的类型,而广义表无此限制。需要注意的是,广义表和线性表长度一般认为是有限的,但广义表的深度可以是无限的(即递归表)。

广义表是一种数据结构。对广义表的常见操作包括:

  • 创建
  • 从字符串形式创建
  • 销毁
  • 复制
  • 取表头
  • 取表尾
  • 判空
  • 求长度
  • 求深度
  • 从表头插入
  • 从表头删除
  • 遍历

广义表是Lisp语言的基本数据结构。后文以Common Lisp和C++给出各基本操作的示例。

名词注解

长度

指广义表中的元素个数。举例如下:

例一

1
(a, b)

该表中共有两个元素:原子项a,原子项b。因而该表的长度为2。

例二

1
(a, (b, c))

该表中共有两个元素:原子项a,广义表(b, c)。因而该表的长度为2。

深度

指广义表中子表的嵌套层数。举例如下:

例一

1
(a, b)

该表中没有子表,因而该表的深度为1。

例二

1
(a, (b, c))

该表中嵌套了一个无嵌套的子表,因而该表的深度为2。

阅读更多

【WIP】C 语言拾遗 Part.1

long 与 long long

long 一般占用4~8字节,long long 至少 占用8个字节。不同的平台和编译器,长度可能不同。

sizeof() 运算符

注意 sizeof() 属于运算符的一种,这个运算符用于测量括号内的变量(或类型)占用的字节数量。多数情况下,这一数量在编译时确定,因此 sizeof() 的运行结果是一个编译时常量。但也有例外,如C99标准引入的变长数组特性。该类数组的size需在程序运行时、数组开辟后确定。

由于是编译时常量,括号内如果是表达式,则表达式不会被执行。

1
2
3
int a = 1; // a = 1
int b = sizeof(a++); // b = 4
// a = 1, a++ 没有执行

浮点数精度问题

老生长谈的话题了。由于误差,以下的逻辑判断结果都是成立(1):

1
2
(0.1 + 0.1 + 0.1) != 0.3; // 1;
1 + (1e123 - 1e123) != (1 + 1e123) - 1e123; // 1;

没有 body 的 for 循环

可以写成如下形式:

1
2
3
for(i = 0; i < 10; i++) {
;
}

或者如下形式:

1
for(i = 0; i < 10; i++);
阅读更多
【WIP】CMU 15-462 笔记 Part.1

【WIP】CMU 15-462 笔记 Part.1

图片来源:@Lifeline 88401620

增补(感谢@oyiadin):本系列笔记将添加《Games 101:现代计算机图形学入门》、《Games 102:几何建模与处理》、“龙书”(《Introduction to 3D Game Programming with DirectX 12》)三个额外来源的笔记。大段的非CMU课程的笔记会在显著位置标识。

Lecture 1

什么是计算机图形学

计算机图形学:利用计算机合成视觉信息或利用计算机合成/操控感官信息的学科。

计算机图形学的应用

  • 影视

  • 动画

  • 游戏

  • 数据可视化

  • 工业设计,平面设计

  • 数字绘画

  • 虚拟现实

    相同的内容后续整理VR课笔记时不再赘述。

    • 虚拟现实(VR):指所看到的一切均为虚拟的,比如虚拟现实游戏、虚拟现实视频等。

    • 增强现实(AR):指看到的是真实的现实 + 虚拟的、对当前现实进行分析处理或修改等生成的虚拟事物,比如Apple ARkit。

    • 混合现实(MR):VR + AR,使用类似VR的手段,达到AR这种结合当前现实与虚拟事物的效果,比如Hololens。

  • 制造业(3D打印)

  • 模拟

  • 排版与字体设计

    • “The Quick Brown Fox Jumps Over The Lazy Dog”:一句有意义的英文句子,内含全部的26个英文字母,常用来对字体(字形、字号、间距等)进行测试。

    • “Lorem ipsum dolor sit amet, consectetur adipisicing elit.”:又叫“乱数假文”或者“哑元文本”。主要的目的为测试文章或文字在不同字型、版型下看起来的效果。更多资料请查阅:https://cn.lipsum.com/

  • ……

计算机图形学与计算机视觉的区别

计算机图形学:将数据转化为图形。也就是“画出来”。

计算机视觉:将图形转化为数据。也就是“看到”。

计算机图形学需要哪些基础

  • 表示方法(编码)

  • 采样与混叠

  • 数学方法(表示动态和三位形体)

  • 光线

  • 透视

  • ……

对正方体建个模?

  • 如何表示

    • 顶点:利用坐标

    • 边:利用边的两个顶点唯一确定

  • 如何绘制

    • 三维图形转化为二维图形:小孔成像模型

      设相机坐标为 $(a,b,c)$ ,待确定点的坐标为 $(x,y,z)$ 。要得到该点在二维平面上的坐标,可进行如下算法步骤:

      1. $(x,y,z)$ 与 $(a,b,c)$ 相减,得到原三维点与摄像机的相对位置;

      2. 将其中的 $(x,y)$ 与 $z$ 相除,得到 $(\frac{x}{z},\frac{y}{z})$,即是所求的 $(u,v)$。

    • 连线。这就要细说到电脑如何绘制直线。

阅读更多

【WIP】CMU 15-213 笔记 Part.1

Lecture 1

实验

Lab1:数据实验,用位运算方式实现计算器

Lab2:炸弹实验,学会GDB

Lab3:攻击实验,代码注入和ROP

Lab4:缓存实验,写个缓存模拟器并优化

Lab5:Shell实验,写一个完整的Linux Shell

Lab6:Malloc实验,写自己的Malloc库

Lab7:代理实验,写自己的Web Proxy

Lecture 2

比特、字节和整数

  • long double数据类型:在传统的32位架构或64位架构中是没有的。但在x86-64架构中占10或16字节(内存对齐)。

  • 32位架构的指针为32位(4字节),64位架构的指针为64位(8字节)。

  • 布尔代数:和 或 非 异或

  • 位运算符 & | ~ ^,逻辑运算符 && || !

  • 逻辑运算的短路特性

  • 逻辑位移和算数位移:

    • 在位移运算符之前的数(比如$x<<y$中的$x$)是无符号数的话,位移运算对应的汇编指令为逻辑位移。若是有符号数,该运算对应的汇编指令是算数位移。
    • 对于左移:二者都是在右侧补0。
    • 对于右移:逻辑位移补0,算数位移补最高有效位(符号位)。如:令$x=10100000_{(2)}$,右移3位,逻辑位移结果$x>>3=00010100_{(2)}$,算数位移结果$x>>3=11110100_{(2)}$。
  • 位移数小于0(即$x<<y$中的$y$小于0)或大于数据类型占用的长度(如char类型中y大于8)是未定义的操作。结果和编译情况依编译器和架构变化。

  • 正数原码转十进制:求2的幂次加和即可。

$$ B2U(X) = \sum^{w-1}_{i=0}{x_i \cdot 2^i} $$

  • 补码转十进制:注意符号位。也可写成公式。

$$ B2T(X) = -x_{w-1} \cdot 2^{w-1} + \sum^{w-2}_{i=0}{x_i \cdot 2^i} $$

  • 补码计算举例:将补码$101101_{(2)}$化为十进制。

$$ 依据公式,\\ 101101_{2} = 2^{0} \cdot 1 + 2^{1} \cdot 0 + 2^{2} \cdot 1 + 2^{3} \cdot 1 + 2^{4} \cdot 0 + 2^{5} \cdot (-1) \\ = 1 + 0 + 4 + 8 + 0 - 32 = -19 $$

  • 无符号数最大值$2^w - 1$,最小值$0$。有符号数最大值$2^{w-1} - 1$,最小值$-2^{w-1}$。
阅读更多
【WIP】解包《三色Δ绘恋》,与 Kirikiri 初探

【WIP】解包《三色Δ绘恋》,与 Kirikiri 初探

图源:《三色Δ绘恋》内附 圣诞节特别篇 “圣夜钟音” 主题桌面壁纸

舍友买了一份《三色Δ绘恋》,其中的立绘和音乐水准相当不错。某天于是突发奇想,从舍友那里拷贝了份游戏的文件,打算把里面的立绘和音频提取出来。

image-20210411162311645

于是开始操作。

确定引擎,准备工具

整体的文件结构相当清晰,显然 TricolourLovestory_chs.exe 是中文版本的主程序,TricolourLovestory_chs.cf 是中文版本的启动配置文件,steam_api.dll 是连接 Steam 进行软件正版验证、存档上传等功能的插件,其他的 xp3 文件就是我们要找的资源包了。所以针对此文件格式,寻找对应的工具,进行解包。

经过 Google 和 Github 的多方搜索,找到了两个最为常用的工具,ExtractDataKrkrExtract。前者可以对资源包内的文件进行提取,后者可以对资源包内的文件进行提取、修改和删除。这里我们使用普适性更强的 ExtractData 进行提取操作。

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×