;; M-x hydra-insert-relative-note/body pour lancer le mode (setq note-name '( ("c" . 0) ("bs" . 0) ("cs" . 1) ("df" . 1) ("d" . 2) ("ef" . 3) ("ds" . 3) ;; inverser "ef" et "ds" pour inserer "ds" à la place de "ef" ("e" . 4) ("ff" . 4) ("f" . 5) ("es" . 5) ("fs" . 6) ("gf" . 6) ("g" . 7) ("gs" . 8) ("af" . 8) ("a" . 9) ("as" . 10) ("bf" . 10) ("b" . 11) ("cf" . 11) )) (setq note-regex "\\(as\\|af\\|a\\|bs\\|bf\\|b\\|cs\\|cf\\|c\\|ds\\|df\\|d\\|es\\|ef\\|e\\|fs\\|ff\\|f\\|gs\\|gf\\|g\\)") (defun insert-relative-note (x &optional spc) (interactive "P") (let* ((semitone (or x 0)) (last-note (save-excursion (backward-word) (if (search-forward-regexp note-regex nil t) (match-string 0) "c"))) (last-note-id (cdr (assoc last-note note-name))) (note-id-abs (+ last-note-id semitone)) (note-id (% (if (< note-id-abs 0) (+ 12 note-id-abs) note-id-abs) 12)) (note-str (car (rassq note-id note-name)))) (message "%s (%d) + %d ½ton = %s (%d) " last-note last-note-id semitone note-str note-id) (insert note-str (if (> semitone 5) "'" "") (if (< semitone -5) "," "") (if spc " " "")) )) (defhydra hydra-insert-relative-note (:hint nil) " [6M] [6m] [5t] [4t] [4t] [5t] [6m] [6M] Intervalle: [3M] [3m] [2M] [2m] [2m] [2M] [3m] [3M] [7M] [7m] [TT] [ 0 ] [TT] [7m] [7M]" ("e" (insert-relative-note -1 t)) ("i" (insert-relative-note -2 t)) ("u" (insert-relative-note -3 t)) ("a" (insert-relative-note -4 t)) ("o" (insert-relative-note -5 t)) ("p" (insert-relative-note -7 t)) ("é" (insert-relative-note -8 t)) ("b" (insert-relative-note -9 t)) ("x" (insert-relative-note -10 t)) ("y" (insert-relative-note -11 t)) ("x" (insert-relative-note -6 t)) ("t" (insert-relative-note 1 t)) ("s" (insert-relative-note 2 t)) ("r" (insert-relative-note 3 t)) ("n" (insert-relative-note 4 t)) ("v" (insert-relative-note 5 t)) ("d" (insert-relative-note 7 t)) ("l" (insert-relative-note 8 t)) ("j" (insert-relative-note 9 t)) ("h" (insert-relative-note 10 t)) ("f" (insert-relative-note 11 t)) ("g" (insert-relative-note 6 t)) ("SPC" (insert-relative-note 0 t)))