changeset 31:0e794e48a0cc

updated clojure hearing code to work with blender
author Robert McIntyre <rlm@mit.edu>
date Fri, 03 Feb 2012 06:40:59 -0700
parents 32c69ba451d9
children b8bc24918d63
files org/ear.org
diffstat 1 files changed, 91 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
     1.1 --- a/org/ear.org	Mon Jan 23 05:49:37 2012 -0700
     1.2 +++ b/org/ear.org	Fri Feb 03 06:40:59 2012 -0700
     1.3 @@ -757,12 +757,14 @@
     1.4    of floats in the range [-1.0 -- 1.0] in PCM format to any arbitrary
     1.5    function."
     1.6    {:author "Robert McIntyre"}
     1.7 -  (:use (cortex world util))
     1.8 +  (:use (cortex world util sense))
     1.9    (:import java.nio.ByteBuffer)
    1.10    (:import org.tritonus.share.sampled.FloatSampleTools)
    1.11    (:import com.aurellem.capture.audio.SoundProcessor)
    1.12    (:import javax.sound.sampled.AudioFormat))
    1.13 -  
    1.14 +
    1.15 +(cortex.import/mega-import-jme3)  
    1.16 +
    1.17  (defn sound-processor
    1.18    "Deals with converting ByteBuffers into Vectors of floats so that
    1.19    the continuation functions can be defined in terms of immutable
    1.20 @@ -781,16 +783,93 @@
    1.21          (continuation
    1.22           (vec floats))))))
    1.23  
    1.24 -(defn add-ear 
    1.25 -  "Add an ear to the world.  The continuation function will be called
    1.26 -  on the FFT or the sounds which the ear hears in the given
    1.27 -  timeframe. Sound is 3D."
    1.28 -  [world listener continuation]
    1.29 -  (let [renderer (.getAudioRenderer world)]
    1.30 -    (.addListener renderer listener)
    1.31 -    (.registerSoundProcessor renderer listener
    1.32 -			     (sound-processor continuation))
    1.33 -    listener))
    1.34 +
    1.35 +
    1.36 +
    1.37 +;; Ears work the same way as vision.
    1.38 +
    1.39 +;; (hearing creature) will return [init-functions
    1.40 +;; sensor-functions]. The init functions each take the world and
    1.41 +;; register a SoundProcessor that does foureier transforms on the
    1.42 +;; incommong sound data, making it available to each sensor function.
    1.43 +
    1.44 +(defn creature-ears
    1.45 +  "Return the children of the creature's \"ears\" node."
    1.46 +  ;;dylan
    1.47 +  ;;"The ear nodes which are children of the \"ears\" node in the
    1.48 +  ;;creature."
    1.49 +  [#^Node creature]
    1.50 +  (if-let [ear-node (.getChild creature "ears")]
    1.51 +    (seq (.getChildren ear-node))
    1.52 +    (do (println-repl "could not find ears node") [])))
    1.53 +
    1.54 +
    1.55 +;;dylan (defn follow-sense, adjoin-sense, attach-stimuli,
    1.56 +;;anchor-qualia, augment-organ, with-organ
    1.57 +
    1.58 +
    1.59 +(defn update-listener-velocity
    1.60 +  "Update the listener's velocity every update loop."
    1.61 +  [#^Spatial obj #^Listener lis]
    1.62 +  (let [old-position (atom (.getLocation lis))]
    1.63 +    (.addControl
    1.64 +     obj
    1.65 +     (proxy [AbstractControl] []
    1.66 +       (controlUpdate [tpf]
    1.67 +         (let [new-position (.getLocation lis)]
    1.68 +           (.setVelocity
    1.69 +            lis 
    1.70 +            (.mult (.subtract new-position @old-position)
    1.71 +                   (float (/ tpf))))
    1.72 +           (reset! old-position new-position)))
    1.73 +       (controlRender [_ _])))))
    1.74 +
    1.75 +(import com.aurellem.capture.audio.AudioSendRenderer)
    1.76 +
    1.77 +(defn attach-ear
    1.78 +  [#^Application world #^Node creature #^Spatial ear continuation]
    1.79 +  (let [target (closest-node creature ear)
    1.80 +        lis (Listener.)
    1.81 +        audio-renderer (.getAudioRenderer world)
    1.82 +        sp (sound-processor continuation)]
    1.83 +    (.setLocation lis (.getWorldTranslation ear))
    1.84 +    (.setRotation lis (.getWorldRotation ear))
    1.85 +    (bind-sense target lis)
    1.86 +    (update-listener-velocity target lis)
    1.87 +    (.addListener audio-renderer lis)
    1.88 +    (.registerSoundProcessor audio-renderer lis sp)))
    1.89 +
    1.90 +(defn enable-hearing
    1.91 +  [#^Node creature #^Spatial ear]
    1.92 +  (let [hearing-data (atom [])]
    1.93 +    [(fn [world]
    1.94 +       (attach-ear world creature ear
    1.95 +                   (fn [data]
    1.96 +                     (reset! hearing-data (vec data)))))
    1.97 +     [(fn []
    1.98 +        (let [data @hearing-data
    1.99 +              topology              
   1.100 +              (vec (map #(vector % 0) (range 0 (count data))))
   1.101 +              scaled-data
   1.102 +              (vec
   1.103 +               (map
   1.104 +                #(rem (int (* 255 (/ (+ 1 %) 2)))  256)
   1.105 +                   data))]
   1.106 +          [topology scaled-data]))
   1.107 +        ]]))
   1.108 +
   1.109 +(defn hearing
   1.110 +  [#^Node creature]
   1.111 +  (reduce
   1.112 +   (fn [[init-a senses-a]
   1.113 +        [init-b senses-b]]
   1.114 +     [(conj init-a init-b)
   1.115 +      (into senses-a senses-b)])
   1.116 +   [[][]]      
   1.117 +   (for [ear (creature-ears creature)]
   1.118 +     (enable-hearing creature ear))))
   1.119 +
   1.120 +
   1.121  #+end_src
   1.122  
   1.123  * Example