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
Forwarded from Solidot
Stephen Wolfram 称找到了物理学基础理论的途径

Wolfram Research 创始人、Mathematica 软件的创作者、数学家/物理学家 Stephen Wolfram 发表博文,宣称找到了通往物理学基础理论的途径。Wolfram 称,1980 年代初他开始研究简单程序产生的计算宇宙时得到了一个惊人而重要的发现:即使一个系统的底层规则十分简单,总体上的系统行为能任意的丰富而复杂。这促使他思考:宇宙是不是也是以此方式工作的?我们在物理中所看到的丰富性和复杂性其底层是否是简单的规则。他因此写下了 100 页的《一种新科学》。现在,在年轻物理学家的督促下,他再次发表了 448 页的技术论文,描述了我们宇宙的物理属性从简单通用可计算的规则产生出来。Wolfram 表示这些属性与相对论和量子理论一致。其他人认为他的理论和弦论一样难以验证。Media

https://www.solidot.org/story?sid=64129
为实现扒谱程序做了一点搜集

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,pitch), EndOfTrack

程序的设计大概有两个过程
def cliReadPitches(note_base=note.C) -> List[int]
def cliReadTimeline(mode="normal", seekback_ms = 5000) -> List[Subtitle]


第一个过程利用数字键盘输入( [12] 这个语法可以输入高音阶 )
可以用 Delete 删除上个音阶、 C-R 重放一遍、 C-I 粘贴、 Enter 确认

第二个过程可配合进度条和时间
用 A 来创建音符事件(但不会改变音高流)、S 来迭代下一个音高(从保持按下的A键切分)
用 Delete 回溯 5s 的音符,用 Enter 确认

-note-base 是指简谱基础音高
-play music 是在 cliReadTimeline 时配合放的音乐文件
-hot 是个 flag,可以禁用 S 键并且让 A 键带有迭代音高的效果
import pyaudio, fluidsynth
RATE = 44100
pa = pyaudio.PyAudio()
stream = pa.open(RATE, 2, pyaudio.paInt16, output=True)

class NoteSynth:
def __init__(self):
self.synth = fluidsynth.Synth()
def setFont(self, path_sfont):
self.synth.program_select(0, self.synth.sfload(path_sfont), 0, 0)
def sampleNotePitch(self, pitch, n):
self.synth.noteoff(0, pitch)
self.synth.noteon(0, pitch, 100)
return self.synth.get_samples(RATE*n)

synth = NoteSynth()
synth.setFont("example.sf2")
stream.write(synth.sampleNotePitch(20, 5))
import datetime
In [50]: d=datetime.datetime.now()

In [51]: d-datetime.datetime.now()
Out[51]: datetime.timedelta(days=-1, seconds=86386, microseconds=151814)

In [52]: datetime.datetime.now()-d
Out[52]: datetime.timedelta(seconds=17, microseconds=80236)
🤔 #Python #code
#include <stdbool.h>
#include <stdio.h>
#include <readline/readline.h>

int handle_key(int count, int key) {
printf("pressed: %d\n", key);
rl_on_new_line();
return 0;
}

int main(int argc, char *argv[]) {
rl_command_func_t handle_key;
rl_bind_key('\t', handle_key);
rl_bind_keyseq("\\C-a", handle_key);
while (true) {
char *line = readline(">");
}
}
🤔 这样就可以 bind key,然后用来处理事件了…… 可是我想要 keydown/keyup 两种事件啊
#linux #io https://docs.python.org/3/library/tty.html 🤔 各种终端 termios 和 pty?
def reprint(s): print("\33[2K", s, sep="", end="")
这样应该就没问题了吧
a=synth.sampleNotePitch(30, 5)
s=pygame.mixer.Sound(array=array([a,a]).transpose().copy())

失败了… 看来 pygame.mixer 只能用来做最后一步的 audio……

from pygame import mixer_music as music
music.load(filepath)
music.set_pos(music.get_pos())
music.set_volume()

music.set_endevent
hachi.py
2.6 KB
#Python #code 算是一时失败了,用了 fluidsynth 的 sondfont 和 pygame 的 key events 但是没法处理好异步播放…… 估计要在回放的时候单靠按键持续时间有点悬吧
  15:11 - error: Argument of type 'Union[str, NoReturn]' cannot be assigned to parameter 'name' of type 'str'
Type 'NoReturn' cannot be assigned to type 'str'
'NoReturn' is incompatible with 'str'
🌚我居然无言以对。 #Python
synthesize.py
6 KB
好了,终于可以摆脱这个不过 700 行 ctypes 代码还不 pull 别人的修复 PR 的 repo 了
怎么连个 binding gen 都不用 😴
倒时候想办法让 pygame 的 mixer 可以管理这些… 要不然真的每次只能听音高、不能按多久听多久……
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 的东西

主要还是开始录音高的时候,原因居然是因为我觉得那样显得高级不少:

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 信息混进去好像也不太难
hachiko.zip
18.3 KB
#Python #code 准备赶快继续重构下了… 发现很多东西有出入,可以简单化也适合我这种非资深又爱偷懒的……
def abrange(start, stop, step_a, step_b):
acc = start; is_a = True
while acc < stop:
yield acc
acc += step_a if is_a else step_b
is_a = not is_a

#Python #code 写了正则解析程序,又灭掉一些不好的代码……