55 lines
1.6 KiB
Julia
55 lines
1.6 KiB
Julia
using PortAudio
|
|
|
|
"""
|
|
Continuously read from the default audio input and plot an
|
|
ASCII level/peak meter
|
|
"""
|
|
function micmeter(metersize)
|
|
mic = PortAudioStream(1, 0; latency = 0.1)
|
|
|
|
signalmax = zero(eltype(mic))
|
|
println("Press Ctrl-C to quit")
|
|
while true
|
|
block = read(mic, 512)
|
|
blockmax = maximum(abs.(block)) # find the maximum value in the block
|
|
signalmax = max(signalmax, blockmax) # keep the maximum value ever
|
|
print("\r") # reset the cursor to the beginning of the line
|
|
printmeter(metersize, blockmax, signalmax)
|
|
end
|
|
end
|
|
|
|
"""
|
|
Print an ASCII level meter of the given size. Signal and peak
|
|
levels are assumed to be scaled from 0.0-1.0, with peak >= signal
|
|
"""
|
|
function printmeter(metersize, signal, peak)
|
|
# calculate the positions in terms of characters
|
|
peakpos = clamp(round(Int, peak * metersize), 0, metersize)
|
|
meterchars = clamp(round(Int, signal * metersize), 0, peakpos - 1)
|
|
blankchars = max(0, peakpos - meterchars - 1)
|
|
|
|
for position in 1:meterchars
|
|
printstyled(">", color = barcolor(metersize, position))
|
|
end
|
|
|
|
print(" "^blankchars)
|
|
printstyled("|", color = barcolor(metersize, peakpos))
|
|
print(" "^(metersize - peakpos))
|
|
end
|
|
|
|
"""
|
|
Compute the proper color for a given position in the bar graph. The first
|
|
half of the bar should be green, then the remainder is yellow except the final
|
|
character, which is red.
|
|
"""
|
|
function barcolor(metersize, position)
|
|
if position / metersize <= 0.5
|
|
:green
|
|
elseif position == metersize
|
|
:red
|
|
else
|
|
:yellow
|
|
end
|
|
end
|
|
|
|
micmeter(80)
|