duangsuse::Echo
为实现扒谱程序做了一点搜集 https://github.com/nwhitehead/pyfluidsynth 可以作为音阶合成库 https://github.com/vishnubob/python-midi 可以作为 MIDI 库 https://pypi.org/project/pyreadline/ 可以作为 CLI 监听库 MIDI 这个比较灵性,它不像 subtitle 那么简单,一个 MID 文件是由 events 构成的,如 NoteOn(tick,veloc,pitch), NoteOff(tick…
……其实设计到现在我觉得还是蛮有出入的,毕竟我一不熟悉 MIDI 二不熟悉 GUI 一堆不止是按步骤依赖去 make 而不考虑 events, threading 的东西
主要还是开始录音高的时候,原因居然是因为我觉得那样显得高级不少:
这个原因很智障,而且莫名其妙,是不是 😂
我居然还在考虑那个 code 可以在某种程度上自动和终端上的更新…… 只要我做好类似
后来我发现…… 其实是我想多了,因为音高的确认往往是(没错,劳资就是不懂乐理、劳资就是只知道音高数字)需要很多次测试才能完成的,所以按下 Enter 键来确认而不是不断删除,反而是一个合理的做法……
说句题外话, fluidsynth 的 start() 方法也修好了,所以不必用 pyaudio 了,emmm
主要还是开始录音高的时候,原因居然是因为我觉得那样显得高级不少:
def onAppend():
if n in range(0, 9+1):
code.append(str(n))
pitches.append(n)
print(n, end="")
else:
code.append(f"[{n}]")
pitches.pop()
print(f"[{n}]", end="")
def onDelete():
if code[-1] == ']':
code = code.lstrip(string.digits)[:-1]#'['
reprint(code)
else: removeNChar(1) 这个原因很智障,而且莫名其妙,是不是 😂
我居然还在考虑那个 code 可以在某种程度上自动和终端上的更新…… 只要我做好类似
update_line(new_code, code, mode="len_subtract") 这种,然后就可以 dropWhileRight 什么的…… 真是蠢后来我发现…… 其实是我想多了,因为音高的确认往往是(没错,劳资就是不懂乐理、劳资就是只知道音高数字)需要很多次测试才能完成的,所以按下 Enter 键来确认而不是不断删除,反而是一个合理的做法……
说句题外话, fluidsynth 的 start() 方法也修好了,所以不必用 pyaudio 了,emmm
srt.compose(srt.Subtitle(i, v.start, v.end, v.content) for i, v in enumerate(srts)) 🤔 把 index 信息混进去好像也不太难import re#Python #code 停,不用 regex 了,我们用 pyparsing!
pat_cdecl = re.compile(r"(\w+)\s+(\w+)\((((\w+)\s+(\w+))(,\s*(\w+)\s+(\w+))*)?\);")
ctype = {
"void*": c_void, "char*": c_char_p,
"int": c_int, "double": c_double
}.__getitem__
def foreign(cdecl):
"""t_result name(type name, ...args);"""
m = pat_cdecl.match(cdecl).groups()
t_result, name = m[0:2]
if m[3] == None: return cfunc(name, ctype(t_result))
args = [(m[i+2], ctype(m[i+1])) for i in range(3, len(m), 3)]
return cfunc(name, ctype(t_result), *args)
注: pyparsing 是老项目了,设计表现力和 ParserKt 有点像 https://github.com/pyparsing/pyparsing/blob/master/examples/jsonParser.py
GitHub
pyparsing/examples/jsonParser.py at master · pyparsing/pyparsing
Python library for creating PEG parsers. Contribute to pyparsing/pyparsing development by creating an account on GitHub.
Forwarded from Margatroid
以下哪些行为是违法犯罪行为?
Anonymous Quiz
15%
污染整个地区的 DNS 请求,返回无效 IP
5%
在主干网上进行劫持,对特定网站发起 HTTPS MitM 攻击
9%
篡改 HTTP 响应并插入攻击脚本,对特定网站发起 DDoS 攻击
71%
使用多线程下载百度云
t0 = time()基本上主要逻辑就这些
t1 = None
def giveSegment():
nonlocal t1
t2 = time()
reducer.accept( (t1-t0, t2-t0, synth.last_pitch) )
t1 = t2 #< new start
synth.last_pitch = next(pitchz, 50)
def nextPitch():
try: return next(pitchz)
except StopIteration: raise NonlocalReturn("done")
def doSplit(): synth.noteSwitch(nextPitch())
def onEvent(event):
nonlocal t1
if event.type == pygame.KEYDOWN:
key = chr(event.key)
if key == 'a':
t1 = time()
synth.noteon(synth.last_pitch)
elif event.type == pygame.KEYUP:
key = chr(event.key)
if key == 'a':
synth.noteoff()
synth.last_pitch = nextPitch()
giveSegment()
elif key == 's' and not is_hot: doSplit(); giveSegment()
elif key == ' ': onPausePlay()
……出 bug, 修复了 ,果然简单才是真理啊! 根本不该有什么 init update 顺序的问题,emmm
Telegram
duangsues.is_a? SaltedFish
t0 = time()
t1 = None
def nextPitch():
try: return next(pitchz)
except StopIteration: raise NonlocalReturn("done")
def doSplit():
synth.noteSwitch(nextPitch())
def giveSegment():
nonlocal t1
t2 = time()
reducer.accept( (t1-t0, t2-t0, synth.last_pitch)…
t1 = None
def nextPitch():
try: return next(pitchz)
except StopIteration: raise NonlocalReturn("done")
def doSplit():
synth.noteSwitch(nextPitch())
def giveSegment():
nonlocal t1
t2 = time()
reducer.accept( (t1-t0, t2-t0, synth.last_pitch)…