Work-in-progress repo for ambisonics extensions for OM-SoX
Marlon Schumacher
5 days ago 03b73ca4c0d32c6011a17f9fa3fefe14181f27bd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
;*********************************************************************
; OM-SoX, (c) 2011-2013 Marlon Schumacher (CIRMMT/McGill University) *
;             http://sourceforge.net/projects/omsox/                 *
;                                                                    *
;  Multichannel Audio Manipulation and Functional Batch Processing.  *
;        DSP based on SoX - (c) C.Bagwell and Contributors           *
;                  http://sox.sourceforge.net/                       *
;*********************************************************************
;
;This program 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 2
;of the License, or (at your option) any later version.
;
;See file LICENSE for further informations on licensing terms.
;
;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 General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,10 USA.
;
;Authors: M. Schumacher
 
(in-package :om)
 
; ==== SOX-MIX-CONSOLE ========================
 
; there's basically 2 options:
; 1) Use sox-mix-console but in a way that there can be a list of effects which is applied internally to each of the components (drawback: inconsistent handling of polymorphism)
; 2) Write a 'macro' (as a patch) that does what sox-mix-console does, but explicitly 'fills' a sox-mix object with pipes from (sox-process '(sox-remixes) '(sox-pads))
 
(defclass! sox-mix-console (sox-input)
           (      
            (gains :accessor gains :initarg :gains :initform nil :documentation *sox-gain-doc*)
            (panning :accessor panning :initform nil :initarg :panning :documentation *sox-panning-doc*)
            (numchannels :accessor numchannels :initform 2 :initarg :numchannels :documentation "Number of output channels for mixing process.") 
            )
           (:icon 12) ;918
           (:documentation "Sox-Mix-Console allows mixing and panning inputs on an array of output channels. Inputs do not need to have the same number of channels. 
 
Multichannel inputs are first mixed into a single channel before panning/mixing with other soundfiles.
NB: Input audio must have the same samplerate.")
           )
 
; pipe input not possible with this class
; why isn't this using sox-init-panning? not for lists?
 
(defmethod initialize-instance :after ((self sox-mix-console) &rest args)
  (when (sound self)
    (let* ((sound-length (length (list! (sound self))))
           (linear-panning (om-scale (arithm-ser 1 sound-length 1) 1 (numchannels self)))
           (panning-list (loop for sound in (list! (sound self))
                               for i from 0 to (- sound-length 1) collect
                               (if (soundp sound)
                                   (if (equal (tracknum sound) 0)
                                       (nth i linear-panning)
                                     (+ (tracknum sound) (* 0.01 (pan sound))))
                                 )                               
                               ))
           (nunumchannels (+ 1 (floor (list-max panning-list)))))
      (unless (consp (panning self))
        (setf (panning self) panning-list))
      (sox-init-gains self)
      (sox-init-sound self 'list)
      (when (< (numchannels self) (list-max (panning self)))
        (setf (numchannels self) nunumchannels)
        )
      )
    )
  )