music-field/README.md
Vindicator645 6e23bb2270 Added
2018-12-29 18:10:14 +08:00

28 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# music-field
---
## 问题与背景
对于一些人来说对于颜色的敏感程度远大于声音。并且在欣赏音乐的过程中如果我们能够将声音与颜色建立关联势必将提升音乐欣赏的品质揭示声音的在更多维度上的细节。这就需要这样一个工具可以将音频文件中的响度波形经过特定的算法转换成颜色信息原始颜色信息经过处理后在显示器上输出。我的团队就基于C++开发了这样的工具,几乎所有部分都为手动编码,除库引用外,其他方法类均为小组成员独立开发。
## 开发工具
- Xcode
- Microsoft Visual Studio
- GLUT
- OpenGL
- Git
- Windows函数库相关函数
- IEEE POSIX标准下的相关函数
- FFTW 使用快速傅里叶变换分析音频文件
## 主要功能
### 按照WAV格式标准读取WAV格式文件
按照WAV的格式标准以二进制的方式读取目标文件并能够自动识别是否为WAV格式的文件不依赖文件名。支持非压缩PCM格式的数据。在读取一个WAV文件会将该文件抽象成一个WAV对象内部包含有该文件的相关信息如文件大小是否为PCM数据声道比特率每次采样信息的大小等等并自动计算出音乐持续时间。该类能够根据声道信息与bit大小自动调整数据的储存方式以供用户使用。该类以一次性读入然后用数据包分块取用的方式取用数据。并且用户能够通过每个数据包中数据持续的时间来调整每次取出的数据包的大小。极大地方便了后续的开发操作让程序的可扩展性大大增强。
### 将声音的响度数字信号计算转化为颜色信号
1.当前按照左声道的音量变化率越高,则红色值越高,当右声道的音量变化率越高,输出的蓝色值越高,;音量的响度越大,绿色越高。
2.另外一个方案是用傅里叶变换分解声音频谱将每一种频率的声音按照频率对应到光谱上最后将所有谱线合成成RGB颜色。这个方案在unused文件夹里尚未启用。
### 将GLUT相关函数再次封装成类进行便捷整体绘图操作
GLUT的操作函数很方便但是其框架设计上不太符合面向对象的程序设计方式。所以该程序对于GLUT函数库的相关窗体创建与绘图的常用函数构建了专门的类。通过将窗体抽象成Window类图形抽象成Shape类控件抽象成Menu类并通过类中封装的相关数据方法来对图形界面进行管理。而该工具的像素块就是继承Shape类所构建的独立的Field类。这样的抽象继承结构对于以后的界面拓展丰富后的管理工作有极大的效率提高作用。并且可以很方便将现有开发后的控件的移植到其他工具中使用。
### 进过相关优化较为精确的控制声画延迟问题
该工具默认每隔20ms在屏幕上绘制出这20ms内声音数据所对应的图像信息。所以该工具的计算与绘图操作需要精确控制时间来达到画面播放与正常声音播放的时间大体同步。除了采用一次性读取操作来防止在非缓冲系统中的频繁I/O操作的拖慢该工具的执行进程该工具采用定时器设置的方式将计算与绘图操作拆分成两个线程每次将提前进行计算操作绘图线程将在固定的时间将计算结果绘制到屏幕上。还有绘图线程将记录每次绘图操作占用的的时间不断地调整下次绘图的时间尽量修正声画之间的时间误差。