Applescript: play two sounds simultaneously - audio

I am using Applescript to test melodies for carillon with the real sounds of bells.
Now, I wish I could play a chord of 2 or 3 notes simultaneously.
So far, this is my best:
do shell script "afplay -t 0.000001 " & (quoted form of (bell1.mp3))
do shell script "afplay -t 0.2 " & (quoted form of (bell2.mp3))
Any idea?
Thank you in advance.

do shell script work synchronously. You need to tell the first call not to wait:
do shell script "afplay " & (quoted form of bell1.mp3) & "> /dev/null 2>&1 &"
do shell script "afplay " & (quoted form of bell2.mp3)

Related

Change desktop app icons on mac, programatically. 2019

Is there a way to change icons on desktop apps for macbooks, that replicates the same action that happens when you copy / paste icons in the finder window? Either through the terminal, node.js or anything ? I have so far tried:
1) Through the terminal, deleting and replacing the icons themselves, I don't like this because it removes the original icon completely and does not work on every app.
2) Through node.js and terminal, creating an icon? file, however this did not work on every program either, and I had trouble with permission access. If anyone have a solution for this I'd like to hear it.
3) With applescript, this worked but looping through multiple icons at once was too much for it.
I've been searching about this for days, but the information is either very limited or outdated. I would appreciate any help!
To change the icon of an application, I use shell script with applescript.
The goal is to change "Icon file" in the application info.plist and copy the icon (file) in the resources of the application. "application".app/Contents/Resources/ " .
All done in a droplet, on which I drag the desired icon, after opens a window to choose the application whose icon must be changed.
With plutil I convert the file info.plist to xml1 (which I save under ".app/ Contents/infoo.plist" to avoid any problem and find the original). To change the value "Icon file", I use "/usr/libexec/PlistBuddy " with " -c Set: "
to see the change, you have to launch the application (whose icon has been changed), in the dock you have to see the new icon (if the dock option is active)
Below the droplet script
global testdir
on open draggedItems
repeat with currentItem in draggedItems
set icon_image_file_string to POSIX path of (draggedItems)
set {name:Nm, name extension:Ex} to info for POSIX file icon_image_file_string
set Nm to do shell script "echo " & Nm & " | sed 's#." & Ex & "##'"
set testdir to POSIX path of (choose file of type {"APPL"} with prompt "Choisissez l'Application pour changer son icone :")
set {name:Nmm, name extension:Ex} to info for POSIX file testdir
do shell script "plutil -convert xml1 " & quoted form of (testdir & "Contents/Info.plist ") & " | cat " & quoted form of (testdir & "Contents/Info.plist") & " >" & quoted form of (testdir & "Contents/Infoo.plist")
try
do shell script "cp -f " & quoted form of icon_image_file_string & " " & quoted form of (testdir & "Contents/Resources/")
end try
try
set icon_image_file to do shell script "/usr/libexec/PlistBuddy " & quoted form of (testdir & "Contents/Info.plist") & " -c \"Set:CFBundleIconFile " & Nm & "\""
end try
end repeat
end open

Using VBA to run WinSCP script

