音频波形和绘制网格线-随时间漂移的线

时间:2019-02-14 23:45:49

标签: swift audio grid bpm waveform

我正在迅速创建一个简单的音频播放MacOS应用程序。我在屏幕上绘制了一个波形(使用https://github.com/benoit-pereira-da-silva/SoundWaveForm,每个小节/小节的网格线(灰色线),每个四分音符的网格线(红色线)都绘制了。看到帖子末尾的图片。

音频文件中1小节的持续时间和小节总数的计算方法如下:

let quantify1Bar = (60000 / BPM) * 4 // Milliseconds per bar
let totalBars    = totalAudioDuration * 1000 / quantify1Bar

然后我正在计算网格线之间的像素距离:

let pxSpacing1Bar    = (pxTimelineWidth / totalBars) * zoomLevel
let pxSpacingQuarter = (pxTimelineWidth / totalBars) * zoomLevel

pxTimelineWidth为1560像素

当单击“-”和“ +”按钮时,我的zoomLevel变量本身会自行除法或相乘(即,如果zoomLevel为1,则可以看到音频波形的整个持续时间...如果zoomLevel为2,则可以看到一半音频长度... 4 =四分之一长度,等等:

zoomLevel = zoomLevel / 2 (zoom out)
zoomLevel = zoomLevel * 2 (zoom in)

我正在这样绘制网格线:

let pathBar       = NSBezierPath()
let pathQuarter   = NSBezierPath()

// Draw lines for every bar
        for i in 0...totalBarLines {
            pathBar.move(to: NSPoint(x: i * pxSpacing1Bar, y: 0))
            pathBar.line(to: NSPoint(x: i * pxSpacing1Bar, y: 100))
            pathBar.lineWidth = 1
            NSColor.darkGray.setFill()
            NSColor.darkGray.setStroke()
            pathBar.stroke()
        }

    // Draw 1/4 note lines
        for i in 0...totalQuarterLines {
            if i == 0 {
                // Do nothing - skip the first line of every bar
            } else if i % 4 != 0 {
                pathQuarter.move(to: NSPoint(x: i * pxSpacingQuarter, y: 10))
                pathQuarter.line(to: NSPoint(x: i * pxSpacingQuarter, y: 90))
                pathQuarter.lineWidth = 1
                NSColor.red.setFill()
                NSColor.red.setStroke()
                pathQuarter.stroke()
            }
        }

我的问题是,在较高的缩放级别上,即使在很短的时间内,网格线也会出现明显的漂移,并且每个漂移都大于先前的漂移(参见图片)。这似乎很简单,难道是我的zoomLevel变量在网格线绘制循环期间导致了这种情况吗?

AudioGridLines

0 个答案:

没有答案