我,水果皮儿,重返理工男之巅
前几天做了点有意思的事,好久没有那种状态了,想想就觉得沙雕搞笑,记录并且分享一下。
故事的开始
事情是这样的。我平时没事喜欢弹弹电脑钢琴,软件里有个乐谱架插件,可以给乐谱自动翻页,避免了手动翻页不得不暂停演奏的不完美。因为不同乐谱有不同的演奏速度,这就需要不同的翻页速度,所以乐谱架有一个翻页速度倍率的调节功能。
可追求完美的人从不满足。这个插件已经提供了许多方便,但还有个小问题:我需要记住每个乐谱对应的翻页速率,乐谱太多就会忘记、记混。这几近O(N)的记忆复杂度,是不能被我接受的。
我提出了更高的要求:将翻页速率与乐谱速度对应起来。比如乐谱的速度是100,对应的翻页速率应该为1.0;乐谱的速度是132,对应的翻页速率应该为1.3。这样,我就能把记忆复杂度从O(N)将至O(1),省去一些麻烦。
如果能够实现,这样还有一个好处,就是可以更方便地定量规定我练琴的速度。弹得快些或慢些,可以帮我熟悉乐谱或掌握节奏。
说干就干
我的计划是,通过调节乐谱架设置中的参数,达到我的目的。
可调的参数只有两个。1.页面滚动频率,2.页面滚动步长,单位是像素。
调参的逻辑很简单,让我弹一页的时间等于乐谱架翻一页的时间。
于是有,
其中,a和v是一页谱子包含的四分音符数和曲速,是谱子自带的常数。b和c是需要调节的参数。还剩下一个?没有确定,即一页曲谱的高是多少像素。
根据我的电脑的分辨率为1920*1080 px,乐谱架占据左半边半个电脑屏幕,乐谱原大小为980*1386 px,
可以得到?=1386*(1920/2)/980 px = 1358 px。
当然这是多此一举,最后我用屏幕尺量了一下,测得?为1350px,印证了理论的指导意义。
因为我想让翻页速率和曲速对应起来,所以可以规定翻页速率为1.0,曲速为100↓/min。得到,
当然,如果再严谨一点点,那么
Amazing!果然音乐的真理暗藏在数学之中,感觉数论和规划的记忆呼之欲出。
当然了,工业级项目不想要这么高的精度,所以把a=96,b=1带入公式1,得到c约为43。
实践检验
我兴高采烈地调好参数,期待着一劳永逸。试了下发现和我预计的结果差了十万八千里。当我弹完了一页,乐谱架才翻了半页,就离谱。
我想不通为什么。我屏幕的刷新频率是60Hz,也就是17ms/次,乐谱滚动的频率是43ms/次,即使能造成误差,也不应该这么大。
战斗到底
于是我打开秒表,给软件计时,发现它翻一页需要94s,计算得到对应的滚动频率实际约为70ms/次。我把乐谱架设置改为70ms/次,又掐一次秒表,计算得到对应的频率实际约为84ms/次。
理论和实际间,这巨大的鸿沟,要我怎么填。
我又把滚动频率改到1280ms/次,每次滚动30px。但因为此种滚动方式引起我的生理不适,并没有将实验进行到底。
最后不服气的我,又做了一次尝试。专门为这个谱子设定参数,只为验证我的公式是否成立。
于是我把乐谱滚动频率设为43ms/次(希望实际得到70ms/次的效果),b设为2。当我弹完一页时,乐谱架翻了半页。
我不服,把乐谱滚动频率设为1ms/次,乐谱架还是翻了半页。
终于,我裂开了。就算世界按照我的公式运行又能如何。不同谱子、即使同一首谱子的不同页之间,也会有不同的a值,最后仍免不了记忆和经验。
总结
算了,我不算了,我算什么东西。实测万岁,经验万岁。理论你往后稍稍,我是清洁工,爷清洁。
这破破烂烂的东西让我折腾到夜里一点多不睡觉,关掉电脑去水房刷牙的时候还在笑。理工男一本正经研究的时候确实快乐美妙,以后再研究乐谱架翻页我直播把屏幕吃掉。yo