libcm is a C development framework with an emphasis on audio signal processing applications.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

cmDspPgm.c 145KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401
  1. //| Copyright: (C) 2009-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. //( { file_desc:"'snap' programs." kw:[snap] }
  4. #include "cmPrefix.h"
  5. #include "cmGlobal.h"
  6. #include "cmFloatTypes.h"
  7. #include "cmRpt.h"
  8. #include "cmErr.h"
  9. #include "cmCtx.h"
  10. #include "cmMem.h"
  11. #include "cmMallocDebug.h"
  12. #include "cmLinkedHeap.h"
  13. #include "cmFileSys.h"
  14. #include "cmSymTbl.h"
  15. #include "cmJson.h"
  16. #include "cmPrefs.h"
  17. #include "cmDspValue.h"
  18. #include "cmMsgProtocol.h"
  19. #include "cmThread.h"
  20. #include "cmUdpPort.h"
  21. #include "cmUdpNet.h"
  22. #include "cmSerialPort.h"
  23. #include "cmTime.h"
  24. #include "cmAudioSys.h"
  25. #include "cmProcObj.h"
  26. #include "cmPP_NARG.h"
  27. #include "cmDspCtx.h"
  28. #include "cmDspClass.h"
  29. #include "cmDspSys.h"
  30. #include "cmDspPgm.h"
  31. #include "cmDspPgmPP.h"
  32. #include "cmDspPgmKr.h"
  33. //)
  34. //( { label:cmDspPgm_ReflecCalc file_desc:"Acoustic time-of-flight measurement program." kw:[spgm] }
  35. cmDspRC_t _cmDspSysPgm_ReflectCalc( cmDspSysH_t h, void** userPtrPtr )
  36. {
  37. // audio inputs
  38. cmDspInst_t* ai0 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 0 );
  39. cmDspInst_t* ai1 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 1 );
  40. cmDspInst_t* rc0 = cmDspSysAllocInst(h,"ReflectCalc", NULL, 0 );
  41. //cmDspInst_t* rc1 = cmDspSysAllocInst(h,"ReflectCalc", NULL, 0 );
  42. // audio outputs
  43. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 0 );
  44. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 1 );
  45. // input meters
  46. cmDspInst_t* im0 = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  47. cmDspInst_t* im1 = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  48. // output meters
  49. //cmDspInst_t* om0 = cmDspSysAllocInst(h,"AMeter","Out 0", 0);
  50. //cmDspInst_t* om1 = cmDspSysAllocInst(h,"AMeter","Out 1",0);
  51. // gain controls
  52. cmDspInst_t* igain = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0);
  53. cmDspInst_t* ogain = cmDspSysAllocInst( h,"Scalar", "Out Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 3.0);
  54. cmDspSysConnectAudio(h, ai0, "out", im0, "in"); // ain0 -> imtr0
  55. cmDspSysConnectAudio(h, ai1, "out", im1, "in"); // ain1 -> imtr1
  56. cmDspSysInstallCb( h, igain,"val", ai0, "gain", NULL); // igain -> ain0
  57. cmDspSysInstallCb( h, igain,"val", ai1, "gain", NULL); // igain -> ain0
  58. cmDspSysInstallCb( h, ogain,"val", ao0, "gain", NULL); // igain -> ain0
  59. cmDspSysInstallCb( h, ogain,"val", ao1, "gain", NULL); // igain -> ain0
  60. cmDspSysConnectAudio(h, ai0,"out", rc0, "in" );
  61. cmDspSysConnectAudio(h, rc0,"out", ao0, "in" );
  62. cmDspSysConnectAudio(h, ai1,"out", ao1, "in" );
  63. return kOkDspRC;
  64. }
  65. //------------------------------------------------------------------------------
  66. //)
  67. //( { label:cmDspPgm_SyncRecd file_desc:"Generate MIDI / Audio synchronization data with cmDspSyncRecd." kw:[spgm] }
  68. cmDspRC_t _cmDspSysPgm_SyncRecd( cmDspSysH_t h, void** userPtrPtr )
  69. {
  70. cmDspRC_t rc = kOkDspRC;
  71. unsigned audioFileBits = 24;
  72. cmDspInst_t* ai0p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 0 );
  73. cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 1 );
  74. cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 0 );
  75. cmDspInst_t* srp = cmDspSysAllocInst(h,"SyncRecd",NULL, 3, "/home/kevin/temp/kr/sr","sr","audio",audioFileBits);
  76. cmDspInst_t* am0p = cmDspSysAllocInst(h,"AMeter", "Left", 0);
  77. cmDspInst_t* am1p = cmDspSysAllocInst(h,"AMeter", "Right",0);
  78. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 0 );
  79. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 1 );
  80. cmDspInst_t* chk = cmDspSysAllocInst(h,"Checkbox","recd", 5, "Recd","open","close", 1.0, 0.0);
  81. cmDspInst_t* gain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  82. cmDspInst_t* gain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  83. // check for allocation errors
  84. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  85. goto errLabel;
  86. cmDspSysInstallCb(h, mip, "status", srp, "status", NULL);
  87. cmDspSysInstallCb(h, mip, "d0", srp, "d0", NULL);
  88. cmDspSysInstallCb(h, mip, "d1", srp, "d1", NULL);
  89. cmDspSysInstallCb(h, mip, "sec", srp, "sec", NULL);
  90. cmDspSysInstallCb(h, mip, "nsec", srp, "nsec", NULL);
  91. cmDspSysInstallCb(h, chk, "sym", srp, "cmd", NULL);
  92. cmDspSysInstallCb(h, gain0, "val", ai0p, "gain", NULL);
  93. cmDspSysInstallCb(h, gain1, "val", ai1p, "gain", NULL);
  94. cmDspSysConnectAudio(h, ai0p, "out", srp, "ain-0");
  95. cmDspSysConnectAudio(h, ai1p, "out", srp, "ain-1");
  96. cmDspSysConnectAudio(h, ai0p, "out", am0p, "in");
  97. cmDspSysConnectAudio(h, ai1p, "out", am1p, "in");
  98. cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in");
  99. cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in");
  100. errLabel:
  101. return rc;
  102. }
  103. //------------------------------------------------------------------------------
  104. //)
  105. //( { label:cmDspPgm_MidiFilePlay file_desc:"MIDI file player example program." kw:[spgm] }
  106. cmDspRC_t _cmDspSysPgm_MidiFilePlay( cmDspSysH_t h, void** userPtrPtr )
  107. {
  108. cmDspRC_t rc = kOkDspRC;
  109. const cmChar_t* deviceName = "Scarlett 18i20 USB";
  110. const cmChar_t* portName = "Scarlett 18i20 USB MIDI 1";
  111. //const cmChar_t* deviceName = "Fastlane";
  112. //const cmChar_t* portName = "Fastlane MIDI A";
  113. //const cmChar_t* deviceName = "DKV-M4";
  114. //const cmChar_t* portName = "DKV-M4 MIDI 1";
  115. const char* fn0 = "media/audio/midi/988-v25.mid";
  116. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  117. cmDspInst_t* fnp = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"MIDI Files (*.mid)\tMIDI Files (*.{mid})",fn);
  118. cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0);
  119. cmDspInst_t* ai0p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 2 );
  120. cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 3 );
  121. cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 );
  122. cmDspInst_t* pic = cmDspSysAllocInst(h,"Picadae", NULL, 0 );
  123. cmDspInst_t* mop = cmDspSysAllocInst( h,"MidiOut", NULL, 2, deviceName, portName);
  124. cmDspInst_t* start = cmDspSysAllocInst( h,"Button", "start", 2, kButtonDuiId, 0.0 );
  125. cmDspInst_t* stop = cmDspSysAllocInst( h,"Button", "stop", 2, kButtonDuiId, 0.0 );
  126. cmDspInst_t* cont = cmDspSysAllocInst( h,"Button", "continue", 2, kButtonDuiId, 0.0 );
  127. cmDspInst_t* beg = cmDspSysAllocInst(h,"Scalar", "Beg Samp", 5, kNumberDuiId, 0.0, 1000000000.0, 1.0, 0.0 );
  128. cmDspInst_t* end = cmDspSysAllocInst(h,"Scalar", "End Samp", 5, kNumberDuiId, 0.0, 1000000000.0, 1.0, 1000000000.0 );
  129. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 2 );
  130. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 3 );
  131. cmDspInst_t* ao2p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 4 );
  132. cmDspInst_t* ao3p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 5 );
  133. cmDspInst_t* im0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  134. cmDspInst_t* im1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  135. cmDspInst_t* om0p = cmDspSysAllocInst(h,"AMeter","Out 0", 0);
  136. cmDspInst_t* om1p = cmDspSysAllocInst(h,"AMeter","Out 1",0);
  137. cmDspInst_t* om2p = cmDspSysAllocInst(h,"AMeter","Out 2", 0);
  138. cmDspInst_t* om3p = cmDspSysAllocInst(h,"AMeter","Out 3",0);
  139. // check for allocation errors
  140. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  141. goto errLabel;
  142. cmDspSysInstallCb( h, fnp, "out", mfp, "fn", NULL);
  143. cmDspSysInstallCb( h, start, "sym", beg, "send", NULL);
  144. cmDspSysInstallCb( h, beg, "val", mfp, "bsi", NULL);
  145. cmDspSysInstallCb( h, start, "sym", end, "send", NULL);
  146. cmDspSysInstallCb( h, end, "val", mfp, "esi", NULL);
  147. cmDspSysInstallCb( h, start, "sym", mfp, "sel", NULL);
  148. cmDspSysInstallCb( h, stop, "sym", mfp, "sel", NULL);
  149. cmDspSysInstallCb( h, cont, "sym", mfp, "sel", NULL);
  150. bool usePicadaeFl = false;
  151. if( usePicadaeFl )
  152. {
  153. cmDspSysInstallCb( h, mfp, "d1", pic, "d1", NULL);
  154. cmDspSysInstallCb( h, mfp, "d0", pic, "d0", NULL);
  155. cmDspSysInstallCb( h, mfp, "status", pic, "status", NULL);
  156. cmDspSysInstallCb( h, pic, "d1", mop, "d1", NULL);
  157. cmDspSysInstallCb( h, pic, "d0", mop, "d0", NULL);
  158. cmDspSysInstallCb( h, pic, "status", mop, "status", NULL);
  159. }
  160. else
  161. {
  162. cmDspSysInstallCb( h, mfp, "d1", mop, "d1", NULL);
  163. cmDspSysInstallCb( h, mfp, "d0", mop, "d0", NULL);
  164. cmDspSysInstallCb( h, mfp, "status", mop, "status", NULL);
  165. }
  166. //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in");
  167. //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in");
  168. cmDspSysConnectAudio(h, ai0p, "out", im0p, "in"); //ain0 -> imtr0
  169. cmDspSysConnectAudio(h, ai1p, "out", im1p, "in"); //ain1 -> imtr1
  170. cmDspSysInstallCb( h, ignp,"val", ai0p, "gain", NULL); // igain -> ain0
  171. cmDspSysConnectAudio(h, ai0p,"out", ao0p, "in" ); // ain0 -> aout0
  172. cmDspSysConnectAudio(h, ai0p,"out", om0p, "in" ); // ain0 -> omtr0
  173. cmDspSysInstallCb( h, ignp,"val", ai1p, "gain", NULL); // igain -> ain1
  174. cmDspSysConnectAudio(h, ai1p,"out", ao1p, "in" ); // ain1 -> aout1
  175. cmDspSysConnectAudio(h, ai1p,"out", om1p, "in" ); // ain1 -> omtr1
  176. cmDspSysConnectAudio(h, ai0p,"out", ao2p, "in" ); // ain0 -> aout2
  177. cmDspSysConnectAudio(h, ai0p,"out", om2p, "in" ); // ain0 -> omtr0
  178. cmDspSysConnectAudio(h, ai1p,"out", ao3p, "in" ); // ain1 -> aout3
  179. cmDspSysConnectAudio(h, ai1p,"out", om3p, "in" ); // ain0 -> omtr0
  180. errLabel:
  181. cmFsFreeFn(fn);
  182. return rc;
  183. }
  184. //------------------------------------------------------------------------------
  185. //)
  186. //( { label:cmDspPgm_Test_Midi file_desc:"MIDI input/output example program." kw:[spgm] }
  187. cmDspRC_t _cmDspSysPgm_Test_Midi( cmDspSysH_t h, void** userPtrPtr )
  188. {
  189. cmDspRC_t rc = kOkDspRC;
  190. const cmChar_t* deviceName = "Fastlane";
  191. const cmChar_t* portName = "Fastlane MIDI A";
  192. #ifdef OS_OSX
  193. deviceName = "MOTU - FastLane USB";
  194. portName = "Port A";
  195. //deviceName = "RME - Fireface UFX (23148636)";
  196. //portName = "Port 2";
  197. #endif
  198. cmDspInst_t* sendBtn = cmDspSysAllocInst( h,"Button", "Send", 2, kButtonDuiId, 0.0 );
  199. cmDspInst_t* status = cmDspSysAllocInst( h,"Scalar", "Status", 5, kNumberDuiId, 0.0, 127.0, 1.0, 144.0);
  200. cmDspInst_t* d0 = cmDspSysAllocInst( h,"Scalar", "D0", 5, kNumberDuiId, 0.0, 127.0, 1.0, 64.0);
  201. cmDspInst_t* d1 = cmDspSysAllocInst( h,"Scalar", "D1", 5, kNumberDuiId, 0.0, 127.0, 1.0, 64.0);
  202. cmDspInst_t* midiOut = cmDspSysAllocInst( h,"MidiOut", NULL, 2, deviceName, portName);
  203. cmDspInst_t* midiIn = cmDspSysAllocInst( h,"MidiIn", NULL, 0 );
  204. //cmDspInst_t* printer = cmDspSysAllocInst( h,"Printer", NULL, 1, ">" );
  205. cmDspInst_t* prst = cmDspSysAllocInst( h,"Printer", NULL, 1, "st>" );
  206. cmDspInst_t* prd0 = cmDspSysAllocInst( h,"Printer", NULL, 1, "d0>" );
  207. cmDspInst_t* prd1 = cmDspSysAllocInst( h,"Printer", NULL, 1, "d1>" );
  208. // check for allocation errors
  209. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  210. goto errLabel;
  211. cmDspSysInstallCb( h, sendBtn, "out", d1, "send", NULL);
  212. cmDspSysInstallCb( h, sendBtn, "out", d0, "send", NULL);
  213. cmDspSysInstallCb( h, sendBtn, "out", status, "send", NULL);
  214. cmDspSysInstallCb( h, status, "val", midiOut, "status",NULL);
  215. cmDspSysInstallCb( h, d0, "val", midiOut, "d0", NULL);
  216. cmDspSysInstallCb( h, d1, "val", midiOut, "d1", NULL);
  217. cmDspSysInstallCb( h, midiIn, "status", prst, "in", NULL);
  218. cmDspSysInstallCb( h, midiIn, "d0", prd0, "in", NULL);
  219. cmDspSysInstallCb( h, midiIn, "d1", prd1, "in", NULL);
  220. //cmDspSysInstallCb( h, midiIn, "smpidx", printer, "in", NULL);
  221. errLabel:
  222. return rc;
  223. }
  224. //------------------------------------------------------------------------------
  225. //)
  226. //( { label:cmDspPgm_Test_Pedals file_desc:"MIDI input/output example program." kw:[spgm] }
  227. cmDspRC_t _cmDspSysPgm_Test_Pedals( cmDspSysH_t h, void** userPtrPtr )
  228. {
  229. cmDspRC_t rc = kOkDspRC;
  230. //const cmChar_t* deviceName = "Fastlane";
  231. //const cmChar_t* portName = "Fastlane MIDI A";
  232. const cmChar_t* deviceName = "Apple Inc. - IAC Driver";
  233. const cmChar_t* portName = "Bus 1";
  234. //deviceName = "MOTU - FastLane USB";
  235. //portName = "Port A";
  236. //deviceName = "RME - Fireface UFX (23148636)";
  237. //portName = "Port 2";
  238. cmDspInst_t* ai0 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 0 );
  239. cmDspInst_t* ai1 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 1 );
  240. cmDspInst_t* on0 = cmDspSysAllocButton( h, "Note On 1", 1.0 );
  241. cmDspInst_t* of0 = cmDspSysAllocButton( h, "Off 1 ", 2.0 );
  242. cmDspInst_t* on1 = cmDspSysAllocButton( h, "Note On 2", 3.0 );
  243. cmDspInst_t* of1 = cmDspSysAllocButton( h, "Off 2 ", 4.0 );
  244. cmDspInst_t* dm1 = cmDspSysAllocButton( h, "Damp On ", 5.0 );
  245. cmDspInst_t* dm0 = cmDspSysAllocButton( h, "Damp Off ", 6.0 );
  246. cmDspInst_t* sf1 = cmDspSysAllocButton( h, "Soft On ", 5.0 );
  247. cmDspInst_t* sf0 = cmDspSysAllocButton( h, "Soft Off ", 6.0 );
  248. cmDspInst_t* so1 = cmDspSysAllocButton( h, "Sost On ", 5.0 );
  249. cmDspInst_t* so0 = cmDspSysAllocButton( h, "Sost Off ", 6.0 );
  250. cmDspInst_t* lst = cmDspSysAllocInst( h, "MsgList","Seq", 1, "note_list");
  251. cmDspInst_t* mop = cmDspSysAllocInst( h, "MidiOut", NULL, 2, deviceName, portName);
  252. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 2 );
  253. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 3 );
  254. //cmDspInst_t* prt = cmDspSysAllocInst( h,"Printer", NULL, 1, "" );
  255. // check for allocation errors
  256. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  257. goto errLabel;
  258. cmDspSysConnectAudio( h, ai0, "out", ao0, "in" );
  259. cmDspSysConnectAudio( h, ai1, "out", ao1, "in" );
  260. cmDspSysInstallCb( h, on0, "out", lst, "sel", NULL );
  261. cmDspSysInstallCb( h, of0, "out", lst, "sel", NULL );
  262. cmDspSysInstallCb( h, on1, "out", lst, "sel", NULL );
  263. cmDspSysInstallCb( h, of1, "out", lst, "sel", NULL );
  264. cmDspSysInstallCb( h, dm1, "out", lst, "sel", NULL );
  265. cmDspSysInstallCb( h, dm0, "out", lst, "sel", NULL );
  266. cmDspSysInstallCb( h, sf1, "out", lst, "sel", NULL );
  267. cmDspSysInstallCb( h, sf0, "out", lst, "sel", NULL );
  268. cmDspSysInstallCb( h, so1, "out", lst, "sel", NULL );
  269. cmDspSysInstallCb( h, so0, "out", lst, "sel", NULL );
  270. //cmDspSysInstallCb( h, lst, "d1", prt, "in", NULL );
  271. //cmDspSysInstallCb( h, lst, "d0", prt, "in", NULL );
  272. //cmDspSysInstallCb( h, lst, "status", prt, "in", NULL );
  273. cmDspSysInstallCb( h, lst, "d1", mop, "d1", NULL);
  274. cmDspSysInstallCb( h, lst, "d0", mop, "d0", NULL);
  275. cmDspSysInstallCb( h, lst, "status", mop, "status", NULL);
  276. errLabel:
  277. return rc;
  278. }
  279. //------------------------------------------------------------------------------
  280. //)
  281. //( { label:cmDspPgm_Stereo_Through file_desc:"Stereo audio through example program." kw:[spgm] }
  282. cmDspRC_t _cmDspSysPgm_Stereo_Through( cmDspSysH_t h, void** userPtrPtr )
  283. {
  284. cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 0.0);
  285. //cmDspInst_t* ognp = cmDspSysAllocInst( h,"Scalar", "Out Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0);
  286. cmDspInst_t* hzp = cmDspSysAllocInst(h,"Scalar", "Hz", 5, kNumberDuiId, 0.0, 10.0, 0.001, 1.0);
  287. cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  288. cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable",NULL, 2, cmDspSysSampleRate(h), 2 );
  289. cmDspInst_t* ai0p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 2 );
  290. cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 3 );
  291. // MOTU Traveler: Use channels 2&3 (out plugs:3&4) because 0&1 do not show up on plugs 1&2.
  292. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 0 );
  293. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 1 );
  294. cmDspInst_t* im0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  295. cmDspInst_t* im1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  296. cmDspInst_t* om0p = cmDspSysAllocInst(h,"AMeter","Out 0", 0);
  297. cmDspInst_t* om1p = cmDspSysAllocInst(h,"AMeter","Out 1",0);
  298. //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in");
  299. //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in");
  300. cmDspSysConnectAudio(h, ai0p, "out", im0p, "in"); //ain0 -> imtr0
  301. cmDspSysConnectAudio(h, ai1p, "out", im1p, "in"); //ain1 -> imtr1
  302. if(0)
  303. {
  304. cmDspSysInstallCb( h, hzp, "val", php, "mult", NULL); // hz -> phs
  305. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phs -> wt
  306. cmDspSysConnectAudio(h, wtp, "out", ao0p, "in" ); // wt -> aout0
  307. cmDspSysConnectAudio(h, wtp, "out", om0p, "in" ); // wt -> omtr0
  308. }
  309. else
  310. {
  311. cmDspSysInstallCb( h, ignp,"val", ai0p, "gain", NULL); // igain -> ain0
  312. cmDspSysConnectAudio(h, ai0p,"out", ao0p, "in" ); // ain0 -> aout0
  313. cmDspSysConnectAudio(h, ai0p,"out", om0p, "in" ); // ain0 -> omtr0
  314. }
  315. cmDspSysInstallCb( h, ignp,"val", ai1p, "gain", NULL); // igain -> ain1
  316. cmDspSysConnectAudio(h, ai1p,"out", ao1p, "in" ); // ain1 -> aout1
  317. cmDspSysConnectAudio(h, ai1p,"out", om1p, "in" ); // ain1 -> omtr1
  318. return kOkDspRC;
  319. }
  320. //------------------------------------------------------------------------------
  321. //)
  322. //( { label:cmDspSysPgm_All_In_And_Out file_desc:"Meter all the input channels and pass two channels to the output." kw:[spgm] }
  323. cmDspRC_t _cmDspSysPgm_All_In_And_Out( cmDspSysH_t h, void** userPtrPtr )
  324. {
  325. cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0);
  326. const unsigned inN = 18;
  327. cmDspInst_t* ainA[inN];
  328. cmDspInst_t* aoutA[inN];
  329. cmDspInst_t* imtrA[inN];
  330. int i;
  331. for(i=0;i<inN; ++i)
  332. {
  333. char label[32];
  334. snprintf(label,32,"in %i",i);
  335. ainA[i] = cmDspSysAllocInst(h,"AudioIn", NULL, 1, i );
  336. imtrA[i] = cmDspSysAllocInst(h,"AMeter",label, 0);
  337. aoutA[i] = cmDspSysAllocInst(h,"AudioOut", NULL, 1, i );
  338. }
  339. for(i=0; i<inN; ++i)
  340. {
  341. cmDspSysInstallCb( h, ignp, "val", ainA[i], "gain", NULL); // igain -> ain
  342. cmDspSysConnectAudio(h, ainA[i],"out", imtrA[i], "in" ); // ain -> imtr
  343. cmDspSysConnectAudio(h, ainA[i],"out", aoutA[i], "in" ); // ain -> aout
  344. }
  345. return kOkDspRC;
  346. }
  347. //------------------------------------------------------------------------------
  348. //)
  349. //( { label:cmDspPgm_Stereo_Fx file_desc:"Stereo audio effects example program." kw:[spgm] }
  350. cmDspRC_t _cmDspSysPgm_Stereo_Fx( cmDspSysH_t h, void** userPtrPtr )
  351. {
  352. bool useBuiltInFl = true;
  353. cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0);
  354. cmDspInst_t* ognp = cmDspSysAllocInst( h,"Scalar", "Out Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0);
  355. //cmDspInst_t* fb0p = cmDspSysAllocInst( h,"Scalar", "Feeback 0", 5, kNumberDuiId, 0.0, 1.0, 0.001, 0.0);
  356. //cmDspInst_t* fb1p = cmDspSysAllocInst( h,"Scalar", "Feedback 1", 5, kNumberDuiId, 0.0, 1.0, 0.001, 0.0);
  357. //cmDspInst_t* tm0p = cmDspSysAllocInst( h,"Scalar", "Time 0", 5, kNumberDuiId, 0.0, 1000.0, 0.0001, 10.0);
  358. //cmDspInst_t* tm1p = cmDspSysAllocInst( h,"Scalar", "Time 1", 5, kNumberDuiId, 0.0, 1000.0, 0.0001, 10.0);
  359. cmDspInst_t* rt0p = cmDspSysAllocInst( h,"Scalar", "Ratio 0", 5, kNumberDuiId, 0.01, 10.0, 0.01, 1.0);
  360. cmDspInst_t* rt1p = cmDspSysAllocInst( h,"Scalar", "Ratio 1", 5, kNumberDuiId, 0.01, 10.0, 0.01, 1.0);
  361. cmDspInst_t* ai0p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, useBuiltInFl ? 0 : 2 );
  362. cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, useBuiltInFl ? 1 : 3 );
  363. cmDspInst_t* om0p = cmDspSysAllocInst(h,"AMeter","Out Left", 0);
  364. cmDspInst_t* om1p = cmDspSysAllocInst(h,"AMeter","Out Right",0);
  365. //cmDspInst_t* dy0p = cmDspSysAllocInst(h,"Delay", NULL, 2, 1000.0, 0.5 );
  366. //cmDspInst_t* dy1p = cmDspSysAllocInst(h,"Delay", NULL, 2, 2000.0, 0.7 );
  367. cmDspInst_t* ps0p = cmDspSysAllocInst(h,"PShift", NULL, 0 );
  368. cmDspInst_t* ps1p = cmDspSysAllocInst(h,"PShift", NULL, 0 );
  369. // MOTU Traveler: Use channels 2&3 (out plugs:3&4) because 0&1 do not show up on plugs 1&2.
  370. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  371. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  372. cmDspSysConnectAudio(h, ai0p,"out", om0p, "in" ); // input meter connection
  373. cmDspSysConnectAudio(h, ai1p,"out", om1p, "in" );
  374. //cmDspSysConnectAudio(h, ai0p,"out", dy0p, "in" ); // input -> delay
  375. //cmDspSysConnectAudio(h, ai1p,"out", dy1p, "in" );
  376. cmDspSysConnectAudio(h, ai0p,"out", ps0p, "in" ); // delay -> pshift
  377. cmDspSysConnectAudio(h, ai1p,"out", ps1p, "in" );
  378. cmDspSysConnectAudio(h, ps0p,"out", ao0p, "in" ); // pshift -> output
  379. cmDspSysConnectAudio(h, ps1p,"out", ao1p, "in" );
  380. //cmDspSysConnectAudio(h, dy0p,"out", ao0p, "in" ); // delay -> output
  381. //cmDspSysConnectAudio(h, dy1p,"out", ao1p, "in" );
  382. cmDspSysInstallCb( h, ignp,"val", ai0p, "gain", NULL); // input gain
  383. cmDspSysInstallCb( h, ignp,"val", ai1p, "gain", NULL);
  384. cmDspSysInstallCb( h, ognp, "val", ao0p, "gain", NULL); // output gain
  385. cmDspSysInstallCb( h, ognp, "val", ao1p, "gain", NULL);
  386. //cmDspSysInstallCb( h, fb0p, "val", dy0p, "fb", NULL); // feedback
  387. //cmDspSysInstallCb( h, fb1p, "val", dy1p, "fb", NULL);
  388. //cmDspSysInstallCb( h, tm0p, "val", dy0p, "time", NULL); // delay time
  389. //cmDspSysInstallCb( h, tm1p, "val", dy1p, "time", NULL);
  390. cmDspSysInstallCb( h, rt0p, "val", ps0p, "ratio", NULL); // pitch ratio
  391. cmDspSysInstallCb( h, rt1p, "val", ps1p, "ratio", NULL);
  392. return kOkDspRC;
  393. }
  394. //------------------------------------------------------------------------------
  395. //)
  396. //( { label:cmDspPgm_PlaySine file_desc:"Play a sine signal." kw:[spgm] }
  397. cmDspRC_t _cmDspSysPgm_PlaySine( cmDspSysH_t h, void** userPtrPtr )
  398. {
  399. bool useBuiltInFl = true;
  400. double frqHz = 440.0;
  401. cmDspInst_t* chp = cmDspSysAllocInst( h,"Scalar", "Channel", 5, kNumberDuiId, 0.0, 100.0, 1.0, 0.0);
  402. cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 2, cmDspSysSampleRate(h), frqHz );
  403. cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable", NULL, 2, ((int)cmDspSysSampleRate(h)), 4);
  404. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, useBuiltInFl ? 0 : 2 );
  405. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, useBuiltInFl ? 1 : 3 );
  406. cmDspInst_t* om0p = cmDspSysAllocInst(h,"AMeter","Out", 0);
  407. cmDspInst_t* gain= cmDspSysAllocInst( h,"Scalar", "Gain", 5, kNumberDuiId, 0.0, 10.0, 0.01, 0.0);
  408. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table
  409. cmDspSysConnectAudio(h, wtp, "out", ao0p, "in" ); // wave table -> audio out
  410. cmDspSysConnectAudio(h, wtp, "out", ao1p, "in" ); //
  411. cmDspSysConnectAudio(h, wtp, "out", om0p, "in" );
  412. cmDspSysInstallCb( h, chp, "val", ao0p, "ch", NULL);
  413. cmDspSysInstallCb( h, gain, "val", ao0p, "gain", NULL);
  414. cmDspSysInstallCb( h, gain, "val", ao1p, "gain", NULL);
  415. return kOkDspRC;
  416. }
  417. cmDspRC_t _cmDspSysPgm_PlayFile( cmDspSysH_t h, void** userPtrPtr )
  418. {
  419. bool useBuiltInFl = true;
  420. //const char* fn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  421. const char* fn0 = "media/audio/sourcetone/Ella & Louis - Under A Blanket Of Blue";
  422. //int beg = 6900826;
  423. //int end = 13512262;
  424. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  425. cmDspInst_t* ofp = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  426. cmDspInst_t* fnp = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"Audio Files (*.wav,*.aiff,*.aif)\tAudio Files (*.{wav,aiff,aif})",fn);
  427. cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  428. cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable",NULL, 2, ((int)cmDspSysSampleRate(h)), 1 );
  429. //cmDspInst_t* afp = cmDspSysAllocInst(h,"AudioFileOut",NULL,2,"/home/kevin/temp/record0.aif",1);
  430. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  431. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  432. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table
  433. cmDspSysConnectAudio(h, wtp, "out", ao0p, "in" ); // wave table -> audio out
  434. cmDspSysConnectAudio(h, wtp, "out", ao1p, "in" ); //
  435. //cmDspSysConnectAudio(h, wtp, "out", afp, "in0");
  436. cmDspSysInstallCb(h, ofp, "val", wtp, "beg", NULL );
  437. cmDspSysInstallCb(h, fnp, "out", wtp, "fn", NULL);
  438. return kOkDspRC;
  439. }
  440. //------------------------------------------------------------------------------
  441. //)
  442. //( { label:cmDspPgm_MultiOut file_desc:"Play to multiple output channels example program." kw:[spgm] }
  443. cmDspRC_t _cmDspSysPgm_MultiOut( cmDspSysH_t h, void** userPtrPtr )
  444. {
  445. cmDspRC_t rc = kOkDspRC;
  446. double frqHz = 440.0;
  447. unsigned chCnt = 8;
  448. unsigned oneOfN_chCnt = 2;
  449. double offs = 34612504;
  450. cmDspInst_t* aout[chCnt];
  451. unsigned i;
  452. const char* fn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_23.wav";
  453. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  454. cmDspInst_t* f_phs = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  455. cmDspInst_t* f_wt = cmDspSysAllocInst(h,"WaveTable",NULL, 2, ((int)cmDspSysSampleRate(h)), 1 );
  456. cmDspInst_t* f_mtr = cmDspSysAllocInst(h,"AMeter", "File Out", 0);
  457. cmDspInst_t* f_rew = cmDspSysAllocInst(h,"Button", "Rewind", 2, kButtonDuiId, 1.0 );
  458. cmDspInst_t* f_pts = cmDspSysAllocInst(h,"PortToSym", NULL, 1, "on" );
  459. cmDspInst_t* f_beg = cmDspSysAllocInst(h,"Scalar", "File Begin", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*6000.0, 1.0, offs);
  460. cmDspInst_t* f_nam = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"Audio Files (*.wav,*.aiff,*.aif)\tAudio Files (*.{wav,aiff,aif})",fn);
  461. cmDspInst_t* s_phs = cmDspSysAllocInst(h,"Phasor", NULL, 2, cmDspSysSampleRate(h), frqHz );
  462. cmDspInst_t* s_wt = cmDspSysAllocInst(h,"WaveTable", NULL, 2, ((int)cmDspSysSampleRate(h)), 4);
  463. cmDspInst_t* s_mtr = cmDspSysAllocInst(h,"AMeter", "Tone Out", 0);
  464. cmDspInst_t* swtch = cmDspSysAllocInst(h,"1ofN", NULL, 2, oneOfN_chCnt, 0 );
  465. for(i=0; i<chCnt; ++i)
  466. aout[i] = cmDspSysAllocInst(h,"AudioOut",NULL, 1, i );
  467. cmDspInst_t* chck = cmDspSysAllocInst(h,"Checkbox", "Source", 5, "Tone","file","tone", 0.0, 1.0);
  468. cmDspInst_t** vol = cmDspSysAllocInstArray(h,chCnt,"Scalar", "Gain", NULL, 5, kNumberDuiId, 0.0, 10.0, 0.01, 0.0 );
  469. // check for allocation errors
  470. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  471. goto errLabel;
  472. cmDspSysConnectAudio( h, s_phs, "out", s_wt, "phs" ); // sine phasor -> wave table
  473. cmDspSysConnectAudio( h, s_wt, "out", s_mtr, "in" ); // sine wave table -> meter
  474. cmDspSysConnectAudio( h, s_wt, "out", swtch, "a-in-1");
  475. cmDspSysConnectAudio( h, f_phs, "out", f_wt, "phs" ); // file phasor -> wave table
  476. cmDspSysConnectAudio( h, f_wt, "out", f_mtr, "in" ); // file wave table -> meter
  477. cmDspSysConnectAudio( h, f_wt, "out", swtch, "a-in-0");
  478. cmDspSysConnectAudio11N1( h, swtch, "a-out", aout, "in", chCnt );
  479. cmDspSysInstallCbN1N1( h, vol, "val", aout, "gain", chCnt );
  480. cmDspSysInstallCb( h, chck, "out", swtch, "chidx", NULL );
  481. cmDspSysInstallCb( h, f_nam, "out", f_wt, "fn", NULL );
  482. cmDspSysInstallCb( h, f_beg, "val", f_wt, "beg", NULL );
  483. cmDspSysInstallCb( h, f_rew, "out", f_pts, "on", NULL );
  484. cmDspSysInstallCb( h, f_pts, "on", f_beg, "send", NULL );
  485. cmDspSysInstallCb( h, f_pts, "on", f_nam, "send", NULL );
  486. cmDspSysInstallCb( h, f_pts, "on", f_wt, "cmd", NULL );
  487. errLabel:
  488. return rc;
  489. }
  490. //------------------------------------------------------------------------------
  491. //)
  492. //( { label:cmDspPgm_MultiIn file_desc:"Multiple audio inputs example program." kw:[spgm] }
  493. cmDspRC_t _cmDspSysPgm_MultiIn(cmDspSysH_t h, void** userPtrPtr)
  494. {
  495. int chCnt = 8;
  496. cmDspInst_t* a[chCnt];
  497. int i;
  498. for(i=0; i<chCnt; ++i)
  499. a[i] = cmDspSysAllocInst( h, "AudioIn", NULL, 1, i );
  500. cmDspInst_t* mxp = cmDspSysAllocInst( h, "AMix", NULL, chCnt+1, chCnt, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 );
  501. cmDspInst_t* afp = cmDspSysAllocInst( h, "AudioFileOut", NULL, 2,"/home/kevin/temp/at/test_in.aif",1);
  502. cmDspInst_t* aop = cmDspSysAllocInst( h, "AudioOut", NULL, 1, 0 );
  503. // AudioFileOut needs an open message to create the output file
  504. cmDspInst_t* btn = cmDspSysAllocInst( h, "Button", "open", 2, kButtonDuiId, 1.0 );
  505. cmDspSysAssignInstAttrSymbolStr(h, btn, "_reset" );
  506. cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 1, "open" );
  507. cmDspSysConnectAudioN11N(h, a, "out", mxp, "in", chCnt );
  508. cmDspSysConnectAudio( h, mxp, "out", afp, "in0" );
  509. cmDspSysConnectAudio( h, mxp, "out", aop, "in" );
  510. cmDspSysInstallCb( h, btn, "sym", pts, "open", NULL );
  511. cmDspSysInstallCb( h, pts, "open", afp, "sel", NULL );
  512. return kOkDspRC;
  513. }
  514. //------------------------------------------------------------------------------
  515. //)
  516. //( { label:cmDspPgm_GateDetect file_desc:"Gate detector example program." kw:[spgm] }
  517. cmDspRC_t _cmDspSysPgm_GateDetect( cmDspSysH_t h, void** userPtrPtr )
  518. {
  519. bool useBuiltInFl = true;
  520. //const char* fn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  521. //int beg = 6900826;
  522. //int end = 13512262;
  523. //const char* fn0 = "media/audio/McGill-3/1 Audio Track.aiff";
  524. const char* fn0 = "temp/gate_detect0.aif";
  525. int beg = 0;
  526. int end = -1;
  527. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  528. const cmChar_t* tfn = "/home/kevin/temp/test0.txt";
  529. cmDspInst_t* ofp = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  530. //cmDspInst_t* fnp = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"Audio Files (*.wav,*.aiff,*.aif)\tAudio Files (*.{wav,aiff,aif})",fn);
  531. cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  532. cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable", NULL, 6, ((int)cmDspSysSampleRate(h)), 1, fn, -1, beg, end );
  533. cmDspInst_t* gdp = cmDspSysAllocInst(h,"GateDetect",NULL, 1, 20.0);
  534. cmDspInst_t* gmp = cmDspSysAllocInst(h,"Meter", NULL, 3, 0.0, 0.0, 1.0);
  535. cmDspInst_t* rmp = cmDspSysAllocInst(h,"Meter", NULL, 3, -100.0, -100.0, 0.0);
  536. cmDspInst_t* txp = cmDspSysAllocInst(h,"TextFile", NULL, 2, 3, tfn);
  537. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  538. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  539. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table
  540. cmDspSysConnectAudio(h, wtp, "out", ao0p, "in" ); // wave table -> audio out
  541. cmDspSysConnectAudio(h, wtp, "out", ao1p, "in" ); //
  542. cmDspSysConnectAudio(h, wtp, "out", gdp, "in" );
  543. cmDspSysInstallCb(h, ofp, "val", wtp, "beg", NULL );
  544. cmDspSysInstallCb(h, gdp, "gate", gmp, "in", NULL );
  545. cmDspSysInstallCb(h, gdp, "rms", rmp, "in", NULL );
  546. cmDspSysInstallCb(h, gdp, "gate", txp, "in-0", NULL);
  547. cmDspSysInstallCb(h, gdp, "rms", txp, "in-1", NULL);
  548. cmDspSysInstallCb(h, gdp, "mean", txp, "in-2", NULL);
  549. return kOkDspRC;
  550. }
  551. //------------------------------------------------------------------------------
  552. //)
  553. //( { label:cmDspPgm_Record file_desc:"Record audio to an audio file." kw:[spgm] }
  554. cmDspRC_t _cmDspSysPgm_Record(cmDspSysH_t h, void** userPtrPtr)
  555. {
  556. int chCnt = 8;
  557. cmDspInst_t* a[chCnt];
  558. int i;
  559. for(i=0; i<chCnt; ++i)
  560. a[i] = cmDspSysAllocInst( h, "AudioIn", NULL, 1, i );
  561. cmDspInst_t* mxp = cmDspSysAllocInst( h, "AMix", NULL, chCnt+1, chCnt, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 );
  562. cmDspInst_t* afp = cmDspSysAllocInst( h, "AudioFileOut", NULL, 2,"/home/kevin/temp/gate_detect.aif",1);
  563. cmDspInst_t* aop = cmDspSysAllocInst( h, "AudioOut", NULL, 1, 0 );
  564. cmDspInst_t* txp = cmDspSysAllocInst( h, "TextFile", NULL, 2, 1, "/home/kevin/temp/gate_detect.txt");
  565. cmDspInst_t* chp = cmDspSysAllocInst( h, "Scalar", "Channel", 5, kNumberDuiId, 0.0, 7.0, 1.0, 0.0);
  566. // AudioFileOut needs an open message to create the output file
  567. cmDspInst_t* btn = cmDspSysAllocInst( h, "Button", "open", 2, kButtonDuiId, 1.0 );
  568. cmDspSysAssignInstAttrSymbolStr(h, btn, "_reset" );
  569. cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 1, "open" );
  570. for(i=0; i<chCnt; ++i)
  571. {
  572. cmChar_t lbl[15];
  573. snprintf(lbl,15,"in-%i",i);
  574. cmDspSysConnectAudio(h,a[i], "out", mxp, lbl);
  575. }
  576. cmDspSysConnectAudio(h, mxp, "out", afp, "in0" );
  577. cmDspSysConnectAudio(h, mxp, "out", aop, "in" );
  578. cmDspSysInstallCb(h, chp, "out", txp, "in-0", NULL);
  579. cmDspSysInstallCb( h, btn, "sym", pts, "open", NULL );
  580. cmDspSysInstallCb( h, pts, "open", afp, "sel", NULL );
  581. return kOkDspRC;
  582. }
  583. //------------------------------------------------------------------------------
  584. //)
  585. //( { label:cmDspPgm_FtRecord file_desc:"Record streaming audio input to an audio file." kw:[spgm] }
  586. cmDspRC_t _cmDspSysPgm_RtRecord(cmDspSysH_t h, void** userPtrPtr)
  587. {
  588. cmDspInst_t* ai0 = cmDspSysAllocInst( h, "AudioIn", NULL, 1, 0 );
  589. cmDspInst_t* ai1 = cmDspSysAllocInst( h, "AudioIn", NULL, 1, 1 );
  590. cmDspInst_t* afp = cmDspSysAllocInst( h, "AudioFileOut", NULL, 2,"/Users/kevin/temp/test.aif",2);
  591. cmDspInst_t* ao0 = cmDspSysAllocInst( h, "AudioOut", NULL, 1, 2 );
  592. cmDspInst_t* ao1 = cmDspSysAllocInst( h, "AudioOut", NULL, 1, 3 );
  593. // AudioFileOut needs an open message to create the output file
  594. cmDspInst_t* btn = cmDspSysAllocInst( h, "Button", "open", 2, kButtonDuiId, 1.0 );
  595. cmDspSysAssignInstAttrSymbolStr(h, btn, "_reset" );
  596. cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 1, "open" );
  597. cmDspSysConnectAudio(h,ai0, "out", afp, "in0");
  598. cmDspSysConnectAudio(h,ai1, "out", afp, "in1");
  599. cmDspSysConnectAudio(h,ai0, "out", ao0, "in");
  600. cmDspSysConnectAudio(h,ai1, "out", ao1, "in");
  601. cmDspSysInstallCb( h, btn, "sym", pts, "open", NULL );
  602. cmDspSysInstallCb( h, pts, "open", afp, "sel", NULL );
  603. return kOkDspRC;
  604. }
  605. //------------------------------------------------------------------------------
  606. //)
  607. //( { label:cmDspPgm_PitchShift file_desc:"Pitch-shifter example program." kw:[spgm] }
  608. cmDspRC_t _cmDspSysPgm_PitchShiftFile( cmDspSysH_t h, void** userPtrPtr )
  609. {
  610. bool useBuiltInFl = true;
  611. const cmChar_t* fn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  612. const cmChar_t* fn1 = "temp/record0.aif";
  613. int beg = 6900826;
  614. int end = 13512262;
  615. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  616. const cmChar_t* ofn = cmFsMakeFn(cmFsUserDir(),fn1,NULL,NULL );
  617. cmDspInst_t* rt0p = cmDspSysAllocInst(h,"Scalar", "Ratio 0", 5, kNumberDuiId, 0.01, 10.0, 0.01, 1.0);
  618. cmDspInst_t* rt1p = cmDspSysAllocInst(h,"Scalar", "Ratio 1", 5, kNumberDuiId, 0.01, 10.0, 0.01, 1.0);
  619. cmDspInst_t* ofp = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  620. //cmDspInst_t* fnp = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"Audio Files (*.wav,*.aiff,*.aif)\tAudio Files (*.{wav,aiff,aif})",fn);
  621. cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  622. cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable",NULL, 6, ((int)cmDspSysSampleRate(h)), 1, fn, -1, beg, end );
  623. cmDspInst_t* afp = cmDspSysAllocInst(h,"AudioFileOut",NULL,2,ofn,1);
  624. cmDspInst_t* ps0p = cmDspSysAllocInst(h,"PShift", NULL, 0 );
  625. cmDspInst_t* ps1p = cmDspSysAllocInst(h,"PShift", NULL, 0 );
  626. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  627. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  628. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table
  629. cmDspSysConnectAudio(h, wtp, "out", ps0p, "in" ); // wave table -> shift
  630. cmDspSysConnectAudio(h, wtp, "out", ps1p, "in" ); //
  631. cmDspSysConnectAudio(h, ps0p, "out", ao0p, "in" ); // shift -> audio out
  632. cmDspSysConnectAudio(h, ps1p, "out", ao1p, "in" ); //
  633. cmDspSysConnectAudio(h, ps0p, "out", afp, "in0"); //
  634. cmDspSysInstallCb(h, ofp, "val", wtp, "beg", NULL );
  635. //cmDspSysInstallCb(h, fnp, "out", wtp, "fn", NULL);
  636. cmDspSysInstallCb(h, rt0p, "val", ps0p, "ratio", NULL);
  637. cmDspSysInstallCb(h, rt1p, "val", ps1p, "ratio", NULL);
  638. return kOkDspRC;
  639. }
  640. //------------------------------------------------------------------------------
  641. //)
  642. //( { label:cmDspPgm_LoopRecd file_desc:"Loop-recorder example program." kw:[spgm] }
  643. cmDspRC_t _cmDspSysPgm_LoopRecd( cmDspSysH_t h, void** userPtrPtr )
  644. {
  645. bool useBuiltInFl = true;
  646. const cmChar_t* fn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  647. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  648. int beg = 6900826;
  649. int end = 13512262;
  650. cmDspInst_t* rfl = cmDspSysAllocInst(h,"Button", "Recd", 2, kCheckDuiId, 0.0 );
  651. cmDspInst_t* pfl = cmDspSysAllocInst(h,"Button", "Play", 2, kButtonDuiId, 1.0 );
  652. cmDspInst_t* rtp = cmDspSysAllocInst(h,"Scalar", "Ratio", 5, kNumberDuiId, 0.0, 10.0, 0.01, 1.0 );
  653. cmDspInst_t* ofp = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  654. //cmDspInst_t* fnp = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"Audio Files (*.wav,*.aiff,*.aif)\tAudio Files (*.{wav,aiff,aif})",fn);
  655. cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  656. cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable",NULL, 6, ((int)cmDspSysSampleRate(h)), 1, fn, -1, beg, end );
  657. //cmDspInst_t* afp = cmDspSysAllocInst(h,"AudioFileOut",NULL,2,"/home/kevin/temp/record0.aif",1);
  658. cmDspInst_t* lrp = cmDspSysAllocInst(h,"LoopRecd", NULL, 0 );
  659. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  660. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  661. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table
  662. cmDspSysConnectAudio(h, wtp, "out", lrp, "in" ); // wave table -> shift
  663. cmDspSysConnectAudio(h, lrp, "out", ao0p, "in" ); // shift -> audio out
  664. cmDspSysConnectAudio(h, wtp, "out", ao1p, "in" );
  665. cmDspSysInstallCb(h, ofp, "val", wtp, "beg", NULL );
  666. //cmDspSysInstallCb(h, fnp, "out", wtp, "fn", NULL);
  667. cmDspSysInstallCb(h, rfl, "out", lrp, "recd", NULL);
  668. cmDspSysInstallCb(h, pfl, "out", lrp, "play", NULL);
  669. cmDspSysInstallCb(h, rtp, "val", lrp, "ratio",NULL);
  670. return kOkDspRC;
  671. }
  672. //------------------------------------------------------------------------------
  673. //)
  674. //( { label:cmDspPgm_UiTest file_desc:"User Interface example program." kw:[spgm] }
  675. cmDspRC_t _cmDspSysPgm_UiTest(cmDspSysH_t h, void** userPtrPtr )
  676. {
  677. cmDspRC_t rc = kOkDspRC;
  678. cmDspInst_t* mdp = cmDspSysAllocInst(h,"Scalar", "Mode", 5, kNumberDuiId, 0.0, 4.0, 1.0, 1.0);
  679. cmDspInst_t* wsp = cmDspSysAllocInst(h,"MsgList","wndSmpCnt", 3, "wndSmpCnt", NULL, 2);
  680. cmDspInst_t* hfp = cmDspSysAllocInst(h,"MsgList","hopFact", 3, "hopFact", NULL, 2);
  681. cmDspInst_t* thp = cmDspSysAllocInst(h,"Scalar", "threshold", 5, kNumberDuiId, 0.0, 1.0, 0.01, 0.5 );
  682. cmDspInst_t* trp = cmDspSysAllocInst(h,"Scalar", "target", 5, kNumberDuiId, 0.0, 1.0, 0.01, 0.5 );
  683. cmDspInst_t* btn = cmDspSysAllocInst(h,"Button", "btn", 2, kButtonDuiId, 12.3 );
  684. cmDspInst_t* chk = cmDspSysAllocInst(h,"Button", "check", 2, kCheckDuiId, 0 );
  685. cmDspInst_t* chb = cmDspSysAllocInst(h,"Checkbox","checkbox", 5, "Checker","up","down", 2.0, 1.0);
  686. cmDspInst_t* txt = cmDspSysAllocInst(h,"Text", "text", 1, "Hello" );
  687. cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" );
  688. cmDspInst_t* mtp = cmDspSysAllocInst(h,"Meter", "meter", 3, 0.0, 0.0, 4.0);
  689. cmDspInst_t* ctp = cmDspSysAllocInst(h,"Counter", NULL, 3, 0.0, 10.0, 1.0 );
  690. cmDspInst_t* lbl = cmDspSysAllocInst(h,"Label", "label1", 1, "label2");
  691. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  692. return rc;
  693. cmDspSysInstallCb(h, mdp, "val", thp, "val", NULL );
  694. cmDspSysInstallCb(h, mdp, "val", prp, "in", NULL );
  695. cmDspSysInstallCb(h, wsp, "out", prp, "in", NULL );
  696. cmDspSysInstallCb(h, hfp, "out", prp, "in", NULL );
  697. cmDspSysInstallCb(h, trp, "val", prp, "in", NULL );
  698. cmDspSysInstallCb(h, btn, "out", prp, "in", NULL );
  699. cmDspSysInstallCb(h, chk, "out", prp, "in", NULL );
  700. cmDspSysInstallCb(h, ctp, "out", prp, "in", NULL );
  701. cmDspSysInstallCb(h, mdp, "val", btn, "in", NULL );
  702. cmDspSysInstallCb(h, thp, "val", mtp, "in", NULL );
  703. cmDspSysInstallCb(h, thp, "val", trp, "val", NULL );
  704. cmDspSysInstallCb(h, btn, "sym", prp, "in", NULL );
  705. cmDspSysInstallCb(h, btn, "out", ctp, "next", NULL );
  706. cmDspSysInstallCb(h, txt, "val", prp, "in", NULL );
  707. cmDspSysInstallCb(h, chb, "out", prp, "in", NULL );
  708. cmDspSysInstallCb(h, chb, "sym", prp, "in", NULL );
  709. cmDspSysInstallCb(h, mdp, "val", lbl, "in", NULL );
  710. return rc;
  711. }
  712. //------------------------------------------------------------------------------
  713. //)
  714. //( { label:cmDspPgm_Xfade file_desc:"Cross fader example program." kw:[spgm] }
  715. cmDspRC_t _cmDspSysPgm_Xfade( cmDspSysH_t h, void** userPtrPtr )
  716. {
  717. cmDspRC_t rc = kOkDspRC;
  718. unsigned leftChIdx = 2;
  719. unsigned rightChIdx = 3;
  720. unsigned chCnt = 2;
  721. double xfadeMs = 1000; // cross fade time
  722. double sgHz = 500;
  723. unsigned sgShapeId = 1;
  724. double sgGain = 0.5;
  725. cmDspInst_t* sg = cmDspSysAllocInst( h, "SigGen", NULL, 3, sgHz, sgShapeId, sgGain );
  726. cmDspInst_t* xfp = cmDspSysAllocInst(h,"Xfader", NULL, 2, chCnt, xfadeMs );
  727. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, leftChIdx );
  728. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, rightChIdx );
  729. cmDspInst_t* im0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  730. cmDspInst_t* im1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  731. cmDspInst_t* om0p = cmDspSysAllocInst(h,"AMeter","Out 0", 0);
  732. cmDspInst_t* om1p = cmDspSysAllocInst(h,"AMeter","Out 1", 0);
  733. cmDspInst_t* mstr = cmDspSysAllocInst(h,"Button", "Mstr", 2, kCheckDuiId, 0.0 );
  734. cmDspInst_t* btn0 = cmDspSysAllocInst(h,"Button", "Fade 0", 2, kCheckDuiId, 0.0 );
  735. cmDspInst_t* btn1 = cmDspSysAllocInst(h,"Button", "Fade 1", 2, kCheckDuiId, 1.0 );
  736. cmDspInst_t* gm0p = cmDspSysAllocInst(h,"Meter","Gain 0", 3, 0.0, 0.0, 1.0);
  737. cmDspInst_t* gm1p = cmDspSysAllocInst(h,"Meter","Gain 1", 3, 0.0, 0.0, 1.0);
  738. cmDspInst_t* pon = cmDspSysAllocInst(h,"Printer", NULL, 1, "on:" );
  739. cmDspInst_t* pof = cmDspSysAllocInst(h,"Printer", NULL, 1, "off:" );
  740. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  741. return rc;
  742. cmDspSysConnectAudio(h, sg, "out", im0p, "in"); // ain -> meter
  743. cmDspSysConnectAudio(h, sg, "out", im1p, "in"); //
  744. cmDspSysConnectAudio(h, sg, "out", xfp, "in-0"); // ain -> xfader
  745. cmDspSysConnectAudio(h, sg, "out", xfp, "in-1");
  746. cmDspSysConnectAudio(h, xfp, "out-0", om0p, "in" ); // xfade -> meter
  747. cmDspSysConnectAudio(h, xfp, "out-1", om1p, "in" ); //
  748. cmDspSysConnectAudio(h, xfp, "out-0", ao0p, "in" ); // xfade -> aout
  749. cmDspSysConnectAudio(h, xfp, "out-1", ao1p, "in" ); //
  750. cmDspSysInstallCb(h, btn0, "out", xfp, "gate-0", NULL ); // check -> xfade gate
  751. cmDspSysInstallCb(h, btn1, "out", xfp, "gate-1", NULL );
  752. cmDspSysInstallCb(h, mstr, "out", xfp, "mgate", NULL );
  753. cmDspSysInstallCb(h, xfp, "gain-0", gm0p, "in", NULL );
  754. cmDspSysInstallCb(h, xfp, "gain-1", gm1p, "in", NULL );
  755. cmDspSysInstallCb(h, xfp, "on", pon, "in", NULL );
  756. cmDspSysInstallCb(h, xfp, "off", pof, "in", NULL );
  757. return cmDspSysLastRC(h);
  758. }
  759. //------------------------------------------------------------------------------
  760. //)
  761. //( { label:cmDspPgm_Pgm6 file_desc:"Stereo strectral non-linear distortion example." kw:[spgm] }
  762. cmDspRC_t _cmDspSysPgm6( cmDspSysH_t h, void* audioDir )
  763. {
  764. cmDspRC_t rc = kOkDspRC;
  765. int wndSmpCnt = 2048;
  766. int hopFact = 4;
  767. //const char* afDir = "/Volumes/LaTetra0/media/audio/20110723-Kriesberg/Audio Files";
  768. //const char* afDir = "/Users/administrator/Documents/kc";
  769. const char* afDir = "/home/kevin/media/audio/20110723-Kriesberg/Audio Files";
  770. cmDspInst_t* ph0p = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  771. cmDspInst_t* wt0p = cmDspSysAllocInst(h,"WaveTable",NULL, 0 );
  772. cmDspInst_t* ro0p = cmDspSysAllocInst(h,"Reorder", NULL, 5, 3, 2, 0, 1, 2 );
  773. cmDspInst_t* kr0p = cmDspSysAllocInst(h,"Kr", NULL, 2, wndSmpCnt, hopFact );
  774. cmDspInst_t* kr1p = cmDspSysAllocInst(h,"Kr", NULL, 2, wndSmpCnt, hopFact );
  775. cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 0 );
  776. bool useBuiltInFl = true;
  777. // MOTU Traveler: Use channels 2&3 (out plugs:3&4) because 0&1 do not show up on plugs 1&2.
  778. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  779. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  780. // BUG: If audio inputs are not connected a 'not an audio buffer' msg is generated.
  781. // This is a problem with type determination in the cmDspClass related code : see cmDspClass.c 833
  782. // for a place that this error would be thrown in the following audio outputs were not connected
  783. // to audio sources.
  784. cmDspInst_t* ao2p = NULL;
  785. cmDspInst_t* ao3p = NULL;
  786. if( !useBuiltInFl )
  787. {
  788. ao2p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 4 );
  789. ao3p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 5 );
  790. }
  791. cmDspInst_t* al0p = cmDspSysAllocInst(h,"MsgList","audFiles", 2, "audFiles",NULL);
  792. cmDspInst_t* fl0p = cmDspSysAllocInst(h,"MsgList","audFragsA", 2, "audFrags",NULL);
  793. cmDspInst_t* fn0p = cmDspSysAllocInst(h,"Sprintf","filename", 1, "%s/%s_%02i.wav");
  794. cmDspInst_t* md0p = cmDspSysAllocInst(h,"Scalar", "Mode", 5, kNumberDuiId, 0.0, 4.0, 1.0, 1.0);
  795. cmDspInst_t* ws0p = cmDspSysAllocInst(h,"MsgList","wndSmpCnt", 3, "wndSmpCnt", NULL, 2);
  796. cmDspInst_t* hf0p = cmDspSysAllocInst(h,"MsgList","hopFact", 3, "hopFact", NULL, 2);
  797. cmDspInst_t* th0p = cmDspSysAllocInst(h,"Scalar", "threshold", 5, kNumberDuiId, 0.0, 100.0, 1.0, 60.0 );
  798. cmDspInst_t* us0p = cmDspSysAllocInst(h,"Scalar", "upr slope", 5, kNumberDuiId, 0.0, 10.0, 0.01, 0.0 );
  799. cmDspInst_t* ls0p = cmDspSysAllocInst(h,"Scalar", "lwr slope", 5, kNumberDuiId, 0.3, 10.0, 0.01, 2.0 );
  800. cmDspInst_t* of0p = cmDspSysAllocInst(h,"Scalar", "offset", 5, kNumberDuiId, 0.0, 100.0, 0.01, 30.0 );
  801. cmDspInst_t* iv0p = cmDspSysAllocInst(h,"Scalar", "invert", 5, kNumberDuiId, 0.0, 1.0, 1.0, 0.0 );
  802. cmDspSysNewColumn(h,0);
  803. //cmDspInst_t* al1p = cmDspSysAllocInst(h,"MsgList","audFiles", 2, "audFiles",NULL);
  804. //cmDspInst_t* fl1p = cmDspSysAllocInst(h,"MsgList","audFrags1", 2, "audFrags",NULL);
  805. //cmDspInst_t* fn1p = cmDspSysAllocInst(h,"Sprintf","filename", 1, "%s/%s_%02i.wav");
  806. cmDspInst_t* md1p = cmDspSysAllocInst(h,"Scalar", "Mode", 5, kNumberDuiId, 0.0, 4.0, 1.0, 1.0);
  807. cmDspInst_t* ws1p = cmDspSysAllocInst(h,"MsgList","wndSmpCnt", 3, "wndSmpCnt", NULL, 2);
  808. cmDspInst_t* hf1p = cmDspSysAllocInst(h,"MsgList","hopFact", 3, "hopFact", NULL, 2);
  809. cmDspInst_t* th1p = cmDspSysAllocInst(h,"Scalar", "threshold", 5, kNumberDuiId, 0.0, 100.0, 1.0, 60.0 );
  810. cmDspInst_t* us1p = cmDspSysAllocInst(h,"Scalar", "upr slope", 5, kNumberDuiId, 0.0, 10.0, 0.01, 0.0 );
  811. cmDspInst_t* ls1p = cmDspSysAllocInst(h,"Scalar", "lwr slope", 5, kNumberDuiId, 0.3, 10.0, 0.01, 2.0 );
  812. cmDspInst_t* of1p = cmDspSysAllocInst(h,"Scalar", "offset", 5, kNumberDuiId, 0.0, 100.0, 0.01, 30.0 );
  813. cmDspInst_t* iv1p = cmDspSysAllocInst(h,"Scalar", "invert", 5, kNumberDuiId, 0.0, 1.0, 1.0, 0.0 );
  814. cmDspSysNewColumn(h,0);
  815. cmDspInst_t* dnp = cmDspSysAllocInst(h,"Fname", "audDir", 3, true,NULL,afDir);
  816. cmDspInst_t* mtp = cmDspSysAllocInst(h,"Meter","MyMeter", 3, 50.0, 0.0, 100.0);
  817. cmDspInst_t* atp = cmDspSysAllocInst(h,"AMeter","Audio Meter",0);
  818. if( (rc = cmDspSysLastRC(h)) != kOkDspRC )
  819. return rc;
  820. cmDspSysConnectAudio(h, ph0p, "out", wt0p, "phs"); // phasor->wt:phs
  821. cmDspSysConnectAudio(h, wt0p, "out", kr0p, "in"); // wt->kr
  822. cmDspSysConnectAudio(h, kr0p, "out", ao0p, "in"); // kr->aout- 0
  823. cmDspSysConnectAudio(h, wt0p, "out", kr1p, "in"); // wt->kr
  824. cmDspSysConnectAudio(h, kr1p, "out", ao1p, "in"); // kr->aout - 1
  825. if( ao2p != NULL )
  826. cmDspSysConnectAudio(h, wt0p,"out", ao2p, "in"); // wt->aout - 2
  827. if( ao3p != NULL )
  828. cmDspSysConnectAudio(h, wt0p,"out", ao3p, "in"); // wt->aout - 3
  829. cmDspSysConnectAudio(h, wt0p,"out", atp, "in"); // wt->meter
  830. cmDspSysInstallCb(h, ws0p, "out", kr0p, "wndn", NULL ); // wndSmpCnt->kr
  831. cmDspSysInstallCb(h, hf0p, "out", kr0p, "hopf", NULL ); // hopFact->kr
  832. cmDspSysInstallCb(h, md0p, "val", kr0p, "mode", NULL ); // mode->kr
  833. cmDspSysInstallCb(h, th0p, "val", kr0p, "thrh", NULL ); // thresh->kr
  834. cmDspSysInstallCb(h, ls0p, "val", kr0p, "lwrs", NULL ); // lwrSlope->kr
  835. cmDspSysInstallCb(h, us0p, "val", kr0p, "uprs", NULL ); // uprSlope->kr
  836. cmDspSysInstallCb(h, of0p, "val", kr0p, "offs", NULL ); // offset->kr
  837. cmDspSysInstallCb(h, iv0p, "val", kr0p, "invt", NULL ); // invert->kr
  838. cmDspSysInstallCb(h, th0p, "val", mtp, "in", NULL );
  839. cmDspSysInstallCb(h, ws1p, "out", kr1p, "wndn", NULL ); // wndSmpCnt->kr
  840. cmDspSysInstallCb(h, hf1p, "out", kr1p, "hopf", NULL ); // hopFact->kr
  841. cmDspSysInstallCb(h, md1p, "val", kr1p, "mode", NULL ); // mode->kr
  842. cmDspSysInstallCb(h, th1p, "val", kr1p, "thrh", NULL ); // thresh->kr
  843. cmDspSysInstallCb(h, ls1p, "val", kr1p, "lwrs", NULL ); // lwrSlope->kr
  844. cmDspSysInstallCb(h, us1p, "val", kr1p, "uprs", NULL ); // uprSlope->kr
  845. cmDspSysInstallCb(h, of1p, "val", kr1p, "offs", NULL ); // offset->kr
  846. cmDspSysInstallCb(h, iv1p, "val", kr1p, "invt", NULL ); // invert->kr
  847. cmDspSysInstallCb(h, dnp, "out", fn0p, "in-0", NULL); // dir->fn:0
  848. cmDspSysInstallCb(h, al0p, "out", fn0p, "in-1", NULL ); // fn->fn:1
  849. cmDspSysInstallCb(h, fl0p, "take", fn0p, "in-2", NULL ); // take->fn:2
  850. cmDspSysInstallCb(h, fn0p, "out", ro0p, "in-0", NULL); // fn->print
  851. cmDspSysInstallCb(h, fl0p, "beg", ro0p, "in-1", NULL); //
  852. cmDspSysInstallCb(h, fl0p, "end", ro0p, "in-2", NULL); //
  853. cmDspSysInstallCb(h, ro0p, "out-0", wt0p, "fn", NULL ); // fn->wt:fn
  854. cmDspSysInstallCb(h, ro0p, "out-1", wt0p, "beg", NULL ); // beg->wt:beg
  855. cmDspSysInstallCb(h, ro0p, "out-2", wt0p, "end", NULL ); // end->wt:end
  856. cmDspSysInstallCb(h, ro0p, "out-1", prp, "in", NULL ); //
  857. //cmDspSysInstallCb(h, dnp, "out", fn1p, "in-0", NULL); // dir->fn:0
  858. //cmDspSysInstallCb(h, al1p, "out", fn1p, "in-1", NULL ); // fn->fn:1
  859. //cmDspSysInstallCb(h, fl1p, "take", fn1p, "in-2", NULL ); // take->fn:2
  860. //cmDspSysInstallCb(h, fn1p, "out", ro1p, "in-0", NULL); // fn->print
  861. //cmDspSysInstallCb(h, fl1p, "beg", ro1p, "in-1", NULL); //
  862. //cmDspSysInstallCb(h, fl1p, "end", ro1p, "in-2", NULL); //
  863. //cmDspSysInstallCb(h, ro1p, "out-0", wt1p, "fn", NULL ); // fn->wt:fn
  864. //cmDspSysInstallCb(h, ro1p, "out-1", wt1p, "beg", NULL ); // beg->wt:beg
  865. //cmDspSysInstallCb(h, ro1p, "out-2", wt1p, "end", NULL ); // end->wt:end
  866. return cmDspSysLastRC(h);
  867. }
  868. //------------------------------------------------------------------------------
  869. //)
  870. //( { label:cmDspPgm_Guitar file_desc:"Similiar to Pgm6." kw:[spgm] }
  871. cmDspRC_t _cmDspSysPgmGuitar( cmDspSysH_t h, void** userPtrPtr )
  872. {
  873. cmDspRC_t rc = kOkDspRC;
  874. int wndSmpCnt = 2048;
  875. int hopFact = 4;
  876. const char* afDir = "/Volumes/LaTetra0/media/audio/20110723-Kriesberg/Audio Files";
  877. //const char* afDir = "/Users/administrator/Documents/kc";
  878. cmDspInst_t* ph0p = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  879. cmDspInst_t* wt0p = cmDspSysAllocInst(h,"WaveTable",NULL, 0 );
  880. cmDspInst_t* ro0p = cmDspSysAllocInst(h,"Reorder", NULL, 5, 3, 2, 0, 1, 2 );
  881. cmDspInst_t* kr0p = cmDspSysAllocInst(h,"Kr", NULL, 2, wndSmpCnt, hopFact );
  882. cmDspInst_t* kr1p = cmDspSysAllocInst(h,"Kr", NULL, 2, wndSmpCnt, hopFact );
  883. cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 0 );
  884. bool useBuiltInFl = true;
  885. // MOTU Traveler: Use channels 2&3 (out plugs:3&4) because 0&1 do not show up on plugs 1&2.
  886. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 0 : 2 );
  887. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, useBuiltInFl ? 1 : 3 );
  888. // BUG: If audio inputs are not connected a 'not an audio buffer' msg is generated.
  889. // This is a problem with type determination in the cmDspClass related code : see cmDspClass.c 833
  890. // for a place that this error would be thrown in the following audio outputs were not connected
  891. // to audio sources.
  892. cmDspInst_t* ao2p = NULL;
  893. cmDspInst_t* ao3p = NULL;
  894. if( !useBuiltInFl )
  895. {
  896. ao2p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 4 );
  897. ao3p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 5 );
  898. }
  899. cmDspInst_t* al0p = cmDspSysAllocInst(h,"MsgList","audFiles", 2, "audFiles",NULL);
  900. cmDspInst_t* fl0p = cmDspSysAllocInst(h,"MsgList","audFragsA", 2, "audFrags",NULL);
  901. cmDspInst_t* fn0p = cmDspSysAllocInst(h,"Sprintf","filename", 1, "%s/%s_%02i.wav");
  902. cmDspInst_t* md0p = cmDspSysAllocInst(h,"Scalar", "Mode", 5, kNumberDuiId, 0.0, 4.0, 1.0, 1.0);
  903. cmDspInst_t* ws0p = cmDspSysAllocInst(h,"MsgList","wndSmpCnt", 3, "wndSmpCnt", NULL, 2);
  904. cmDspInst_t* hf0p = cmDspSysAllocInst(h,"MsgList","hopFact", 3, "hopFact", NULL, 2);
  905. cmDspInst_t* th0p = cmDspSysAllocInst(h,"Scalar", "threshold", 5, kNumberDuiId, 0.0, 100.0, 1.0, 60.0 );
  906. cmDspInst_t* us0p = cmDspSysAllocInst(h,"Scalar", "upr slope", 5, kNumberDuiId, 0.0, 10.0, 0.01, 0.0 );
  907. cmDspInst_t* ls0p = cmDspSysAllocInst(h,"Scalar", "lwr slope", 5, kNumberDuiId, 0.3, 10.0, 0.01, 2.0 );
  908. cmDspInst_t* of0p = cmDspSysAllocInst(h,"Scalar", "offset", 5, kNumberDuiId, 0.0, 100.0, 0.01, 30.0 );
  909. cmDspInst_t* iv0p = cmDspSysAllocInst(h,"Scalar", "invert", 5, kNumberDuiId, 0.0, 1.0, 1.0, 0.0 );
  910. cmDspSysNewColumn(h,0);
  911. //cmDspInst_t* al1p = cmDspSysAllocInst(h,"MsgList","audFiles", 2, "audFiles",NULL);
  912. //cmDspInst_t* fl1p = cmDspSysAllocInst(h,"MsgList","audFrags1", 2, "audFrags",NULL);
  913. //cmDspInst_t* fn1p = cmDspSysAllocInst(h,"Sprintf","filename", 1, "%s/%s_%02i.wav");
  914. cmDspInst_t* md1p = cmDspSysAllocInst(h,"Scalar", "Mode", 5, kNumberDuiId, 0.0, 4.0, 1.0, 1.0);
  915. cmDspInst_t* ws1p = cmDspSysAllocInst(h,"MsgList","wndSmpCnt", 3, "wndSmpCnt", NULL, 2);
  916. cmDspInst_t* hf1p = cmDspSysAllocInst(h,"MsgList","hopFact", 3, "hopFact", NULL, 2);
  917. cmDspInst_t* th1p = cmDspSysAllocInst(h,"Scalar", "threshold", 5, kNumberDuiId, 0.0, 100.0, 1.0, 60.0 );
  918. cmDspInst_t* us1p = cmDspSysAllocInst(h,"Scalar", "upr slope", 5, kNumberDuiId, 0.0, 10.0, 0.01, 0.0 );
  919. cmDspInst_t* ls1p = cmDspSysAllocInst(h,"Scalar", "lwr slope", 5, kNumberDuiId, 0.3, 10.0, 0.01, 2.0 );
  920. cmDspInst_t* of1p = cmDspSysAllocInst(h,"Scalar", "offset", 5, kNumberDuiId, 0.0, 100.0, 0.01, 30.0 );
  921. cmDspInst_t* iv1p = cmDspSysAllocInst(h,"Scalar", "invert", 5, kNumberDuiId, 0.0, 1.0, 1.0, 0.0 );
  922. cmDspSysNewColumn(h,0);
  923. cmDspInst_t* dnp = cmDspSysAllocInst(h,"Fname", "audDir", 3, true,NULL,afDir);
  924. cmDspInst_t* mtp = cmDspSysAllocInst(h,"Meter","MyMeter", 3, 50.0, 0.0, 100.0);
  925. cmDspInst_t* atp = cmDspSysAllocInst(h,"AMeter","Audio Meter",0);
  926. if( (rc = cmDspSysLastRC(h)) != kOkDspRC )
  927. return rc;
  928. cmDspSysConnectAudio(h, ph0p, "out", wt0p, "phs"); // phasor->wt:phs
  929. cmDspSysConnectAudio(h, wt0p, "out", kr0p, "in"); // wt->kr
  930. cmDspSysConnectAudio(h, kr0p, "out", ao0p, "in"); // kr->aout- 0
  931. cmDspSysConnectAudio(h, wt0p, "out", kr1p, "in"); // wt->kr
  932. cmDspSysConnectAudio(h, kr1p, "out", ao1p, "in"); // kr->aout - 1
  933. if( ao2p != NULL )
  934. cmDspSysConnectAudio(h, wt0p,"out", ao2p, "in"); // wt->aout - 2
  935. if( ao3p != NULL )
  936. cmDspSysConnectAudio(h, wt0p,"out", ao3p, "in"); // wt->aout - 3
  937. cmDspSysConnectAudio(h, wt0p,"out", atp, "in"); // wt->meter
  938. cmDspSysInstallCb(h, ws0p, "out", kr0p, "wndn", NULL ); // wndSmpCnt->kr
  939. cmDspSysInstallCb(h, hf0p, "out", kr0p, "hopf", NULL ); // hopFact->kr
  940. cmDspSysInstallCb(h, md0p, "val", kr0p, "mode", NULL ); // mode->kr
  941. cmDspSysInstallCb(h, th0p, "val", kr0p, "thrh", NULL ); // thresh->kr
  942. cmDspSysInstallCb(h, ls0p, "val", kr0p, "lwrs", NULL ); // lwrSlope->kr
  943. cmDspSysInstallCb(h, us0p, "val", kr0p, "uprs", NULL ); // uprSlope->kr
  944. cmDspSysInstallCb(h, of0p, "val", kr0p, "offs", NULL ); // offset->kr
  945. cmDspSysInstallCb(h, iv0p, "val", kr0p, "invt", NULL ); // invert->kr
  946. cmDspSysInstallCb(h, th0p, "val", mtp, "in", NULL );
  947. cmDspSysInstallCb(h, ws1p, "out", kr1p, "wndn", NULL ); // wndSmpCnt->kr
  948. cmDspSysInstallCb(h, hf1p, "out", kr1p, "hopf", NULL ); // hopFact->kr
  949. cmDspSysInstallCb(h, md1p, "val", kr1p, "mode", NULL ); // mode->kr
  950. cmDspSysInstallCb(h, th1p, "val", kr1p, "thrh", NULL ); // thresh->kr
  951. cmDspSysInstallCb(h, ls1p, "val", kr1p, "lwrs", NULL ); // lwrSlope->kr
  952. cmDspSysInstallCb(h, us1p, "val", kr1p, "uprs", NULL ); // uprSlope->kr
  953. cmDspSysInstallCb(h, of1p, "val", kr1p, "offs", NULL ); // offset->kr
  954. cmDspSysInstallCb(h, iv1p, "val", kr1p, "invt", NULL ); // invert->kr
  955. cmDspSysInstallCb(h, dnp, "out", fn0p, "in-0", NULL); // dir->fn:0
  956. cmDspSysInstallCb(h, al0p, "out", fn0p, "in-1", NULL ); // fn->fn:1
  957. cmDspSysInstallCb(h, fl0p, "take", fn0p, "in-2", NULL ); // take->fn:2
  958. cmDspSysInstallCb(h, fn0p, "out", ro0p, "in-0", NULL); // fn->print
  959. cmDspSysInstallCb(h, fl0p, "beg", ro0p, "in-1", NULL); //
  960. cmDspSysInstallCb(h, fl0p, "end", ro0p, "in-2", NULL); //
  961. cmDspSysInstallCb(h, ro0p, "out-0", wt0p, "fn", NULL ); // fn->wt:fn
  962. cmDspSysInstallCb(h, ro0p, "out-1", wt0p, "beg", NULL ); // beg->wt:beg
  963. cmDspSysInstallCb(h, ro0p, "out-2", wt0p, "end", NULL ); // end->wt:end
  964. cmDspSysInstallCb(h, ro0p, "out-1", prp, "in", NULL ); //
  965. //cmDspSysInstallCb(h, dnp, "out", fn1p, "in-0", NULL); // dir->fn:0
  966. //cmDspSysInstallCb(h, al1p, "out", fn1p, "in-1", NULL ); // fn->fn:1
  967. //cmDspSysInstallCb(h, fl1p, "take", fn1p, "in-2", NULL ); // take->fn:2
  968. //cmDspSysInstallCb(h, fn1p, "out", ro1p, "in-0", NULL); // fn->print
  969. //cmDspSysInstallCb(h, fl1p, "beg", ro1p, "in-1", NULL); //
  970. //cmDspSysInstallCb(h, fl1p, "end", ro1p, "in-2", NULL); //
  971. //cmDspSysInstallCb(h, ro1p, "out-0", wt1p, "fn", NULL ); // fn->wt:fn
  972. //cmDspSysInstallCb(h, ro1p, "out-1", wt1p, "beg", NULL ); // beg->wt:beg
  973. //cmDspSysInstallCb(h, ro1p, "out-2", wt1p, "end", NULL ); // end->wt:end
  974. return cmDspSysLastRC(h);
  975. }
  976. //------------------------------------------------------------------------------
  977. //)
  978. //( { label:cmDspPgm_Pickups0 file_desc:"'fluxo' with loop-record, echo, rectify, and pitch-shift." kw:[spgm fluxo] }
  979. cmDspRC_t _cmDspSysPgm_Pickups0( cmDspSysH_t h, void** userPtrPtr )
  980. {
  981. unsigned i;
  982. unsigned chCnt = 8;
  983. double delayFb = 0.0;
  984. double delayMaxMs = 1000.0;
  985. cmDspInst_t* chArray[chCnt];
  986. cmDspInst_t* m_mxWet = cmDspSysAllocInst(h,"Scalar", "Mstr Wet", 5, kNumberDuiId, 0.0, 2.0, 0.01, 1.0 );
  987. cmDspInst_t* m_mxDry = cmDspSysAllocInst(h,"Scalar", "Mstr Dry", 5, kNumberDuiId, 0.0, 2.0, 0.01, 1.0 );
  988. cmDspSysNewColumn(h,0);
  989. cmDspInst_t* m_lpByp = cmDspSysAllocInst(h,"Button", "Mstr Lp Byps", 2, kCheckDuiId, 0.0 );
  990. cmDspInst_t* m_lpRcd = cmDspSysAllocInst(h,"Button", "Mstr Lp Recd", 2, kCheckDuiId, 0.0 );
  991. cmDspInst_t* m_lpRat = cmDspSysAllocInst(h,"Scalar", "Mstr Lp Ratio", 5, kNumberDuiId, 0.0, 10.0, 0.01, 1.0 );
  992. cmDspSysNewColumn(h,0);
  993. cmDspInst_t* m_dlyByp = cmDspSysAllocInst(h,"Button", "Mstr Dly Byps", 2, kCheckDuiId, 0.0 );
  994. cmDspInst_t* m_dlyMs = cmDspSysAllocInst(h,"Scalar", "Mstr Dly Time", 5, kNumberDuiId, 0.0, delayMaxMs, 1.0, 0.0 );
  995. cmDspInst_t* m_dlyFb = cmDspSysAllocInst(h,"Scalar", "Mstr Dly Fb", 5, kNumberDuiId, 0.0, 0.999, 0.01, 0.0 );
  996. cmDspSysNewColumn(h,0);
  997. cmDspInst_t* m_psByp = cmDspSysAllocInst(h,"Button", "Mstr PS Byps", 2, kCheckDuiId, 0.0 );
  998. cmDspInst_t* m_psRat = cmDspSysAllocInst(h,"Scalar", "Mstr PS Ratio", 5, kNumberDuiId, 0.0, 10.0, 0.01, 1.0 );
  999. cmDspSysNewColumn(h,0);
  1000. cmDspInst_t* m_rcByp = cmDspSysAllocInst(h,"Button", "Mstr Rect Byps", 2, kCheckDuiId, 0.0 );
  1001. cmDspSysInsertHorzBorder(h);
  1002. for(i=0; i<chCnt; ++i)
  1003. {
  1004. int chIdx = i;
  1005. cmDspInst_t* mxWet = cmDspSysAllocInst(h,"Scalar", "Wet", 5, kNumberDuiId, 0.0, 2.0, 0.01, 1.0 );
  1006. cmDspInst_t* mxDry = cmDspSysAllocInst(h,"Scalar", "Dry", 5, kNumberDuiId, 0.0, 2.0, 0.01, 1.0 );
  1007. cmDspInst_t* lpByp = cmDspSysAllocInst(h,"Button", "Lp Byps", 2, kCheckDuiId, 0.0 );
  1008. cmDspInst_t* lpRcd = cmDspSysAllocInst(h,"Button", "Lp Recd", 2, kCheckDuiId, 0.0 );
  1009. cmDspInst_t* lpRat = cmDspSysAllocInst(h,"Scalar", "Lp Ratio", 5, kNumberDuiId, 0.0, 10.0, 0.01, 1.0 );
  1010. cmDspInst_t* dlyByp = cmDspSysAllocInst(h,"Button", "Delay Byps", 2, kCheckDuiId, 0.0 );
  1011. cmDspInst_t* dlyMs = cmDspSysAllocInst(h,"Scalar", "Delay Time", 5, kNumberDuiId, 0.0, delayMaxMs, 1.0, 0.0 );
  1012. cmDspInst_t* dlyFb = cmDspSysAllocInst(h,"Scalar", "Delay Fb", 5, kNumberDuiId, 0.0, 0.999, 0.01, 0.0 );
  1013. cmDspInst_t* psByp = cmDspSysAllocInst(h,"Button", "PS Byps", 2, kCheckDuiId, 0.0 );
  1014. cmDspInst_t* psRat = cmDspSysAllocInst(h,"Scalar", "PS Ratio", 5, kNumberDuiId, 0.0, 10.0, 0.01, 1.0 );
  1015. cmDspInst_t* rcByp = cmDspSysAllocInst(h,"Button", "Rect Byps", 2, kCheckDuiId, 0.0 );
  1016. cmDspInst_t* ain = cmDspSysAllocInst(h, "AudioIn", NULL, 1, chIdx );
  1017. cmDspInst_t* loop = cmDspSysAllocInst(h, "LoopRecd", NULL, 0 );
  1018. cmDspInst_t* dely = cmDspSysAllocInst(h, "Delay", NULL, 2, delayMaxMs, delayFb );
  1019. cmDspInst_t* pshf = cmDspSysAllocInst(h, "PShift", NULL, 0 );
  1020. cmDspInst_t* rect = cmDspSysAllocInst(h, "Rectify", NULL, 0 );
  1021. cmDspInst_t* amix = cmDspSysAllocInst(h, "AMix", NULL, 1, 2 );
  1022. //cmDspInst_t* aout = cmDspSysAllocInst(h, "AudioOut", NULL, 1, chIdx );
  1023. chArray[i] = amix;
  1024. cmDspSysNewColumn(h,0);
  1025. cmDspSysConnectAudio(h, ain, "out", loop, "in"); // ain -> loop
  1026. cmDspSysConnectAudio(h, loop, "out", dely, "in"); // loop -> delay
  1027. cmDspSysConnectAudio(h, dely, "out", pshf, "in"); // delay -> pshf
  1028. cmDspSysConnectAudio(h, pshf, "out", rect, "in"); // pshf -> rect
  1029. cmDspSysConnectAudio(h, rect, "out", amix, "in-0"); // rect -> mix_wet
  1030. cmDspSysConnectAudio(h, ain, "out", amix, "in-1"); // ain -> mix_dry
  1031. //cmDspSysConnectAudio(h, amix, "out", aout, "in"); // mix -> out
  1032. cmDspSysInstallCb(h, mxWet, "val", amix, "gain-0", NULL );
  1033. cmDspSysInstallCb(h, mxDry, "val", amix, "gain-1", NULL );
  1034. cmDspSysInstallCb(h, lpByp, "out", loop, "bypass", NULL );
  1035. cmDspSysInstallCb(h, lpRcd, "out", loop, "recd", NULL );
  1036. cmDspSysInstallCb(h, lpRat, "val", loop, "ratio", NULL );
  1037. cmDspSysInstallCb(h, dlyByp,"val", dely, "bypass", NULL );
  1038. cmDspSysInstallCb(h, dlyMs, "val", dely, "time", NULL );
  1039. cmDspSysInstallCb(h, dlyFb, "out", dely, "fb", NULL );
  1040. cmDspSysInstallCb(h, psByp, "out", pshf, "bypass", NULL );
  1041. cmDspSysInstallCb(h, psRat, "val", pshf, "ratio", NULL );
  1042. cmDspSysInstallCb(h, rcByp, "out", rect, "bypass", NULL );
  1043. cmDspSysInstallCb(h, m_mxWet, "val", mxWet, "in", NULL );
  1044. cmDspSysInstallCb(h, m_mxDry, "val", mxDry, "in", NULL );
  1045. cmDspSysInstallCb(h, m_lpByp, "out", lpByp, "in", NULL );
  1046. cmDspSysInstallCb(h, m_lpRcd, "out", lpRcd, "in", NULL );
  1047. cmDspSysInstallCb(h, m_lpRat, "val", lpRat, "in", NULL );
  1048. cmDspSysInstallCb(h, m_dlyByp,"out", dlyByp,"in", NULL );
  1049. cmDspSysInstallCb(h, m_dlyMs, "val", dlyMs, "in", NULL );
  1050. cmDspSysInstallCb(h, m_dlyFb, "val", dlyFb, "in", NULL );
  1051. cmDspSysInstallCb(h, m_psByp, "out", psByp, "in", NULL );
  1052. cmDspSysInstallCb(h, m_psRat, "val", psRat, "in", NULL );
  1053. cmDspSysInstallCb(h, m_rcByp, "out", rcByp, "in", NULL );
  1054. }
  1055. double dfltGain = 0.5;
  1056. cmDspInst_t* omix = cmDspSysAllocInst(h, "AMix", NULL, 9, 8, dfltGain, dfltGain, dfltGain, dfltGain, dfltGain, dfltGain, dfltGain, dfltGain );
  1057. cmDspInst_t* aout0 = cmDspSysAllocInst(h, "AudioOut", NULL, 1, 0 );
  1058. cmDspInst_t* aout1 = cmDspSysAllocInst(h, "AudioOut", NULL, 1, 1 );
  1059. cmDspInst_t* aout2 = cmDspSysAllocInst(h, "AudioOut", NULL, 1, 2 );
  1060. cmDspInst_t* aout3 = cmDspSysAllocInst(h, "AudioOut", NULL, 1, 3 );
  1061. for(i=0; i<chCnt; ++i)
  1062. {
  1063. char label[32];
  1064. snprintf(label,32,"in-%i",i);
  1065. cmDspSysConnectAudio(h, chArray[i], "out", omix, label);
  1066. }
  1067. cmDspSysConnectAudio(h, omix, "out", aout0, "in");
  1068. cmDspSysConnectAudio(h, omix, "out", aout1, "in");
  1069. cmDspSysConnectAudio(h, omix, "out", aout2, "in");
  1070. cmDspSysConnectAudio(h, omix, "out", aout3, "in");
  1071. return kOkDspRC;
  1072. }
  1073. //------------------------------------------------------------------------------
  1074. //)
  1075. //( { label:cmDspPgm_AutoGain file_desc:"'fluxo' channel calibration program." kw:[spgm fluxo] }
  1076. #include "cmAudioFile.h"
  1077. #include "cmProcObj.h"
  1078. #include "cmProc.h"
  1079. #include "cmProc3.h"
  1080. // Usage:
  1081. // 1) Push 'start'.
  1082. // 2) Select the first element in the Ch Cfg List UI.
  1083. // 3) Play several examples of the note.
  1084. // 4) Select the next element in the Ch Cfg List UI.
  1085. // 5) Go to 3) until all ch's have been played.
  1086. // 6) Push 'proc'. A new set of gains will be calc'd and sent to the audio input channels.
  1087. // Note that if a mistake is made while playing a set of notes in 3) then
  1088. // push select the same element from the list again and replay.
  1089. // The order the notes are played in does not make any difference.
  1090. cmDspRC_t _cmDspSysPgm_AutoGain( cmDspSysH_t h, void** userPtrPtr )
  1091. {
  1092. cmDspRC_t rc = kOkDspRC;
  1093. unsigned i;
  1094. //unsigned j;
  1095. cmErr_t err;
  1096. const cmChar_t* errLabelPtr = NULL;
  1097. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  1098. unsigned chCnt = 0;
  1099. unsigned nsChCnt = 0;
  1100. const cmChar_t* chCfgFn = NULL;
  1101. const cmChar_t* chCfgPath = NULL;
  1102. unsigned agMedCnt = 5;
  1103. unsigned agAvgCnt = 9;
  1104. unsigned agSuprCnt = 3;
  1105. unsigned agOffCnt = 3;
  1106. cmReal_t agSuprCoeff = 1.4;
  1107. cmReal_t agOnThreshDb = -53.0;
  1108. cmReal_t agOffThreshDb = -80.0;
  1109. cmReal_t agHopMs = 25;
  1110. //cmReal_t cdMaxTimeSpanMs = 50;
  1111. //cmReal_t cdMinNoteCnt = 3;
  1112. unsigned labelCharCnt = 31;
  1113. char label0[ labelCharCnt + 1];
  1114. cmErrSetup(&err,&cmCtx->rpt,"Auto-gain");
  1115. // get the name of channel cfg file
  1116. if( cmJsonPathValues( cmDspSysPgmRsrcHandle(h),"cfg/",NULL,&errLabelPtr,
  1117. "chCfgFn", kStringTId, &chCfgFn,
  1118. "agParms/hopMs", kRealTId, &agHopMs,
  1119. "agParms/medCnt", kIntTId, &agMedCnt,
  1120. "agParms/avgCnt", kIntTId, &agAvgCnt,
  1121. "agParms/suprCnt", kIntTId, &agSuprCnt,
  1122. "agParms/offCnt", kIntTId, &agOffCnt,
  1123. "agParms/suprCoeff", kRealTId, &agSuprCoeff,
  1124. "agParms/onThreshDb", kRealTId, &agOnThreshDb,
  1125. "agParms/offThreshDb", kRealTId, &agOffThreshDb,
  1126. NULL) != kOkJsRC )
  1127. {
  1128. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"An error occurred while reading the required auto-tune JSON parameters.");
  1129. goto errLabel;
  1130. }
  1131. // get the count of channels from the ch. cfg. array
  1132. if(( chCnt = cmChCfgChannelCount(cmCtx,chCfgFn,&nsChCnt)) == 0 )
  1133. {
  1134. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"Unable to obtain the channel count from '%s'.",cmStringNullGuard(chCfgFn));
  1135. goto errLabel;
  1136. }
  1137. // prepend the prefs directory to the ch. cfg filename
  1138. chCfgPath = cmFsMakeFn(cmFsPrefsDir(),chCfgFn,NULL,NULL);
  1139. if( rc == kOkDspRC )
  1140. {
  1141. //mDspInst_t* ain[chCnt];
  1142. cmDspInst_t* ef[chCnt];
  1143. cmDspInst_t* mtr[chCnt];
  1144. cmDspInst_t* amtr[chCnt];
  1145. cmDspInst_t* on[chCnt];
  1146. cmDspInst_t* off[chCnt];
  1147. cmDspInst_t* rms[chCnt];
  1148. ///cmDspInst_t* fdr0[chCnt];
  1149. ///cmDspInst_t* fdr1[chCnt];
  1150. ///cmDspInst_t* fdr2[chCnt];
  1151. // allocate the audio inputs
  1152. //for(i=0; i<chCnt; ++i)
  1153. // ain[i] = cmDspSysAllocAudioIn(h,i,1.0);
  1154. unsigned inChCnt;
  1155. cmDspInst_t** ain = cmDspSysAllocAudioInAR( h, "audioInMap", 1.0, &inChCnt );
  1156. // allocate the auto-gain calibration object
  1157. cmDspInst_t* ag = cmDspSysAllocInst( h, "AutoGain", NULL, 9, chCnt, agHopMs,agMedCnt,agAvgCnt,agSuprCnt,agOffCnt,agSuprCoeff,agOnThreshDb,agOffThreshDb );
  1158. // allocate the command buttons
  1159. cmDspInst_t* start = cmDspSysAllocButton(h, "start", 0);
  1160. cmDspInst_t* proc = cmDspSysAllocButton(h, "proc", 0);
  1161. cmDspInst_t* cancel = cmDspSysAllocButton(h, "cancel", 0);
  1162. cmDspInst_t* write = cmDspSysAllocButton(h, "write", 0);
  1163. cmDspInst_t* print = cmDspSysAllocButton(h, "print", 0);
  1164. cmDspInst_t* chMenu = cmDspSysAllocMsgList(h, chCfgPath, "ch_array", 0 );
  1165. cmDspInst_t* onThr = cmDspSysAllocScalar(h,"On Thresh",-100.0,0.0,0.1,-45.0);
  1166. cmDspInst_t* offThr = cmDspSysAllocScalar(h,"Off Thresh",-100.0,0.0,0.1,-80.0);
  1167. //cmDspInst_t* prt = cmDspSysAllocInst(h,"Printer",NULL,1,"ag>");
  1168. cmDspInst_t* sub = cmDspSysAllocInst(h,"ScalarOp",NULL,6,2,"+","in-0",0.0,"in-1",-1.0);
  1169. cmDspSysNewColumn(h,200);
  1170. cmDspSysAllocLabel(h,"EF Gate",kLeftAlignDuiId);
  1171. // allocate the envelope followers and meters
  1172. for(i=0; i<chCnt; ++i )
  1173. {
  1174. snprintf(label0,labelCharCnt,"%2i",i);
  1175. ef[i] = cmDspSysAllocInst( h, "EnvFollow", NULL, 0 );
  1176. mtr[i] = cmDspSysAllocInst( h, "Meter",label0, 3, 0.0, 0.0, 1.0 );
  1177. }
  1178. cmDspSysNewColumn(h,200);
  1179. cmDspSysAllocLabel(h,"Audio",kLeftAlignDuiId);
  1180. // allocate the envelope followers and meters
  1181. for(i=0; i<chCnt; ++i )
  1182. {
  1183. amtr[i] = cmDspSysAllocInst( h, "AMeter", NULL, 0 );
  1184. }
  1185. // chord detector, note selector, mix0, mix1, mix2
  1186. ///cmDspInst_t* cdp = cmDspSysAllocInst(h, "ChordDetect", NULL, 1, "cdSel" );
  1187. ///cmDspInst_t* nsp = cmDspSysAllocInst(h, "NoteSelect", NULL, 1, chCnt );
  1188. // onset count display
  1189. cmDspSysNewColumn(h,150);
  1190. cmDspSysAllocLabel(h,"Onsets",kLeftAlignDuiId);
  1191. for(i=0; i<chCnt; ++i)
  1192. on[i] = cmDspSysAllocScalar(h,NULL,0,1,0,0);
  1193. // offset count display
  1194. cmDspSysNewColumn(h,150);
  1195. cmDspSysAllocLabel(h,"Offsets",kLeftAlignDuiId);
  1196. for(i=0; i<chCnt; ++i)
  1197. off[i] = cmDspSysAllocScalar(h,NULL,0,1,0,0);
  1198. // offset count display
  1199. cmDspSysNewColumn(h,150);
  1200. cmDspSysAllocLabel(h,"RMS",kLeftAlignDuiId);
  1201. for(i=0; i<chCnt; ++i)
  1202. rms[i] = cmDspSysAllocScalar(h,NULL,0,1,0,0);
  1203. /*
  1204. // note select gate meters
  1205. for(j=0; j<3; ++j)
  1206. {
  1207. snprintf(label0,labelCharCnt,"Set %i",j);
  1208. cmDspSysNewColumn(h,50);
  1209. cmDspSysAllocLabel(h,label0,kLeftAlignDuiId );
  1210. for(i=0; i<chCnt; ++i)
  1211. {
  1212. cmDspInst_t* m = cmDspSysAllocInst(h, "Meter", NULL, 3, 0.0, 0.0, 1.0 );
  1213. switch(j)
  1214. {
  1215. case 0: fdr0[i] = m; break;
  1216. case 1: fdr1[i] = m; break;
  1217. case 2: fdr2[i] = m; break;
  1218. }
  1219. }
  1220. }
  1221. // chord detector parameters
  1222. cmDspSysNewColumn(h,150);
  1223. cmDspSysAllocLabel(h,"Chord Detector",kLeftAlignDuiId);
  1224. cmDspInst_t* cdSpanMs = cmDspSysAllocScalar(h,"Span Ms", 10.0,1000.0,1.0,cdMaxTimeSpanMs);
  1225. cmDspInst_t* cdNoteCnt = cmDspSysAllocScalar(h,"Note Cnt", 1.0, 100.0,1.0,cdMinNoteCnt );
  1226. cmDspInst_t* cdCount = cmDspSysAllocScalar(h,"Ch. Count", 0,1,0,0);
  1227. */
  1228. // allocate an audio mixer and two audio output channels
  1229. cmDspInst_t* amix = cmDspSysAllocInst( h, "AMix", NULL, 1, chCnt);
  1230. cmDspInst_t* ao0 = cmDspSysAllocAudioOut(h,0,1.0);
  1231. cmDspInst_t* ao1 = cmDspSysAllocAudioOut(h,1,1.0);
  1232. // alloc chCfg last so that it's default outputs are applied to connected objects
  1233. cmDspInst_t* chCfg = cmDspSysAllocInst( h, "ChCfg", NULL, 1, chCfgFn );
  1234. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1235. goto errLabel;
  1236. cmDspSysConnectAudioN11N(h,ain, "out", ag, "in", chCnt); // ain -> auto gain
  1237. cmDspSysConnectAudioN11N(h,ain, "out", amix, "in", chCnt); // ain -> amix
  1238. cmDspSysConnectAudioN1N1(h,ain, "out", ef, "in", chCnt); // ain -> EF
  1239. cmDspSysConnectAudioN1N1(h, ain, "out", amtr, "in",chCnt);
  1240. cmDspSysInstallCb1N1N(h, ag, "gain", chCfg, "gain", chCnt ); // ag -> chCfg (gain)
  1241. cmDspSysInstallCb1NN1(h, chCfg, "gain", ain, "gain", chCnt ); // cgCfg -> ain (gain)
  1242. cmDspSysInstallCb1NN1(h, chCfg, "ch", ain, "ch", chCnt ); // cgCfg -> ain (ch)
  1243. cmDspSysInstallCbN1N1(h, ef, "gate", mtr, "in", chCnt ); // EF gate -> meter
  1244. cmDspSysInstallCb11N1(h, onThr, "val", ef, "ondb", chCnt ); //
  1245. cmDspSysInstallCb11N1(h, offThr, "val", ef, "offdb", chCnt ); //
  1246. cmDspSysInstallCbN1N1(h, ef, "ons", on, "val", chCnt ); // EF -> onset count
  1247. cmDspSysInstallCbN1N1(h, ef, "offs", off, "val", chCnt ); // EF -> offset count
  1248. cmDspSysInstallCbN1N1(h, ef, "rms", rms, "val", chCnt );
  1249. ///cmDspSysInstallCbN11N(h, ef, "gate", cdp, "gate", chCnt ); // EF -> CD gate
  1250. ///cmDspSysInstallCbN11N(h, ef, "rms", cdp, "rms", chCnt ); // EF -> CD rms
  1251. ///cmDspSysInstallCb1N1N(h, cdp, "gate", nsp, "gate", chCnt ); // CD -> NS gate
  1252. ///cmDspSysInstallCb1N1N(h, cdp, "rms", nsp, "rms", chCnt ); // CD -> NS rms
  1253. ///cmDspSysInstallCb1NN1(h, nsp, "gate-0",fdr0, "in", chCnt ); // NS -> Fader 0 gate
  1254. ///cmDspSysInstallCb1NN1(h, nsp, "gate-1",fdr1, "in", chCnt ); // NS -> Fader 1 gate
  1255. ///cmDspSysInstallCb1NN1(h, nsp, "gate-2",fdr2, "in", chCnt ); // NS -> Fader 2 gate
  1256. cmDspSysConnectAudio(h, amix, "out", ao0, "in"); // amix -> aout 0
  1257. cmDspSysConnectAudio(h, amix, "out", ao1, "in"); // amix -> aout 1
  1258. //cmDspSysInstallCb(h, chMenu, "ch", ag, "id", NULL );
  1259. cmDspSysInstallCb(h, chMenu, "sel", sub, "in-0", NULL );
  1260. cmDspSysInstallCb(h, sub, "out", ag, "id", NULL );
  1261. cmDspSysInstallCb(h, start, "sym", ag, "sel", NULL );
  1262. cmDspSysInstallCb(h, proc, "sym", ag, "sel", NULL );
  1263. cmDspSysInstallCb(h, cancel, "sym", ag, "sel", NULL );
  1264. cmDspSysInstallCb(h, print, "sym", ag, "sel", NULL );
  1265. cmDspSysInstallCb(h, print, "sym", chCfg, "sel", NULL );
  1266. cmDspSysInstallCb(h, write, "sym", chCfg, "sel", NULL );
  1267. /*
  1268. cmDspSysInstallCb(h, cdSpanMs, "val", cdp, "span", NULL );
  1269. cmDspSysInstallCb(h, cdNoteCnt, "val", cdp, "notes", NULL );
  1270. cmDspSysInstallCb(h, cdp, "count", cdCount, "val", NULL );
  1271. cmDspSysInstallCb(h, cdp, "detect", nsp, "trig", NULL );
  1272. */
  1273. }
  1274. errLabel:
  1275. cmFsFreeFn(chCfgPath);
  1276. return rc;
  1277. }
  1278. //------------------------------------------------------------------------------
  1279. //)
  1280. //( { label:cmDspPgm_PickupFxFile file_desc:"'fluxo' noise shapers." kw:[spgm fluxo] }
  1281. cmDspRC_t _cmDspSysPgm_PickupFxFile( cmDspSysH_t h, void** userPtrPtr )
  1282. {
  1283. cmDspRC_t rc = kOkDspRC;
  1284. cmErr_t err;
  1285. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  1286. unsigned chCnt = 0;
  1287. unsigned nsChCnt = 0;
  1288. const cmChar_t* chCfgPath = NULL;
  1289. const cmChar_t* chCfgFn = "pick_chs8.js";
  1290. double cfMinHz = 20.0;
  1291. double cfAlpha = 0.9;
  1292. bool cfFbFl = true;
  1293. unsigned sgShapeId = 2;
  1294. const cmChar_t* afn = "/home/kevin/media/audio/gate_detect/gate_detect0.aif";
  1295. double abeg[] = { 9.842046, 18.838291, 27.007957, 35.562079, 45.461793, 52.920218, 60.436312, 68.913543};
  1296. double aend[] = {11.399088, 20.645229, 28.891786, 37.311349, 47.287954, 54.131251, 62.473923, 72.142964};
  1297. bool cfBypassFl = false;
  1298. unsigned i;
  1299. cmErrSetup(&err,&cmCtx->rpt,"Pickup Effects");
  1300. // prepend the prefs directory to the ch. cfg filename
  1301. chCfgPath = cmFsMakeFn(cmFsPrefsDir(),chCfgFn,NULL,NULL);
  1302. // get the count of channels from the ch. cfg. array
  1303. if(( chCnt = cmChCfgChannelCount(cmCtx,chCfgFn,&nsChCnt)) == 0 )
  1304. {
  1305. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"Unable to obtain the channel count from '%s'.",cmStringNullGuard(chCfgFn));
  1306. goto errLabel;
  1307. }
  1308. if( rc == kOkDspRC )
  1309. {
  1310. cmDspInst_t* af[chCnt];
  1311. //cmDspInst_t* aout[chCnt];
  1312. cmDspInst_t* ef[chCnt];
  1313. cmDspInst_t* cf[chCnt];
  1314. cmDspInst_t* sg[chCnt];
  1315. cmDspInst_t* mtr[chCnt];
  1316. cmDspInst_t* mute[chCnt];
  1317. cmDspInst_t* phs = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  1318. // allocate the audio inputs
  1319. for(i=0; i<chCnt; ++i)
  1320. {
  1321. unsigned labelCharCnt = 31;
  1322. cmChar_t label[labelCharCnt+1];
  1323. snprintf(label,labelCharCnt,"%i",i);
  1324. int sbeg = floor(abeg[i] * cmDspSysSampleRate(h));
  1325. int send = floor(aend[i] * cmDspSysSampleRate(h));
  1326. //ain[i] = cmDspSysAllocAudioIn( h,i,1.0);
  1327. af[i] = cmDspSysAllocInst(h,"WaveTable",NULL, 6, ((int)cmDspSysSampleRate(h)), 1, afn, -1, sbeg, send );
  1328. //aout[i] = cmDspSysAllocAudioOut(h,i,1.0);
  1329. ef[i] = cmDspSysAllocInst(h, "EnvFollow", NULL, 0 );
  1330. sg[i] = cmDspSysAllocInst(h, "SigGen", NULL, 2, 1000.0, sgShapeId );
  1331. cf[i] = cmDspSysAllocInst(h, "CombFilt", NULL, 5, cfBypassFl, cfMinHz, cfFbFl, cfMinHz, cfAlpha );
  1332. mtr[i] = cmDspSysAllocInst( h, "Meter",label, 3, 0.0, 0.0, 1.0 );
  1333. }
  1334. // allocate the ch cfg last so that it's default outputs initialize connected objects
  1335. cmDspInst_t* chCfg = cmDspSysAllocInst( h, "ChCfg", NULL, 1, chCfgFn );
  1336. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL, 1, chCnt );
  1337. cmDspSysNewColumn(h,50);
  1338. for(i=0; i<chCnt; ++i)
  1339. mute[i] = cmDspSysAllocCheck(h,"",0);
  1340. // checkk for allocation errors
  1341. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1342. goto errLabel;
  1343. //
  1344. //cmDspSysConnectAudioN1N1(h, ain, "out", aout, "in", chCnt );
  1345. cmDspSysConnectAudio11N1(h, phs, "out", af, "phs", chCnt );
  1346. cmDspSysConnectAudioN1N1(h, af, "out", ef, "in", chCnt ); // af -> EF
  1347. cmDspSysConnectAudioN1N1(h, sg, "out", cf, "in", chCnt ); // sg -> CF
  1348. cmDspSysConnectAudioN11N(h, cf, "out", mix, "in", chCnt ); // CF -> mix
  1349. //cmDspSysInstallCb1NN1( h, chCfg, "gain", ain, "gain", chCnt ); // chCfg -> ain gain
  1350. cmDspSysInstallCb1NN1( h, chCfg, "hz", cf, "hz", chCnt ); // chCfg -> CF Hz
  1351. //cmDspSysInstallCbN1N1( h, ef, "rms", aout, "gain", chCnt ); // EF -> aout gain
  1352. cmDspSysInstallCbN1N1( h, ef, "rms", mtr, "in", chCnt ); // EF -> meter RMS
  1353. cmDspSysInstallCbN11N( h, ef, "rms", mix, "gain", chCnt );
  1354. cmDspSysInstallCbN11N( h, mute, "out", mix, "mute", chCnt ); // mute -> mix
  1355. }
  1356. errLabel:
  1357. cmFsFreeFn(chCfgPath);
  1358. return rc;
  1359. }
  1360. //------------------------------------------------------------------------------
  1361. //)
  1362. //( { label:cmDspPgm_NoiseTails file_desc:"'fluxo' noise shapers." kw:[spgm fluxo] }
  1363. cmDspRC_t _cmDspSysPgm_NoiseTails( cmDspSysH_t h, void** userPtrPtr )
  1364. {
  1365. cmDspRC_t rc = kOkDspRC;
  1366. cmErr_t err;
  1367. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  1368. unsigned chCnt = 0;
  1369. unsigned nsChCnt = 0;
  1370. const cmChar_t* chCfgPath = NULL;
  1371. const cmChar_t* chCfgFn = "pick_chs8.js";
  1372. double cfMinHz = 20.0;
  1373. double cfHz = 500;
  1374. double cfAlpha = 0.9;
  1375. bool cfFbFl = true;
  1376. bool cfBypassFl= false;
  1377. unsigned sgShapeId = 3;
  1378. double dfltDelayMs = 100;
  1379. unsigned i;
  1380. cmErrSetup(&err,&cmCtx->rpt,"Noise Tails");
  1381. // prepend the prefs directory to the ch. cfg filename
  1382. chCfgPath = cmFsMakeFn(cmFsPrefsDir(),chCfgFn,NULL,NULL);
  1383. // get the count of channels from the ch. cfg. array
  1384. if(( chCnt = cmChCfgChannelCount(cmCtx,chCfgFn,&nsChCnt)) == 0 )
  1385. {
  1386. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"Unable to obtain the channel count from '%s'.",cmStringNullGuard(chCfgFn));
  1387. goto errLabel;
  1388. }
  1389. if( rc == kOkDspRC )
  1390. {
  1391. cmDspInst_t* ain[chCnt];
  1392. cmDspInst_t* ef[chCnt];
  1393. cmDspInst_t* cf[chCnt];
  1394. cmDspInst_t* sg[chCnt];
  1395. cmDspInst_t* mtr[chCnt];
  1396. cmDspInst_t* add[chCnt];
  1397. cmDspInst_t* mul[chCnt];
  1398. cmDspInst_t* dly[chCnt];
  1399. // allocate the audio inputs
  1400. for(i=0; i<chCnt; ++i)
  1401. {
  1402. unsigned labelCharCnt = 31;
  1403. cmChar_t label[labelCharCnt+1];
  1404. snprintf(label,labelCharCnt,"%i",i);
  1405. ain[i] = cmDspSysAllocAudioIn( h, i, 1.0);
  1406. ef[i] = cmDspSysAllocInst( h, "EnvFollow", NULL, 0 );
  1407. sg[i] = cmDspSysAllocInst( h, "SigGen", NULL, 2, 1000.0, sgShapeId );
  1408. cf[i] = cmDspSysAllocInst( h, "CombFilt", NULL, 5, cfBypassFl, cfMinHz, cfFbFl, cfHz, cfAlpha );
  1409. mtr[i] = cmDspSysAllocInst( h, "Meter",label, 3, 0.0, 0.0, 1.0 );
  1410. add[i] = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "+", "in-0", 0.0, "in-1", 0.0);
  1411. mul[i] = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*", "in-0", 0.0, "in-1", 0.99);
  1412. dly[i] = cmDspSysAllocInst( h, "MsgDelay", NULL, 2, 1000, dfltDelayMs );
  1413. }
  1414. // allocate the ch cfg last so that it's default outputs initialize connected objects
  1415. cmDspInst_t* chCfg = cmDspSysAllocInst( h, "ChCfg", NULL, 1, chCfgFn );
  1416. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL, 1, chCnt );
  1417. cmDspInst_t* ao0 = cmDspSysAllocAudioOut( h, 0, 1.0 );
  1418. cmDspInst_t* ao1 = cmDspSysAllocAudioOut( h, 1, 1.0 );
  1419. cmDspInst_t* alpha = cmDspSysAllocScalar( h, "alpha", -1.0, 1.0, 0.001, cfAlpha );
  1420. cmDspInst_t* decay = cmDspSysAllocScalar( h, "decay", -1.0, 1.0, 0.001, 0.5);
  1421. cmDspInst_t* delay = cmDspSysAllocScalar( h, "delay", 0.0, 1000.0, 1.0, dfltDelayMs );
  1422. cmDspInst_t* zero = cmDspSysAllocScalar( h, "zero", 0.0, 0.0, 0.0, 0.0);
  1423. // check for allocation errors
  1424. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1425. goto errLabel;
  1426. cmDspSysConnectAudioN1N1( h, ain, "out", ef, "in", chCnt ); // ain -> EF
  1427. cmDspSysConnectAudioN1N1( h, sg, "out", cf, "in", chCnt ); // sg -> CF
  1428. cmDspSysConnectAudioN11N( h, cf, "out", mix, "in", chCnt ); // cf -> mix
  1429. cmDspSysConnectAudio( h, mix, "out", ao0, "in"); // mix -> aout L
  1430. cmDspSysConnectAudio( h, mix, "out", ao1, "in"); // mix -> aout R
  1431. cmDspSysInstallCb1NN1( h, chCfg, "gain", ain, "gain", chCnt ); // chCfg -> ain gain
  1432. cmDspSysInstallCb1NN1( h, chCfg, "hz", cf, "hz", chCnt ); // chCfg -> CF Hz
  1433. cmDspSysInstallCbN1N1( h, ef, "rms", add, "in-0", chCnt ); // EF -> mul 0
  1434. cmDspSysInstallCbN1N1( h, mul, "out", add, "in-1", chCnt ); // mul -> add
  1435. cmDspSysInstallCbN1N1( h, add, "out", dly, "in", chCnt ); // add -> delay
  1436. cmDspSysInstallCbN11N( h, dly, "out", mix, "gain", chCnt ); // delay -> mix gain
  1437. cmDspSysInstallCbN1N1( h, add, "out", mul, "in-0", chCnt); // add -> mul (feedback)
  1438. cmDspSysInstallCb11N1( h, decay, "val", mul, "in-1", chCnt ); // decay ctl
  1439. cmDspSysInstallCbN1N1( h, ef, "gate", mtr, "in", chCnt ); // EF -> meter RMS
  1440. cmDspSysInstallCb11N1( h, alpha, "val", cf, "alpha",chCnt ); // CF alpha
  1441. cmDspSysInstallCb11N1( h, delay, "val", dly, "delay",chCnt ); // Delay ctl
  1442. cmDspSysInstallCb111N( h, zero, "val", mix, "in", chCnt ); //
  1443. }
  1444. errLabel:
  1445. cmFsFreeFn(chCfgPath);
  1446. return rc;
  1447. }
  1448. //------------------------------------------------------------------------------
  1449. //)
  1450. //( { label:cmDspPgm_NoiseTails2 file_desc:"'fluxo' noise shapers." kw:[spgm fluxo] }
  1451. cmDspRC_t _cmDspSysPgm_NoiseTails2( cmDspSysH_t h, void** userPtrPtr )
  1452. {
  1453. cmDspRC_t rc = kOkDspRC;
  1454. cmErr_t err;
  1455. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  1456. unsigned chCnt = 0;
  1457. unsigned nsChCnt = 0;
  1458. const cmChar_t* chCfgPath = NULL;
  1459. const cmChar_t* chCfgFn = "pick_chs8.js";
  1460. double cfMinHz = 20.0;
  1461. double cfHz = 500;
  1462. double cfAlpha = 0.9;
  1463. bool cfFbFl = true;
  1464. bool cfBypassFl = false;
  1465. unsigned sgShapeId = 3;
  1466. double adsrMaxMs = 10000;
  1467. double adsrMinMs = 0;
  1468. double adsrIncMs = 1;
  1469. double adsrMaxLevel = 100.0;
  1470. double adsrSusLevel = 100.0;
  1471. double adsrMinLevel = 0.0;
  1472. double adsrIncLevel = 0.001;
  1473. bool eqBypassFl = false;
  1474. unsigned eqModeSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"LP");
  1475. double eqF0hz = 250;
  1476. double eqQ = 1.0;
  1477. double eqFgain = 1.0;
  1478. bool mtBypassFl = false;
  1479. double mtTimeScale= 1.0;
  1480. double mtFeedback = 0.0;
  1481. unsigned i;
  1482. cmErrSetup(&err,&cmCtx->rpt,"Noise Tails");
  1483. // prepend the prefs directory to the ch. cfg filename
  1484. chCfgPath = cmFsMakeFn(cmFsPrefsDir(),chCfgFn,NULL,NULL);
  1485. // get the count of channels from the ch. cfg. array
  1486. if(( chCnt = cmChCfgChannelCount(cmCtx,chCfgFn,&nsChCnt)) == 0 )
  1487. {
  1488. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"Unable to obtain the channel count from '%s'.",cmStringNullGuard(chCfgFn));
  1489. goto errLabel;
  1490. }
  1491. if( rc == kOkDspRC )
  1492. {
  1493. cmDspInst_t* ain[chCnt];
  1494. cmDspInst_t* ef[chCnt];
  1495. cmDspInst_t* cf[chCnt];
  1496. cmDspInst_t* sg[chCnt];
  1497. cmDspInst_t* mtr[chCnt];
  1498. cmDspInst_t* add[chCnt];
  1499. cmDspInst_t* mul[chCnt];
  1500. cmDspInst_t* env[chCnt];
  1501. cmDspInst_t* d2l[chCnt];
  1502. cmDspInst_t* eq[chCnt];
  1503. cmDspInst_t* mt[chCnt];
  1504. // allocate the audio inputs
  1505. for(i=0; i<chCnt; ++i)
  1506. {
  1507. unsigned labelCharCnt = 31;
  1508. cmChar_t label[labelCharCnt+1];
  1509. snprintf(label,labelCharCnt,"%i",i);
  1510. ain[i] = cmDspSysAllocAudioIn( h, i, 1.0);
  1511. ef[i] = cmDspSysAllocInst( h, "EnvFollow", NULL, 0 );
  1512. sg[i] = cmDspSysAllocInst( h, "SigGen", NULL, 2, 1000.0, sgShapeId );
  1513. cf[i] = cmDspSysAllocInst( h, "CombFilt", NULL, 5, cfBypassFl, cfMinHz, cfFbFl, cfHz, cfAlpha );
  1514. mtr[i] = cmDspSysAllocInst( h, "Meter",label, 3, 0.0, 0.0, 1.0 );
  1515. env[i] = cmDspSysAllocInst( h, "Adsr", NULL, 2, true, adsrMinLevel );
  1516. d2l[i] = cmDspSysAllocInst( h, "DbToLin", NULL, 0 );
  1517. add[i] = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "+", "in-0", 0.0, "in-1", 0.0);
  1518. mul[i] = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*", "in-0", 0.0, "in-1", 0.99);
  1519. eq[i] = cmDspSysAllocInst( h, "BiQuadEq", NULL, 5, eqBypassFl, eqModeSymId, eqF0hz, eqQ, eqFgain );
  1520. mt[i] = cmDspSysAllocInst( h, "MtDelay", NULL, 9, mtBypassFl, mtTimeScale, mtFeedback, 20.0, 0.8, 15.0, 0.9, 12.0, 0.9 );
  1521. }
  1522. // allocate the ch cfg last so that it's default outputs initialize connected objects
  1523. cmDspInst_t* chCfg = cmDspSysAllocInst( h, "ChCfg", NULL, 1, chCfgFn );
  1524. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL, 1, chCnt );
  1525. cmDspInst_t* ao0 = cmDspSysAllocAudioOut( h, 0, 1.0 );
  1526. cmDspInst_t* ao1 = cmDspSysAllocAudioOut( h, 1, 1.0 );
  1527. cmDspInst_t* alpha = cmDspSysAllocScalar( h, "alpha", -1.0, 1.0, 0.001, cfAlpha );
  1528. cmDspInst_t* decay = cmDspSysAllocScalar( h, "decay", -1.0, 1.0, 0.001, 0.5);
  1529. cmDspInst_t* zero = cmDspSysAllocScalar( h, "zero", 0.0, 0.0, 0.0, 0.0);
  1530. // cmDspInst_t* print = cmDspSysAllocButton( h, "print", 0 );
  1531. cmDspSysNewColumn(h,200);
  1532. cmDspInst_t* dly = cmDspSysAllocScalar( h, "Dly Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 0.0);
  1533. cmDspInst_t* atk = cmDspSysAllocScalar( h, "Atk Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 2000.0);
  1534. cmDspInst_t* dcy = cmDspSysAllocScalar( h, "Dcy Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 100.0);
  1535. cmDspInst_t* hold = cmDspSysAllocScalar( h, "Hold Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 100.0);
  1536. cmDspInst_t* rls = cmDspSysAllocScalar( h, "Rls Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 4000.0);
  1537. cmDspInst_t* alvl = cmDspSysAllocScalar( h, "AdsrMax", adsrMinLevel,adsrMaxLevel,adsrIncLevel, adsrMaxLevel);
  1538. cmDspInst_t* sus = cmDspSysAllocScalar( h, "Sustain", adsrMinLevel,adsrMaxLevel,adsrIncLevel, adsrSusLevel );
  1539. cmDspSysNewColumn(h,200);
  1540. cmDspInst_t* onThr = cmDspSysAllocScalar(h,"On Thresh",-100.0,0.0,0.1,-55.0);
  1541. cmDspInst_t* offThr = cmDspSysAllocScalar(h,"Off Thresh",-100.0,0.0,0.1,-80.0);
  1542. cmDspInst_t* eqbyp = cmDspSysAllocCheck( h, "Eq Byp", 0 );
  1543. cmDspInst_t* eqmode = cmDspSysAllocInst( h, "MsgList","Mode", 1, "biQuadEqMode");
  1544. cmDspInst_t* eqq = cmDspSysAllocScalar( h, "Q", -100.0, 100.0, 0.1, eqQ);
  1545. cmDspInst_t* eqfgn = cmDspSysAllocScalar( h, "Filt Gain", 0.0, 1.0, 0.1, eqFgain);
  1546. cmDspInst_t* mtfb = cmDspSysAllocScalar( h, "Mt Feedback", 0.0, 1.0, 0.01, mtFeedback);
  1547. cmDspInst_t* mtscale= cmDspSysAllocScalar( h, "Mt Time Scale", 0.01, 10.0, 0.01, mtTimeScale);
  1548. // check for allocation errors
  1549. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1550. goto errLabel;
  1551. cmDspSysConnectAudioN1N1( h, ain, "out", ef, "in", chCnt ); // ain -> EF
  1552. cmDspSysConnectAudioN1N1( h, sg, "out", cf, "in", chCnt ); // sg -> CF
  1553. cmDspSysConnectAudioN1N1( h, cf, "out", eq, "in", chCnt );
  1554. cmDspSysConnectAudioN1N1( h, eq, "out", mt, "in", chCnt );
  1555. cmDspSysConnectAudioN11N( h, mt, "out", mix, "in", chCnt ); // cf -> mix
  1556. cmDspSysConnectAudio( h, mix, "out", ao0, "in"); // mix -> aout L
  1557. cmDspSysConnectAudio( h, mix, "out", ao1, "in"); // mix -> aout R
  1558. cmDspSysInstallCb1NN1( h, chCfg, "gain", ain, "gain", chCnt ); // chCfg -> ain gain
  1559. cmDspSysInstallCb1NN1( h, chCfg, "hz", cf, "hz", chCnt ); // chCfg -> CF Hz
  1560. cmDspSysInstallCb1NN1( h, chCfg, "hz", eq, "f0", chCnt ); // chCfg -> Eq Hz
  1561. cmDspSysInstallCbN1N1( h, mul, "out", add, "in-1", chCnt ); // mul -> add
  1562. cmDspSysInstallCbN1N1( h, ef, "gate", env, "gate", chCnt ); // EF -> adsr (gate)
  1563. cmDspSysInstallCbN1N1( h, ef, "rms", env, "rms", chCnt ); // EF ->adsr (rms)
  1564. //cmDspSysInstallCb11N1( h, print, "out", env, "cmd", chCnt );
  1565. cmDspSysInstallCbN1N1( h, env, "out", d2l, "in", chCnt );
  1566. cmDspSysInstallCbN11N( h, d2l, "out", mix, "gain", chCnt );
  1567. cmDspSysInstallCbN1N1( h, add, "out", mul, "in-0", chCnt ); // add -> mul (feedback)
  1568. cmDspSysInstallCb11N1( h, decay, "val", mul, "in-1", chCnt ); // decay ctl
  1569. cmDspSysInstallCbN1N1( h, ef, "gate", mtr, "in", chCnt ); // EF -> meter RMS
  1570. cmDspSysInstallCb11N1( h, alpha, "val", cf, "alpha",chCnt ); // CF alpha
  1571. cmDspSysInstallCb111N( h, zero, "val", mix, "in", chCnt ); //
  1572. cmDspSysInstallCb11N1( h, dly, "val", env, "dly", chCnt );
  1573. cmDspSysInstallCb11N1( h, atk, "val", env, "atk", chCnt );
  1574. cmDspSysInstallCb11N1( h, dcy, "val", env, "dcy", chCnt );
  1575. cmDspSysInstallCb11N1( h, hold, "val", env, "hold", chCnt );
  1576. cmDspSysInstallCb11N1( h, rls, "val", env, "rls", chCnt );
  1577. cmDspSysInstallCb11N1( h, alvl, "val", env, "alvl", chCnt );
  1578. cmDspSysInstallCb11N1( h, sus, "val", env, "sus", chCnt );
  1579. cmDspSysInstallCb11N1( h, onThr, "val", ef, "ondb", chCnt ); //
  1580. cmDspSysInstallCb11N1( h, offThr, "val", ef, "offdb", chCnt ); //
  1581. cmDspSysInstallCb11N1( h, eqbyp, "out", eq, "bypass", chCnt );
  1582. cmDspSysInstallCb11N1( h, eqmode, "mode", eq, "mode", chCnt );
  1583. cmDspSysInstallCb11N1( h, eqq, "val", eq, "Q", chCnt );
  1584. cmDspSysInstallCb11N1( h, eqfgn, "val", eq, "gain", chCnt );
  1585. cmDspSysInstallCb11N1( h, mtfb, "val", mt, "fb", chCnt );
  1586. cmDspSysInstallCb11N1( h, mtscale, "val", mt, "scale", chCnt );
  1587. }
  1588. errLabel:
  1589. cmFsFreeFn(chCfgPath);
  1590. return rc;
  1591. }
  1592. //------------------------------------------------------------------------------
  1593. //)
  1594. //( { label:cmDspPgm_CombFilt file_desc:"Comb filter example program." kw:[spgm] }
  1595. cmDspRC_t _cmDspSysPgm_CombFilt( cmDspSysH_t h, void** userPtrPtr )
  1596. {
  1597. cmDspRC_t rc = kOkDspRC;
  1598. double cfMinHz = 20.0;
  1599. double cfAlpha = 0.9;
  1600. bool cfFbFl = true;
  1601. bool cfBypassFl= false;
  1602. unsigned sgShapeId = 2;
  1603. cmDspInst_t* ao = cmDspSysAllocAudioOut( h, 0, 1.0 );
  1604. cmDspInst_t* sg = cmDspSysAllocInst( h, "SigGen", NULL, 2, 1000.0, sgShapeId );
  1605. cmDspInst_t* cf = cmDspSysAllocInst( h, "CombFilt", NULL, 5, cfBypassFl, cfMinHz, cfFbFl, cfMinHz, cfAlpha );
  1606. cmDspInst_t* hz = cmDspSysAllocScalar( h, "Hz", 25, 10000, 1, 1000 );
  1607. cmDspInst_t* a = cmDspSysAllocScalar( h, "Alpha", 0.0, 2.0, 0.001, cfAlpha);
  1608. // check for allocation errors
  1609. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1610. goto errLabel;
  1611. cmDspSysConnectAudio(h, sg, "out", cf, "in");
  1612. cmDspSysConnectAudio(h, cf, "out", ao, "in");
  1613. cmDspSysInstallCb( h, hz, "val", cf, "hz", NULL);
  1614. cmDspSysInstallCb( h, a, "val", cf, "alpha", NULL);
  1615. errLabel:
  1616. return rc;
  1617. }
  1618. //------------------------------------------------------------------------------
  1619. //)
  1620. //( { label:cmDspPgm_ScalarOp file_desc:"Scalar operations example program." kw:[spgm] }
  1621. cmDspRC_t _cmDspSysPgm_ScalarOp( cmDspSysH_t h, void** userPtrPtr )
  1622. {
  1623. cmDspRC_t rc;
  1624. cmDspInst_t* add = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "+", "in-0", 0.0, "in-1", 0.0 );
  1625. cmDspInst_t* mul0 = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*$", "in-0", 0.0, "in-1", 0.0 );
  1626. cmDspInst_t* mul1 = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*", "in-0", 0.0, "in-1", 0.0 );
  1627. cmDspInst_t* in = cmDspSysAllocScalar( h, "Input", 0.0, 10.0, 0.001, 0.0);
  1628. cmDspInst_t* in_m = cmDspSysAllocScalar( h, "Input_M", 0.0, 10.0, 0.001, 0.0);
  1629. cmDspInst_t* fb = cmDspSysAllocScalar( h, "Feedback", 0.0, 10.0, 0.001, 0.0);
  1630. cmDspInst_t* fb_m = cmDspSysAllocScalar( h, "Feedback_M", 0.0, 10.0, 0.001, 0.0);
  1631. cmDspInst_t* out = cmDspSysAllocScalar( h, "Out", 0.0, 10.0, 0.001, 0.0);
  1632. // check for allocation errors
  1633. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1634. goto errLabel;
  1635. // Notice that changing 'in' or 'in_m' causes 'out' to be recomputed, but other
  1636. // changes are cached prior to 'add'. This prevents the program from going into
  1637. // an infinite loop.
  1638. //
  1639. // in -> mult0
  1640. // in_m -> mult0--+
  1641. // +-->fb -> mult1 +----> add
  1642. // | fb_m -> mult1-------> add --------+------> out
  1643. // | |
  1644. // +-------------------------------------+
  1645. //
  1646. cmDspSysInstallCb( h, in, "val", mul0, "in-0", NULL );
  1647. cmDspSysInstallCb( h, in_m, "val", mul0, "in-1", NULL );
  1648. cmDspSysInstallCb( h, fb, "val", mul1, "in-0", NULL );
  1649. cmDspSysInstallCb( h, fb_m, "val", mul1, "in-1", NULL );
  1650. cmDspSysInstallCb( h, mul0, "out", add, "in-0", NULL );
  1651. cmDspSysInstallCb( h, mul1, "out", add, "in-1", NULL );
  1652. cmDspSysInstallCb( h, add, "out", fb, "val", NULL );
  1653. cmDspSysInstallCb( h, add, "out", out, "val", NULL );
  1654. errLabel:
  1655. return rc;
  1656. }
  1657. //------------------------------------------------------------------------------
  1658. //)
  1659. //( { label:cmDspPgm_RingMod file_desc:"Ring modulation example program." kw:[spgm] }
  1660. cmDspRC_t _cmDspSysPgm_RingMod( cmDspSysH_t h, void** userPtrPtr )
  1661. {
  1662. cmDspRC_t rc = kOkDspRC;
  1663. cmErr_t err;
  1664. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  1665. unsigned chCnt = 0;
  1666. unsigned nsChCnt = 0;
  1667. const cmChar_t* chCfgPath = NULL;
  1668. const cmChar_t* chCfgFn = "pick_chs8.js";
  1669. unsigned groupCnt = 3;
  1670. unsigned chsPerGroup = 2;
  1671. cmReal_t fadeTimeMs = 25;
  1672. unsigned i,j,k;
  1673. cmErrSetup(&err,&cmCtx->rpt,"Pickup Effects");
  1674. // prepend the prefs directory to the ch. cfg filename
  1675. chCfgPath = cmFsMakeFn(cmFsPrefsDir(),chCfgFn,NULL,NULL);
  1676. // get the count of channels from the ch. cfg. array
  1677. if(( chCnt = cmChCfgChannelCount(cmCtx,chCfgFn,&nsChCnt)) == 0 )
  1678. {
  1679. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"Unable to obtain the channel count from '%s'.",cmStringNullGuard(chCfgFn));
  1680. goto errLabel;
  1681. }
  1682. if( rc == kOkDspRC )
  1683. {
  1684. cmDspInst_t* ain[chCnt];
  1685. cmDspInst_t* ef[chCnt];
  1686. cmDspInst_t* mtr[chCnt];
  1687. cmDspInst_t* nom[groupCnt];
  1688. cmDspInst_t* rm[groupCnt];
  1689. cmDspInst_t* nm_mtr[groupCnt*chsPerGroup];
  1690. unsigned labelCharCnt = 31;
  1691. cmChar_t label[labelCharCnt+1];
  1692. // allocate the audio inputs and envelope followers
  1693. for(i=0; i<chCnt; ++i)
  1694. {
  1695. snprintf(label,labelCharCnt,"%i",i);
  1696. ain[i] = cmDspSysAllocAudioIn( h, i, 1.0);
  1697. ef[i] = cmDspSysAllocInst( h, "EnvFollow", NULL, 0 );
  1698. mtr[i] = cmDspSysAllocInst( h, "Meter", label, 3, 0.0, 0.0, 1.0 );
  1699. }
  1700. cmDspInst_t* gs = cmDspSysAllocInst( h, "GroupSel", NULL, 3, chCnt, groupCnt, chsPerGroup );
  1701. for(i=0; i<groupCnt; ++i)
  1702. {
  1703. nom[i] = cmDspSysAllocInst(h, "AudioNofM", NULL, 3, chCnt, chsPerGroup, fadeTimeMs );
  1704. rm[i] = cmDspSysAllocInst(h, "RingMod", NULL, 1, chsPerGroup );
  1705. }
  1706. for(i=0,k=0; i<groupCnt; ++i)
  1707. {
  1708. cmDspSysNewColumn(h,50);
  1709. snprintf(label,labelCharCnt,"%i",i);
  1710. cmDspSysAllocLabel(h,label,kLeftAlignDuiId );
  1711. for(j=0; j<chsPerGroup; ++j,++k)
  1712. {
  1713. snprintf(label,labelCharCnt,"%i",j);
  1714. nm_mtr[k] = cmDspSysAllocInst(h, "Meter", label, 3, 0.0, 0.0, 1.0 );
  1715. }
  1716. }
  1717. assert(k==groupCnt*chsPerGroup);
  1718. // allocate the ch cfg last so that it's default outputs initialize connected objects
  1719. //cmDspInst_t* chCfg = cmDspSysAllocInst( h, "ChCfg", NULL, 1, chCfgFn );
  1720. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL, 1, groupCnt );
  1721. cmDspInst_t* ao0 = cmDspSysAllocAudioOut( h, 0, 1.0 );
  1722. cmDspInst_t* ao1 = cmDspSysAllocAudioOut( h, 1, 1.0 );
  1723. // check for allocation errors
  1724. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1725. goto errLabel;
  1726. cmDspSysConnectAudioN1N1( h, ain, "out", ef, "in", chCnt ); // ain -> EF
  1727. for(i=0; i<groupCnt; ++i)
  1728. {
  1729. cmDspSysConnectAudioN11N( h, ain, "out", nom[i], "in", chCnt );
  1730. cmDspSysConnectAudio1N1N( h, nom[i], "out", rm[i], "in", chsPerGroup);
  1731. snprintf(label,labelCharCnt,"gate-%i",i);
  1732. cmDspSysInstallCb1N1N( h, gs, label, nom[i], "gate", chCnt );
  1733. cmDspSysInstallCb1NN1( h, nom[i], "gain", nm_mtr + i * chsPerGroup, "in", chsPerGroup);
  1734. }
  1735. cmDspSysConnectAudioN11N( h, rm, "out", mix, "in", groupCnt );
  1736. cmDspSysConnectAudio( h, mix, "out", ao0, "in"); // mix -> aout L
  1737. cmDspSysConnectAudio( h, mix, "out", ao1, "in"); // mix -> aout R
  1738. cmDspSysInstallCbN11N( h, ef, "gate", gs, "gate", chCnt ); // EF -> grp_sel gate
  1739. cmDspSysInstallCbN11N( h, ef, "rms", gs, "rms", chCnt ); // EF -> grp_sel RMS
  1740. cmDspSysInstallCbN1N1( h, ef, "gate", mtr, "in", chCnt );
  1741. }
  1742. errLabel:
  1743. cmFsFreeFn(chCfgPath);
  1744. return rc;
  1745. }
  1746. //------------------------------------------------------------------------------
  1747. //)
  1748. //( { label:cmDspPgm_RingMod2 file_desc:"Ring modulation example program." kw:[spgm] }
  1749. cmDspRC_t _cmDspSysPgm_RingMod2( cmDspSysH_t h, void** userPtrPtr )
  1750. {
  1751. cmDspRC_t rc = kOkDspRC;
  1752. cmErr_t err;
  1753. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  1754. unsigned iChCnt = 0;
  1755. unsigned oChCnt = 0;
  1756. unsigned nsChCnt = 0;
  1757. const cmChar_t* chCfgPath = NULL;
  1758. const cmChar_t* chCfgFn = "pick_chs8.js";
  1759. unsigned i;
  1760. cmErrSetup(&err,&cmCtx->rpt,"Pickup Effects");
  1761. // prepend the prefs directory to the ch. cfg filename
  1762. chCfgPath = cmFsMakeFn(cmFsPrefsDir(),chCfgFn,NULL,NULL);
  1763. // get the count of channels from the ch. cfg. array
  1764. if(( iChCnt = cmChCfgChannelCount(cmCtx,chCfgFn,&nsChCnt)) == 0 )
  1765. {
  1766. rc = cmErrMsg(&err,kPgmCfgFailDspRC,"Unable to obtain the channel count from '%s'.",cmStringNullGuard(chCfgFn));
  1767. goto errLabel;
  1768. }
  1769. if( rc == kOkDspRC && iChCnt > 0 )
  1770. {
  1771. if( iChCnt % 2 )
  1772. iChCnt -= 1;
  1773. oChCnt = iChCnt/2;
  1774. cmDspInst_t* ain[iChCnt];
  1775. cmDspInst_t* ef[iChCnt];
  1776. cmDspInst_t* mtr[iChCnt];
  1777. cmDspInst_t* rm[oChCnt];
  1778. unsigned labelCharCnt = 31;
  1779. cmChar_t label[labelCharCnt+1];
  1780. // allocate the audio inputs and envelope followers
  1781. for(i=0; i<iChCnt; ++i)
  1782. {
  1783. snprintf(label,labelCharCnt,"%i",i);
  1784. ain[i] = cmDspSysAllocAudioIn( h, i, 1.0);
  1785. ef[i] = cmDspSysAllocInst( h, "EnvFollow", NULL, 0 );
  1786. mtr[i] = cmDspSysAllocInst( h, "Meter", label, 3, 0.0, 0.0, 1.0 );
  1787. }
  1788. for(i=0; i<oChCnt; ++i)
  1789. {
  1790. rm[i] = cmDspSysAllocInst( h, "RingMod", NULL, 1, 2 );
  1791. }
  1792. cmDspInst_t* gain = cmDspSysAllocScalar( h, "RM Gain", 0.0, 10.0, 0.001, 1.0);
  1793. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL, 1, oChCnt );
  1794. cmDspInst_t* ao0 = cmDspSysAllocAudioOut( h, 0, 1.0 );
  1795. cmDspInst_t* ao1 = cmDspSysAllocAudioOut( h, 1, 1.0 );
  1796. // check for allocation errors
  1797. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1798. goto errLabel;
  1799. cmDspSysConnectAudioN1N1( h, ain, "out", ef, "in", iChCnt ); // ain -> EF
  1800. cmDspSysInstallCbN1N1( h, ef, "gate", mtr, "in", iChCnt ); // EF -> mtr (gate)
  1801. for(i=0; i<oChCnt; ++i)
  1802. {
  1803. cmDspSysConnectAudio( h, ain[i*2+0], "out", rm[i], "in-0"); // ain -> rm 0
  1804. cmDspSysConnectAudio( h, ain[i*2+1], "out", rm[i], "in-1"); // ain -> rm 1
  1805. snprintf(label,labelCharCnt,"in-%i",i);
  1806. cmDspSysConnectAudio( h, rm[i], "out", mix, label); // rm -> mix
  1807. cmDspSysInstallCb(h, gain, "val", rm[i], "gain", NULL ); // gain -> rm gain
  1808. }
  1809. cmDspSysConnectAudio( h, mix, "out", ao0, "in"); // mix -> aout L
  1810. cmDspSysConnectAudio( h, mix, "out", ao1, "in"); // mix -> aout R
  1811. }
  1812. errLabel:
  1813. cmFsFreeFn(chCfgPath);
  1814. return rc;
  1815. }
  1816. //------------------------------------------------------------------------------
  1817. //)
  1818. //( { label:cmDspPgm_MsgDelay file_desc:"Message delay example program." kw:[spgm] }
  1819. cmDspRC_t _cmDspSysPgm_MsgDelay( cmDspSysH_t h, void** userPtrPtr )
  1820. {
  1821. cmDspRC_t rc = kOkDspRC;
  1822. double dfltDelayTimeMs = 100.0;
  1823. double maxDelayTimeMs = 10000.0;
  1824. cmDspInst_t* ctl = cmDspSysAllocScalar( h, "Delay", 0.0, maxDelayTimeMs, 1.0, dfltDelayTimeMs );
  1825. cmDspInst_t* dly = cmDspSysAllocInst( h, "MsgDelay", NULL, 2, 1000, dfltDelayTimeMs );
  1826. cmDspInst_t* print = cmDspSysAllocInst( h, "Printer", NULL, 1, ">");
  1827. if( (rc = cmDspSysLastRC(h)) != kOkDspRC )
  1828. return rc;
  1829. cmDspSysInstallCb( h, ctl, "val", dly, "delay", NULL );
  1830. cmDspSysInstallCb( h, ctl, "val", dly, "in", NULL );
  1831. cmDspSysInstallCb( h, dly, "out", print, "in", NULL );
  1832. return rc;
  1833. }
  1834. //------------------------------------------------------------------------------
  1835. //)
  1836. //( { label:cmDspPgm_Adsr file_desc:"ADSR envelope generator example program." kw:[spgm] }
  1837. cmDspRC_t _cmDspSysPgm_Adsr( cmDspSysH_t h, void** userPtrPtr )
  1838. {
  1839. cmDspRC_t rc;
  1840. bool trigModeFl = true;
  1841. double adsrMaxMs = 5000;
  1842. double adsrMinMs = 0;
  1843. double adsrIncMs = 1;
  1844. double adsrMaxLevel = 100.0; //1.0;
  1845. double adsrSusLevel = 80.0; //0.8;
  1846. double adsrMinLevel = 0.0; //0.0;
  1847. double adsrIncLevel = 0.001;
  1848. const cmChar_t* fn = "/home/kevin/temp/adsr1.bin";
  1849. cmDspInst_t* adsr = cmDspSysAllocInst(h, "Adsr", NULL, 2, trigModeFl, adsrMinLevel );
  1850. cmDspInst_t* chck = cmDspSysAllocCheck(h,"Gate",0);
  1851. cmDspInst_t* mtr = cmDspSysAllocInst(h,"Meter","Out", 3, adsrMinLevel, adsrMinLevel, adsrMaxLevel );
  1852. cmDspInst_t* bmf = cmDspSysAllocInst(h,"BinMtxFile", NULL, 2, 1, fn );
  1853. cmDspInst_t* dly = cmDspSysAllocScalar( h, "Dly Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 0.0);
  1854. cmDspInst_t* atk = cmDspSysAllocScalar( h, "Atk Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 1000.0);
  1855. cmDspInst_t* dcy = cmDspSysAllocScalar( h, "Dcy Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 300.0);
  1856. cmDspInst_t* hold = cmDspSysAllocScalar( h, "Hold Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 500.0);
  1857. cmDspInst_t* rls = cmDspSysAllocScalar( h, "Rls Ms", adsrMinMs, adsrMaxMs, adsrIncMs, 1000.0);
  1858. cmDspInst_t* alvl = cmDspSysAllocScalar( h, "AdsrMax", adsrMinLevel,adsrMaxLevel,adsrIncLevel, adsrMaxLevel);
  1859. cmDspInst_t* sus = cmDspSysAllocScalar( h, "Sustain", adsrMinLevel,adsrMaxLevel,adsrIncLevel, adsrSusLevel);
  1860. // check for allocation errors
  1861. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1862. goto errLabel;
  1863. cmDspSysInstallCb( h, dly, "val", adsr, "dly", NULL );
  1864. cmDspSysInstallCb( h, atk, "val", adsr, "atk", NULL );
  1865. cmDspSysInstallCb( h, dcy, "val", adsr, "dcy", NULL );
  1866. cmDspSysInstallCb( h, hold, "val", adsr, "hold", NULL );
  1867. cmDspSysInstallCb( h, rls, "val", adsr, "rls", NULL );
  1868. cmDspSysInstallCb( h, alvl, "val", adsr, "alvl", NULL );
  1869. cmDspSysInstallCb( h, sus, "val", adsr, "sus", NULL );
  1870. cmDspSysInstallCb( h, chck, "out", adsr, "gate", NULL );
  1871. cmDspSysInstallCb( h, adsr, "out", mtr, "in", NULL );
  1872. cmDspSysInstallCb( h, adsr, "out", bmf, "in", NULL );
  1873. errLabel:
  1874. return rc;
  1875. }
  1876. //------------------------------------------------------------------------------
  1877. //)
  1878. //( { label:cmDspPgm_Adsr file_desc:"Dynamics compressor example program." kw:[spgm] }
  1879. cmDspRC_t _cmDspSysPgm_Compressor( cmDspSysH_t h, void** userPtrPtr )
  1880. {
  1881. cmDspRC_t rc;
  1882. const cmChar_t* ofn = "/home/kevin/temp/adsr0.bin";
  1883. const char* afn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  1884. int beg = 6900826;
  1885. int end = 13512262;
  1886. const cmChar_t* afn = cmFsMakeFn(cmFsUserDir(),afn0,NULL,NULL );
  1887. bool bypassFl = false;
  1888. double inGain = 1.0;
  1889. double threshDb = -40.0;
  1890. double ratio_num = 4.0;
  1891. double atkMs = 100.0;
  1892. double rlsMs = 100.0;
  1893. double makeup = 1.0;
  1894. double wndMaxMs = 1000.0;
  1895. double wndMs = 200.0;
  1896. cmDspInst_t* off = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  1897. cmDspInst_t* phs = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  1898. cmDspInst_t* wt = cmDspSysAllocInst(h,"WaveTable",NULL, 6, ((int)cmDspSysSampleRate(h)), 1, afn, -1, beg, end );
  1899. cmDspInst_t* cmp = cmDspSysAllocInst(h,"Compressor",NULL, 8, bypassFl, threshDb, ratio_num, atkMs, rlsMs, makeup, wndMs, wndMaxMs );
  1900. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 0 );
  1901. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 1 );
  1902. cmDspInst_t* bmf = cmDspSysAllocInst(h,"BinMtxFile", NULL, 2, 1, ofn );
  1903. cmDspInst_t* mtr = cmDspSysAllocInst(h,"Meter","Env", 3, 0.0, 0.0, 1.0);
  1904. cmDspInst_t* igain = cmDspSysAllocScalar( h, "In Gain", 0.0, 10.0, 0.1, inGain);
  1905. cmDspInst_t* thr = cmDspSysAllocScalar( h, "ThreshDb", -100.0, 0.0, 0.1, threshDb);
  1906. cmDspInst_t* rat = cmDspSysAllocScalar( h, "Ratio", 0.1, 100, 0.1, ratio_num);
  1907. cmDspInst_t* atk = cmDspSysAllocScalar( h, "Atk Ms", 0.0, 1000.0, 0.1, atkMs);
  1908. cmDspInst_t* rls = cmDspSysAllocScalar( h, "Rls Ms", 0.0, 1000.0, 0.1, rlsMs);
  1909. cmDspInst_t* mkup = cmDspSysAllocScalar( h, "Makeup", 0.0, 10.0, 0.01, makeup);
  1910. cmDspInst_t* wnd = cmDspSysAllocScalar( h, "Wnd Ms", 1.0, wndMaxMs, 1.0, wndMs );
  1911. // check for allocation errors
  1912. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1913. goto errLabel;
  1914. cmDspSysConnectAudio(h, phs, "out", wt, "phs" ); // phasor -> wave table
  1915. cmDspSysConnectAudio(h, wt, "out", cmp, "in" ); // wave table -> cmp in
  1916. cmDspSysConnectAudio(h, cmp, "out", ao0, "in" ); // comp -> aout
  1917. cmDspSysConnectAudio(h, cmp, "out", ao1, "in" ); //
  1918. cmDspSysInstallCb(h, off, "val", wt, "beg", NULL );
  1919. cmDspSysInstallCb(h, igain,"val", cmp, "igain", NULL );
  1920. cmDspSysInstallCb(h, thr, "val", cmp, "thr", NULL );
  1921. cmDspSysInstallCb(h, rat, "val", cmp, "ratio", NULL );
  1922. cmDspSysInstallCb(h, atk, "val", cmp, "atk", NULL );
  1923. cmDspSysInstallCb(h, rls, "val", cmp, "rls", NULL );
  1924. cmDspSysInstallCb(h, mkup, "val", cmp, "ogain", NULL );
  1925. cmDspSysInstallCb(h, wnd, "val", cmp, "wnd", NULL );
  1926. cmDspSysInstallCb(h, cmp, "env", bmf, "in", NULL );
  1927. cmDspSysInstallCb(h, cmp, "env", mtr, "in", NULL );
  1928. errLabel:
  1929. return rc;
  1930. }
  1931. //------------------------------------------------------------------------------
  1932. //)
  1933. //( { label:cmDspPgm_BiQuadEq file_desc:"Biquad EQ example program." kw:[spgm] }
  1934. cmDspRC_t _cmDspSysPgm_BiQuadEq( cmDspSysH_t h, void** userPtrPtr )
  1935. {
  1936. cmDspRC_t rc = kOkDspRC;
  1937. const char* afn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  1938. int beg = 6900826;
  1939. int end = 13512262;
  1940. const cmChar_t* afn = cmFsMakeFn(cmFsUserDir(),afn0,NULL,NULL );
  1941. bool bypassFl = false;
  1942. unsigned modeSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"LP");
  1943. double f0hz = 264.0;
  1944. double Q = 1.0;
  1945. double fgain = 1.0;
  1946. cmDspInst_t* off = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  1947. cmDspInst_t* phs = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  1948. cmDspInst_t* wt = cmDspSysAllocInst(h,"WaveTable",NULL, 6, ((int)cmDspSysSampleRate(h)), 1, afn, -1, beg, end );
  1949. cmDspInst_t* flt = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, bypassFl, modeSymId,f0hz, Q, fgain );
  1950. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 0 );
  1951. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 1 );
  1952. cmDspInst_t* mode = cmDspSysAllocInst( h, "MsgList","Mode", 1, "biQuadEqMode");
  1953. cmDspInst_t* fhz = cmDspSysAllocScalar( h, "Fc Hz", 0.0, 15000.0, 0.1, f0hz);
  1954. cmDspInst_t* q = cmDspSysAllocScalar( h, "Q", -100.0, 100, 0.1, Q);
  1955. cmDspInst_t* fgn = cmDspSysAllocScalar( h, "Filt Gain", 0.0, 1.0, 0.1, fgain);
  1956. // check for allocation errors
  1957. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  1958. goto errLabel;
  1959. cmDspSysConnectAudio(h, phs, "out", wt, "phs" ); // phasor -> wave table
  1960. cmDspSysConnectAudio(h, wt, "out", flt, "in" ); // wave table -> cmp in
  1961. cmDspSysConnectAudio(h, flt, "out", ao0, "in" ); // filter -> aout
  1962. cmDspSysConnectAudio(h, flt, "out", ao1, "in" ); //
  1963. cmDspSysInstallCb(h, off, "val", wt, "beg", NULL );
  1964. cmDspSysInstallCb(h, mode,"mode",flt, "mode", NULL );
  1965. cmDspSysInstallCb(h, fhz, "val", flt, "f0", NULL );
  1966. cmDspSysInstallCb(h, q, "val", flt, "Q", NULL );
  1967. cmDspSysInstallCb(h, fgn, "val", flt, "gain", NULL );
  1968. errLabel:
  1969. return rc;
  1970. }
  1971. //------------------------------------------------------------------------------
  1972. //)
  1973. //( { label:cmDspPgm_DistDs file_desc:"Guitar distortion example program." kw:[spgm] }
  1974. cmDspRC_t _cmDspSysPgm_DistDs( cmDspSysH_t h, void** userPtrPtr )
  1975. {
  1976. cmDspRC_t rc = kOkDspRC;
  1977. const char* afn0 = "media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  1978. int beg = 6900826;
  1979. int end = 13512262;
  1980. const cmChar_t* afn = cmFsMakeFn(cmFsUserDir(),afn0,NULL,NULL );
  1981. bool bypassFl = false;
  1982. double inGain = 1.0;
  1983. double dsrate = 44100.0;
  1984. double bits = 24.0;
  1985. bool rectifyFl = false;
  1986. bool fullRectFl = false;
  1987. double clipDb = -10.0;
  1988. cmDspInst_t* off = cmDspSysAllocInst(h,"Scalar", "Offset", 5, kNumberDuiId, 0.0, cmDspSysSampleRate(h)*600.0, 1.0, 0.0);
  1989. cmDspInst_t* phs = cmDspSysAllocInst(h,"Phasor", NULL, 0 );
  1990. cmDspInst_t* wt = cmDspSysAllocInst(h,"WaveTable",NULL, 6, ((int)cmDspSysSampleRate(h)), 1, afn, -1, beg, end );
  1991. cmDspInst_t* dst = cmDspSysAllocInst(h,"DistDs",NULL, 3, bypassFl, inGain, dsrate, bits );
  1992. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 0 );
  1993. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 1 );
  1994. cmDspInst_t* ign = cmDspSysAllocScalar( h, "In Gain", 0.0, 10.0, 0.01, 1.0);
  1995. cmDspInst_t* rct = cmDspSysAllocCheck( h, "Rectify", rectifyFl);
  1996. cmDspInst_t* ful = cmDspSysAllocCheck( h, "Full/Half", fullRectFl);
  1997. cmDspInst_t* dsr = cmDspSysAllocScalar( h, "Srate", 0.0, 96000, 1.0, dsrate);
  1998. cmDspInst_t* dbt = cmDspSysAllocScalar( h, "bits", 2.0, 32.0, 1.0, bits);
  1999. cmDspInst_t* clip = cmDspSysAllocScalar( h, "Clip dB", -100.0, 0.0, 0.1, clipDb);
  2000. cmDspInst_t* ogn = cmDspSysAllocScalar( h, "Out Gain", 0.0, 10.0, 0.01, 1.0);
  2001. // check for allocation errors
  2002. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2003. goto errLabel;
  2004. cmDspSysConnectAudio(h, phs, "out", wt, "phs" ); // phasor -> wave table
  2005. cmDspSysConnectAudio(h, wt, "out", dst, "in" ); // wave table -> cmp in
  2006. cmDspSysConnectAudio(h, dst, "out", ao0, "in" ); // filter -> aout
  2007. cmDspSysConnectAudio(h, dst, "out", ao1, "in" ); //
  2008. cmDspSysInstallCb(h, off, "val", wt, "beg", NULL );
  2009. cmDspSysInstallCb(h, ign, "val", dst, "igain", NULL );
  2010. cmDspSysInstallCb(h, dsr, "val", dst, "srate", NULL );
  2011. cmDspSysInstallCb(h, dbt, "val", dst, "bits", NULL );
  2012. cmDspSysInstallCb(h, rct, "out", dst, "rect", NULL );
  2013. cmDspSysInstallCb(h, ful, "out", dst, "full", NULL );
  2014. cmDspSysInstallCb(h, clip, "val", dst, "clip", NULL );
  2015. cmDspSysInstallCb(h, ogn, "val", dst, "ogain", NULL );
  2016. errLabel:
  2017. return rc;
  2018. }
  2019. //------------------------------------------------------------------------------
  2020. //)
  2021. //( { label:cmDspPgm_Seq file_desc:"Message list 'seq' mode example program." kw:[spgm] }
  2022. cmDspRC_t _cmDspSysPgm_Seq( cmDspSysH_t h, void** userPtrPtr )
  2023. {
  2024. cmDspRC_t rc;
  2025. double min = 1.0;
  2026. double max = 10.0;
  2027. double incr = 1.0;
  2028. cmDspInst_t* btn = cmDspSysAllocButton( h, "smack", 0);
  2029. cmDspInst_t* cnt = cmDspSysAllocInst( h, "Counter", NULL, 3, min, max, incr );
  2030. cmDspInst_t* lst = cmDspSysAllocInst( h, "MsgList","Seq", 1, "seqTest");
  2031. cmDspInst_t* prt = cmDspSysAllocInst( h, "Printer", NULL, 1, ">");
  2032. cmDspSysInstallCb(h, lst, "cnt", cnt, "max", NULL );
  2033. cmDspSysInstallCb(h, btn, "out", cnt, "next", NULL );
  2034. cmDspSysInstallCb(h, cnt, "out", lst, "sel", NULL );
  2035. cmDspSysInstallCb(h, lst, "midi", prt, "in", NULL );
  2036. // check for allocation errors
  2037. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2038. goto errLabel;
  2039. errLabel:
  2040. return rc;
  2041. }
  2042. //------------------------------------------------------------------------------
  2043. //)
  2044. //( { label:cmDspPgm_ThunkNet file_desc:"UDP network receiver example program." kw:[spgm] }
  2045. cmDspRC_t _cmDspSysPgm_ThunkNet( cmDspSysH_t h, void** userPtrPtr )
  2046. {
  2047. cmDspRC_t rc;
  2048. cmDspInst_t* add = cmDspSysAllocInst( h, "ScalarOp", "adder-0", 6, 2, "+", "in-0", 0.0, "in-1", 0.0 );
  2049. cmDspInst_t* in = cmDspSysAllocScalar( h, "Input", 0.0, 10.0, 0.001, 0.0);
  2050. cmDspInst_t* out = cmDspSysAllocScalar( h, "Out", 0.0, 10.0, 0.001, 0.0);
  2051. // check for allocation errors
  2052. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2053. goto errLabel;
  2054. cmDspSysInstallCb( h, in, "val", add, "in-1", NULL );
  2055. cmDspSysInstallCb( h, add, "out", out, "val", NULL );
  2056. errLabel:
  2057. return rc;
  2058. }
  2059. //------------------------------------------------------------------------------
  2060. //)
  2061. //( { label:cmDspPgm_WhirlNet file_desc:"UDP network sender example program." kw:[spgm] }
  2062. cmDspRC_t _cmDspSysPgm_WhirlNet( cmDspSysH_t h, void** userPtrPtr )
  2063. {
  2064. cmDspRC_t rc;
  2065. cmDspInst_t* in = cmDspSysAllocScalar( h, "Input", 0.0, 10.0, 0.001, 0.0);
  2066. // check for allocation errors
  2067. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2068. goto errLabel;
  2069. cmDspSysInstallNetCb( h, in, "val", "thunk", "adder-0", "in-0" );
  2070. errLabel:
  2071. return rc;
  2072. }
  2073. //------------------------------------------------------------------------------
  2074. //)
  2075. //( { label:cmDspPgm_NofM file_desc:"Select NofM example program." kw:[spgm] }
  2076. cmDspRC_t _cmDspSysPgm_NofM( cmDspSysH_t h, void** userPtrPtr )
  2077. {
  2078. cmDspRC_t rc;
  2079. unsigned iChCnt = 3;
  2080. unsigned oChCnt = 2;
  2081. unsigned sgShapeId = 0;
  2082. double sgGain = 0.4;
  2083. double xfadeMs = 1000;
  2084. cmDspInst_t* onBtn = cmDspSysAllocButton( h, "on", 0 );
  2085. cmDspInst_t* offBtn = cmDspSysAllocButton(h, "off", 0 );
  2086. cmDspInst_t* sg0 = cmDspSysAllocInst( h, "SigGen", NULL, 3, 500.0, sgShapeId, sgGain );
  2087. cmDspInst_t* sg1 = cmDspSysAllocInst( h, "SigGen", NULL, 3, 1000.0, sgShapeId, sgGain );
  2088. cmDspInst_t* sg2 = cmDspSysAllocInst( h, "SigGen", NULL, 3, 2000.0, sgShapeId, sgGain );
  2089. cmDspInst_t* nom = cmDspSysAllocInst( h,"NofM", NULL, 3, iChCnt, oChCnt, xfadeMs );
  2090. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL, 1, oChCnt );
  2091. cmDspInst_t* ao = cmDspSysAllocAudioOut(h, 0, 1.0 );
  2092. cmDspInst_t* btn = cmDspSysAllocButton( h, "cfg", 0);
  2093. cmDspInst_t* sel0 = cmDspSysAllocCheck(h,"Sel-0",0);
  2094. cmDspInst_t* sel1 = cmDspSysAllocCheck(h,"Sel-1",0);
  2095. cmDspInst_t* sel2 = cmDspSysAllocCheck(h,"Sel-2",0);
  2096. cmDspInst_t* in0 = cmDspSysAllocScalar( h, "In-0", 0.0, 10.0, 0.001, 0.0);
  2097. cmDspInst_t* in1 = cmDspSysAllocScalar( h, "In-1", 0.0, 10.0, 0.001, 0.0);
  2098. cmDspInst_t* in2 = cmDspSysAllocScalar( h, "In-2", 0.0, 10.0, 0.001, 0.0);
  2099. cmDspInst_t* out0 = cmDspSysAllocScalar( h, "Out-0", 0.0, 10.0, 0.001, 0.0);
  2100. cmDspInst_t* out1 = cmDspSysAllocScalar( h, "Out-1", 0.0, 10.0, 0.001, 0.0);
  2101. // check for allocation errors
  2102. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2103. goto errLabel;
  2104. cmDspSysConnectAudio( h, sg0, "out", nom, "a-in-0" );
  2105. cmDspSysConnectAudio( h, sg1, "out", nom, "a-in-1" );
  2106. cmDspSysConnectAudio( h, sg2, "out", nom, "a-in-2" );
  2107. cmDspSysConnectAudio( h, nom, "a-out-0", mix, "in-0" );
  2108. cmDspSysConnectAudio( h, nom, "a-out-1", mix, "in-1" );
  2109. cmDspSysConnectAudio( h, mix, "out", ao, "in" );
  2110. cmDspSysInstallCb( h, btn, "sym", nom, "cmd", NULL );
  2111. cmDspSysInstallCb( h, sel0, "out", nom, "sel-0", NULL );
  2112. cmDspSysInstallCb( h, sel1, "out", nom, "sel-1", NULL );
  2113. cmDspSysInstallCb( h, sel2, "out", nom, "sel-2", NULL );
  2114. cmDspSysInstallCb( h, in0, "val", nom, "f-in-0", NULL );
  2115. cmDspSysInstallCb( h, in1, "val", nom, "f-in-1", NULL );
  2116. cmDspSysInstallCb( h, in2, "val", nom, "f-in-2", NULL );
  2117. cmDspSysInstallCb( h, nom, "f-out-0", out0, "val", NULL );
  2118. cmDspSysInstallCb( h, nom, "f-out-1", out1, "val", NULL );
  2119. cmDspSysInstallCb( h, onBtn, "sym", nom, "cmd", NULL );
  2120. cmDspSysInstallCb( h, offBtn, "sym", nom, "cmd", NULL );
  2121. errLabel:
  2122. return rc;
  2123. }
  2124. //------------------------------------------------------------------------------
  2125. //)
  2126. //( { label:cmDspPgm_1ofM file_desc:"Select 1 of N example program." kw:[spgm] }
  2127. cmDspRC_t _cmDspSysPgm_1ofN( cmDspSysH_t h, void** userPtrPtr )
  2128. {
  2129. cmDspRC_t rc;
  2130. unsigned inCnt = 3;
  2131. unsigned initSel = 0;
  2132. cmDspInst_t* oom = cmDspSysAllocInst(h,"1ofN", NULL, 2, inCnt, initSel );
  2133. cmDspInst_t* sel = cmDspSysAllocScalar( h, "Sel", 0, inCnt-1, 0.001, 0.0);
  2134. cmDspInst_t* in0 = cmDspSysAllocScalar( h, "In-0", 0.0, 10.0, 0.001, 0.0);
  2135. cmDspInst_t* in1 = cmDspSysAllocScalar( h, "In-1", 0.0, 10.0, 0.001, 0.0);
  2136. cmDspInst_t* in2 = cmDspSysAllocScalar( h, "In-2", 0.0, 10.0, 0.001, 0.0);
  2137. cmDspInst_t* out = cmDspSysAllocScalar( h, "Out", 0.0, 10.0, 0.001, 0.0);
  2138. // check for allocation errors
  2139. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2140. goto errLabel;
  2141. cmDspSysInstallCb( h, sel, "val", oom, "chidx", NULL );
  2142. cmDspSysInstallCb( h, in0, "val", oom, "f-in-0", NULL );
  2143. cmDspSysInstallCb( h, in1, "val", oom, "f-in-1", NULL );
  2144. cmDspSysInstallCb( h, in2, "val", oom, "f-in-2", NULL );
  2145. cmDspSysInstallCb( h, oom, "f-out", out, "val", NULL );
  2146. errLabel:
  2147. return rc;
  2148. }
  2149. //------------------------------------------------------------------------------
  2150. //)
  2151. //( { label:cmDspPgm_Router file_desc:"Router example program." kw:[spgm] }
  2152. cmDspRC_t _cmDspSysPgm_Router( cmDspSysH_t h, void** userPtrPtr )
  2153. {
  2154. cmDspRC_t rc;
  2155. unsigned inCnt = 3;
  2156. unsigned initSel = 0;
  2157. cmDspInst_t* rtr = cmDspSysAllocInst(h,"Router", NULL, 2, inCnt, initSel );
  2158. cmDspInst_t* sel = cmDspSysAllocScalar( h, "Sel", 0, inCnt-1, 1.0, 0.0);
  2159. cmDspInst_t* in = cmDspSysAllocScalar( h, "In", 0.0, 10.0, 0.001, 0.0);
  2160. cmDspInst_t* out0 = cmDspSysAllocScalar( h, "Out-0", 0.0, 10.0, 0.001, 0.0);
  2161. cmDspInst_t* out1 = cmDspSysAllocScalar( h, "Out-1", 0.0, 10.0, 0.001, 0.0);
  2162. cmDspInst_t* out2 = cmDspSysAllocScalar( h, "Out-2", 0.0, 10.0, 0.001, 0.0);
  2163. // check for allocation errors
  2164. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2165. goto errLabel;
  2166. cmDspSysInstallCb( h, sel, "val", rtr, "sel", NULL );
  2167. cmDspSysInstallCb( h, in, "val", rtr, "f-in", NULL );
  2168. cmDspSysInstallCb( h, rtr, "f-out-0", out0, "val", NULL );
  2169. cmDspSysInstallCb( h, rtr, "f-out-1", out1, "val", NULL );
  2170. cmDspSysInstallCb( h, rtr, "f-out-2", out2, "val", NULL );
  2171. errLabel:
  2172. return rc;
  2173. }
  2174. //------------------------------------------------------------------------------
  2175. //)
  2176. //( { label:cmDspPgm_Preset file_desc:"Preset save/restore example program." kw:[spgm] }
  2177. cmDspRC_t _cmDspSysPgm_Preset( cmDspSysH_t h, void** userPtrPtr )
  2178. {
  2179. cmDspRC_t rc;
  2180. unsigned sgShapeId = 0;
  2181. double sgHz = 500;
  2182. double sgGain = 0.02;
  2183. unsigned grpSymId = cmDspSysPresetRegisterGroup(h,"test");
  2184. const cmChar_t* prefixLabel = NULL;
  2185. cmDspInst_t* sg = cmDspSysAllocInst( h, "SigGen", NULL, 3, sgHz, sgShapeId, sgGain );
  2186. cmDspInst_t* ao = cmDspSysAllocAudioOut( h, 0, 1.0 );
  2187. cmDspInst_t* shapes = cmDspSysAllocMsgListP(h, grpSymId, prefixLabel, "Shape", NULL, "shapeList", 0 );
  2188. cmDspInst_t* gains = cmDspSysAllocMsgListP(h, grpSymId, prefixLabel, "Gains", NULL, "gainMenu", 0 );
  2189. cmDspInst_t* hz = cmDspSysAllocScalarP( h, grpSymId, prefixLabel, "Hz", 0.0, 10000.0, 0.01, sgHz);
  2190. cmDspInst_t* gain = cmDspSysAllocScalarP( h, grpSymId, prefixLabel, "Gain", 0.0, 1.0, 0.01, sgGain);
  2191. cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, grpSymId );
  2192. cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" );
  2193. cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0);
  2194. cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0);
  2195. // check for allocation errors
  2196. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2197. goto errLabel;
  2198. cmDspSysConnectAudio(h, sg, "out", ao, "in" );
  2199. cmDspSysInstallCb( h, shapes,"out", sg, "shape", NULL );
  2200. cmDspSysInstallCb( h, hz, "val", sg, "hz", NULL );
  2201. cmDspSysInstallCb( h, gain, "val", sg, "gain", NULL );
  2202. cmDspSysInstallCb( h, gains, "out", gain, "val", NULL );
  2203. cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL);
  2204. cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL );
  2205. cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL );
  2206. errLabel:
  2207. return rc;
  2208. }
  2209. //------------------------------------------------------------------------------
  2210. //)
  2211. //( { label:cmDspPgm_RsrcWr file_desc:"Set a resource value example program." kw:[spgm] }
  2212. cmDspRC_t _cmDspSysPgm_RsrcWr( cmDspSysH_t h, void** userPtrPtr )
  2213. {
  2214. cmDspRC_t rc = kOkDspRC;
  2215. const cmChar_t* lbl1 = "rsrc1";
  2216. const cmChar_t* lbl2 = "rsrc2";
  2217. const cmChar_t* str1 = NULL;
  2218. const cmChar_t* str2 = NULL;
  2219. if( cmDspRsrcString(h,&str1, lbl1, NULL ) != kOkDspRC )
  2220. str1 = "1";
  2221. if( cmDspRsrcString(h,&str2, lbl2, NULL ) != kOkDspRC )
  2222. str2 = "2";
  2223. cmDspInst_t* rsrcWr = cmDspSysAllocInst( h, "RsrcWr", NULL, 2, lbl1, lbl2 );
  2224. cmDspInst_t* textUi0 = cmDspSysAllocInst( h, "Text", "Value1", 1, str1 );
  2225. cmDspInst_t* textUi1 = cmDspSysAllocInst( h, "Text", "Value2", 1, str2 );
  2226. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2227. goto errLabel;
  2228. cmDspSysInstallCb( h, textUi0, "val", rsrcWr, "rsrc1", NULL );
  2229. cmDspSysInstallCb( h, textUi1, "val", rsrcWr, "rsrc2", NULL );
  2230. errLabel:
  2231. return rc;
  2232. }
  2233. //------------------------------------------------------------------------------
  2234. //)
  2235. //( { label:cmDspPgm_1Up file_desc:"1Up example program." kw:[spgm] }
  2236. cmDspRC_t _cmDspSysPgm_1Up( cmDspSysH_t h, void** userPtrPtr )
  2237. {
  2238. cmDspRC_t rc;
  2239. unsigned chCnt = 3;
  2240. double maxIdx = chCnt - 1;
  2241. unsigned initIdx = 2;
  2242. cmDspInst_t* sel = cmDspSysAllocScalar( h, "Chan", 0.0, maxIdx, 1.0, 0.0 );
  2243. cmDspInst_t* up = cmDspSysAllocInst( h, "1Up", NULL, 2, chCnt, initIdx );
  2244. cmDspInst_t* pr0 = cmDspSysAllocInst( h, "Printer", NULL, 1, "0:" );
  2245. cmDspInst_t* pr1 = cmDspSysAllocInst( h, "Printer", NULL, 1, "1:" );
  2246. cmDspInst_t* pr2 = cmDspSysAllocInst( h, "Printer", NULL, 1, "2:" );
  2247. // check for allocation errors
  2248. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2249. goto errLabel;
  2250. cmDspSysInstallCb( h, sel, "val", up, "sel",NULL);
  2251. cmDspSysInstallCb( h, up, "out-0", pr0, "in", NULL );
  2252. cmDspSysInstallCb( h, up, "out-1", pr1, "in", NULL );
  2253. cmDspSysInstallCb( h, up, "out-2", pr2, "in", NULL );
  2254. errLabel:
  2255. return rc;
  2256. }
  2257. //------------------------------------------------------------------------------
  2258. //)
  2259. //( { label:cmDspPgm_PortToSym file_desc:"PortToSym example program." kw:[spgm] }
  2260. cmDspRC_t _cmDspSysPgm_PortToSym( cmDspSysH_t h, void** userPtrPtr )
  2261. {
  2262. cmDspRC_t rc = kOkDspRC;
  2263. inst_t* btn0 = button( "Btn0", 0.0 );
  2264. inst_t* btn1 = button( "Btn1", 0.0 );
  2265. inst_t* btn2 = button( "Btn2", 0.0 );
  2266. inst_t* pts = inst( "PortToSym", NULL, "one", "two", "three");
  2267. inst_t* pr0 = inst( "Printer", NULL, "sym:" );
  2268. inst_t* pr1 = inst( "Printer", NULL, "btn:" );
  2269. inst_t* pr2 = inst( "Printer", NULL, "out:" );
  2270. // check for allocation errors
  2271. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2272. goto errLabel;
  2273. event( btn0, out, pts, one );
  2274. event( btn1, out, pts, two );
  2275. event( btn2, out, pts, three );
  2276. event( btn0, out, pr1, in );
  2277. event( btn1, out, pr1, in );
  2278. event( btn2, out, pr1, in );
  2279. event( pts, one, pr0, in );
  2280. event( pts, two, pr0, in );
  2281. event( pts, three, pr0, in );
  2282. event( pts, out, pr2, in );
  2283. errLabel:
  2284. return rc;
  2285. }
  2286. //------------------------------------------------------------------------------
  2287. //)
  2288. //( { label:cmDspPgm_IntToSym file_desc:"IntToSym example program." kw:[spgm] }
  2289. cmDspRC_t _cmDspSysPgm_IntToSym( cmDspSysH_t h, void** userPtrPtr )
  2290. {
  2291. cmDspRC_t rc = kOkDspRC;
  2292. inst_t* sel0 = scalar( "Sel0", 0.0, 10.0, 1.0, 1.0 );
  2293. inst_t* sel1 = scalar( "Sel1", 0.0, 10.0, 1.0, 1.0 );
  2294. inst_t* sel2 = scalar( "Sel2", 0.0, 10.0, 1.0, 1.0 );
  2295. inst_t* val = scalar( "Val", 0.0, 10.0, 1.0, 1.0 );
  2296. inst_t* pts = inst( "IntToSym", NULL, 0, "one", 0, "two", 0, "three");
  2297. inst_t* pr0 = inst( "Printer", NULL, "val:" );
  2298. inst_t* pr1 = inst( "Printer", NULL, "sym:" );
  2299. inst_t* pr2 = inst( "Printer", NULL, "out:" );
  2300. // check for allocation errors
  2301. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2302. goto errLabel;
  2303. event( sel0, val, pts, one-int );
  2304. event( sel1, val, pts, two-int );
  2305. event( sel2, val, pts, three-int );
  2306. event( val, val, pts, in );
  2307. event( val, val, pr0, in );
  2308. event( pts, one, pr1, in );
  2309. event( pts, two, pr1, in );
  2310. event( pts, three, pr1, in );
  2311. event( pts, out, pr2, in );
  2312. errLabel:
  2313. return rc;
  2314. }
  2315. //------------------------------------------------------------------------------
  2316. //)
  2317. //( { label:cmDspPgm_Line file_desc:"Line generator example program." kw:[spgm] }
  2318. cmDspRC_t _cmDspSysPgm_Line( cmDspSysH_t h, void** userPtrPtr )
  2319. {
  2320. cmDspRC_t rc = kOkDspRC;
  2321. cmDspInst_t* beg = cmDspSysAllocScalar( h, "beg", -10.0, 10.0, 1.0, 0.0 );
  2322. cmDspInst_t* end = cmDspSysAllocScalar( h, "end", -10.0, 10.0, 1.0, 1.0 );
  2323. cmDspInst_t* dur = cmDspSysAllocScalar( h, "dur", 0.0, 10000.0, 1.0, 0.0 );
  2324. cmDspInst_t* reset = cmDspSysAllocButton( h, "reset", 0.0 );
  2325. cmDspInst_t* line = cmDspSysAllocInst( h, "Line", NULL, 3, 0.0, 10.0, 1000.0 );
  2326. cmDspInst_t* mtr = cmDspSysAllocInst( h, "Meter", NULL, 3, -10.0, 10.0, 0.0 );
  2327. cmDspInst_t* pr1 = cmDspSysAllocInst( h, "Printer", NULL, 1, ">" );
  2328. // check for allocation errors
  2329. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2330. goto errLabel;
  2331. cmDspSysInstallCb( h, beg, "val", line, "beg", NULL);
  2332. cmDspSysInstallCb( h, end, "val", line, "end", NULL);
  2333. cmDspSysInstallCb( h, dur, "val", line, "dur", NULL);
  2334. cmDspSysInstallCb( h, line, "out", mtr, "in", NULL );
  2335. cmDspSysInstallCb( h, reset, "sym", line, "cmd", NULL );
  2336. cmDspSysInstallCb( h, line, "out", pr1, "in", NULL );
  2337. errLabel:
  2338. return rc;
  2339. }
  2340. //------------------------------------------------------------------------------
  2341. //)
  2342. //( { label:cmDspPgm_Array file_desc:"Array and pitch converter example program." kw:[spgm] }
  2343. cmDspRC_t _cmDspSysPgm_Array( cmDspSysH_t h, void** userPtrPtr )
  2344. {
  2345. cmDspRC_t rc = kOkDspRC;
  2346. unsigned cnt = 0;
  2347. const cmChar_t* rsrcLabelStr = "test";
  2348. if( cmDspRsrcArrayCount( h, &cnt, rsrcLabelStr, NULL ) != kOkDspRC )
  2349. return cmErrMsg(&cmDspSysPgmCtx(h)->err,kPgmCfgFailDspRC,"The resource '%s' could not be read.",rsrcLabelStr);
  2350. cmDspInst_t* printBtn = cmDspSysAllocButton( h, "print", 0.0 );
  2351. cmDspInst_t* sendBtn = cmDspSysAllocButton( h, "send", 0.0 );
  2352. cmDspInst_t* cntBtn = cmDspSysAllocButton( h, "count", 0.0 );
  2353. cmDspInst_t* offsCtl = cmDspSysAllocScalar( h, "offset",0.0, 128.0, 1.0, 60.0 );
  2354. cmDspInst_t* array = cmDspSysAllocInst( h, "Array", NULL, 1, rsrcLabelStr );
  2355. cmDspInst_t** pcvt = cmDspSysAllocInstArray( h, cnt, "PitchCvt", NULL, NULL, 0 );
  2356. cmDspInst_t* printer = cmDspSysAllocInst( h, "Printer", NULL, 1, ">" );
  2357. cmDspSysInstallCb( h, printBtn, "sym", array, "cmd", NULL );
  2358. cmDspSysInstallCb( h, sendBtn, "sym", array, "cmd", NULL );
  2359. cmDspSysInstallCb( h, cntBtn, "sym", array, "cmd", NULL );
  2360. cmDspSysInstallCb11N1( h, offsCtl, "val", pcvt, "offs", cnt );
  2361. cmDspSysInstallCb1NN1( h, array, "out", pcvt, "midi", cnt );
  2362. cmDspSysInstallCbN111( h, pcvt, "midi", printer, "in", cnt );
  2363. cmDspSysInstallCb( h, array, "cnt", printer, "in", NULL );
  2364. return rc;
  2365. }
  2366. cmDspRC_t _cmDspSysPgm_SegLine( cmDspSysH_t h, void** userPtrPtr )
  2367. {
  2368. cmDspRC_t rc = kOkDspRC;
  2369. cmDspInst_t* btn = cmDspSysAllocButton( h, "Trig", 0.0 );
  2370. cmDspInst_t* sline = cmDspSysAllocInst( h, "SegLine", NULL, 1, "array" );
  2371. cmDspInst_t* printer = cmDspSysAllocInst( h, "Printer", NULL, 1, ">" );
  2372. // check for allocation errors
  2373. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2374. goto errLabel;
  2375. cmDspSysInstallCb( h, btn, "sym", sline, "trig", NULL );
  2376. cmDspSysInstallCb( h, sline, "out", printer, "in", NULL );
  2377. errLabel:
  2378. return rc;
  2379. }
  2380. //------------------------------------------------------------------------------
  2381. //)
  2382. //( { label:cmDspPgm_AvailCh file_desc:"AvailCh and XFader example program." kw:[spgm] }
  2383. cmDspRC_t _cmDspSysPgm_AvailCh( cmDspSysH_t h, void** userPtrPtr )
  2384. {
  2385. double frqHz = 440.0;
  2386. unsigned xfadeChCnt = 2;
  2387. double xfadeMs = 250.0;
  2388. bool xfadeInitFl = false;
  2389. const char* fn = "/Users/kevin/media/audio/20110723-Kriesberg/Audio Files/Piano 3_01.wav";
  2390. cmDspInst_t* chk0 = cmDspSysAllocInst(h,"Button", "0", 2, kButtonDuiId, 0.0 );
  2391. cmDspInst_t* hz = cmDspSysAllocScalar( h, "hz",0.0, 10000.0, 0.01, 1.0 );
  2392. //cmDspInst_t* chk1 = cmDspSysAllocInst(h,"Button", "1", 2, kCheckDuiId, 0.0 );
  2393. cmDspInst_t* achp = cmDspSysAllocInst( h, "AvailCh", NULL, 1, xfadeChCnt );
  2394. cmDspInst_t* sphp = cmDspSysAllocInst( h, "Phasor", NULL, 2, cmDspSysSampleRate(h), frqHz );
  2395. cmDspInst_t* swtp = cmDspSysAllocInst( h, "WaveTable", NULL, 2, ((int)cmDspSysSampleRate(h)), 4);
  2396. cmDspInst_t* fphp = cmDspSysAllocInst( h, "Phasor", NULL, 1, cmDspSysSampleRate(h) );
  2397. cmDspInst_t* fwtp = cmDspSysAllocInst( h, "WaveTable", NULL, 5, ((int)cmDspSysSampleRate(h)), 1, fn, -1, 7000000 );
  2398. cmDspInst_t* fad0 = cmDspSysAllocInst( h, "Xfader", NULL, 3, xfadeChCnt, xfadeMs, xfadeInitFl );
  2399. cmDspInst_t* prp = cmDspSysAllocInst( h, "Printer", NULL, 1, "ch:" );
  2400. cmDspInst_t* prg0 = cmDspSysAllocInst( h, "Printer", NULL, 1, "g0:" );
  2401. cmDspInst_t* prg1 = cmDspSysAllocInst( h, "Printer", NULL, 1, "g1:" );
  2402. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 0 );
  2403. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 1 );
  2404. // phasor->sine->fad-0->aout
  2405. cmDspSysConnectAudio(h, sphp, "out", swtp, "phs" );
  2406. cmDspSysConnectAudio(h, swtp, "out", fad0, "in-0" );
  2407. cmDspSysConnectAudio(h, fad0, "out-0", ao0p, "in" );
  2408. // phasor->file->fad-1->aout
  2409. cmDspSysConnectAudio(h, fphp, "out", fwtp, "phs" );
  2410. cmDspSysConnectAudio(h, fwtp, "out", fad0, "in-1" );
  2411. cmDspSysConnectAudio(h, fad0, "out-1", ao1p, "in" );
  2412. //cmDspSysInstallCb(h, chk0, "out", fad0, "gate-0", NULL);
  2413. //cmDspSysInstallCb(h, chk1, "out", fad0, "gate-1", NULL);
  2414. cmDspSysInstallCb(h, chk0, "sym", achp, "trig", NULL); // btn->availCh.trig
  2415. cmDspSysInstallCb(h, achp, "ch", prp, "in", NULL); // availCh.ch -> printer
  2416. cmDspSysInstallCb(h, achp, "gate-0", fad0, "gate-0", NULL ); // availCh.gate->xfad.gate
  2417. cmDspSysInstallCb(h, fad0, "state-0", achp, "dis-0", NULL ); // xfad->state ->availCh.dis
  2418. cmDspSysInstallCb(h, achp, "gate-1", fad0, "gate-1", NULL );
  2419. cmDspSysInstallCb(h, fad0, "state-1", achp, "dis-1", NULL );
  2420. cmDspSysInstallCb(h, hz, "val", sphp, "mult", NULL );
  2421. cmDspSysInstallCb(h, achp, "gate-0", prg0, "in", NULL );
  2422. cmDspSysInstallCb(h, achp, "gate-1", prg1, "in", NULL );
  2423. return kOkDspRC;
  2424. }
  2425. //------------------------------------------------------------------------------
  2426. //)
  2427. //( { label:cmDspPgm_Goertzel file_desc:"Goertzel detector example program." kw:[spgm] }
  2428. cmDspRC_t _cmDspSysPgm_Goertzel( cmDspSysH_t h, void** userPtrPtr )
  2429. {
  2430. cmDspRC_t rc;
  2431. const unsigned chCnt = 8;
  2432. unsigned hopFact = 2;
  2433. double dfltHz = 18000.0;
  2434. unsigned sigGenMode = 2; // sine
  2435. double sigGenGain = 0.9;
  2436. double dfltMixGain = 1.0/chCnt;
  2437. double fcHzV[chCnt];
  2438. unsigned i;
  2439. for(i=0; i<chCnt; ++i)
  2440. fcHzV[i] = 18000.0 + (20000.0-18000.0) * i /chCnt;
  2441. cmDspInst_t* ain = cmDspSysAllocAudioIn( h, 0, 1.0);
  2442. cmDspInst_t* amtr = cmDspSysAllocInst( h, "AMeter", "In", 0 );
  2443. cmDspInst_t* goer = cmDspSysAllocInst( h, "Goertzel", NULL, 3, hopFact, chCnt, fcHzV );
  2444. cmDspSysNewColumn(h,0);
  2445. cmDspInst_t** mtrV = cmDspSysAllocInstArray(h, chCnt, "Meter", "Mtr", NULL, 3, 0.0, 0.0, 1.0 );
  2446. cmDspInst_t** sgV = cmDspSysAllocInstArray(h, chCnt, "SigGen", "SG", NULL, 2, dfltHz, sigGenMode, sigGenGain, 0 );
  2447. cmDspInst_t* mix = cmDspSysAllocInst( h, "AMix", NULL,1, chCnt );
  2448. cmDspInst_t* ao0 = cmDspSysAllocAudioOut( h, 0, 1.0);
  2449. cmDspInst_t* ao1 = cmDspSysAllocAudioOut( h, 0, 1.0);
  2450. cmDspSysNewColumn(h,0);
  2451. cmDspInst_t** hzV = cmDspSysAllocInstArray( h, chCnt, "Scalar", "Hz", NULL, 5, kNumberDuiId, 0.0, 22000.0, 100.0, dfltHz );
  2452. cmDspSysNewColumn(h,0);
  2453. cmDspInst_t** gnV = cmDspSysAllocInstArray( h, chCnt, "Scalar", "Gain", NULL, 5, kNumberDuiId, 0.0, 1.0, 0.01, dfltMixGain );
  2454. cmDspInst_t* igain = cmDspSysAllocScalar( h, "igain", 0.0, 3.0, 0.01, 1.0 );
  2455. cmDspInst_t* hop = cmDspSysAllocScalar( h, "hop", 0.0, 16.0, 1.0, 4.0 );
  2456. //cmDspInst_t* prnt = cmDspSysAllocInst( h,"Printer", NULL, 1, ">" );
  2457. // check for allocation errors
  2458. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2459. goto errLabel;
  2460. cmDspSysConnectAudio(h,ain,"out", goer, "in" );
  2461. cmDspSysConnectAudio(h,ain,"out", amtr, "in" );
  2462. cmDspSysConnectAudioN11N(h,sgV, "out", mix, "in", chCnt );
  2463. cmDspSysConnectAudio(h,mix,"out", ao0, "in" );
  2464. cmDspSysConnectAudio(h,mix,"out", ao1, "in" );
  2465. cmDspSysInstallCb( h, igain, "val", ain, "gain", NULL);
  2466. cmDspSysInstallCbN1N1( h, hzV, "val", sgV, "hz", chCnt);
  2467. cmDspSysInstallCbN11N( h, hzV, "val", goer, "hz", chCnt );
  2468. cmDspSysInstallCbN11N( h, gnV, "val", mix, "gain", chCnt);
  2469. cmDspSysInstallCb1NN1( h, goer, "out", mtrV, "in", chCnt );
  2470. cmDspSysInstallCb( h, hop, "val", goer, "hop", NULL );
  2471. errLabel:
  2472. return rc;
  2473. }
  2474. //------------------------------------------------------------------------------
  2475. //)
  2476. //( { label:cmDspPgm_TakeSeqBldr file_desc:"Take sequence builder example program." kw:[spgm] }
  2477. cmDspRC_t _cmDspSysPgm_TakeSeqBldr( cmDspSysH_t h, void** userPtrPtr )
  2478. {
  2479. cmDspRC_t rc = kOkDspRC;
  2480. //const cmChar_t* tksbFn = "/User/kevin/src/cmkc/src/kc/data/takeSeqBldr0.js";
  2481. const cmChar_t* tksbFn = "/Users/kevin/src/cmkc/src/kc/data/takeSeqBldr_osx.js";
  2482. const cmChar_t* deviceName = "MOTU - Traveler mk3"; //"Fastlane";
  2483. const cmChar_t* portName = "MIDI Port"; // "Fastlane MIDI A";
  2484. //const cmChar_t* deviceName = "DKV-M4";
  2485. //const cmChar_t* portName = "DKV-M4 MIDI 1";
  2486. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),tksbFn,NULL,NULL );
  2487. cmDspInst_t* tsb = cmDspSysAllocInst( h,"TakeSeqBldr", NULL, 1, tksbFn );
  2488. cmDspInst_t* tsr = cmDspSysAllocInst( h,"TakeSeqRend", NULL, 0 );
  2489. cmDspInst_t* nano = cmDspSysAllocInst( h,"NanoMap", NULL, 0 );
  2490. cmDspInst_t* mop = cmDspSysAllocInst( h,"MidiOut", NULL, 2, deviceName, portName);
  2491. cmDspSysNewPage(h,"Controls");
  2492. //cmDspInst_t* fnp = cmDspSysAllocInst(h,"Fname", NULL, 3, false,"JS Files (*.js)\tJS Files (*.{js})",fn);
  2493. cmDspInst_t* start = cmDspSysAllocInst( h,"Button", "start", 2, kButtonDuiId, 0.0 );
  2494. cmDspInst_t* stop = cmDspSysAllocInst( h,"Button", "stop", 2, kButtonDuiId, 0.0 );
  2495. cmDspInst_t* cont = cmDspSysAllocInst( h,"Button", "continue", 2, kButtonDuiId, 0.0 );
  2496. cmDspInst_t* prt = cmDspSysAllocInst( h, "Printer", NULL, 1, ">" );
  2497. // check for allocation errors
  2498. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2499. goto errLabel;
  2500. cmDspSysInstallCb( h, tsb, "bldr", tsr, "bldr", NULL);
  2501. cmDspSysInstallCb( h, tsb, "refresh", tsr, "refresh", NULL );
  2502. cmDspSysInstallCb( h, tsb, "sel", tsr, "sel", NULL );
  2503. cmDspSysInstallCb( h, start, "sym", tsr, "cmd", NULL);
  2504. cmDspSysInstallCb( h, stop, "sym", tsr, "cmd", NULL);
  2505. cmDspSysInstallCb( h, cont, "sym", tsr, "cmd", NULL);
  2506. cmDspSysInstallCb( h, tsr, "d1", nano, "d1", NULL);
  2507. cmDspSysInstallCb( h, tsr, "d0", nano, "d0", NULL);
  2508. cmDspSysInstallCb( h, tsr, "status", nano, "status", NULL);
  2509. cmDspSysInstallCb( h, nano, "d1", mop, "d1", NULL);
  2510. cmDspSysInstallCb( h, nano, "d0", mop, "d0", NULL);
  2511. cmDspSysInstallCb( h, nano, "status", mop, "status", NULL);
  2512. //cmDspSysInstallCb( h, tsb, "sel", prt, "in", NULL );
  2513. cmDspSysInstallCb( h, tsb, "refresh", prt, "in", NULL);
  2514. errLabel:
  2515. cmFsFreeFn(fn);
  2516. return rc;
  2517. }
  2518. //------------------------------------------------------------------------------
  2519. //)
  2520. //( { label:cmDspPgm_TwoD file_desc:"Two dimensional controller example program." kw:[spgm] }
  2521. cmDspRC_t _cmDspSysPgm_TwoD( cmDspSysH_t h, void** userPtrPtr )
  2522. {
  2523. cmDspRC_t rc = kOkDspRC;
  2524. cmDspInst_t* twod = cmDspSysAllocInst(h,"twod", NULL, 0);
  2525. cmDspInst_t* aprt = cmDspSysAllocInst(h,"Printer",NULL, 1, "a: ");
  2526. cmDspInst_t* rprt = cmDspSysAllocInst(h,"Printer",NULL, 1, "r: ");
  2527. // check for allocation errors
  2528. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2529. goto errLabel;
  2530. cmDspSysInstallCb(h, twod, "angle", aprt, "in", NULL );
  2531. cmDspSysInstallCb(h, twod, "radius", rprt, "in", NULL );
  2532. errLabel:
  2533. return rc;
  2534. }
  2535. //------------------------------------------------------------------------------
  2536. //)
  2537. //( { label:cmDspPgm_BinEnc file_desc:"HRTF binaural encoder example program." kw:[spgm] }
  2538. cmDspRC_t _cmDspSysPgm_BinEnc( cmDspSysH_t h, void** userPtrPtr )
  2539. {
  2540. cmDspRC_t rc = kOkDspRC;
  2541. double durMs = 10000.0;
  2542. double lineHz = 0.2;
  2543. double maxDurMs = 60000.0;
  2544. double azimBeg = 0.0;
  2545. double azimEnd = 360.0;
  2546. //const char* fn1 = "media/audio/sourcetone/Jazz/Ella & Louis - Under A Blanket Of Blue";
  2547. const char* fn0 = "temp/comhear/drw/monty.wav";
  2548. cmDspInst_t* twod = cmDspSysAllocInst( h, "twod", NULL, 0);
  2549. cmDspInst_t* php = cmDspSysAllocInst( h, "Phasor", NULL, 0 );
  2550. cmDspInst_t* wtp = cmDspSysAllocInst( h, "WaveTable", NULL, 2, ((int)cmDspSysSampleRate(h)), 1 );
  2551. cmDspInst_t* bep = cmDspSysAllocInst( h, "BinauralEnc",NULL, 1, 0);
  2552. cmDspInst_t* ao0p = cmDspSysAllocInst( h, "AudioOut", NULL, 1, 0 );
  2553. cmDspInst_t* ao1p = cmDspSysAllocInst( h, "AudioOut", NULL, 1, 1 );
  2554. cmDspSysNewPage(h,"Controls");
  2555. const cmChar_t* fn = cmFsMakeFn(cmFsUserDir(),fn0,NULL,NULL );
  2556. cmDspInst_t* fnp = cmDspSysAllocInst( h,"Fname", NULL, 3, false,"Audio Files (*.wav,*.aiff,*.aif)\tAudio Files (*.{wav,aiff,aif})",fn);
  2557. cmDspInst_t* beg = cmDspSysAllocScalar( h, "beg", 0.0, azimEnd, 1.0, azimBeg );
  2558. cmDspInst_t* end = cmDspSysAllocScalar( h, "end", 0.0, azimEnd, 1.0, azimEnd );
  2559. cmDspInst_t* dur = cmDspSysAllocScalar( h, "dur", 0.0, maxDurMs, 1.0, durMs );
  2560. cmDspInst_t* reset = cmDspSysAllocButton( h, "reset", 0.0 );
  2561. cmDspInst_t* azm = cmDspSysAllocScalar( h, "azimuth", azimBeg, azimEnd, 1.0, 0.0 );
  2562. cmDspInst_t* angle = cmDspSysAllocScalar( h, "angle", azimBeg, azimEnd, 1.0, 0.0 );
  2563. cmDspInst_t* mode = cmDspSysAllocScalar( h, "mode", 0.0, 1.0, 1.0, 0.0 );
  2564. cmDspInst_t* gain = cmDspSysAllocScalar( h, "gain", 0.0,10.0, 0.01, 1.0 );
  2565. cmDspInst_t* line = cmDspSysAllocInst( h, "Line", NULL, 3, azimBeg, azimEnd, durMs, lineHz );
  2566. cmDspInst_t* prt = cmDspSysAllocInst( h, "Printer", NULL, 1, ">" );
  2567. // check for allocation errors
  2568. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  2569. goto errLabel;
  2570. cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phasor -> wave table
  2571. cmDspSysConnectAudio(h, wtp, "out", bep, "in" );
  2572. cmDspSysConnectAudio(h, bep, "out0", ao0p, "in" ); // wave table -> audio out
  2573. cmDspSysConnectAudio(h, bep, "out1", ao1p, "in" ); //
  2574. cmDspSysInstallCb( h, fnp, "out", wtp, "fn", NULL);
  2575. cmDspSysInstallCb( h, beg, "val", line, "beg", NULL);
  2576. cmDspSysInstallCb( h, end, "val", line, "end", NULL);
  2577. cmDspSysInstallCb( h, dur, "val", line, "dur", NULL);
  2578. cmDspSysInstallCb( h, reset,"sym", line, "cmd", NULL );
  2579. cmDspSysInstallCb( h, line, "out", azm, "val", NULL );
  2580. cmDspSysInstallCb( h, azm, "val", bep, "azim", NULL );
  2581. cmDspSysInstallCb( h, twod, "angle", angle,"val", NULL );
  2582. cmDspSysInstallCb( h, angle,"val", bep, "azim", NULL );
  2583. cmDspSysInstallCb( h, mode, "val", bep, "mode", NULL );
  2584. cmDspSysInstallCb( h, twod, "angle", prt, "in", NULL );
  2585. cmDspSysInstallCb( h, gain, "val", ao0p, "gain", NULL );
  2586. cmDspSysInstallCb( h, gain, "val", ao1p, "gain", NULL );
  2587. return kOkDspRC;
  2588. errLabel:
  2589. return rc;
  2590. }
  2591. //)
  2592. //(
  2593. _cmDspSysPgm_t _cmDspSysPgmArray[] =
  2594. {
  2595. { "reflect", _cmDspSysPgm_ReflectCalc, NULL, NULL },
  2596. { "tksblite", _cmDspSysPgm_TksbLite, NULL, NULL },
  2597. { "tksb", _cmDspSysPgm_Tksb, NULL, NULL },
  2598. { "time_line", _cmDspSysPgm_TimeLine, NULL, NULL },
  2599. { "time_line_lite", _cmDspSysPgm_TimeLineLite, NULL, NULL },
  2600. { "time_line_lite_af", _cmDspSysPgm_TimeLineLiteAf, NULL, NULL },
  2601. { "seq-bldr", _cmDspSysPgm_TakeSeqBldr, NULL, NULL },
  2602. { "multi-out", _cmDspSysPgm_MultiOut, NULL, NULL },
  2603. { "multi-in", _cmDspSysPgm_MultiIn, NULL, NULL },
  2604. { "goertzel", _cmDspSysPgm_Goertzel, NULL, NULL },
  2605. { "main", _cmDspSysPgm_Main, NULL, NULL },
  2606. { "array", _cmDspSysPgm_Array, NULL, NULL },
  2607. { "line", _cmDspSysPgm_Line, NULL, NULL },
  2608. { "1Up", _cmDspSysPgm_1Up, NULL, NULL },
  2609. { "PortToSym", _cmDspSysPgm_PortToSym, NULL, NULL },
  2610. { "IntToSym", _cmDspSysPgm_IntToSym, NULL, NULL },
  2611. { "preset", _cmDspSysPgm_Preset, NULL, NULL },
  2612. { "rsrcWr", _cmDspSysPgm_RsrcWr, NULL, NULL },
  2613. { "router", _cmDspSysPgm_Router, NULL, NULL },
  2614. { "1ofN", _cmDspSysPgm_1ofN, NULL, NULL },
  2615. { "NofM", _cmDspSysPgm_NofM, NULL, NULL },
  2616. { "whirl_net", _cmDspSysPgm_WhirlNet, NULL, NULL },
  2617. { "thunk_net", _cmDspSysPgm_ThunkNet, NULL, NULL },
  2618. { "seq", _cmDspSysPgm_Seq, NULL, NULL },
  2619. { "dist_ds", _cmDspSysPgm_DistDs, NULL, NULL },
  2620. { "bi_quad_eq", _cmDspSysPgm_BiQuadEq, NULL, NULL },
  2621. { "compressor", _cmDspSysPgm_Compressor, NULL, NULL },
  2622. { "adsr", _cmDspSysPgm_Adsr, NULL, NULL },
  2623. { "msg delay", _cmDspSysPgm_MsgDelay, NULL, NULL },
  2624. { "pickup rmod2", _cmDspSysPgm_RingMod2, NULL, NULL },
  2625. { "pickup rmod", _cmDspSysPgm_RingMod, NULL, NULL },
  2626. { "pickup tails", _cmDspSysPgm_NoiseTails, NULL, NULL },
  2627. { "tails_2", _cmDspSysPgm_NoiseTails2, NULL, NULL },
  2628. { "pickups", _cmDspSysPgm_Pickups0, NULL, NULL },
  2629. { "sync_recd", _cmDspSysPgm_SyncRecd, NULL, NULL },
  2630. { "midi_test", _cmDspSysPgm_Test_Midi, NULL, NULL },
  2631. { "pedal_test", _cmDspSysPgm_Test_Pedals, NULL, NULL },
  2632. { "midi_file", _cmDspSysPgm_MidiFilePlay, NULL, NULL },
  2633. { "2_thru", _cmDspSysPgm_Stereo_Through, NULL, NULL },
  2634. { "all_in_out", _cmDspSysPgm_All_In_And_Out, NULL, NULL },
  2635. { "guitar", _cmDspSysPgmGuitar, NULL, NULL },
  2636. { "2_fx", _cmDspSysPgm_Stereo_Fx, NULL, NULL },
  2637. { "sine", _cmDspSysPgm_PlaySine, NULL, NULL },
  2638. { "file", _cmDspSysPgm_PlayFile, NULL, NULL },
  2639. { "gate_detect", _cmDspSysPgm_GateDetect, NULL, NULL },
  2640. { "rt_record", _cmDspSysPgm_RtRecord, NULL, NULL },
  2641. { "record", _cmDspSysPgm_Record, NULL, NULL },
  2642. { "pitch_shift", _cmDspSysPgm_PitchShiftFile, NULL, NULL },
  2643. { "loop_recd", _cmDspSysPgm_LoopRecd, NULL, NULL },
  2644. { "ui_test", _cmDspSysPgm_UiTest, NULL, NULL },
  2645. { "xfade_test", _cmDspSysPgm_Xfade, NULL, NULL },
  2646. { "auto_gain", _cmDspSysPgm_AutoGain, NULL, NULL },
  2647. { "comb filt", _cmDspSysPgm_CombFilt, NULL, NULL },
  2648. { "scalar op", _cmDspSysPgm_ScalarOp, NULL, NULL },
  2649. { "seg_line", _cmDspSysPgm_SegLine, NULL, NULL },
  2650. { "avail_ch", _cmDspSysPgm_AvailCh, NULL, NULL },
  2651. { "two-d", _cmDspSysPgm_TwoD, NULL, NULL },
  2652. { "bin-enc", _cmDspSysPgm_BinEnc, NULL, NULL },
  2653. { NULL , NULL, NULL, NULL }
  2654. };
  2655. _cmDspSysPgm_t* _cmDspSysPgmArrayBase()
  2656. {
  2657. return _cmDspSysPgmArray;
  2658. }
  2659. //)