| | |
| | | ; === sox-hoaencode ============= |
| | | |
| | | (defmethod! sox-process ((sox-input sox-hoaencode) (sox-effect string) &key output filetype samplerate bitdepth recursive batch-mode) |
| | | |
| | | ; would be more consistent with OO programming to have a function sox-hoaencode->sox-merge |
| | | ; (consider how to deal with multiple sounds to be hoaencoded and mixed later on... sox-mix might be better done in an explicit way rather than via the class directly. |
| | | ; in that case a 3DC would have to be used by using points (point-pairs) in a loop |
| | | |
| | | (if (probe-file *sox-path*) |
| | | (progn |
| | | (let* |
| | | ( |
| | | (sound |
| | | (if (> (length (positions sox-input)) (length (list! (sound sox-input)))) |
| | | (repeat-n (first (list! (sound sox-input))) (length (positions sox-input))) |
| | | (sound sox-input) |
| | | ) |
| | | ) |
| | | (positions-ae |
| | | (sox-hoaencode-auto-convert-positions (positions sox-input)) |
| | | ) |
| | | ) |
| | | (when |
| | | (and (find-if 'stringp sound) (equal output "pipe")) |
| | | (om-message-abort "Pipe output not possible with this type of input.") |
| | | ) |
| | | (let* |
| | | ( |
| | | (outfile (create-path nil output filetype)) |
| | | (filenames (loop for soundfile in sound collect (namestring soundfile))) |
| | | ) |
| | | (setf str (format nil " ~s ~a" (namestring *sox-path*) *sox-options*)) |
| | | (if (= (length filenames) 1) |
| | | ; case: one file |
| | | (let* |
| | | ( |
| | | (filename (first filenames)) |
| | | (position (first positions-ae)) |
| | | ) |
| | | (if (= (order sox-input) 0) |
| | | ; case: order = 0 |
| | | (setf str (string+ str (format nil " ~s" filename))) |
| | | ; case: order > 0 |
| | | (progn |
| | | (setf str (string+ str " -M")) |
| | | (loop for gain in (sox-hoaencode-gains-up-to-order (order sox-input) (first position) (second position)) do |
| | | (setf str (string+ str (format nil " -v~d ~s" gain filename)))) |
| | | ) |
| | | ) |
| | | ) |
| | | ; case: multiple files |
| | | (if (= (order sox-input) 0) |
| | | ; case: order = 0 |
| | | (progn |
| | | (setf str (string+ str " -m")) |
| | | (loop for filename in filenames do |
| | | (setf str (string+ str (format nil " ~s" filename))) |
| | | ) |
| | | ) |
| | | ; case: order > 0 |
| | | (progn |
| | | (setf str (string+ str " -m")) |
| | | |
| | | ; Create components |
| | | (setf component_idx 0) |
| | | (loop |
| | | for filename in filenames |
| | | for position in positions-ae do |
| | | (progn |
| | | (setf str_component (format nil " ~s ~a -M" (namestring *sox-path*) *sox-options*)) |
| | | (loop |
| | | for gain in (sox-hoaencode-gains-up-to-order (order sox-input) (first position) (second position)) do |
| | | (setf str_component (string+ str_component (format nil " -v~d ~s" gain filename))) |
| | | ) |
| | | (setf outfile_tmp (format nil "~a~a-~d.~a" (directory-namestring outfile) (pathname-name outfile) component_idx (pathname-type outfile))) |
| | | (setf str_component (sox-samplebits str_component bitdepth samplerate outfile_tmp)) |
| | | (sox-out str_component filename "new file" outfile_tmp nil) |
| | | (progn |
| | | (let ((sound (sound sox-input))) |
| | | |
| | | (setf component_idx (1+ component_idx)) |
| | | (when (and (stringp sound) (equal output "pipe")) |
| | | (om-message-abort "Pipe output not possible with this type of input.")) |
| | | |
| | | (let ((filename (namestring sound)) |
| | | (outfile (create-path nil output filetype))) |
| | | |
| | | (setf str (format nil " ~s ~a" (namestring *sox-path*) *sox-options*)) |
| | | |
| | | ; Add component path to <str> |
| | | (setf str (string+ str (format nil " ~s" outfile_tmp))) |
| | | ) |
| | | ) |
| | | ) |
| | | ) |
| | | (if (= (order sox-input) 0) |
| | | ; case: order = 0 |
| | | (setf str (string+ str (format nil " ~s" filename))) |
| | | ; case: order > 0 |
| | | (progn ; here it would be more redundant to call sox-merge with the given params |
| | | (setf str (string+ str " -M")) |
| | | (loop for gain in (sox-hoaencode-gains-up-to-order (order sox-input) (azimuth sox-input) (elevation sox-input)) |
| | | do (setf str (string+ str (format nil " -v~d ~s" gain filename)))) |
| | | ) |
| | | (setf str |
| | | (cond |
| | | ((equal output "realtime") (sox-samplebits (string+ str " -q ") bitdepth samplerate *sox-audio-device*)) |
| | | ((equal output "pipe") (sox-samplebits str bitdepth samplerate "-p")) |
| | | (t (sox-samplebits str bitdepth samplerate outfile)) |
| | | ) |
| | | ) |
| | | ; ) |
| | | |
| | | (setf str |
| | | (cond |
| | | ((equal output "realtime") |
| | | (sox-samplebits (string+ str " -q ") bitdepth samplerate *sox-audio-device*)) |
| | | ((equal output "pipe") |
| | | (sox-samplebits str bitdepth samplerate "-p")) |
| | | (t (sox-samplebits str bitdepth samplerate outfile)) |
| | | ) |
| | | ) |
| | | (setf str (string+ str sox-effect)) |
| | | (print str) |
| | | (sox-out str sox-input output outfile recursive) |
| | | ) |
| | | (setf str (string+ str sox-effect)) |
| | | (print str) |
| | | (sox-out str sox-input output outfile recursive) |
| | | |
| | | ;optional removal of temp file |
| | | ; (add-tmp-file outfile_tmp) |
| | | ; (when *delete-inter-file* (clean-tmp-files)) |
| | | |
| | | ) |
| | | ) |
| | | ) |
| | | (sox-not-found) |
| | | ) |
| | | (sox-not-found) |
| | | ) |
| | | ) |
| | | ) |
| | | |
| | | ; === sox-mix ============= |
| | | |
| | |
| | | ; === sox-mix-console ============= |
| | | |
| | | |
| | | ; Notes |
| | | ; Notes on polymorphism |
| | | ; I could make this sox-mix-console (non-consistent) a method where a list of effects will be applied to each sound in the mix-console |
| | | ; OR: keep this as an extra function for the player |
| | | ; I can't use pipe-input to the mix-console as it makes sox-remix instances with pipe-outputs ->is a pipe in a pipe not possible? |