Sonner l’heure système (et les quarts d’heure)

© Christian PAULUS. Document créé le 8 août 2010 , mis à jour le 11 août 2011.

Un seul arbre qui tombe fait plus de bruit qu'une forêt qui pousse. Proverbe africain

Accueil du site > Astuces > MacOSX > Sonner l’heure système (et les quarts d’heure)

Applescript, afplay / MacOsX 10.6 (Snow Leopard)

Exemple AppleScript : sonner l’heure et les quarts d’heure de l’heure système.

Horloge.app illustre :

  • L’ajout et l’utilisation de ressources ajoutées dans le dossier de l’application, tels que sons, scripts.
  • L’utilisation de scripts joints et leur appel via load script
  • L’utilisation de la commande Unix kill pour quitter l’application
  • L’utilisation de la commande Unix logger pour suivre (et débuguer ?) Horloge.app
  • La construction d’une icône pour une applet

Le source applescript compagnon

L’applet Horloge.app est composée d’un script compagnon calculer.scpt qui doit être recopié dans le répertoire Scripts d’ Horloge.app enregistrée sous forme d’application.

Pour ouvrir le répertoire de Horloge.app, cliquer droit sur son icône et choisir Afficher le contenu du paquet.

Le code AppleScript de calculer.scpt, largement commenté :

(*
        au_quart()
        Calcul du quart-d'heure suivant         le temps actuel.
        @return: le nombre de secondes entre
                le temps actuel et le prochain quart d'heure.
*)
on au_quart()
        set maintenant to current date
        set minuts to minutes of maintenant
        set secondes to seconds of maintenant
       
        if ((minuts mod 15) = 0) then
                -- dans un quart d'heure
                set plus_tard to 15
        else
                -- le quart suivant
                set quart to (minuts / 15)
                set iquart to (quart as integer)
                if (iquart < quart) then
                        set iquart to (iquart + 1)
                end if
                set plus_tard to ((15 * iquart) - minuts)
        end if
       
        -- résultat à envoyer en secondes
        set plus_tard to (plus_tard * minutes) - secondes
       
        return (plus_tard)
end au_quart

(*
        @return: string heure minute seconde
        sec: int, décallage en secondes
*)
on heure_minutes(sec)
        set maintenant to (current date) + sec
        set heures to hours of maintenant
        set minuts to minutes of maintenant
        set secondes to seconds of maintenant
        return (heures & ":" & minuts & ":" & secondes)
end heure_minutes

Charger le script compagnon (load script) et appeler ses fonctions

Pour appeler le script compagnon calculer.scpt, il faut lui attribuer un pointeur (handler), dans le style :

set path_script to path to resource "calculer.scpt" in directory "Scripts"
set calculer to load script path_script

Pour appeler la fonction au_quart() contenue dans ce script, réaliser un appel du style :

set ma_variable to au_quart() of calculer

kill Unix pour quitter l’application

Curiosité : la commande AppleScript quit ne quitte pas l’application compilée. Un quit me ou tell me to quit n’ont pas l’effet escompté. L’application Horloge.app est enregistrée avec l’option Rester en arrière plan. Ce qui explique peut-être celà ? A noter que return empêche la poursuite du script, mais l’icône d’ Horloge.app reste aussi dans le dock. Si quelqu’un a l’explication, le forum en bas de page lui tend les bras.

Pour forcer à quitter Horloge.app, seule solution a priori (mais j’en doute), c’est l’envoi d’un kill via le système.

Consulter le source AppleScript ci-dessous pour en savoir plus.

Construction d’une icône pour l’applet

L’icône cloche.icns a été dessinée sous Illustrator CS5. En voici le fichier :

Zip - 379.6 ko
La cloche au format AI

et la version au format svgz, enveloppée dans un ZIP (pour empêcher SPIP de l’interpréter) :

Zip - 141.7 ko
La cloche au format SVGZ

Pour créer l’icône au format ICNS :

  • Lancer Icon Composer.app, dossier /Developer/Applications/Utilities/
  • Glisser le fichier AI sur chacune des cases de la fenêtre de l’icône (le format AI est reconnu par Icon Composer.app, ainsi que d’autres formats image tel que PNG)
  • Enregistrer sous le nom de "applet.icns"
  • Recopier applet.icns dans le répertoire Contents/Resources d’Horloge.app

