« ^ »

Emacsで音声ファイルを再生する

所要時間: 約 2分

Emacsを使っていると自分用のコマンドが無数に増えていく。Webブラウザで言えばブックマークが増えていったり、自分用のショートカットが増えていく。BashやZshやその他のシェルを使っていれば自分用のaliasやワンライナーが増えていく。これと同じようにEmacsでは M-x で呼び出すコマンドを日常的に実装する。細かい事を考え出せばきりがないんだけれど、そういう事は一旦忘れて以下のようなコマンドを実装して評価すれば、 M-x から様々なコマンドを実行できる。

(defun my-custom-commmand (cmd)
  (interactive "sCommand: ")
  (async-shell-command cmd))

以前からローカルにある音声ファイルを再生するためのコマンドを、Emacsの設定用リポジトリに用意していた1。ここでホスティングし続けてもよかったが、このような小さい実装は再利用するより実装を参考にして自分用にコピーしてカスタマイズしていく方が望ましいと考えるようになった。そのように考えるとemacs.dのリポジトリにあっても説明もしにくいし、他人の設定ファイルなんて見る気にはならない。それよりも記事の体裁になっている方が読みやすいだろう。そこでblog用のリポジトリに移動させる事にした。

この小さなパッケージはmacOSに用意されているafplayというコマンドを呼び出して音声ファイルを再生している。実際には以下のようなコマンドを実行している。

afplay 音声ファイルへのPATH

リピートをさせたい事があるため簡易的なリピート機能だけ実装した。実装方法は単純でシェルの while 構文を使用してリピートしている。

停止方法は、特別に用意しているわけではない。実行する時のバッファを残しているため、そのバッファを削除したり実行中のプロセスを停止させれば当然再生も停止する。

;;; soundplay.el --- sound player For Emacs. -*- lexical-binding: t -*-

;; Copyright (C) 2023 TakesxiSximada

;; Author: TakesxiSximada
;; Maintainer: TakesxiSximada
;; Version: 2
;; Package-Version: 20240321.0000
;; Package-Requires: ((emacs "29.1"))
;; Date: 2024-03-21

;; This file is not part of GNU Emacs.

;;; License:

;; This program is free software: you can redistribute it and/or
;; modify it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Affero General Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with this program.  If not, see
;; <https://www.gnu.org/licenses/>.

;;; Commentary:

;; Copy from https://github.com/TakesxiSximada/emacs.d/blob/57289af138551dc501dd1b1941ff2dae0e11809e/lisp/sound.el

;;; Code:

(defgroup soundplay nil
  "sound player For Emacs")

;;;###autoload
(defcustom soundplay-macos-afplay-executable "/usr/bin/afplay"
  "Path to sound player command on macOS."
  :group 'soundplay
  :type 'file)

;;;###autoload
(defun soundplay-macos-afplay (file &optional repeat)
  (interactive (list
		(read-file-name  "Audio file: ")
		(yes-or-no-p "Repeat?: ")))
  (if repeat
      (async-shell-command
       (format "while true; do %s %s; sleep 1; done"
	       soundplay-macos-afplay-executable file))
    (start-process
     "*SOUND PLAY*" nil soundplay-macos-afplay-executable file)))

(provide 'soundplay)
;;; soundplay.el ends here

Lispファイルへのリンクを設置しておく。

soundplay.el