comparison org/hearing.org @ 276:54ec231dec4c

I changed Capture Video, then merged with Robert.
author Dylan Holmes <ocsenave@gmail.com>
date Wed, 15 Feb 2012 01:16:54 -0600
parents c39b8b29a79e
children 23aadf376e9d
comparison
equal deleted inserted replaced
275:da4de661c5d9 276:54ec231dec4c
774 hearing abstraction is simple and closely parallels the [[./vision.org][vision]] 774 hearing abstraction is simple and closely parallels the [[./vision.org][vision]]
775 abstraction. 775 abstraction.
776 776
777 ** Hearing Pipeline 777 ** Hearing Pipeline
778 778
779 All sound rendering is done in the CPU, so =(hearing-pipeline)= is 779 All sound rendering is done in the CPU, so =hearing-pipeline= is
780 much less complicated than =(vision-pipelie)= The bytes available in 780 much less complicated than =vision-pipelie= The bytes available in
781 the ByteBuffer obtained from the =send= Device have different meanings 781 the ByteBuffer obtained from the =send= Device have different meanings
782 dependant upon the particular hardware or your system. That is why 782 dependant upon the particular hardware or your system. That is why
783 the =AudioFormat= object is necessary to provide the meaning that the 783 the =AudioFormat= object is necessary to provide the meaning that the
784 raw bytes lack. =(byteBuffer->pulse-vector)= uses the excellent 784 raw bytes lack. =byteBuffer->pulse-vector= uses the excellent
785 conversion facilities from [[http://www.tritonus.org/ ][tritonus]] ([[http://tritonus.sourceforge.net/apidoc/org/tritonus/share/sampled/FloatSampleTools.html#byte2floatInterleaved%2528byte%5B%5D,%2520int,%2520float%5B%5D,%2520int,%2520int,%2520javax.sound.sampled.AudioFormat%2529][javadoc]]) to generate a clojure vector of 785 conversion facilities from [[http://www.tritonus.org/ ][tritonus]] ([[http://tritonus.sourceforge.net/apidoc/org/tritonus/share/sampled/FloatSampleTools.html#byte2floatInterleaved%2528byte%5B%5D,%2520int,%2520float%5B%5D,%2520int,%2520int,%2520javax.sound.sampled.AudioFormat%2529][javadoc]]) to generate a clojure vector of
786 floats which represent the linear PCM encoded waveform of the 786 floats which represent the linear PCM encoded waveform of the
787 sound. With linear PCM (pulse code modulation) -1.0 represents maximum 787 sound. With linear PCM (pulse code modulation) -1.0 represents maximum
788 rarefaction of the air while 1.0 represents maximum compression of the 788 rarefaction of the air while 1.0 represents maximum compression of the
789 air at a given instant. 789 air at a given instant.
820 820
821 ** Physical Ears 821 ** Physical Ears
822 822
823 Together, these three functions define how ears found in a specially 823 Together, these three functions define how ears found in a specially
824 prepared blender file will be translated to =Listener= objects in a 824 prepared blender file will be translated to =Listener= objects in a
825 simulation. =(ears)= extracts all the children of to top level node 825 simulation. =ears= extracts all the children of to top level node
826 named "ears". =(add-ear!)= and =(update-listener-velocity!)= use 826 named "ears". =add-ear!= and =update-listener-velocity!= use
827 =(bind-sense)= to bind a =Listener= object located at the initial 827 =bind-sense= to bind a =Listener= object located at the initial
828 position of an "ear" node to the closest physical object in the 828 position of an "ear" node to the closest physical object in the
829 creature. That =Listener= will stay in the same orientation to the 829 creature. That =Listener= will stay in the same orientation to the
830 object with which it is bound, just as the camera in the [[http://aurellem.localhost/cortex/html/sense.html#sec-4-1][sense binding 830 object with which it is bound, just as the camera in the [[http://aurellem.localhost/cortex/html/sense.html#sec-4-1][sense binding
831 demonstration]]. =OpenAL= simulates the doppler effect for moving 831 demonstration]]. =OpenAL= simulates the doppler effect for moving
832 listeners, =(update-listener-velocity!)= ensures that this velocity 832 listeners, =update-listener-velocity!= ensures that this velocity
833 information is always up-to-date. 833 information is always up-to-date.
834 834
835 #+name: hearing-ears 835 #+name: hearing-ears
836 #+begin_src clojure 836 #+begin_src clojure
837 (defvar 837 (defvar
903 [#^Node creature] 903 [#^Node creature]
904 (for [ear (ears creature)] 904 (for [ear (ears creature)]
905 (hearing-kernel creature ear))) 905 (hearing-kernel creature ear)))
906 #+end_src 906 #+end_src
907 907
908 Each function returned by =(hearing-kernel!)= will register a new 908 Each function returned by =hearing-kernel!= will register a new
909 =Listener= with the simulation the first time it is called. Each time 909 =Listener= with the simulation the first time it is called. Each time
910 it is called, the hearing-function will return a vector of linear PCM 910 it is called, the hearing-function will return a vector of linear PCM
911 encoded sound data that was heard since the last frame. The size of 911 encoded sound data that was heard since the last frame. The size of
912 this vector is of course determined by the overall framerate of the 912 this vector is of course determined by the overall framerate of the
913 game. With a constant framerate of 60 frames per second and a sampling 913 game. With a constant framerate of 60 frames per second and a sampling