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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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, 0);
  54. cmDspInst_t* tlp = cmDspSysAllocInst(h,"TimeLine", "tl", 2, r.tlFn, r.tlPrefixPath );
  55. cmDspInst_t* scp = cmDspSysAllocInst(h,"Score", "sc", 1, r.scFn );
  56. cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 2, "on", "off" );
  57. cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 );
  58. cmDspInst_t* nmp = cmDspSysAllocInst(h,"NanoMap", NULL, 0 );
  59. cmDspInst_t* mop = cmDspSysAllocInst(h,"MidiOut", NULL, 2, r.midiDevice,r.midiOutPort);
  60. cmDspInst_t* mo2p = cmDspSysAllocInst(h,"MidiOut", NULL, 2, r.midiDevice,r.midiOutPort2);
  61. cmDspInst_t* sfp = cmDspSysAllocInst(h,"ScFol", NULL, 1, r.scFn, sfBufCnt, sfMaxWndCnt, sfMinVel, sfEnaMeasFl );
  62. cmDspInst_t* amp = cmDspSysAllocInst(h,"ActiveMeas", NULL, 1, 100 );
  63. cmDspInst_t* modp = cmDspSysAllocInst(h,"ScMod", NULL, 2, r.modFn, "m1" );
  64. unsigned preGrpSymId = cmDspSysPresetRegisterGroup(h,"tl");
  65. unsigned cmpPreGrpSymId = cmDspSysPresetRegisterGroup(h,"tl_cmp");
  66. cmDspTlXform_t c0,c1;
  67. cmDspSysNewPage(h,"Controls-0");
  68. _cmDspSys_TlXformChain(h, &c0, preGrpSymId, cmpPreGrpSymId, modp, 0, 0 );
  69. cmDspSysNewPage(h,"Controls-1");
  70. _cmDspSys_TlXformChain(h, &c1, preGrpSymId, cmpPreGrpSymId, modp, 1, 1 );
  71. cmDspInst_t* ao0 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 4 ); // 4 Piano 1 Output
  72. cmDspInst_t* ao1 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 5 ); // 5 2
  73. cmDspInst_t* ao2 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 2 ); // 2 Transform 1 OUtput
  74. cmDspInst_t* ao3 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 3 ); // 3 2
  75. cmDspSysNewPage(h,"Main");
  76. cmDspInst_t* onb = cmDspSysAllocInst(h,"Button", "start", 2, kButtonDuiId, 1.0 );
  77. cmDspInst_t* offb = cmDspSysAllocInst(h,"Button", "stop", 2, kButtonDuiId, 1.0 );
  78. cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 );
  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. //cmDspSysNewColumn(h,0);
  89. cmDspInst_t* igain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  90. cmDspInst_t* igain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 );
  91. //cmDspSysNewColumn(h,0);
  92. cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Dry Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  93. cmDspInst_t* ogain1 = cmDspSysAllocInst(h,"Scalar", "Dry Out Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  94. cmDspInst_t* ogain2 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-2", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  95. cmDspInst_t* ogain3 = cmDspSysAllocInst(h,"Scalar", "Wet Out Gain-3", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 );
  96. // Audio file recording
  97. cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 );
  98. cmDspInst_t* recdChk = cmDspSysAllocInst(h,"Button", "Record", 2, kCheckDuiId, 0.0 );
  99. cmDspInst_t* recdPtS = cmDspSysAllocInst(h,"GateToSym", NULL, 2, cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"open"),cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"close"));
  100. cmDspInst_t* afop = cmDspSysAllocInst(h,"AudioFileOut",NULL, 2, r.recordDir,2);
  101. cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0);
  102. cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
  103. cmDspInst_t* meas = cmDspSysAllocInst(h,"Scalar", "Meas", 5, kNumberDuiId, 1.0, 59.0,1.0, 1.0 );
  104. cmDspSysInstallCb( h, meas, "val", scp, "meas", NULL);
  105. cmDspSysInstallCb( h, meas, "val", tlp, "meas", NULL);
  106. //--------------- Preset controls
  107. cmDspSysNewColumn(h,0);
  108. cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, preGrpSymId );
  109. cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" );
  110. cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0);
  111. cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0);
  112. cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL);
  113. cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL );
  114. cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL );
  115. cmDspInst_t* prePath = cmDspSysAllocInst( h, "Fname", "prePath", 3, true,NULL,r.tlPrefixPath);
  116. //cmDspSysNewColumn(h,0);
  117. //--------------- Recorded performance evaluation and Active Measurement related controls
  118. cmDspInst_t* clrBtn = cmDspSysAllocButton( h, "clear", 0);
  119. cmDspInst_t* prtBtn = cmDspSysAllocButton( h, "dump", 0);
  120. cmDspInst_t* amCmd = cmDspSysAllocInst( h, "PortToSym", NULL, 2, "add", "rewind" );
  121. if((rc = cmDspSysLastRC(h)) != kOkDspRC )
  122. return rc;
  123. // Output Audio file recording.
  124. cmDspSysInstallCb(h, recdGain,"val", afop, "gain0", NULL );
  125. cmDspSysInstallCb(h, recdGain,"val", afop, "gain1", NULL );
  126. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "on", NULL );
  127. cmDspSysInstallCb(h, recdChk, "out", recdPtS, "off", NULL );
  128. cmDspSysInstallCb(h, recdPtS, "out", afop, "sel", NULL );
  129. // Audio connections
  130. cmDspSysConnectAudio( h, ai0, "out", ao0, "in" ); // dry signal through
  131. cmDspSysConnectAudio( h, ai1, "out", ao1, "in" ); //
  132. cmDspSysConnectAudio( h, ai0, "out", mi0p, "in" ); //
  133. cmDspSysConnectAudio( h, ai0, "out", c0.kr0, "in" ); // ain -> ch0.kr0
  134. cmDspSysConnectAudio( h, ai0, "out", c0.kr1, "in" ); // ain -> ch0.kr1
  135. cmDspSysConnectAudio( h, c0.cmp,"out", ao2, "in" ); // ch0.cmp -> aout
  136. cmDspSysConnectAudio( h, c0.cmp,"out", afop, "in0"); // ch0.cmp -> audio_file_out
  137. cmDspSysConnectAudio( h, ai1, "out", mi1p, "in" ); //
  138. cmDspSysConnectAudio( h, ai1, "out", c1.kr0, "in" ); // ain -> ch1.kr0
  139. cmDspSysConnectAudio( h, ai1, "out", c1.kr1, "in" ); // ain -> ch1.kr1
  140. cmDspSysConnectAudio( h, c1.cmp,"out", ao3, "in" ); // ch1.cmp -> aout
  141. cmDspSysConnectAudio( h, c1.cmp,"out", afop, "in1"); // ch1.cmp ->audio_file_out
  142. cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas.
  143. cmDspSysInstallCb( h, prtBtn, "sym", modp, "cmd", NULL ); // print active meas
  144. //cmDspSysInstallCb( h, prtBtn, "sym", scp, "cmd", NULL ); // print the score
  145. cmDspSysInstallCb( h, amCmd, "add", amp, "cmd", NULL ); // add active meas
  146. cmDspSysInstallCb( h, amCmd, "rewind", amp, "cmd", NULL ); // rewind active meas
  147. cmDspSysInstallCb( h, sfp, "out", amRt, "f-in", NULL ); // sfp-active meas router (rtr is switched by live btn)
  148. cmDspSysInstallCb( h, amRt, "f-out-0",amp, "sfloc", NULL );
  149. cmDspSysInstallCb( h, sfp, "vloc", amp, "loc", NULL ); // live meas's to active meas unit
  150. cmDspSysInstallCb( h, sfp, "vval", amp, "val", NULL ); //
  151. cmDspSysInstallCb( h, sfp, "vcost",amp, "cst", NULL ); //
  152. cmDspSysInstallCb( h, sfp, "vtyp", amp, "type", NULL ); //
  153. cmDspSysInstallCb( h, sfp, "vtyp", amCmd, "add", NULL); //
  154. // ***** delete this to prevent the score follower from driving the active-measure unit in 'live' mode
  155. cmDspSysInstallCb( h, amRt, "f-out-1",amp, "sfloc", NULL );
  156. // *****
  157. // active measure loc to xfad channel trigger
  158. cmDspSysInstallCb( h, amp, "scloc",c0.achan, "trig", NULL ); // See Also: modp.sw ->achan.trig
  159. cmDspSysInstallCb( h, amp, "scloc",c1.achan, "trig", NULL );
  160. cmDspSysInstallCb( h, recallBtn, "sym", c0.achan, "trig", NULL );
  161. cmDspSysInstallCb( h, recallBtn, "sym", c1.achan, "trig", NULL );
  162. cmDspSysInstallCb( h, amp, "even", pre, "in", NULL ); // active meas output to printers
  163. cmDspSysInstallCb( h, amp, "dyn", prd, "in", NULL );
  164. cmDspSysInstallCb( h, amp, "tempo", prt, "in", NULL );
  165. cmDspSysInstallCb( h, amp, "cost", prc, "in", NULL );
  166. // wave-table to time-line cursor
  167. //cmDspSysInstallCb( h, wtp, "fidx",tlp, "curs", NULL);
  168. cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
  169. // start connections
  170. cmDspSysInstallCb(h, onb, "sym", tlRt, "s-in", NULL );
  171. cmDspSysInstallCb(h, tlRt, "s-out-0",tlp, "reset", NULL );
  172. cmDspSysInstallCb(h, onb, "sym", scp, "send", NULL );
  173. cmDspSysInstallCb(h, onb, "sym", mfpRt,"s-in", NULL );
  174. cmDspSysInstallCb(h, mfpRt,"s-out-0",mfp, "sel", NULL );
  175. cmDspSysInstallCb(h, onb, "sym", pts, "on", NULL );
  176. cmDspSysInstallCb(h, pts, "on", modp, "cmd", NULL );
  177. cmDspSysInstallCb(h, onb, "sym", amCmd, "rewind", NULL );
  178. cmDspSysInstallCb(h, onb, "out", c0.achan,"reset", NULL );
  179. cmDspSysInstallCb(h, onb, "out", c1.achan,"reset", NULL );
  180. cmDspSysInstallCb(h, mod_sel,"out", modp, "sel", NULL );
  181. // stop connections
  182. cmDspSysInstallCb(h, tlp, "mfn", pts, "off", NULL ); // Prevents WT start on new audio file from TL.
  183. cmDspSysInstallCb(h, offb, "sym", mfp, "sel", NULL );
  184. cmDspSysInstallCb(h, offb, "sym", pts, "off", NULL );
  185. cmDspSysInstallCb(h, pts, "off", modp,"cmd", NULL );
  186. cmDspSysInstallCb(h, offb, "sym", mop, "reset", NULL );
  187. cmDspSysInstallCb(h, offb, "sym", mo2p,"reset", NULL );
  188. // time-line to MIDI file player selection
  189. cmDspSysInstallCb(h, tlp, "mbsi", mfp, "bsi", NULL );
  190. cmDspSysInstallCb(h, tlp, "mesi", mfp, "esi", NULL );
  191. cmDspSysInstallCb(h, tlp, "mfn", mfp, "fn", NULL );
  192. // score to score follower - to set initial search location
  193. cmDspSysInstallCb(h, scp, "sel", sfp, "index", NULL );
  194. cmDspSysInstallCb(h, scp, "sel", modp,"reset", NULL );
  195. cmDspSysInstallCb(h, scp, "sel", prp, "in", NULL );
  196. // MIDI file player to score follower and sampler
  197. cmDspSysInstallCb(h, mfp, "smpidx", sfp, "smpidx",NULL );
  198. cmDspSysInstallCb(h, mfp, "id", sfp, "muid", NULL );
  199. cmDspSysInstallCb(h, mfp, "d1", sfp, "d1", NULL );
  200. cmDspSysInstallCb(h, mfp, "d1", nmp, "d1", NULL );
  201. cmDspSysInstallCb(h, nmp, "d1", mop, "d1", NULL );
  202. cmDspSysInstallCb(h, nmp, "d1", mo2p, "d1", NULL );
  203. cmDspSysInstallCb(h, mfp, "d0", sfp, "d0", NULL );
  204. cmDspSysInstallCb(h, mfp, "d0", nmp, "d0", NULL );
  205. cmDspSysInstallCb(h, nmp, "d0", mop, "d0", NULL );
  206. cmDspSysInstallCb(h, nmp, "d0", mo2p, "d0", NULL );
  207. cmDspSysInstallCb(h, mfp, "status", sfp, "status",NULL );
  208. cmDspSysInstallCb(h, mfp, "status", nmp, "status",NULL );
  209. cmDspSysInstallCb(h, nmp, "status", mop, "status",NULL );
  210. cmDspSysInstallCb(h, nmp, "status", mo2p, "status",NULL );
  211. // score follower to recd_play,modulator and printers
  212. cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL );
  213. cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index
  214. cmDspSysInstallCb(h, igain0, "val", ai0, "gain", NULL ); // input gain control
  215. cmDspSysInstallCb(h, igain1, "val", ai1, "gain", NULL );
  216. cmDspSysInstallCb(h, modp, "dgain0", ogain0, "val", NULL );
  217. cmDspSysInstallCb(h, modp, "dgain1", ogain1, "val", NULL );
  218. cmDspSysInstallCb(h, modp, "wgain0", ogain2, "val", NULL );
  219. cmDspSysInstallCb(h, modp, "wgain1", ogain3, "val", NULL );
  220. cmDspSysInstallCb(h, ogain0, "val", ao0, "gain", NULL ); // output gain control - dry 0
  221. cmDspSysInstallCb(h, ogain1, "val", ao1, "gain", NULL ); // dry 1
  222. cmDspSysInstallCb(h, ogain2, "val", ao2, "gain", NULL ); // wet 0
  223. cmDspSysInstallCb(h, ogain3, "val", ao3, "gain", NULL ); // wet 1
  224. return rc;
  225. }
  226. //------------------------------------------------------------------------------
  227. //)