TonyChyi

我在那一角落患过抽风

2017年6月的一些事
2017年06月15日 文章
其实也没什么事情吧,只是想写点东西出来。 花了很多钱,用上了 Mac,感觉似乎还不错,合上盖子就能带走,打开盖子就能立刻使用。 另外,我入手了一把二手的 YouRock Guitar,就是下面这玩意 不过因为各种原因,我已经很长时间没碰过吉他了,需要一些时间,而这个东西是一个 MIDI 控制器,我大概需要些时间来学习了。 被蓝军伤的很重,我到现在还不能理解一个人仅仅只是因为两句话就不爽以致于几乎天天骚扰别人。我真的累了,心累 感觉是应该改变一些什么了,这样下去真的好吗?我很纠结。 果然还是说不出什么来啊,就这样吧
Tags:
还是当爹了
2017年04月11日 文章
2017-04-03 17:18 孩子降生,2900g,♂ 孩子很结实,出生 5 天即可抬头
Tags:
MacOS 7 里到底有什么?
2017年03月06日 文章
我一直很好奇早期的 MacOS 里面到底有什么。 为了解答这个问题,我安装了 BasiliskII 并在其中安装了 MacOS 71, 好吧,看起来还不错。 体验完了以后,我看了一下磁盘镜像 [email protected]: ~/os7 > file MacOS7 MacOS7: Macintosh HFS data (bootable) block size: 33280, number of blocks: 64527, volume name: MacOS 嗯,是 HFS,果断安装 hfsprogs,然后挂载这个镜像 下面我列了一下整个磁盘中的文件及相关信息 总用量 67031 -rw-r--r-- 1 root root 19696 5月 31 1996 About System 7.5 drwxr-xr-x 1 root root 6 3月 6 2017 Apple Extras -rw-r--r-- 1 root root 133120 3月 6 2017 Desktop DB -rw-r--r-- 1 root root 328322 3月 6 2017 Desktop DF drwxr-xr-x 1 root root 2 3月 6 2017 Desktop Folder -rw-r--r-- 1 root root 0 10月 13 1995 SimpleText drwxr-xr-x 1 root root 17 3月 6 2017 System Folder drwxr-xr-x 1 root root 2 3月 6 2017 Trash -rw-r--r-- 1 root root 68157440 3月 6 2017 VM Storage .
Tags: #MacOS · #Apple
启用IFTTT了
2017年02月23日 文章
Tags: #测试
填掉了 LMMS 一个长达两年的大坑
2017年01月20日 文章
LMMS 的代码里其实已经有了一个 MIDI 文件的导出功能。但是代码里的注释告诉我,那个是坏的,而且主界面的代码里把 MIDI 导出的菜单项给注释掉了。 既然 Midi 导入的功能已经改成了 Drumstick,那就更干脆点,直接把导出功能也解决了吧。 原代码功能 原来的 Midi 导出代码是将项目的内容转成 Qt 的 DOM 视图,然后从视图中读取信息,另外再实现一个自己的 Midi 写入的类。 但是这个代码似乎只能导出音符信息,控制器信息却不能导出,这就意味着,像 Pitch bend/Volume/Panning 这些信息要丢掉,也没法导入到其他的软件中。 原代码可以参考这里 新的需求 我的目标是,做一个 GM 兼容的 MIDI 导出功能,不仅导出音符,还要能让导出的 MIDI 文件直接可以拿来听! 接下来就是试验一下 Drumstick 如何写入一个 MIDI 文件。 我们需要这样做1: 首先调用 setFileFormat() 设定文件版本,这里就强制设 1 吧2 然后调用 setDivision() 设定一个四分音符的 Tick 数,同样强制 960 吧。 这样,一个 Header 就完成了,接下来写每个轨道的信息。 扫描整个项目,将使用 Sf2 Player 的轨道记下来,统计数量,调用 setTracks() 设为轨道数 +1s 同样也把 AutomationTrack 也记下来。 Drumstick 按轨写入的方法是,发送一个 signalSMFWriteTrack(int track),然后设置一个 Slot 去接收它。 分配一个 Channel。 track 为 0 时,写入全局事件3,这也是为什么要把轨道数加 1。 从 InstrumentTrack 的 TrackContentObject 中获取音符信息,写入一个事件列表4。 将 Program Change/Control Change/Pitch Bend 事件从 AutomationTrack 取出,写入事件列表,并指定好 Channel。 对事件按时间排序,并计算出事件之间的时间差5。 写入事件到文件。 最后写入一个 EndOfTrack 的事件。 这里分配 Channel 的机制我要单独拿出来说一下。
Tags: #LMMS · #MIDI · #C++ · #Qt
把 LMMS 的 Midi 导入功能改用 drumstick 实现了
2017年01月08日 文章
啊,更好的方法就是,用他妈的什么 portsmf 用 drumstick 啦 ——@liushuyu 终于折腾好了 带着对 drumstick 的撞憧憬,我终于还是给自己挖了个大坑,把原来 LMMS 在 Midi 文件导入时用到的 portsmf 库换成了 drumstick。 然而这并不是一个有趣的过程。 portsmf 是按顺序返回 Midi 事件,而 drumstick 是基于 Qt 的 Signal/Slot 机制。 于是我先花费了一点时间搞明白 drumstick 是如何工作的。 然后对整个的 MidiImport 插件进行了大拆解——将混乱不堪的代码按照 class 分成了几个文件。 接着写了一个 midiReader 类,用来接收 Midi 事件,并添加到 LMMS 的轨道中。 那么接下来的工作就是实现 midiReader 的 Slot。 在 lmms 的导入过程中,用到了以下 Signal: signalSMFTimeSig(int,int,int,int) “以四分音符为一拍,每小节四拍” signalSMFTempo(int) 节奏,单位是 ms/quarter_note signalSMFError(QString) 错误处理信息 signalSMFCtlChange(int,int,int) 控制器信息 signalSMFPitchBend(int,int) 弯音信息1 signalSMFNoteOn(int,int,int) 音符开始,但最后一个参数为 0 时等同于音符结束 signalSMFNoteOff(int,int,int) 音符结束 signalSMFProgram(int,int) 音色改变2 signalSMFHeader(int,int,int) Midi 文件头信息 这样就完全不用考虑导入的 Midi 文件是格式 0 还是格式 1 了,忽略掉 signalSMFTrackStart() 和 signalSMFTrackEnd() 就可以。
Tags: #LMMS · #MIDI · #drumstick · #C++
修复了 LMMS Pitch Bend Bug
2017年01月04日 文章
@leo_song 对我说,搞报表平台的代码不如研究 LMMS LMMS 有一个存在了很长时间的 BUG:导入 Midi 文件的时候,对 Pitch Bend 不能很好的处理导致走音。 定位 在 Cakewalk 中测试,如果是单纯调整 Pitch Bend,最大范围是 ±2 个半音,而我这里有个文件1甚至可以达到 1 个八度。 经过一番测试,发现是 RPN(0, 12) 这个参数在起作用: 0, 0, Header, 1, 7, 960 1, 0, Start_track 1, 0, Control_c, 0, 101, 0 1, 0, Control_c, 0, 100, 0 1, 0, Control_c, 0, 6, 12 1, 0, Control_c, 0, 38, 0 …… 也就是上面的 Contol_c 事件,先以 101 和 100 控制器发送值 02,然后再用 6 控制器发送 123,最后以 38 控制器发送 0。
Tags: #LMMS · #MIDI
他们指向左,他们指向右,我们还是没脑子
2016年12月29日 文章
他们指向左,他们指向右,我们不能没脑子 ——李志《他们》 这是一首被封杀的歌,但我总觉得它被封杀的原因并不是嘲讽了赵太爷,而是因为歌词比较“下流”1 然而我们还是没脑子。 人日说电影打差评不行,又说可以打差评,妈了个屯的,我们还是被Fooyou。 媒体爆出了某个比较惊人的事件,然而往往就在几天后反转,总感觉自己被带节奏。就像是之前还是胡编的某人,最近画风又变了。真的很迷茫,对现在的媒体完全不敢相信了。 曾经以为自己是在“独立思考”,然而现在却发现,自己从来就没有过。 仍然不知道什么是对的,什么是错的,果然这个“群众”其实什么都不是,一面“眼睛雪亮”,一面“不明真相”。 现在只有吃瓜看戏的份了,不知道能不能闷声发财。 还是不想上班不想工作 一个叫本兮歌手的死,再一次充分暴露了资本主义的残酷性。一个有才华的姑娘被各种公司压榨,又不得自由。 可是又能怎么办涅?毕竟还在异化 至少到现在他的作品《人民不需要自由》还没被封杀 [return]
年末的一些碎碎念
2016年12月12日 文章
气氛上博客已经闲鱼了很久(一个多月)了,不知道还能写什么。 先来抱怨一波吧 很多事情说出来也许会好很多。 感觉结婚后的生活并没有变得多好,反而因为工作的原因越来越累,或者说有可能有了一种厌倦感。虽然在公司的运维团队里我是个主力,很多事情也需要我去把关,可这并没有让我有什么成就感。 能力越大责任越大,闹心的事也越多。很多项目的对接需要我去做,然而与第三方的沟通成了一个大问题,很多事情明明说的很清楚了,却仍然需要一遍一遍的出坑,沟通的成本没有下降反而越来越高。再加上我是个很讨厌别人在聊天工具上问我“在么”的人,有什么事情完全可以直接说的,却非要多这么一步,感觉自己的工作一直被视奸。 和开发也有扯不完的皮踢不完的球和背不完的锅,系统开始变得不太稳定,然而除了救火却无能为力。根本想不出是哪出了问题,是自己不够努力还是确实有些环节在空转影响了效率。 感觉不像以前那样积极,喜欢动手了,更想整天发呆,不想上班。这 TM 就是生活? 越来越暴露的自己的短视和某人的伟大 5 年前,我是个“美分”。痛恨大林,XX东,TG,感觉他们是万恶之源1。感觉某国是人类的希望,然而…… 去你妈的政治正确! 当你把希望寄托在别人身上的时候,就已经立好了注定失望的 flag。 新任的美国各部门的老大清一色的资本家,呵呵哒。 然而国内也没好哪去 果然资本家为了利润都不惜杀鸡取卵了么? 几乎所有的人都在说,要快,快鱼吃慢鱼……这TM不就是激烈竞争导致的么,不还是资本游戏么! 然而我却是个懒人——或者说是慢工出细活的人。工作时的感觉远远不如自己在写开源软件时那样从容。虽然有些项目的推进确实也让人着急,但是每个人都很努力,至少没那么让人绝望。 越来越感觉马克思说的很对,资本主义2就是在剥削啊! 然而这伙计实在太超前了,以至于可能只有我的孩子也许能看到那样一个世界了吧。我真的很想过一段时间去做一些不同的事情,比如做做音乐,写点自己想写的程序,去别的地方看看,顺手占几个 Po,或者就发几天的呆,放空一下自己。 然而,我没钱,也没有时间,总是害怕以后的生活不能维持。也只能怪自己不够 NB,没有财务上的自由,只能努力干活赚钱才可以生存。 所以最近一段时间一直在关注可控核聚变,还有其他可以引发一次剧变的黑科技。 也许当这些技术上线后,人类就可以从这些乱七八糟的事情中解脱了吧,至少漫画家不会因为生存而透支自己,程序员不会因为改不完的需求而加班熬夜,活的还能从容一些。 因为我害怕 自己干的这一行,已经有很多起被活活累死的事情发生了。然而在这种情况下,却不停的听到某厂要 996 甚至 897 的声音,打不完的卡签不完的到。甚至某些除了政治什么都不懂的老板,还要不停的洗脑。人不像人,鬼不像鬼,机器不像机器。 感觉水已经淹到了脖子,要喘口气都太难。 是的,上班有些累了,想要放松一下,手里却总是有事情忙不完。 如果不考虑当时这些人的处境,说什么都是可以的吧,尽管现在看来他们那样做确实有问题,然而艹蛋的现实并没有什么改观 [return] 无论是垄断资本主义还是自由资本主义还是国家资本主义还是权贵资本主义 [return]
用 Go 实现一个守护进程
2016年10月25日 文章
实现一个守护进程,同时还可以调用该程序加特定参数停止该守护进程 package main import ( "fmt" "io/ioutil" "os" "os/exec" "path/filepath" "strconv" "time" ) func main() { // 处理程序后的参数 if len(os.Args[1:]) > 0 { switch os.Args[1] { // 停止守护进程,从 /tmp/pidfile 中获取进程 ID case "stop": bpid, _ := ioutil.ReadFile("/tmp/pidfile") pid, _ := strconv.Atoi(string(bpid)) proc, _ := os.FindProcess(pid) proc.Kill() fmt.Println("Killed.") os.Exit(0) } } // 启动守护进程,即当自身的父进程不为 1 时,就启动一个新的进程, // 并退出自己,直到父进程为 1 (一般是 init)为止 if os.Getppid() != 1 { exePath, _ := filepath.Abs(os.Args[0]) cmd := exec.
Tags: #Go

 

TonyChyi © 2018 GPLv2