diff --git a/contrib/lisp/ob-sclang.el b/contrib/lisp/ob-sclang.el new file mode 100644 index 000000000..763799533 --- /dev/null +++ b/contrib/lisp/ob-sclang.el @@ -0,0 +1,102 @@ +;;; ob-sclang.el --- SCLang support for Org-mode Babel -*- lexical-binding: t; -*- +;;; -*- coding: utf-8 -*- + +;; Copyright (C) 2011-2017 Free Software Foundation, Inc. + +;; Authors: stardiviner +;; Package-Version: 0.1 +;; Keywords: babel sclang + +;; This file is not part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs 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 General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; `ob-sclang' requires `sclang-interp' from SuperCollider. +;; Usually SuperCollider dependencies for Emacs are at /usr/share/emacs/site-lisp/SuperCollider/ +;; You can install SuperCollider following this article: +;; https://github.com/supercollider/supercollider#building-the-source-code + +;; Usage: + +;; Support to evaluate sclang Org-mode src block with function `sclang-eval-string'. + +;; For example: + +;; #+BEGIN_SRC sclang :results none +;; "Hello World".postln; +;; #+END_SRC +;; +;; *NOTE* Temporary output to org-babel result output is not supported. +;; Because `sclang-eval-string' will send output to Sclang Post Buffer. +;; And command line `sclang' execute will not automatically stop after finished execution. +;; +;; #+BEGIN_SRC sclang :results none +;; // modulate a sine frequency and a noise amplitude with another sine +;; // whose frequency depends on the horizontal mouse pointer position +;; { +;; var x = SinOsc.ar(MouseX.kr(1, 100)); +;; SinOsc.ar(300 * x + 800, 0, 0.1) +;; + +;; PinkNoise.ar(0.1 * x + 0.1) +;; }.play; +;; #+END_SRC + + +;;; Code: +;;; ---------------------------------------------------------------------------- +(require 'org) +(require 'ob) + +(require 'sclang-interp) + +(defgroup ob-sclang nil + "org-mode blocks for SuperCollider SCLang." + :group 'org) + +;;;###autoload +(defun org-babel-execute:sclang (body params) + "Org-mode Babel sclang hook for evaluate `BODY' with `PARAMS'." + (unless (or (equal (buffer-name) sclang-post-buffer) + (sclang-get-process)) + (sclang-start)) + + ;; (let* ((db (or (cdr (assoc :db params)) + ;; ob-mongo:default-db)) + ;; (cmd (mapconcat 'identity (list "mongo" "--quiet" db) " "))) + ;; (org-babel-eval cmd body)) + + (sclang-eval-string body t) + + ;; (let ((cmd "sclang -r -s -D")) + ;; (org-babel-eval cmd body)) + ) + +(defvar org-babel-default-header-args:sclang nil) + +(setq org-babel-default-header-args:sclang + '((:session . "*SCLang:Workspace*") + (:output . "none")) ; TODO: temporary can't find way to let sclang output to stdout for org-babel. + ) + +;;;###autoload +(with-eval-after-load "org" + (add-to-list 'org-src-lang-modes '("sclang" . sclang))) + +;;; ---------------------------------------------------------------------------- + +(provide 'ob-sclang) + +;;; ob-sclang.el ends here