|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124 |
- <!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 Teensy 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 System Design Tool for <a href="http://www.pjrc.com/teensy/td_libs_Audio.html" target="_blank">Teensy Audio Library</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>
- </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-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 »</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-export"><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"></textarea>
- </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/javascript">
- RED.nodes.registerType('AudioInputI2S',{
- shortName: "i2s",
- inputs:0,
- outputs:2,
- category: 'input-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioInputI2S">
- <h3>Summary</h3>
- <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>
- <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 > Examples > Audio > HardwareTesting > PassThroughStereo
- </p>
- <p class=exam>File > Examples > Audio > Recorder
- </p>
- <p class=exam>File > Examples > Audio > Analysis > PeakMeterStereo
- </p>
- <p class=exam>File > Examples > Audio > Analysis > FFT
- </p>
- <p class=exam>File > Examples > Audio > Analysis > SpectrumAnalyzerBasic
- </p>
- <p class=exam>File > Examples > Audio > Effects > Chorus
- </p>
- <p class=exam>File > Examples > Audio > Effects > Flange
- </p>
- <p class=exam>File > Examples > Audio > Effects > Filter
- </p>
- <p class=exam>File > Examples > Audio > Effects > 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">
- <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/javascript">
- RED.nodes.registerType('AudioInputAnalog',{
- shortName: "adc",
- inputs:0,
- outputs:1,
- category: 'input-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioInputAnalog">
- <h3>Summary</h3>
- <p>Receive audio using the built-in analog to digital converter.</p>
- <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>Audio 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 ADC to its output port.</p>
- <h3>Hardware</h3>
- <p>Pin A2 is used for audio input. This circuitry is recommended.</p>
- <p align=center><img src="img/adccircuit.png"></p>
- <p>Signal range is 0 to 1.2V</p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > HardwareTesting > PassThroughMono
- </p>
- <p class=exam>File > Examples > Audio > Analysis > PeakMeterMono
- </p>
- <p class=exam>File > Examples > Audio > Analysis > DialTone_7segment
- </p>
- <h3>Notes</h3>
- <p>A different pin may be used, but adding it as an parameter
- to the AudioInputAnalog object definition.
- </p>
- <p>For example, to use pin A3:
- </p>
- <p class=desc><span class=keyword>AudioInputAnalog</span> adc1(<span class=literal>A3</span>);
- </p>
-
- <p>Noise due to high source impedance, which allows rapidly switching digital signals
- to capacitively couple... avoiding higher analog impedance is the solution.</p>
- <p>Power Supply rejection issue with simple DC bias (bigger capacitor may be needed if 3.3V has low frequency noise)</p>
- <p>Algorithm for automatic DC bias tracking</p>
- <p>TODO: actual noise measurements with different input circuitry
- (it's not as quiet as the audio shield)</p>
- </script>
- <script type="text/x-red" data-template-name="AudioInputAnalog">
- <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/javascript">
- RED.nodes.registerType('AudioInputI2Sslave',{
- shortName: "i2ss",
- inputs:0,
- outputs:2,
- category: 'input-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioInputI2Sslave">
- <h3>Summary</h3>
- <p>Receive 16 bit stereo audio from an I2S device using I2S slave mode.</p>
- <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>The I2S signals are used in "slave" mode, where the I2S device controls
- 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>Input</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>Input</td></tr>
- </table>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>Slave mode I2S <b>should not used in the same project as ADC, DAC and
- PWM</b> signals. Differences in timing between the I2S device and
- Teensy's clock can cause occasional audio glitches when I2S slave mode
- is used together with other input or output objects based on Teensy's
- timing.</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="AudioInputI2Sslave">
- <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/javascript">
- RED.nodes.registerType('AudioOutputI2S',{
- shortName: "i2s",
- inputs:2,
- outputs:0,
- category: 'output-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioOutputI2S">
- <h3>Summary</h3>
- <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>
- <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 > Examples > Audio > HardwareTesting > PassThroughStereo
- </p>
- <p class=exam>File > Examples > Audio > SamplePlayer
- </p>
- <p class=exam>File > Examples > Audio > Recorder
- </p>
- <p class=exam>File > Examples > Audio > WavFilePlayer
- </p>
- <p class=exam>File > Examples > Audio > Effects > Chorus
- </p>
- <p class=exam>File > Examples > Audio > Synthesis > 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">
- <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/javascript">
- RED.nodes.registerType('AudioOutputSPDIF',{
- shortName: "spdif",
- inputs:2,
- outputs:0,
- category: 'output-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioOutputSPDIF">
- <h3>Summary</h3>
- <p>Transmit 16 bit stereo audio as Digital S/PDIF.</p>
- <p align=center><img src="img/spdif_proto.jpg"></p>
- <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 S/PDIF encoded digital
- audio on pin 22.</p>
- <h3>Hardware</h3>
- <p>The S/PDIF output signal can be used to drive an optical TOSLINK
- cable, or a standard (usually orange) RCA jack.</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>22</td><td>S/PDIF</td><td>Output</td></tr>
- </table>
- <p>For optical TOSLINK output, this
- <a href="https://www.oshpark.com/shared_projects/KcDBKHta" target="_blank">OSH Park board</a>
- can be used with the inexpensive Everlight PLT133/T6A connector, available
- at Digikey, 1080-1434-ND.
- </p>
- <h3>Examples</h3>
- <p>The AudioOutputSPDIF object can be used in place of the AudioOutputI2S object,
- <p>used in nearly all the examples. The WavFilePlayer shows how to substitute
- output objects for different hardware types.
- </p>
- <p class=exam>File > Examples > Audio > WavFilePlayer
- </p>
- <h3>Credits</h3>
- <p><a href="https://github.com/FrankBoesing" target="_blank">Frank Boesing</a>
- developed the AudioOutputSPDIF code. The original
- <a href="https://forum.pjrc.com/threads/28639-S-pdif" target="_blank">forum disussion</a>
- included valuable input and code from "kpc".
- <h3>Notes</h3>
- <p>S/PDIF output uses the I2S hardware. This object can not be used
- together with any of the I2S objects, because it requires the I2S
- hardware with different internal settings.</p>
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioOutputSPDIF">
- <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/javascript">
- RED.nodes.registerType('AudioOutputAnalog',{
- shortName: "dac",
- inputs:1,
- outputs:0,
- category: 'output-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioOutputAnalog">
- <h3>Summary</h3>
- <p>Transmit 12 bit audio using Teensy 3.1's built-in digital to analog converter.</p>
- <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>Audio 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 ADC to its output port.</p>
- <h3>Hardware</h3>
- <p align=center><img src="img/dacpin.jpg"></p>
- <p>Signal range is 0 to 1.2V</p>
- <p>Most applications require at least a 10µF DC-blocking capacitor.</p>
- <p>TODO: photo of Teensy 3.1 with 10µF capacitor and 3.5mm jack.</p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > HardwareTesting > PassThroughMono
- </p>
- <p class=exam>File > Examples > Audio > SamplePlayer
- </p>
- <h3>Notes</h3>
- <p>The output rate is 44.1 kHz (no oversampling). Ultrasonic noise present if
- not filtered. This may not
- be an issue for many uses, but care should be used if amplified and driven
- to high power tweeters.</p>
- </script>
- <script type="text/x-red" data-template-name="AudioOutputAnalog">
- <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/javascript">
- RED.nodes.registerType('AudioOutputPWM',{
- shortName: "pwm",
- inputs:1,
- outputs:0,
- category: 'output-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioOutputPWM">
- <h3>Summary</h3>
- <p>Transmit audio using Teensy 3.1's PWM pins. Two pins are
- used for coarse and fine pulses, to be combined by scaled
- resistors.</p>
- <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>Audio 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 its input port to the PWM pins.</p>
- <h3>Hardware</h3>
- <p>The following circuit is recommended.</p>
- <p align=center><img src="img/pwmdualcircuit.jpg"></p>
- <p>Signal range is approx 1.55 Vp-p.</p>
- <p>These resistor values assume approx 20 ohms output impedance
- on the digital pins. The 127K resistor may be adjusted or
- trimmed for variation in output drive and tolerance on the
- 475 ohm resistor.</p>
- <p>A plastic film (Polypropylene, Polyethylene, Polyester, etc) or
- C0G/NPO ceramic capacitor should be used for filtering. Low
- quality ceramic (X7R, Y5V, Z5U, etc) can cause signal distortion.</p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > HardwareTesting > PassThroughMono
- </p>
- <h3>Notes</h3>
- <p>This object only works properly when Tools > CPU_Speed is set to
- 48 or 96 MHz. Other speeds aren't supported and will likely fail
- in strange ways.</p>
- <p>The PWM carrier frequency is 88.2 kHz. The suggested circuit
- will only slightly filter the carrier. Extra filtering will be
- required for a clean signal without the ultrasonic PWM carrier.
- </p>
- <p>Analog signals created by filtering PWM waveforms use the digital
- power supply as their reference voltage. Any noise on the digital
- power line can directly couple to the output signal. The built-in DAC or
- <a href="http://www.pjrc.com/store/teensy3_audio.html" target="_blank">audio shield</a>
- should be used when higher quality signals are needed.</p>
- </script>
- <script type="text/x-red" data-template-name="AudioOutputPWM">
- <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/javascript">
- RED.nodes.registerType('AudioOutputI2Sslave',{
- shortName: "i2ss",
- inputs:2,
- outputs:0,
- category: 'output-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioOutputI2Sslave">
- <h3>Summary</h3>
- <p>Transmit 16 bit stereo audio to an I2S device using I2S slave mode.</p>
- <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>The I2S signals are used in "slave" mode, where the I2S device controls
- 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>Input</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>Input</td></tr>
- </table>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > HardwareTesting > WM8731MikroSine
- </p>
- <h3>Notes</h3>
- <p>Slave mode I2S <b>should not used in the same project as ADC, DAC and
- PWM</b> signals. Differences in timing between the I2S device and
- Teensy's clock can cause occasional audio glitches when I2S slave mode
- is used together with other input or output objects based on Teensy's
- timing.</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="AudioOutputI2Sslave">
- <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/javascript">
- RED.nodes.registerType('AudioMixer4',{
- shortName: "mixer",
- inputs:4,
- outputs:1,
- category: 'mixer-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioMixer4">
- <h3>Summary</h3>
- <p>Combine up to 4 audio signals together, each with adjustable gain.
- All channels support signal attenuation or amplification.</p>
- <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 > Examples > Audio > SamplePlayer
- </p>
- <p class=exam>File > Examples > Audio > Synthesis > PlaySynthMusic
- </p>
- <p class=exam>File > Examples > Audio > Analysis > SpectrumAnalyzerBasic
- </p>
- <p class=exam>File > Examples > Audio > Analysis > DialTone_Serial
- </p>
- <p class=exam>File > Examples > Audio > 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">
- <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/javascript">
- RED.nodes.registerType('AudioPlayMemory',{
- shortName: "playMem",
- inputs:0,
- outputs:1,
- category: 'play-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioPlayMemory">
- <h3>Summary</h3>
- <p>Play a short sound clip, stored directly in memory.
- Data files are created with the
- <a href="https://github.com/PaulStoffregen/Audio/tree/master/examples/SamplePlayer/wav2sketch" target="_blank">wav2sketch program</a>,
- and copied to the sketch folder to become part of your sketch.</p>
- <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>(data);</p>
- <p class=desc>Begin playing a sound clip. If already playing, the
- currently playing clip is stopped and this new data begins
- playing from the beginning.
- </p>
- <p class=func><span class=keyword>stop</span>();</p>
- <p class=desc>Stop playing. If not playing, this function has no effect.
- </p>
- <p class=func><span class=keyword>isPlaying</span>();</p>
- <p class=desc>Return true (non-zero) if playing, or false (zero)
- when not playing.
- </p>
- <p class=func><span class=keyword>positionMillis</span>();</p>
- <p class=desc>While playing, return the current time offset, in
- milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <p class=func><span class=keyword>lengthMillis</span>();</p>
- <p class=desc>Return the total length of the current sound clip,
- in milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > SamplePlayer
- </p>
- <h3>Notes</h3>
- <p>TODO: supported sample rates: 11.025, 22.05, 44.1</p>
- <p>TODO: ulaw vs uncompressed encoding</p>
- <p>Polyphonic playback can be built by creating multiple
- objects, with their output combined by mixers.</p>
- </script>
- <script type="text/x-red" data-template-name="AudioPlayMemory">
- <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/javascript">
- RED.nodes.registerType('AudioPlaySdWav',{
- shortName: "playSdWav",
- inputs:0,
- outputs:2,
- category: 'play-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioPlaySdWav">
- <h3>Summary</h3>
- <p>Play a WAV file, stored on a SD card.</p>
- <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 Output</td></tr>
- <tr class=odd><td align=center>Out 1</td><td>Right Channel Output</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>play</span>(filename);</p>
- <p class=desc>Begin playing a WAV file. If a file is already playing,
- it is stopped and this file starts playing from the beginning.
- </p>
- <p class=func><span class=keyword>stop</span>();</p>
- <p class=desc>Stop playing. If not playing, this function has no effect.
- </p>
- <p class=func><span class=keyword>isPlaying</span>();</p>
- <p class=desc>Return true (non-zero) if playing, or false (zero)
- when not playing. See the note below about delayed start.
- </p>
- <p class=func><span class=keyword>positionMillis</span>();</p>
- <p class=desc>While playing, return the current time offset, in
- milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <p class=func><span class=keyword>lengthMillis</span>();</p>
- <p class=desc>Return the total length of the current sound clip,
- in milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > WavFilePlayer
- </p>
- <h3>Notes</h3>
- <p>Only 16 bit PCM, 44100 Hz WAV files are supported. When mono
- files are played, both output ports transmit a copy of the
- single sound. Of course, stereo WAV files play with the left
- channel on port 0 and the right channel on port 1.
- </p>
- <p>A brief delay after calling play() will usually occur before
- isPlaying() returns true and positionMillis() returns valid
- time offset. WAV files have a header at the beginning of the
- file, which the audio library must read and parse before
- playing can begin.
- </p>
- <p>While playing, the audio library accesses the SD card automatically.
- If card access is required, you must
- <a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html" target="_blank">use AudioNoInterrupts()</a>
- to prevent the library from accessing the SD card while you use it.
- Disabling the audio library interrupt for too long may cause audible
- dropouts or glitches.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioPlaySdWav">
- <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/javascript">
- RED.nodes.registerType('AudioPlaySdRaw',{
- shortName: "playSdRaw",
- inputs:0,
- outputs:1,
- category: 'play-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioPlaySdRaw">
- <h3>Summary</h3>
- <p>Play a RAW data file, stored on a SD card. RAW format is simpler
- than WAV and begins playing immediately, without parsing WAV file
- header info.</p>
- <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>(filename);</p>
- <p class=desc>Begin playing a RAW data file. If a file is already playing,
- it is stopped and this file starts playing from the beginning.
- </p>
- <p class=func><span class=keyword>stop</span>();</p>
- <p class=desc>Stop playing. If not playing, this function has no effect.
- </p>
- <p class=func><span class=keyword>isPlaying</span>();</p>
- <p class=desc>Return true (non-zero) if playing, or false (zero)
- when not playing.
- </p>
- <p class=func><span class=keyword>positionMillis</span>();</p>
- <p class=desc>While playing, return the current time offset, in
- milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <p class=func><span class=keyword>lengthMillis</span>();</p>
- <p class=desc>Return the total length of the current sound clip,
- in milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Recorder
- </p>
- <h3>Notes</h3>
- <p>The data file must be RAW 16 bit signed integers in LSB-first format.
- </p>
- <p>While playing, the audio library accesses the SD card automatically.
- If card access is required, you must
- <a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html" target="_blank">AudioNoInterrupts()</a>
- to prevent the library from accessing the SD card while you use it.
- Disabling the audio library interrupt for too long may cause audible
- dropouts or glitches.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioPlaySdRaw">
- <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/javascript">
- RED.nodes.registerType('AudioPlaySerialflashRaw',{
- shortName: "playFlashRaw",
- inputs:0,
- outputs:1,
- category: 'play-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioPlaySerialflashRaw">
- <h3>Summary</h3>
- <div>
- <p>Play a RAW data file, stored on a Serial Flash chip. These chips
- are far more efficient than SD cards, allowing many files to be
- played simultaneously by copies of this object.
- </p>
- <p align=center><img src="img/w25q128fv.jpg"><br><small>W25Q128FV Serial Flash</small></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>(filename);</p>
- <p class=desc>Begin playing a RAW data file. If a file is already playing,
- it is stopped and this file starts playing from the beginning.
- </p>
- <p class=func><span class=keyword>stop</span>();</p>
- <p class=desc>Stop playing. If not playing, this function has no effect.
- </p>
- <p class=func><span class=keyword>isPlaying</span>();</p>
- <p class=desc>Return true (non-zero) if playing, or false (zero)
- when not playing.
- </p>
- <p class=func><span class=keyword>positionMillis</span>();</p>
- <p class=desc>While playing, return the current time offset, in
- milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <p class=func><span class=keyword>lengthMillis</span>();</p>
- <p class=desc>Return the total length of the current sound clip,
- in milliseconds. When not playing, the return from this function
- is undefined.
- </p>
- <h3>Examples</h3>
- <!--<p class=exam>File > Examples > Audio > Recorder-->
- <p class=exam>TODO: play example needed....
- </p>
- <p class=exam>File > Examples > SerialFlash > CopyFromSD
- </p>
- <h3>Notes</h3>
- <p>The data file must be RAW 16 bit signed integers in LSB-first format.
- </p>
- <p>The <a href="https://github.com/PaulStoffregen/SerialFlash" target="_blank">SerialFlash library</a>
- is used to access the flash chip. You can also use SerialFlash's functions
- to access the stored files, or add data to the flash chip.
- </p>
- <p>File names are case sensitive with SerialFlash. If your sound does
- not play, use <b>File > Examples > SerialFlash > ListFiles</b> to
- check the exact file names stored in the flash memory chip.
- </script>
- <script type="text/x-red" data-template-name="AudioPlaySerialflashRaw">
- <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/javascript">
- RED.nodes.registerType('AudioPlayQueue',{
- shortName: "queue",
- inputs:0,
- outputs:1,
- category: 'play-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioPlayQueue">
- <h3>Summary</h3>
- <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>
- <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 > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>TODO: many caveats....</p>
- <p>
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioPlayQueue">
- <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/javascript">
- RED.nodes.registerType('AudioRecordQueue',{
- shortName: "queue",
- inputs:1,
- outputs:0,
- category: 'record-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioRecordQueue">
- <h3>Summary</h3>
- <p>Record audio data by sending to the Arduino sketch. This object allows
- sketch code to receive audio packets.</p>
- <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 > Examples > Audio > 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">
- <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/javascript">
- RED.nodes.registerType('AudioSynthWaveformSine',{
- shortName: "sine",
- inputs:0,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthWaveformSine">
- <h3>Summary</h3>
- <p>Create a sine wave signal</p>
- <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 > Examples > Audio > MemoryAndCpuUsage
- </p>
- <p class=exam>File > Examples > Audio > Analysis > DialTone_Serial
- </p>
- <p class=exam>File > Examples > Audio > Analysis > FFT
- </p>
- <h3>Notes</h3>
- <p></p>
- </script>
- <script type="text/x-red" data-template-name="AudioSynthWaveformSine">
- <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/javascript">
- RED.nodes.registerType('AudioSynthWaveformSineModulated',{
- shortName: "sine_fm",
- inputs:1,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthWaveformSineModulated">
- <h3>Summary</h3>
- <p>Create a modulated sine wave, using any audio signal to continuously
- modulate the sine wave frequency.</p>
- <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>Modulation Signal</td></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 center frequency, from 0 to 11000. The output will
- be this center frequency when the input modulation signal is zero.
- Modulation input 1.0 causes the frequency to double, and input -1.0
- causes zero Hz (DC) output. For less modulation, attenuate the input
- signal (perhaps with a mixer object) before it arrives here.
- </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 > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p></p>
- </script>
- <script type="text/x-red" data-template-name="AudioSynthWaveformSineModulated">
- <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/javascript">
- RED.nodes.registerType('AudioSynthWaveform',{
- shortName: "waveform",
- inputs:0,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthWaveform">
- <h3>Summary</h3>
- <p>Create a waveform: sine, sawtooth, square, triangle, pulse or arbitrary.</p>
- <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 > Examples > Audio > Synthesis > PlaySynthMusic
- </p>
- <p class=exam>File > Examples > Audio > Synthesis > pulseWidth
- </p>
- <p class=exam>File > Examples > Audio > HardwareTesting > 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_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>
- </ul>
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioSynthWaveform">
- <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/javascript">
- RED.nodes.registerType('AudioSynthToneSweep',{
- shortName: "tonesweep",
- inputs:0,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthToneSweep">
- <h3>Summary</h3>
- <p>Create a continuously varying (in frequency) sine wave</p>
- <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>Continuously varying tone</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>play</span>(level, lowFreq, highFreq, time);</p>
- <p class=desc>Start generating frequency sweep output. The time is specified
- in milliseconds. Level is 0 to 1.0.
- </p>
- <p class=func><span class=keyword>isPlaying</span>();</p>
- <p class=desc>Returns true (non-zero) while the output is active.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > HardwareTesting > ToneSweep
- </p>
- <h3>Notes</h3>
- <p>Uses excessive CPU time</p>
- </script>
- <script type="text/x-red" data-template-name="AudioSynthToneSweep">
- <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/javascript">
- RED.nodes.registerType('AudioSynthWaveformDc',{
- shortName: "dc",
- inputs:0,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthWaveformDc">
- <h3>Summary</h3>
- <p>Create constant (DC) signal, useful for control of objects that take
- a modulation or control input signal. This constant level can be
- used to modify other waveforms using mixer or multiplier objects</p>
- <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>Output constant DC level</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>amplitude</span>(level);</p>
- <p class=desc>Set the output. Level is -1.0 to 1.0. The output is
- changed immediately.
- </p>
- <p class=func><span class=keyword>amplitude</span>(level, milliseconds);</p>
- <p class=desc>Set the output. Level is -1.0 to 1.0. The output is
- gradually changed over a "milliseconds" time period. Any time may
- be specified, but periods longer than 1 second may be automatically
- shortened for small level changes, due to numerical precision limits.
- </p>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>Of course, the term "DC", for Direct Current, doesn't properly apply
- to a pure digital stream of numerical values. But the term is widely
- understood in audio applications, so hopefully it's not too confusing?</p>
- </script>
- <script type="text/x-red" data-template-name="AudioSynthWaveformDc">
- <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/javascript">
- RED.nodes.registerType('AudioSynthNoiseWhite',{
- shortName: "noise",
- inputs:0,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthNoiseWhite">
- <h3>Summary</h3>
- <div>
- <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 > Examples > Audio >
- </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">
- <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/javascript">
- RED.nodes.registerType('AudioSynthNoisePink',{
- shortName: "pink",
- inputs:0,
- outputs:1,
- category: 'synth-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioSynthNoisePink">
- <h3>Summary</h3>
- <div>
- <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 > Examples > Audio > 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">
- <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/javascript">
- RED.nodes.registerType('AudioEffectFade',{
- shortName: "fade",
- inputs:1,
- outputs:1,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectFade">
- <h3>Summary</h3>
- <p>Gradually increase or decrease audio level.</p>
- <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 Input</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Signal Output</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>fadeIn</span>(milliseconds);</p>
- <p class=desc>Begin increasing the audio level, to reach 1.0 (input passed
- directly to the output) after "milliseconds" time.
- </p>
- <p class=func><span class=keyword>fadeOut</span>(milliseconds);</p>
- <p class=desc>Begin decreasing the audio level, to reach 0 (no output)
- after "milliseconds" time.
- </p>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>Cross fading can be built with 2 fade objects fed into a mixer.
- When one fade object is off (fully faded out) and the other on
- (fully faded in), if both are started at the same moment for the
- same time duration, their signal gains always add to 1.0. This
- allows 2 fade objects to work together for a smooth transition
- between a pair of signals.
- </p>
- <p><a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html" target="_blank">AudioNoInterrupts()</a>
- should be used when changing
- settings on multiple objects, so all changes always take effect
- at the same moment.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectFade">
- <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/javascript">
- RED.nodes.registerType('AudioEffectChorus',{
- shortName: "chorus",
- inputs:1,
- outputs:1,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectChorus">
- <h3>Summary</h3>
- <p>The chorus effect simulates the richness of several nearly-identical
- sound sources (like the way a choir sounds different to a single singer).
- It does this by sampling from a delay line, so each voice is actually
- the same but at a slightly different point in time. This is a type of
- comb filtering.</p>
- <p>Chorus combines one or more samples ranging from the most recent
- sample back to about 50ms ago. The additional samples are evenly spread
- through the supplied delay line, and there is no modulation.</p>
- <p>If the number of voices is specified as 2, then the
- effect combines the current sample and the oldest sample (the last one
- in the delay line). If the number of voices is 3 then the effect combines
- the most recent sample, the oldest sample and the sample in the middle of
- the delay line.</p>
- <p>For two voices the effect can be represented as:<br/>
- result = (sample(0) + sample(dt))/2<br/>
- where sample(0) represents the current sample and sample(dt)
- is the sample in the delay line from dt milliseconds ago.</p>
- <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 Input</td></tr>
- <tr class="odd"><td align="center">Out 0</td><td>Chorused Output</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>begin</span>(delayBuffer, length, n_chorus);</p>
- <p class=desc>Create a chorus by specifying the address of the delayline, the
- total number of samples in the delay line (often done as an integer multiple of
- AUDIO_BLOCK_SAMPLES) and the number of voices in the chorus <em>including</em>
- the original voice (so, 2 and up to get a chorus effect, although you can
- specify 1 if you want).
- </p>
- <p class=func><span class=keyword>modify</span>(n_chorus);</p>
- <p class=desc>Alters the number of voices in a running chorus (previously started with begin).
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Effects > Chorus
- </p>
- <h3>Notes</h3>
- <p>The longer the length of the chorus, the more memory blocks are used.</p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectChorus">
- <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/javascript">
- RED.nodes.registerType('AudioEffectFlange',{
- shortName: "flange",
- inputs:1,
- outputs:1,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectFlange">
- <h3>Summary</h3>
- <p>Originally, flanging was produced by playing the same signal on two synchronized
- reel-to-reel tape recorders and making one of the reels slow down and speed up by
- pressing on the flange of the reel (hence the name). This is a type of
- comb filtering, and produces a harmonically-related series of peaks and notches
- in the audio spectrum.</p>
- <p>This flanger uses a delay line, combining the original voice with only one sample from the delay
- line, but the position of that sample varies sinusoidally.</p>
- <p>The effect can be represented as:<br>
- result = sample(0) + sample(dt + depth*sin(2*PI*Fe))</p>
- <p>The value of the sine function is always a number from -1 to +1 and
- so the result of depth*(sin(Fe)) is always a number from -depth to +depth.
- Thus, the delayed sample will be selected from the range (dt-depth) to
- (dt+depth). This selection will vary at whatever rate is specified as the
- frequency of the effect, Fe. Typically a low frequency (a few Hertz) is used.
- <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 Input</td></tr>
- <tr class="odd"><td align="center">Out 0</td><td>Flanged Output</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>begin</span>(delayBuffer, length, offset, depth, delayRate);</p>
- <p class=desc>Create a flanger by specifying the address of the delayline, the
- total number of samples in the delay line (often done as an integer multiple of
- AUDIO_BLOCK_SAMPLES), the offset (how far back the flanged sample is from the original voice),
- the modulation depth (larger values give a greater variation) and the modulation
- frequency, in Hertz.
- </p>
- <p class=func><span class=keyword>modify</span>(offset, depth, delayRate);</p>
- <p class=desc>Alters the parameters in a running flanger (previously started with begin).
- </p>
-
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Effects > Flange
- </p>
- <h3>Notes</h3>
- <p>The longer the length of the delay buffer, the more memory blocks are used.</p>
- <p>Try these settings:<br>
- #define FLANGE_DELAY_LENGTH (2*AUDIO_BLOCK_SAMPLES)<br>
- and<br>
- int s_idx = 2*FLANGE_DELAY_LENGTH/4;<br>
- int s_depth = FLANGE_DELAY_LENGTH/4;<br>
- double s_freq = 3;</p>
- <p>The flange effect can also produce a chorus-like effect if a longer
- delay line is used with a slower modulation rate, for example try:<br>
- #define FLANGE_DELAY_LENGTH (12*AUDIO_BLOCK_SAMPLES)<br>
- and<br>
- int s_idx = 3*FLANGE_DELAY_LENGTH/4;<br>
- int s_depth = FLANGE_DELAY_LENGTH/8;<br>
- double s_freq = .0625;</p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectFlange">
- <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/javascript">
- RED.nodes.registerType('AudioEffectEnvelope',{
- shortName: "envelope",
- inputs:1,
- outputs:1,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectEnvelope">
- <h3>Summary</h3>
- <div>
- <p>Modify a signal with a DAHDSR (Delay Attack Hold Decay Sustain
- Release) envelope.
- </p>
- <p align=center><img src="img/dahdsr.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 Input</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Signal with Envelope Applied</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>noteOn</span>();</p>
- <p class=desc>Begin the delay to attack, or the attack phase is
- delay is zero.
- </p>
- <p class=func><span class=keyword>noteOff</span>();</p>
- <p class=desc>Begin the release phase.
- </p>
- <p class=func><span class=keyword>delay</span>(milliseconds);</p>
- <p class=desc>Set the delay from noteOn to the attach phase. The
- default is zero, for no delay.
- </p>
- <p class=func><span class=keyword>attack</span>(milliseconds);</p>
- <p class=desc>Set the attack time. The default is 1.5 milliseconds.
- </p>
- <p class=func><span class=keyword>hold</span>(milliseconds);</p>
- <p class=desc>Set the hold time. The default is 0.5 milliseconds.
- </p>
- <p class=func><span class=keyword>decay</span>(milliseconds);</p>
- <p class=desc>Set the decay time. The default is 15 milliseconds.
- </p>
- <p class=func><span class=keyword>sustain</span>(level);</p>
- <p class=desc>Set the sustain level. The range is 0 to 1.0. The
- gain will be maintained at this level after the decay phase,
- until noteOff() is called.
- </p>
- <p class=func><span class=keyword>release</span>(milliseconds);</p>
- <p class=desc>Set the release time. The default is 30 millisecond.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Synthesis > PlaySynthMusic
- </p>
- <p class=exam>File > Examples > Audio > Synthesis > pulseWidth
- </p>
- <p class=exam>File > Examples > Audio > MemoryAndCpuUsage
- </p>
- <h3>Notes</h3>
- <p>To achieve the more common ADSR shape, simply
- set delay and hold to zero.</p>
- <p>The recommended range for each of the 5 timing inputs is 0 to 50
- milliseconds. Up to 200 ms can be used, with somewhat reduced
- accuracy</p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectEnvelope">
- <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/javascript">
- RED.nodes.registerType('AudioEffectMultiply',{
- shortName: "multiply",
- inputs:2,
- outputs:1,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectMultiply">
- <h3>Summary</h3>
- <div>
- <p>Multiply two signals together, useful for amplitude modulation
- or "voltage controlled amplification".
- </p>
- <p align=center><img src="img/multiply.png"><br><small>56 Hz and 1 kHz sine waves multiplied.</small></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 Input</td></tr>
- <tr class=odd><td align=center>In 1</td><td>Signal Input</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Signal with Envelope Applied</td></tr>
- </table>
- <h3>Functions</h3>
- <p>There are no functions to call from the Arduino sketch.
- This object simply multiplies the 2 signals to create
- a continuous output
- </p>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectMultiply">
- <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/javascript">
- RED.nodes.registerType('AudioEffectDelay',{
- shortName: "delay",
- inputs:1,
- outputs:8,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectDelay">
- <h3>Summary</h3>
- <div>
- <p>Delay a signal. Up to 8 separate delay taps can be used.</p>
- <p align=center><img src="img/delay.png"><br><small>1 kHz burst, delayed 5.2 ms.</small></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 Input</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Delay Tap #1</td></tr>
- <tr class=odd><td align=center>Out 1</td><td>Delay Tap #2</td></tr>
- <tr class=odd><td align=center>Out 2</td><td>Delay Tap #3</td></tr>
- <tr class=odd><td align=center>Out 3</td><td>Delay Tap #4</td></tr>
- <tr class=odd><td align=center>Out 4</td><td>Delay Tap #5</td></tr>
- <tr class=odd><td align=center>Out 5</td><td>Delay Tap #6</td></tr>
- <tr class=odd><td align=center>Out 6</td><td>Delay Tap #7</td></tr>
- <tr class=odd><td align=center>Out 7</td><td>Delay Tap #8</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>delay</span>(channel, milliseconds);</p>
- <p class=desc>Set output channel (0 to 7) to delay the signals by
- milliseconds. The maximum delay is approx 333 ms. The actual delay
- is rounded to the nearest sample. Each channel can be configured for
- any delay. There is no requirement to configure the "taps" in increasing
- delay order.
- </p>
- <p class=func><span class=keyword>disable</span>(channel);</p>
- <p class=desc>Disable a channel. The output of this channel becomes
- silent. If this channel is the longest delay, memory usage is
- automatically reduced to accomodate only the remaining channels used.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Effects > Delay
- </p>
- <h3>Notes</h3>
- <p>Memory for the delayed signal is take from the memory pool allocated by
- <a href="http://www.pjrc.com/teensy/td_libs_AudioConnection.html" target="_blank">AudioMemory()</a>.
- Each block allows about 3 milliseconds of delay, so AudioMemory
- should be increased to allow for the longest delay tap.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectDelay">
- <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/javascript">
- RED.nodes.registerType('AudioEffectDelayExternal',{
- shortName: "delayExt",
- inputs:1,
- outputs:8,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectDelayExternal">
- <h3>Summary</h3>
- <div>
- <p>Delay a signal, using external memory for longer delay times! Up to 8 separate delay taps can be used.</p>
- <p align=center><img src="img/delay.png"><br><small>1 kHz burst, delayed 5.2 ms.</small></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 Input</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Delay Tap #1</td></tr>
- <tr class=odd><td align=center>Out 1</td><td>Delay Tap #2</td></tr>
- <tr class=odd><td align=center>Out 2</td><td>Delay Tap #3</td></tr>
- <tr class=odd><td align=center>Out 3</td><td>Delay Tap #4</td></tr>
- <tr class=odd><td align=center>Out 4</td><td>Delay Tap #5</td></tr>
- <tr class=odd><td align=center>Out 5</td><td>Delay Tap #6</td></tr>
- <tr class=odd><td align=center>Out 6</td><td>Delay Tap #7</td></tr>
- <tr class=odd><td align=center>Out 7</td><td>Delay Tap #8</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>delay</span>(channel, milliseconds);</p>
- <p class=desc>Set output channel (0 to 7) to delay the signals by
- milliseconds. The maximum delay is approx 333 ms. The actual delay
- is rounded to the nearest sample. Each channel can be configured for
- any delay. There is no requirement to configure the "taps" in increasing
- delay order.
- </p>
- <p class=func><span class=keyword>disable</span>(channel);</p>
- <p class=desc>Disable a channel. The output of this channel becomes
- silent. If this channel is the longest delay, memory usage is
- automatically reduced to accomodate only the remaining channels used.
- </p>
- <h3>Hardware</h3>
- <p>By default, or when <span class=literal>AUDIO_MEMORY_23LC1024</span> is used (see below),
- a single 23LC1024 RAM chip is used, with these pins:
- <table class=doc align=center cellpadding=3>
- <tr class=top><th>Pin</th><th>Signal</th></tr>
- <tr class=odd><td align=center>6</td><td>CS</td></tr>
- <tr class=odd><td align=center>7</td><td>MOSI</td></tr>
- <tr class=odd><td align=center>12</td><td>MISO</td></tr>
- <tr class=odd><td align=center>14</td><td>SCK</td></tr>
- </table>
- </p>
- <p>When <span class=literal>AUDIO_MEMORY_MEMORYBOARD</span> is used, up to six
- 23LC1024 chips are used.
- </p>
- <p align=center><img src="img/memoryboard.jpg"><br><small><a href="https://oshpark.com/shared_projects/KZt5PaU7" target="_blank">Memoryboard 4</a></small></p>
- <p>
- <table class=doc align=center cellpadding=3>
- <tr class=top><th>Pin</th><th>Signal</th></tr>
- <tr class=odd><td align=center>2</td><td>CS0 (encoded)</td></tr>
- <tr class=odd><td align=center>3</td><td>CS1 (encoded)</td></tr>
- <tr class=odd><td align=center>4</td><td>CS2 (encoded)</td></tr>
- <tr class=odd><td align=center>7</td><td>MOSI</td></tr>
- <tr class=odd><td align=center>12</td><td>MISO</td></tr>
- <tr class=odd><td align=center>14</td><td>SCK</td></tr>
- </table>
- </p>
- <p>
- If fewer than 6 chips are soldered, the optional parameter for maximum delay
- must be used. See below for details. Each chip provides 1485 ms of delay
- memory, so the total of all objects using AUDIO_MEMORY_MEMORYBOARD must not
- exceed the amount of memory physically present.
- </p>
- <h3>Examples</h3>
- <p>
- <a href="https://www.youtube.com/watch?v=d80d1HWy5_s" target="_blank">Demo Video</a> (YouTube)
- </p>
- <!-- <p class=exam>File > Examples > Audio > Effects > Delay
- </p> -->
- <p>
- <a href="https://forum.pjrc.com/threads/29276-Limits-of-delay-effect-in-audio-library?p=79436&viewfull=1#post79436" target="_blank">Forum Conversaton</a> (with sample code)
- </p>
- <h3>Notes</h3>
- <p>External RAM allows for longer delays without consuming
- limited internal RAM. However, SPI communication is required,
- which consumes much more CPU time. The
- <a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html">AudioProcessorUsageMax</a>
- function may be used to monitor how much CPU time is consumed.
- </p>
- <p>You may specify the type of hardware to be used by editing the code. AUDIO_MEMORY_23LC1024
- specifies a single 23LC1024 chip. AUDIO_MEMORY_MEMORYBOARD allows using up to 6 of these
- chips.
- </p>
- <p class=desc><span class=keyword>AudioEffectDelayExternal</span> delayExt1(<span class=literal>AUDIO_MEMORY_23LC1024</span>);
- </p>
- <p>You may also create more than one delay using the same hardware, where the memory is partitioned
- by specifying a maximum delay in milliseconds. This can be useful if you wish to delay both
- channels of a stereo signal.
-
- <p class=desc><span class=keyword>AudioEffectDelayExternal</span> delayExt1(<span class=literal>AUDIO_MEMORY_23LC1024</span>, 700);<br><span class=keyword>AudioEffectDelayExternal</span> delayExt2(<span class=literal>AUDIO_MEMORY_23LC1024</span>, 700);
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectDelayExternal">
- <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/javascript">
- RED.nodes.registerType('AudioEffectBitcrusher',{
- shortName: "bitcrusher",
- inputs:1,
- outputs:1,
- category: 'effect-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioEffectBitcrusher">
- <h3>Summary</h3>
- <p>Reduce the samplerate and/or bitdepth of a source signal, resulting in
- a distorted sound.</p>
- <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 Input</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Signal Output</td></tr>
- </table>
- <h3>Parameters</h3>
- <p class=func><span class=keyword>bits</span>(xcrushBits);</p>
- <p class=desc>xcrushBits sets the bitdepth, from 1 to 16. A Value of 16
- does not crush the bitdepth, and is effectively a passthru for this part
- of the function.</p>
-
- <p class=func><span class=keyword>sampleRate</span>(xsampleRate);</p>
-
- <p class=desc>xsampleRate sets the frequency, from 1 to 44100Hz, however it
- works in integer steps so you will only really get a handful of results from
- the many samplerates you can pass. 44100 is passthru.</p>
-
- <p class=desc>set xbitDepth to 16 and xsampleRate to 44100 to pass audio
- through without any Bitcrush effect.</p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Effects > Bitcrusher
- </p>
- <h3>Notes</h3>
- <p>Needs a lot of improvement. Options for anti-aliasing would be nice in
- the future, but for now, it's rough, it's dirty and it sounds a bit like
- Nine Inch Nails.
- </p>
- <p><a href="http://www.pjrc.com/teensy/td_libs_AudioProcessorUsage.html" target="_blank">AudioNoInterrupts()</a>
- should be used when changing
- settings on multiple objects, so all changes always take effect
- at the same moment.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioEffectBitcrusher">
- <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/javascript">
- RED.nodes.registerType('AudioFilterBiquad',{
- shortName: "biquad",
- inputs:1,
- outputs:1,
- category: 'filter-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioFilterBiquad">
- <h3>Summary</h3>
- <div>
- <p>Biquadratic cascaded filter, useful for all sorts of filtering.
- Up to 4 stages may be cascaded.
- </p>
- <p align=center><img src="img/biquad.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>setLowpass</span>(stage, frequency, Q);</p>
- <p class=desc>Configure one stage of the filter (0 to 3) with low pass
- response, with the specified corner frequency and Q shape. If Q is
- higher that 0.7071, be careful of filter gain (see below).
- </p>
- <p class=func><span class=keyword>setHighpass</span>(stage, frequency, Q);</p>
- <p class=desc>Configure one stage of the filter (0 to 3) with high pass
- response, with the specified corner frequency and Q shape. If Q is
- higher that 0.7071, be careful of filter gain (see below).
- </p>
- <p class=func><span class=keyword>setBandpass</span>(stage, frequency, Q);</p>
- <p class=desc>Configure one stage of the filter (0 to 3) with band pass
- response. The filter has unity gain at the specified frequency. Q
- controls the width of frequencies allowed to pass.
- </p>
- <p class=func><span class=keyword>setNotch</span>(stage, frequency, Q);</p>
- <p class=desc>Configure one stage of the filter (0 to 3) with band reject (notch)
- response. Q controls the width of rejected frequencies.
- </p>
- <p class=func><span class=keyword>setCoefficients</span>(stage, array[5]);</p>
- <p class=desc>Configure one stage of the filter (0 to 3) with an arbitrary
- filter response. The array of coefficients is in order: B0, B1, B2, A1, A2.
- Each coefficient must be less than 2.0 and greater than -2.0. The array
- should be type double. Alternately, it may be type int, where 1.0 is
- represented with 1073741824 (2<sup>30</sup>).
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Effects > Filter
- </p>
- <h3>Notes</h3>
- <p>Filters can with gain must have their input signals attenuated, so the
- signal does not exceed 1.0.
- </p>
- <p>This object implements up to 4 cascaded stages. Unconfigured stages will
- not pass any signal.
- </p>
- <p>Biquad filters with low corner frequency (under about 400 Hz) can run into
- trouble with limited numerical precision, causing the filter to perform
- poorly. For very low corner frequency, the State Variable (Chamberlin)
- filter should be used.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioFilterBiquad">
- <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/javascript">
- RED.nodes.registerType('AudioFilterFIR',{
- shortName: "fir",
- inputs:1,
- outputs:1,
- category: 'filter-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioFilterFIR">
- <h3>Summary</h3>
- <div>
- <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 > Examples > Audio > Effects > Filter_FIR
- </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.appspot.com/fir/index.html" 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">
- <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/javascript">
- RED.nodes.registerType('AudioFilterStateVariable',{
- shortName: "filter",
- inputs:2,
- outputs:3,
- category: 'filter-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioFilterStateVariable">
- <h3>Summary</h3>
- <p>A State Variable (Chamberlin) Filter with 12 dB/octave roll-off,
- adjustable resonance, and optional signal control of corner
- frequency.</p>
- <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 Filter</td></tr>
- <tr class=odd><td align=center>In 1</td><td>Frequency Control</td></tr>
- <tr class=odd><td align=center>Out 0</td><td>Low Pass Output</td></tr>
- <tr class=odd><td align=center>Out 1</td><td>Band Pass Output</td></tr>
- <tr class=odd><td align=center>Out 2</td><td>High Pass Output</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>frequency</span>(freq);</p>
- <p class=desc>Set the filter's corner frequency. When a signal is
- connected to the control input, the filter will implement this
- frequency when the signal is zero.
- </p>
- <p class=func><span class=keyword>resonance</span>(Q);</p>
- <p class=desc>Set the filter's resonance. Q ranges from 0.7 to 5.0.
- Resonance greater than 0.707 will amplify the signal near the
- corner frequency. You must attenuate the signal before input
- to this filter, to prevent clipping.
- </p>
- <p class=func><span class=keyword>octaveControl</span>(octaves);</p>
- <p class=desc>Set how much (in octaves) the control signal can alter
- the filter's corner freqency. Range is 0 to 7 octaves. For
- example, when set to 2.5, a full scale positive signal (1.0) will
- shift the filter frequency up 2.5 octaves, and a full scale negative
- signal will shift it down 2.5 octaves.
- </p>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>
- When controlled by a signal, the equation for the filter
- frequency is:
- </p>
- <p>
- F = Fcenter * 2^<sup>(signal * octaves)</sup>
- <br><small>If anyone knows how to do HTML equations, please
- help me improve this.....</small>
- </p>
- <p>When operating with signal control of corner frequency, this
- object uses approximately 4% of the CPU time on Teensy 3.1.
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioFilterFIR">
- <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/javascript">
- RED.nodes.registerType('AudioAnalyzePeak',{
- shortName: "peak",
- inputs:1,
- outputs:0,
- category: 'analyze-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioAnalyzePeak">
- <h3>Summary</h3>
- <p>Track the signal peak amplitude. Very useful for simple
- audio level response projects, and general troubleshooting.</p>
- <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 analyze</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>available</span>();</p>
- <p class=desc>Returns true each time new peak data is available.
- </p>
- <p class=func><span class=keyword>read</span>();</p>
- <p class=desc>Read the highest peak value since the last read.
- Return is from 0.0 to 1.0.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Analysis > PeakMeterMono
- </p>
- <p class=exam>File > Examples > Audio > Analysis > PeakMeterStereo
- </p>
- <h3>Notes</h3>
- <p></p>
- </script>
- <script type="text/x-red" data-template-name="AudioAnalyzePeak">
- <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/javascript">
- RED.nodes.registerType('AudioAnalyzeFFT256',{
- shortName: "fft256",
- inputs:1,
- outputs:0,
- category: 'analyze-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioAnalyzeFFT256">
- <h3>Summary</h3>
- <p>Compute a 256 point Fast Fourier Transform (FFT) frequency analysis,
- with real value (magnitude) output. The frequency resolution is
- 172 Hz, useful for simple audio visualization.</p>
- <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 convert to frequency bins</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>available</span>();</p>
- <p class=desc>Returns true each time the FFT analysis produces new output data.
- </p>
- <p class=func><span class=keyword>read</span>(binNumber);</p>
- <p class=desc>Read a single frequency bin, from 0 to 127. The result is scaled
- so 1.0 represents a full scale sine wave.
- </p>
- <p class=func><span class=keyword>read</span>(firstBin, lastBin);</p>
- <p class=desc>Read several frequency bins, returning their sum. The higher
- audio octaves are represented by many bins, which are typically read
- as a group for audio visualization.
- </p>
- <p class=func><span class=keyword>averageTogether</span>(number);</p>
- <p class=desc>New data is produced very radidly, approximately 344 times
- per second. Multiple outputs can be averaged together, so available()
- returns true at a slower rate.
- </p>
- <p class=func><span class=keyword>windowFunction</span>(window);</p>
- <p class=desc>Set the window function to be used. AudioWindowHanning256
- is the default. Windowing may be disabled by NULL, but windowing
- should be used for all non-periodic (music) signals, and all periodic
- signals that are not exact integer division of the sample rate.
- </p>
-
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > MemoryAndCpuUsage
- </p>
- <h3>Notes</h3>
- <p>The raw 16 bit output data bins may be access with myFFT.output[num], where
- num is 0 to 127.</p>
- <p>TODO: caveats about spectral leakage vs frequency precision for arbitrary signals</p>
- <p>Window Types:
- <ul>
- <li><span class=literal>AudioWindowHanning256</span> (default)</li>
- <li><span class=literal>AudioWindowBartlett256</span></li>
- <li><span class=literal>AudioWindowBlackman256</span></li>
- <li><span class=literal>AudioWindowFlattop256</span></li>
- <li><span class=literal>AudioWindowBlackmanHarris256</span></li>
- <li><span class=literal>AudioWindowNuttall256</span></li>
- <li><span class=literal>AudioWindowBlackmanNuttall256</span></li>
- <li><span class=literal>AudioWindowWelch256</span></li>
- <li><span class=literal>AudioWindowHamming256</span></li>
- <li><span class=literal>AudioWindowCosine256</span></li>
- <li><span class=literal>AudioWindowTukey256</span></li>
- </ul>
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioAnalyzeFFT256">
- <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/javascript">
- RED.nodes.registerType('AudioAnalyzeFFT1024',{
- shortName: "fft1024",
- inputs:1,
- outputs:0,
- category: 'analyze-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioAnalyzeFFT1024">
- <h3>Summary</h3>
- <p>Compute a 1024 point Fast Fourier Transform (FFT) frequency analysis,
- with real value (magnitude) output. The frequency resolution is
- 43 Hz, useful detailed for audio visualization.</p>
- <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 convert to frequency bins</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>available</span>();</p>
- <p class=desc>Returns true each time the FFT analysis produces new output data.
- </p>
- <p class=func><span class=keyword>read</span>(binNumber);</p>
- <p class=desc>Read a single frequency bin, from 0 to 511. The result is scaled
- so 1.0 represents a full scale sine wave.
- </p>
- <p class=func><span class=keyword>read</span>(firstBin, lastBin);</p>
- <p class=desc>Read several frequency bins, returning their sum. The higher
- audio octaves are represented by many bins, which are typically read
- as a group for audio visualization.
- </p>
- <p class=func><span class=keyword>averageTogether</span>(number);</p>
- <p class=desc>This function does nothing. The 1024 point FFT always
- updates at approximately 86 times per second.
- </p>
- <p class=func><span class=keyword>windowFunction</span>(window);</p>
- <p class=desc>Set the window function to be used. AudioWindowHanning1024
- is the default. Windowing may be disabled by NULL, but windowing
- should be used for all non-periodic (music) signals, and all periodic
- signals that are not exact integer division of the sample rate.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Analysis > FFT
- </p>
- <p class=exam>File > Examples > Audio > Analysis > SpectrumAnalyzerBasic
- </p>
- <h3>Notes</h3>
- <p>The raw 16 bit output data bins may be access with myFFT.output[num], where
- num is 0 to 511.</p>
- <p>TODO: caveats about spectral leakage vs frequency precision for arbitrary signals</p>
- <p>Window Types:
- <ul>
- <li><span class=literal>AudioWindowHanning1024</span> (default)</li>
- <li><span class=literal>AudioWindowBartlett1024</span></li>
- <li><span class=literal>AudioWindowBlackman1024</span></li>
- <li><span class=literal>AudioWindowFlattop1024</span></li>
- <li><span class=literal>AudioWindowBlackmanHarris1024</span></li>
- <li><span class=literal>AudioWindowNuttall1024</span></li>
- <li><span class=literal>AudioWindowBlackmanNuttall1024</span></li>
- <li><span class=literal>AudioWindowWelch1024</span></li>
- <li><span class=literal>AudioWindowHamming1024</span></li>
- <li><span class=literal>AudioWindowCosine1024</span></li>
- <li><span class=literal>AudioWindowTukey1024</span></li>
- </ul>
- </p>
- <p>1024 point FFT has a peak CPU usage of approx 52% on Teensy 3.1.
- Average usage is much lower. Future versions might distribute the
- load more evenly over time....
- </p>
- </script>
- <script type="text/x-red" data-template-name="AudioAnalyzeFFT1024">
- <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/javascript">
- RED.nodes.registerType('AudioAnalyzeToneDetect',{
- shortName: "tone",
- inputs:1,
- outputs:0,
- category: 'analyze-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioAnalyzeToneDetect">
- <h3>Summary</h3>
- <p>Detect the level of a single tone</p>
- <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 analyze</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>frequency</span>(freq);</p>
- <p class=desc>Set the frequency to detect. The default detection time
- will be 10 cycles of this frequency.
- </p>
- <p class=func><span class=keyword>frequency</span>(freq, cycles);</p>
- <p class=desc>Set the frequency to detect, and the number of cycles.
- Longer detection time (more cycles) will give higher precision,
- but of course slower response.
- </p>
- <p class=func><span class=keyword>available</span>();</p>
- <p class=desc>Returns true (non-zero) each time a detection interval
- (number of cycles) completed and a new level is detected.
- </p>
- <p class=func><span class=keyword>read</span>();</p>
- <p class=desc>Read the detected signal level. Range is 0 to 1.0.
- </p>
- <p class=func><span class=keyword>threshold</span>(level);</p>
- <p class=desc>Set a detection threshold, where the bool test operation
- will return true if at or above this level, or false when below.
- </p>
- <p class=func>(bool)</p>
- <p class=desc>By testing the object as a boolean value, you can respond
- to detection of a tone.
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > Analysis > DialTone_Serial
- </p>
- <p class=exam>File > Examples > Audio > Analysis > DialTone_7segment
- </p>
- <h3>Notes</h3>
- <p>Low frequency detection has trouble with numerical precision.
- Works really well for all 8 DTMF frequencies, but fails for
- detecting "sub audible tones" used in some control applications.</p>
- <p>The (bool) test continues to return true until the next detection
- interval (the configured number of cycles). This behavior may
- change in future versions, for a single true each time the signal
- is detected, and then false for the remainder of that interval.</p>
- </script>
- <script type="text/x-red" data-template-name="AudioAnalyzeToneDetect">
- <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/javascript">
- RED.nodes.registerType('AudioAnalyzePrint',{
- shortName: "print",
- inputs:1,
- outputs:0,
- category: 'analyze-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioAnalyzePrint">
- <h3>Summary</h3>
- <p>Print raw audio data to the Arduino Serial Monitor. This
- object creates massive output quickly, and should not normally be used.</p>
- <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 print</td></tr>
- </table>
- <h3>Functions</h3>
- <p class=func><span class=keyword>name</span>(string);</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>trigger</span>();</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>trigger</span>(level, edge);</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>delay</span>(samples);</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>length</span>(samples);</p>
- <p class=desc>blah blah blah blah
- </p>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p>This object doesn't work very well and probably should not be used.</p>
- </script>
- <script type="text/x-red" data-template-name="AudioAnalyzePrint">
- <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/javascript">
- RED.nodes.registerType('AudioControlSGTL5000',{
- shortName: "sgtl5000",
- inputs:0,
- outputs:0,
- category: 'control-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioControlSGTL5000">
- <h3>Summary</h3>
- <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>
- <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 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>
-
-
- <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 > Examples > Audio > HardwareTesting > PassThroughStereo
- </p>
- <p class=exam>File > Examples > Audio > HardwareTesting > SGTL5000 > dap_bass_enhance
- </p>
- <p class=exam>File > Examples > Audio > HardwareTesting > SGTL5000 > dap_avc_agc
- </p>
- <p class=exam>File > Examples > Audio > HardwareTesting > SGTL5000 > balanceDAC
- </p>
- <p class=exam>File > Examples > Audio > HardwareTesting > SGTL5000 > balanceHP
- </p>
- <p class=exam>File > Examples > Audio > HardwareTesting > SGTL5000 > CalcBiquadToneControlDAP
- </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/javascript">
- RED.nodes.registerType('AudioControlWM8731',{
- shortName: "wm8731",
- inputs:0,
- outputs:0,
- category: 'control-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioControlWM8731">
- <h3>Summary</h3>
- <p>Control a WM8731 chip in slave mode, where it receives all clocks from Teensy</p>
- <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, since this control object configures the WM8731 into
- slave mode.
- </p>
- <h3>Functions</h3>
- <p class=func><span class=keyword>enable</span>();</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>disable</span>();</p>
- <p class=desc>not implemented
- </p>
- <p class=func><span class=keyword>volume</span>(level);</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>inputLevel</span>(level);</p>
- <p class=desc>not implemented
- </p>
- <p class=func><span class=keyword>inputSelect</span>(input);</p>
- <p class=desc>not implemented
- </p>
- <!--<h3>Examples</h3>
- <p class=exam>File > Examples > Audio >
- </p>-->
- <h3>Notes</h3>
- <p></p>
- </script>
- <script type="text/x-red" data-template-name="AudioControlWM8731">
- <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/javascript">
- RED.nodes.registerType('AudioControlWM8731master',{
- shortName: "wm8731m",
- inputs:0,
- outputs:0,
- category: 'control-function',
- color:"#E6E0F8",
- icon: "arrow-in.png"
- });
- </script>
- <script type="text/x-red" data-help-name="AudioControlWM8731master">
- <h3>Summary</h3>
- <p>Control a WM8731 chip in master mode, where it controls all I2S timing.</p>
- <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 slave mode objects
- must be used, since this control object configures the WM8731 into
- master mode.
- </p>
- <h3>Functions</h3>
- <p class=func><span class=keyword>enable</span>();</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>disable</span>();</p>
- <p class=desc>not implemented
- </p>
- <p class=func><span class=keyword>volume</span>(level);</p>
- <p class=desc>blah blah blah blah
- </p>
- <p class=func><span class=keyword>inputLevel</span>(level);</p>
- <p class=desc>not implemented
- </p>
- <p class=func><span class=keyword>inputSelect</span>(input);</p>
- <p class=desc>not implemented
- </p>
- <h3>Examples</h3>
- <p class=exam>File > Examples > Audio > HardwareTesting > WM8731MikroSine
- </p>
- <h3>Notes</h3>
- <p></p>
- </script>
- <script type="text/x-red" data-template-name="AudioControlWM8731master">
- <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>
|