# music-field
---
## 问题与背景
对于一些人来说，对于颜色的敏感程度远大于声音。并且，在欣赏音乐的过程中，如果我们能够将声音与颜色建立关联，势必将提升音乐欣赏的品质，揭示声音的在更多维度上的细节。这就需要这样一个工具，可以将音频文件中的响度波形经过特定的算法转换成颜色信息，原始颜色信息经过处理后在显示器上输出。我的团队就基于C++开发了这样的工具，几乎所有部分都为手动编码，除库引用外，其他方法类均为小组成员独立开发。

## 开发工具
- Xcode
- Microsoft Visual Studio
- GLUT
- OpenGL
- Git
- Windows函数库相关函数
- IEEE POSIX标准下的相关函数
- FFTW 使用快速傅里叶变换分析音频文件

## 主要功能
### 按照WAV格式标准读取WAV格式文件
按照WAV的格式标准，以二进制的方式读取目标文件，并能够自动识别是否为WAV格式的文件，不依赖文件名。支持非压缩，PCM格式的数据。在读取一个WAV文件，会将该文件抽象成一个WAV对象，内部包含有该文件的相关信息如文件大小，是否为PCM数据，声道，比特率，每次采样信息的大小等等，并自动计算出音乐持续时间。该类能够根据声道信息与bit大小自动调整数据的储存方式，以供用户使用。该类以一次性读入，然后用数据包分块取用的方式取用数据。并且，用户能够通过每个数据包中数据持续的时间，来调整每次取出的数据包的大小。极大地方便了后续的开发操作，让程序的可扩展性大大增强。
### 将声音的响度数字信号计算转化为颜色信号

### 将GLUT相关函数再次封装成类进行便捷整体绘图操作
GLUT的操作函数很方便，但是其框架设计上不太符合面向对象的程序设计方式。所以，该程序对于GLUT函数库的相关窗体创建与绘图的常用函数构建了专门的类。通过将窗体抽象成Window类，图形抽象成Shape类，控件抽象成Menu类，并通过类中封装的相关数据方法来对图形界面进行管理。而该工具的像素块就是继承Shape类所构建的独立的Field类。这样的抽象继承结构，对于以后的界面拓展丰富后的管理工作有极大的效率提高作用。并且可以很方便将现有开发后的控件的移植到其他工具中使用。
### 进过相关优化较为精确的控制声画延迟问题
该工具默认每隔20ms在屏幕上绘制出这20ms内声音数据所对应的图像信息。所以该工具的计算与绘图操作需要精确控制时间来达到画面播放与正常声音播放的时间大体同步。除了采用一次性读取操作来防止在非缓冲系统中的频繁I/O操作的拖慢该工具的执行进程，该工具采用定时器设置的方式将计算与绘图操作拆分成两个线程，每次将提前进行计算操作，绘图线程将在固定的时间将计算结果绘制到屏幕上。还有，绘图线程将记录每次绘图操作占用的的时间，不断地调整下次绘图的时间，尽量修正声画之间的时间误差。