I am able to download files from SFTP in CMD window, by using following code:
WinSCP.com
# Connect to the host and login using password
open user:pw#address
# get all the files in the remote directory and download them to a specific local directory
lcd C:\Users\xx\Desktop
get *.xlsx
# Close and terminate the session
exit
I searched online and found out that I can put these codes in a bat file and use
Call Shell("cmd.exe /c C:\Users\xx\Desktop\WinSCPGet.bat", 1)
However, only the first line of the bat file WinSCP.com is being executed. It will pop up the cmd window, showing this, without doing anything else.
How to execute all the lines at one time?
Thanks
The code you have is not a Windows batch file. It's one Windows command followed by WinSCP commands. The first command runs winscp.com application, which then sits and waits for input. If you eventually close it, Windows command interpreter (cmd.exe) will carry on executing the remaining commands, failing most, as they are not Windows commands. See also WinSCP script not executing in batch file and WinSCP FAQ Why are some WinSCP scripting commands specified in a batch file not executed/failing?
So you either have to save the commands (open to exit) to a WinSCP script file (say script.txt) and execute the script using the /script switch:
Call Shell("C:\path\winscp.com /ini=nul /script=c:\path\script.txt")
Alternatively, specify all commands on WinSCP command line, using the /command switch:
Call Shell("C:\path\winscp.com /ini=nul /command ""open user:pw#address"" ""lcd C:\Users\xx\Desktop"" ""get *.xlsx"" ""exit""")
Regarding the quotes: With the /command switch, you have to enclose each command to double-quotes. In VBA string, to use a double-quote, you have to escape it by doubling it.
Also note that you generally should use the /ini=nul switch to isolate the WinSCP script run from your WinSCP configuration. This way you can also make sure that the script will run on other machines. Your script won't, as it lacks the -hostkey switch to verify the SSH host key fingerprint. Using the /ini=nul will help you realize that.
You can have WinSCP GUI generate complete command-line (including the -hostkey) for you.
See also Automating file transfers to SFTP server with WinSCP.
I like this small and compact procedure, and use it in my own projects. No temp-files required. Fast and reliable.
Parse a string src (an absolute filepath) to uploadImageByFTP. Etc. C:\Users\user\Desktop\image.jpg, and the file will be uploaded.
Replace:
<username> with FTP-User
<password> with FTP-Password
<hostname> with FTP-hostname (etc. example.com)
<WinSCP.com path> with path on your WinSCP-client (etc. C:\Program Files (x86)\WinSCP\WinSCP.com. Caution: WinSCP.com and not WinSCP.exe)
<FTP-path> with path on your FTP-client (etc. /httpdocs/wp-content/uploads)
Sub uploadImageByFTP(src As String)
Dim script As Object: Set script = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
'Not empty
If (src <> vbNullString) Then
'Execute script
script.Run _
"""<WinSCP.com path>"" " + _
"/ini=nul " + _
"/command " + _
"""open ftp://<username>:<password>#<hostname>/"" " + _
"""cd <FTP-path>"" " + _
"""put " & """""" & src & """""" & """ " + _
"""close"" " + _
"""exit""", windowStyle, waitOnReturn
End If
End Sub
WScript.Shell is more powerful than the default Shell(), as you can append a waitOnReturn-command; this tells VBA, that further execution isn't allowed before the file(s) have been uploaded to the FTP-server.
Change windowStyle to 0, if you don't like the command prompt to open on each execution.

Query Parameters in Express being extracted?

I'm writing an API in Node.JS for an AppleScript application. The AppleScript application runs curl in a shell script in this form:
do shell script ("cd " & quoted form of myDir & "
curl http://localhost:5000/server.properties?some-value=true&next-value=something%20else&[...] -O")
It's intended to download a file called server.properties into the directory myDir with content based on the specified parameters, but for some reason when Express receives the request, it displays only this when I run console.log(res.originalUrl):
/server.properties?some-value=true
And it treats the request as if none of the other parameters are specified. Can anyone tell me what I'm doing wrong, or how to figure out where it's going wrong?
EDIT It turns out to be the way I ran the shell script. The URL needs to be quoted so that the & doesn't act as an operator in the shell script.
My solution was the following:
do shell script ("cd " & quoted form of myDir & "
curl " & quoted form of (myUrl & myQuery) & " -O")
Where myUrl is set to "http://localhost:5000/server.properties" and myQuery is set to "?some-value=true&next-value=something%20else&[...]".

What is the name of the CLI Vim process as seen by Mac OS X?

I'm trying to get this script to run, from the Skim wiki
#!/bin/bash
file="$1"
line="$2"
[ "${file:0:1}" == "/" ] || file="${PWD}/$file"
exec osascript \
-e "set ESC to ASCII character 27" \
-e "tell application \"Vim\" to activate" \
-e "tell application \"System Events\"" \
-e " tell process \"Vim\"" \
-e " keystroke ESC & \":set hidden\" & return " \
-e " keystroke \":if bufexists('$file')\" & return " \
-e " keystroke \":exe \\\":buffer \\\" . bufnr('$file')\" & return " \
-e " keystroke \":else \" & return " \
-e " keystroke \": edit ${file// /\\\\ }\" & return " \
-e " keystroke \":endif\" & return " \
-e " keystroke \":$line\" & return " \
-e " keystroke \"zO\" " \
-e " end tell" \
-e "end tell"
If I try to run it from the command line:
# Go to line 20 of some_file
$ ./that_script "some_file" 20
I get the following error:
56:64: execution error: File Vim wasn’t found. (-43)
Attempts
I've tried all sorts:
tell application \"vim\" to activate <-- File vim wasn't found
tell application \"/usr/bin/vim\" to activate <-- this raises a 10810 error
tell application \"/path/to/my/own/compiled/vim\" <-- this raises a 10810 error
Objective
I'm trying to "talk" to a Vim instance running from a Terminal, not a GUI.
Now that you have +clientserver (from your other question) working, I assume you don't need an answer here anymore but here it is anyway:
AppleScript generally doesn't deal with command line programs.
You can use AppleScript to talk to MacVim (tell application "MacVim" to activate) but you can't reach CLI Vim at all. AppleScript is for GUI apps only.
Now, most (I hesitate to write "all") Mac OS X GUI applications expose at least a minimal interface for AppleScript called "dictionnary": you can activate the app, get the number of windows, print the active document, open a file… and simulate keystrokes.
The script in your example works — more or less — but only with a GUI Vim. There is a small number of such apps for Mac OS X and this script is designed to work with one called Vim.app. You can change Vim to MacVim if you want but you won't be able to make it work with CLI Vim.

How do I write to a text file using AppleScript?

So, that's it. How can I write to a text file using AppleScript?
I've tried googling around, but answers seem to be years old and I'm not really sure what should be the preferred idiom this days.
on write_to_file(this_data, target_file, append_data) -- (string, file path as string, boolean)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof
close access the open_target_file
return true
on error
try
close access file target_file
end try
return false
end try
end write_to_file
Interfacing with it can be cleaned up with the following...
my WriteLog("Once upon a time in Silicon Valley...")
on WriteLog(the_text)
set this_story to the_text
set this_file to (((path to desktop folder) as text) & "MY STORY")
my write_to_file(this_story, this_file, true)
end WriteLog
A short version in pure AppleScript:
set myFile to open for access (choose file name) with write permission
write "hello world" to myFile
close access myFile
It seems there is no native one command solution. Instead you have to open and later close the file.
#JuanANavarro.
When using the shell you should use quoted form of for the TEXT and the file path.
This will help stop errors with spaces in file names and characters like apostrophes in the text for example.
set someText to "I've also learned that a quick hack, if one only wants to spit a bit of text to a file, is to use the shell."
set textFile to "/Users/USERNAME/Desktop/foo.txt"
do shell script "echo " & quoted form of someText & " > " & quoted form of textFile
The above script works fine.
If I did not have & quoted form of someText
but instead I had & someText I would get the following error.
error "sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file" number 2
The apostrophes in "I've" is seen as part of the command.
If I had
set textFile to "/Users/USERNAME/Desktop/some foo.txt" as my file path ( note the space.) And did not have & quoted form of textFile but instead I had & textFile
Then when the file was written out it would write to a file named "some" and not "some foo.txt"
I've also learned that a quick hack, if one only wants to spit a bit of text to a file, is to use the shell.
do shell script "echo TEXT > some_file.txt"
For me running do shell script was too slow on a PowerBook G4 when executed in a loop 300000 times ;), but of course that's quicker to write which sometimes makes sense. You would also want to escape shell characters like this:
do shell script "echo " & quoted form of foobar & " >> some_file.txt"
and for aesthetic reasons I would use
tell me to do shell script "#..."
but I haven't verified yet (what I believe) that if "do shell script" is in a block of "tell Finder" for example it is Finder process that creates a subshell. With "tell me to do shell script" at least Script Editor log looks better for me. ;)

Resources