太鼓达人

利用CronusMAX Plus可编程转换器自动白金PS4太鼓达人

刚刚搞定白金,分享下思路,程序因为还要微调,等搞完可能会传到Cronus论坛上去。
前阵子36664这篇机因里面跟大佬@koikoiyo 简单讨论了自动打鼓的几个思路。我后来还真上心琢磨了一阵子,我简单总结下大概的想法:
首先大体上思路可以分为机器视觉实时处理,和Hard Coding直接把谱子写死这两种。
机器视觉么,我自己多年不碰已经难捡起来了,大佬也试了下,要解决的问题还很多。
写死的方法就很简单,因为Wiki上有每首歌的谱子,挑你要打的把谱子抄下来写进程序去就行。
一楼写不下,下面补充。
微博 微信 zhangce1993 2022-05-02 01:49   40回复
评论
如果谱子可以写进去,那么剩下要考虑的就是如何让PS4接收到控制信号。
我目前有四种思路:
第一种,单片机驱动电磁铁去打按键,这个成本很低,但是需要定制或者3D打印模具,要学的很多;
第二种,也借助单片机,但把手柄拆开,飞两根线把随便哪两个按键引出来,然后用单片机给电平触发就可以,红蓝note用PS4系统内部的按键映射map过去就行。最简单的是L3和R3,这俩按键的引脚是通孔焊接,很好弄,我可能下一步会试试这个;
第三种,单片机或者PC,纯软件的方式虚拟一个DS4,然后把谱子用按键数据包的格式发给PS4,通讯协议上次大佬贴了,不过我大概读了读,对USB协议本身要学的东西很多,也是比较耗时,但应该可行,毕竟山寨DS4早就满天飞了,也就是说这件事必然有人做成了;
第四种,就是我这次介绍的,成本较高,这个转接器要几百块,但是你买来之后只要简单写个脚本就可以了,DS4接上,这边给个信号一触发,自动开打。

程序本身难点不多。主要集中在三部分。
第一部分,是要读懂wiki上的太鼓谱子,要结合BPM的数值去把每个音符之间的时间间隔算出来;
第二部分,学会这个编程器的IDE,属实比较反人类,类似于C但是很多语法根本不支持,但堪堪能用就是了。比较蛋疼的是这个编程器的性能捉鸡,板载内存只有4k,也就是说编译后的代码要控制在4kB之内(新款支持32kB了)。这个编程器有个论坛,上面有很多写好的脚本,我看了下还真有个太鼓相关的,但那兄弟只发了一半,而且代码风格极度Brute Force,半首歌编译出来就29kB大,我这个老款编程器根本装不下,所以我是重头用简单的逻辑写了一遍。
第三部分,这部分最耗时,就是对谱子的微调,因为譬如说【红】这首歌,它的BPM是恒定的156.3,算出来十六分音符的间隔是95.9693ms,但通常单片机的延时都是以ms为单位,所以只能写成96ms,那么这个时间间隔的误差就会不断累积,要在适当的时候进行补正。这只是其中的一个问题,总之当你去调的时候你会发现很多细节问题,如果想把谱子调成全良的话这个工作量相当不小就是了。

我目前也没有搞定全良,但全连是写出来了,刚把10000combo的杯拿了。
其实魔王999combo对我来说也没啥难度,但你要真让我10000combo不断连我感觉心理素质跟不上,而且折腾折腾逃课方法也挺有意思的。

