libcm is a C development framework with an emphasis on audio signal processing applications.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

cmDspPgmKrTimeLineLite.c 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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* 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* onb = cmDspSysAllocInst(h,"Button", "start", 2, kButtonDuiId, 1.0 );
  74. cmDspInst_t* offb = cmDspSysAllocInst(h,"Button", "stop", 2, kButtonDuiId, 1.0 );
  75. cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" );
  76. cmDspInst_t* prd = cmDspSysAllocInst(h,"Printer", NULL, 1, "DYN:" );
  77. cmDspInst_t* pre = cmDspSysAllocInst(h,"Printer", NULL, 1, "EVEN:" );
  78. cmDspInst_t* prt = cmDspSysAllocInst(h,"Printer", NULL, 1, "TEMPO:");
  79. cmDspInst_t* prc = cmDspSysAllocInst(h,"Printer", NULL, 1, "COST:");
  80. // Record <-> Live switches
  81. cmDspInst_t* tlRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0); // time line swich
  82. cmDspInst_t* mfpRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  83. cmDspInst_t* amRt = cmDspSysAllocInst(h,"Router", NULL, 2, 2, 0);
  84. //cmDspSysNewColumn(h,0);
  85. cmDspInst_t* igain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  86. cmDspInst_t* igain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  87. //cmDspSysNewColumn(h,0);
  88. cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  89. cmDspInst_t* ogain1 = cmDspSysAllocInst(h,"Scalar", "Out Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  90. // Audio file recording
  91. cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 );
  92. cmDspInst_t* recdChk = cmDspSysAllocInst(h,"Button", "Record", 2, kCheckDuiId, 0.0 );
  93. cmDspInst_t* recdPtS = cmDspSysAllocInst(h,"GateToSym", NULL, 2, cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"open"),cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"close"));
  94. cmDspInst_t* afop = cmDspSysAllocInst(h,"AudioFileOut",NULL, 2, r.recordDir,2);
  95. cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  96. cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  97. //--------------- Preset controls
  98. cmDspSysNewColumn(h,0);
  99. cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, preGrpSymId );
  100. cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" );
  101. cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0);
  102. cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0);
  103. cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL);
  104. cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL );
  105. cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL );
  106. cmDspInst_t* prePath = cmDspSysAllocInst( h, "Fname", "prePath", 3, true,NULL,r.tlPrefixPath);
  107. //cmDspSysNewColumn(h,0);
  108. //--------------- Recorded performance evaluation and Active Measurement related controls
  109. cmDspInst_t* clrBtn = cmDspSysAllocButton( h, "clear", 0);
  110. cmDspInst_t* prtBtn = cmDspSysAllocButton( h, "dump", 0);
  111. cmDspInst_t* amCmd = cmDspSysAllocInst( h, "PortToSym", NULL, 2, "add", "rewind" );
  112. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  113. return rc;
  114. // Output Audio file recording.
  115. cmDspSysInstallCb(h, recdGain,"val", afop, "gain0", NULL );
  116. cmDspSysInstallCb(h, recdGain,"val", afop, "gain1", NULL );
  117. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "on", NULL );
  118. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "off", NULL );
  119. cmDspSysInstallCb(h, recdPtS, "out", afop, "sel", NULL );
  120. // Audio connections
  121. cmDspSysConnectAudio( h, ai0p, "out", mi0p, "in" ); //
  122. cmDspSysConnectAudio( h, ai0p, "out", c0.kr0, "in" ); // ain -> ch0.kr0
  123. cmDspSysConnectAudio( h, ai0p, "out", c0.kr1, "in" ); // ain -> ch0.kr1
  124. cmDspSysConnectAudio( h, c0.cmp, "out", ao0p, "in" ); // ch0.cmp -> aout
  125. cmDspSysConnectAudio( h, c0.cmp, "out", afop, "in0"); // ch0.cmp -> audio_file_out
  126. cmDspSysConnectAudio( h, ai1p, "out", mi1p, "in" ); //
  127. cmDspSysConnectAudio( h, ai1p, "out", c1.kr0, "in" ); // ain -> ch1.kr0
  128. cmDspSysConnectAudio( h, ai1p, "out", c1.kr1, "in" ); // ain -> ch1.kr1
  129. cmDspSysConnectAudio( h, c1.cmp, "out", ao1p, "in" ); // ch1.cmp -> aout
  130. cmDspSysConnectAudio( h, c1.cmp, "out", afop, "in1"); // ch1.cmp ->audio_file_out
  131. //cmDspSysConnectAudio(h, ai0p, "out", afop, "in0" ); // comp -> audio_file_out
  132. //cmDspSysConnectAudio(h, ai1p, "out", afop, "in1" );
  133. //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in" ); // direct through from ain to aout
  134. //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in" ); //
  135. cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas.
  136. cmDspSysInstallCb( h, prtBtn, "sym", amp, "cmd", NULL ); // print active meas
  137. //cmDspSysInstallCb( h, prtBtn, "sym", scp, "cmd", NULL ); // print the score
  138. cmDspSysInstallCb( h, amCmd, "add", amp, "cmd", NULL ); // add active meas
  139. cmDspSysInstallCb( h, amCmd, "rewind", amp, "cmd", NULL ); // rewind active meas
  140. cmDspSysInstallCb( h, sfp, "out", amRt, "f-in", NULL ); // sfp-active meas router (rtr is switched by live btn)
  141. cmDspSysInstallCb( h, amRt, "f-out-0",amp, "sfloc", NULL );
  142. cmDspSysInstallCb( h, sfp, "vloc", amp, "loc", NULL ); // live meas's to active meas unit
  143. cmDspSysInstallCb( h, sfp, "vval", amp, "val", NULL ); //
  144. cmDspSysInstallCb( h, sfp, "vcost",amp, "cst", NULL ); //
  145. cmDspSysInstallCb( h, sfp, "vtyp", amp, "type", NULL ); //
  146. cmDspSysInstallCb( h, sfp, "vtyp", amCmd, "add", NULL); //
  147. // ***** delete this to prevent the score follower from driving the active-measure unit in 'live' mode
  148. cmDspSysInstallCb( h, amRt, "f-out-1",amp, "sfloc", NULL );
  149. // *****
  150. // active measure loc to xfad channel trigger
  151. cmDspSysInstallCb( h, amp, "scloc",c0.achan, "trig", NULL ); // See Also: modp.sw ->achan.trig
  152. cmDspSysInstallCb( h, amp, "scloc",c1.achan, "trig", NULL );
  153. cmDspSysInstallCb( h, recallBtn, "sym", c0.achan, "trig", NULL );
  154. cmDspSysInstallCb( h, recallBtn, "sym", c1.achan, "trig", NULL );
  155. cmDspSysInstallCb( h, amp, "even", pre, "in", NULL ); // active meas output to printers
  156. cmDspSysInstallCb( h, amp, "dyn", prd, "in", NULL );
  157. cmDspSysInstallCb( h, amp, "tempo", prt, "in", NULL );
  158. cmDspSysInstallCb( h, amp, "cost", prc, "in", NULL );
  159. // wave-table to time-line cursor
  160. //cmDspSysInstallCb( h, wtp, "fidx",tlp, "curs", NULL);
  161. cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
  162. // start connections
  163. cmDspSysInstallCb(h, onb, "sym", tlRt, "s-in", NULL );
  164. cmDspSysInstallCb(h, tlRt, "s-out-0",tlp, "reset", NULL );
  165. cmDspSysInstallCb(h, onb, "sym", scp, "send", NULL );
  166. cmDspSysInstallCb(h, onb, "sym", mfpRt,"s-in", NULL );
  167. cmDspSysInstallCb(h, mfpRt,"s-out-0",mfp, "sel", NULL );
  168. cmDspSysInstallCb(h, onb, "sym", pts, "on", NULL );
  169. cmDspSysInstallCb(h, pts, "on", modp, "cmd", NULL );
  170. cmDspSysInstallCb(h, onb, "sym", amCmd, "rewind",NULL );
  171. cmDspSysInstallCb(h, onb, "out", c0.achan,"reset", NULL );
  172. cmDspSysInstallCb(h, onb, "out", c1.achan,"reset", NULL );
  173. // stop connections
  174. cmDspSysInstallCb(h, tlp, "mfn", pts, "off", NULL ); // Prevents WT start on new audio file from TL.
  175. cmDspSysInstallCb(h, offb, "sym", mfp, "sel", NULL );
  176. cmDspSysInstallCb(h, offb, "sym", pts, "off", NULL );
  177. cmDspSysInstallCb(h, pts, "off", modp,"cmd", NULL );
  178. cmDspSysInstallCb(h, offb, "sym", mop, "reset", NULL );
  179. cmDspSysInstallCb(h, offb, "sym", mo2p, "reset", NULL );
  180. // time-line to MIDI file player selection
  181. cmDspSysInstallCb(h, tlp, "mbsi", mfp, "bsi", NULL );
  182. cmDspSysInstallCb(h, tlp, "mesi", mfp, "esi", NULL );
  183. cmDspSysInstallCb(h, tlp, "mfn", mfp, "fn", NULL );
  184. // score to score follower - to set initial search location
  185. cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL );
  186. cmDspSysInstallCb(h, scp, "sel", modp,"reset", NULL );
  187. cmDspSysInstallCb(h, scp, "sel", prp, "in", NULL );
  188. // MIDI file player to score follower and sampler
  189. cmDspSysInstallCb(h, mfp, "smpidx", sfp, "smpidx",NULL );
  190. cmDspSysInstallCb(h, mfp, "id", sfp, "muid", NULL );
  191. cmDspSysInstallCb(h, mfp, "d1", sfp, "d1", NULL );
  192. cmDspSysInstallCb(h, mfp, "d1", nmp, "d1", NULL );
  193. cmDspSysInstallCb(h, nmp, "d1", mop, "d1", NULL );
  194. cmDspSysInstallCb(h, nmp, "d1", mo2p, "d1", NULL );
  195. cmDspSysInstallCb(h, mfp, "d0", sfp, "d0", NULL );
  196. cmDspSysInstallCb(h, mfp, "d0", nmp, "d0", NULL );
  197. cmDspSysInstallCb(h, nmp, "d0", mop, "d0", NULL );
  198. cmDspSysInstallCb(h, nmp, "d0", mo2p, "d0", NULL );
  199. cmDspSysInstallCb(h, mfp, "status", sfp, "status",NULL );
  200. cmDspSysInstallCb(h, mfp, "status", nmp, "status",NULL );
  201. cmDspSysInstallCb(h, nmp, "status", mop, "status",NULL );
  202. cmDspSysInstallCb(h, nmp, "status", mo2p, "status",NULL );
  203. // score follower to recd_play,modulator and printers
  204. cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL );
  205. cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index
  206. cmDspSysInstallCb(h, igain0, "val", ai0p, "gain", NULL ); // input gain control
  207. cmDspSysInstallCb(h, igain1, "val", ai1p, "gain", NULL );
  208. cmDspSysInstallCb(h, ogain0, "val", ao0p, "gain", NULL ); // output gain control
  209. cmDspSysInstallCb(h, ogain1, "val", ao1p, "gain", NULL );
  210. return rc;
  211. }
  212. //------------------------------------------------------------------------------
  213. //)