melodica.lsp Version 1.00 24 December 2004 Author 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
function
(melodica:voice pitch dur [:vel][:n][:ndb][:attack][:decay][:env])
A monophonic melodica voice
pitch - flonum. MIDI key number.
dur - flonum. Duration in seconds.
vel - flonum. MIDI velocity controls attack time, high frequency
components, number of noise bands. Default 64
n - integer. Number of noise bands. If specified, overrides
velocity control of noise band count. Noise bands are used
to add some animation to the sound but are computationally
hungry.
ndb - flonum. Relative mix of noise bands in db, default -3
attack - flonum. Attack time in seconds. Normally attack is a function
of velocity. Explicitly specified attack times override velocity
derived attack times.
decay - flonum Decay time in seconds, default 0.25
env - sound. If specified sets amplitude envelope directly,
attack and decay arguments are ignored.
return - sound.
wrapper
(melodica plist dur [:vel][:arpeg][:pos][:n][:ndb][:attack][:decay][:env][:lp][:tfrq][:ttab][:tdelay][:tphase][:trem])
A polyphonic melodica instrument. The simulation consist of two components;
a bright but static waveform and a "noisy" dynamic waveform.
The composite sound is low passed filtered and subjected to optional tremolo.
plist - list or flonum. The midi note number(s) to be played.
dur - flonum. Duration in seconds.
:vel - flonum. MIDI velocity. The velocity controls attack time and
filter cutoff, default 64
:arpeg - flonum. Arpeggio rate, default 0 seconds.
:pos - flonum or sound. Sound pan position, default 0.5
:n - integer. Number of noise bands. Default 4
:ndb - flonum. Noise band amplitude in db, default -3
:attack - flonum. Attack time in seconds. If specified overrides velocity
derived attack.
:decay - flonum. Decay time
:env - sound. Optional amplitude envelope. If specified attack and
decay arguments are ignored
:lp - flonum. Filter cutoff. If specified overrides velocity derived
cutoff
:tfrq - flonum. Tremolo frequency in hz, default 1
:ttab - table. Tremolo wave table, default *tri-table*
:tdelay - flonum. Tremolo delay time, default 0
:tphase - flonum. Tremolo phase. Default 0
:trem - flonum. Tremolo depth, scaled for MIDI controller range.
return - sound vector.
;; melodica.lsp
;; Version 1.00 24 December 2004
;; Author 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
;;
(require 'definst)
(require 'wtab)
(require 'map)
(require 'dlfo)
(require 'rmband)
(provide 'melodica)
(current-file "melodica")
(setq melodica:*vel-attack-map* (map:quad 0.125 0.1))
;;(setq melodica:*vel-hifrq-map* (map:quad -32 -9))
(setq melodica:*vel-noise-n-map* (map:quad 3 6))
(setq melodica:*vel-filter-map* (map:linear 1500 20000))
(setq melodica:*tab-1* (wtab:make '((1 1.000)
(3 0.783)
(4 0.450)
(5 0.736)
(6 0.523)
(7 0.014)
(8 0.125)
(9 0.111)
(10 0.10)
(12 0.08)
)))
;;
;;(setq melodica:*tab-2* (wtab:make '((09 0.558)
;; (11 0.250)
;; (13 0.125)
;; (15 0.060)
;; (17 0.030)
;; (19 0.015)
;; (21 0.007)
;; (23 0.003)
;; (25 0.001))))
;;
;; Provide chorusing component to melodica.
;; n parallel sine oscillators ring-modulated by band-limited noise.
;;
(definst melodica:noise (n)
(let ((n (or n 4))
(bw 10)
(hz (step-to-hz pitch)))
(rmband:harmonic pitch dur
:n n
:bwfn #'(lambda (j) bw)
:rffn #'(lambda (j hz) (* (+ (* j 2) 1) hz))
:rafn #'(lambda (j) (/ 1.0 (max 1.0 j)))
)))
;; @doc function melodica:voice
;; (melodica:voice pitch dur [:vel][:n][:ndb][:attack][:decay][:env])
;; A monophonic melodica voice
;;
;; pitch - flonum. MIDI key number.
;; dur - flonum. Duration in seconds.
;; vel - flonum. MIDI velocity controls attack time, high frequency
;; components, number of noise bands. Default 64
;; n - integer. Number of noise bands. If specified, overrides
;; velocity control of noise band count. Noise bands are used
;; to add some animation to the sound but are computationally
;; hungry.
;; ndb - flonum. Relative mix of noise bands in db, default -3
;; attack - flonum. Attack time in seconds. Normally attack is a function
;; of velocity. Explicitly specified attack times override velocity
;; derived attack times.
;; decay - flonum Decay time in seconds, default 0.25
;; env - sound. If specified sets amplitude envelope directly,
;; attack and decay arguments are ignored.
;;
;; return - sound.
;;
(definst melodica:voice (vel n ndb attack decay env)
(let* ((vel (or vel 64))
(attack (or attack (send melodica:*vel-attack-map* :get vel)))
(release (or decay 0.25))
;(high-db (send melodica:*vel-hifrq-map* :get vel))
(n (truncate (or n (send melodica:*vel-noise-n-map* :get vel))))
(ndb (or ndb -3))
)
(mult (sum (osc pitch dur melodica:*tab-1*)
;(scale-db high-db
; (osc pitch dur melodica:*tab-2*))
(scale-db ndb (melodica:noise pitch dur :n n)))
(or env
(asd attack (max 0 (- dur attack release)) release)))))
(defun melodica:filter (signal cutoff)
(vector
(lowpass4 (aref signal 0) cutoff)
(lowpass4 (aref signal 1) cutoff)))
;; @doc wrapper melodica
;; (melodica plist dur [:vel][:arpeg][:pos][:n][:ndb][:attack][:decay][:env][:lp][:tfrq][:ttab][:tdelay][:tphase][:trem])
;;
;; A polyphonic melodica instrument. The simulation consist of two components;
;; a bright but static waveform and a "noisy" dynamic waveform.
;; The composite sound is low passed filtered and subjected to optional tremolo.
;;
;; plist - list or flonum. The midi note number(s) to be played.
;; dur - flonum. Duration in seconds.
;; :vel - flonum. MIDI velocity. The velocity controls attack time and
;; filter cutoff, default 64
;; :arpeg - flonum. Arpeggio rate, default 0 seconds.
;; :pos - flonum or sound. Sound pan position, default 0.5
;; :n - integer. Number of noise bands. Default 4
;; :ndb - flonum. Noise band amplitude in db, default -3
;; :attack - flonum. Attack time in seconds. If specified overrides velocity
;; derived attack.
;; :decay - flonum. Decay time
;; :env - sound. Optional amplitude envelope. If specified attack and
;; decay arguments are ignored
;; :lp - flonum. Filter cutoff. If specified overrides velocity derived
;; cutoff
;; :tfrq - flonum. Tremolo frequency in hz, default 1
;; :ttab - table. Tremolo wave table, default *tri-table*
;; :tdelay - flonum. Tremolo delay time, default 0
;; :tphase - flonum. Tremolo phase. Default 0
;; :trem - flonum. Tremolo depth, scaled for MIDI controller range.
;;
;; return - sound vector.
;;
(defwrapper melodica
#'melodica:voice
#'(lambda (signal args)
(let* ((vel (get-keyword-value ':vel args 64))
(cutoff (or (get-keyword-value ':lp args)
(send melodica:*vel-filter-map* :get vel)))
(tfrq (get-keyword-value ':tfrq args 1.00))
(ttab (get-keyword-value ':ttab args *tri-table*))
(tdelay (get-keyword-value ':tdelay args 0 ))
(tphase (get-keyword-value ':tphase args 0 ))
(trem (min (max 0 (/ (get-keyword-value ':trem args 0) 128.0)) 1))
(amp (- 1 trem)))
(mult (melodica:filter signal cutoff)
(sum
amp
(scale trem
(dlfo tfrq dur
:tab ttab
:rho tphase
:delay (* 0.75 tdelay)
:attack (* 0.25 tdelay))))))) )