I have pop ups set up to appear at various times of the day. If I am typing, it might create unncessary/wrong inputs for the pop up that appeared unexpectedly.
So, for each pop up I keep a buffer time of 1 second. i first use 'Play sound' KM action which alerts me. Then there is 1 second gap and then the pop up pops up.
So if I put an action that would set system volume to certain level before the KM sound action, it might solve the issue but if I am watching a video or listening to something, it might unnecessarily increase the volume which might startle me due to being too loud.
Any solution? Ideally i would want the submarine sound to be played at specific volume but it should not change the current volume of the video, audio that I am playing in any other app.
@jonathonl's suggestion is very sensible, and probably a better approach than what I am sharing here. But inspired by your request I made the subroutine below, it increases the system volume for the duration of the sound notification – only if theres no audio already outputting – otherwise it just plays the notification sound at current volume.
It's a bit crudely done, and not really what you requested, I know, but it kind of works and will at the very least spare you from those startles.
These days, FWIW, rather than running the JS in a shell script action, I might
EITHER execute an XML version of the Keyboard Maestro action, customised at run-time:
OR use the Standard Additions method directly in an Execute JavaScript for Automation action. (Access to KM variable values has become much more direct and effortless in Keyboard Maestro 11)
The problem is that application volumes aren't usually absolute -- they're relative to System volume. So to do what you want you'd have to reduce the app volume while increasing System volume, play your sound, then increase app volume while reducing System. That's a lot of work!
Better, if you can, to set the System volume to the level you want to hear alerts at and then set your app volumes to a lower level -- that way the alert will break through without your app volumes being changed. You can then vary the apps (like when there's a quiet video) individually or manage the whole lot (when everyone else is asleep) with System volume.
Thanks for sharing these updated approaches to your script, and also for making me realise that I've been wrong in assuming that local variables cannot be accessed by a script!
But testing the different approaches here on my system your old approach is actually the fastest, on average about 0.1s faster than the XML version, and about 0.4s faster than the Standard Additions version. Why might this be?
Nige has pointed to something substantial in his post.
Application Sounds as well as System Sounds have a relative volume level.
If you’d really want to have success increasing Sounds for Keyboard Maestro‘s Notifications without changing any other volume level setting and using a Mac with Monterey or higher I suggest you to look for SoundSource by Rogue Amoeba. Thanks to its Shortcuts Support you’ll be able to accomplish this task of temporarily increasing or decreasing the volume Level of each Application to your liking and have always other settings based on your workflow.
I know that this Application is not cheap… but it’s worth doing the investment.
Most (maybe all?) app volumes are relative to they System volume. If YouTube is playing at 50% and your System volume is set to 50%, what you hear from YouTube is at 25% of maximum possible volume.
Set your System volume to a comfortable level for alerts, notifications, etc. Then set your app volume so that when the app is playing "normally" you can still hear alerts over the top of it. Since app sound levels can change -- a YouTube video may be quieter than "normal" -- have macros that allow you to raise or lower the app volume as required, without changing the System volume.
Use System volume changes when you want overall volume changes -- I'll increase mine when everyone's out, decrease when they're all in bed -- and that'll change both your alert and app volumes for you.
Simple example -- my current System volume is at 75% (on my own today), Music is at 50%. I'm rocking out to Panama, but can still hear notifications over the top. If a quieter track comes up then
(No triggers because they're called directly from Stream Deck buttons.)
And when my better half comes home couple of presses of the keyboard volume buttons will take things down to a level that won't disturb her, while maintaining the difference between Music and alerts.
We use lot many apps. how do we do this for each app than outputs audio?
Would one set of action work for each app or we'll have to do make new macro for each app?
You don't have to do it for any apps -- you can use their GUI volume controls. I've done it for Music because that's usually buried under a bunch of other app windows and it's quicker and easier to punch the Stream Deck button than to go searching -- I haven't done it for YouTube (yet) because if I'm watching a video it'll be frontmost and easy to adjust with the player's volume control.
If I did want to use a macro for YouTube it would be via the "Execute JavaScript in Browser" action, using something like
var vid = document.querySelector('.video-stream');
vid.volume = vid.volume - 0.1;
...but I'll defer to the Forum's JavaScripters on that one!
If you are constantly fiddling with app volumes anyway, you've probably already got macros to do that -- just use those.
And if you really want to go crazy with individual app volume control, look at @johns's suggestion of SoundSource over in this thread.
I hear more volume on the right side. Until I get a chance to get them replaced, I had balanced the mac output in such a way that it would balance the volume in both ears.
so I had shifted the pointer a little towards left.
Your earphones situation definitely makes things a little more complicated. I am absolutely sure it must be possible to solve, somehow, but I am not sure exactly how. And as I believe the solution would rely on more scripting I sadly do not think I can be of much assistance.
But the way I see it the solution could either be a version of @ComplexPoint’s JXA-script that if possible changes volume without resetting balance. Or the more bodgy fix would be to store the audio balance setting at the beginning of the macro (probably relying on a scripted poll alongside, or replacing, the SYSTEMVOLUME() action), and then reinstate this balance setting again at the end of the macro (again probably relying on a scripted solution) — But this is quickly starting to get quite bulky, so hopefully someone will be able to help you towards a more elegant solution than this.
On my Sonoma system, at least, you can't set the balance with AppleScript UI scripting. But you can get the position of the slider bar UI element, you can get the length, and you can work out from those where to get KM to click on the screen to set the balance to your desired level.
Set your required balance in the first "Set..." action, and add a "Quit System Settings" at the end of the macro once you're happy with it.
When it comes to resetting the balance to the mid-point you could make another macro based on this, you could have two triggers on this one and an "If Then Else" based on %TriggerValue%, you could start the macro with another AppleScript to get the current value and toggle the new one accordingly. Lots of options, easy to implement with what you already know.
damn this is some high level stuff for me. I wouldn't be able to create such a macro. I gotta learn this from you someday. May be i'll tag this post of your again to ask specific questions about the steps.