本文属spanzhang原创,其blog地址为:http://blog.csdn.net/spanzhang。引用或转贴请注明出处,谢谢!!
Pedal Point是基于DirectDraw用VC6开发的一款源码开放软件。下面将对其主要流程加以解释。
一、系统总体流程
在系统初始化阶段主要包含如下几个步骤:
1、初始化随机数发生器;
2、初始化DirectDraw;
3、生成图源对象;
4、初始化所有扩散算法;
5、初始化用于同步的mutex;
6、初始化录音对象并开始录音。
在正常的初始化工作完成后,程序进入主循环:
1、等待mutex;
2、处理用户输入;
3、模糊画面,扩散,更新图源,画出图源;
4、更新调色板;
5、效果渐变;
6、渲染屏幕;
7、打印必要的文字说明;
8、释放mutex。
当用户要求退出程序的时候,程序从主循环跳出,并销毁所有已经分配的对象空间。
二、相关概念
系统里面存在的主要对象包括:
1、一个pedalPoint对象,相当于应用程序对象,不过它不负责程序的总体流程。
2、一个录音对象,它是类waveRecorder的实例。
3、一个directDraw对象实例。
4、一个调色板对象,负责生成需要的柔和色彩。
5、许多的图源对象,它们负责根据当时录音产生的平滑后的信号画出白色的线条。
6、许多的扩散对象,它们负责将图源产生的线条扩散出去,产生动感。不过,这中间少不了一次模糊(blur)。
图源对象的唯一作用就是根据录音信号画白色线条,之所以叫图源是因为他们是所有画面的根源。由这些白色线条经过模糊再扩散出去,就是我们所看到的效果了。扩散对象的作用就是将画面上的点做运动,值得注意的是这种运动不是将原像素点move到一个目标像素点而原像素点就没有了,而是将原像素点copy到目标像素点。这样的模糊和扩散都是在两个缓冲里进行的,分别是前缓冲和后备缓冲。
三、技术问题
开发过程中遇到的一些主要的技术问题包括:
1、色彩渐变
Pedal Point所使用的是256色的调色板,我将这个256色的调色板用多个色彩分成了很多段,并且最后一个颜色始终是黑色。比如用三个颜色的情况:
每次更新调色板的时候对所有颜色节点做一次微小的调整,这样的画面就会显得比较柔和,不会有很刺眼的颜色出现。由于最后一个节点(黑色节点)的调整步长为0,所以它始终是黑色的。
2、声音的平滑
声音信号经过采样进来后,需要做低通滤波。而这个滤波操作将对图源的平滑产生决定性的影响。这里,我这里在滤波的时候先得到了一个平均值然后低通滤波出来的数据都减去这样一个均值。这样以来,出来的数据很平滑,并且最重要的是它的两端都在0电平上。
3、画图源
由于图源是画在前缓冲上的,windows提供的一切函数都没用了。只好写了一些画点、画线的函数,以及根据波形画曲线的函数。这里到没什么技术问题,就是累一点点。
至此,Pedal Point的原理和结构基本介绍完毕。由于本人表达能力有限,希望不至于让大家看得云里雾里。接下来的几节将发布所有源代码。