我正在迅速创建一个简单的音频播放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变量在网格线绘制循环期间导致了这种情况吗?