大概就是这样,程序我有空再改改,可能会发出来。
剩下几个思路我有空折腾好了再跟大家分享。
以上。
zhangce1993 2022-05-02 02:27修改
好想法 我希望能搞定初音x
yes_rpg 2022-05-02 02:16
@yes_rpg 初音我也坑着几个,能不能用这种方法打很关键的一点是有没有现成的谱子,自己扒谱的话这个工作量难以想象
zhangce1993 2022-05-02 02:34
机器视觉这条路有b站阿婆主水过了(大神uid:uid:4401694),用深度学习训练了一个fps游戏专用爆头AI算法,如果想省点事,跟这个哥们要一下自己再改改应该就能用了,铺面情况比认头还是简单,关键还是这样的技术路线泛用性高,一个一个扒谱工作量太大,而且也可以泛用到其他音游上,初音 djmax之类的再稍微魔改下问题也不大
conanedogawa4869 2022-05-02 06:26修改
大佬真的搞出来了啊。我就觉得自己写铺面拿真的太长了 Cronus确实是解决延迟最好的办法了,直接发送按键信号,没有中间商
koikoiyo 2022-05-02 10:18
@conanedogawa4869  原理的确是差不多,按照识别结果的标签进行对应操作,太鼓的鼓点就那么几种,找点图去训练识别模型肯定比训练识别FPS敌人脑袋的模型简单。
但是问题是这个是主机上的太鼓,要实现自动操作必须经过串流,串流哪怕是用网线还是有延迟,有时还掉帧,太鼓这游戏在高难度下操作频率太高了,连续操作的间隔太短,很容易翻车,FPS肯定不可能几分钟爆上千个头
不过PC的太鼓应该可以比较容易实现自动打
koikoiyo 2022-05-02 10:29
克麦打杯神器,打格斗游戏连段和重复挂机劳作谁用谁知道,主要支持4/3/vtv以及上世代所有手柄很方便。
sermeric_hk 2022-05-02 11:03
我买的是Cronus Zen,通用吗
wz5wz 2022-05-02 11:07
@koikoiyo 确实,只是扒谱工作量大或许可以在扒谱这块下下功夫,用类似的深度学习算法去记录铺面也是可行的,相当于活干一半,写成脚本,剩下的交给输入端,如果铺面少,那人工去写问题不大,太多的话,感觉去训练还是省事,起点科技含量高,但后续的投入成本就低了
conanedogawa4869 2022-05-02 12:26
没明白为什么说误差会累积 就算是小数点 每个note的offset是独立的 又不会影响别的note……
如果说脚本取的是两次操作之间的间隔时间,那直接计算全部note的offset先取整再算差值不就可以了…
ecchimu_495 2022-05-02 12:48
我没记错的话太鼓的判定好像是±25ms 这点小数点误差不是问题
另外就是…本家谱基本都有现成的tja,自己根据他的语法写个小工具转换一下就行了吧,一个个note手算那也太费力了
ecchimu_495 2022-05-02 12:53
之前一个脚本写两个小时,编程crouns脚本好辛苦的。
而且crouns有很微妙的误差,之前编ftg的就出现过的,同样的脚本有时候成立有时候不行。
我感觉编音游crouns有点够呛的
minnaha 2022-05-02 13:28
串流加按键精灵有时候应该也可以的吧,串流用chiaki可以键盘,然后电脑跟ps都网线应该可以把延迟控制在一个可以接受的范围内
flewsea 2022-05-02 14:12
牛逼,物理外挂,无法检测
dw--shadow 2022-05-02 14:13
当年隔壁寝室用单片机打劲舞团,键盘啪啪啪
v838monova 2022-05-02 16:38
@ecchimu_495 不费力,因为只有几种典型值,八分六分十六分十二分什么的。程序自动识别也可,tja文件我没研究,这也是个思路感谢提醒。然后延迟累计的话就是因为每个note的延迟都写大了一点,note越多就会差的越多。当然实际上比这个复杂的多因为这里面有程序执行的时间和手柄本身的延迟等等。
zhangce1993 2022-05-02 16:39
@minnaha 确实,这种误差主要是程序执行也需要几个时钟周期,加上手柄本身的反应时间之类的。但好在这种误差是稳定的,所以打音游完全没问题。
zhangce1993 2022-05-02 16:41
CronusMax 有个 C# API,非常方便,直接用 C# 控制输出,不受 CronusMax 硬件的 RAM 限制。你可以试试。

