duangsuse::Echo
719 subscribers
4.28K photos
130 videos
583 files
6.49K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#Qt 🤔 啊,我才知道 QTimer 默认就是 scheduleAtFixedRate ,而不需要为非 singleShot 的情况额外编程的,只需 timer->start(rate); timer->remainingTime() 就好了,真方便
template <typename T>
void prints(T obj) { cout << obj << endl; }
template <typename... Arg>
void prints(T obj, Arg... args) { cout << obj; prints(args); }

void prints(std::initializer_list texts) {
for (auto text : texts) cout << text;
cout << endl;
}
PREETY_FUNCTION — StackOverflow
大概就是这样,改完了但是有 bug 没法修,毕竟也就是个学习。
audio_output
68.9 KB
#Linux #qt #signal #math 公式是 qCos(2*M_PI* qreal(x) / format.sampleRate() * pitch) 其中 x 是 (i % format.sampleRate())
不写了不写了…… 不就是个 QSettings 和 QTimer 还有 Gtk# 的 TreeView 使用么…… 模型都是简单的,再复杂不过一个 table grid 而已

来看看别的

from re import compile
PAT_LRC_ENTRY = compile(r"[\[<](\d{2}):(\d{2}).(\d{2})[>\]] ?([^<\n]*)")
def readLrc(text):
def readEntry(g): return (int(g[0])*60 + int(g[1]) + int(g[2]) / 100, g[3]) # [mm:ss.xx] content
return [readEntry(e) for e in PAT_LRC_ENTRY.findall(text)]


def dumpLrc(lrc_lines):
def header(t, surr="[]"): return "%s%02i:%02i.%02i%s" %(surr[0], t/60, t%60, t%1.0 * 100, surr[1])
return "\n".join([header(lrcs[0][0]) + lrcs[0][1] + " ".join([header(t, "<>") + s for (t, s) in lrcs[1:]]) for lrcs in lrc_lines])


嗯……然后我们想弄一个能组合歌词的程序,比如这里有一个示例数据
[00:32.96]怎<00:33.12>么<00:33.36>大<00:33.76>风<00:34.16>越<00:34.56>狠<00:36.16>我<00:36.56>心<00:36.96>越<00:37.36>荡<00:39.36>幻<00:39.52>如<00:39.68>一<00:40.08>丝<00:40.32>尘<00:40.72>土<00:41.12>随<00:41.28>风<00:41.52>自<00:41.92>由<00:42.16>的<00:42.56>在<00:43.76>狂<00:44.16>舞<00:45.76>我<00:45.92>要<00:46.08>握<00:46.32>紧<00:46.72>手<00:47.12>中<00:47.36>坚<00:47.52>定<00:48.96>却<00:49.12>又<00:49.36>飘<00:49.76>散<00:50.16>的<00:50.56>勇<00:50.96>气<00:52.24>我<00:52.40>会<00:52.56>变<00:52.96>成<00:53.36>巨<00:53.52>人<00:54.16>踏<00:54.40>着<00:54.56>力<00:54.72>气<00:54.96>踩<00:55.36>着<00:55.76>梦

然后我们有楼上的 zipWithNext 和 zipTakeWhile 实现
等我弄完
写好啦,那个 zipTakeWhile 居然还浪费了我好长时间调试…… 居然没一遍写对,当然也不能怪我,这个不是流操作的流操作 和 zip 操作本身对定义初始情况的要求经常容易忘记
lrc_merge.py
1.2 KB
#Python #code #music #tools 这个工具可以用来合并简板的 lyrics ,如果你的 lyrics 是自动生成的,没有带好行号,它可以自动从两个字的间距算出歌词行号。
duangsuse::Echo
🤤 Sticker
这个小工具也写了我一个小时…… 不过还好,有了它就可以避免没歌词的麻烦了
……这个该死的 Python regex 怎么连 findall 都有限制,我只好分行来读取了,emmm
This media is not supported in your browser
VIEW IN TELEGRAM
list 又没有 flatten 又没有 flatMap ,这种烂代码让人怎么活啊……
itertools.starmap 也根本不可以用,我不是要给 transform 函数传 vararg…… 我是要给 result flatten
准备加入 Hachiko 豪华套餐(迫真)
duangsuse::Echo
准备加入 Hachiko 豪华套餐(迫真)
因为 smf-to-lrc 项目是 Kotlin 写的,不太容易要求用户有 Kotlin 开发环境也不好直接发布 jar 包,公开作为私用脚本算了…… 有心人自然会发现该依赖啥项目,然后具体怎么用
pypi 里都没有一个好的 lrc 解析器,唉,可怜
duangsuse::Echo
写好啦,那个 zipTakeWhile 居然还浪费了我好长时间调试…… 居然没一遍写对,当然也不能怪我,这个不是流操作的流操作 和 zip 操作本身对定义初始情况的要求经常容易忘记
这货也有 limitation ,输入数据只有音符的 start ,没有 end
意味着每行的最后一个音符,都不知道该在哪停……

根本没有办法解决,因为 LRC 就是只有 start,而我调试的时候用 SRT 的话最后一个字的时间就会不准确

如果输入是 SRT 格式的话就有 start 有 end,移植也很容易只需要 max(line, key=lambda it: it[0]).end ,但我不会写 mid 歌词读取……

看来我得在 Kotlin 代码上做 hack 了…… 别人又不能用到这个特性,唉。
This media is not supported in your browser
VIEW IN TELEGRAM
实在是太菜了,自己的程序得仰仗别人的应用工作,连一定完成都做不到
#vocaloid 野子 苏运莹 版 工程配布