Main Page       Index


fm-bass.lsp


 fm-bass.lsp
 Version 1.00   31 October 2004
 Authors  Steven Jones

 Contact jones57@swbell.net include the word "nyquist" in subject line
 

 The contents of this file are released under the terms of the GNU General
 Public License. See the file LICENSE.txt

 Another FM bass instrument.
 
 fm-bass is a 1 carrier 3 modulator bass instrument. The velocity
 parameter allows for a fairly wide range of timbres. At 0 velocity the tone
 is essentially sinusoidal.


function

fm-bass

 (fm-bass pch dur [:vel][:dis][:pos])
 An fm bass instriument
 
 pch    -  flonum. Pitch as MIDI key number
 
 dur    - flonum. Duration in seconds

 :vel   - flonum. Velocity  0 <= vel < 128, default 100

 :dis   - flonum. Effects modulation index. Default 1
 
 :pos   - flonum. Pan position, default 0.5

 return - vector. A 2 channel sound


View the Sourcecode :



;; fm-bass.lsp
;; Version 1.00   31 October 2004
;; Authors  Steven Jones
;;
;; Contact jones57@swbell.net include the word "nyquist" in subject line
;; 
;;
;; The contents of this file are released under the terms of the GNU General
;; Public License. See the file LICENSE.txt
;;
;; Another FM bass instrument.
;; 
;; fm-bass is a 1 carrier 3 modulator bass instrument. The velocity
;; parameter allows for a fairly wide range of timbres. At 0 velocity the tone
;; is essentially sinusoidal.
;; 

(require 'envelope)
(require 'wtab)
(require 'fmop)
(require 'square-16)
(provide 'fm-bass)
(current-file "fm-bass")


;; @doc function fm-bass 
;; (fm-bass pch dur [:vel][:dis][:pos])
;; An fm bass instriument
;; 
;; pch    -  flonum. Pitch as MIDI key number
;; 
;; dur    - flonum. Duration in seconds
;;
;; :vel   - flonum. Velocity  0 <= vel < 128, default 100
;;
;; :dis   - flonum. Effects modulation index. Default 1
;; 
;; :pos   - flonum. Pan position, default 0.5
;;
;; return - vector. A 2 channel sound
;;

(defun fm-bass  (pch dur &key vel dis pos)
  (let ((vscale (sqr (/ (or vel 100) 51.8)))
	(pos (or pos 0.5))
	(dis (or dis 1.0))
	(chz (step-to-hz pch)))
    (pan 
     (let ((r2    0.505)
	   (i2    (* vscale 0.50))
	   (r3    0.500)
	   (i3    (* vscale 0.50))
	   (t3    *square-16*)
	   (r4    5.998)
	   (i4    (* vscale (/ dis 3.0)))
	   (env1 (list 0.000 0.500 0.000 0.250 0.75 dur))
	   (env2 (list 0.050 0.000 0.750 0.000 0.75 dur))
	   (env3 (list 0.000 0.000 0.050))
	   (env4 (list 0.250 0.000 0.000 0.750 0.900)))
       (fmop:cc chz (apply #'adsr env1)
		(sum (fmop:mm chz r2 i2 (apply #'adsr  env2)(s-rest dur))
		     (fmop:mm chz r3 i3 (apply #'asd  env3)(s-rest dur) :tab t3)
		     (fmop:mm chz r4 i4 (apply #'adsr  env4)(s-rest dur)))))
     (or pos 0.5))))


Main Page       Index