You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
OpenAudio_ArduinoLibrary/docs/index.html

1477 lines
66 KiB

<!DOCTYPE html>
<!-- vim: set ts=4: -->
<html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<!--
Modified from original Node-Red source, for audio system visualization
Copyright 2013 IBM Corp.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<head>
<title>Audio System Design Tool for Tympan Audio Library</title>
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="jquery/css/smoothness/jquery-ui-1.10.3.custom.min.css" rel="stylesheet" media="screen">
<link rel="stylesheet" type="text/css" href="orion/built-editor.css"/>
<link rel="stylesheet" type="text/css" href="font-awesome/css/font-awesome.min.css"/>
<link rel="stylesheet" href="style.css">
<style>
table.doc {border-spacing:3px; border-collapse:separate; font-size: 80%}
tr.top {background-color:#C0C0C0}
tr.odd {background-color:#F0F0F0}
tr.even {background-color:#E0E0E0}
p.func {padding-bottom:0; margin:0px}
p.desc {padding-left:2em; margin:0px; padding-top:0.2em; padding-bottom:0.8em; font-size:0.75em}
p.exam {padding-left:2em; text-indent:-1.2em; margin:0px; padding-top:0; padding-bottom:0.5em; font-size:0.75em; font-weight:bold}
pre.desc {padding-left:3em; margin:0px; padding-top:0em; padding-bottom:0.8em; font-size:0.75em;
background-color:#FFFFFF; border:0px; line-height:100%;
}
span.indent {padding-left:2em}
span.literal {color: #006699}
span.comment {color: #777755}
span.keyword {color: #cc6600}
span.function {color: #996600}
span.mainfunction {color: #993300; font-weight: bolder}
</style>
</head>
<body spellcheck="false">
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<span class="brand">Audio Design Tool for <a href="http://tympan.org" target="_blank">Tympan Audio System</a></span>
<div class="btn-group pull-right">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#"><i class="icon-align-justify"></i> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a id="btn-sidebar" tabindex="-1" href="#"><i class="icon-ok pull-right"></i><i class="icon-list-alt"></i> Sidebar</a></li>
<li class="divider"></li>
<!-- <li><a id="btn-node-status" tabindex="-1" href="#"><i class="icon-ok pull-right"></i><i class="icon-info-sign"></i> Node Status</a></li>
<li class="divider"></li>
-->
<!--
<li class="dropdown-submenu pull-left"><a tabindex="-1" href="#"><i class="icon-edit"></i> Import from...</a>
<ul class="dropdown-menu">
<li><a id="btn-import" tabindex="-1" href="#"><i class="icon-edit"></i> Clipboard...</a></li>
<li id="flow-menu-parent" class="dropdown-submenu pull-left">
<a tabindex="-1" href="#"><i class="icon-book"></i> Library</a>
<ul class="dropdown-menu"></ul>
</li>
</ul>
</li>
<li id="li-menu-export" class="dropdown-submenu disabled pull-left"><a tabindex="-1" href="#"><i class="icon-share"></i> Export to...</a>
<ul class="dropdown-menu">
<li id="li-menu-export-clipboard" class="disabled"><a id="btn-export-clipboard" tabindex="-1" href="#"><i class="icon-share"></i> Clipboard...</a></li>
<li id="li-menu-export-library" class="disabled"><a id="btn-export-library" tabindex="-1" href="#"><i class="icon-book"></i> Library...</a></li>
</ul>
</li>
<li class="divider"></li>
-->
<!--
<li><a id="btn-config-nodes" tabindex="-1" href="#"><i class="icon-th-list"></i> Configuration nodes...</a></li>
<li class="divider"></li>
-->
<!--
<li class="dropdown-submenu pull-left"><a tabindex="-1" href="#"><i class="icon-th-large"></i> Workspaces</a>
<ul id="workspace-menu-list" class="dropdown-menu">
<li><a id="btn-workspace-add" tabindex="-1" href="#"><i class="icon-plus"></i> Add</a></li>
<li><a id="btn-workspace-edit" tabindex="-1" href="#"><i class="icon-edit"></i> Rename</a></li>
<li><a id="btn-workspace-delete" tabindex="-1" href="#"><i class="icon-minus"></i> Delete</a></li>
<li class="divider"></li>
</ul>
</li>
<li class="divider"></li>-->
<li><a id="btn-keyboard-shortcuts" tabindex="-1" href="#"><i class="icon-question-sign"></i> Keyboard Shortcuts</a></li>
<li><a id="btn-help" tabindex="-1" href="http://node-red.github.io/docs" target="_blank"><i class="icon-question-sign"></i> Help...</a></li>
</ul>
</div>
<div class="btn-group pull-left">
<a id="btn-deploy" class="btn action-deploy disabled" href="#"><i id="btn-icn-deploy" class="icon-upload"></i>Export</a>
<a id="btn-import" class="btn action-import disabled" href="#"><i id="btn-icn-download" class="icon-download"></i>Import</a>
</div>
</div>
</div>
</div>
<div id="main-container" class="sidebar-closed">
<div id="palette">
<img src="img/spin.svg" class="palette-spinner"/>
<div id="palette-container" class="palette-scroll">
</div>
<div id="palette-search">
<i class="icon-search"></i><input id="palette-search-input" type="text" placeholder="filter"><a href="#" id="palette-search-clear"><i class="icon-remove"></i></a></input>
</div>
</div><!-- /palette -->
<div id="workspace">
<ul id="workspace-tabs"></ul>
<!--<div id="workspace-add-tab"><a id="btn-workspace-add-tab" href="#"><i class="icon-plus"></i></a></div>-->
<div id="chart"></div>
<div id="workspace-toolbar">
<div class="btn-group">
<a class="btn btn-small" href="#"><i class="icon-zoom-out"></i></a>
<a class="btn btn-small" href="#"><i class="icon-th"></i></a>
<a class="btn btn-small" href="#"><i class="icon-zoom-in"></i></a>
</div>
</div>
</div>
<div id="chart-zoom-controls">
<div class="btn-group">
<a class="btn btn-mini" id="btn-zoom-out" href="#"><i class="icon-zoom-out"></i></a>
<a class="btn btn-mini" id="btn-zoom-zero" href="#"><i class="icon-th"></i></a>
<a class="btn btn-mini" id="btn-zoom-in" href="#"><i class="icon-zoom-in"></i></a>
</div>
</div>
<div id="sidebar">
<ul id="sidebar-tabs"></ul>
<div id="sidebar-content"></div>
</div>
<div id="sidebar-separator"></div>
</div>
<div id="notifications"></div>
<div id="dropTarget"><div>Drop the flow here</div></div>
<div id="dialog" class="hide"><form id="dialog-form" class="form-horizontal"></form></div>
<div id="node-config-dialog" class="hide"><form id="dialog-config-form" class="form-horizontal"></form><div class="form-tips" id="node-config-dialog-user-count"></div></div>
<div id="node-dialog-confirm-deploy" class="hide">
<form class="form-horizontal">
<div id="node-dialog-confirm-deploy-config" style="text-align: center; padding-top: 30px;">
Some of the nodes are not properly configured. Are you sure you want to deploy?
</div>
<div id="node-dialog-confirm-deploy-unknown" style="text-align: center; padding-top: 10px;">
The workspace contains some unknown node types:
<ul style="width: 300px; margin: auto; text-align: left;" id="node-dialog-confirm-deploy-unknown-list"></ul>
Are you sure you want to deploy?
</div>
</form>
</div>
<div id="node-dialog-error-deploy" class="hide">
<form class="form-horizontal">
<div id="node-dialog-error-deploy-noio" style="text-align: center; padding-top: 10px;">
<p>The workspace contains no input/output nodes!</p>
<p>You need an input or an output to export the data!</p>
<p>Without such a input/output function the exported
code will not run properly!</p>
</div>
</form>
</div>
<div id="node-help" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="node-help-label" aria-hidden="true">
<div class="modal-header">
<h5 id="node-help-label">Keyboard Shortcuts <span style="float: right;"><a href="http://node-red.github.io/docs" target="_blank">Open help in new window &raquo;</a></span></h5>
</div>
<div class="modal-body">
<table>
<tr>
<td><span class="help-key">?</span></td><td>Help</td>
<td><span class="help-key">Ctrl</span> <span class="help-key">a</span></td><td>Select all nodes</td>
</tr>
<tr>
<td><span class="help-key">Ctrl</span> <span class="help-key">Space</span></td><td>Toggle sidebar</td>
<td><span class="help-key">Shift</span> <span class="help-key">Click</span></td><td>Select all connected nodes</td>
</tr>
<tr>
<td><span class="help-key">Ctrl</span> <span class="help-key">z</span></td><td>Undo</td>
<td><span class="help-key">Ctrl</span> <span class="help-key">Click</span></td><td>Add/remove node from selection</td>
</tr>
<tr>
<td></td><td></td>
<td><span class="help-key">Delete</span></td><td>Delete selected nodes or link</td>
</tr>
<tr>
<td><span class="help-key">Ctrl</span> <span class="help-key">x</span></td><td>Cut selected nodes</td>
<td></td><td></td>
</tr>
<tr>
<td><span class="help-key">Ctrl</span> <span class="help-key">c</span></td><td>Copy selected nodes</td>
<td><span class="help-key">Ctrl</span> <span class="help-key">v</span></td><td>Paste nodes</td>
</tr>
<tr>
<td><span class="help-key">Ctrl</span> <span class="help-key">i</span></td><td>Import nodes</td>
<td><span class="help-key">Ctrl</span> <span class="help-key">e</span></td><td>Export selected nodes</td>
</tr>
<tr>
<td colspan="2"></td>
</tr>
<tr>
<td><span class="help-key">Ctrl</span> <span class="help-key">+</span></td><td>Zoom in</td>
<td><span class="help-key">Ctrl</span> <span class="help-key">-</span></td><td>Zoom out</td>
</tr>
</table>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
</div>
</div>
<div id="node-dialog-library-save-confirm" class="hide">
<form class="form-horizontal">
<div style="text-align: center; padding-top: 30px;">
A <span id="node-dialog-library-save-type"></span> called <span id="node-dialog-library-save-name"></span> already exists. Overwrite?
</div>
</form>
</div>
<div id="node-dialog-library-save" class="hide">
<form class="form-horizontal">
<div class="form-row">
<label for="node-dialog-library-save-folder"><i class="icon-folder-open"></i> Folder</label>
<input type="text" id="node-dialog-library-save-folder" placeholder="Folder">
</div>
<div class="form-row">
<label for="node-dialog-library-save-filename"><i class="icon-file"></i> Filename</label>
<input type="text" id="node-dialog-library-save-filename" placeholder="Filename">
</div>
</form>
</div>
<div id="node-dialog-library-lookup" class="hide">
<form class="form-horizontal">
<div class="form-row">
<ul id="node-dialog-library-breadcrumbs" class="breadcrumb">
<li class="active"><a href="#">Library</a></li>
</ul>
</div>
<div class="form-row">
<div style="vertical-align: top; display: inline-block; height: 100%; width: 30%; padding-right: 20px;">
<div id="node-select-library" style="border: 1px solid #999; width: 100%; height: 100%; overflow:scroll;"><ul></ul></div>
</div>
<div style="vertical-align: top; display: inline-block;width: 65%; height: 100%;">
<div style="height: 100%; width: 95%;" class="node-text-editor" id="node-select-library-text" ></div>
</div>
</div>
</form>
</div>
<div id="node-dialog-rename-workspace" class="hide">
<form class="form-horizontal">
<div class="form-row">
<label for="node-input-workspace-name" ><i class="icon-tag"></i> Name:</label>
<input type="text" id="node-input-workspace-name">
</div>
</form>
</div>
<div id="node-dialog-delete-workspace" class="hide">
<form class="form-horizontal">
<div style="text-align: center; padding-top: 30px;">
Are you sure you want to delete '<span id="node-dialog-delete-workspace-name"></span>'?
</div>
</form>
</div>
<script type="text/x-red" data-template-name="export-clipboard-dialog">
<div class="form-row">
<label for="node-input-export" style="display: block; width:100%;"><i class="icon-share"></i> Source Code:</label>
<textarea readonly style="font-family: monospace; font-size: 12px; background:rgb(226, 229, 255); padding-left: 0.5em;" class="input-block-level" id="node-input-export" rows="12"></textarea>
</div>
<div class="form-tips">
Select the text above and copy to the clipboard with Ctrl-A Ctrl-C.
</div>
</script>
<script type="text/x-red" data-template-name="export-library-dialog">
<div class="form-row">
<label for="node-input-filename" ><i class="icon-tag"></i> Filename:</label>
<input type="text" id="node-input-filename" placeholder="Filename">
</div>
</script>
<script type="text/x-red" data-template-name="import-dialog">
<div class="form-row">
<label for="node-input-import"><i class="icon-share"></i>Nodes:</label>
<textarea style="font-family: monospace; font-size: 12px; background:rgb(226, 229, 255); padding-left: 0.5em;" class="input-block-level" id="node-input-import" rows="5" placeholder="Paste nodes here, or lookup in the library. When importing Arduino code, the whole flow will be replaced."></textarea>
</div>
<div class="form-tips">
<label for="node-input-arduino" style="font-size: 13px; padding: 2px 0px 0px 4px;">
<input style="margin-bottom: 4px; margin-right: 4px;" type="checkbox" id="node-input-arduino" checked="checked" class="input-block-level" />
&nbsp;Import copied code from the Arduino IDE
</label>
</div>
</script>
<script src="jquery/js/jquery-1.9.1.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<script src="jquery/js/jquery-ui-1.10.3.custom.min.js"></script>
<script src="jquery/js/jquery.ui.touch-punch.min.js"></script>
<script src="orion/built-editor.min.js"></script>
<script src="red/d3/d3.v3.min.js"></script>
<script src="red/main.js"></script>
<script src="red/ui/state.js"></script>
<script src="red/nodes.js"></script>
<script src="red/storage.js"></script>
<script src="red/history.js"></script>
<script src="red/ui/keyboard.js"></script>
<script src="red/ui/tabs.js"></script>
<script src="red/ui/view.js"></script>
<script src="red/ui/sidebar.js"></script>
<script src="red/ui/palette.js"></script>
<script src="red/ui/tab-info.js"></script>
<script src="red/ui/tab-config.js"></script>
<script src="red/ui/editor.js"></script>
<script src="red/ui/library.js"></script>
<script src="red/ui/notifications.js"></script>
<script src="red/ui/touch/radialMenu.js"></script>
<!--
TODO: generate some or all of this automatically from the C++ source
-->
<!--
TODO: add a field for maximum instance count
-->
<!--
TODO: add a field for exclusive to other objects (not allowed if they're used)
-->
<!--
TODO: add "parameters" fields, to replace the form html stuff
-->
<script type="text/x-red" data-container-name="NodeDefinitions">
{"nodes":[
{"type":"AudioControlTLV320AIC3206","data":{"defaults":{"name":{"value":"new"}},"shortName":"tlv320aic3206","inputs":"0","outputs":"0","category":"control-function","color":"#E6E0F8","icon":"debug.png"}},
{"type":"AudioInputI2S_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"i2sAudioIn","inputs":"0","outputs":"2","category":"input-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputI2S_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"i2sAudioOut","inputs":"2","outputs":"0","category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioCalcEnvelope_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"calcEnvelope","inputs":"1","outputs":"1","category":"calc-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioCalcGainWDRC_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"calcGainWDRC","inputs":"1","outputs":"1","category":"calc-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioConvert_I16toF32","data":{"defaults":{"name":{"value":"new"}},"shortName":"I16toF32","inputs":"1","outputs":"1","category":"convert-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioConvert_F32toI16","data":{"defaults":{"name":{"value":"new"}},"shortName":"F32toI16","inputs":"1","outputs":"1","category":"convert-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectCompWDRC_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"compWDRC","inputs":"1","outputs":"1","category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectCompressor_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"compressor","inputs":"1","outputs":"1","category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectEmpty_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"empty","inputs":"1","outputs":"1","category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioEffectGain_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"gain","inputs":"1","outputs":"1","category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioFilterFIR_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"fir","inputs":"1","outputs":"1","category":"filter-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioFilterIIR_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"iir","inputs":"1","outputs":"1","category":"filter-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioMixer4_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"mixer4","inputs":"4","outputs":"1","category":"mixer-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioMixer8_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"mixer8","inputs":"8","outputs":"1","category":"mixer-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioMultiply_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"multiply","inputs":"2","outputs":"1","category":"effect-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSettings_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"settings","inputs":"NaN","outputs":"NaN","category":"settings-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSettings_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"settings","inputs":"NaN","outputs":"NaN","category":"settings-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioControlSGTL5000","data":{"defaults":{"name":{"value":"new"}},"shortName":"sgtl5000","inputs":"0","outputs":"0","category":"control-function","color":"#E6E0F8","icon":"debug.png"}},
{"type":"AudioInputUSB","data":{"defaults":{"name":{"value":"new"}},"shortName":"usbAudioIn","inputs":"0","outputs":"2","category":"input-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioOutputUSB","data":{"defaults":{"name":{"value":"new"}},"shortName":"usbAudioOut","inputs":"2","outputs":"0","category":"output-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioPlayQueue_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"playQueue","inputs":"0","outputs":"1","category":"play-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioRecordQueue_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"recordQueue","inputs":"1","outputs":"0","category":"record-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthNoisePink_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"noisePink","inputs":"0","outputs":"1","category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthWaveformSine_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"sine","inputs":"0","outputs":"1","category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthWaveform_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"waveform","inputs":"0","outputs":"1","category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}},
{"type":"AudioSynthNoiseWhite_F32","data":{"defaults":{"name":{"value":"new"}},"shortName":"noiseWhite","inputs":"0","outputs":"1","category":"synth-function","color":"#E6E0F8","icon":"arrow-in.png"}}
]}
</script>
<script type="text/x-red" data-template-name="AudioControlTLV320AIC3206">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioControlTLV320AIC3206">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Control the TLV320AIC3206 chip that is at the heart of the Tympan audio interface.
The TLV320AIC3206 is used in slave mode, where Teensy controls
all clocks and I2S timing in order to get the audio data to and from the chip.
</p>
<p align=center><img src="img/TympanAudioInterface-Features.jpg"></p>
</div>
<h3>Audio Connections</h3>
<p>This object has no audio inputs or outputs. Separate i2s objects
are used to send and receive audio data. I2S master mode objects
must be used, because this object configures the TLV320AIC3206 in slave
mode, where it depends on Teensy to provide all I2S clocks.
This object controls
how the TLV320AIC3206 will use those I2S audio streams.</p>
<h3>Functions</h3>
<p>These are the most commonly used TLV320AIC3206 functions.</p>
<p class=func><span class=keyword>enable</span>();</p>
<p class=desc>Start the TLV320AIC3206 with default configuration settings.
This function should be called first.
</p>
<p class=func><span class=keyword>volume_dB</span>(float value_dB);</p>
<p class=desc>Set DAC output volume level. Range is -63.6dB to +24dB, in
0.5dB steps. Decimal values that are not increments of 0.5 will be rounded
to the nearest step.
</p>
<p class=func><span class=keyword>inputSelect</span>(int value);</p>
<p class=desc>Select which input to use:</p>
<p class=desc>TYMPAN_INPUT_JACK_AS_MIC - Use Mic Jack, turn MIC BIAS on @2.5V</p>
<p class=desc>TYMPAN_INPUT_JACK_AS_LINEIN - Use Mic Jack as Line In - MIC BIAS off</p>
<p class=desc>TYMPAN_INPUT_ON_BOARD_MIC - use on-board microphones, BIAS off</p>
<p class=desc>TYMPAN_INPUT_LINE_IN - use the IN1 solder pads on the TYMPAN</p>
<p class=func><span class=keyword>setInputGain_dB</span>(float value_dB);</p>
<p class=desc>When using the microphone input, set the amplifier gain.
Range is 0dB to 47.5dB in 0.5dB steps. Decimal values that are not
increments of 0.5 will be rounded to the nearest step.
</p>
<h3>Examples</h3>
<p>This example demonstrates the basic features of this module:
</p>
<p class=exam>File &gt; Examples &gt; OpenAudio_ArduinoLibrary &gt; Tympan_TLV320AIC3206
</p>
<h3>Notes</h3>
<p>TODO: Add more examples, following example above.
</p>
</script>
<script type="text/x-red" data-help-name="AudioInputI2S_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Receive 16 bit stereo audio from the
<a href="http://www.pjrc.com/store/teensy3_audio.html" target="_blank">audio shield</a>
or another I2S device, using I2S master mode.</p>
<p align=center><img src="img/audioshield_inputs.jpg"></p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>Left Channel</td></tr>
<tr class=odd><td align=center>Out 1</td><td>Right Channel</td></tr>
</table>
<h3>Functions</h3>
<p>This object has no functions to call from the Arduino sketch. It
simply streams data from the I2S hardware to its 2 output ports.</p>
<h3>Hardware</h3>
<p align=center><img src="img/audioshield_backside.jpg"></p>
<p>The I2S signals are used in "master" mode, where Teensy creates
all 3 clock signals and controls all data timing.</p>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Pin</th><th>Signal</th><th>Direction</th></tr>
<tr class=odd><td align=center>9</td><td>BCLK</td><td>Output</td></tr>
<tr class=odd><td align=center>11</td><td>MCLK</td><td>Output</td></tr>
<tr class=odd><td align=center>13</td><td>RX</td><td>Input</td></tr>
<tr class=odd><td align=center>23</td><td>LRCLK</td><td>Output</td></tr>
</table>
<p>Audio from
master mode I2S may be used in the same project as ADC, DAC and
PWM signals, because all remain in sync to Teensy's timing</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; PassThroughStereo
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Recorder
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; PeakMeterStereo
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; FFT
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; SpectrumAnalyzerBasic
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Effects &gt; Chorus
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Effects &gt; Flange
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Effects &gt; Filter
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Effects &gt; Filter_FIR
</p>
<h3>Notes</h3>
<p>Normally, this object is used with the Audio Shield, which
is controlled separately by the "sgtl5000" object.</p>
<p>Only one I2S input and one I2S output object may be used. Master
and slave modes may not be mixed (both must be of the same type).
</p>
<p>I2S master objects can be used together with non-I2S input and output
objects, for simultaneous audio streaming on different hardware.</p>
</script>
<script type="text/x-red" data-template-name="AudioInputI2S_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioOutputI2S_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Transmit 16 bit stereo audio to the
<a href="http://www.pjrc.com/store/teensy3_audio.html" target="_blank">audio shield</a>
or another I2S device, using I2S master mode.</p>
<p align=center><img src="img/audioshield_outputs.jpg"></p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>In 0</td><td>Left Channel</td></tr>
<tr class=odd><td align=center>In 1</td><td>Right Channel</td></tr>
</table>
<h3>Functions</h3>
<p>This object has no functions to call from the Arduino sketch. It
simply streams data from its 2 input ports to the I2S hardware.</p>
<h3>Hardware</h3>
<p align=center><img src="img/audioshield_backside.jpg"></p>
<p>The I2S signals are used in "master" mode, where Teensy creates
all 3 clock signals and controls all data timing.</p>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Pin</th><th>Signal</th><th>Direction</th></tr>
<tr class=odd><td align=center>9</td><td>BCLK</td><td>Output</td></tr>
<tr class=odd><td align=center>11</td><td>MCLK</td><td>Output</td></tr>
<tr class=odd><td align=center>22</td><td>TX</td><td>Output</td></tr>
<tr class=odd><td align=center>23</td><td>LRCLK</td><td>Output</td></tr>
</table>
<p>Audio from
master mode I2S may be used in the same project as ADC, DAC and
PWM signals, because all remain in sync to Teensy's timing</p>
<h3>Examples</h3>
<p>Nearly all the examples use this object. Here are some of the highlights:</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; PassThroughStereo
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; SamplePlayer
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Recorder
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; WavFilePlayer
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Effects &gt; Chorus
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Synthesis &gt; PlaySynthMusic
</p>
<h3>Notes</h3>
<p>Normally, this object is used with the Audio Shield, which
is controlled separately by the "sgtl5000" object.</p>
<p>Only one I2S input and one I2S output object may be used. Master
and slave modes may not be mixed (both must be of the same type).
</p>
</script>
<script type="text/x-red" data-template-name="AudioOutputI2S_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioCalcEnvelope_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioCalcGainWDRC_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioConvert_I16toF32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioConvert_F32toI16 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioEffectCompWDRC_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioEffectCompressor_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioEffectEmpty_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioEffectGain_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioFilterFIR_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Finite impulse response filter, useful for all sorts of filtering.
</p>
<p align=center><img src="img/fir_filter.png"></p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>In 0</td><td>Signal to be filtered</td></tr>
<tr class=odd><td align=center>Out 0</td><td>Filtered Signal Output</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>begin</span>(array, length);</p>
<p class=desc>Initialize the filter. The array must be 16 bit integers (the
filter's impulse response), and
length indicates the number of points in the array. Array may also be
FIR_PASSTHRU (length = 0), to directly pass the input to output without
filtering.
</p>
<p class=func><span class=keyword>end</span>();</p>
<p class=desc>Turn the filter off.
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; Effects &gt; Filter_FIR
</p>
<h3>Known Issues</h3>
<p>Your filter's impulse response array must have an even length. If you have
add odd number of taps, you must add an extra zero to increase the length
to an even number.
</p>
<p>The minimum number of taps is 4. If you use less, add extra zeros to increase
the length to 4.
</p>
<p>The impulse response must be given in reverse order. Many filters have
symetrical impluse response, making this a non-issue. If your filter has
a non-symetrical response, make sure the data is in reverse time order.
</p>
<h3>Notes</h3>
<p>FIR filters requires more CPU time than Biquad (IIR), but they can
implement filters with better phase response.
</p>
<p>A 100 point filter requires 9% CPU time on Teensy 3.1. The maximum
supported filter length is 200 points.
</p>
<p>The free
<a href="http://t-filter.engineerjs.com/" target="_blank"> TFilter Design Tool</a>
can be used to create the impulse response array. Be sure to set the sampling
frequency to 44117 HZ (it defaults to only 2000 Hz) and the output type to "int" (16 bit).
</p>
<p>
If you use TFilter Design's "C/C++ array" option, it's output has "int" definition, which
is 32 bits on Teensy 3.1. Edit "int" to "short" for an array of 16 bit numbers,
and add "const" to avoid consuming extra RAM.
</p>
</script>
<script type="text/x-red" data-template-name="AudioFilterFIR_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioFilterIIR_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioMixer4_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Combine up to 4 audio signals together, each with adjustable gain.
All channels support signal attenuation or amplification.</p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>In 0</td><td>Input signal #1</td></tr>
<tr class=odd><td align=center>In 1</td><td>Input signal #2</td></tr>
<tr class=odd><td align=center>In 2</td><td>Input signal #3</td></tr>
<tr class=odd><td align=center>In 3</td><td>Input signal #4</td></tr>
<tr class=odd><td align=center>Out 0</td><td>Sum of all inputs</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>gain</span>(channel, level);</p>
<p class=desc>Adjust the amplification or attenuation. "channel" must
be 0 to 3. "level" may be any floating point number from 0 to 32767.
1.0 passes the signal through directly. Level of 0 shuts the channel
off completely. Between 0 to 1.0 attenuates the signal, and above
1.0 amplifies it. All 4 channels have separate settings.
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; SamplePlayer
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Synthesis &gt; PlaySynthMusic
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; SpectrumAnalyzerBasic
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; DialTone_Serial
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; MemoryAndCpuUsage
</p>
<h3>Notes</h3>
<p>Signal clipping can occur when any channel has gain greater than 1.0,
or when multiple signals add together to greater than 1.0.</p>
<p>More than 4 channels may be combined by connecting multiple mixers
in tandem. For example, a 16 channel mixer may be built using 5
mixers, where the fifth mixer combines the outputs of the first 4.
</p>
</script>
<script type="text/x-red" data-template-name="AudioMixer4_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioMixer8_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioMultiply_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioSettings_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-template-name="AudioSettings_F32 ">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioControlSGTL5000">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Control the SGTL5000 chip on the
<a href="http://www.pjrc.com/store/teensy3_audio.html" target="_blank">audio shield</a>.
SGTL5000 is always used in slave mode, where Teensy controls
all I2S timing.
</p>
<p align=center><img src="img/sgtl5000closeup.jpg"></p>
</div>
<h3>Audio Connections</h3>
<p>This object has no audio inputs or outputs. Separate i2s objects
are used to send and receive audio data. I2S master mode objects
must be used, because this object configures the SGTL5000 in slave
mode, where it depends on Teensy to provide all I2S clocks.
This object controls
how the SGTL5000 will use those I2S audio streams.</p>
<h3>Functions</h3>
<p>These are the most commonly used SGTL5000 functions.</p>
<p class=func><span class=keyword>enable</span>();</p>
<p class=desc>Start the SGTL5000. This function should be called first.
</p>
<p class=func><span class=keyword>volume</span>(level);</p>
<p class=desc>Set the headphone volume level. Range is 0 to 1.0, but
0.8 corresponds to the maximum undistorted output for a full scale
signal. Usually 0.5 is a comfortable listening level. The line
level outputs are <em>not</em> changed by this function.
</p>
<p class=func><span class=keyword>inputSelect</span>(input);</p>
<p class=desc>Select which input to use: AUDIO_INPUT_LINEIN or AUDIO_INPUT_MIC.
</p>
<p class=func><span class=keyword>micGain</span>(dB);</p>
<p class=desc>When using the microphone input, set the amplifier gain.
The input number is in decibels, from 0 to 63.
</p>
<h3>Signal Levels</h3>
<p>The default signal levels should be used for most applications,
but these functions allow you to customize the analog signals.</p>
<p class=func><span class=keyword>muteHeadphone</span>();</p>
<p class=desc>Silence the headphone output.
</p>
<p class=func><span class=keyword>unmuteHeadphone</span>();</p>
<p class=desc>Turn the headphone output on.
</p>
<p class=func><span class=keyword>muteLineout</span>();</p>
<p class=desc>Silence the line level outputs.
</p>
<p class=func><span class=keyword>unmuteLineout</span>();</p>
<p class=desc>Turn the line level outputs on.
</p>
<p class=func><span class=keyword>lineInLevel</span>(both);</p>
<p class=desc style="padding-bottom:0.2em;">Adjust the sensitivity of the line-level inputs.
Fifteen settings are possible:
</p>
<pre class="desc">
0: 3.12 Volts p-p
1: 2.63 Volts p-p
2: 2.22 Volts p-p
3: 1.87 Volts p-p
4: 1.58 Volts p-p
5: 1.33 Volts p-p (default)
6: 1.11 Volts p-p
7: 0.94 Volts p-p
8: 0.79 Volts p-p
9: 0.67 Volts p-p
10: 0.56 Volts p-p
11: 0.48 Volts p-p
12: 0.40 Volts p-p
13: 0.34 Volts p-p
14: 0.29 Volts p-p
15: 0.24 Volts p-p
</pre>
<p class=func><span class=keyword>lineInLevel</span>(left, right);</p>
<p class=desc>Adjust the sensitivity of the line-level inputs, with different
settings for left and right. The same 15 settings are available.
</p>
<p class=func><span class=keyword>lineOutLevel</span>(both);</p>
<p class=desc style="padding-bottom:0.2em;">Adjust the line level output
voltage range. The following settings are possible:
</p>
<pre class="desc">
13: 3.16 Volts p-p
14: 2.98 Volts p-p
15: 2.83 Volts p-p
16: 2.67 Volts p-p
17: 2.53 Volts p-p
18: 2.39 Volts p-p
19: 2.26 Volts p-p
20: 2.14 Volts p-p
21: 2.02 Volts p-p
22: 1.91 Volts p-p
23: 1.80 Volts p-p
24: 1.71 Volts p-p
25: 1.62 Volts p-p
26: 1.53 Volts p-p
27: 1.44 Volts p-p
28: 1.37 Volts p-p
29: 1.29 Volts p-p (default)
30: 1.22 Volts p-p
31: 1.16 Volts p-p
</pre>
<p class=func><span class=keyword>lineOutLevel</span>(left, right);</p>
<p class=desc>Adjust the line level outout voltage range, with separate
settings for left and right. The same settings (13 to 31) are available.
</p>
<h3>Signal Conditioning</h3>
<p>Usually these digital signal conditioning features should be left at their
default settings.
</p>
<p class=func><span class=keyword>adcHighPassFilterFreeze</span>();</p>
<p class=desc>By default, the analog input (either line-level inputs or mic)
is high-pass filtered, to remove any DC component. This function
freezes the filter, so the current DC component is still substracted, but
the filter stops tracking any DC or low frequency changes.
</p>
<p class=func><span class=keyword>adcHighPassFilterDisable</span>();</p>
<p class=desc>Completely disable the analog input filter. DC and sub-audible
low frequencies are allowed to enter the digital signal.
</p>
<p class=func><span class=keyword>adcHighPassFilterEnable</span>();</p>
<p class=desc>Turn the DC-blocking filter back on, if disabled, or
allows it to resume tracking DC and low frequency changes, if
previously frozen. This is the default setting.
</p>
<p class=func><span class=keyword>dacVolume</span>(both);</p>
<p class=desc>Normally output volume should be used with volume(), which
changes the analog gain in the headphone amplifier. This function
on the other hand controls digital attenuation before conversion to analog, which
reduces resolution, but allows another fine control of output
signal level. The ranges is 0 to 1.0, with the default (no digital attenuation)
at 1.0.
</p>
<p class=desc>dacVolume uses zero-crossing detect to avoid clicks, and graceful
ramping is handled by the chip so that a new volume may be set directly in
a single call.
</p>
<p class=func><span class=keyword>dacVolume</span>(left, right);</p>
<p class=desc>Adjust the digital output volume separately on left and
right channels.
</p>
<p class=func><span class=keyword>dacVolumeRamp</span>();</p>
<p class=desc>Enable graceful volume ramping. The dacVolume adjusts gradually using
an exponential curve. Pops or loud clicks are avoided when making large
changes in volume level.
</p>
<p class=func><span class=keyword>dacVolumeRampLinear</span>();</p>
<p class=desc>Enable faster volume ramping. A slight click may be heard during a
large volume change.
</p>
<p class=func><span class=keyword>dacVolumeRampDisable</span>();</p>
<p class=desc>Do not use any gradual ramping. The zero cross feature still helps
for small changes, but large volume changes may produce a pop or click.
</p>
<h3>Audio Processor</h3>
<p>The optional digital audio processor is capable of implementing
one or more of: automatic volume control, surround sound control,
bass enhancement, and tonal adjustments (either a
simple tone control, or a parametric equalizer, or a graphic equalizer),
in that order.
</p>
<p>These signal processing features are implemented in the SGTL5000 chip,
so they do not consume CPU time on Teensy. However, the order of
these processes is fixed in the hardware.
</p>
<p>It is good practice to mute the outputs before enabling or disabling
the Audio Processor, to avoid clicks or thumps.
</p>
<p class=func><span class=keyword>audioPreProcessorEnable</span>();</p>
<p class=desc>Enable the audio processor to pre-process the input
(from either line-level inputs or microphone) before it's sent
to Teensy by I2S.
</p>
<p class=func><span class=keyword>audioPostProcessorEnable</span>();</p>
<p class=desc>Enable the audio processor to post-process Teensy's
I2S output before it's turned into analog signals for the
headphones and/or line level outputs.
</p>
<p class=func><span class=keyword>audioProcessorDisable</span>();</p>
<p class=desc>Disable the audio processor.
</p>
<p class=func><span class=keyword>autoVolumeControl</span>(maxGain, response, hardLimit, threshold, attack, decay);</p>
<p class=desc>Configures the auto volume control, which is implemented as a compressor/expander
or hard limiter. <em>maxGain</em> is the maximum gain that can be applied for expanding, and
can take one of three values: 0 (0dB), 1 (6.0dB) and 2 (12dB). Values greater than 2 are treated
as 2. <em>response</em> controls the integration time for the compressor and can take
four values: 0 (0ms), 1 (25ms), 2 (50ms) or 3 (100ms). Larger values average the volume
over a longer time, allowing short-term peaks through.
</p>
<p class=desc>If <em>hardLimit</em> is 0, a 'soft
knee' compressor is used to progressively compress louder values which are near to or above the
threashold (the louder they are, the greater the compression). If it is 1, a hard compressor
is used (all values above the threashold are the same loudness). The <em>threashold</em> is specified
as a float in the range 0dBFS to -96dBFS, where -18dBFS is a typical value.
<em>attack</em> is a float controlling the rate of decrease in gain when the signal is over
threashold, in dB/s. <em>decay</em> controls how fast gain is restored once the level
drops below threashold, again in dB/s. It is typically set to a longer value than attack.
</p>
<p class=func><span class=keyword>autoVolumeEnable</span>();</p>
<p class=desc>Enables auto volume control, using the previously specified settings.
</p>
<p class=func><span class=keyword>autoVolumeDisable</span>();</p>
<p class=desc>Disables auto volume control.
</p>
<p class=func><span class=keyword>surroundSoundEnable</span>();</p>
<p class=desc>Enable virtual surround processing, to give a broader and
deeper stereo image (even with mono input).
</p>
<p class=func><span class=keyword>surroundSoundDisable</span>();</p>
<p class=desc>Disable virtual surround processing. Before disabling, ramp up
the width to maximum to avoid pops.
</p>
<p class=func><span class=keyword>surroundSound</span>(width);</p>
<p class=desc>Configures virtual surround width from 0 (mono) to 7 (widest).
</p>
<p class=func><span class=keyword>surroundSound</span>(width, select);</p>
<p class=desc>Configures virtual surround width from 0 (mono) to 7 (widest).
<em>select</em> may be set to 1 (disable), 2 (mono input) or 3 (stereo input).
</p>
<p class=func><span class=keyword>enhanceBassEnable</span>();</p>
<p class=desc>Enable bass enhancement. A mono, low-pass filtered copy of
the original stereo signal has bass levels boosted and is then mixed back into
the stereo signal, which is then optionally high pass filtered (to remove
inaudible subsonic frequencies).
</p>
<p class=func><span class=keyword>enhanceBassDisable</span>();</p>
<p class=desc>Disable bass enhancement. Before disabling, ramp down the bass
enhancement level to zero.
</p>
<p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev);</p>
<p class=desc>Configures the bass enhancement by setting the levels of the
original stereo signal and the bass-enhanced mono level which will be mixed together.
There is no high-pass filter.
</p>
<p class=desc>When changing bass level, call this function repeatedly to ramp up or down the bass in
steps of 0.5dB, to avoid pops.
</p>
<p class=func><span class=keyword>enhanceBass</span>(lr_lev, bass_lev, hpf_bypass, cutoff);</p>
<p class=desc>Configures the bass enhancement by setting the levels of the
original stereo signal and the bass-enhanced mono level which will be mixed together.
The high-pass filter may be enabled (0) or bypassed (1). The cutoff frequency is specified
as follows:
</p>
<pre class="desc">
value frequency
0 80Hz
1 100Hz
2 125Hz
3 150Hz
4 175Hz
5 200Hz
6 225Hz
</pre>
<p class=desc>When changing bass level, call this function repeatedly to ramp up or down the bass in
steps of 0.5dB, to avoid pops.
</p>
<p class=func><span class=keyword>eqSelect</span>(n);</p>
<p class=desc>Selects the type of frequency control, where <em>n</em> is
one of</p>
<p class=desc><b>FLAT_FREQUENCY (0)</b><br>
Equalizers and tone controls disabled, flat frequency response.</p>
<p class=desc><b>PARAMETRIC_EQUALIZER (1)</b><br>
Enables the 7-band parametric equalizer, thus disabling the
tone controls and graphic equalizer.</p>
<p class=desc><b>TONE_CONTROLS (2)</b><br>
Enables bass and treble tone controls, disabling the parametric
equalization and graphic equalizer.</p>
<p class=desc><b>GRAPHIC_EQUALIZER (3)</b><br>
Enables the five-band graphic equalizer, disabling the parametric
equalization and tone controls.</p>
<p class=func><span class=keyword>eqBands</span>(bass, treble);</p>
<p class=desc>Configures bass and treble tone controls, which are
implemented as one second order low pass filter (bass) in parallel with
one second order high pass filter (treble).
</p>
<p class=desc>When changing bass or treble level, call this function repeatedly to ramp
up or down the level in steps of 0.04 (=0.5dB) or so, to avoid pops.
</p>
<p class=func><span class=keyword>eqBands</span>(bass, mid_bass, midrange, mid_treble, treble);</p>
<p class=desc>Configures the graphic equalizer. It is implemented by five parallel,
second order biquad filters with fixed frequencies of 115Hz, 330Hz, 990Hz, 3kHz,
and 9.9kHz. Each band has a range of adjustment from 1.00 (+12dB) to -1.00 (-11.75dB).
</p>
<p class=func><span class=keyword>eqBand</span>(bandNum, n);</p>
<p class=desc>Configures the gain or cut on one band in the graphic equalizer.
<em>bandnum</em> can range from 1 to 5; <em>n</em> is a float in the range 1.00 to -1.00.
</p>
<p class=desc>When changing a band, call this function repeatedly to ramp up the gain in steps of 0.5dB,
to avoid pops.
</p>
<p class=func><span class=keyword>eqFilter</span>(filterNum, filterParameters);</p>
<p class=desc>Configurs the parametric equalizer. The number of filters (1 to 7)
is specified along with a pointer to an array of filter coefficients.
The parametric equalizer is implemented using 7 cascaded, second order bi-quad
filters whose frequencies, gain, and Q may be freely configured, but each filter
can only be specified as a set of filter coefficients.
</p>
<p class=func><span class=keyword>eqFilterCount</span>(n);</p>
<p class=desc>Enables zero or more of the already enabled parametric filters.
</p>
<h3>Examples</h3>
<p>Nearly all of the library's examples use this object. These
examples demonstrate its special features.
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; PassThroughStereo
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; SGTL5000 &gt; dap_bass_enhance
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; SGTL5000 &gt; dap_avc_agc
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; SGTL5000 &gt; balanceDAC
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; SGTL5000 &gt; balanceHP
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; SGTL5000 &gt; CalcBiquadToneControlDAP
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; SGTL5000 &gt; VolumeRamp
</p>
<h3>Notes</h3>
<p>TODO: add example with rock/classical/speech presets, where rock uses bass boost
and surround enhancement while speech uses bandpass filtering and auto volume control
compression.
</p>
<p>TODO: add example with two analogRead pots for bass and treble to demonstrate ramping.
</p>
</script>
<script type="text/x-red" data-template-name="AudioControlSGTL5000">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioInputUSB">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Receive stereo audio from a PC or Mac. Teensy appears as a USB
sound device.</p>
<p align=center><img src="img/usbtype_audio_in.png"></p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>Left Channel</td></tr>
<tr class=odd><td align=center>Out 1</td><td>Right Channel</td></tr>
</table>
<h3>Functions</h3>
<p>This object has no functions to call from the Arduino sketch. It
simply streams data from the USB to its 2 output ports.</p>
<!--
<h3>Hardware</h3>
-->
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; PassThroughUSB</p>
</p>
<h3>Notes</h3>
<p>Arduino's <b>Tools &gt; USB Type</b> menu must be set to <b>Audio</b>.
</p>
<p align=center><img src="img/usbtype_audio.png"></p>
<p>USB input &amp; output does not cause the Teensy Audio Library to
update. At least one non-USB input or output object must be
present for the entire library to update properly.</p>
<p>A known problem exists with USB audio from Macintosh computers.
An imperfect <a href="https://forum.pjrc.com/threads/34855-Distorted-audio-when-using-USB-input-on-Teensy-3-1?p=110392&viewfull=1#post110392">workaround
can be enabled by editing usb_audio.cpp</a>.
Find and uncomment "#define MACOSX_ADAPTIVE_LIMIT".</p>
</script>
<script type="text/x-red" data-template-name="AudioInputUSB">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioOutputUSB">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Send stereo audio to a PC or Mac. Teensy appears as a USB
sound device.</p>
<p align=center><img src="img/usbtype_audio_out.png"></p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>In 0</td><td>Left Channel</td></tr>
<tr class=odd><td align=center>In 1</td><td>Right Channel</td></tr>
</table>
<h3>Functions</h3>
<p>This object has no functions to call from the Arduino sketch. It
simply streams from it's 2 input ports to the USB.</p>
<!--
<h3>Hardware</h3>
-->
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; WavFilePlayerUSB</p>
</p>
<h3>Notes</h3>
<p>Arduino's <b>Tools &gt; USB Type</b> menu must be set to <b>Audio</b>.
</p>
<p align=center><img src="img/usbtype_audio.png"></p>
<p>USB input &amp; output does not cause the Teensy Audio Library to
update. At least one non-USB input or output object must be
present for the entire library to update properly.</p>
<p>A known problem exists with USB audio from Macintosh computers.
An imperfect <a href="https://forum.pjrc.com/threads/34855-Distorted-audio-when-using-USB-input-on-Teensy-3-1?p=110392&viewfull=1#post110392">workaround
can be enabled by editing usb_audio.cpp</a>.
Find and uncomment "#define MACOSX_ADAPTIVE_LIMIT".</p>
</script>
<script type="text/x-red" data-template-name="AudioOutputUSB">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioPlayQueue_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Play audio data provided by the Arduino sketch. This object provides
functions to allow the sketch code to push data into the audio system.</p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>Sound Output</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>play</span>(int16);</p>
<p class=desc>not yet implemented
</p>
<p class=func><span class=keyword>play</span>(int16[], length);</p>
<p class=desc>not yet implemented
</p>
<p class=func><span class=keyword>getBuffer</span>();</p>
<p class=desc>Returns a pointer to an array of 128 int16. This buffer
is within the audio library memory pool, providing the most efficient
way to input data to the audio system. The buffer is likely to be
populated by previously used data, so the entire 128 words should be
written before calling playBuffer(). Only a single buffer should be
requested at a time. This function may return NULL if no memory is
available.
</p>
<p class=func><span class=keyword>playBuffer</span>();</p>
<p class=desc>Transmit the buffer previously obtained from getBuffer().
</p>
<h3>Examples</h3>
<p><a href="http://community.arm.com/groups/embedded/blog/2014/05/23/led-video-panel-at-maker-faire-2014" target="_blank">4320 LED Video+Sound Project</a>
</p>
<!--
<p class=exam>File &gt; Examples &gt; Audio &gt;
</p>
-->
<h3>Notes</h3>
<p>TODO: many caveats....</p>
<p>
</p>
</script>
<script type="text/x-red" data-template-name="AudioPlayQueue_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioRecordQueue_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Record audio data by sending to the Arduino sketch. This object allows
sketch code to receive audio packets.</p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>In 0</td><td>Sound To Access</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>begin</span>();</p>
<p class=desc>Begin capturing incoming audio to the queue. After calling
begin, readBuffer() and freeBuffer(), or clear() must be used frequently
to prevent the queue from filling up.
</p>
<p class=func><span class=keyword>available</span>();</p>
<p class=desc>Returns the number of audio packets available to read.
</p>
<p class=func><span class=keyword>readBuffer</span>();</p>
<p class=desc>Read a single audio packet. A pointer to a 128 sample
array of 16 bit integers is returned. NULL is returned if no packets
are available.
</p>
<p class=func><span class=keyword>freeBuffer</span>();</p>
<p class=desc>Release the memory from the previously read packet returned
from readBuffer(). Only a single packet at a time may be read, and
each packet must be freed with this function, to return the memory to
the audio library.
</p>
<p class=func><span class=keyword>clear</span>();</p>
<p class=desc>Discard all audio held in the queue.
</p>
<p class=func><span class=keyword>end</span>();</p>
<p class=desc>Stop capturing incoming audio into the queue. Data already
captured remains in the queue and may be read with readBuffer().
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; Recorder
</p>
<h3>Notes</h3>
<p>
Up to 52 packets may be queued by this object, which allows approximately
150 ms of audio to be held in the queue, to allow time for the Arduino
sketch to write data to media or do other high-latency tasks.
The actual packets are taken
from the pool created by AudioMemory().
</p>
</script>
<script type="text/x-red" data-template-name="AudioRecordQueue_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioSynthNoisePink_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Create pink noise, using Stefan Stenzel's "New Shade Of Pink" algorithm.
</p>
<!--
<p align=center><img src="img/whitenoise.png"></p>
-->
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>Pink Noise</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>amplitude</span>(level);</p>
<p class=desc>Set the output peak level, from 0 (off) to 1.0.
The default is off. Noise is generated only after setting
to a non-zero level.
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; MemoryAndCpuUsage
</p>
<h3>Notes</h3>
<p>Setting the amplitude to zero causes this object to stop using
CPU time. CPU usage is approx 3% on Teensy 3.1.
</p>
<p>Stefan Stenzel's
<a href="http://stenzel.waldorfmusic.de/post/pink/" target="_blank">New Shade Of Pink</a>
algorithm. Stefan's terms of use are "Use for any purpose. If used
in a commercial product, you should give me one."
</p>
</script>
<script type="text/x-red" data-template-name="AudioSynthNoisePink_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioSynthWaveformSine_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Create a sine wave signal</p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>Sine Wave Output</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>amplitude</span>(level);</p>
<p class=desc>Set the amplitude, from 0 to 1.0.
</p>
<p class=func><span class=keyword>frequency</span>(freq);</p>
<p class=desc>Set the frequency, from 0 to 22000. Very low values may
be used to create a LFO (Low Frequency Oscillator) for objects
with modulation signal inputs.
</p>
<p class=func><span class=keyword>phase</span>(angle);</p>
<p class=desc>
Cause the generated waveform to jump to a specific point within
its cycle. Angle is from 0 to 360 degrees. When multiple objects
are configured,
<a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html" target="_blank">AudioNoInterrupts()</a>
should be used to guarantee all new settings take effect together.
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; MemoryAndCpuUsage
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; DialTone_Serial
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Analysis &gt; FFT
</p>
<h3>Notes</h3>
<p></p>
</script>
<script type="text/x-red" data-template-name="AudioSynthWaveformSine_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioSynthWaveform_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Create a waveform: sine, sawtooth, square, triangle, pulse or arbitrary.</p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>Waveform Output</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>begin</span>(waveform);</p>
<p class=desc>Configure the waveform type to create.
</p>
<p class=func><span class=keyword>begin</span>(level, frequency, waveform);</p>
<p class=desc>Output a waveform, and set the amplitude and frequency.
</p>
<p class=func><span class=keyword>frequency</span>(freq);</p>
<p class=desc>Change the frequency.
</p>
<p class=func><span class=keyword>amplitude</span>(level);</p>
<p class=desc>Change the amplitude. Set to 0 to turn the signal off.
</p>
<p class=func><span class=keyword>phase</span>(angle);</p>
<p class=desc>
Cause the generated waveform to jump to a specific point within
its cycle. Angle is from 0 to 360 degrees. When multiple objects
are configured,
<a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html" target="_blank">AudioNoInterrupts()</a>
should be used to guarantee all new settings take effect together.
</p>
<p class=func><span class=keyword>pulseWidth</span>(amount);</p>
<p class=desc>Change the width (duty cycle) of the pulse.</p>
<p class=func><span class=keyword>arbitraryWaveform</span>(array, maxFreq);</p>
<p class=desc>
Configure the waveform to be used with WAVEFORM_ARBITRARY. Array
must be an array of 256 samples. Currently, the data is used
without any filtering, which can cause aliasing with frequencies
above 172 Hz. For higher frequency output, you must bandwidth
limit your waveform data. Someday, "maxFreq" will be used to
do this automatically.
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt; Synthesis &gt; PlaySynthMusic
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; Synthesis &gt; pulseWidth
</p>
<p class=exam>File &gt; Examples &gt; Audio &gt; HardwareTesting &gt; WM8731MikroSine
</p>
<h3>Notes</h3>
<p>Supported Waveforms:<br>
<ul>
<li><span class=literal>WAVEFORM_SINE</span></li>
<li><span class=literal>WAVEFORM_SAWTOOTH</span></li>
<li><span class=literal>WAVEFORM_SAWTOOTH_REVERSE</span></li>
<li><span class=literal>WAVEFORM_SQUARE</span></li>
<li><span class=literal>WAVEFORM_TRIANGLE</span></li>
<li><span class=literal>WAVEFORM_ARBITRARY</span></li>
<li><span class=literal>WAVEFORM_PULSE</span></li>
<li><span class=literal>WAVEFORM_SAMPLE_HOLD</span></li>
</ul>
</p>
</script>
<script type="text/x-red" data-template-name="AudioSynthWaveform_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="AudioSynthNoiseWhite_F32">
<h3>Summary</h3>
<div class=tooltipinfo>
<p>Create white noise.
</p>
<p align=center><img src="img/whitenoise.png"></p>
</div>
<h3>Audio Connections</h3>
<table class=doc align=center cellpadding=3>
<tr class=top><th>Port</th><th>Purpose</th></tr>
<tr class=odd><td align=center>Out 0</td><td>White Noise</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>amplitude</span>(level);</p>
<p class=desc>Set the output peak level, from 0 (off) to 1.0.
The default is off. Noise is generated only after setting
to a non-zero level.
</p>
<h3>Examples</h3>
<p class=exam>File &gt; Examples &gt; Audio &gt;
</p>
<h3>Notes</h3>
<p>Setting the amplitude to zero causes this object to stop using
CPU time to generate random numbers.
</p>
</script>
<script type="text/x-red" data-template-name="AudioSynthNoiseWhite_F32">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
</body>
</html>