Mercurial > audio-send
view ear.html @ 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 source
1 <?xml version="1.0" encoding="utf-8"?>2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">4 <html xmlns="http://www.w3.org/1999/xhtml"5 lang="en" xml:lang="en">6 <head>7 <title>The EARS!</title>8 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>9 <meta name="generator" content="Org-mode"/>10 <meta name="generated" content="2011-09-21 16:38:27 MDT"/>11 <meta name="author" content="Robert McIntyre"/>12 <meta name="description" content="Simulating multiple listeners and the sense of hearing in uMonkeyEngine3"/>13 <meta name="keywords" content=""/>14 <style type="text/css">15 <!--/*--><![CDATA[/*><!--*/16 html { font-family: Times, serif; font-size: 12pt; }17 .title { text-align: center; }18 .todo { color: red; }19 .done { color: green; }20 .tag { background-color: #add8e6; font-weight:normal }21 .target { }22 .timestamp { color: #bebebe; }23 .timestamp-kwd { color: #5f9ea0; }24 .right {margin-left:auto; margin-right:0px; text-align:right;}25 .left {margin-left:0px; margin-right:auto; text-align:left;}26 .center {margin-left:auto; margin-right:auto; text-align:center;}27 p.verse { margin-left: 3% }28 pre {29 border: 1pt solid #AEBDCC;30 background-color: #F3F5F7;31 padding: 5pt;32 font-family: courier, monospace;33 font-size: 90%;34 overflow:auto;35 }36 table { border-collapse: collapse; }37 td, th { vertical-align: top; }38 th.right { text-align:center; }39 th.left { text-align:center; }40 th.center { text-align:center; }41 td.right { text-align:right; }42 td.left { text-align:left; }43 td.center { text-align:center; }44 dt { font-weight: bold; }45 div.figure { padding: 0.5em; }46 div.figure p { text-align: center; }47 textarea { overflow-x: auto; }48 .linenr { font-size:smaller }49 .code-highlighted {background-color:#ffff00;}50 .org-info-js_info-navigation { border-style:none; }51 #org-info-js_console-label { font-size:10px; font-weight:bold;52 white-space:nowrap; }53 .org-info-js_search-highlight {background-color:#ffff00; color:#000000;54 font-weight:bold; }55 /*]]>*/-->56 </style>57 <link rel="stylesheet" type="text/css" href="../aurellem/src/css/aurellem.css"/>58 <script type="text/javascript">59 <!--/*--><![CDATA[/*><!--*/60 function CodeHighlightOn(elem, id)61 {62 var target = document.getElementById(id);63 if(null != target) {64 elem.cacheClassElem = elem.className;65 elem.cacheClassTarget = target.className;66 target.className = "code-highlighted";67 elem.className = "code-highlighted";68 }69 }70 function CodeHighlightOff(elem, id)71 {72 var target = document.getElementById(id);73 if(elem.cacheClassElem)74 elem.className = elem.cacheClassElem;75 if(elem.cacheClassTarget)76 target.className = elem.cacheClassTarget;77 }78 /*]]>*///-->79 </script>81 </head>82 <body>84 <div id="content">88 <div class="header">89 <div class="float-right">90 <!--91 <form>92 <input type="text"/><input type="submit" value="search the blog »"/>93 </form>94 -->95 </div>97 <h1>aurellem <em>☉</em></h1>98 <ul class="nav">99 <li><a href="/">read the blog »</a></li>100 <!-- li><a href="#">learn about us »</a></li-->101 </ul>102 </div>104 <h1 class="title">The EARS!</h1>105 <div class="author">Written by <author>Robert McIntyre</author></div>116 <div id="table-of-contents">117 <h2>Table of Contents</h2>118 <div id="text-table-of-contents">119 <ul>120 <li><a href="#sec-1">1 Ears! </a></li>121 </ul>122 </div>123 </div>125 <div id="outline-container-1" class="outline-2">126 <h2 id="sec-1"><span class="section-number-2">1</span> Ears! </h2>127 <div class="outline-text-2" id="text-1">130 <p>131 I want to be able to place ears in a similiar manner to how I place132 the eyes. I want to be able to place ears in a unique spatial133 position, and recieve as output at every tick the FFT of whatever134 signals are happening at that point.135 </p>139 <pre class="src src-clojure">(<span style="color: #9b30ff;">ns</span> body.ear)140 (<span style="color: #da70d6;">use</span> 'cortex.world)141 (<span style="color: #da70d6;">use</span> 'cortex.import)142 (<span style="color: #da70d6;">use</span> 'clojure.contrib.def)143 (cortex.import/mega-import-jme3)144 (rlm.rlm-commands/help)145 (<span style="color: #9b30ff;">import</span> java.nio.ByteBuffer)146 (<span style="color: #9b30ff;">import</span> java.awt.image.BufferedImage)147 (<span style="color: #9b30ff;">import</span> java.awt.Color)148 (<span style="color: #9b30ff;">import</span> java.awt.Dimension)149 (<span style="color: #9b30ff;">import</span> java.awt.Graphics)150 (<span style="color: #9b30ff;">import</span> java.awt.Graphics2D)151 (<span style="color: #9b30ff;">import</span> java.awt.event.WindowAdapter)152 (<span style="color: #9b30ff;">import</span> java.awt.event.WindowEvent)153 (<span style="color: #9b30ff;">import</span> java.awt.image.BufferedImage)154 (<span style="color: #9b30ff;">import</span> java.nio.ByteBuffer)155 (<span style="color: #9b30ff;">import</span> javax.swing.JFrame)156 (<span style="color: #9b30ff;">import</span> javax.swing.JPanel)157 (<span style="color: #9b30ff;">import</span> javax.swing.SwingUtilities)158 (<span style="color: #9b30ff;">import</span> javax.swing.ImageIcon)159 (<span style="color: #9b30ff;">import</span> javax.swing.JOptionPane)160 (<span style="color: #9b30ff;">import</span> java.awt.image.ImageObserver)161 </pre>166 <p>167 JMonkeyEngine3's audio system works as follows:168 first, an appropiate audio renderer is created during initialization169 and depending on the context. On my computer, this is the170 LwjglAudioRenderer.171 </p>172 <p>173 The LwjglAudioRenderer sets a few internal state variables depending174 on what capabilities the audio system has.175 </p>176 <p>177 may very well need to make my own AudioRenderer178 </p>182 <pre class="src src-clojure">(<span style="color: #9b30ff;">in-ns</span> 'body.ear)183 (<span style="color: #9b30ff;">import</span> 'com.jme3.capture.SoundProcessor)186 (<span style="color: #9b30ff;">defn</span> <span style="color: #0000ff;">sound-processor</span>187 <span style="color: #EB4264;">"deals with converting ByteBuffers into Arrays of bytes so that the</span>188 <span style="color: #EB4264;"> continuation functions can be defined in terms of immutable stuff."</span>189 [continuation]190 (<span style="color: #da70d6;">proxy</span> [SoundProcessor] []191 (cleanup [])192 (process193 [<span style="color: #228b22;">#^ByteBuffer</span> audioSamples numSamples]194 (no-exceptions195 (<span style="color: #9b30ff;">let</span> [byte-array (<span style="color: #da70d6;">byte-array</span> numSamples)]196 (.get audioSamples byte-array 0 numSamples)197 (continuation198 (<span style="color: #da70d6;">vec</span> byte-array)))))))201 (<span style="color: #9b30ff;">defn</span> <span style="color: #0000ff;">add-ear</span>202 <span style="color: #EB4264;">"add an ear to the world. The continuation function will be called</span>203 <span style="color: #EB4264;"> on the FFT or the sounds which the ear hears in the given</span>204 <span style="color: #EB4264;"> timeframe. Sound is 3D."</span>205 [world listener continuation]206 (<span style="color: #9b30ff;">let</span> [renderer (.getAudioRenderer world)]207 (.addListener renderer listener)208 (.registerSoundProcessor renderer listener209 (sound-processor continuation))210 listener))212 </pre>220 <pre class="src src-clojure">(<span style="color: #9b30ff;">ns</span> test.hearing)221 (<span style="color: #da70d6;">use</span> 'cortex.world)222 (<span style="color: #da70d6;">use</span> 'cortex.import)223 (<span style="color: #da70d6;">use</span> 'clojure.contrib.def)224 (<span style="color: #da70d6;">use</span> 'body.ear)225 (cortex.import/mega-import-jme3)226 (rlm.rlm-commands/help)228 (<span style="color: #9b30ff;">defn</span> <span style="color: #0000ff;">setup-fn</span> [world]229 (<span style="color: #9b30ff;">let</span> [listener (Listener.)]230 (add-ear world listener #(<span style="color: #da70d6;">println</span> (<span style="color: #da70d6;">nth</span> % 0)))))232 (<span style="color: #9b30ff;">defn</span> <span style="color: #0000ff;">play-sound</span> [node world value]233 (<span style="color: #9b30ff;">if</span> (<span style="color: #da70d6;">not</span> value)234 (<span style="color: #9b30ff;">do</span>235 (.playSource (.getAudioRenderer world) node))))237 (<span style="color: #9b30ff;">defn</span> <span style="color: #0000ff;">test-world</span> []238 (<span style="color: #9b30ff;">let</span> [node1 (AudioNode. (asset-manager) <span style="color: #3AA221;">"Sounds/pure.wav"</span> false false)]239 (world240 (Node.)241 {<span style="color: #3AA221;">"key-space"</span> (<span style="color: #da70d6;">partial</span> play-sound node1)}242 setup-fn243 no-op244 )))247 </pre>256 </div>257 </div>258 <div id="postamble">259 <p class="date">Date: 2011-09-21 16:38:27 MDT</p>260 <p class="author">Author: Robert McIntyre</p>261 <p class="creator">Org version 7.6 with Emacs version 23</p>262 <a href="http://validator.w3.org/check?uri=referer">Validate XHTML 1.0</a>263 </div>264 </div>265 </body>266 </html>