- 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)
0 Comments