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

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