Le code source AppleScript d’Horloge.app

Le code AppleScript de Horloge.app (main.scpt), largement commenté :

(*

        Sonner l'heure
        (et les quarts d'heure)
       
        Sun Aug  8 16:19:47 CEST 2010
        © 2010 - Christian Paulus
        Licence GPL3
        http://www.quesaco.org/Sonner-l-heure-systeme-et-les-quarts-d-heure
       
*)
(*
Vous pouvez choisir le son :
        - mettre en commentaire le son actuel
                en placant '--' en début de ligne
        - décommenter le son souhaité en
                retirant '--' en début de ligne
*)
--property son : "coucou_suisse_gauche.mp3"
-- property son : "coucou_gauche.mp3"
property son : "clochette_gauche.mp3"
--property son : "clochette_droite.mp3"

property version : 1.0
property name : "Horloge"

on idle
       
        try
                -- la clochette est dans le Resource du bundle
                set bell to path to resource son in directory "Sounds"
        on error
                display dialog "Le fichier son " & ¬
                        (quoted form of son) & ¬
                        " est manquant."
               
                -- Quitter
               
                -- arrête le process, mais pas l'appli qui reste dans le dock
                --return (false)
               
                -- n'arrête pas
                --tell me to quit
               
                -- ça non plus
                -- delay 0.5
                -- tell application "System Events" to key code 0 using {command down}
                -- delay 1
               
                -- commande radicale!
                -- à condition de ne pas renommer l'appli ;-)
                set pid to do shell script ("ps x |grep 'Horloge.app/Contents/MacOS/applet'")
                set pid to first word of pid as integer
                if (pid > 1024) then do shell script ("kill " & pid)
               
        end try
       
        -- chemin au format POSIX pour transmettre à afplay
        set bell to (POSIX path of bell)
       
        -- charger le script compagnon       
        set calculer to path to resource "calculer.scpt" in directory "Scripts"
        set calculer to load script calculer
       
        -- quelle heure est-il ?
        set maintenant to current date
        set heures to hours of maintenant
        set minuts to minutes of maintenant
       
        -- tracer dans /var/log/system.log
        do shell script "logger " & my name & " start @ " & ¬
                heure_minutes(0) of calculer
       
        -- faut-il sonner ?
        if ((minuts mod 15) = 0) then
                if (minuts = 0) then
                        -- heure : nombre de coups = heures (max 12)
                        if (heures ≤ 12) then
                                set nb_coups to heures
                        else
                                set nb_coups to (heures - 12)
                        end if
                else
                        -- 1/4 et 1/2 heure : 1 coup
                        set nb_coups to 1
                end if
                do shell script "logger " & my name & ¬
                        " ring " & nb_coups & " times."
               
                -- préparer le ligne de commande pour jouer le son
                set tinter to ""
                repeat nb_coups times
                        set tinter to tinter & ¬
                                "afplay " & (quoted form of bell) & ";"
                end repeat
               
                -- lancer la commande dans un shell
                do shell script tinter
        end if
       
        do shell script "logger " & my name & " end @ " & ¬
                heure_minutes(0) of calculer
       
        -- calculer le quart d'heure suivant
        set revenir to au_quart() of calculer
       
        do shell script "logger " & my name & ¬
                " will be back in " & revenir & " seconds @ " & ¬
                heure_minutes(revenir) of calculer
       
        -- la valeur renvoyée en secondes
        -- pour le gestionnaire idle
        return (revenir)
end idle

Et enfin l’applet finale, prête à l’emploi :

Zip - 498.5 ko
Horloge.app, l’applet

A noter que vous pouvez ajouter vos propres sons de cloche :

  • Click droit sur Horloge.app, puis Afficher le contenu du paquet
  • Répertoire Contents/Ressources/Sounds
  • Recopier votre son dans ce répertoire
  • Modifier la ligne : property son : "clochette_gauche.mp3" en y indiquant le nom de fichier de votre son.

Plussoyez !

Les forums sont fermés.