diff ear.org @ 0:f9476ff7637e

initial forking of open-al to create multiple listeners
author Robert McIntyre <rlm@mit.edu>
date Tue, 25 Oct 2011 13:02:31 -0700
parents
children
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/ear.org	Tue Oct 25 13:02:31 2011 -0700
     1.3 @@ -0,0 +1,137 @@
     1.4 +#+title: The EARS!
     1.5 +#+author: Robert McIntyre
     1.6 +#+email: rlm@mit.edu
     1.7 +#+MATHJAX: align:"left" mathml:t path:"../aurellem/src/MathJax/MathJax.js"
     1.8 +#+STYLE: <link rel="stylesheet" type="text/css" href="../aurellem/src/css/aurellem.css"/>
     1.9 +#+BABEL: :exports both :noweb yes :cache no :mkdirp yes
    1.10 +#+INCLUDE: ../aurellem/src/templates/level-0.org
    1.11 +#+description: Simulating multiple listeners and the sense of hearing in uMonkeyEngine3
    1.12 +
    1.13 +
    1.14 +
    1.15 +
    1.16 +* Ears!
    1.17 +
    1.18 +I want to be able to place ears in a similiar manner to how I place
    1.19 +the eyes.  I want to be able to place ears in a unique spatial
    1.20 +position, and recieve as output at every tick the FFT of whatever
    1.21 +signals are happening at that point.
    1.22 +
    1.23 +#+srcname: ear-header
    1.24 +#+begin_src clojure
    1.25 +(ns body.ear)
    1.26 +(use 'cortex.world)
    1.27 +(use 'cortex.import)
    1.28 +(use 'clojure.contrib.def)
    1.29 +(cortex.import/mega-import-jme3)
    1.30 +(rlm.rlm-commands/help)
    1.31 +(import java.nio.ByteBuffer)
    1.32 +(import java.awt.image.BufferedImage)
    1.33 +(import java.awt.Color)
    1.34 +(import java.awt.Dimension)
    1.35 +(import java.awt.Graphics)
    1.36 +(import java.awt.Graphics2D)
    1.37 +(import java.awt.event.WindowAdapter)
    1.38 +(import java.awt.event.WindowEvent)
    1.39 +(import java.awt.image.BufferedImage)
    1.40 +(import java.nio.ByteBuffer)
    1.41 +(import javax.swing.JFrame)
    1.42 +(import javax.swing.JPanel)
    1.43 +(import javax.swing.SwingUtilities)
    1.44 +(import javax.swing.ImageIcon)
    1.45 +(import javax.swing.JOptionPane)
    1.46 +(import java.awt.image.ImageObserver)
    1.47 +#+end_src
    1.48 +
    1.49 +JMonkeyEngine3's audio system works as follows:
    1.50 +first, an appropiate audio renderer is created during initialization
    1.51 +and depending on the context.  On my computer, this is the
    1.52 +LwjglAudioRenderer. 
    1.53 +
    1.54 +The LwjglAudioRenderer sets a few internal state variables depending
    1.55 +on what capabilities the audio system has.
    1.56 +
    1.57 +may very well need to make my own AudioRenderer
    1.58 +
    1.59 +#+srcname: ear-body-1
    1.60 +#+begin_src clojure :results silent
    1.61 +(in-ns 'body.ear)
    1.62 +(import 'com.jme3.capture.SoundProcessor)
    1.63 +
    1.64 +
    1.65 +(defn sound-processor
    1.66 +  "deals with converting ByteBuffers into Arrays of bytes so that the
    1.67 +  continuation functions can be defined in terms of immutable stuff."
    1.68 +  [continuation]
    1.69 +  (proxy [SoundProcessor] []
    1.70 +    (cleanup [])
    1.71 +    (process
    1.72 +      [#^ByteBuffer audioSamples numSamples]
    1.73 +      (no-exceptions
    1.74 +       (let [byte-array (byte-array numSamples)]
    1.75 +	 (.get audioSamples byte-array 0 numSamples)
    1.76 +	 (continuation
    1.77 +	  (vec byte-array)))))))
    1.78 +	 
    1.79 +
    1.80 +(defn add-ear 
    1.81 +  "add an ear to the world.  The continuation function will be called
    1.82 +  on the FFT or the sounds which the ear hears in the given
    1.83 +  timeframe. Sound is 3D."
    1.84 +  [world listener continuation]
    1.85 +  (let [renderer (.getAudioRenderer world)]
    1.86 +    (.addListener renderer listener)
    1.87 +    (.registerSoundProcessor renderer listener
    1.88 +			     (sound-processor continuation))
    1.89 +    listener))
    1.90 +
    1.91 +#+end_src
    1.92 +
    1.93 +
    1.94 +
    1.95 +#+srcname: test-hearing
    1.96 +#+begin_src clojure :results silent
    1.97 +(ns test.hearing)
    1.98 +(use 'cortex.world)
    1.99 +(use 'cortex.import)
   1.100 +(use 'clojure.contrib.def)
   1.101 +(use 'body.ear)
   1.102 +(cortex.import/mega-import-jme3)
   1.103 +(rlm.rlm-commands/help)
   1.104 +
   1.105 +(defn setup-fn [world]
   1.106 +  (let [listener (Listener.)]
   1.107 +    (add-ear world listener #(println (nth % 0)))))
   1.108 +  
   1.109 +(defn play-sound [node world value]
   1.110 +  (if (not value)
   1.111 +    (do
   1.112 +      (.playSource (.getAudioRenderer world) node))))
   1.113 +
   1.114 +(defn test-world []
   1.115 +  (let [node1 (AudioNode. (asset-manager) "Sounds/pure.wav" false false)]
   1.116 +    (world
   1.117 +     (Node.)
   1.118 +     {"key-space" (partial play-sound node1)}
   1.119 +     setup-fn
   1.120 +     no-op
   1.121 +     )))
   1.122 +    
   1.123 +
   1.124 +#+end_src
   1.125 +
   1.126 +
   1.127 +
   1.128 +* COMMENT Code Generation
   1.129 +
   1.130 +#+begin_src clojure :tangle /home/r/cortex/src/body/ear.clj
   1.131 +<<ear-header>>
   1.132 +<<ear-body-1>>
   1.133 +#+end_src
   1.134 +
   1.135 +
   1.136 +#+begin_src clojure :tangle /home/r/cortex/src/test/hearing.clj
   1.137 +<<test-hearing>>
   1.138 +#+end_src
   1.139 +
   1.140 +