绘制声波可以放大/缩小

Dr.*_*tix 1 c++ audio waveform bass

我正在为毕业写一个合理的编辑器.我正在使用BASS从MP3,WAV,OGG等文件中提取样本,并添加回声,镶边等DSP效果.简单地说,我制作了我的框架,应用了从position1到position2,剪切/粘贴管理的效果.

现在我的问题是我想创建一个类似于Cool Edit Pro的控件,它可以绘制一个波形表示的歌曲,并能够放大/缩小波形的选择部分等.选择后我可以做类似的事情:

TInterval EditZone = WaveForm->GetSelection();
Run Code Online (Sandbox Code Playgroud)

TInterval有这种形式:

struct TInterval
{
    long Start;
    long End;
}
Run Code Online (Sandbox Code Playgroud)

我是初学者,当涉及到复杂的绘图时,任何关于如何使用BASS返回的样本数据来创建歌曲的波形表示的提示,具有放大/缩小的能力将是值得赞赏的.

我正在用C++编写我的项目,但我可以理解C#,Delphi代码,所以如果你想要你可以发布最后两种语言的片段:)

Thanx DrOptix

Joh*_*ler 5

通过Zoom,我认为你的意思是水平缩放而不是垂直.音频编辑器这样做的方法是扫描波形,将其分解为时间窗口,其中X中的每个像素代表一定数量的样本.它可以是一个小数,但你可以通过dis-allow分数缩放比例而不会过多地扰乱用户.缩小一点后,最大值始终为正整数,最小值始终为负整数.

对于屏幕上的每个像素,您需要知道该像素的最小样本值和最大样本值.因此,您需要一个以块的形式扫描波形数据的功能,并跟踪该块的累积最大值和最小值.

这是一个缓慢的过程,因此专业音频编辑器会以某个固定的缩放比率保留预先计算的最小值和最大值表.它可能是512/1或1024/1.当您使用> 1024个样本/像素的缩放比例进行绘制时,则使用预先计算的表格.如果您低于该比率,则直接从文件中获取数据.如果你不这样做,你会发现缩小时绘图代码会变得太慢.

编写执行此扫描时一次性处理文件所有通道的代码是值得的,这里的缓慢会使整个程序感觉迟钝,这是重要的磁盘IO,CPU可以顺利保持,所以简单的C++代码适用于构建最小/最大表,但您不希望多次浏览该文件,并且您希望按顺序执行该操作.

一旦你有了最小/最大表,就把它们放在一边.您希望尽可能少地返回磁盘,并且想要重新绘制窗口的许多原因不需要您重新扫描最小/最大表.与首先构建它们的磁盘成本相比,保持它们的内存成本并不高.

然后通过在该像素所代表的时间内在最大值和最小值之间绘制一系列1像素宽的垂直线来绘制波形.如果您从预先构建的最小/最大表中绘制,这应该非常快.