分类 软件 下的文章

11区的艺术创作者每次都能整出些新活= =

在「変好き」作品第一集的ED后,放出了这么一个玩意:

goniometer

真是炫酷.jpg

话说音频产业的美术还真是有点东西,不论是上次学到的那个Spectrogram频谱图,还是这次见到的这个。

在某度上搜索一番,竟然还没有发现任何人提到过这个图形,不论是中文还是英文。在某404网站上操作一番之后,得出结论:这玩意的名字叫做Goniometer。中文译名为测角仪,但是回到某度上来搜的话,还真就只有一点点测角仪相关的页面= =

简要叙述的话,这个图像表达的是双声道间的波性一致性。以垂直线为Mono,也就是单声道效果,顺时针45°为右声道R,逆时针45°为左声道L,(水平的+S-S是啥意思我还不清楚),就可以作出一幅声道测角图。很显然,将LR作为这个二维平面的笛卡尔坐标系的xy两个坐标轴的话,按照实时信号进行散点作图的话,可以发现若是左右声道信号强弱、相位完全一致的话,只会在Mono线上出现点,也就是传统的单声道效果;反之可能出现(椭)圆形的区域,暗示着在这些时间点左右声道的信号是不一致的。就上图而言的话,在实际使用耳机进行收听后,可以感觉出当时的音源更加偏向于左耳方向。

在Reaper里,可以找到在FX菜单的JS列表中,有一个Goniometer插件。将上述番剧的对应时间段的音频裁剪并放入Reaper中播放,观察可以发现两者在同一时刻的图像是基本一致的。

至于作图原理,我现在也不清楚。。等有时间了来学习一下,自己写一个玩玩吧(坑+1)

主体流程按照文档来就行,先编译Boost.Build,然后用生成的b2来编译剩余的部分。

主要是在编译Boost.Python遇到了问题。虽然在编译时传入--build-type=complete参数也包含了对Python模块的编译,但是仔细阅读文档可以发现,这个complete指的是尽可能完整,也就是说,如果某些模块编译出错了,b2会放弃编译该模块,而不是发出严重错误的警告——“反正我是尽力而为嘛”。恰好在我的情景下,Boost.Python就是其中之一。网上对于如何编译这个库的讨论很少,在StackOverflow上也只是找到了少量的讨论,感觉似乎要么是没人整这些东西,要么人人都是专家= =

后来发现在Boost的文档中提到,有一个配置文件叫user-config.jam,在这里进行Python的配置。先贴一个我的配置:

using python
    : 3.6
    : C:\\Program\ Files\\Python36\\python.exe
    : C:\\Program\ Files\\Python36\\include
    : C:\\Program\ Files\\Python36\\libs
    : <toolset>msvc
    ;

