Advertisement

Mac Swift - ltsMusicPlayer NSSlider for Visualization

Mac Swift - ltsMusicPlayer NSSlider for Visualization Audio Removed for "LOL" reason

- Less Imagination Required
- added 40 more CC0 images
Mostly from Pixabay,
Some from Pexels

=====================================
As a lazy coder,
My preferred method: (Apple NSSlider)
No code, just value scaling.
(Besides, the ping pong ball
Reminded me of the old Pong-Game)


// Metering, modified
//
// need Accelerate Import

private func audioMetering(buffer:AVAudioPCMBuffer)
{

buffer.frameLength = 1024
let inNumberFrames:UInt = UInt(buffer.frameLength)

if buffer.format.channelCount GT 1
{
let samples = buffer.floatChannelData![1]
var avgValue : Float32 = 0
vDSP_meamgv(samples, 1, &avgValue, inNumberFrames)

var avg : Float32 = -100

if avgValue != 0 {
avg = 20.0 * log10f(avgValue)
}


if avg.isFinite
{
if abs(avg) LT 100
{
let percentOver50 = 100.0 * ( 50 + avg ) / 50
convertPowerToSliderValue(power: percentOver50)
}
}
else { convertPowerToSliderValue(power: 0) }



} // end 2 ch

} // audioMetering


func convertPowerToSliderValue(power: Float)
{
var fValue = power
if fValue LT 0 { fValue = 0}
if fValue GT 99 { fValue = 99 }

DispatchQueue.main.async { [weak self] in
self?.slrPwrVisual.floatValue = fValue
}
} // convertPowerToSliderValue






===========================
A step better?, May be?

For this test.
I ported my ltsMiniAudio to
ltsImageViewer,
Which I separated it from
PanoCropViewer.

==========================


class PowerVisualiseCell: NSSliderCell
{
let knobImage : NSImage! = NSImage.init(named: "PowerV.png")

// B a r s

var rhsColor: NSGradient =
{
// darker away from knob, brighter near knob
let darkBlue = NSColor.init(red: 0.01, green: 0.01, blue: 0.02, alpha: 1.0)
let brighterBlue = NSColor.init(red: 0.01, green: 0.01, blue: 0.66, alpha: 1.0)
let barBackgroundGradient = NSGradient(starting: brighterBlue, ending: darkBlue)

return barBackgroundGradient!
}()

var lhsColor: NSGradient =
{
// green away from knob, red near knob
let brighterGreen = NSColor.init(red: 0.01, green: 0.77, blue: 0.01, alpha: 1.0)
let darkerRed = NSColor.init(red: 0.33, green: 0.02, blue: 0.01, alpha: 1.0)
let barBackgroundGradient = NSGradient(starting: brighterGreen, ending: darkerRed)

return barBackgroundGradient!
}()



// D R A W

override internal func drawBar(inside rect: NSRect, flipped: Bool)
{

let knobFrame = self.knobRect(flipped: false)
let halfW = knobFrame.width / 2.0
let leftRect = NSRect(x: rect.minX, y: rect.minY, width: max(halfW, knobFrame.minX + halfW), height: rect.height)

var bzPath = NSBezierPath.init(roundedRect: leftRect, xRadius: 3.0, yRadius: 3.0)
lhsColor.draw(in: bzPath, angle: 0.0)

let rightRect = NSRect(x: knobFrame.maxX - halfW, y: rect.minY, width: rect.width - (knobFrame.maxX - halfW), height: rect.height)

bzPath = NSBezierPath.init(roundedRect: rightRect, xRadius: 3, yRadius: 3)
rhsColor.draw(in: bzPath, angle: 0.0)
} // end Draw



override func drawKnob(_ knobRect: NSRect)
{
if (knobImage == nil)
{
super.drawKnob(knobRect)
return;
}

knobImage.draw(in: knobRect)
} // end Knob

} // end Slider Class


Notice, I used a very small knob Image "PowerV.png"
=================================================


Another simpler way?
(I did not actually try this)
I hate the "Auto Constraint" things,
I would not have, think about it.

This link, "Lets Build that App",
gave me the idea.

===================================================
- Add custom view, add a subView to it
Fill the subView with color gradient
Use HEIGHT constraint to draw the bar.
(This case, use the WIDTH)

color gradient,nssliderCell,uv meter,

Post a Comment

0 Comments