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 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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 = false;
  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* ai0p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 0);
  52. cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 1);
  53. cmDspInst_t* tlp = cmDspSysAllocInst(h,"TimeLine", "tl", 2, r.tlFn, r.tlPrefixPath );
  54. cmDspInst_t* scp = cmDspSysAllocInst(h,"Score", "sc", 1, r.scFn );
  55. cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 2, "on", "off" );
  56. cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 );
  57. cmDspInst_t* nmp = cmDspSysAllocInst(h,"NanoMap", NULL, 0 );
  58. cmDspInst_t* mop = cmDspSysAllocInst(h,"MidiOut", NULL, 2, r.midiDevice,r.midiOutPort);
  59. cmDspInst_t* mo2p = cmDspSysAllocInst(h,"MidiOut", NULL, 2, r.midiDevice,r.midiOutPort2);
  60. cmDspInst_t* sfp = cmDspSysAllocInst(h,"ScFol", NULL, 1, r.scFn, sfBufCnt, sfMaxWndCnt, sfMinVel, sfEnaMeasFl );
  61. cmDspInst_t* amp = cmDspSysAllocInst(h,"ActiveMeas", NULL, 1, 100 );
  62. cmDspInst_t* modp = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" );
  63. unsigned preGrpSymId = cmDspSysPresetRegisterGroup(h,"tl");
  64. unsigned cmpPreGrpSymId = cmDspSysPresetRegisterGroup(h,"tl_cmp");
  65. cmDspTlXform_t c0,c1;
  66. cmDspSysNewPage(h,"Controls-0");
  67. _cmDspSys_TlXformChain(h, &c0, preGrpSymId, cmpPreGrpSymId, modp, 0, 0 );
  68. cmDspSysNewPage(h,"Controls-1");
  69. _cmDspSys_TlXformChain(h, &c1, preGrpSymId, cmpPreGrpSymId, modp, 1, 1 );
  70. cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 2 );
  71. cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 3 );
  72. cmDspSysNewPage(h,"Main");
  73. cmDspInst_t* liveb= cmDspSysAllocInst(h,"Button", "live", 2, kCheckDuiId, 0.0 );
  74. cmDspInst_t* simb = cmDspSysAllocInst(h,"Button", "simulate",2, kCheckDuiId, 0.0 );
  75. cmDspInst_t* ainb = cmDspSysAllocInst(h,"Button", "audio in",2, kCheckDuiId, 0.0 );
  76. cmDspInst_t* measb= cmDspSysAllocInst(h,"Button", "meas", 2, kCheckDuiId, 0.0 );
  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* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" );
  80. cmDspInst_t* prd = cmDspSysAllocInst(h,"Printer", NULL, 1, "DYN:" );
  81. cmDspInst_t* pre = cmDspSysAllocInst(h,"Printer", NULL, 1, "EVEN:" );
  82. cmDspInst_t* prt = cmDspSysAllocInst(h,"Printer", NULL, 1, "TEMPO:");
  83. cmDspInst_t* prc = cmDspSysAllocInst(h,"Printer", NULL, 1, "COST:");
  84. // Record <-> Live switches
  85. cmDspInst_t* tlRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0); // time line swich
  86. cmDspInst_t* mfpRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  87. cmDspInst_t* amRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  88. cmDspInst_t* au0Sw = cmDspSysAllocInst(h,"1ofN", NULL, 2, 2, 0);
  89. cmDspInst_t* au1Sw = cmDspSysAllocInst(h,"1ofN", NULL, 2, 2, 0);
  90. cmDspInst_t* siRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  91. cmDspInst_t* muRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  92. cmDspInst_t* d0Rt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  93. cmDspInst_t* d1Rt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  94. cmDspInst_t* stRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  95. cmDspSysNewColumn(h,0);
  96. cmDspInst_t* igain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  97. cmDspInst_t* igain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  98. cmDspSysNewColumn(h,0);
  99. cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  100. cmDspInst_t* ogain1 = cmDspSysAllocInst(h,"Scalar", "Out Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  101. // Audio file recording
  102. cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 );
  103. cmDspInst_t* recdChk = cmDspSysAllocInst(h,"Button", "Record", 2, kCheckDuiId, 0.0 );
  104. cmDspInst_t* recdPtS = cmDspSysAllocInst(h,"GateToSym", NULL, 2, cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"open"),cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"close"));
  105. cmDspInst_t* afop = cmDspSysAllocInst(h,"AudioFileOut",NULL, 2, r.recordDir,2);
  106. cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  107. cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  108. //--------------- Preset controls
  109. cmDspSysNewColumn(h,0);
  110. cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, preGrpSymId );
  111. cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" );
  112. cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0);
  113. cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0);
  114. cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL);
  115. cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL );
  116. cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL );
  117. cmDspInst_t* prePath = cmDspSysAllocInst( h, "Fname", "prePath", 3, true,NULL,r.tlPrefixPath);
  118. cmDspSysNewColumn(h,0);
  119. //--------------- Recorded performance evaluation and Active Measurement related controls
  120. cmDspInst_t* clrBtn = cmDspSysAllocButton( h, "clear", 0);
  121. cmDspInst_t* prtBtn = cmDspSysAllocButton( h, "dump", 0);
  122. cmDspInst_t* mlst = cmDspSysAllocInst( h, "MsgList", NULL, 3, "meas", r.measFn, 2);
  123. cmDspInst_t* amCmd = cmDspSysAllocInst( h, "PortToSym", NULL, 2, "add", "rewind" );
  124. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  125. return rc;
  126. // Output Audio file recording.
  127. cmDspSysInstallCb(h, recdGain,"val", afop, "gain0", NULL );
  128. cmDspSysInstallCb(h, recdGain,"val", afop, "gain1", NULL );
  129. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "on", NULL );
  130. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "off", NULL );
  131. cmDspSysInstallCb(h, recdPtS, "out", afop, "sel", NULL );
  132. // Audio connections
  133. cmDspSysConnectAudio( h, ai0p, "out", mi0p, "in" ); //
  134. cmDspSysConnectAudio( h, ai0p, "out", c0.kr0, "in" ); // ain -> ch0.kr0
  135. cmDspSysConnectAudio( h, ai0p, "out", c0.kr1, "in" ); // ain -> ch0.kr1
  136. cmDspSysConnectAudio( h, c0.cmp, "out", ao0p, "in" ); // ch0.cmp -> aout
  137. cmDspSysConnectAudio( h, c0.cmp, "out", afop, "in0"); // ch0.cmp -> audio_file_out
  138. cmDspSysConnectAudio( h, ai1p, "out", mi1p, "in" ); //
  139. cmDspSysConnectAudio( h, ai1p, "out", c1.kr0, "in" ); // ain -> ch1.kr0
  140. cmDspSysConnectAudio( h, ai1p, "out", c1.kr1, "in" ); // ain -> ch1.kr1
  141. cmDspSysConnectAudio( h, c1.cmp, "out", ao1p, "in" ); // ch1.cmp -> aout
  142. cmDspSysConnectAudio( h, c1.cmp, "out", afop, "in1"); // ch1.cmp ->audio_file_out
  143. //cmDspSysConnectAudio(h, ai0p, "out", afop, "in0" ); // comp -> audio_file_out
  144. //cmDspSysConnectAudio(h, ai1p, "out", afop, "in1" );
  145. //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in" ); // direct through from ain to aout
  146. //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in" ); //
  147. cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas.
  148. cmDspSysInstallCb( h, prtBtn, "sym", amp, "cmd", NULL ); // print active meas
  149. cmDspSysInstallCb( h, prtBtn, "sym", scp, "cmd", NULL );
  150. cmDspSysInstallCb( h, amCmd, "add", amp, "cmd", NULL ); // add active meas
  151. cmDspSysInstallCb( h, amCmd, "rewind", amp, "cmd", NULL ); // rewind active meas
  152. cmDspSysInstallCb( h, mlst, "loc", amp, "loc", NULL ); // recorded meas's list to active meas unit
  153. cmDspSysInstallCb( h, mlst, "typeId", amp, "type", NULL ); //
  154. cmDspSysInstallCb( h, mlst, "val", amp, "val", NULL ); //
  155. cmDspSysInstallCb( h, mlst, "cost", amp, "cst", NULL ); //
  156. cmDspSysInstallCb( h, mlst, "typeId", amCmd, "add", NULL ); //
  157. cmDspSysInstallCb( h, sfp, "out", amRt, "f-in", NULL ); // sfp-active meas router (rtr is switched by live btn)
  158. cmDspSysInstallCb( h, amRt, "f-out-0",amp, "sfloc", NULL );
  159. cmDspSysInstallCb( h, sfp, "vloc", amp, "loc", NULL ); // live meas's to active meas unit
  160. cmDspSysInstallCb( h, sfp, "vval", amp, "val", NULL ); //
  161. cmDspSysInstallCb( h, sfp, "vcost",amp, "cst", NULL ); //
  162. cmDspSysInstallCb( h, sfp, "vtyp", amp, "type", NULL ); //
  163. cmDspSysInstallCb( h, sfp, "vtyp", amCmd, "add", NULL); //
  164. // ***** delete this to prevent the score follower from driving the active-measure unit in 'live' mode
  165. cmDspSysInstallCb( h, amRt, "f-out-1",amp, "sfloc", NULL );
  166. // *****
  167. // active measure loc to xfad channel trigger
  168. cmDspSysInstallCb( h, amp, "scloc",c0.achan, "trig", NULL ); // See Also: modp.sw ->achan.trig
  169. cmDspSysInstallCb( h, amp, "scloc",c1.achan, "trig", NULL );
  170. cmDspSysInstallCb( h, recallBtn, "sym", c0.achan, "trig", NULL );
  171. cmDspSysInstallCb( h, recallBtn, "sym", c1.achan, "trig", NULL );
  172. cmDspSysInstallCb( h, amp, "even", pre, "in", NULL ); // active meas output to printers
  173. cmDspSysInstallCb( h, amp, "dyn", prd, "in", NULL );
  174. cmDspSysInstallCb( h, amp, "tempo", prt, "in", NULL );
  175. cmDspSysInstallCb( h, amp, "cost", prc, "in", NULL );
  176. // wave-table to time-line cursor
  177. //cmDspSysInstallCb( h, wtp, "fidx",tlp, "curs", NULL);
  178. cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
  179. // 'live' button -> live router selector switch
  180. //cmDspSysInstallCb(h, liveb, "out", wtRt, "sel", NULL );
  181. cmDspSysInstallCb(h, liveb, "out", tlRt, "sel", NULL );
  182. cmDspSysInstallCb(h, liveb, "out", mfpRt,"sel", NULL );
  183. cmDspSysInstallCb(h, liveb, "out", amRt, "sel", NULL );
  184. cmDspSysInstallCb(h, liveb, "out", au0Sw, "chidx", NULL );
  185. cmDspSysInstallCb(h, liveb, "out", au1Sw, "chidx", NULL );
  186. cmDspSysInstallCb(h, liveb, "out", measb, "in", NULL );
  187. cmDspSysInstallCb(h, measb, "out", sfp, "measfl", NULL );
  188. // 'simulate' button -> simulate router selector switch
  189. cmDspSysInstallCb(h, simb, "out", ainb, "in", NULL );
  190. cmDspSysInstallCb(h, ainb, "out", au0Sw, "chidx", NULL );
  191. cmDspSysInstallCb(h, ainb, "out", au1Sw, "chidx", NULL );
  192. cmDspSysInstallCb(h, simb, "out", siRt, "sel", NULL );
  193. cmDspSysInstallCb(h, simb, "out", muRt, "sel", NULL );
  194. cmDspSysInstallCb(h, simb, "out", d1Rt, "sel", NULL );
  195. cmDspSysInstallCb(h, simb, "out", d0Rt, "sel", NULL );
  196. cmDspSysInstallCb(h, simb, "out", stRt, "sel", NULL );
  197. // start connections
  198. cmDspSysInstallCb(h, onb, "sym", tlRt, "s-in", NULL );
  199. cmDspSysInstallCb(h, tlRt, "s-out-0",tlp, "reset", NULL );
  200. cmDspSysInstallCb(h, onb, "sym", scp, "send", NULL );
  201. cmDspSysInstallCb(h, onb, "sym", mfpRt,"s-in", NULL );
  202. cmDspSysInstallCb(h, mfpRt,"s-out-0",mfp, "sel", NULL );
  203. cmDspSysInstallCb(h, onb, "sym", pts, "on", NULL );
  204. cmDspSysInstallCb(h, pts, "on", modp, "cmd", NULL );
  205. cmDspSysInstallCb(h, onb, "sym", amCmd, "rewind",NULL );
  206. cmDspSysInstallCb(h, onb, "out", c0.achan,"reset", NULL );
  207. cmDspSysInstallCb(h, onb, "out", c1.achan,"reset", NULL );
  208. // stop connections
  209. cmDspSysInstallCb(h, tlp, "mfn", pts, "off", NULL ); // Prevents WT start on new audio file from TL.
  210. cmDspSysInstallCb(h, offb, "sym", mfp, "sel", NULL );
  211. cmDspSysInstallCb(h, offb, "sym", pts, "off", NULL );
  212. cmDspSysInstallCb(h, pts, "off", modp,"cmd", NULL );
  213. cmDspSysInstallCb(h, offb, "sym", mop, "reset", NULL );
  214. cmDspSysInstallCb(h, offb, "sym", mo2p, "reset", NULL );
  215. // time-line to MIDI file player selection
  216. cmDspSysInstallCb(h, tlp, "mbsi", mfp, "bsi", NULL );
  217. cmDspSysInstallCb(h, tlp, "mesi", mfp, "esi", NULL );
  218. cmDspSysInstallCb(h, tlp, "mfn", mfp, "fn", NULL );
  219. // score to score follower - to set initial search location
  220. cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL );
  221. cmDspSysInstallCb(h, scp, "sel", modp,"reset", NULL );
  222. cmDspSysInstallCb(h, scp, "sel", prp, "in", NULL );
  223. // MIDI file player to score follower
  224. cmDspSysInstallCb(h, mfp, "smpidx", siRt, "f-in",NULL );
  225. cmDspSysInstallCb(h, siRt, "f-out-1", sfp, "smpidx",NULL );
  226. // leave siRt.f-out-1 unconnected because it should be ignored in 'simulate mode'
  227. cmDspSysInstallCb(h, mfp, "id", muRt, "f-in", NULL );
  228. cmDspSysInstallCb(h, muRt, "f-out-1", sfp, "muid", NULL );
  229. // leave muRt.f-out-1 unconnected because it should be ignored in 'simulate mode'
  230. cmDspSysInstallCb(h, mfp, "d1", d1Rt, "f-in", NULL );
  231. cmDspSysInstallCb(h, d1Rt, "f-out-1", sfp, "d1", NULL );
  232. cmDspSysInstallCb(h, d1Rt, "f-out-1", nmp, "d1", NULL );
  233. cmDspSysInstallCb(h, nmp, "d1", mop, "d1", NULL );
  234. cmDspSysInstallCb(h, nmp, "d1", mo2p, "d1", NULL );
  235. cmDspSysInstallCb(h, mfp, "d0", d0Rt, "f-in", NULL );
  236. cmDspSysInstallCb(h, d0Rt, "f-out-1", sfp, "d0", NULL );
  237. cmDspSysInstallCb(h, d0Rt, "f-out-1", nmp, "d0", NULL );
  238. cmDspSysInstallCb(h, nmp, "d0", mop, "d0", NULL );
  239. cmDspSysInstallCb(h, nmp, "d0", mo2p, "d0", NULL );
  240. cmDspSysInstallCb(h, mfp, "status", stRt, "f-in", NULL );
  241. cmDspSysInstallCb(h, stRt, "f-out-1", sfp, "status",NULL );
  242. cmDspSysInstallCb(h, stRt, "f-out-1", nmp, "status",NULL );
  243. cmDspSysInstallCb(h, nmp, "status", mop, "status",NULL );
  244. cmDspSysInstallCb(h, nmp, "status", mo2p, "status",NULL );
  245. // MIDI input port
  246. //cmDspSysInstallCb(h, mip, "smpidx", sfp, "smpidx", NULL );
  247. //cmDspSysInstallCb(h, mip, "d1", sfp, "d1", NULL );
  248. //cmDspSysInstallCb(h, mip, "d0", sfp, "d0", NULL );
  249. //cmDspSysInstallCb(h, mip, "status", sfp, "status", NULL );
  250. // score follower to recd_play,modulator and printers
  251. cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL );
  252. cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index
  253. cmDspSysInstallCb(h, igain0, "val", ai0p, "gain", NULL ); // input gain control
  254. cmDspSysInstallCb(h, igain1, "val", ai1p, "gain", NULL );
  255. cmDspSysInstallCb(h, ogain0, "val", ao0p, "gain", NULL ); // output gain control
  256. cmDspSysInstallCb(h, ogain1, "val", ao1p, "gain", NULL );
  257. return rc;
  258. }
  259. //------------------------------------------------------------------------------
  260. //)