但是这个配置文件的位置有讲究,说是要放在家目录下(参见 https://boostorg.github.io/build/manual/develop/index.html#bbv2.overview.configuration )。如果在Windows下不想配置家目录,那么就需要使用--user-config=参数来显式指定配置文件。有些教程说将这个文件放在编译的根目录下也行(未经尝试)。

编译完成以后,目录结构还是保持了类似源文件的文件夹结构,因而若是要一个个手动添加库文件可以说是一项繁重的工作。这里放一段把所有动态/静态库文件提取出来,放在同一个文件夹下的Python代码片段供参考:

import shutil
import os

dest = './lib'
try:
    shutil.rmtree(dest)
except Exception as e:
    pass
os.makedirs(dest)

def explore(prefix: str):
    if prefix == './lib':
        return

    if os.path.isdir(prefix):
        entries = os.listdir(prefix)
        for entry in entries:
            explore(prefix + '/' + entry)
    elif prefix.split('.')[-1] in ['lib', 'dll'] and ('vc142-mt-x64' in prefix or 'vc142-mt-gd-x64' in prefix):
        shutil.copy2(prefix, dest)

if __name__ == '__main__':
    '''Extract all boost libraries. @Esper'''
    explore('.')

将该代码片段放在libs目录下执行,即可在名为lib的新子目录中找到所有提取的库文件。同时,对于explore函数中的某些判断条件需要进行合适的修改,比如vc版本,编译条件或者系统位数等,还请读者根据实际情况调整。

本来还想玩一下Kaldi的,结果发现门槛太高(指文档看起来比较难受,以及Windows下编译大小>20GiB),而且CUDA支持还有点问题(不知道是不是还是msvc14.25的锅)。再加上例子里给的全是Shell脚本,懒得重新看一遍,就弃坑了。

但是编译过程中遇到少许坑,记录如下:

  1. 不要使用CMake,而是使用windows文件夹中的generate_solution.pl来生成VS的解决方案;
  2. 额外扩展(比如OpenBLAS)等的文件夹结构可以参考tools目录下;
  3. Windows支持做的人估计不多,还是只支持CUDA 7。如果使用CUDA版本不是7的话,可以从自己的CUDA目录中找到一个名字类似cuda_7.0.props(比如CUDA 10.1.props)的文件,替换该文件即可;
  4. 如果使用的是官方openfstportaudio自己编译的话,可能需要修改对应props文件里的库文件位置和名字,其中portaudio可能需要按照windows/INSTALL.md中提供的网址去Steinberg下载ASIO驱动,否则编译会报错;
  5. 使用cmd运行generate-solution.pl,千万不要用MSYS!通过--vsver参数确定VS版本(格式为vs20xx,支持15、17和19三个版本),--enable-openblas使用OpenBLAS而不是Intel MKL,以及--enable-cuda提供CUDA支持。

  1. 获得一个公网IPv6地址;
  2. 在服务器上监听IPv6端口(记得监听地址是::(等价于IPv4的0.0.0.0)而不是::1(等价于IPv4的127.0.0.1));
  3. ip6tables上给监听的端口(一般是80/443吧)开个洞(可以抄22端口的,一般ipv6的ssh应该是会自动启用的吧);
  4. 可以使用IP:端口名进行测试了。
  5. 如果要使用域名的话,记得添加的是AAAA记录,不用放中括号。

简单流程,仅供排错参考

成品效果参考:http://6.esperz.tk/

决定开头先上一张图来表达我的心情。

不愧是巨硬.jpg

因为巨硬一个神奇的操作,本人在晚上折腾了快一个小时后,才把问题解决。

在写报告的时候,花花绿绿的代码自然是不可少的,充斥着报告主体的源代码,如果是千篇一律的黑色的话,想必观看者会没有一丝的好心情吧。用黑白打印机的guna

结果,今天在写报告的时候发现,居然代码高亮没了。

没了? 没了?? 没了???

而且没的十分彻底,Word里都只提供粘贴文本选项,这说明格式根本就没有被从VS里复制出来。。。

不调字体的报告,简直连自己都不想看啊= =

于是,四处网上冲浪,企图寻找解决方法,期间经历了:

对Visual Studio版本的质疑?(即只有早期版本才自带该功能,VS2015之后的都不能带样式复制)——这显然不现实,几个星期前我还用过这个功能的。

开启HTML格式的带样式复制?——对于C/C++代码来说,并没有用

需要装插件?——名字似乎是叫PowerTools,但是扩展商店里根本找不到这个名字的插件= =

快捷键Ctrl + Shift + C/V?——不存在的,一个是打开什么选项卡,另一个是查看剪贴板

就在即将放弃搜索,寄希望于下一版的更新能够修复这个问题的时候,突然想起了之前因为看到VS16.6提供了对Doxygen的解析功能之后,欣喜若狂地从16.4更新到16.6版本的这件事。

莫非是加了新设置?

无独有偶,就在内外网的有效资源即将搜索殆尽之时,突然注意到,RTF, Rich Text Format富文本一词的出现频率不低。仔细回想,RTF是一种开放的文本格式,带格式的文本很有可能就与这个有关。

带着一丝希望,我打开了VS的选项界面,搜索了一下rtf,竟然真的有结果:文本编辑器-高级。仔细找找,发现其中并没有与RTF有任何相关的关键字,但是有一个在复制/剪切时复制格式文本选项。是不是就是这个?

实践证明,就是它。勾上了以后,再去复制代码到Word里,就有正常的样式了= =

我又回过头去,仔细确认了一下VS16.5和16.6的发行说明,并没有提到跟复制粘贴格式相关的改动。难道这就是尾大不掉?

后记:明明选项名称中是有复制两个字的,但是之前搜索复制的时候出不来,一搜RTF才出来,严重怀疑索引没汉化