(我之前写过视觉识别自动玩闪乱神乐忍乳负重的 C# 程序)
chenzhechn 2022-05-02 16:57修改
@flewsea 这个不行,我试过。不是因为遥控游玩的延迟高低问题,而是它的延迟不稳定,不稳定所以人脑来说无所谓反正实时目视校准了,对于写死的程序就不行了。然后按键精灵也是难用的不行,写点简单的对延迟不敏感的脚本可以,太鼓这种,反正我初步试了试,不行。
zhangce1993 2022-05-02 16:51
@minnaha Cronus 脚本的问题是他的 wait() 误差会累积,所以没法弄音游。直接用 CronusMax 的 API 控制输出的话不会有这个问题。
chenzhechn 2022-05-02 16:56
只有太鼓能这么搞?
ouran1112 2022-05-03 06:53修改
那理论上是不是所有音游都可以搞?
ouran1112 2022-05-02 22:47
@zhangce1993 再偷懒一点的做法 先去找谱面tja 找一个tja→osu的转换工具
然后放进osu的编辑器里调整offset,保存,因为osu的谱面格式是直接写每个note的绝对时间的
你可以直接看到每个note的时间点,不用手算
ecchimu_495 2022-05-03 00:19
求求整个初音的
rrobinvip 2022-05-03 07:03
@ouran1112 是。太鼓、DJMAX、初音、SB Xonic……只要是固定按键无随机,都可以这么搞……
chenzhechn 2022-05-03 19:36
太鼓remoteplay我做了个实时识谱的都不需要有谱面。调整好延迟就可以全连。
mastman429 2022-05-03 22:31修改
有兴趣可以和我一起讨论,目前做了chiaki版本,使用的是vigem虚拟一个usb ps4手柄,利用windows的api得到窗口的buffer(实际上可以使用chiaki decode得到的帧直接做),再编写一个程序update手柄的hid报表就行了。
识别的是英文的名字,用opencv 的 template match 卷的。
可以看看:
mastman429 2022-05-03 22:31修改
机器视觉的问题很简单,不识别鼓的图形,识别鼓点的名字。之后膨胀3-4次,再腐蚀两次,再找一级轮廓就可以确定位置。
之后再用最小包围矩形里面的图形去template match准备的一张大图,其中包含了所有的鼓点名称,就可以确定相似度最高的鼓点名称。目前这种算法的正确率基本是100%,从来没有识别错误过。就算是用720p的模板,实际输入的图像是360p都没有识别错误过。
之后计算各个鼓点中心距离打击点的距离,多次采样根据这些帧的时间差就能算出鼓点的速度。设置一个remoteplay的延迟,就能使用vigem发送hid报表操作打鼓了。
模板:

刚好前端时间在研究这个哈哈,其实不只是打鼓。和一些深度神经网络结合起来还能做复杂的工作,代替你玩游戏。
mastman429 2022-05-03 22:36修改
有兴趣真的可以交流一下,把一些格斗游戏和重复刷刷刷的游戏做一些脚本,这样能减少重复工作量。况且remoteplay+windows的门槛基本等于没有,手柄都是虚拟的(对,你甚至连手柄都不需要),这种方案比还需要外接一个编程器的方案好多了,当然我这个目前也要有一定的问题,可以psn加我一起讨论一下。
mastman429 2022-05-03 22:28
@mastman429 我想知道字叠一起的谱能识别吗(
ecchimu_495 2022-05-03 22:48
这要是能自动打DJMAX就厉害了..
preiya 2022-05-03 22:49
@ecchimu_495 字不会叠一起,没有这种情况
mastman429 2022-05-03 23:07
@ecchimu_495 因为这种情况正常游玩都看不清,速度快的击鼓是用note的高速来做的
mastman429 2022-05-03 23:09
@preiya djmax肯定是可以的,我一开始准备做djmax的
mastman429 2022-05-03 23:20
@mastman429 可以可以,我加你
zhangce1993 2022-05-03 23:22
@mastman429 @zhangce1993 我今天看到一个叫 GIMX Network 的软件,可以启动一个网络服务器,然后接受发包,控制 GIMX、克麦、Titan 等转换器。同时,它提供了一个 Python 编写的客户端。

于是我把我以前用 Python 写的自动玩 DJMAX 的程序(不是视觉识别,是读取事先编好的谱面,格式是自己随便定的,输出是虚拟键盘)拿出来跟 GIMX Network 的 Python 客户端拼了一下,然后就……能用了。这下方便很多了,以前用虚拟键盘 + 键鼠转换实在是太麻烦了,直接网络传输方便很多,鸟枪换炮了
chenzhechn 2022-05-04 00:26
@mastman429  红字是置信度吗,这看起来比yolo高,yolo那一套如果要速度就用准确度最低的模型,置信度惨不忍睹
aikikalaskamaido 2022-05-04 12:44
哇Djmax成功了的话是不是我就可以去把8key的杯都补了……
boychouchou 2022-05-04 15:36
autoplay时代来临
toriki-j 2022-05-05 08:59
我最近也在把Cronus Max翻出来重新打DJMAX,8B确实苦手,导致很多内容体验不到。其实如果有想法可以一起讨论讨论。
racingraymondxr 2022-07-26 18:47 浙江
回复不能
T