用Ruby写了一个自动连接循环音频片段的脚本

从3月开始我接了一个给游戏作曲的项目。大家知道游戏的BGM一般是循环播放的,因此作曲时也要考虑到这一特性,最后输出的音频素材(wav文件)应该切成两个Part,其中Part-A是一个引子(不进入循环的部分),Part-B是主循环体,A到B、B到B应该都可以无缝衔接,在游戏中播放出来应该是“A-B-B-B-B-...”这样无限循环下去。

为什么要说这个呢?因为除了给游戏输出素材之外,我还需要输出一份原声碟用的音轨,按照游戏原声碟的惯例,一首曲子一般是输出“A-B-B”(即循环两次),最后的部分再做一个淡出(fade out)效果。在有很多首曲子的情况下,一首一首到DAW里面去输出太麻烦了,既然我已经输出好了A、B素材,那么如果我写一个脚本,自动按照“A-B-B-淡出”的形式合并起来不就好了吗?

于是我想到用Ruby来完成这个工作。首先,找一个可以处理wav文件的gem:wav-file;接下来我们来想想如何实现两个操作:连接和淡出。连接很简单,只要将两个wav文件的数据块连起来就可以了;淡出也不难,wav文件中每个采样的值代表该采样的振幅(-32767~32767,以16位采样为例),将每个采样的值按一定比例缩小,最后缩小到0,就实现淡出了。 继续阅读

对Ruby语言创始人松本行弘(Matz)的专访

2012年11月16日,在第4届中国Ruby大会开幕前夕,我很荣幸地对Ruby语言创始人松本行弘(Yukihiro 'Matz' Matsumoto)先生做了一个专访。这篇专访发表于图灵社区,转载请注明来源,原文链接:http://www.ituring.com.cn/Article/17487

笔者:松本先生今年出版了新书《代码的未来》,这本书的中文版正在由我进行翻译,预计明年会在中国出版。您的上一本书《松本行弘的程序世界》在中国受到了读者的好评,这次的新书和前作相比有哪些不同,又有哪些看点呢?

Matz:《松本行弘的程序世界》一共涉及了14个话题,每个话题都是浅尝辄止,内容比较广泛但不是很深入,而这次的新书则是设定了一个大的主题——即对未来即将到来新技术的思考,因此内容比《程序世界》所涉及的范围要窄一些。此外,这本书还在时间尺度上进行了探讨,例如从计算机出现以来,到现在为止经历了怎样的变化,并由此来思考未来可能会发生的变化,也就是对过去和未来两方面都进行了思考。计算机的世界变化非常快,而这本书的目的在于探讨其未来变化的方向。

笔者:说起计算机的发展,您在书中还提到了关于摩尔定律的一些话题呢。

Matz:摩尔定律是描述计算机将如何发生变化的一个定律,书中所探讨的不仅包括计算机本身的变化,还包括计算机为周围的环境所带来的变化。

笔者:关于编程语言进化的方向,保罗·格雷厄姆在一篇名叫“一百年后的编程语言”的文章(参见图灵图书《黑客与画家》P156)中,主张“拥有最简洁最小核心的编程语言”将是未来发展的趋势。对于这一观点,您在书中表示“不同意”,这是为什么呢?您对编程语言发展方向的看法又是怎样的呢?

Matz:保罗是一个很喜欢Lisp的人,而Lisp所具备的特性正好符合他所说的“一百年后的编程语言”的样子,因此保罗认为一百年后的编程语言就应该变成Lisp这个样子。但实际上,Lisp这个语言的历史已经有50多年了,说实话,Lisp现在并没有成为一种有很多人在用的主流语言。我觉得这也许是因为Lisp对于大多数程序员来说不具备那么大的魅力,也就是说,作为一种“拥有最小核心”的语言,或者从某种意义上说是一种很“美丽”的语言,和程序员们所期望的语言之间,存在着一定的差距。如果一两年的时间里,Lisp的魅力没有被大家所接受,那还可以理解,但已经过了50年还没有被广泛接受的话,是不是它在本质上就不太符合大家的期望呢?“对人类来说好用的语言”和“拥有最小核心的语言”之间的这个差距可能是很大的,我觉得可能将来100年也没办法消除。至于未来的编程语言应该是怎样的,我觉得应该是兼具接近Lisp的运行模型,以及人类容易理解的语法这两方面特征,这么一看Ruby是不是更接近这样一种语言呢?

继续阅读