前两天找到个flash的键盘钢琴,可好玩了。可我感觉flash的不够完美,心想,要不用js做个纯页面版的,于是上网找音乐素材,找来找去,真难找哇,我以为很多呢,网上人也说很多,但我却一直没有找到理想的。于是,嘿嘿,我用swf提取工具把那个flash钢琴里的26个音符文件提取出来了,哈哈!

心想,做弹的琴是很简单的,只要捕获键盘事件就行了。我要做出有意思的,让别人把输入的字母读取出来,然后在“翻译”成音符,这样就可以让别人来弹琴,同时可以录下他的“乐谱”,然后还可以再把它播放出来。这样肯定很有意思!^_^

于是我就写啊写,写啊写。。。其实播放字母乐谱也是很简单的,26个字母对应26个mp3格式的音乐文件而已,关键有点难度的是乐曲嘛,是有停顿的,不可能一口气从开头唱到结尾嘛,这样的乐曲放出来也听不出唱的是啥。停顿?怎么停呢,这又是问题,句与句之间要停顿,句中每个音符之间也要停顿啊;而且不能只放一首曲子,要循环着放,曲子与曲子之间也要停顿啊!

停顿,什么是停顿?如果程序在播放音乐过程中,反应迟顿,每个音符都要延迟,那就再好不过了,省去我手动停顿的麻烦。可是实践表明,js效率是相当高的,几乎没有反应过来,其实压根就没有听清楚,音乐就放完了。。那就来考虑停顿吧。。。可是停顿,唉呀呀,想得轻巧。。js是没有java那样的sleep()函数的。。js是单线程的嘛,没有暂停执行的功能,唉,啥玩意儿。于是没辙,想了n多种方法,上网搜一搜,也有一些“发明”的sleep()函数,但都很不好用,相当不好用。没辙,只能摒弃之前的思路,重写程序,用setTimeOut来调自身,实现带延迟的递归。因为要模拟原先的三层嵌套循环,这个递归着实有点复杂。。唉,都怪之前没考虑清楚停顿。。本来还想做个jquery的声音插件的,真是事与愿违啊。。

更为悲剧的是。。放到网上才知道,原来之前一直好使的声音播放,一下没声音了!!赶紧查资料,唉,完蛋了,这才知道,各个浏览器对embed支持也是相当不给力啊,这叫气的。。没辙,于再修改,改得头破血流,算了,先弄个支持IE的版本玩玩再说,于是就出现了我blog首页这样的悲剧画面。。这叫气啊。。不兼容啊!

2011-5-16 补:其实我很想弄出个基于js的线程调度算法,还在理论分析当中,只是希望不大。。话说,毕竟程序嘛,语言都是一致的,把浏览器当硬件,弄出个进程调度应该是可行的啊