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.

cmDspPgmKrTimeLineLite.c 15KB

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