| 
					
				 | 
			
			
				@@ -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 <numbchild@gmail.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; 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 <http://www.gnu.org/licenses/>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;; 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 
			 |