libcm is a C development framework with an emphasis on audio signal processing applications.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

cmDspPgmKrTimeLineLite.c 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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' Performance analysis Simplified Time Line program." 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 "cmText.h"
  14. #include "cmFileSys.h"
  15. #include "cmSymTbl.h"
  16. #include "cmJson.h"
  17. #include "cmPrefs.h"
  18. #include "cmDspValue.h"
  19. #include "cmMsgProtocol.h"
  20. #include "cmThread.h"
  21. #include "cmUdpPort.h"
  22. #include "cmUdpNet.h"
  23. #include "cmSerialPort.h"
  24. #include "cmTime.h"
  25. #include "cmAudioSys.h"
  26. #include "cmProcObj.h"
  27. #include "cmDspCtx.h"
  28. #include "cmDspClass.h"
  29. #include "cmDspSys.h"
  30. #include "cmDspPgm.h"
  31. #include "cmAudioFile.h"
  32. #include "cmProcObj.h"
  33. #include "cmProc.h"
  34. #include "cmProc3.h"
  35. #include "cmVectOpsTemplateMain.h"
  36. #include "cmVectOps.h"
  37. #include "cmDspPgmKrChain.h"
  38. //)
  39. //( { label:cmDspPgm_TimeLineLite file_desc:"Simplified score vs. the performance and generating related audio transforms." kw:[spgm] }
  40. cmDspRC_t _cmDspSysPgm_TimeLineLite(cmDspSysH_t h, void** userPtrPtr )
  41. {
  42. cmDspRC_t rc = kOkDspRC;
  43. cmCtx_t* cmCtx = cmDspSysPgmCtx(h);
  44. cmErr_t err;
  45. krRsrc_t r;
  46. unsigned sfBufCnt = 7; // length of the MIDI event buffer
  47. unsigned sfMaxWndCnt = 10; // length of the score event buffer
  48. unsigned sfMinVel = 5; // ignore MIDI events below this velocity
  49. bool sfEnaMeasFl = true;
  50. memset(&r,0,sizeof(r));
  51. cmErrSetup(&err,&cmCtx->rpt,"Kr TimelineLite");
  52. if( krLoadRsrc(h,&err,&r) != kOkDspRC )
  53. return rc;
  54. int baseAudioInCh = 0; // 2;
  55. int baseAudioOutCh = 0;// 2;
  56. cmDspInst_t* ai0 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, baseAudioInCh + 0);
  57. cmDspInst_t* ai1 = cmDspSysAllocInst(h,"AudioIn", NULL, 1, baseAudioInCh + 1);
  58. //cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 2, "MOTU - Traveler mk3", "MIDI Port");
  59. //cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 2, "Apple Inc. - IAC Driver", "Bus 1");
  60. cmDspInst_t* tlp = cmDspSysAllocInst(h,"TimeLine", "tl", 2, r.tlFn, r.tlPrefixPath );
  61. cmDspInst_t* scp = cmDspSysAllocInst(h,"Score", "sc", 1, r.scFn );
  62. cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 2, "on", "off" );
  63. cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 );
  64. cmDspInst_t* nmp = cmDspSysAllocInst(h,"NanoMap", NULL, 0 );
  65. cmDspInst_t* mdly_st = cmDspSysAllocInst(h,"MsgDelay", NULL, 2, 1024, 500.0 );
  66. cmDspInst_t* mdly_d0 = cmDspSysAllocInst(h,"MsgDelay", NULL, 2, 1024, 500.0 );
  67. cmDspInst_t* mdly_d1 = cmDspSysAllocInst(h,"MsgDelay", NULL, 2, 1024, 500.0 );
  68. //cmDspInst_t* pic = cmDspSysAllocInst(h,"Picadae", NULL, 0 );
  69. cmDspInst_t* mop = cmDspSysAllocInst(h,"MidiOut", NULL, 2, "Fastlane","Fastlane MIDI A" );
  70. //cmDspInst_t* mo2p = cmDspSysAllocInst(h,"MidiOut", NULL, 2, "picadae","picadae MIDI 1");
  71. cmDspInst_t* mo2p = cmDspSysAllocInst(h,"MidiOut", NULL, 2, "Scarlett 18i20 USB","Scarlett 18i20 USB MIDI 1");
  72. //cmDspInst_t* mo2p = cmDspSysAllocInst(h,"MidiOut", NULL, 2, "Fastlane","Fastlane MIDI A");
  73. cmDspInst_t* sfp = cmDspSysAllocInst(h,"ScFol", NULL, 5, r.scFn, sfBufCnt, sfMaxWndCnt, sfMinVel, sfEnaMeasFl );
  74. cmDspInst_t* amp = cmDspSysAllocInst(h,"ActiveMeas", NULL, 1, 100 );
  75. cmDspInst_t* modp = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" );
  76. unsigned preGrpSymId = cmDspSysPresetRegisterGroup(h,"tl");
  77. unsigned cmpPreGrpSymId = cmDspSysPresetRegisterGroup(h,"tl_cmp");
  78. cmDspTlXform_t c0,c1;
  79. cmDspSysNewPage(h,"Controls-0");
  80. _cmDspSys_TlXformChain(h, &c0, preGrpSymId, cmpPreGrpSymId, amp, modp, 0, 0 );
  81. cmDspSysNewPage(h,"Controls-1");
  82. _cmDspSys_TlXformChain(h, &c1, preGrpSymId, cmpPreGrpSymId, amp, modp, 1, 1 );
  83. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+2 ); // 4 Piano 1 Output
  84. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+3 ); // 5 2
  85. cmDspInst_t* ao2 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+0 ); // 2 Transform 1 OUtput
  86. cmDspInst_t* ao3 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, baseAudioOutCh+1 ); // 3 2
  87. cmDspSysNewPage(h,"Main");
  88. //cmDspInst_t* notesOffb= cmDspSysAllocInst(h,"Button", "notesOff", 2, kButtonDuiId, 1.0 );
  89. cmDspInst_t* onb = cmDspSysAllocInst(h,"Button", "start", 2, kButtonDuiId, 1.0 );
  90. cmDspInst_t* offb = cmDspSysAllocInst(h,"Button", "stop", 2, kButtonDuiId, 1.0 );
  91. cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 );
  92. cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" );
  93. cmDspInst_t* prd = cmDspSysAllocInst(h,"Printer", NULL, 1, "DYNM:" );
  94. cmDspInst_t* pre = cmDspSysAllocInst(h,"Printer", NULL, 1, "EVEN:" );
  95. cmDspInst_t* prt = cmDspSysAllocInst(h,"Printer", NULL, 1, "TMPO:");
  96. cmDspInst_t* prc = cmDspSysAllocInst(h,"Printer", NULL, 1, "COST:");
  97. // Record <-> Live switches
  98. cmDspInst_t* tlRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0); // time line swich
  99. cmDspInst_t* mfpRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  100. //cmDspInst_t* amRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  101. //cmDspSysNewColumn(h,0);
  102. cmDspInst_t* igain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  103. cmDspInst_t* igain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  104. //cmDspSysNewColumn(h,0);
  105. cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Dry Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  106. cmDspInst_t* ogain1 = cmDspSysAllocInst(h,"Scalar", "Dry Out Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  107. cmDspInst_t* ogain2 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-2", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  108. cmDspInst_t* ogain3 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-3", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  109. // Audio file recording
  110. cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 );
  111. cmDspInst_t* recdChk = cmDspSysAllocInst(h,"Button", "Record", 2, kCheckDuiId, 0.0 );
  112. cmDspInst_t* recdPtS = cmDspSysAllocInst(h,"GateToSym", NULL, 2, cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"open"),cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"close"));
  113. cmDspInst_t* afop = cmDspSysAllocInst(h,"AudioFileOut",NULL, 2, r.recordDir,2);
  114. cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  115. cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  116. cmDspInst_t* msgDly = cmDspSysAllocInst(h,"Scalar", "Delay", 5, kNumberDuiId, 1.0, 1000.0,1.0, 500.0 );
  117. cmDspSysInstallCb( h, msgDly, "val", mdly_st, "delay", NULL);
  118. cmDspSysInstallCb( h, msgDly, "val", mdly_d0, "delay", NULL);
  119. cmDspSysInstallCb( h, msgDly, "val", mdly_d1, "delay", NULL);
  120. cmDspInst_t* meas = cmDspSysAllocInst(h,"Scalar", "Meas", 5, kNumberDuiId, 1.0, 59.0,1.0, 1.0 );
  121. cmDspSysInstallCb( h, meas, "val", scp, "meas", NULL);
  122. cmDspSysInstallCb( h, meas, "val", tlp, "meas", NULL);
  123. //--------------- Preset controls
  124. cmDspSysNewColumn(h,0);
  125. cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, preGrpSymId );
  126. cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" );
  127. cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0);
  128. cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0);
  129. cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL);
  130. cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL );
  131. cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL );
  132. cmDspInst_t* prePath = cmDspSysAllocInst( h, "Fname", "prePath", 3, true,NULL,r.tlPrefixPath);
  133. //cmDspSysNewColumn(h,0);
  134. //--------------- Recorded performance evaluation and Active Measurement related controls
  135. cmDspInst_t* clrBtn = cmDspSysAllocButton( h, "clear", 0);
  136. cmDspInst_t* prtBtn = cmDspSysAllocButton( h, "dump", 0);
  137. cmDspInst_t* amCmd = cmDspSysAllocInst( h, "PortToSym", NULL, 2, "add", "rewind" );
  138. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  139. return rc;
  140. // Output Audio file recording.
  141. cmDspSysInstallCb(h, recdGain,"val", afop, "gain0", NULL );
  142. cmDspSysInstallCb(h, recdGain,"val", afop, "gain1", NULL );
  143. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "on", NULL );
  144. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "off", NULL );
  145. cmDspSysInstallCb(h, recdPtS, "out", afop, "sel", NULL );
  146. // Audio connections
  147. cmDspSysConnectAudio( h, ai0, "out", ao0, "in" ); // dry signal through
  148. cmDspSysConnectAudio( h, ai1, "out", ao1, "in" ); //
  149. cmDspSysConnectAudio( h, ai0, "out", mi0p, "in" ); //
  150. cmDspSysConnectAudio( h, ai0, "out", c0.kr0, "in" ); // ain -> ch0.kr0
  151. cmDspSysConnectAudio( h, ai0, "out", c0.kr1, "in" ); // ain -> ch0.kr1
  152. cmDspSysConnectAudio( h, c0.cmp,"out", ao2, "in" ); // ch0.cmp -> aout
  153. cmDspSysConnectAudio( h, c0.cmp,"out", afop, "in0"); // ch0.cmp -> audio_file_out
  154. cmDspSysConnectAudio( h, ai1, "out", mi1p, "in" ); //
  155. cmDspSysConnectAudio( h, ai1, "out", c1.kr0, "in" ); // ain -> ch1.kr0
  156. cmDspSysConnectAudio( h, ai1, "out", c1.kr1, "in" ); // ain -> ch1.kr1
  157. cmDspSysConnectAudio( h, c1.cmp,"out", ao3, "in" ); // ch1.cmp -> aout
  158. cmDspSysConnectAudio( h, c1.cmp,"out", afop, "in1"); // ch1.cmp ->audio_file_out
  159. cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas.
  160. cmDspSysInstallCb( h, prtBtn, "sym", modp, "cmd", NULL ); // print active meas
  161. //cmDspSysInstallCb( h, prtBtn, "sym", scp, "cmd", NULL ); // print the score
  162. cmDspSysInstallCb( h, amCmd, "add", amp, "cmd", NULL ); // add active meas
  163. cmDspSysInstallCb( h, amCmd, "rewind", amp, "cmd", NULL ); // rewind active meas
  164. //cmDspSysInstallCb( h, sfp, "out", amRt, "f-in", NULL ); // sfp-active meas router (rtr is switched by live btn)
  165. //cmDspSysInstallCb( h, amRt, "f-out-0",amp, "sfloc", NULL );
  166. cmDspSysInstallCb( h, sfp, "out", amp, "sfloc", NULL );
  167. cmDspSysInstallCb( h, sfp, "vloc", amp, "loc", NULL ); // live meas's to active meas unit
  168. cmDspSysInstallCb( h, sfp, "vval", amp, "val", NULL ); //
  169. cmDspSysInstallCb( h, sfp, "vcost",amp, "cst", NULL ); //
  170. cmDspSysInstallCb( h, sfp, "vtyp", amp, "type", NULL ); //
  171. cmDspSysInstallCb( h, sfp, "vtyp", amCmd, "add", NULL); //
  172. // ***** delete this to prevent the score follower from driving the active-measure unit in 'live' mode
  173. //cmDspSysInstallCb( h, amRt, "f-out-1",amp, "sfloc", NULL );
  174. // *****
  175. // active measure loc to xfad channel trigger
  176. /*
  177. cmDspSysInstallCb( h, amp, "scloc",c0.achan, "trig", NULL ); // See Also: modp.sw ->achan.trig
  178. cmDspSysInstallCb( h, amp, "scloc",c1.achan, "trig", NULL );
  179. cmDspSysInstallCb( h, recallBtn, "sym", c0.achan, "trig", NULL );
  180. cmDspSysInstallCb( h, recallBtn, "sym", c1.achan, "trig", NULL );
  181. */
  182. cmDspSysInstallCb( h, amp, "even", pre, "in", NULL ); // active meas output to printers
  183. cmDspSysInstallCb( h, amp, "even", modp, "even", NULL );
  184. cmDspSysInstallCb( h, amp, "dyn", prd, "in", NULL );
  185. cmDspSysInstallCb( h, amp, "dyn", modp, "dyn", NULL );
  186. cmDspSysInstallCb( h, amp, "tempo", prt, "in", NULL );
  187. cmDspSysInstallCb( h, amp, "tempo", modp, "tempo",NULL );
  188. cmDspSysInstallCb( h, amp, "cost", prc, "in", NULL );
  189. cmDspSysInstallCb( h, amp, "cost", modp, "cost", NULL );
  190. /*
  191. cmDspSysInstallCb( h, sfp, "vloc", pre, "in", NULL ); // live meas's to active meas unit
  192. cmDspSysInstallCb( h, sfp, "vval", prd, "in", NULL ); //
  193. cmDspSysInstallCb( h, sfp, "vcost",prt, "in", NULL ); //
  194. cmDspSysInstallCb( h, sfp, "vtyp", prc, "in", NULL ); //
  195. */
  196. // wave-table to time-line cursor
  197. //cmDspSysInstallCb( h, wtp, "fidx",tlp, "curs", NULL);
  198. cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
  199. //cmDspSysInstallCb(h, notesOffb, "sym", pic, "alloff", NULL );
  200. // start connections
  201. cmDspSysInstallCb(h, onb, "sym", tlRt, "s-in", NULL );
  202. cmDspSysInstallCb(h, tlRt, "s-out-0",tlp, "reset", NULL );
  203. cmDspSysInstallCb(h, onb, "sym", scp, "send", NULL );
  204. cmDspSysInstallCb(h, onb, "sym", mfpRt,"s-in", NULL );
  205. cmDspSysInstallCb(h, mfpRt,"s-out-0",mfp, "sel", NULL );
  206. cmDspSysInstallCb(h, onb, "sym", pts, "on", NULL );
  207. cmDspSysInstallCb(h, pts, "on", modp, "cmd", NULL );
  208. cmDspSysInstallCb(h, onb, "sym", amCmd, "rewind", NULL );
  209. cmDspSysInstallCb(h, onb, "out", c0.achan,"reset", NULL );
  210. cmDspSysInstallCb(h, onb, "out", c1.achan,"reset", NULL );
  211. cmDspSysInstallCb(h, mod_sel,"out", modp, "sel", NULL );
  212. // stop connections
  213. cmDspSysInstallCb(h, tlp, "mfn", pts, "off", NULL ); // Prevents WT start on new audio file from TL.
  214. cmDspSysInstallCb(h, offb, "sym", mfp, "sel", NULL );
  215. cmDspSysInstallCb(h, offb, "sym", pts, "off", NULL );
  216. cmDspSysInstallCb(h, pts, "off", modp,"cmd", NULL );
  217. cmDspSysInstallCb(h, offb, "sym", mop, "reset", NULL );
  218. cmDspSysInstallCb(h, offb, "sym", mo2p,"reset", NULL );
  219. cmDspSysInstallCb(h, offb, "sym", mdly_st,"clear", NULL );
  220. cmDspSysInstallCb(h, offb, "sym", mdly_d0,"clear", NULL );
  221. cmDspSysInstallCb(h, offb, "sym", mdly_d1,"clear", NULL );
  222. // time-line to MIDI file player selection
  223. cmDspSysInstallCb(h, tlp, "mbsi", mfp, "bsi", NULL );
  224. cmDspSysInstallCb(h, tlp, "mesi", mfp, "esi", NULL );
  225. cmDspSysInstallCb(h, tlp, "mfn", mfp, "fn", NULL );
  226. // score to score follower - to set initial search location
  227. cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL );
  228. cmDspSysInstallCb(h, scp, "sel", modp,"reset", NULL );
  229. cmDspSysInstallCb(h, scp, "sel", prp, "in", NULL );
  230. cmDspInst_t* msrc = mfp; // switch MIDI source (mfp or mip)
  231. // MIDI file player to score follower and sampler
  232. cmDspSysInstallCb(h, msrc, "smpidx", sfp, "smpidx",NULL );
  233. //cmDspSysInstallCb(h, mfp, "id", sfp, "muid", NULL );
  234. cmDspSysInstallCb(h, msrc, "d1", sfp, "d1", NULL );
  235. cmDspSysInstallCb(h, msrc, "d1", nmp, "d1", NULL );
  236. cmDspSysInstallCb(h, nmp, "d1", mop, "d1", NULL );
  237. //cmDspSysInstallCb(h, nmp, "d1", mdly_d1, "in", NULL );
  238. //cmDspSysInstallCb(h, mdly_d1, "out", mo2p, "d1", NULL );
  239. //cmDspSysInstallCb(h, pic, "d1", mo2p, "d1", NULL );
  240. cmDspSysInstallCb(h, nmp, "d1", mo2p, "d1", NULL );
  241. cmDspSysInstallCb(h, msrc, "d0", sfp, "d0", NULL );
  242. cmDspSysInstallCb(h, msrc, "d0", nmp, "d0", NULL );
  243. cmDspSysInstallCb(h, nmp, "d0", mop, "d0", NULL );
  244. //cmDspSysInstallCb(h, nmp, "d0", mdly_d0, "in", NULL );
  245. //cmDspSysInstallCb(h, mdly_d0, "out", mo2p, "d0", NULL );
  246. //cmDspSysInstallCb(h, pic, "d0", mo2p, "d0", NULL );
  247. cmDspSysInstallCb(h, nmp, "d0", mo2p, "d0", NULL );
  248. cmDspSysInstallCb(h, msrc, "status", sfp, "status",NULL );
  249. cmDspSysInstallCb(h, msrc, "status", nmp, "status",NULL );
  250. cmDspSysInstallCb(h, nmp, "status", mop, "status",NULL );
  251. //cmDspSysInstallCb(h, nmp, "status", mdly_st, "in", NULL );
  252. //cmDspSysInstallCb(h, mdly_st, "out", mo2p, "status", NULL );
  253. cmDspSysInstallCb(h, nmp, "status", mo2p, "status", NULL );
  254. //cmDspSysInstallCb(h, pic, "status", mo2p, "status", NULL );
  255. // score follower to recd_play,modulator and printers
  256. cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL );
  257. cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index
  258. cmDspSysInstallCb(h, igain0, "val", ai0, "gain", NULL ); // input gain control
  259. cmDspSysInstallCb(h, igain1, "val", ai1, "gain", NULL );
  260. cmDspSysInstallCb(h, modp, "dgain0", ogain0, "val", NULL );
  261. cmDspSysInstallCb(h, modp, "dgain1", ogain1, "val", NULL );
  262. cmDspSysInstallCb(h, modp, "wgain0", ogain2, "val", NULL );
  263. cmDspSysInstallCb(h, modp, "wgain1", ogain3, "val", NULL );
  264. cmDspSysInstallCb(h, ogain0, "val", ao0, "gain", NULL ); // output gain control - dry 0
  265. cmDspSysInstallCb(h, ogain1, "val", ao1, "gain", NULL ); // dry 1
  266. cmDspSysInstallCb(h, ogain2, "val", ao2, "gain", NULL ); // wet 0
  267. cmDspSysInstallCb(h, ogain3, "val", ao3, "gain", NULL ); // wet 1
  268. return rc;
  269. }
  270. //------------------------------------------------------------------------------
  271. //)